{"version":3,"mappings":"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CA,OAGAyC,wBAIAG,qBACAA,gBACAA,iBAqBAV,2BACA,6BACAlC,EACAf,sCACAA,6BACAkC,GAGAlC,oBAUAiD,2BAGA,OAFAjC,UAEAV,OACA,WACA,8BACA,SACA,sCACAN,uBACA,aACA,oCAEA,MAEA,OACAsB,EADAhB,wBACAN,iBAEAe,aAGAf,wBAiBAiD,wBACA,UAEA,sBACA,SAKA,GAFAlC,4GAEA,CACA,YAAsBqC,KAAQA,IAC9BrC,0BAIAA,QAEAO,2BAGAN,EADAD,KACA,oDAEA,8CAEM,oBAENC,YACA+C,WACMzD,gFAGNU,YACA+C,oBACAC,6DACAX,aACM/C,wCAENU,YACA+C,wBAOA,UAiCAd,yBACA,0BACA3B,eASA,GANAN,IACAA,MAGAA,2BAEAC,mBACA,+FAGA,iBACAiC,cACAC,kBACAI,iBACAC,eACAM,IACAG,WACAC,kBACAC,iBACAC,yBACAC,+BACAC,sBACAC,mBACAF,mCACAC,kCAGA,YACAR,MACM,QACNA,MAyBA/C,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,uCACA4C,8BACAA,qCACAA,gCACAA,oBACAA,iBACAA,kBACAA,oBACAA,kBACAA,oBACAA,kBACAA,oBACAA,kBACAA,oBACAA,kBACAA,oBACAA,qBACAA,mBACAA,iBACAA,oBACAA,uCACAA,iBACAA,kBAMAV,uBACA,wBACA3B,iBAOA,OAJAN,iCAIAM,EACAN,aAGAhB,oBAIAiD,6BACA,6BACAlC,EACAf,wCACAA,6BACAsC,GAGAtC,oBAIAiD,4BAQA,QAJAC,EACAC,EAJAnC,OACAM,IACA8B,IAKA9B,WACAA,KACA8B,KAGA,cACAF,kDAA8DU,UAC9DT,MAEAD,mDACAC,0BAGApC,sBACAA,EACA,CAASoB,gDAGTnC,oBAGAiD,6BACA,eAGAzC,OACAF,iCAOAS,UACAT,2CAGAA,GAYA2C,uBACA,8BACA,GAEA5B,QAIA4B,gBACAA,eACAA,gBAEAA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CAAC,OAAQ,cACb,EACH,MAAO,CAAC,MAAO,iBAEf,MAAO,CAAC,WAIPl1I,SAAwC,KAAoBmO,KAAK5U,aFrBrE+nL,GACF9iL,KAAK,KACJoiL,GAAO,KAELW,KAGK9qL,OACF+qL,gBAAgBpG,IAChB58K,KAAK,KACJoiL,GAAO,QAAQ/zJ,SAAS,mDGnDlC,OACA,gBACA,MACA,oDACA,2CAEA,8BACA,MACA,oDACA,yDAEA,oBACA,KACA,oDACA,+CAEA,0BACA,MACA,oDACA,qDAEA,4BACA,MACA,oDACA,uDAEA,oBACA,MACA,oDACA,uDAEA,wBACA,MACA,oDACA,mDAEA,oBACA,MACA,oDACA,+CAEA,oBACA,MACA,oDACA,+CAEA,kCACA,MACA,oDACA,UAEA,8BACA,MACA,oDACA,yDAEA,wBACA,MACA,oDACA,mDAEA,gBACA,KACA,oDACA,mDAEA,sBACA,MACA,oDACA,iDAEA,YACA,MACA,oDACA,uCAEA,kBACA,MACA,oDACA,sDACA,6CAEA,kBACA,MACA,oDACA,6CAEA,sBACA,MACA,oDACA,gEACA,kDACA,SACA,iDAEA,8BACA,KACA,oDACA,SACA,yDAEA,gBACA,MACA,oDACA,2CAEA,oBACA,MACA,oDACA,+CAEA,kBACA,MACA,oDACA,6CAEA,gBACA,MACA,oDACA,2CAEA,sBACA,MACA,oDACA,iDAEA,gBACA,MACA,oDACA,2CAEA,sBACA,KACA,oDACA,iDAEA,sBACA,MACA,oDACA,SACA,iDAEA,gBACA,KACA,oDACA,2CAEA,oBACA,MACA,oDACA,+CAEA,wBACA,MACA,oDACA,mDAEA,gBACA,MACA,oDACA,2CAEA,gBACA,KACA,oDACA,4DACA,SACA,2CAEA,wBACA,MACA,oDACA,mDAEA,cACA,MACA,oDACA,yCAEA,sBACA,MACA,oDACA,iDAEA,kBACA,MACA,oDACA,gEACA,kDACA,SACA,6CAEA,8BACA,MACA,oDACA,UAEA,0CACA,MACA,oDACA,SACA,qEAEA,wBACA,KACA,oDACA,UAEA,kBACA,MACA,oDACA,6CAEA,kCACA,MACA,oDACA,gEACA,kDACA,SACA,6DAEA,4BACA,MACA,oDACA,gEACA,kDACA,uDAEA,kBACA,MACA,oDACA,6CAEA,gBACA,MACA,oDACA,2CAEA,8BACA,MACA,oDACA,iEAEA,sBACA,KACA,oDACA,iDAEA,gBACA,MACA,oDACA,gEACA,2CAEA,oBACA,MACA,oDACA,+CAEA,8BACA,MACA,oDACA,yDAEA,gBACA,MACA,oDACA,2CAEA,0BACA,MACA,oDACA,6DAEA,gCACA,MACA,oDACA,2DAEA,kBACA,MACA,oDACA,6CAEA,kBACA,MACA,oDACA,6CAEA,sBACA,MACA,oDACA,iDAEA,0BACA,MACA,oDACA,qDAEA,sBACA,MACA,oDACA,iDAEA,oBACA,MACA,oDACA,+CAEA,oBACA,MACA,oDACA,+CAEA,kBACA,KACA,oDACA,SACA,6CAEA,0BACA,MACA,oDACA,qDAEA,sBACA,KACA,oDACA,iDAEA,cACA,MACA,oDACA,yCAEA,sBACA,MACA,oDACA,iDAEA,oBACA,MACA,oDACA,gEACA,+CAEA,kBACA,MACA,oDACA,6CAEA,gBACA,MACA,oDACA,gEACA,kDACA,sDACA,2CAEA,gBACA,MACA,oDACA,2CAEA,8BACA,KACA,oDACA,yDAEA,8BACA,MACA,oDACA,yDAEA,0BACA,MACA,oDACA,qDAEA,gBACA,MACA,oDACA,gEACA,kDACA,mDAEA,sBACA,MACA,oDACA,iDAEA,sBACA,MACA,oDACA,UAEA,YACA,MACA,oDACA,uCAEA,YACA,MACA,oDACA,uCAEA,gBACA,MACA,oDACA,2CAEA,gBACA,MACA,oDACA,SACA,2CAEA,kBACA,MACA,oDACA,UAEA,kBACA,MACA,oDACA,SACA,6CAEA,gBACA,MACA,oDACA,2CAEA,kBACA,MACA,oDACA,kDACA,UAEA,sBACA,MACA,oDACA,iDAEA,oBACA,MACA,oDACA,+CAEA,oBACA,MACA,oDACA,+CAEA,kBACA,MACA,oDACA,gEACA,kDACA,SACA,6CAEA,4BACA,MACA,oDACA,uDAEA,sBACA,MACA,oDACA,iDAEA,kBACA,MACA,oDACA,6CAEA,gBACA,KACA,oDACA,gEACA,kDACA,2CAEA,sBACA,MACA,oDACA,iDAEA,gCACA,MACA,oDACA,2DAEA,gBACA,MACA,oDACA,2CAEA,kBACA,MACA,oDACA,UAEA,sBACA,MACA,oDACA,yDAEA,oBACA,MACA,oDACA,+CAEA,gBACA,MACA,oDACA,2CAEA,wBACA,MACA,oDACA,mDAEA,8BACA,MACA,oDACA,yDAEA,kBACA,MACA,oDACA,6CAEA,kBACA,MACA,oDACA,6CAEA,wBACA,MACA,oDACA,gEACA,kDACA,SACA,mDAEA,oBACA,KACA,oDACA,+CAEA,0BACA,MACA,oDACA,qDAEA,kBACA,MACA,oDACA,6CAEA,sBACA,MACA,oDACA,iDAEA,kBACA,MACA,oDACA,SACA,6CAEA,cACA,MACA,oDACA,yCAEA,0BACA,MACA,oDACA,qDAEA,0BACA,MACA,oDACA,qDAEA,wBACA,KACA,oDACA,mDAEA,kBACA,MACA,oDACA,6CAEA,gBACA,MACA,oDACA,gEACA,kDACA,wDACA,kDACA,SACA,2CAEA,kBACA,MACA,oDACA,SACA,6CAEA,sBACA,MACA,oDACA,iDAEA,gBACA,MACA,oDACA,2CAEA,sBACA,MACA,oDACA,iDAEA,oBACA,MACA,oDACA,+CAEA,0CACA,IACA,oDACA,SACA,qEAEA,kBACA,MACA,oDACA,UAEA,gBACA,MACA,oDACA,4CAGA,cACA,aACA,mCACA,8CACA,gCACA71B,IAIA,kBACA,iDACAgJ,WAGApJ,0BACAA,WACAD,+BC3pBAA,uBAAkCqJ,EAAQ,yBCA1C,OACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,YACA,eACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,aACA,gBACA,YACA,eACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,cACA,iBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,sBACA,mBACA,sBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,aACA,eACA,kBACA,gBACA,aACA,gBACA,WACA,cACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,YACA,eACA,YACA,eACA,YACA,eACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,iBACA,oBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,kBACA,qBACA,gBACA,aACA,gBACA,aACA,gBACA,YACA,eACA,aACA,gBACA,aACA,gBACA,cACA,iBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,gBACA,mBACA,cACA,iBACA,aACA,gBACA,cACA,iBACA,cACA,mBACA,sBACA,iBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,aACA,kBACA,qBACA,gBACA,aACA,gBACA,mBACA,sBACA,aACA,gBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,oBAIA,cACA,WACA,YAEA,cACA,cACA,8CACA,gCACAjJ,EAEA,YAEAH,kBACA,uBAEAA,YACAD,aACAC,6BCnSA,OACA,iBACA,KACA,EACA,0DAEA,oBACA,KACA,EACA,0DAEA,6BACA,MACA,EACA,sEAEA,gCACA,MACA,EACA,sEAEA,cACA,MACA,EACA,SACA,uDAEA,iBACA,MACA,EACA,SACA,uDAEA,sBACA,MACA,EACA,UAEA,yBACA,MACA,EACA,UAEA,uBACA,MACA,EACA,UAEA,0BACA,MACA,EACA,UAEA,qBACA,MACA,EACA,UAEA,wBACA,MACA,EACA,UAEA,+BACA,MACA,EACA,UAEA,kCACA,MACA,EACA,UAEA,yBACA,MACA,EACA,UAEA,4BACA,MACA,EACA,UAEA,6BACA,KACA,EACA,UAEA,gCACA,KACA,EACA,UAEA,oBACA,MACA,EACA,UAEA,uBACA,MACA,EACA,UAEA,wBACA,MACA,EACA,UAEA,2BACA,MACA,EACA,UAEA,qBACA,MACA,EACA,UAEA,wBACA,MACA,EACA,UAEA,oBACA,MACA,EACA,UAEA,uBACA,MACA,EACA,UAEA,mBACA,MACA,EACA,UAEA,sBACA,MACA,EACA,UAEA,wBACA,MACA,EACA,UAEA,2BACA,MACA,EACA,UAEA,2BACA,MACA,EACA,UAEA,8BACA,MACA,EACA,UAEA,mBACA,MACA,EACA,4DAEA,sBACA,MACA,EACA,4DAEA,YACA,MACA,EACA,qDAEA,eACA,MACA,EACA,qDAEA,kBACA,MACA,EACA,2DAEA,qBACA,MACA,EACA,2DAEA,aACA,MACA,EACA,sDAEA,gBACA,MACA,EACA,sDAEA,kBACA,MACA,EACA,2DAEA,qBACA,MACA,EACA,2DAEA,cACA,MACA,EACA,uDAEA,iBACA,MACA,EACA,uDAEA,aACA,MACA,EACA,sDAEA,gBACA,MACA,EACA,sDAEA,2BACA,MACA,EACA,oEAEA,8BACA,MACA,EACA,oEAEA,2BACA,MACA,EACA,oEAEA,8BACA,MACA,EACA,oEAEA,yBACA,MACA,EACA,kEAEA,4BACA,MACA,EACA,kEAEA,+BACA,MACA,EACA,wEAEA,kCACA,MACA,EACA,yEAGA,cACA,aACA,mCACA,8CACA,gCACAI,IAIA,kBACA,iDACAgJ,gBAGApJ,0BACAA,WACAD,+BClSA,OACA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,KACA,qBAEA,WACA,MACA,qBAEA,WACA,KACA,qBAEA,WACA,KACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,eACA,MACA,yBAEA,WACA,MACA,qBAEA,WACA,KACA,qBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,cACA,MACA,wBAEA,WACA,MACA,qBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,KACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,eACA,MACA,yBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,KACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,YACA,KACA,sBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,cACA,MACA,wBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,cACA,MACA,wBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,KACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,YACA,MACA,sBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,cACA,MACA,wBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,eACA,MACA,yBAEA,eACA,MACA,yBAEA,WACA,MACA,qBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,KACA,qBAEA,WACA,KACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,eACA,MACA,0BAGA,cACA,aACA,mCACA,8CACA,gCACAK,IAIA,kBACA,0BACAgJ,WAGApJ,0BACAA,WACAD,+BC1gBA,OACA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,YACA,MACA,2CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,KACA,0CAEA,WACA,MACA,0CAEA,cACA,MACA,6CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,cACA,MACA,6CAEA,cACA,MACA,6CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,KACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,KACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,cACA,MACA,6CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,KACA,0CAEA,WACA,MACA,0CAEA,gBACA,MACA,+CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,cACA,MACA,6CAEA,WACA,MACA,2CAGA,cACA,aACA,mCACA,8CACA,gCACAK,IAIA,kBACA,0BACAgJ,WAGApJ,0BACAA,WACAD","names":["n","O","te","e","this","h","c","i","l","r","M","d","f","Array","a","m","v","C","Math","I","L","isNaN","NaN","toString","u","k","j","E","day_names","abbr_day_names","month_names","abbr_month_names","meridian","b","precision","separator","delimiter","strip_insignificant_zeros","y","unit","format","sign_first","P","x","T","defaultLocale","locale","defaultSeparator","placeholder","fallbacks","translations","missingBehaviour","missingTranslationPrefix","p","N","R","W","join","forEach","F","Y","message","scope","replace","count","split","X","setTime","RegExp","K","ie","H","ee","ce","se","re","call","constructor","addEventListener","visibilityState","activeState$","next","isActive","value","asObservable","factory","subResource","patch","Q","J","je","form","extractPayload","halResourceService","path","delete","super","list","get","post","createCache","requireAndStream","id","cache","stale","load","pipe","clearAndLoad","state","values$","observe","refresh","toPromise","$links","schema","schemaCache","href","touch","updateFor","cacheResponse","clearSome","parent","observeAll","elements","bind","updateValue","ensureLoaded","then","putValue","injector","states","timeEntries","exists","filters","toJson","_links","project","principal","roles","map","_meta","notificationMessage","raw","http","withCredentials","responseType","users","types","Ye","update","delta","t","Me","name","apiRoot","queries","withOptionalId","queryFilters","setSchemas","$embedded","filtersSchemas","buildQueryResource","loadWithParams","projects","kt","qe","ht","search","ci","createHalResourceOfType","payload","tt","at","ze","parameterised","Ae","mapSchemasIntoFilters","paginated","dt","find","withOptionalProject","default","toggleStarred","starred","unstar","star","loadInvolved","_","filter","test","length","de","filtered","getPaginatedResults","forTypePayload","type","forPayload","oe","D","schemaCacheService","updateWorkPackage","updateWorkPackageList","multiState","hasValue","isEqual","$source","_e","ot","Se","schemas","updateSchemas","G","requireAll","Promise","resolve","loadCollectionsFor","uniq","each","st","filterByTypeaheadOrId","add","Object","sortBy","offset","pageSize","filterUpdatedSince","getAllPaginated","workPackages","versions","ye","pt","Oe","he","xe","De","Ve","Ne","statuses","mt","Ze","$configuration","grid","updateImmediately","isAction","options","actionAttribute","isFree","attribute","highlightingMode","addQuery","isNewWidget","widgets","push","removeQuery","queryId","createdAt","sortWidgets","sort","startColumn","showStatusButton","grids","Mt","save","fetchSchema","wt","authorisationService","initModelAuth","allInScope","boardPath","zt","create","createGrid","PathHelper","projectBoardsPath","forType","set","Bt","ii","Ot","markRead","markUnread","At","facet","unread","listPath","backupToken","attachments","Qt","apiV3CollectionEndpoint","apiV3CustomEndpoint","qt","Jt","Gt","ni","apiV3SingularEndpoint","Ue","et","oi","it","Ft","Et","Te","ut","Tt","Kt","isNil","collectionFromString","pathHelper","api","v3","apiV3Base","Nt","cacheDurationInMs","current","getValueOr","clearAndPutFromPromise","changes$","observeChange","clear","hasActivePromiseRequest","isPristine","isValueOlderThan","startRow","endRow","endColumn","identifier","URL","window","location","origin","searchParams","has","JSON","parse","stringify","concat","keys","total","ceil","fill","reduce","_embedded","groupBy","select","toParams","request","resource","toPath","pathname","signalled","basePath","startsWith","hasBodyClass","documentElement","body","classList","contains","innerWidth","mobileWidthTreshold","initialized","loadConfiguration","catch","commentsSortedInDescendingOrder","userPreference","warnOnLeavingUnsaved","autoHidePopups","isTimezoneSet","timezone","isDirectUploads","prepareAttachmentURL","configuration","systemPreference","dateFormatPresent","dateFormat","timeFormatPresent","timeFormat","startOfWeekPresent","startOfWeek","I18n","firstDayOfWeek","apiV3Service","detect","projectPath","getCurrent","document","querySelector","dataset","projectId","projectName","projectIdentifier","ErrorReporter","addHook","user$","user","querySelectorAll","setUser","mail","currentUserQuery","isLoggedIn$","setupLegacyDataListeners","currentUserStore","capabilities$","principalFilter$","capabilitiesService","require","hasCapabilities$","castArray","action","endsWith","hasAnyCapabilityOf$","subscribe","_user","_isLoggedIn","userId","setupLocale","parseDatetime","configurationService","local","tz","parseDate","parseISODatetime","parseISODate","formattedDate","getDateFormat","daysFromToday","startOf","diff","formattedTime","getTimeFormat","formattedDatetime","formattedDatetimeComponents","formattedRelativeDateTime","fromNow","toHours","Number","asHours","toFixed","toDays","asDays","toISODuration","toIsoString","formattedDuration","formattedISODate","formattedISODateTime","isValidISODate","isValid","isValidISODateTime","isNonWorkingDay","isoWeekday","weekdays","day","working","loadWeekdays","weekdaysService","_banners","getEnterPriseEditionUrl","referrer","hash","conditional","callMaybe","uploadSingle","getDirectUploadFormFrom","uploadToExternal","append","customName","url","headers","reportProgress","finishUpload","response","completeUpload","FormData","fileName","contentType","description","fileSize","size","addAttachment","form_fields","uploadAndMapResponse","uploads","finished","upload","uploadUrl","staticDownloadLocation","whenFinished","halResource","createHalResource","all","gon","titleService","getTitle","setFirstPart","titleParts","setTitle","prependFirstPart","unshift","i18n","lookup","toTime","toNumber","toPercentage","toCurrency","strftime","toHumanSize","start","delayedStop","stop","setTimeout","indicator","prepend","indicatorTemplate","remove","table","getter","getIndicatorAt","jQuery","getElementsByTagName","titleData","changeData","initializeMenu","mainMenu","elementWidth","parseInt","OpenProject","guardedLocalStorage","localStorageKey","localStorageStateKey","closeMenu","setWidth","saveWidth","offsetWidth","hasClass","defaultWidth","closeWhenOnMobile","toggleNavigation","stopPropagation","preventDefault","showNavigation","deviceService","isMobile","elementMinWidth","first","focus","blur","String","snapBack","setToggleTitle","toggleClassHidden","global","htmlNode","style","setProperty","Event","toggleTitle","hideElements","toggleClass","links","doModify","observeUntil","can","cannot","previewMarkup","principals","appBasePath","attachmentDownloadPath","staticBase","attachmentContentPath","ifcModelsPath","ifcModelsNewPath","ifcModelsEditPath","ifcModelsDeletePath","bimDetailsPath","highlightingCssPath","forumPath","projectForumPath","keyboardShortcutsHelpPath","messagePath","myPagePath","myNotificationsSettingsPath","newsPath","notificationsPath","loginPath","projectsPath","projectsNewPath","projectActivityPath","projectCalendarPath","projectMembershipsPath","projectNewsPath","projectTimeEntriesPath","projectWikiPath","projectWorkPackagePath","projectWorkPackagesPath","projectWorkPackageNewPath","projectDashboardsPath","timeEntriesPath","workPackagePath","usersPath","groupsPath","placeholderUsersPath","userPath","placeholderUserPath","groupPath","rolesPath","rolePath","versionsPath","versionEditPath","versionShowPath","workPackagesPath","workPackageCopyPath","workPackageDetailsCopyPath","workPackagesBulkDeletePath","textFormattingHelp","setIfFirst","isEmpty","params","stateKey","of","Error","_type","getSchemaHref","loadAll","en","website","boards","tableHighlighting","graphWidgets","register","optionalBoostrapComponents","performBootstrap","embeddable","selector","closest","bootstrap","cls","setAttribute","MutationObserver","disconnect","childList","subtree","demo","data","scrollIntoView","on","which","target","checkAll","checked","toggleCheckboxesBySelector","getPluginContext","pluginContext","attr","edition","isBimEdition","localStorage","getItem","setItem","console","error","actions","ofType","actions$","dispatch","requireCollection","store","getValue","collections","fetchAttachments","toastService","addError","removeAttachment","attachFiles","getAttachmentsSelfLink","getUploadTarget","getDirectUploadLink","addAttachments","uploadAttachments","ids","directFileUploadService","fileUploadService","addAttachmentUpload","prepareAttachment","createStore","require$","collectionExists","collectionLoading","loadedCollection","fetchCapabilities","loadedCapabilities$","query","selectAll","context","fetchCollection","capabilities","loadingCollections","upsertMany","self","selectHasCache","fetchWeekdays","days","week","Symbol","prototype","serviceDestroyed","callback","ngOnDestroy","Map","updateCollectionsForWorkPackage","storage","key","fileLinks","toastAndThrow","addFileLinks","originData","mimeType","lastModifiedAt","createdByName","lastModifiedByName","file_links","markAsRead","notifications","readIAN","markNotificationsAsRead","fetchUser","fetchPrincipals","collection","collectionState","selectMany","selectEntity","lookupMany","hasEntity","fetchResults","handleErrors","handleCollectionLoadingError","resettable","files","reset","storages","updateCollection","views","additional","forResource","camelCase","ngOnInit","getElementById","hidden","selectors","encoder","fromObject","_request","deserialize","resourceClass","preserveNull","deserializer","serializer","toISOString","bcfViewpointsService","bcfViewpointService","bcfTopicService","bcfExtensionService","bcfProjectService","bcfApiVersion","bcfApiBase","projectImportIssuePath","projectExportIssuesPath","snapshotPath","getViewPointResource","bcfViewpoints","bcfApi","getViewPoint$","viewpoint","selection","visibility","components","deleteViewPoint$","work_packages","saveViewpoint$","setBcfTopic$","viewerBridge","getViewpoint$","topicUUID","topics","viewpoints","bcfTopic","createBcfTopic$","convertBCF","guid","render","V","innerHTML","bcfPathHelper","authorized$","authorizationMap","putFromPromiseIfPristine","extensions","$","includes","isAllowedTo","bcf","add_viewpoint","show_viewpoint","delete_viewpoint","text_are_you_sure","notice_successful_create","notice_successful_delete","width","height","startIndex","image","thumbnailsColumns","thumbnailsAutoHide","thumbnailSize","imageAnimation","previewAnimation","previewCloseOnEsc","previewKeyboardNavigation","imageSize","imageArrowsAutoHide","thumbnailsMargin","thumbnailMargin","previewDownload","previewCloseOnClick","arrowPrevIcon","arrowNextIcon","closeIcon","downloadIcon","thumbnailActions","breakpoint","imagePercent","thumbnailsPercent","ngAfterViewInit","observeChanges","viewerVisible$","viewerVisible","cdRef","detectChanges","workPackage","untilDestroyed","initialize","refreshViewpoints","viewAllowed","bcfAuthorization","createAllowed","loadViewpointFromRoute","snapshotURL","setViewpointsOnGallery","showViewpoint","bcfViewer","shouldShowViewer","currentViewerState","deleteViewpoint","confirm","text","viewpointsService","addSuccess","gallery","preview","close","saveViewpoint","showIndex","selectViewpointInGallery","go","reload","shouldShowGroup","icon","onClick","titleText","galleryPreviewOpen","addClass","galleryPreviewClose","removeClass","show","onGalleryChanged","index","galleryOptions","setThumbnailProperties","galleryImages","small","medium","big","dynamicThumbnailHeight","max","round","observeCreation","wpCreate","onNewWorkPackage","galleryViewpoints","snapshot","snapshot_data","revitMessageReceivedSource","RevitBridge","hookUpRevitListener","once","newTrackingId","sendMessageToRevit","revitMessageReceived$","messageType","trackingId","messagePayload","hasOwnProperty","snapshot_type","sendMessageToOpenProject","trackingIdNumber","bootstrapCalled","addFieldType","provide","useFactory","navigator","userAgent","deps","imports","ifcModels","ifc_models","getProjects","getProject","models","viewerContent","modelsLoaded","shown_models","viewerConfigs","getGeometry","xkt_attachment_ids","log","newViewer","loadProject","currentProjectService","inspectorVisible$","modelId","httpClient","viewer","destroy","xeokitViewer","setKeyboardEnabled","saveBCFViewpoint","spacesVisible","reverseClippingPlanes","bitmaps","updateCompositeObjects","loadBCFViewpoint","cards","splitTable","splitCards","hasChanged","displayRepresentation","applyToQuery","valueFromQuery","viewerBridgeService","mapping","available","localizedName","disabled","bannersService","eeShowBanners","CurrentProject","buildQueryRequest","public","writable","addFreeQuery","freeBoardQueryFilter","createHalResourceOfClass","manualSort","operator","values","unnamed_board","action_board","unnamed_list","loadAllBoards","loadAllPromise","canManage","reorderWidgets","boardName","boardsList","boardActions","addInitialColumnsForAction","columnCount","causedUpdates","cacheValue","splice","updatedAt","created","emit","close_popup","free_board","free_board_text","free_board_title","board_type","action_board_text","select_attribute","select_board_type","teaser_text","upgrade_to_ee_text","more_info_ee_link","cancel_button","initiateTiles","createBoard","createFree","createAction","addIcon","addDescription","addText","addImage","inFlight","loadingIndicatorService","modal","promise","boardService","closeMe","board_id","isNew","halNotification","handleRawError","boardActionRegistry","resizeObserver","resizeObs","ResizeObserver","resize$","nativeElement","applyNonWorkingDay","date","weekdayService","querySpace","results","workPackagesListener$","calendarOptions","defaultOptions","eventDate","isMilestone","warnOnTooManyResults","tooManyResultsText","MAX_DISPLAYED","addNotice","updateTimeframe","areFiltersEmpty","end","urlParams","query_id","initializingWithQuery","generateQueryProps","initializingWithQueryProps","query_props","dateFilter","defaultQueryProps","wpListChecksumService","wpListService","fromQueryParams","urlParamsHelper","encodeQueryJsonParams","pp","pa","cview","dateEditable","isAttributeEditable","isLeaf","scheduleManually","eventDurationEditable","getEndDateFromTimestamp","subtract","openSplitView","wpTableSelection","setSelection","$state","workPackageId","tabIdentifier","openFullView","onCardClicked","event","onCardDblClicked","showEventContextMenu","contextMenuService","editable","fixedWeekCount","firstDay","timeZone","headerToolbar","left","center","right","initialDate","initialView","datesSet","updateDateParam","dayHeaderClassNames","calendarService","dayCellClassNames","dayGridClassNames","slotLaneClassNames","slotLabelClassNames","o","dr","hi","uiRouterGlobals","wpTableFilters","cdate","timezoneService","view","currentStart","custom","notify","updateDates","extendedProps","halEditing","edit","ignoreNonWorkingDays","duration","setValue","endStr","startStr","title","unsaved_title","component","containerClasses","inputs","hideTableOptions","setPartition","currentPartition","partition","staticQueryName","loadInitialQuery","redirectTo","dynamic","bodyClasses","baseRoute","cannot_drag_to_non_working_day","calendar","ucCalendar","getApi","updateSize","stopAllSubscriptions","setupWorkPackagesListener","initializeCalendar","calendarEventsFunction","alreadyLoaded","updateResults","workPackagesCalendar","currentWorkPackages$","currentProject","buildHeader","eventSources","events","color","background","textColor","display","plugins","selectable","handleDateClicked","eventResizableFromStart","eventDidMount","el","source","eventResize","toDate","revert","updateEvent","eventDrop","eventResizeStart","addBackgroundEventsForNonWorkingDays","eventResizeStop","removeBackGroundEvents","eventDragStart","eventDragStop","removeProperty","eventClick","static","calendarOptions$","openContextMenu","refetchEvents","mapToCalendarEvents","subject","allDay","className","showSave","wasNew","projectedResource","startDate","dueDate","defaults","getEvents","activeStart","activeEnd","addEvent","label_email","label_expires_at","label_maximum_users","label_company","label_domain","label_starts_at","label_subscriber","text_expired","text_reprieve_days_left","eeTrialService","host","hostName","formBuilder","group","company","userData","first_name","last_name","email","domain","configuredHost","general_consent","newsletter_consent","language","currentUserService","link_terms","link_privacy","label_test_ee","label_first_name","label_last_name","domain_mismatch","privacy_policy","receive_newsletter","link","terms_of_service","checkMailField","trialForm","controls","errors","emailInvalid","button_submit","button_cancel","button_continue","heading_confirmation","heading_next_steps","heading_test_ee","quick_overview","observe$","status","cancelled","trustedEEVideoURL","trustedURL","formComponent","onSubmit","valid","addControl","sendForm","startEnterpriseTrial","setStartTrialStatus","closeModal","confirmed","modalOpen","domSanitizer","bypassSecurityTrustResourceUrl","subscriber","userData$","formatUserData","Gon","baseUrlAugur","trialLink","getUserDataFromAugur","retryConfirmation","getToken","Date","confirmation_info","resend","resend_success","resend_warning","session_timeout","status_confirmed","status_label","status_waiting","ee_trial_key","resendMail","resendLink","invalid_email","taken_email","taken_domain","augur_url","tokenVersion","token_version","setMailSubmittedStatus","saveTrialKey","addWarning","token_retrieved","saveToken","token","trial_key","enterprise_token","encoded_token","button_trial","openTrialModal","opModalService","method","templated","$fetch","requestMethod","$prepare","clone","$callable","extend","$link","$copy","isObject","isArray","$embeddableKeys","defineProperty","enumerable","configurable","$linkableKeys","createLinkedResource","indexOf","lazy","pop","decodeURIComponent","intercept","handleAuthenticatedRequest","handleExternalRequest","handle","internal_error","handleError","rejection","httpError","captureError","errorMessages","captureException","captureMessage","without","getErrors","validationErrors","halInitializer","errorIdentifier","isValidationError","attributeFromLocalizedName","availableAttributes","forValue","dependencies","allowedValues","$initialize","_dependencies","dependency","getFilter","definesAllowedValues","isValueRequired","isResourceValue","loadedAllowedValues","resultingSchema","merge","some","WorkPackage","attrTypes","ancestors","children","relations","Activity","Relation","from","to","Schema","Type","Status","SchemaDependency","User","Group","Collection","WorkPackageCollection","AttachmentCollection","Query","Form","FormPayload","QueryFilterInstance","QueryFilterInstanceSchema","QueryFilter","Root","QueryOperator","HelpText","CustomAction","WikiPage","MeetingContent","Post","Project","Role","Grid","GridWidget","TimeEntry","Membership","News","Version","useClass","registerResource","multi","updateElements","$load","isMultiErrorMessage","getInvolvedAttributes","details","flatten","extractMultiError","getMessagesPerAttribute","updateAttachments","$update","$halType","exec","retainFrom","__initialized_at","$plain","$loaded","cloneDeep","_name","previewPath","getEditorContext","$loadResource","valuesPromise","$self","canAddAttachments","lookupDownloadLocationByName","pull","$isHal","attachmentsBackend","updateState","performUpload","ToastService","ErrorEvent","directUploadURL","opDirectFileUpload","opFileUpload","config","macros","memoizedCurrentSchemas","isCompletelyDefined","currentSchema","findOperator","availableOperators","isTemplated","setSortBy","RELATION_TYPES","label","normalizedType","denormalized","relationType","targetId","reverseType","reverseRelationType","isInvolved","updateDescription","updateType","active_user_statuses","showUser","isLocked","isOpen","isClosed","subjectWithType","subjectWithId","truncate","disabledMentions","isParentOf","updateLinkedResources","reject","wpCacheService","wpActivity","extractPayloadFromSchema","Proxy","proxyMethod","ofProperty","mappedName","isEditable","Reflect","apply","isReadonly","readonly","setPrototypeOf","_events","aggregated$","events$","resourceType","handleErrorResponse","retrieveError","showGeneralError","retrieveErrorMessage","showError","showApiErrorMessages","showCustomError","showEditingBlockedError","toLowerCase","sortingProperty","hasSortingProperty","performRequest","createErrorObservable","toEprops","put","getResourceClassOfType","fromLink","fromSelfLink","getResourceClassOfAttribute","defaultClass","eprops","encodeKey","encodeURIComponent","encodeValue","decodeKey","decodeValue","totalUnread","unread$","unreadCountIncreased$","fetchUnread","resourceService","reloadOnNotificationRead","page","activeCollection","activeFacet","notLoaded","pe","ue","Fe","nt","ft","Pt","yt","Lt","Xt","params$","vt","selectLoading","activeCollection$","di","selectNotifications$","_i","aggregatedCenterNotifications$","notifications$","notLoaded$","setLoading","sideLoadInvolvedWorkPackages","jt","stateChanged$","updateSelectedNotification","setFilters","onReload","setFacet","selectedNotification","goToCenter","markAllAsRead","openSplitScreen","showNextNotification","selectedNotificationIndex","checkForNewNotifications","activeReloadToast","compact","ngOnChanges","highlightClass","currentValue","work_package_is","overdue","overdue_since","difference_in_days","property_is","property_was","property_deleted","due_today","deriveMostRelevantAlert","aggregatedNotifications","property","deriveDueDate","propertyText","alertText","dateIsPast","isBefore","isOverdue","dateDiff","buildAlertText","abs","reason","and","and_other_singular","and_other_plural","loading","mark_as_read","updated_by_at","buildActors","buildTime","text_for_additional_authors","fixedTime","notification","relativeTime$","actor","actors","uniqBy","storeService","activeReason$","buildTranslatedReason","buildProject","loadWorkPackage","workPackage$","showDetails","showDateAlert$","projectClicked","defaultValue","translatedReasons","showUrl","hasMoreThanPageSize$","hasNotifications$","loading$","bellService","totalCount$","no_results","with_current_filter","at_all","newest_count","maxSize","more_count","reasonMenuItems","no_notification","no_selection","no_notification_with_current_filter_project","no_notification_with_current_filter","selectedFilter","change_notification_settings","pathService","button_close","noNotificationText","mySettings","facets","facet_titles","activeFacet$","activateFacet","mark_all_read","markAllRead","documentReferer","setInitialHtmlTitle","removeTransitionSubscription","$transitions","onSuccess","updateTitleName","changeChangesFromTitle","Wt","ve","yi","li","ke","Ke","Ee","open","closingEvent","ProjectSelection","customFields","locals","markForCheck","onProjectSelectionSave","goTo","Principal","onPrincipalSave","principalData","isAlreadyMember","role","closeWithPrincipal","Summary","onSuccessfulSubmission","createdNewPrincipal","Success","step","closePopup","redirect","redirect_errors","redirect_link","download_starts","click_to_download","jobId","listenOnJobStatus","continuedStatus","loadingIndicator","onResponse","isLoading","iconForStatus","handleRedirect","handleDownload","download","statusIcon","downloadHref","downloadLink","click","jobUrl","job_statuses","hooks","_currentProjectService","apiv3Path","dynamicFieldsSettingsPipe","isFieldHidden","hide","hiddenFields","fieldSettingsPipe","use_template","no_template_selected","advancedSettingsLabel","copySettingsLabel","copyableTemplateFilter","template","templateForm","resourcePath","fieldGroups","fieldsFilter","templateOptions","isMeta","required","hasDefault","payloadValue","uIRouterGlobals","parent_id","setParentAsPayload","onSubmitted","modalService","pathHelperService","onTemplateSelected","initialPayload","dynamicForm","model","sendNotifications","formUrl","isHiddenField","copy","isPrimaryAttribute","sortedCopyFields","localeCompare","urlService","rules","when","goBack","customBackMethod","backRoutingService","goToOtherState","goBackToDetailsState","backRoute","keepTab","currentDetailsTab","goBackNotToDetailsState","goBackToPreviousState","isDetailsState","goToBaseState","sync","_backRoute","cancel","_saving","saving","editForm","submit","onSave","onCancel","wpFiltersService","visible$","pristine$","loaded","replaceIfComplete","isAvailable","filtersChanged","createWithDropdown","createButton","explanation","searchTerm","timestampOfLastValue","searchTermChanged","deactivateFilter","onFilterUpdated","filterChanged","parser","moment","formatter","spacer","isoDateParser","isoDateFormatter","lowerBoundary","upperBoundary","hours","minutes","timeZoneText","features","valueString","begin","enter_text","additionalProjectApiFilters","onChange","availableOptions","halSorting","ngSelectInstance","shouldFocus","setValues","me","autocomplete","initialRequest$","loadCollection","matchingItems","withMeValue","createFilters","allowedValuesLink","isUserResource","currentUser","meValue","open_filter","close_filter","label_filter_add","upsale_for_more","upsale_link","button_delete","showValuesInput","showValues","removeThisFilter","bannerService","more_info_link","close_form","selected_filter_list","please_select","filter_by_text","updateRemainingFilters","onFilterAdded","instantiate","currentFilterLength","updateFilterFocus","ngSelectComponent","clearItem","closeFilter","toggleVisibility","isFilterAvailable","remainingFilters","remainingVisibleFilters","focusElementIndex","currentFilterAt","availableFilters","onOpen","dropdownPanel","_updatePosition","createComment","addComment","comment","errorAndReject","updateComment","workPackageNotificationService","edit_parent","set_or_remove_parent","remove_parent","set_parent","canModifyParent","changeParent","editing","toggle","updateParent","isSaving","wpRelationsHierarchy","notificationService","onSwitch","hierarchy","hierarchyCount","updateActiveInput","inputActive","activate","deactivate","labelKey","buttonText","textKey","activationPrefix","deactivationPrefix","isToggle","active","browserDetector","stateName","getEmptyForm","buildItems","opContextMenu","items","contextMenuId","linkText","ariaLabel","class","allowed","allowedWhen","updateDisabledState","transitionUnregisterFn","transition","setupObserver","prefix","performAction","live$","currentlyVisibleFilters","visible","markAllBelongingNotificationsAsRead","showInMenu","visibleForOthers","showInMenuText","visibleForOthersText","isSave","queryForm","updateStarred","isStarred","changed","updatePublic","isPublic","save_as","label_name","label_visibility_settings","button_save","saveQuery","isBusy","queryNameField","saveQueryAs","queryName","loadingPromise","positionArgs","assign","my","onClose","focusAfterClose","afterFocusOn","allowQueryAction","allowAction","allowWorkPackageAction","allowFormAction","initialTab","trigger","create_new","divider","configureForm","more_actions","changeFor","getForm","updateStatus","postIcon","postIconTitle","workPackageReadOnly","workPackageStatusBlocked","temporaryEditResource","typedState","activateLabel","deactivateLabel","enabled","onchange","isFullscreen","deactivateZenMode","inZenMode","exit","activateZenMode","eventScope","container","handleEvent","is","handleWorkPackage","itemClicked","double","wpCardView","findRenderedCard","ctrlKey","metaKey","shiftKey","setMultiSelectionFrom","renderedCards","toggleRow","selectionChanged","getSelectedWorkPackageIds","wpTableFocus","updateFocus","isSelected","showInfoButton","init","cardView","dragService","registerDragAndDrop","dragContainer","scrollContainers","moves","canDragOutOf","accepts","dragInto","onMoved","reorderService","move","currentOrder","updateOrder","onRemoved","onAdded","addWorkPackageToQuery","parentElement","removeChild","_workPackages","activeInlineCreateWp","addNewCard","createOrContinueWorkPackage","workPackageAddedHandler","removeReferenceWorkPackageForm","removeCard","onCardSaved","findIndex","wpInlineCreate","newInlineWorkPackageCreated","classIdentifier","tableRendered","updateRenderedCardsValues","oxw","stateLinkClicked","noResults","referenceComponentClass","setReferenceMode","onReferenced","cardDragDrop","registerCreationCallback","halEvents","eventType","wpViewOrder","orderedWorkPackages","isResultEmpty","attachTo","registerSelectAllListener","registerDeselectAllListener","inReference","classes","orientation","shrinkOnMobile","detailsView","Intl","DateTimeFormat","year","month","selectedWhenOpen","selected","emitStateLinkClicked","requestedState","cardClasses","draggable","showAsInlineCard","showAsGhost","cardTitle","wpTypeAttribute","wpSubject","wpProjectName","wpDates","dateTimeFormatYear","formatRange","dateTimeFormat","endDate","wpOverDueHighlighting","fullWorkPackageLink","cardHighlightingClass","cardHighlighting","typeHighlightingClass","attributeHighlighting","onRemove","cardCoverImageShown","bcfSnapshotPath","wpRelations","addCommonRelation","copiedWorkPackageId","createdWorkPackage","stateParams","copiedFromWorkPackageId","createCopyFrom","copyWorkPackage","pristineResource","applyFirstValue","setToNull","applyDefaultsFromFilters","excluded","handlers","filterAlreadyApplied","mapFilterToAttribute","setValueFor","findSpecialValue","isLoggedIn","updateForm","applyChanges","setNewDefaultFor","form$","$element","elementRef","wpeditForm","fields","fieldName","handleUserActivate","build","createElement","fieldRenderer","appendChild","backgroundClass","getPropertyValue","sum","buildSumsRow","renderColumns","sums","augmentedColumns","renderContent","sumsSchema","appendFirstLabel","textContent","displayFieldService","getField","leaf","level","expanded","collapsed","refreshRow","appendHierarchyIndicator","buildEmpty","ancestorRowData","wpTableHierarchies","parentsWithVisibleChildren","buildAncestorRow","buildHierarchyIndicator","css","indentation","columnId","wpTableRelationColumns","getExpandFor","relationsForColumn","renderIndicator","renderBadge","tableActionsService","buildAugmentedColumns","wpTableColumns","getColumns","columns","workPackageTable","dragAndDropEnabled","buildCell","relationCellBuilder","actionsColumnEnabled","contextLinkBuilder","columnMenuEnabled","cellBuilder","createEmptyRow","buildEmptyRow","colSpan","detach","isColumnBeingEdited","forms","activeFields","change","changedAttributes","insert","linkToDetails","linkToShow","currentShowTab","wpState","processEvent","previousElementSibling","matches","scrollParent","scrollTop","offsetTop","warn","isApplicable","collapse","expand","buildGroupRow","groupIndex","groupIdentifier","escape","wpTableHighlighting","mode","getComputedStyle","tablePass","renderedOrder","tableBody","isInline","isDisabled","actionService","canPickup","wpTableOrder","withLoadedPositions","renderType","dragDropHandleBuilder","element","replaceChild","firstElementChild","timelineBody","createDocumentFragment","timelineBuilder","additionalClasses","emptyRelationCell","buildEmptyRelationRow","createEmptyRelationRow","relationClassIdentifier","appendRelationLabel","createTextNode","empty","relationRowBuilder","relationsToExtendFor","spliceRow","belongsTo","relation","refreshRelationRow","hasRelationColumns","prepare","doRender","postRender","highlighting","dragDropHandle","timeline","rowBuilder","replaceWith","last","after","renderPlaceholderRow","placeholderRow","appendRow","appendNonWorkPackageRow","originalRows","originalRowIndex","object","matchingGroup","renderSumsRow","headerBuilder","colspan","buildSingleRow","groups","matchesMultiValue","valueLink","isEqualWith","sumsBuilder","collapsedGroups","buildRows","getGroupData","refreshExpansionState","tableAndTimelineContainer","parentNode","hierarchies","deferInsertion","buildWithHierarchy","markRendered","renderAllDeferredChildren","rendered","deferred","slice","insertUnderParent","getOrBuildRow","insertAtExistingHierarchy","additionalParents","buildRenderInfo","isEnabled","resourceSubscription","unsubscribe","findContainer","rowContainer","findCell","activateField","waitForContainer","editingPortalService","FocusHelper","requireVisible","addColumn","focusOnFirstError","loadFieldSchema","setInterval","clearInterval","stopEditing","startEditing","hierarchyRowsBuilder","groupedRowsBuilder","plainRowsBuilder","findRenderedRow","renderedRows","builders","buildIndex","position","initialSetup","redrawTableAndTimeline","performRenderPass","requestAnimationFrame","tbody","result","redrawTable","refreshRows","lastRenderPass","setGroupsCollapseState","performance","now","wpTableHighlight","updates$","switchToManualSorting","wpTableSortBy","wpList","createOrSave","decls","cancelButton","buildCancelButton","buildNew","buttonTexts","canAdd","canReference","hasReferenceClass","showing","refreshOnColumnChanges","registerCancelHandler","resetRow","stopImmediatePropagation","currentWorkPackage","isEmbedded","cancelCreation","removeWorkPackageRow","showRow","handleAddRowClick","addWorkPackageRow","handleReferenceClick","referenceClass","editingSubscription","changesetUpdates$","insertRow","workPackageEditForm","renderInlineCreateRow","activateMissingFields","hideRow","reference","canCreateWorkPackages","complete","newInlineWorkPackageReferenced","updateIfDifferent","getNewChecksum","isUninitialized","isIdDifferent","maintainUrlQueryState","isChecksumDifferent","setToQuery","isQueryOutdated","isOutdated","executeIfOutdated","checksum","visibleChecksum","UrlParamsHelper","perPage","restoreQuery","restoreFilters","restoreColumns","restoreSortBy","restoreGroupBy","restoreOtherProperties","queryRequests","ensurePerPageKnown","streamQueryRequest","queryParams","conditionallyLoadForm","wpStatesInitialization","getCurrentQueryProps","buildV3GetQueryFromJsonParams","handleQueryLoadingError","queryLoading","loadDefaultQuery","reloadQuery","extractParamsFromQuery","wpTablePagination","loadQueryFromExisting","buildV3GetQueryFromQueryResource","loadCurrentQueryFromParams","loadForm","updateStatesFromForm","createQueryAndView","changes","currentQuery","getPaginationInfo","paginationObject","wpListInvalidQueryService","pagination","isPerPageKnown","wpQueryView","viewType","clearStates","initializeFromQuery","updateQuerySpace","updateChecksum","initializeFilters","additionalRequiredWorkPackages","wpTableAdditionalElements","wpDisplayRepresentation","wpIncludeSubprojects","wpTableSum","wpTableGroupBy","wpTableGroupFold","wpTableTimeline","$transition","button_settings","closeEditFormWhenNewWorkPackageSaved","showForm","switchToFullscreen","onSaved","savedResource","isInitial","successState","wpViewFocus","newWorkPackage","parentWorkPackage","root","back_url","cancelAndBackToList","cancelState","componentDestroyed","viewQuery","committedChanges","newWorkPackageCreated","newWorkPackageCreatedSubject","createNewWorkPackage","fromCreateForm","initializeNewResource","copyFrom","continueExistingEdit","createNewWithDefaults","attachmentsService","withFiltersPayload","defaultsFromFilters","toApiPayload","PROPERTY","RELATION_OF_TYPE","RELATION_TO_TYPE","getFilterSchema","allowedFilterValue","listenForQueryParamsChanged","queryChangeListener","removeQueryChangeListener","buildQueryString","showHierarchies","g","includeSubprojects","encodeSums","encodeTimelineVisible","encodeHighlightingMode","encodeHighlightedAttributes","encodeSortBy","encodeFilters","s","hl","highlightedAttributes","hla","queryFilterValueToParam","timelineVisible","tv","timelineLabels","tll","tzl","timelineZoomLevel","paginationService","getPerPage","showSums","buildV3GetColumnsFromQueryResource","buildV3GetFiltersAsJson","buildV3GetSortByFromQuery","idFromHref","buildV3GetFilters","buildV3GetFilterIdFromFilter","buildV3GetOperatorIdFromFilter","buildV3GetValuesFromFilter","filterBuilderFrom","substring","lastIndexOf","wpRelationsHierarchyService","addExistingChildWp","referenceTarget","canAddChild","embeddedTable","queryProps","buildQueryProps","relatedWorkPackage","isInitialized","refreshTable","buildQueryFilters","abort","addExisting","selectedWpId","onSelected","removeRelation","addRelation","loadQuery","handleQueryLoaded","projectValuesCount","queryUrlParamsHelper","valid_subset","availableRelationCandidates","additionalFilters","filterCandidatesFor","selectedRelationType","getOptionsFn","getAutocompleterData","onWorkPackageSelected","ngZone","runOutsideAngular","repositionDropdown","hiddenOverflowContainer","one","closeSelect","lockVersion","removeParent","addNewChildWp","initializeMembers","relationsStateValue","accumulateRelationsFromInvolved","removeFromStates","updateRelationType","updateRelation","insertIntoStates","keyBy","activityDate","activity","activities","dateOfPrevious","number","orderedIndex","version","isReversed","ConfigurationService","revisions","sortedActivityList","reverse","info","updateTabs","isCurrentState","goCurrentShowState","goCurrentDetailsState","currentTab","lastActiveTab","updateTab","loadingError","loadCurrentWatchers","availableWatchersPath","available_watchers","allowedToView","watchers","allowedToAdd","addWatcher","allowedToRemove","removeWatcher","wpWatchersService","watching","wpDetails","user_id","isCached","cacheDurationInSeconds","fetchAction","onMouseEnter","customActions","migration_help","switchTo","infoRow","createdBy","lastUpdatedOn","isNewResource","uiSelfRef","$current","resourceContextChange","contextFrom","projectContext","inProjectContext","field","getFields","_attributeGroups","groupedFields","rebuildGroupedFields","shouldHideGroup","members","trackByName","prependedAttributeGroupComponents","hook","attributeGroupComponent","attachmentListComponent","attachmentUploadComponent","projectname","showTwoColumnLayout","getBoundingClientRect","getAttributesGroupId","attributes","isolated","getDateField","displayField","multiple","spanAll","isFormattable","baseSchema","activeTabs","componentRef","instance","disable","activateInstance","outletElement","_getComponentRootNode","tabName","portal","setAttachedHost","dispose","createComponent","componentFactoryResolver","resolveComponentFactory","componentClass","appRef","attachView","hostView","detachView","rootNodes","columnsLabel","selectedColumns","multiSelectLabel","applyButton","upsaleRelationColumns","upsaleRelationColumnsLink","tabPortalHost","wpTableConfigurationService","tabs","tabContentOutlet","availableTabs","onDataUpdated","saveChanges","activeComponents","service","choose_mode","label_group_by","display_sums","display_sums_hint","display_mode","grouped","hierarchy_hint","setEnabled","displayMode","currentGroup","wpTableSums","displaySums","updateGroup","availableGroups","onReady","column2Like","availableColumns","columnsHelp","upsaleCheckOutLink","moreInfoLink","setColumnsById","selectedColumnMap","updateSelected","sort_criteria_1","sort_criteria_2","sort_criteria_3","sorting_mode","automatic","manually","warning","sortingMode","sortationObjects","column","manualSortColumn","getMatchingSort","direction","onReadyWithAvailable","allColumns","getManualSortingOption","updateSortingMode","updateUsedColumns","fillUpSortElements","updateSelection","emptyColumn","differenceBy","display_timelines","display_timelines_hint","zoom","weeks","months","quarters","years","auto","labels","bar","none","farRight","zoomLevel","updateLabels","isVisible","availableLabels","allPropertyColumns","highlighting_mode","inline","inline_all_attributes","priority","entire_row_by","upsaleAttributeHighlighting","availableInlineHighlightedAttributes","availableHighlightedAttributes","availableRowHighlightedAttributes","setSelectedValues","Banners","updateMode","selectedAttributes","lastEntireRowAttribute","entireRowMode","updateHighlightingAttributes","disabledValue","_tabs","getPermittedActionLinks","getAllowedActions","getAllowedParentActions","getAllowedRelationActions","getIntersectOfPermittedActions","BULK_ACTIONS","HookService","every","isActionAllowed","getBulkActionLink","shift","indexBy","wpViewRepresentation","isList","wpViewIndent","canOutdent","canIndent","wpViewTimeline","addChild","getPermittedActions","onNewOrder","handleDrop","changeShadowElement","applies","determineParent","relationHierarchyService","nextElementSibling","droppedIntoGroup","findRelationRowRoot","isHiearchyRoot","loadParentOfWP","groupedAttribute","getValueForGroup","providedConfiguration","initialLoadingIndicator","buildUrlParams","setLoaded","renderTable","tableVisible","queryProjectScope","uniqueEmbeddedTableName","initializeStates","loadedQuery","tableActions","setActions","openConfigurationModal","showTablePagination","compactTableStyle","formPromise","apiv3Service","onQueryLoaded","onError","handleWorkPackageClicked","openStateLink","OlP","_portalHostElement","_bodyPortalHost","externalQueryConfigurationComponent","injectorFor","bodyPortalHost","attach","hasAttached","WeakMap","filter_work_packages_by_relation_type","precedes","follows","relates","duplicates","duplicated","blocks","blocked","requires","partof","availableRelationFilters","relationFiltersOf","setSelectedRelationFilter","selectedRelationFilter","onRelationFilterSelected","removeRelationFiltersFromCurrentState","addFilterToCurrentState","relationFilterIds","getOperatorForId","compareRelationFilters","useValue","disabledTabs","buildElement","applicable","button","uiStatebuilder","linkTitle","label_previous","label_next","per_page","no_other_page","loadPaginationOptions","perPageOptions","totalEntries","updateCurrentRangeLabel","updatePageNumbers","selectPerPage","setPerPage","showPage","onUpdatedPage","hideForSinglePageResults","getLowerPageBound","getUpperPageBound","currentRange","showPageSelections","pageNumbers","postPageNumbers","getMaxVisiblePageOptions","getOptionsTruncationSize","truncatePageNums","prePageNumbers","min","showPerPageOptions","showPerPage","isManualSortingMode","infoText","paginationInfoText","updateFromObject","hour","minute","seconds","dateDisplayStart","settings","maxSteps","pixelPerDay","dateDisplayEnd","endOf","visibleViewportAtCalculationTime","isSameOrAfter","isSameOrBefore","inViewportAndBoundaries","rest","isAfter","originalEvent","deltaX","deltaY","scrollLeft","off","inlineCreateService","updateRenderedOrder","scrollContainer","getElementsByClassName","findRowIndex","sourceIndex","onCloned","maxWidth","outerHTML","onShadowInserted","isEdge","dragActionRegistry","currentRenderedOrder","renderedWorkPackages","workPackageViewCollapsedGroupsService","$onUserActivate","setExpandFor","triggerContextMenuAction","timelineController","startAddRelationPredecessor","startAddRelationFollower","wpViewIndentation","indent","outdent","rowSelector","contextMenuEnabled","keyCode","altKey","SELECTOR","parents","toggleGroupCollapseState","renderHierarchyState","match","ifShouldFocus","renderSelectionState","renderVisibility","stateTransformers","lastHoveredElement","handleHover","eventListener","passive","removeEventListener","removeAllHoverClasses","locateHoveredTableRow","locateHoveredTimelineRow","removeOldAndAddNewHoverClass","extractWorkPackageId","getAttribute","tableAndTimeline","configurationObject","limitedResults","tableSummary","tableSummaryHints","sumVisible","numTableColumns","scrollSyncUpdate","manualSortEnabled","wpTableHoverSync","registerTimeline","getTableAndTimelineElement","tableElement","ndcDynamicInputs$","tab","findTab","wpTabsService","getTab","goToFullScreen","uiSrefBase","canViewWatchers","getDisplayableTabs","route","routeParams","z","U","Pe","Le","parentHeadline","childrenHeadline","canModifyHierarchy","canAddRelation","childrenQueryProps","gt","Rt","bt","newRelationText","showDescriptionEditForm","showRelationTypesForm","showRelationInfo","handler","removeButton","description_label","toggleDescription","relatedBy","userInputs","availableRelationTypes","startDescriptionEdit","relationDescriptionTextarea","val","prop","handleDescriptionKey","cancelDescriptionEdit","saveDescription","activateRelationTypeEdit","groupByWorkPackageType","cancelRelationTypeEditOnEscape","saveRelationType","toggleUserDescriptionForm","highlightingClassForWpType","groupByType","groupByRelation","toggleButton","onToggleGroupBy","toggleElement","addNewRelation","createRelation","createCommonRelation","toggleRelationsCreateForm","showRelationsCreateForm","relations_header","loadedRelations","getRelatedWorkPackages","getRelatedWorkPackageId","toggleGroupBy","buildRelationGroups","currentRelations","relationGroups","relationGroupKeys","relationsPresent","Ki","commentsOnly","showAll","togglerText","mn","successfulTransitions","peekTail","Xn","eo","comingFromNotifications","reloadActivities","wpSingleViewService","selectNotificationsCount$","scrollIfNotificationPresent","scrollToUnreadNotification","updateActivities","unfilteredActivities","getVisibleActivities","visibleActivities","showToggler","shouldShowToggler","getActivitiesWithComments","onlyComments","hasUnreadNotification","additionalScrollMargin","toggleComments","commentValue","handleUserCancel","onDestroy","onFocusOut","handleUserKeydown","isChanged","editTitle","cancelTitle","canAddComment","showAbove","commentService","quoteEvents","commentContainer","startDragOverActivation","scrollToBottom","handleUserSubmit","rawComment","wpLinkedActivities","scrollHeight","setErrors","Ce","activityHtmlId","activityNo","activityLabel","loadAuthor","revision","html","showRevision","formattedIdentifier","revision_identifier","revisionLink","committed_revision_link","author","userName","authorName","userActive","userAvatar","avatar","userLabel","innerHtml","bypassSecurityTrustHtml","dynamicBootstrapper","bootstrapOptionalEmbeddable","Sn","label_created_on","label_updated_on","quote_comment","edit_comment","htmlId","updateCommentText","isComment","isBcfComment","userCanEdit","userCanQuote","shouldHideIcons","focussing","quoteComment","quotedText","finally","focusEditIcon","focused","postedComment","Mi","activityType","Yt","latestActivityInfo","latestActivities","ei","Ni","Fi","Oi","Tn","ae","storageFile","ji","un","navigate","q","content","alreadyLinkedFile","alreadyLinkedDirectory","isDirectory","isFirst","le","ct","It","transform","Ct","pure","Pn","bi","header","buttons","openStorage","storageType","storageTypeName","selectedFileCount","submitEmptySelection","Set","storageLink","breadcrumbs","$i","storageName","changeLevel","crumbs","listItems$","storageFiles$","storageFileToListItem","storageFilesResourceService","makeFilesCollectionLink","openStorageLocation","storageLocation","createSelectedFileLinks","fileMap","fileLinksResourceService","collectionKey","addFileLinksHref","selectAllOfCurrentLevel","isAlreadyLinked","changeSelection","cancelCurrentLoading","loadingSubscription","Kn","gi","Ti","A","openFile","openFileLocation","removeFileLink","downloadFileLink","floatingText","noViewPermission","removalTitle","removalButtonLabel","removalConfirmation","notAllowdTooltipText","fileLink","infoTimestampText","fileLinkIcon","downloadAllowed","permission","principalRendererService","confirmRemoveFileLink","continue","confirmDialogService","qn","infoBox","emptyStorageHeader","emptyStorageContent","emptyStorageButton","fileLinkErrorHeader","fileLinkErrorContent","connectionErrorHeader","connectionErrorContent","authorizationFailureHeader","authorizationFailureContent","loginButton","linkFile","linkExisting","activeFeatureFlags","initializeStorageTypes","storageTypeMap","authorizationState","fileLinks$","fileLinkResourceService","storageInformation","instantiateStorageInformation","showLinkFilesAction","allowEditing$","storageFilesLocation","openLinkFilesDialog","addFileLink","failedAuthorizationInformation","authorizationErrorInformation","emptyStorageInformation","fileLinkErrorInformation","wi","dn","authorize","Vn","setAuthorizationCallbackCookie","hn","authorizationFailureActionUrl","fileLinkSelfLink","cookieService","storages$","storagesResourceService","toast","showAttachmentHeader$","ri","Ri","zi","nonDateAlertNotificationsCount$","Cr","cn","registeredTabs","buildDefaultTabs","patchTabCondition","displayable","counter","Vt","showCountAsBubble","_n","yr","Zi","Sr","Dn","setWatchStatus","isWatched","toggleWatch","nextStateLink","buttonTitle","buttonClass","buttonId","watchIconClass","useExisting","Z","be","Re","Be","$e","label_children_derived_duration","ganttChartRowHeight","canMoveDates","valueOf","displayPlaceholderUnderCursor","cursorDateAndDayOffset","displayDurationForDate","viewParams","pointerEvents","zIndex","applyTypeColor","assignDateValues","assignDate","onDaysMoved","He","_t","Ge","onMouseDown","activeSelectionMode","mouseDirection","mouseDownCursorType","workPackageTimeline","forceCursor","onMouseDownEnd","backgroundImage","setElementPositionAndSize","checkForActiveSelectionMode","checkForSpecialDisplaySituations","floor","offsetX","selectionModeStart","getMarginLeftOfLeftSide","getMarginLeftOfRightSide","getPaddingLeftForIncomingRelationLines","getPaddingRightForOutgoingRelationLines","createAndAddLabels","minWidth","cursorOrDatesAreNonWorking","MouseEvent","derivedStartDate","derivedDueDate","ti","Dt","ai","getNormalizedLabels","renderLabel","renderHoverLabels","renderFieldValue","isParentWithVisibleChildren","inHierarchyMode","marginLeft","withAlternativeLabels","We","Je","rt","lt","xt","getAbsoluteLeftCoordinates","clientX","cursor","onmouseleave","onmousedown","pi","Ei","Ui","Hi","B","onmouseup","disableViewParamsCalculation","onmousemove","fe","resetCursor","clearValue","timelineRendered","we","refreshView","Gn","tn","cellRenderer","latestRenderInfo","canConnectRelations","cellElement","wpElement","cellContainer","lazyInit","elementShape","isDuplicatedCell","renderers","milestone","generic","cellRenderers","hasCell","getCellsFor","cells","refreshAllCells","synchronizeCells","refreshSingleCell","refreshCellsFor","renderInfoFor","wpTimeline","workPackageIdOrder","difference","viewParameters","buildCellsAndRenderOnRow","shouldBeShownInCollapsedGroupHeaders","orderedRows","selectionMode","outerContainer","wpTableComponent","refreshRequest","commonPipes","setupManageCollapsedGroupHeaderCells","workPackageCells","cellsRenderer","workPackageIndex","onRefreshRequested","getParentScrollContainer","_viewParameters","isAutoZoom","applyAutoZoomLevel","appliedZoomLevel","calculateViewParams","refreshCollapsedGroupsHeaderCells","collapsedGroupsCellsMap","scrollWidth","activateSelectionMode","getFirstDayInViewport","getLastDayInViewport","resetSelectionMode","selectionParams","Mousetrap","unbind","getWorkPackagesToCalculateTimelineWidthFrom","dayCountForMarginLeft","isSame","manageCollapsedGroupHeaderCells","allGroupsChanged","shouldManageCollapsedGroupHeaderCells","lastChangedGroup","createCollapsedGroupHeaderCells","removeCollapsedGroupHeaderCells","groupTypesWithHeaderCellsWhenCollapsed","groupedBy","wpTypesToShowInCollapsedGroupHeaders","workPackagesWithGroupHeaderCell","confirmDelete","showAnchorRight","isSortable","confirmDialog","setAsSingleSortCriteria","addSortCriteria","isGroupable","isCurrentlyGroupedBy","setBy","isLast","previous","removeColumn","workPackageTimelineTableController","innerHeader","renderLabels","wpTimelineService","renderLabelsDays","renderLabelsWeeks","renderLabelsMonths","renderLabelsQuarters","renderLabelsYears","activeZoomLevel","renderTimeSlices","quarter_number","addLabelCell","top","setupRelationSubscription","workPackagesWithRelations","renderWorkPackagesRelations","removeRelationElementsForWorkPackage","renderElement","removeAllVisibleElements","renderElements","renderRelation","classNames","finishElement","gridContainer","paddingTop","checkForNonWorkingDayHighlight","qaSelector","getDate","getMonth","getFullYear","watcher","panelCtrl","isHidden","groupSumsBuilder","totalSums","getRelationTypeFromQuery","configureTable","openTableConfigurationModal","Ci","yn","Ut","Ii","shouldHideField","wpEditForm","editMode","Si","ui","buildPayloadFromChanges","toggleHierarchy","openMenu","sortColumn","headerColumn","currentSortDirection","setActiveColumnClass","sortable","directionClass","getDirectionClass","isHierarchyColumn","columnType","relationColumnType","columnName","hierarchyIcon","isHierarchyDisabled","setHierarchyIcon","hierarchyToggleEnabled","toggleState","Vi","ki","bootstrapAttributeGroups","bootstrapAttributeGroupsCalled","Yi","$t","mi","$n","kn","Hn","Cn","On","jump_to_pagination","text_jump_to_pagination","showToolbarSaveButton","shouldUpdateHtmlTitle","queryTitle","setupInformationLoadedListener","queryParamListener","updateTitle","showToolbar","toolbarDisabled","selectedTitle","titleEditingEnabled","additionalLoadingTime","openInviteUserModal","inviteModal","loadFirstPage","opStaticQueries","getStaticName","reloadOnSearch","menuItem","newRoute","mobileAlternative","allowMovingInEditMode","blockedTransition","wpViewFilters","incomplete$","updateViewRepresentation","previousSibling","block","tableInformationLoaded","showResizerInCardView","showTableView","openInFullView","handleWorkPackageCardClicked","button_more","observeWorkPackage","focusedWorkPackage","firstRoute","workPackageI","setRowState","whenChanged","showBackButton","backToList","backRouting","handleLoadingError","flash_message","eventHandlers","EVENT","currentUser$","reloadOnCenterUpdate","requireInvolvedRelations","requireHierarchyElements","requireSumsSchema","loadAdditional","getInvolvedWorkPackages","ancestorIds","pristineState","updatesState","lastUpdatedState","getDefaultState","allGroupsAreCollapsed","allGroupsAreExpanded","workPackageViewGroupByService","currentGroupedBy","getAllGroupsCollapsedState","currentGroups","setAllGroupsCollapseStateTo","isCurrentlyEqualTo","findById","setColumns","moveColumn","availableState","setDisplayRepresentation","incomplete","rawFilters","modify","availableSchemas","isComplete","cloneFilters","isFocused","focusAfterRender","wpViewHierarchies","renderedWorkPackageIds","wpRelationHierarchy","setState","initialState","shouldHighlightInline","filteredValue","setIncludeSubprojects","predecessorPosition","positions","assignPosition","order","getCachedPerPage","updateFromResults","initializeSelection","activeRowIndex","_emptyState","getSelectedWorkPackages","selectionCount","isManuallySorted","findAvailableDirection","manualSortObject","defaultState","appliedZoomLevel$","setVisible","defaultLabels","setZoomLevel","updateZoomWithDelta","applyZoomLevel","enableAutozoom","initializeTexts","projectsResourceService","displayNotificationsButton$","showStaticPagePath","attachmentsResourceService","observable","updateFocusAnchorLabel","focusAnchorLabel","setupQueryObservers","setupRefreshObserver","setupQueryLoadedListener","setupChangeObserver","filterRefreshEvents","queryLoaded","addWorkPackageFullscreenLink","successful_delete","performBulkDelete","dragHint","deleteTitle","deleteConfirmation","removeFile","attachment","fileIcon","principalsResourceService","timestampText","author$","viewInitialized$","setDragData","downloadPath","draggableHTML","dataTransfer","setData","setDragImage","isImage","src","imageFileExtensions","confirmRemoveAttachment","dangerHighlighting","attachmentsSelfLink","$attachments","uploadLabel","dropFiles","dropFilesHint","foldersWarning","maxFileSize","maximumAttachmentFileSize","triggerFileInput","filePicker","onDropFiles","dropEffect","uploadFiles","draggingOver","onDragOver","containsFiles","onDragLeave","onFilePickerChanged","filterFolders","allowUploading","destroyImmediately","setupResourceUpdateListener","showAttachments","helpTexts","requireById","help_texts","helpText","editText","open_dialog","helpTextId","handleClick","attributeHelpTexts","attributeScope","multiselect","labelForId","inputId","syncInputFieldName","inputName","setInitialSelection","isProjectField","setInitialProjectSelection","removeCurrentSyncedFields","createSyncedField","updateProjectSelection","currentProjectSelection","add_new_action","onAfterViewInit","openSelect","openDirectly","changeModel","opened","appendTo","closed","keyPressed","onKeydown","_openDirectly","focusInputField","updateAvailableOptions","columnsGroup","dragula","createGroup","drag","drop","autoscroll","margin","maxSpeed","scrollWhenOutside","autoScroll","down","drake","dragging","autofocus","clearModel","_selected","loadAvailable","loadData","defaultData","typeahead","items$","results$","autocompleteInputStream","fetchDataDirectly","focusDirectly","getOptionsItems","focusSelect","searched","blured","cleared","keydowned","keydown","added","removed","scrolled","scroll","scrolledToEnd","scrollToEnd","opAutocompleterService","searchKey","numberOfAncestors","isInlineContext","_value","valueChange","onTouched","hiddenInput","dispatchEvent","getAvailableProjects","apiFilters","mapResultsFn","writeValue","registerOnChange","registerOnTouched","recent","setMode","modeSwitch","canInviteUsersToProject$","onAddNewClick","opInviteUserModalService","autocompleter","inputFilters","userInvited","getAvailableUsers","canCreateNewActionElements","createNewVersion","available_projects","getVersionPayload","onCreate","definingProject","setColorOptions","updateInputField","getElementsByName","updateInput","highlightTextInline","onModelChange","colors","selectedOption","selectedColorId","selectedColor","highlightColor","toHsl","valueHash","toHsla","charCodeAt","declaredInputs","dateTimeValue","time","submit$","formatModelToSubmit","getRawValue","_httpClient","handleBackendFormValidationErrors","validateForm$","getFormattedErrors","setFormValidationErrors","formatModelToEdit","isValue","getFormattedResourcesModel","getAllFormValidationErrors","useForFields","editorType","noWrapLabel","selectDefaultValue","bindLabel","searchable","virtualScroll","clearOnBackspace","clearSearchOnAdd","hideSelected","expressionProperties","getConfig","getFieldsSchemasWithKey","getFormlyFieldConfig","getFormlyFormWithFieldGroups","getModel","formsService","fieldGroup","getDynamicFormFieldGroups","getAttributeKey","isFieldSchema","minLength","maxLength","getFieldTypeConfig","getFieldProperty","getFieldOptions","wrappers","allowedValuesHref","inputsCatalogue","isMultiSelectField","rtl","formatAllowedValues","prependCurrentValue","prependDefaultValue","getDefaultFieldGroupSettings","fieldGroupClassName","isFieldGroup","collapsibleFieldGroups","collapsibleFieldGroupsCollapsed","getGroupFields","collapsibleFieldGroupsCollapsedExpressionProperty","formControl","parentForm","submitted","registerForm","getSettingsFromBackend$","getSettings","formSchema","_dynamicFieldsService","_formsService","load_error_message","successful_update","successful_create","job_started","innerModel","dynamicFormService","patchValue","setDisabledState","enable","resourceId","formHttpMethod","dynamicFormGroup","fieldsSettingsPipe","initializeDynamicForm","modelChange","submitForm","handleSubmit","formEndpoint","noPathToSubmitToError","showNotifications","showSuccessNotification","errored","validateForm","handleCancel","dirty","history","back","getFormEndPoint","noSettingsSourceErrorMessage","setupDynamicFormFromSettings","setupDynamicFormFromBackend","setupDynamicForm","dynamicFieldsService","changeDetectorRef","cssClass","ckEditorContext","attachmentLabel","onTouch","editor","ckEditorInstance","isReadOnly","onContentChange","onCkeditorSetup","focusTracker","touched","onControlChange","onControlTouch","initializeDatepicker","onInputChange","inputIsValidDate","closeOnOutsideClick","click_to_edit","press_enter_to_save","query_has_changed_click_to_save","input_title","input_placeholder","confirm_edit_cancel","duplicate_query_title","inputField","inputTitle","initialFocus","firstChange","selectInputOnInitalFocus","onFocus","toggleToolbarButtonVisibility","onBlur","saveWhenFocusOutside","resetInputField","showSaveCondition","trim","onEmptyError","emitSave","onEmptySubmit","focusInputOnError","OPConstrainedEditor","OPClassicEditor","loadedLocale","openProject","createConfig","initialData","createWatchdog","toolbar","getData","OPEditorWatchdog","setCreator","createCustomized","setDestructor","helpURL","errorTitle","debounce","getTransformedContent","leading","_content","getRawData","manualMode","codeMirrorInstance","Notifications","initializeEditor","onInitializationFailed","watchdog","ckEditorSetup","opCkeditorReplacementContainer","setupWatchdog","debouncedEmitter","enableManualMode","disableManualMode","onInitialized","lineNumbers","smartIndent","enterpriseFeature","become_hero","you_contribute","upgrade","more_info_text","enterprise_edition","opReferrer","collapsible","toggleCollapse","button_contact_us","upgrade_link","contact_link","benefits_description","premium_features_text","professional_support_text","enterprise_info_html","feature_title","upgrade_info","button_contact","button_upgrade","getPristine","updatePristineResource","buildRequestPayload","_pristineResource","proxyGet","setNewDefaults","changeset","isWritable","humanName","valueExists","isOverridden","getLinkedValue","minimalPayload","renderEmpty","renderValues","percentLabel","principalRenderer","renderMultiple","setSpanAttributes","attributeName","getText","getAriaLabel","fieldCache","getFieldForCurrentContext","activeChange","getLabelContent","displayName","texts","getSpecificClassFor","createDateDisplayField","showSchedulingMode","shouldHighlight","canOverdue","highlightName","colorize","viewHighlighting","roundedProgress","optionDiv","valueAbridged","take","updateFromChangeset","parseValue","thereAreFormsWithUnsavedChanges","returnValue","i18nService","activeForms","addToActiveForms","removeFromActiveForms","unregisterListener","onBefore","editFormRouting","initializeEditMode","globalEditFormChangesTrackerService","waitForField","setActive","editContainer","onSavedEmitter","closeEditFields","hasActiveFields","registeredFields","skipField","activateOnForm","skippedFields","renderField","activateWhenNeeded","errorsPerAttribute","handleSubmissionErrors","handleErroneousAttributes","setErrorsForFields","loadFormAndCheck","errorMessageOnLabel","_onSubmitHandlers","registerOnSubmit","onBeforeSubmit","_onBeforeSubmitHandlers","registerOnBeforeSubmit","previewContext","editFieldHandler","schemaInput","changeInput","editField","fieldInjector","onEditFieldReady","fieldLabel","tagName","withErrors","isErrorenous","inEditMode","messages","createDomOutlet","attachComponentPortal","displayFieldOptions","isDropTarget","displayContainer","activateIfEditable","getSelection","anchorNode","changeMap","changesets","commit","newChangeset","unknownAttribute","fieldType","getClassFor","defaultFieldType","addSpecificFieldType","extendFieldType","_fields","getAutocompleterOfAttribute","onAddNew","onNewValueAdded","_autocompleterComponent","overflowingSelector","valuesLoadingPromise","_syncUrlParamsOnChangeIfNeeded","editFormComponent","requiredPlaceholder","initialValueLoading","valuesLoaded","loadValues","autocompleterComponent","selectAutocompleterRegister","sortValues","addEmptyOption","loadValuesFromBackend","loadAllowedValues","fetchAllowedValueQuery","allowedValuesFilter","addValue","getEmptyOption","isRequired","nullOption","showAddNewUserButton","requestFocus","openAutocompleteSelectField","buildSelectedOption","findValueOption","_selectedOption","adjustPosition","checkCurrentValueValidity","currentValueInvalid","output$","input$","lastRequestedValue","lastResult","requestHandler","errorHandler","requests","onValueSelected","getCurrentValue","rawValue","initialContent","colorClass","currentStatusCode","availableStatuses","referenceOutputs","recentWorkPackageIds","time_entries","sortValuesByRecentIds","setHours","getTime","datepickerInstance","currentMonth","currentYear","setDates","redraw","dateObj","precedingWorkPackages$","followingWorkPackages$","isParent","isChild","getMinimalDateFromPreceeding","minimalDateFromPrecedingRelationship","getInvolvedWorkPackageIds","dateModalRelations","isDayDisabled","isSchedulable","buttonClicked","hasRelations$","automatically_scheduled_parent","manually_scheduled","start_date_limited_by_relations","changing_dates_affects_follow_relations","click_on_show_relations_to_open_gantt","button_name","show_relations_button","openGantt","scheduling","onToggle","today","dateUpdates$","updateDatesFromForm","onDataChange","dateChangedManually$","debounceDelay","updateDate","changeSchedulingMode","changeNonWorkingDays","dateModalScheduling","datePickerInstance","enforceManualChangesToDatepicker","setToday","reposition","collision","showMonths","calendarContainer","modalContainer","onDayCreate","debouncedInput","startDateChanged$","endDateChanged$","startDateDebounced$","endDateDebounced$","datepickerChanged$","handleSingleDateUpdate","clearWithDuration","durationChanges$","applyDurationChange","formUpdates$","ignoreNonWorkingDaysWritable","setDurationDaysFromUpstream","dates","setCurrentActivatedField","initialActivatedField","focusHelper","durationField","durationAsIso8601","currentlyActivatedDateField","toggleCurrentActivatedField","isStateOfCurrentActivatedField","showTodayLink","showFieldAsActive","handleDurationFocusIn","durationFocused","handleDurationFocusOut","modalPositioned","ensureHoveredSelection","setDatesAndDeriveDuration","latestSelectedDateObj","replaceDatesWithNewSelection","moveActiveDate","deriveMissingDateFromDuration","durationActiveDateSelected","setDaysInOrder","applyNewDates","showDatePickerModal","onModalClosed","resetDates","Di","setUrl","loadFormAndSetUrl","validity","formattedValue","toLocaleString","useGrouping","maximumFractionDigits","unescape","UNESCAPED_EXPRESSION","ESCAPED_EXPRESSION","translatedValue","wpId","charAt","toUpperCase","derivedPropertyName","derivedValue","renderActual","renderDerived","derivedValueString","derivedText","Li","logTime","appendTimelogLink","timeEntryCreateService","showTimelogWidget","showWorkPackageField","addHighlight","xn","renderAbridgedValues","pn","uiStateBuilder","innerText","zn","Wi","Ai","ln","En","clazz","renameWidget","setChangesetOptions","resourceChanged","hostVars","setupListener","wrapElement","appendIframe","modalBody","modalClassName","openingEvent","defaultPrevented","activeModalData$","notFullscreen","activeModalInstance$","defaultTo","passedData","showClose","divideContent","confirmAndClose","augmentedConfirmDialog","augmentFormSubmit","removeAttribute","selected_type","button_style","button_style_hint","selectedType","buttonStyle","availableTypes","applyAndClose","typeSelect","hint","selectedPage","selectedPageInput","loadLanguageAsMode","language_hint","languageClass","fromTextArea","codeMirrorPane","_language","debouncedLanguageLoader","updateCodeMirrorMode","setOption","updateLanguage","include_parent","selectedIncludeParent","includeParent","updateIncludeParent","configureWorkPackageButton","configureWikiPageInclude","editCodeBlock","configureChildPages","exportPreparing","requestExport","exportOptions","buildExportOptions","representations","addColumnsToHref","triggerByLink","replaceWithJobModal","job_id","removeSearch","addSearch","label_confirm_children_deletion","bulk_text","single_text","childCount","hasChildren","deletesChildren","workPackageLabel","singleWorkPackage","singleWorkPackageChildren","childUnits","mustConfirmChildren","childrenDeletionConfirmed","confirmDeletion","busy","blockedDueToUnconfirmedChildren","workPackageService","baseUrl","menuItems","portalHostElement","onStart","isOpening","activeMenu","linkForAction","copyLink","bulkCopyLink","isPermitted","permittedActionKeys","permittedActionsWithLinks","getPermittedPluginActions","WorkPackageContextMenuHelper","selectedWorkPackages","allowSplitScreenActions","additionalPositionArgs","deleteSelectedWorkPackages","editSelectedWorkPackages","copySelectedWorkPackages","logTimeForSelectedWorkPackage","permittedActions","random","openOnClick","isOutsideClick","relatedTarget","inputElement","dateInput","datepickerElemIdentifier","reshowTimeout","clearTimeout","visibleAndActive","weekdaysPromise","datepickerTarget","hideDuringScroll","setDate","isInViewport","datepickerCont","activeElement","bottom","innerHeight","clientHeight","clientWidth","weekNumbers","getWeek","datepickerFormat","defaultDate","shorthand","longhand","weekAbbreviation","rangeSeparator","initialDates","initialValue","resolveDateArrayToString","allowInput","resolveDateStringToArray","onKeyDown","canceled","onBlurred","blurred","assignee","created_at","updated_at","gantt","latest_activity","created_by_me","assigned_to_me","recently_created","all_open","summary","staticQueries","buildQueries","uiParams","uiSref","projectDependentQueries","CurrentUser","userDependentQueries","getStaticQueriesForView","renderAvatar","renderName","getInitials","borderColor","renderUserAvatar","userAvatarUrl","Image","alt","onload","principalURL","hideName","hideAvatar","does_not_match_search","include_all_selected","current_project","updateList","isChecked","changeSelected","getTooltipAlignment","extendedProjectUrl","pipes","searchableProjectListService","toggle_title","filter_all","filter_selected","search_placeholder","clear_selection","include_subprojects","projectsInFilter$","allProjects$","displayMode$","includeSubprojects$","searchText$","selectedProjects$","fetchingProjects$","projects$","resetActiveResult","_displayMode","_includeSubprojects","_selectedProjects","query$","toggleIncludeSubprojects","toggleOpen","loadAllProjects","searchText","selectedProjects","clearSelection","startResize","oldX","startX","pageX","touches","oldY","startY","clientY","pageY","newX","newY","resizing","setResizeCursor","bindEventListener","buildDelta","onMouseUp","setAutoCursor","onMouseMove","mouseMoveHandler","mouseUpHandler","cursorClass","absolute","relative","resizingElement","elementClass","parseLocalStorageValue","resizeStyle","toggleService","changeData$","applyColumnLayout","resizer","resizerClass","resizeStart","resizeEnd","resizeEvent","manageErrorClass","resizeMove","_searchText","selectedItemID$","selectPreviousResult","selectNextResult","activateSelectedResult","currentTarget","nextPage","previousPage","localStoragePerPage","getPaginationOptions","paginationOptions","getPerPageOptions","setPerPageOptions","maxVisiblePageOptions","optionsTruncationSize","pane","scrollPane","updateScrollableArea","determineScrollButtonVisibility","currentTabId","scrollIntoVisibleArea","clickTab","tabSelected","startDebouncedTabActivation","dragTargetStack","debouncedTabActivationTimeout","clearDebouncedTabActivation","cancelDebouncedTabActivation","onScroll","hideLeftButton","hideRightButton","scrollRight","tabTitle","outerWidth","deleteAllowed","setModifiedEntry","createdEntry","reloadWorkPackageAndClose","createNewTimeEntry","entry","spentOn","modifiedEntry","areYouSure","destroyedEntry","createChangeset","wpRequired","workPackageSelected","setCustomFields","signalModifiedEntry","entries","showUserField","saveEntry","formInFlight","stack","removeOnAdd","createToast","createAttachmentUploadToast","addLoading","createLoadingToast","showUserPath","condition","getFocusableElement","FOCUSABLE_SELECTORS","thead","siblings","ngAfterViewChecked","toLocaleLowerCase","cleanUpOldHighlighting","childNodes","nodeType","TEXT_NODE","getMetadata","filterMap","pickBy","toFilterObject","URLSearchParams","point","pointCB","onMove","onUp","setScroll","cleanAnimation","cancelAnimationFrame","animationFrame","windowAnimationFrame","scrolling","getTarget","getElementsUnderPoint","inside","dispatched","outerScrollContainer","scrollTick","setOuterScrollContainer","scrollAutomatically","scrollY","scrollX","scrollTo","pageXOffset","pageYOffset","insertBefore","escapeListener","containers","member","setupAutoscroll","initializeDrake","addScrollContainer","getMember","invalid","revertOnSpill","removeOnSpill","mirrorContainer","ignoreInputTextSelection","debouncer","emitter","setSelectionRange","rangeParent","createRange","setStart","rangeOffset","startOffset","caretRangeFromPoint","onStateChange","input","checkedChange","indeterminate","onEscape","alignment","_open","closeEventListener","appHeightListener","onBodyClick","showErrorMessage","internalID","errorsID","descriptionID","ngControl","control","showValidationErrorOn","_formGroupDirective","formGroupDirective","onParentClick","valueChanged","onInputFocus","inputFocus","onInputBlur","inputBlur","ngContentSelectors","TopLeft","production","w","S","gridEndRow","gridEndColumn","storedGuid","newGuid","widget","moveRight","moveLeft","growColumn","overlaps","rowOverlaps","columnOverlaps","startColumnOverlaps","writeAreaChangeToWidget","copyDimensionsTo","ne","isRow","isColumn","mousedOverArea","numRows","rowCount","numColumns","buildAreas","setMousedOverArea","$mousedOverArea","cleanupUnusedAreas","range","widgetAreas","removeRow","gridAreas","buildGridAreas","gridGaps","buildGridGaps","gridAreaIds","buildGridAreaIds","buildGridWidgetAreas","rebuildAndPersist","persist","writeAreaChangesToWidgets","saveGrid","saveWidgetChangeset","isGap","widgetResources","inHelpMode","helpMode","isSingleCell","toggleHelpMode","scrollPlaceholderIntoView","scrollIntoViewIfNeeded","assignAreasWidget","buildGridAreasRow","buildGridGapRow","rowWidgets","ge","Ie","moveSubsequentRowWidgets","addRow","columnWidgets","moveSubsequentColumnWidgets","resetAreas","gridResource","removeWidget","renamed","onRenamed","layout","area","removeItem","menuItemList","getOrderedDaysData","localeData","Qe","Xe","weekDay","originalIndex","getOriginalIndex","getCheckedValuesInOriginalOrder","validDays","St","displayedDays","daysOriginalCheckedValues","timeEntriesCurrentUserConfigurationModalService","configureItem","onConfigured","Zt","vi","fr","vr","sa","Pr","hiddenDays","contentHeight","slotEventOverlap","slotLabelInterval","labelIntervalHours","slotLabelFormat","xi","maxHour","scaleRatio","allDaySlot","displayEventTime","slotMinTime","minHour","slotMaxTime","eventOverlap","alterEventEntry","eventWillUnmount","beforeEventRemove","dispatchEventClick","moveEvent","setHiddenDays","fetchTimeEntries","buildEntries","memoizedTimeEntries","dmFilters","memoizedCreateAllowed","createTimeEntry","setRatio","buildTimeEntryEntries","buildAuxEntries","calculateDateSums","smallerSuitableRatio","timeEntry","sumEntry","addEntry","entryName","startEditable","backgroundColor","rendering","formatNumber","editEvent","timeEntryEdit","updateEventSet","addEventToday","timeEntryCreate","appendAddIcon","appendSum","addTooltip","prependDuration","appendFadeout","tooltip","tooltipContentString","track","removeTooltip","workPackageName","sanitizedValue","sanitizer","sanitize","updateEntries","cdr","updateConfiguration","Hook","documentsUrl","entriesLoaded","documentPath","documentCreated","documentDescription","documents","project_id","addedBy","newsAuthorName","age","newsCreated","authorLink","newsAuthorPath","news","newsDmParams","setupNews","newsProjectPath","newsProjectName","myPageForm","tabInner","chartType","persistAndReload","persistChanges","reloadQueries","loadQueries","ensureQueryAndLoad","createInitial","props","formFor","_configuration","_formsPromise","loadForms","_forms","chartOptions","si","graphConfiguration","Qi","configurationComponent","outputs","datasets","setChartOptions","updateChartData","setHeight","chartLabels","chartData","responsive","maintainAspectRatio","legend","datalabels","align","setChartAxesValues","scales","internalChartOptions","chartHeight","stacked","ticks","yAxes","xAxes","initializeConfiguration","loadQueriesInitially","updateGraph","repaint","ensureFormAndSaveQuery","queryCreationParams","onResourceChanged","initializeQuerySpace","wpGraphConfiguration","Ji","group_by","chart_type","currentChartType","initializeAvailableGroups","initializeAvailableChartType","availableChartTypes","project$","availableGroupBy","additionalFilter","setQueryProps","graphParams","graphConfigurationService","sortedDatasets","displayModeSingle","propsBoth","propsOpen","propsClosed","baseProps","subprojectId","displaySingle","embeddedGraphSingle","embeddedGraphMulti","initializeChangeset","valueChanged$","reinitialize","rawText","textValue","setupVariables","currentRawText","clickedElementIsLinkWithinDisplayContainer","textEmpty","memorizeRawText","memorizeCustomText","customText","sanitization","htmlText","loadAndRender","loadProjectSchema","loadSchema","activityName","editTimeEntry","timeEntryEditService","deleteIfConfirmed","closeByEscape","closeByDocument","rows","projectListParams","viewAll","memberships","listMembersParams","partitionEntriesByRole","sortUsersByName","totalMembers","listAvailableProjectsParams","membersAddable","entriesByRoles","moreMembersText","Mn","In","Mr","properties","Dr","loadChildren","OpenProjectMyAccountModule","OpenProjectInAppNotificationsModule","OpenprojectProjectsModule","abstract","inherit","squash","OpenprojectApiDocsModule","OpenprojectBoardsModule","OpenprojectIFCModelsModule","OpenprojectBacklogsModule","OpenprojectReportingModule","OpenProjectJobStatusModule","TeamPlannerModule","OpenprojectCalendarModule","router","stateService","onEnter","onExit","start_onboarding_tour","MiniProfiler","pageTransition","$$state","xm","xr","useHash","strictMode","encode","decode","equals","pattern","cc","full_view","setWorkPackageScopeProperties","displayWatchButton","ls","lc","Rr","wpDisplayRepresentationService","Gi","ds","fi","card","Bi","detectView","ps","da","transitionListener","transitions","activeState","listState","openDetailsView","openListView","us","zoomIn","zoomOut","zoomAuto","isMaxLevel","maxZoomLevel","isMinLevel","minZoomLevel","toggleTimeline","enableAutoZoom","getAutoZoomToggleClass","hs","wpViewCollapsedGroups","_s","ms","Pc","aa","stateName$","Ac","xc","An","Dc","jn","fo","kc","Uc","vo","$c","wc","rc","sc","Tc","bc","yo","_searchTerm","_currentTab","_projectScope","_resultsHidden","loadGonData","available_search_types","search_term","current_tab","project_scope","global_search","submitSearch","searchPath","projectScope","searchQueryParams","isAfterSearch","nn","Co","Vc","upsale_text","Hc","eligibleWidgets","chosenWidget","trackWidgetBy","widgetsService","registered","gs","moveOneDown","firstAreaToMove","gn","setupMousedOverAreaSubscription","mousedOverAreaObserver","currentlyDragging","placeholderArea","updateArea","draggedArea","moveAreasOnDragging","copyPositionButRestrict","isDropOnlyArea","isDragged","isPassive","draggedHeight","offsetHeight","unchangedSize","fn","resizedArea","targetIds","moving","isTarget","isResized","currentlyResizing","isAllowed","Rn","isAddable","resize","addLine","setMaxWidth","Fn","i18nNamespace","html_title","renderer","gridInitialization","gridScopePath","setHtmlTitle","no","Zr","uiWidgets","handleKeyboardEvent","widgetComponent","widgetComponentInput","widgetComponentOutput","gridStyle","GRID_GAP_DIMENSION","GRID_AREA_HEIGHT","identifyGridArea","bypassSecurityTrustStyle","oo","areas","wo","pl","To","created_by","workPackageLink","fs","modalElement","closeAfterTimeout","mouseInModal","isMouseOverPreview","ko","Po","vl","xo","Eo","Tl","Oo","Pl","quickSearch","projectSearch","help","moreMenu","showHelpModal","globalAction","projectScoped","accessKey","focusPrevItem","focusNextItem","shortcuts","clickLink","bubbles","cancelable","focusItemOffset","Mo","Io","loadRequiredScripts","sn","so","Do","spawnModal","Pi","So","getClassListForItem","jo","lackingPermission","lackingPermissionInfo","noInviteRights","nextButton","jl","projectAndTypeForm","typeControl","projectControl","setPlaceholderOption","projectInviteCapabilities","typeOptions","eeHref","markAsDirty","projectFilterFn","disabledReason","vs","va","noRolesFound","br","Ht","io","roles$","ys","Jl","ro","viewToModelUpdate","loadPrincipalData","$l","emailRegExp","alreadyAMember","inviteNewUser","createNewPlaceholder","PlaceholderUser","canInviteByEmail$","canCreateNewPlaceholder$","showAddTag","createNewFromInput","createNew","Yl","nonMembers","Ur","Cs","Email","inviteUser","backButton","userDynamicFields","principalForm","principalControl","roleControl","messageControl","dynamicFieldsControl","isNewPrincipal","hasPrincipalSelected","Ro","roleData","messageData","userDynamicFieldConfig","onValidatedSubmit","isMemberOfCurrentProject","bs","fa","projectLabel","principalLabel","roleLabel","messageLabel","invite","createPrincipal","ld","placeholder_users","ws","Ts","Fo","Sl","Ol","Il","ma","Ml","Qr","labelText","groupLabelText","addUserMenuItem","addLoginMenuItem","goToSettings","ao","Zo","ba","onActivate","navigationEvents$","recreateToggler","wrapMainItem","not","wrap","wrapInner","contents","before","Zn","bo","showEEOnlyHint","Wn","editedName","saveEdition","leaveEditingMode","onValueChange","Wo","custom_field","rename","removeFromGroup","ks","setupDropdownClick","closeOnBodyClick","accessibility","skipContentClickListener","activeDropdown$","active$","stopHover","closeAllItems","menuIsOpen","toggleClick","openDropdown","opening","startHover","hover","menuContainer","openDropdowns","closeDropdown","dropdowns","closeOtherItems","slideAndFocus","slideUp","slideDown","focusFirstInputOrLink","getDropdownContainer","vd","menu","ka","yd","co","xa","drag_to_activate","label_group","new_group","label_inactive","add_group","add_table","no_filter_query","noFilterQuery","updateHiddenFields","groupsDrake","attributeDrake","activeGroups","inactives","inactiveAttributes","Ta","Pa","deactivateAttribute","updateInactives","addGroupAndOpenQuery","editQuery","typeBanner","timelines","externalRelationQuery","deleteGroup","resetToDefault","translation","emptyGroup","Lo","edit_query","xs","Uo","wr","Tr","Es","Os","inlineCreateEnabled","withFilters","showFilterButton","filterButtonText","globalSearchService","searchTerm$","projectScope$","wpFilters","resultsHidden$","resultsHidden","Bo","onKey","currentKey","fieldValue","currentFieldValue","selectedOperator","operators","visibleValue","toggleValueVisibility","valueVisible","updateDbValue","updateField","Ms","Banner","toggleCollapsed","vn","uiOptions","board","create_new_board","mainMenuService","focusBackArrow","showNewBoardModal","Zd","Is","Ds","progressBar","progressPercentage","file","updateProgress","completed","Ss","removable","canBeHidden","ip","executeTarget","onUploadSuccess","uploadCount","done","As","js","textareaSelector","formElement","wrappedTextArea","removeAttr","$attachmentsElement","markEdited","pageWasEdited","setup","setupAttachmentAddedCallback","setupAttachmentRemovalSignal","addUploadedAttachmentsToForm","setLabel","Tp","downloadLocation","fire","toArray","Rs","Da","$targetNotification","getTargetNotification","Fs","displayed","removeHiddenOnSubmit","section","Ln","sectionName","hideSection","hideSectionService","Zs","optValue","hideSecWithName","prev","HideSection","Ws","option","Ls","Us","clickTarget","clipboardTarget","addNotification","queryCommandSupported","execCommand","Bs","autocompleteWorkPackages","all_projects","current_project_and_all_descendants","search_dots","close_search","toggleTopMenuClass","unregister","btn","toggleMobileSearch","submitNonEmptySearch","redirectToWp","wpPath","Aa","openCloseMenu","term","selectedItem","clearSearch","onEnterBeforeResultsLoaded","followSelectedItem","searchInScope","currentScope","statusHighlighting","followItem","customSearchFn","markable","queryWithoutHash","fetchSearchResults","searchResultsToOptions","setMarkedOption","substr","detailedSearchOptions","itemsList","markItem","selectedItems","replaceState","unregisterGlobalListener","qaSearchOpen","Qs","$r","sectionTitle","sectionBody","Ns","No","su","singular","plural","Ra","scrollToCurrent","toggleDropModal","dropModalOpen","currentProjectName","allProjectsPath","newProjectPath","Js","Vr","htmlMode","Hr","updater","Accept","remoteFieldKey","HTMLInputElement","Ys","scope_default","scope_starred","scope_global","scope_private","search$","apiViewType","initializeAutocomplete","views$","viewCategories$","rn","matchesText","updateMenuOnChanges","initializeViews","private","viewsService","toOpSideMenuItem","project_and_subprojects","search_for","in","projectText","searchTitle","Jo","currentTabSub","currentTab$","tabsSub","tabs$","$s","Yr","Lu","Un","loadEntry","deleteTimeEntry","qi","not_found","Qo","cache$","Vu","lo","getDisplayFieldInstance","displayClass","displayFieldContext","containerType","Yo","invalid_attribute","resourceLoader","markError","Hs","attrs","loadResourceAttribute","zs","rh","detailed","kr","Gs","triggerBackup","backups","po","note","lastBackup","lastBackupFrom","includeAttachments","downloadBackup","requestBackup","attachmentsDisabled","jobStatusId","lastBackupDate","lastBackupAttachmentId","mayIncludeAttachments","backupTokenInput","isDownloadReady","getDownloadUrl","includeAttachmentsDefault","includeAttachmentsTitle","opBackup","mh","$o","button_book","link_quote","email_not_received","confidence","try_another_email","vh","qs","Th","userCount","startsAt","expiresAt","isExpired","reprieveDaysLeft","Xs","newFeatures","descriptionNewFeatures","learnAbout","isStandardEdition","translated","list_styling_class","bcf_api_link","er","titleData$","topMenu","Vo","tr","externalQuery","ir","Nh","Ja","activeWindow","polling$","unreadCount$","nr","Kh","Gh","qr","or","notificationsByProject","notificationsByReason","projectsFilter","Xi","projectsFilter$","uo","projectsForNotifications$","projectHasParent","ianResourceService","$a","zr","Kr","Gr","Va","ho","isEnterprise","eeGuardedDateAlertRoute","ianMenuService","notificationsByProject$","notificationsByReason$","baseMenuItems","sr","rr","create_new_calendar","ar","portalOutlet","attachedRef","Xr","overlay","cr","a_","Ea","Sa","Fr","Ba","Ua","Lr","Za","La","Ho","u_","field_description","confirm_button","password","passwordValuePresent","passwordConfirmationField","password_confirmation","zo","externalQueryConfiguration","Na","externalRelationQueryConfiguration","wa","Nr","Vs","c_","d_","htmlSanitizeService","ckEditorPreview","l_","Ha","idFromLink","modals","passwordConfirmation","dynamicContent","p_","HalResource","DisplayField","ea","DomAutoscrollService","_knownHookNames","services","runInZone","zone","run","za","Ko","listen","buildRefreshRequest","element_id","fixed_date","_o","Go","g_","Ka","m_","f_","qo","loadIfNecessary","showCosts","renderCostAsLink","renderCostAsText","costType","spentUnits","addSeparator","parseFloat","Ga","v_","workPackageSingleContextMenu","workPackageTableContextMenu","atob","Uint8Array","Blob","FileReader","getContext","drawImage","toDataURL","C_","b_","readAsDataURL","Xo","label_choose_avatar","upload_instructions","error_too_large","wrong_file_format","button_update","uploading","avatarFilePicker","w_","avatarFile","avatarPreviewUrl","fileInvalid","uploadAvatar","progress","lr","es","O_","E_","ts","sanitizeBranchString","formattingInput","sanitizeShellInput","branchName","commitMessage","gitCommand","S_","copyButtonHelpText","copyResult","success","textToCopy","gitActions","onCopyButtonClick","D_","lastCopyResult","copiedSnippetId","showCopyResult","A_","pr","createPrButtonLabel","createPrButtonDescription","gitMenuLabel","gitMenuDescription","ur","label_created_by","label_last_updated_on","label_details","label_actions","pullRequest","draft","merged","checkRunStateText","outputTitle","conclusion","checkRunState","checkRunStateIcon","hr","github_pull_requests","pullRequests","changeDetector","getEmptyText","wp_id","_r","mr","J_","sortList","ns","I_","github","os","ss","ta","z_","isNonWorkingDay$","requireNonWorkingYear$","Ia","mo","rs","H_","Ca","K_","ngDoBootstrap","_injector","as","q_","ud","V_","hd","Ed","kl","$_","G_","contextHooks","hookPromises","oa","loadSentry","dsn","tracingFactor","Sentry","debug","na","release","environment","integrations","Integrations","BrowserTracing","tracesSampler","transactionContext","op","ignoreErrors","beforeSend","gr","filterEvent","sentryLoaded","client","configureScope","setupContext","withScope","tm","setTag","hostname","setExtra","originalException","filterHttpError","im","loadAppsignal","sendError","pushKey","Appsignal","namespace","use","networkPlugin","url_path","url_query","setTags","handleOfflineMessage","am","qa","ec","slideToggle","Xa","dm","fm","nc","oc","ajaxComplete","ajaxSend","setRequestHeader","ajaxStop","tc","ic","bm","Tm","pageIsSubmitted","marginBottom","serialize","rm","cm","lm","sessionStorage","an","Bn","Cm","pm","settingName","newLang","textArea","ym","keyup","hm","_m","ia","nm","om","enableReactiveStatesLogging","disableReactiveStatesLogging","firstdayofweek","firstweekofyear","dow","doy","pluralization","em","km","bootstrapModule"],"sources":["./$_lazy_route_resources|lazy|groupOptions:%20%7B%7D|namespace%20object","./src/vendor/i18n.js","./src/app/core/active-window/active-window.service.ts","./src/app/core/apiv3/endpoints/grids/apiv3-grid-paths.ts","./src/app/core/apiv3/endpoints/grids/apiv3-grids-paths.ts","./src/app/core/apiv3/cache/cachable-apiv3-resource.ts","./src/app/core/apiv3/endpoints/time-entries/apiv3-time-entry-paths.ts","./src/app/core/apiv3/cache/cachable-apiv3-collection.ts","./src/app/core/apiv3/endpoints/time-entries/time-entry-cache.service.ts","./src/app/core/apiv3/endpoints/time-entries/apiv3-time-entries-paths.ts","./src/app/core/apiv3/endpoints/capabilities/apiv3-capability-paths.ts","./src/app/core/apiv3/endpoints/capabilities/apiv3-capabilities-paths.ts","./src/app/core/apiv3/endpoints/projects/apiv3-available-projects-paths.ts","./src/app/core/apiv3/endpoints/memberships/apiv3-memberships-form.ts","./src/app/core/apiv3/endpoints/memberships/apiv3-memberships-paths.ts","./src/app/core/apiv3/endpoints/users/apiv3-user-preferences-paths.ts","./src/app/core/apiv3/endpoints/users/apiv3-user-paths.ts","./src/app/core/apiv3/endpoints/users/apiv3-users-paths.ts","./src/app/core/apiv3/endpoints/types/apiv3-type-paths.ts","./src/app/core/apiv3/endpoints/types/apiv3-types-paths.ts","./src/app/core/apiv3/endpoints/queries/apiv3-query-order.ts","./src/app/core/apiv3/endpoints/queries/apiv3-query-form.ts","./src/app/core/apiv3/endpoints/queries/apiv3-query-paths.ts","./src/app/core/apiv3/endpoints/queries/apiv3-queries-paths.ts","./src/app/core/apiv3/endpoints/relations/apiv3-relations-paths.ts","./src/app/core/apiv3/endpoints/work_packages/apiv3-work-package-form.ts","./src/app/core/apiv3/endpoints/work_packages/api-v3-work-package-paths.ts","./src/app/core/apiv3/endpoints/work_packages/work-package.cache.ts","./src/app/core/apiv3/endpoints/work_packages/api-v3-work-package-cached-subresource.ts","./src/app/core/apiv3/endpoints/work_packages/api-v3-work-packages-paths.ts","./src/app/core/apiv3/endpoints/versions/apiv3-version-paths.ts","./src/app/core/apiv3/endpoints/versions/apiv3-versions-paths.ts","./src/app/core/apiv3/endpoints/projects/apiv3-project-copy-paths.ts","./src/app/core/apiv3/endpoints/projects/apiv3-project-paths.ts","./src/app/core/apiv3/endpoints/projects/project.cache.ts","./src/app/core/apiv3/endpoints/projects/apiv3-projects-paths.ts","./src/app/core/apiv3/endpoints/statuses/apiv3-status-paths.ts","./src/app/core/apiv3/endpoints/statuses/apiv3-statuses-paths.ts","./src/app/core/apiv3/endpoints/roles/apiv3-role-paths.ts","./src/app/core/apiv3/endpoints/roles/apiv3-roles-paths.ts","./src/app/core/apiv3/endpoints/news/apiv3-news-paths.ts","./src/app/core/apiv3/endpoints/help_texts/apiv3-help-texts-paths.ts","./src/app/core/apiv3/endpoints/configuration/apiv3-configuration-path.ts","./src/app/features/boards/board/board.ts","./src/app/core/apiv3/virtual/apiv3-board-path.ts","./src/app/core/apiv3/virtual/apiv3-boards-paths.ts","./src/app/core/apiv3/endpoints/placeholder-users/apiv3-placeholder-user-paths.ts","./src/app/core/apiv3/endpoints/placeholder-users/apiv3-placeholder-users-paths.ts","./src/app/core/apiv3/endpoints/groups/apiv3-group-paths.ts","./src/app/core/apiv3/endpoints/groups/apiv3-groups-paths.ts","./src/app/core/apiv3/endpoints/notifications/apiv3-notification-paths.ts","./src/app/core/apiv3/endpoints/notifications/apiv3-notifications-paths.ts","./src/app/core/apiv3/endpoints/views/apiv3-views-paths.ts","./src/app/core/apiv3/endpoints/backups/apiv3-backups-path.ts","./src/app/core/apiv3/endpoints/days/api-v3-day-paths.ts","./src/app/core/apiv3/endpoints/days/api-v3-days-paths.ts","./src/app/core/apiv3/endpoints/storages/apiv3-storages-paths.ts","./src/app/core/apiv3/api-v3.service.ts","./src/app/core/apiv3/cache/state-cache.service.ts","./src/app/core/apiv3/endpoints/grids/apiv3-grid-form.ts","./src/app/core/apiv3/forms/apiv3-form-resource.ts","./src/app/core/apiv3/helpers/add-filters-to-path.ts","./src/app/core/apiv3/helpers/get-paginated-results.ts","./src/app/core/apiv3/paths/apiv3-list-resource.interface.ts","./src/app/core/apiv3/paths/apiv3-resource.ts","./src/app/core/apiv3/paths/path-resources.ts","./src/app/core/browser/browser-detector.service.ts","./src/app/core/browser/device.service.ts","./src/app/core/config/configuration.service.ts","./src/app/core/current-project/current-project.service.ts","./src/app/core/current-user/current-user.module.ts","./src/app/core/current-user/current-user.query.ts","./src/app/core/current-user/current-user.service.ts","./src/app/core/current-user/current-user.store.ts","./src/app/core/datetime/timezone.service.ts","./src/app/core/days/weekday.service.ts","./src/app/core/enterprise/banners.service.ts","./src/app/core/file-upload/op-direct-file-upload.service.ts","./src/app/core/file-upload/op-file-upload.service.ts","./src/app/core/gon/gon.service.ts","./src/app/core/html/op-title.service.ts","./src/app/core/i18n/i18n.service.ts","./src/app/core/loading-indicator/loading-indicator.service.ts","./src/app/core/main-menu/main-menu-toggle.service.ts","./src/app/core/model-auth/model-auth.service.ts","./src/app/core/path-helper/apiv3-paths.ts","./src/app/core/path-helper/path-helper.service.ts","./src/app/core/routing/first-route-service.ts","./src/app/core/schemas/schema-cache.service.ts","./src/app/core/setup/globals/constants.const.ts","./src/app/core/setup/globals/dynamic-bootstrapper.ts","./src/app/core/setup/globals/onboarding/helpers.ts","./src/app/core/setup/globals/tree-menu.ts","./src/app/core/setup/globals/global-helpers.ts","./src/app/core/setup/globals/openproject.ts","./src/app/core/setup/init-vendors.ts","./src/app/core/state/actions/actions.service.ts","./src/app/core/state/attachments/attachments.store.ts","./src/app/core/state/attachments/attachments.service.ts","./src/app/core/state/capabilities/capabilities.store.ts","./src/app/core/state/capabilities/capabilities.service.ts","./src/app/core/state/collection-store.ts","./src/app/core/state/days/weekday.store.ts","./src/app/core/state/days/weekday.service.ts","./src/app/core/state/effects/effect-handler.decorator.ts","./src/app/core/state/file-links/file-links.store.ts","./src/app/core/state/file-links/file-links.service.ts","./src/app/core/state/in-app-notifications/in-app-notification.model.ts","./src/app/core/state/in-app-notifications/in-app-notifications.actions.ts","./src/app/core/state/in-app-notifications/in-app-notifications.store.ts","./src/app/core/state/in-app-notifications/in-app-notifications.service.ts","./src/app/core/state/is-defined-entity.ts","./src/app/core/state/principals/principals.store.ts","./src/app/core/state/principals/principals.service.ts","./src/app/core/state/projects/projects.store.ts","./src/app/core/state/projects/projects.service.ts","./src/app/core/state/resource-collection.service.ts","./src/app/core/state/storage-files/storage-files.store.ts","./src/app/core/state/storage-files/storage-files.service.ts","./src/app/core/state/storages/storages.store.ts","./src/app/core/state/storages/storages.service.ts","./src/app/core/state/views/views.store.ts","./src/app/core/state/views/views.service.ts","./src/app/core/states/states.service.ts","./src/app/features/backlogs/backlogs-page/backlogs-page.component.ts","./src/app/features/bim/bcf/api/bcf-path-resources.ts","./src/app/features/bim/bcf/api/bcf-api-request.service.ts","./src/app/features/bim/bcf/api/projects/bcf-project.resource.ts","./src/app/features/bim/bcf/api/topics/bcf-topic.resource.ts","./src/app/features/bim/bcf/api/viewpoints/bcf-viewpoint-selection.paths.ts","./src/app/features/bim/bcf/api/viewpoints/bcf-viewpoint-visibility.paths.ts","./src/app/features/bim/bcf/api/viewpoints/bcf-viewpoint.paths.ts","./src/app/features/bim/bcf/api/viewpoints/bcf-viewpoint-collection.paths.ts","./src/app/features/bim/bcf/api/topics/bcf-topic.paths.ts","./src/app/features/bim/bcf/api/topics/bcf-viewpoint-collection.paths.ts","./src/app/features/bim/bcf/api/extensions/bcf-extension.resource.ts","./src/app/features/bim/bcf/api/extensions/bcf-extension.paths.ts","./src/app/features/bim/bcf/api/projects/bcf-project.paths.ts","./src/app/features/bim/bcf/api/bcf-api.service.ts","./src/app/features/bim/bcf/bcf-viewer-bridge/viewer-bridge.service.ts","./src/app/features/bim/bcf/helper/bcf-path-helper.service.ts","./src/app/features/bim/bcf/helper/viewpoints.service.ts","./src/app/features/bim/bcf/fields/display/bcf-thumbnail-field.module.ts","./src/app/features/bim/bcf/helper/bcf-detector.service.ts","./src/app/features/bim/bcf/api/bcf-authorization.service.ts","./src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.html","./src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.ts","./src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-new-wp-attribute-group.component.ts","./src/app/features/bim/revit_add_in/revit-bridge.service.ts","./src/app/features/bim/bcf/openproject-bcf.module.ts","./src/app/features/bim/ifc_models/xeokit/xeokit-server.ts","./src/app/features/bim/ifc_models/ifc-viewer/ifc-viewer.service.ts","./src/app/features/bim/ifc_models/pages/viewer/bcf-view.service.ts","./src/app/features/boards/board/board-actions/board-actions-registry.service.ts","./src/app/features/boards/board/board-list/board-lists.service.ts","./src/app/features/boards/board/board.service.ts","./src/app/features/boards/board/caused-updates/caused-updates.service.ts","./src/app/features/boards/tile-view/tile-view.component.html","./src/app/features/boards/tile-view/tile-view.component.ts","./src/app/features/boards/new-board-modal/new-board-modal.html","./src/app/features/boards/new-board-modal/new-board-modal.component.ts","./src/app/features/calendar/op-calendar.service.ts","./src/app/features/calendar/op-work-packages-calendar.service.ts","./src/app/features/work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component.html","./src/app/features/calendar/wp-calendar-page/wp-calendar-page.component.ts","./src/app/features/calendar/calendar.routes.ts","./src/app/features/calendar/openproject-calendar.module.ts","./src/app/features/calendar/wp-calendar/wp-calendar.template.html","./src/app/features/calendar/wp-calendar/wp-calendar.component.ts","./src/app/features/enterprise/enterprise-active-trial/ee-active-trial.base.ts","./src/app/shared/helpers/i18n/localized-link.ts","./src/app/features/enterprise/enterprise-modal/enterprise-trial-form/ee-trial-form.component.html","./src/app/features/enterprise/enterprise-modal/enterprise-trial-form/ee-trial-form.component.ts","./src/app/features/enterprise/enterprise-modal/enterprise-trial.modal.html","./src/app/features/enterprise/enterprise-modal/enterprise-trial.modal.ts","./src/app/features/enterprise/enterprise-active-trial/ee-active-trial.component.html","./src/app/features/enterprise/enterprise-active-trial/ee-active-trial.component.ts","./src/app/features/enterprise/enterprise-trial-waiting/ee-trial-waiting.component.html","./src/app/features/enterprise/enterprise-trial-waiting/ee-trial-waiting.component.ts","./src/app/features/enterprise/enterprise-trial.store.ts","./src/app/features/enterprise/enterprise-trial.service.ts","./src/app/features/enterprise/free-trial-button/free-trial-button.component.ts","./src/app/features/enterprise/free-trial-button/free-trial-button.component.html","./src/app/features/hal/hal-link/hal-link.ts","./src/app/features/hal/helpers/lazy-accessor.ts","./src/app/features/hal/helpers/hal-resource-builder.ts","./src/app/features/hal/helpers/id-from-link.ts","./src/app/features/hal/helpers/is-new-resource.ts","./src/app/features/hal/helpers/is-persisted-resource.ts","./src/app/features/hal/http/openproject-header-interceptor.ts","./src/app/features/hal/services/hal-aware-error-handler.ts","./src/app/features/hal/resources/wiki-page-resource.ts","./src/app/features/hal/resources/meeting-content-resource.ts","./src/app/features/hal/resources/post-resource.ts","./src/app/features/hal/resources/time-entry-resource.ts","./src/app/features/hal/resources/news-resource.ts","./src/app/features/hal/resources/membership-resource.ts","./src/app/features/hal/resources/group-resource.ts","./src/app/features/hal/resources/root-resource.ts","./src/app/features/hal/resources/type-resource.ts","./src/app/features/hal/resources/query-operator-resource.ts","./src/app/features/hal/resources/form-resource.ts","./src/app/features/hal/resources/help-text-resource.ts","./src/app/features/hal/resources/schema-resource.ts","./src/app/features/hal/resources/schema-dependency-resource.ts","./src/app/features/hal/resources/query-filter-instance-schema-resource.ts","./src/app/features/hal/resources/wp-collection-resource.ts","./src/app/features/hal/services/hal-resource.config.ts","./src/app/features/hal/openproject-hal.module.ts","./src/app/features/hal/resources/attachment-collection-resource.ts","./src/app/features/hal/resources/collection-resource.ts","./src/app/features/hal/resources/custom-action-resource.ts","./src/app/features/hal/resources/error-resource.ts","./src/app/features/hal/resources/grid-resource.ts","./src/app/features/hal/resources/grid-widget-resource.ts","./src/app/features/hal/resources/hal-resource.ts","./src/app/features/hal/resources/mixins/attachable-mixin.ts","./src/app/features/hal/resources/project-resource.ts","./src/app/features/hal/resources/query-filter-instance-resource.ts","./src/app/features/hal/resources/query-filter-resource.ts","./src/app/features/hal/resources/query-resource.ts","./src/app/features/hal/resources/query-sort-by-resource.ts","./src/app/features/hal/resources/relation-resource.ts","./src/app/features/hal/resources/role-resource.ts","./src/app/features/hal/resources/status-resource.ts","./src/app/features/hal/resources/user-resource.ts","./src/app/features/hal/resources/version-resource.ts","./src/app/features/hal/resources/work-package-resource.ts","./src/app/features/hal/schemas/hal-payload.helper.ts","./src/app/features/hal/schemas/schema-proxy.ts","./src/app/features/hal/schemas/work-package-schema-proxy.ts","./src/app/features/hal/services/hal-error.ts","./src/app/features/hal/services/hal-events.service.ts","./src/app/features/hal/services/hal-resource-notification.service.ts","./src/app/features/hal/services/hal-resource-sorting.service.ts","./src/app/features/hal/services/hal-resource.service.ts","./src/app/features/hal/services/url-params-encoder.ts","./src/app/features/in-app-notifications/bell/state/ian-bell.store.ts","./src/app/features/in-app-notifications/bell/state/ian-bell.query.ts","./src/app/features/in-app-notifications/bell/state/ian-bell.service.ts","./src/app/features/in-app-notifications/center/state/ian-center.store.ts","./src/app/features/in-app-notifications/center/state/ian-center.service.ts","./src/app/features/in-app-notifications/entry/status/in-app-notification-status.component.ts","./src/app/features/in-app-notifications/entry/status/in-app-notification-status.component.html","./src/app/features/in-app-notifications/entry/date-alert/in-app-notification-date-alert.component.ts","./src/app/features/in-app-notifications/entry/date-alert/in-app-notification-date-alert.component.html","./src/app/features/in-app-notifications/entry/actors-line/in-app-notification-actors-line.component.html","./src/app/features/in-app-notifications/entry/actors-line/in-app-notification-actors-line.component.ts","./src/app/features/in-app-notifications/entry/in-app-notification-entry.component.html","./src/app/features/in-app-notifications/entry/in-app-notification-entry.component.ts","./src/app/features/in-app-notifications/center/in-app-notification-center.component.html","./src/app/features/in-app-notifications/center/in-app-notification-center.component.ts","./src/app/features/in-app-notifications/center/toolbar/settings/notification-settings-button.component.ts","./src/app/features/in-app-notifications/center/toolbar/facet/activate-facet-button.component.html","./src/app/features/in-app-notifications/center/toolbar/settings/notification-settings-button.component.html","./src/app/features/in-app-notifications/center/toolbar/facet/activate-facet-button.component.ts","./src/app/features/in-app-notifications/center/toolbar/mark-all-as-read/mark-all-as-read-button.component.ts","./src/app/features/in-app-notifications/center/toolbar/mark-all-as-read/mark-all-as-read-button.component.html","./src/app/features/in-app-notifications/center/in-app-notification-center-page.component.ts","./src/app/features/in-app-notifications/date-alerts-upsale/ian-date-alerts-upsale.component.ts","./src/app/shared/helpers/videos/path-helper.ts","./src/app/features/in-app-notifications/date-alerts-upsale/ian-date-alerts-upsale.component.html","./src/app/features/in-app-notifications/in-app-notifications.routes.ts","./src/app/features/in-app-notifications/in-app-notifications.module.ts","./src/app/features/invite-user-modal/button/invite-user-button.module.ts","./src/app/features/invite-user-modal/invite-user-modal.service.ts","./src/app/features/invite-user-modal/invite-user.component.ts","./src/app/features/invite-user-modal/invite-user.component.html","./src/app/features/job-status/job-status-modal/job-status.modal.html","./src/app/features/job-status/job-status-modal/job-status.modal.ts","./src/app/features/plugins/hook-service.ts","./src/app/features/projects/components/projects/projects.component.ts","./src/app/features/projects/components/projects/projects.component.html","./src/app/features/projects/components/new-project/new-project.component.ts","./src/app/features/projects/components/new-project/new-project.component.html","./src/app/features/projects/components/copy-project/copy-project.component.ts","./src/app/features/projects/components/copy-project/copy-project.component.html","./src/app/features/projects/projects-routes.ts","./src/app/features/projects/openproject-projects.module.ts","./src/app/features/work-packages/components/back-routing/back-button.component.ts","./src/app/features/work-packages/components/back-routing/back-button.component.html","./src/app/features/work-packages/components/back-routing/back-routing.service.ts","./src/app/features/work-packages/components/edit-actions-bar/wp-edit-actions-bar.component.ts","./src/app/features/work-packages/components/edit-actions-bar/wp-edit-actions-bar.html","./src/app/features/work-packages/components/filters/filter-container/filter-container.directive.html","./src/app/features/work-packages/components/filters/filter-container/filter-container.directive.ts","./src/app/features/work-packages/components/filters/quick-filter-by-text-input/quick-filter-by-text-input.component.ts","./src/app/features/work-packages/components/filters/quick-filter-by-text-input/quick-filter-by-text-input.html","./src/app/features/work-packages/components/filters/filter-boolean-value/filter-boolean-value.component.ts","./src/app/features/work-packages/components/filters/filter-boolean-value/filter-boolean-value.component.html","./src/app/features/work-packages/components/filters/filter-integer-value/filter-integer-value.component.ts","./src/app/features/work-packages/components/filters/filter-integer-value/filter-integer-value.component.html","./src/app/features/work-packages/components/filters/filter-date-value/filter-date-value.component.ts","./src/app/features/work-packages/components/filters/filter-date-value/filter-date-value.component.html","./src/app/features/work-packages/components/filters/filter-dates-value/filter-dates-value.component.ts","./src/app/features/work-packages/components/filters/filter-dates-value/filter-dates-value.component.html","./src/app/features/work-packages/components/filters/abstract-filter-date-time-value/abstract-filter-date-time-value.controller.ts","./src/app/features/work-packages/components/filters/filter-date-time-value/filter-date-time-value.component.html","./src/app/features/work-packages/components/filters/filter-date-time-value/filter-date-time-value.component.ts","./src/app/features/work-packages/components/filters/filter-date-times-value/filter-date-times-value.component.html","./src/app/features/work-packages/components/filters/filter-date-times-value/filter-date-times-value.component.ts","./src/app/features/work-packages/components/filters/filter-string-value/filter-string-value.component.ts","./src/app/features/work-packages/components/filters/filter-string-value/filter-string-value.component.html","./src/app/features/work-packages/components/filters/filter-project/filter-project.component.ts","./src/app/features/work-packages/components/filters/filter-project/filter-project.component.html","./src/app/features/work-packages/components/filters/filter-toggled-multiselect-value/filter-toggled-multiselect-value.component.ts","./src/app/features/work-packages/components/filters/filter-toggled-multiselect-value/filter-toggled-multiselect-value.component.html","./src/app/features/work-packages/components/filters/filter-searchable-multiselect-value/filter-searchable-multiselect-value.component.ts","./src/app/features/work-packages/components/filters/filter-searchable-multiselect-value/filter-searchable-multiselect-value.component.html","./src/app/features/work-packages/components/filters/query-filter/query-filter.component.html","./src/app/features/work-packages/components/filters/query-filter/query-filter.component.ts","./src/app/features/work-packages/components/filters/query-filters/query-filters.component.html","./src/app/features/work-packages/components/filters/query-filters/query-filters.component.ts","./src/app/features/work-packages/components/filters/wp-filters/wp-filters.service.ts","./src/app/features/work-packages/components/wp-activity/comment-service.ts","./src/app/features/work-packages/components/wp-breadcrumb/wp-breadcrumb-parent.html","./src/app/features/work-packages/components/wp-breadcrumb/wp-breadcrumb-parent.component.ts","./src/app/features/work-packages/components/wp-breadcrumb/wp-breadcrumb.html","./src/app/features/work-packages/components/wp-breadcrumb/wp-breadcrumb.component.ts","./src/app/features/work-packages/components/wp-buttons/wp-buttons.module.ts","./src/app/shared/components/op-context-menu/handlers/op-types-context-menu.directive.ts","./src/app/features/work-packages/components/wp-buttons/wp-create-button/wp-create-button.component.ts","./src/app/features/work-packages/components/wp-buttons/wp-create-button/wp-create-button.html","./src/app/features/work-packages/components/wp-buttons/wp-filter-button/wp-filter-button.html","./src/app/features/work-packages/components/wp-buttons/wp-filter-button/wp-filter-button.component.ts","./src/app/features/work-packages/components/wp-buttons/wp-mark-notification-button/work-package-mark-notification-button.component.html","./src/app/features/work-packages/components/wp-buttons/wp-mark-notification-button/work-package-mark-notification-button.component.ts","./src/app/shared/components/modals/share-modal/query-sharing-form.component.ts","./src/app/shared/components/modals/share-modal/query-sharing-form.html","./src/app/shared/components/modals/share-modal/query-sharing.modal.ts","./src/app/shared/components/modals/share-modal/query-sharing.modal.html","./src/app/shared/components/modals/save-modal/save-query.modal.ts","./src/app/shared/components/modals/save-modal/save-query.modal.html","./src/app/shared/components/op-context-menu/handlers/op-settings-dropdown-menu.directive.ts","./src/app/features/work-packages/components/wp-buttons/wp-settings-button/wp-settings-button.component.ts","./src/app/features/work-packages/components/wp-buttons/wp-settings-button/wp-settings-button.component.html","./src/app/shared/components/op-context-menu/handlers/wp-status-dropdown-menu.directive.ts","./src/app/features/work-packages/components/wp-buttons/wp-status-button/wp-status-button.html","./src/app/features/work-packages/components/wp-buttons/wp-status-button/wp-status-button.component.ts","./src/app/features/work-packages/components/wp-buttons/zen-mode-toggle-button/zen-mode-toggle-button.component.ts","./src/app/features/work-packages/components/wp-buttons/wp-button.template.html","./src/app/features/work-packages/components/wp-card-view/event-handler/click-handler.ts","./src/app/features/work-packages/components/wp-card-view/event-handler/double-click-handler.ts","./src/app/features/work-packages/components/wp-card-view/event-handler/right-click-handler.ts","./src/app/features/work-packages/components/wp-card-view/event-handler/card-view-handler-registry.ts","./src/app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service.ts","./src/app/features/work-packages/components/wp-card-view/services/wp-card-view.service.ts","./src/app/features/work-packages/components/wp-card-view/wp-card-view.component.html","./src/app/features/work-packages/components/wp-card-view/wp-card-view.component.ts","./src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.html","./src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.ts","./src/app/features/work-packages/components/wp-copy/wp-copy.controller.ts","./src/app/features/work-packages/components/wp-edit-form/work-package-filter-values.ts","./src/app/features/work-packages/components/wp-edit/work-package-changeset.ts","./src/app/features/work-packages/components/wp-edit/wp-edit-field/wp-replacement-label.component.ts","./src/app/features/work-packages/components/wp-edit/wp-edit-field/wp-replacement-label.html","./src/app/features/work-packages/components/wp-fast-table/builders/cell-builder.ts","./src/app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions.ts","./src/app/features/work-packages/components/wp-fast-table/builders/internal-sort-columns.ts","./src/app/features/work-packages/components/wp-fast-table/builders/modes/grouped/group-sums-builder.ts","./src/app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-classes.constants.ts","./src/app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-rows-helpers.ts","./src/app/features/work-packages/components/wp-fast-table/builders/modes/hierarchy/single-hierarchy-row-builder.ts","./src/app/features/work-packages/components/wp-fast-table/builders/relation-cell-builder.ts","./src/app/features/work-packages/components/wp-fast-table/builders/table-action-renderer.ts","./src/app/features/work-packages/components/wp-fast-table/builders/rows/single-row-builder.ts","./src/app/features/work-packages/components/wp-fast-table/builders/timeline/timeline-row-builder.ts","./src/app/features/work-packages/components/wp-fast-table/builders/ui-state-link-builder.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/click-or-enter-handler.ts","./src/app/features/work-packages/components/wp-fast-table/helpers/wp-table-hierarchy-helpers.ts","./src/app/features/work-packages/components/wp-fast-table/helpers/wp-table-row-helpers.ts","./src/app/features/work-packages/components/wp-fast-table/builders/modes/rows-builder.ts","./src/app/features/work-packages/components/wp-fast-table/builders/modes/grouped/group-header-builder.ts","./src/app/features/work-packages/components/wp-fast-table/builders/highlighting/row-highlight-render-pass.ts","./src/app/features/work-packages/components/wp-fast-table/builders/drag-and-drop/drag-drop-handle-builder.ts","./src/app/features/work-packages/components/wp-fast-table/builders/drag-and-drop/drag-drop-handle-render-pass.ts","./src/app/features/work-packages/components/wp-fast-table/builders/timeline/timeline-render-pass.ts","./src/app/features/work-packages/components/wp-fast-table/builders/relations/relation-row-builder.ts","./src/app/features/work-packages/components/wp-fast-table/builders/relations/relations-render-pass.ts","./src/app/features/work-packages/components/wp-fast-table/builders/primary-render-pass.ts","./src/app/features/work-packages/components/wp-fast-table/builders/modes/plain/plain-render-pass.ts","./src/app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-render-pass.ts","./src/app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-rows-builder.ts","./src/app/features/work-packages/components/wp-fast-table/builders/modes/hierarchy/hierarchy-render-pass.ts","./src/app/features/work-packages/components/wp-fast-table/builders/modes/hierarchy/hierarchy-rows-builder.ts","./src/app/features/work-packages/components/wp-fast-table/builders/modes/plain/plain-rows-builder.ts","./src/app/features/work-packages/components/wp-edit-form/table-edit-form.ts","./src/app/features/work-packages/components/wp-fast-table/wp-table-editing.ts","./src/app/features/work-packages/components/wp-fast-table/wp-fast-table.ts","./src/app/features/work-packages/components/wp-grid/wp-grid.component.ts","./src/app/features/work-packages/components/wp-inline-create/inline-create-row-builder.ts","./src/app/features/work-packages/components/wp-inline-create/wp-inline-create.component.html","./src/app/features/work-packages/components/wp-inline-create/wp-inline-create.component.ts","./src/app/features/work-packages/components/wp-inline-create/wp-inline-create.service.ts","./src/app/features/work-packages/components/wp-list/wp-list-checksum.service.ts","./src/app/features/work-packages/components/wp-list/wp-list-invalid-query.service.ts","./src/app/features/work-packages/components/wp-list/wp-list.service.ts","./src/app/features/work-packages/components/wp-list/wp-query-view.service.ts","./src/app/features/work-packages/components/wp-list/wp-states-initialization.service.ts","./src/app/features/work-packages/components/wp-new/wp-create.component.ts","./src/app/features/work-packages/components/wp-new/wp-create.service.ts","./src/app/features/work-packages/components/wp-new/wp-new-full-view.html","./src/app/features/work-packages/components/wp-new/wp-new-full-view.component.ts","./src/app/features/work-packages/components/wp-query/query-column.ts","./src/app/features/work-packages/components/wp-query/query-filters.service.ts","./src/app/features/work-packages/components/wp-query/query-param-listener.service.ts","./src/app/features/work-packages/components/wp-query/url-params-helper.ts","./src/app/features/work-packages/components/wp-relations/embedded/children/wp-children-inline-create.service.ts","./src/app/features/work-packages/components/wp-relations/embedded/wp-relation-query.html","./src/app/features/work-packages/components/wp-relations/embedded/children/wp-children-query.component.ts","./src/app/features/work-packages/components/wp-relations/embedded/inline/add-existing/wp-relation-inline-add-existing.component.ts","./src/app/features/work-packages/components/wp-relations/embedded/inline/add-existing/wp-relation-inline-add-existing.component.html","./src/app/features/work-packages/components/wp-relations/embedded/relations/wp-relation-inline-create.service.ts","./src/app/features/work-packages/components/wp-relations/embedded/wp-relation-query.base.ts","./src/app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-autocomplete/wp-relations-autocomplete.component.ts","./src/app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-autocomplete/wp-relations-autocomplete.html","./src/app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service.ts","./src/app/features/work-packages/components/wp-relations/wp-relations.service.ts","./src/app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-entry-info.ts","./src/app/features/work-packages/components/wp-single-view-tabs/activity-panel/wp-activity.service.ts","./src/app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service.ts","./src/app/features/work-packages/components/wp-single-view-tabs/watchers-tab/watchers-tab.html","./src/app/features/work-packages/components/wp-single-view-tabs/watchers-tab/watchers-tab.component.ts","./src/app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watchers.service.ts","./src/app/features/work-packages/components/wp-single-view-tabs/wp-linked-resource-cache.service.ts","./src/app/features/work-packages/components/wp-custom-actions/wp-custom-actions/wp-custom-action.component.ts","./src/app/features/work-packages/components/wp-custom-actions/wp-custom-actions.component.html","./src/app/features/work-packages/components/wp-custom-actions/wp-custom-actions/wp-custom-action.component.html","./src/app/features/work-packages/components/wp-custom-actions/wp-custom-actions.component.ts","./src/app/features/work-packages/components/wp-single-view/wp-single-view.html","./src/app/features/work-packages/components/wp-single-view/wp-single-view.component.ts","./src/app/features/work-packages/components/wp-subject/wp-subject.html","./src/app/features/work-packages/components/wp-subject/wp-subject.component.ts","./src/app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet.ts","./src/app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal.html","./src/app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal.ts","./src/app/features/work-packages/components/wp-table/configuration-modal/tabs/display-settings-tab.component.html","./src/app/features/work-packages/components/wp-table/configuration-modal/tabs/display-settings-tab.component.ts","./src/app/features/work-packages/components/wp-table/configuration-modal/tabs/columns-tab.component.html","./src/app/features/work-packages/components/wp-table/configuration-modal/tabs/columns-tab.component.ts","./src/app/features/work-packages/components/wp-table/configuration-modal/tabs/filters-tab.component.html","./src/app/features/work-packages/components/wp-table/configuration-modal/tabs/filters-tab.component.ts","./src/app/features/work-packages/components/wp-table/configuration-modal/tabs/sort-by-tab.component.html","./src/app/features/work-packages/components/wp-table/configuration-modal/tabs/sort-by-tab.component.ts","./src/app/features/work-packages/components/wp-table/configuration-modal/tabs/timelines-tab.component.html","./src/app/features/work-packages/components/wp-table/configuration-modal/tabs/timelines-tab.component.ts","./src/app/features/work-packages/components/wp-table/configuration-modal/tabs/highlighting-tab.component.html","./src/app/features/work-packages/components/wp-table/configuration-modal/tabs/highlighting-tab.component.ts","./src/app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.service.ts","./src/app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service.ts","./src/app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-action.service.ts","./src/app/features/work-packages/components/wp-table/drag-and-drop/actions/hierarchy-drag-action.service.ts","./src/app/features/work-packages/components/wp-table/drag-and-drop/actions/group-by-drag-action.service.ts","./src/app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-actions-registry.service.ts","./src/app/features/work-packages/components/wp-table/embedded/wp-embedded-base.component.ts","./src/app/features/work-packages/components/wp-table/embedded/wp-embedded-table.html","./src/app/features/work-packages/components/wp-table/embedded/wp-embedded-table.component.ts","./src/app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.component.ts","./src/app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.template.html","./src/app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.constants.ts","./src/app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.service.ts","./src/app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration-relation-selector.html","./src/app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration-relation-selector.ts","./src/app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.component.ts","./src/app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.service.ts","./src/app/features/work-packages/components/wp-table/external-configuration/restricted-wp-table-configuration.service.ts","./src/app/features/work-packages/components/wp-table/table-actions/actions/unlink-table-action.ts","./src/app/features/work-packages/components/wp-table/table-actions/table-action.ts","./src/app/features/work-packages/components/wp-table/table-actions/actions/details-table-action.ts","./src/app/features/work-packages/components/wp-table/table-actions/actions/context-menu-table-action.ts","./src/app/features/work-packages/components/wp-table/table-actions/table-actions.service.ts","./src/app/shared/components/table-pagination/table-pagination.component.html","./src/app/shared/components/table-pagination/table-pagination.component.ts","./src/app/features/work-packages/components/wp-table/table-pagination/wp-table-pagination.component.ts","./src/app/features/work-packages/components/wp-table/timeline/wp-timeline.ts","./src/app/features/work-packages/components/wp-table/wp-table-configuration.ts","./src/app/features/work-packages/components/wp-table/wp-table-scroll-sync.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/state/highlighting-transformer.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/state/drag-and-drop-transformer.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/state/group-fold-transformer.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/cell/edit-cell-handler.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/cell/relations-cell-handler.ts","./src/app/shared/components/op-context-menu/wp-context-menu/wp-table-context-menu.directive.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/context-menu/context-menu-handler.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/context-menu/context-menu-click-handler.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/context-menu/context-menu-keyboard-handler.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/context-menu/context-menu-rightclick-handler.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/row/click-handler.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/row/double-click-handler.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/row/group-row-handler.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/row/hierarchy-click-handler.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/row/wp-state-links-handler.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/state/columns-transformer.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/state/hierarchy-transformer.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/state/relations-transformer.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/state/rows-transformer.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/state/selection-transformer.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/state/timeline-transformer.ts","./src/app/features/work-packages/components/wp-fast-table/handlers/table-handler-registry.ts","./src/app/features/work-packages/components/wp-table/wp-table-hover-sync.ts","./src/app/features/work-packages/components/wp-table/wp-table.directive.html","./src/app/features/work-packages/components/wp-table/wp-table.component.ts","./src/app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/wp-tab-wrapper.html","./src/app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/wp-tab-wrapper.component.ts","./src/app/features/work-packages/components/wp-tabs/components/wp-tabs/wp-tabs.component.html","./src/app/features/work-packages/components/wp-tabs/components/wp-tabs/wp-tabs.component.ts","./src/app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.directive.ts","./src/app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.template.html","./src/app/features/work-packages/components/wp-relations/wp-relation-row/wp-relation-row.template.html","./src/app/features/work-packages/components/wp-relations/wp-relation-row/wp-relation-row.component.ts","./src/app/features/work-packages/components/wp-relations/wp-relations-group/wp-relations-group.template.html","./src/app/features/work-packages/components/wp-relations/wp-relations-group/wp-relations-group.component.ts","./src/app/features/work-packages/components/wp-relations/wp-relations-create/wp-relation-create.template.html","./src/app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-create.component.ts","./src/app/features/work-packages/components/wp-relations/wp-relations.template.html","./src/app/features/work-packages/components/wp-relations/wp-relations.component.ts","./src/app/features/work-packages/components/wp-single-view-tabs/relations-tab/relations-tab.html","./src/app/features/work-packages/components/wp-single-view-tabs/relations-tab/relations-tab.component.ts","./src/app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-base.controller.ts","./src/app/features/work-packages/components/work-package-comment/work-package-comment-field-handler.ts","./src/app/features/work-packages/components/work-package-comment/work-package-comment.component.html","./src/app/features/work-packages/components/work-package-comment/work-package-comment.component.ts","./src/app/features/work-packages/components/wp-activity/activity-link.component.ts","./src/app/features/work-packages/components/wp-activity/revision/revision-activity.component.html","./src/app/features/work-packages/components/wp-activity/revision/revision-activity.component.ts","./src/app/shared/components/dynamic-bootstrap/component/dynamic-bootstrap/dynamic-bootstrap.component.ts","./src/app/features/work-packages/components/wp-activity/user/user-activity.component.html","./src/app/shared/components/dynamic-bootstrap/component/dynamic-bootstrap/dynamic-bootstrap.component.html","./src/app/features/work-packages/components/wp-activity/user/user-activity.component.ts","./src/app/features/work-packages/components/wp-activity/activity-entry.component.html","./src/app/features/work-packages/components/wp-activity/activity-entry.component.ts","./src/app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-on-overview.html","./src/app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-on-overview.component.ts","./src/app/features/work-packages/components/wp-single-view-tabs/overview-tab/overview-tab.html","./src/app/features/work-packages/components/wp-single-view-tabs/overview-tab/overview-tab.component.ts","./src/app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-tab.html","./src/app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-tab.component.ts","./src/app/shared/components/file-links/file-links-constants.const.ts","./src/app/shared/components/file-links/storage-information/storage-action-button.ts","./src/app/shared/components/file-links/storage-information/storage-information-box.ts","./src/app/spot/components/breadcrumbs/breadcrumbs-content.ts","./src/app/shared/components/file-links/file-link-icons/file-icons.helper.ts","./src/app/shared/components/file-links/storage-file-list-item/storage-file-list-item.ts","./src/app/shared/components/file-links/storage-icons/icon-mappings.ts","./src/app/spot/components/breadcrumbs/breadcrumbs.component.html","./src/app/spot/components/breadcrumbs/breadcrumbs.component.ts","./src/app/shared/components/file-links/storage-file-list-item/storage-file-list-item.html","./src/app/shared/components/file-links/storage-file-list-item/storage-file-list-item.component.ts","./src/app/shared/components/file-links/loading-file-list/loading-file-list.component.ts","./src/app/shared/components/file-links/loading-file-list/loading-file-list.html","./src/app/shared/components/file-links/file-picker-modal/sort-files.pipe.ts","./src/app/shared/components/file-links/file-picker-modal/file-picker-modal.html","./src/app/shared/components/file-links/file-picker-modal/file-picker-modal.component.ts","./src/app/shared/components/file-links/storage-icons/get-icon-for-storage-type.ts","./src/app/shared/components/file-links/storage-information/storage-information.html","./src/app/shared/components/file-links/storage-information/storage-information.component.ts","./src/app/shared/components/file-links/file-link-list-item/file-link-list-item.html","./src/app/shared/components/file-links/file-link-list-item/file-link-list-item.component.ts","./src/app/shared/components/file-links/file-link-list/file-link-list.html","./src/app/shared/components/file-links/file-link-list/file-link-list.component.ts","./src/app/features/work-packages/components/wp-single-view-tabs/files-tab/op-files-tab.html","./src/app/features/work-packages/components/wp-single-view-tabs/files-tab/op-files-tab.component.ts","./src/app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-watchers-count.function.ts","./src/app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-relations-count.function.ts","./src/app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-notifications-count.function.ts","./src/app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-files-count.function.ts","./src/app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-tabs.service.ts","./src/app/features/work-packages/components/wp-type-status/wp-type-status.html","./src/app/features/work-packages/components/wp-type-status/wp-type-status.component.ts","./src/app/features/work-packages/components/wp-watcher-button/wp-watcher-button.html","./src/app/features/work-packages/components/wp-watcher-button/wp-watcher-button.component.ts","./src/app/features/work-packages/directives/query-space/isolated-query-space.ts","./src/app/features/work-packages/directives/query-space/wp-isolated-query-space.directive.ts","./src/app/features/work-packages/components/wp-table/timeline/cells/wp-timeline-cell-labels.ts","./src/app/features/work-packages/components/wp-table/timeline/cells/timeline-cell-renderer.ts","./src/app/features/work-packages/components/wp-table/timeline/cells/timeline-milestone-cell-renderer.ts","./src/app/features/work-packages/components/wp-table/timeline/cells/wp-timeline-cell-mouse-handler.ts","./src/app/features/work-packages/components/wp-table/timeline/cells/wp-timeline-cell.ts","./src/app/features/work-packages/components/wp-table/timeline/cells/wp-timeline-cells-renderer.ts","./src/app/features/work-packages/components/wp-table/timeline/container/wp-timeline-container.directive.ts","./src/app/features/work-packages/components/wp-table/timeline/container/wp-timeline-container.html","./src/app/shared/components/op-context-menu/handlers/op-columns-context-menu.directive.ts","./src/app/features/work-packages/components/wp-table/timeline/header/wp-timeline-header.directive.ts","./src/app/features/work-packages/components/wp-table/timeline/header/wp-timeline-header.html","./src/app/features/work-packages/components/wp-table/timeline/global-elements/timeline-relation-element.ts","./src/app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-relations.directive.ts","./src/app/features/work-packages/components/wp-table/timeline/global-elements/timeline-static-element.ts","./src/app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline.today-line.ts","./src/app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-static-elements.directive.ts","./src/app/features/work-packages/components/wp-table/timeline/grid/wp-timeline-grid.directive.ts","./src/app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watcher-entry.component.ts","./src/app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watcher-entry.component.html","./src/app/features/work-packages/components/wp-table/wp-table-sums-row/wp-table-sums-row.directive.ts","./src/app/features/work-packages/components/wp-relations/embedded/relations/wp-relation-query.component.ts","./src/app/features/work-packages/components/wp-table/config-menu/config-menu.component.ts","./src/app/features/work-packages/components/wp-table/config-menu/config-menu.template.html","./src/app/features/work-packages/components/wp-tabs/wp-tabs.module.ts","./src/app/features/work-packages/components/wp-form-group/wp-attribute-group.template.html","./src/app/features/work-packages/components/wp-form-group/wp-attribute-group.component.ts","./src/app/features/work-packages/helpers/time-entries/time-entry-changeset.ts","./src/app/shared/components/file-links/openproject-file-links.module.ts","./src/app/features/work-packages/components/wp-table/sort-header/sort-header.directive.html","./src/app/features/work-packages/components/wp-table/sort-header/sort-header.directive.ts","./src/app/features/work-packages/openproject-work-packages.module.ts","./src/app/features/work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component.ts","./src/app/features/work-packages/routing/split-view-routes.helper.ts","./src/app/features/work-packages/components/wp-new/wp-new-split-view.html","./src/app/features/work-packages/components/wp-new/wp-new-split-view.component.ts","./src/app/features/work-packages/components/wp-copy/wp-copy-split-view.component.ts","./src/app/features/work-packages/routing/split-view-routes.template.ts","./src/app/features/work-packages/routing/wp-edit-form/wp-edit-form-routing.service.ts","./src/app/features/work-packages/routing/wp-base/wp--base.component.ts","./src/app/features/work-packages/routing/wp-list-view/wp-list-view.component.html","./src/app/features/work-packages/routing/wp-list-view/wp-list-view.component.ts","./src/app/features/work-packages/components/wp-details/wp-details-toolbar.html","./src/app/features/work-packages/components/wp-details/wp-details-toolbar.component.ts","./src/app/features/work-packages/routing/wp-split-view/wp-split-view.html","./src/app/features/work-packages/routing/wp-split-view/wp-split-view.component.ts","./src/app/features/work-packages/routing/wp-view-base/event-handling/event-handler-registry.ts","./src/app/features/work-packages/routing/wp-view-base/state/wp-single-view.store.ts","./src/app/features/work-packages/routing/wp-view-base/state/wp-single-view.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-additional-elements.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-base.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-collapsed-groups.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy-indentation.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-table-hierarchies.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-highlighting.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-include-subprojects.service.ts","./src/app/shared/helpers/drag-and-drop/reorder-delta-builder.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-table-pagination.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-pagination.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-relation-columns.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-sum.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service.ts","./src/app/features/work-packages/routing/wp-view-base/work-package-single-view.base.ts","./src/app/features/work-packages/routing/wp-view-base/work-packages-view.base.ts","./src/app/features/work-packages/services/notifications/work-package-notification.service.ts","./src/app/features/work-packages/services/work-package.service.ts","./src/app/shared/components/attachments/attachment-list/attachment-list-item.html","./src/app/shared/components/attachments/attachment-list/attachment-list-item.component.ts","./src/app/shared/components/attachments/attachment-list/attachment-list.html","./src/app/shared/components/attachments/attachment-list/attachment-list.component.ts","./src/app/shared/components/attachments/attachments-upload/attachments-upload.html","./src/app/shared/components/attachments/attachments-upload/attachments-upload.component.ts","./src/app/shared/components/attachments/attachments.html","./src/app/shared/components/attachments/attachments.component.ts","./src/app/shared/components/attachments/openproject-attachments.module.ts","./src/app/shared/components/attribute-help-texts/attribute-help-text.service.ts","./src/app/shared/components/attribute-help-texts/help-text.modal.html","./src/app/shared/components/attribute-help-texts/attribute-help-text.modal.ts","./src/app/shared/components/attribute-help-texts/attribute-help-text.component.html","./src/app/shared/components/attribute-help-texts/attribute-help-text.component.ts","./src/app/shared/components/attribute-help-texts/attribute-help-text.module.ts","./src/app/shared/components/autocompleter/autocomplete-select-decoration/autocomplete-select-decoration.component.ts","./src/app/shared/components/autocompleter/autocompleter-footer-template/op-autocompleter-footer-template.directive.ts","./src/app/shared/components/autocompleter/create-autocompleter/create-autocompleter.component.html","./src/app/shared/components/autocompleter/create-autocompleter/create-autocompleter.component.ts","./src/app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component.html","./src/app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component.ts","./src/app/shared/components/autocompleter/op-autocompleter/directives/op-autocompleter-header-template.directive.ts","./src/app/shared/components/autocompleter/op-autocompleter/directives/op-autocompleter-label-template.directive.ts","./src/app/shared/components/autocompleter/op-autocompleter/directives/op-autocompleter-option-template.directive.ts","./src/app/shared/components/autocompleter/op-autocompleter/services/op-autocompleter.service.ts","./src/app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component.html","./src/app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component.ts","./src/app/shared/components/autocompleter/openproject-autocompleter.module.ts","./src/app/shared/components/autocompleter/project-autocompleter/flatten-project-tree.ts","./src/app/shared/components/autocompleter/project-autocompleter/insert-in-list.ts","./src/app/shared/components/autocompleter/project-autocompleter/recursive-sort.ts","./src/app/shared/components/autocompleter/project-autocompleter/project-autocompleter.component.html","./src/app/shared/components/autocompleter/project-autocompleter/project-autocompleter.component.ts","./src/app/shared/components/autocompleter/te-work-package-autocompleter/te-work-package-autocompleter.component.html","./src/app/shared/components/autocompleter/te-work-package-autocompleter/te-work-package-autocompleter.component.ts","./src/app/features/invite-user-modal/button/invite-user-button.component.html","./src/app/features/invite-user-modal/button/invite-user-button.component.ts","./src/app/shared/components/autocompleter/user-autocompleter/user-autocompleter.component.html","./src/app/shared/components/autocompleter/user-autocompleter/user-autocompleter.component.ts","./src/app/shared/components/autocompleter/version-autocompleter/version-autocompleter.component.ts","./src/app/shared/components/autocompleter/work-package-autocompleter/wp-autocompleter.component.ts","./src/app/shared/components/colors/colors-autocompleter.component.ts","./src/app/shared/components/colors/colors.service.ts","./src/app/shared/components/dataset-inputs.ts","./src/app/shared/components/date/op-date-time.component.ts","./src/app/core/forms/forms.service.ts","./src/app/shared/components/dynamic-forms/services/dynamic-fields/dynamic-fields.service.ts","./src/app/shared/helpers/url-helpers.ts","./src/app/shared/components/dynamic-forms/services/dynamic-form/dynamic-form.service.ts","./src/app/shared/components/dynamic-forms/components/dynamic-form/dynamic-form.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-form/dynamic-form.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/text-input/text-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/text-input/text-input.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/integer-input/integer-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/select-input/select-input.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/integer-input/integer-input.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/select-input/select-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/project-input/project-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/project-input/project-input.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/select-project-status-input/select-project-status-input.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/select-project-status-input/select-project-status-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/date-input/components/date-picker-control/date-picker-control.module.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/boolean-input/boolean-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/boolean-input/boolean-input.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/formattable-textarea-input/components/formattable-control/formattable-control.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/formattable-textarea-input/components/formattable-control/formattable-control.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/formattable-textarea-input/formattable-textarea-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/formattable-textarea-input/formattable-textarea-input.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-field-wrapper/dynamic-field-wrapper.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-field-wrapper/dynamic-field-wrapper.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/date-input/components/date-picker-control/date-picker-control.component.ts","./src/app/shared/components/op-date-picker/op-single-date-picker/op-single-date-picker.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/date-input/date-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/date-input/date-input.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-field-group-wrapper/dynamic-field-group-wrapper.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-field-group-wrapper/dynamic-field-group-wrapper.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/formattable-textarea-input/components/formattable-control/formattable-control.module.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/user-input/user-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/user-input/user-input.component.html","./src/app/shared/components/dynamic-forms/dynamic-forms.module.ts","./src/app/shared/components/editable-toolbar-title/editable-toolbar-title.html","./src/app/shared/components/editable-toolbar-title/editable-toolbar-title.component.ts","./src/app/shared/components/editor/components/ckeditor/ckeditor-preview.service.ts","./src/app/shared/components/editor/components/ckeditor/ckeditor-setup.service.ts","./src/app/shared/components/editor/components/ckeditor/op-ckeditor.html","./src/app/shared/components/editor/components/ckeditor/op-ckeditor.component.ts","./src/app/shared/components/editor/openproject-editor.module.ts","./src/app/shared/components/enterprise-banner/enterprise-banner.component.html","./src/app/shared/components/enterprise-banner/enterprise-banner.component.ts","./src/app/shared/components/enterprise-page/enterprise-page.component.html","./src/app/shared/components/enterprise-page/enterprise-page.component.ts","./src/app/shared/components/fields/changeset/changeset.ts","./src/app/shared/components/fields/changeset/resource-changeset.ts","./src/app/shared/components/fields/display/field-types/multiple-lines-custom-options-display-field.module.ts","./src/app/shared/components/fields/display/field-types/progress-text-display-field.module.ts","./src/app/shared/components/fields/display/field-types/multiple-lines-user-display-field.module.ts","./src/app/shared/components/fields/display/display-field-renderer.ts","./src/app/shared/components/fields/display/display-field.module.ts","./src/app/shared/components/fields/display/display-field.service.ts","./src/app/shared/components/fields/display/field-types/combined-date-display.field.ts","./src/app/shared/components/fields/display/field-types/date-display-field.module.ts","./src/app/shared/components/fields/display/field-types/highlightable-display-field.module.ts","./src/app/shared/components/fields/display/field-types/progress-display-field.module.ts","./src/app/shared/components/fields/display/field-types/resources-display-field.module.ts","./src/app/shared/components/fields/edit/edit-field.component.ts","./src/app/shared/components/fields/edit/edit-field.service.ts","./src/app/shared/components/fields/edit/edit-form/edit-form-routing.service.ts","./src/app/shared/components/fields/edit/services/global-edit-form-changes-tracker/global-edit-form-changes-tracker.service.ts","./src/app/shared/components/fields/edit/edit-form/edit-form.component.ts","./src/app/shared/components/fields/edit/edit-form/edit-form.ts","./src/app/shared/components/fields/edit/editing-portal/edit-field-handler.ts","./src/app/shared/components/fields/edit/editing-portal/edit-form-portal.component.html","./src/app/shared/components/fields/edit/editing-portal/edit-form-portal.component.ts","./src/app/shared/components/fields/edit/editing-portal/edit-form-portal.injector.ts","./src/app/shared/components/fields/edit/field-handler/hal-resource-edit-field-handler.ts","./src/app/shared/components/fields/edit/editing-portal/editing-portal-service.ts","./src/app/shared/components/fields/edit/field-controls/edit-field-controls.component.ts","./src/app/shared/components/fields/edit/field-controls/edit-field-controls.component.html","./src/app/shared/components/fields/edit/field-controls/edit-field-controls.module.ts","./src/app/shared/components/fields/edit/field-types/formattable-edit-field/formattable-edit-field.module.ts","./src/app/shared/components/fields/edit/field/editable-attribute-field.component.ts","./src/app/shared/helpers/selection-helpers.ts","./src/app/shared/components/fields/edit/field/editable-attribute-field.component.html","./src/app/shared/components/fields/edit/services/hal-resource-editing.service.ts","./src/app/shared/components/fields/field.base.ts","./src/app/shared/components/fields/field.service.ts","./src/app/shared/components/fields/helpers/project-status-helper.ts","./src/app/shared/components/fields/edit/field-types/text-edit-field/text-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/text-edit-field.component.html","./src/app/shared/components/fields/edit/field-types/integer-edit-field/integer-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/select-edit-field/select-autocompleter-register.service.ts","./src/app/shared/components/fields/edit/field-types/select-edit-field/select-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/select-edit-field/select-edit-field.component.html","./src/app/shared/components/fields/edit/field-types/multi-select-edit-field.component.html","./src/app/shared/components/fields/edit/field-types/multi-select-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/float-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/boolean-edit-field/boolean-edit-field.component.ts","./src/app/shared/helpers/rxjs/debounced-input-switchmap.ts","./src/app/shared/components/fields/edit/field-types/work-package-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/work-package-edit-field.component.html","./src/app/shared/components/fields/edit/field-types/date-edit-field/date-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/formattable-edit-field/formattable-edit-field.component.html","./src/app/shared/components/fields/edit/field-types/formattable-edit-field/formattable-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/project-status-edit-field.component.html","./src/app/shared/components/fields/edit/field-types/project-status-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/plain-formattable-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/te-work-package-edit-field.component.ts","./src/app/shared/components/datepicker/helpers/date-modal.helpers.ts","./src/app/shared/components/datepicker/services/date-modal-relations.service.ts","./src/app/shared/components/datepicker/services/date-modal-scheduling.service.ts","./src/app/shared/components/modal/modal-banner/modal-banner.component.html","./src/app/shared/components/modal/modal-banner/modal-banner.component.ts","./src/app/shared/components/datepicker/banner/datepicker-banner.component.html","./src/app/shared/components/datepicker/banner/datepicker-banner.component.ts","./src/app/shared/components/datepicker/scheduling-mode/datepicker-scheduling-toggle.component.ts","./src/app/shared/components/datepicker/scheduling-mode/datepicker-scheduling-toggle.component.html","./src/app/shared/components/datepicker/toggle/datepicker-working-days-toggle.component.ts","./src/app/shared/components/datepicker/toggle/datepicker-working-days-toggle.component.html","./src/app/shared/components/datepicker/single-date-modal/single-date.modal.ts","./src/app/shared/components/datepicker/single-date-modal/single-date.modal.html","./src/app/shared/components/datepicker/multi-date-modal/multi-date.modal.ts","./src/app/shared/components/datepicker/multi-date-modal/multi-date.modal.html","./src/app/shared/components/fields/edit/field-types/date-picker-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/combined-date-edit-field.component.ts","./src/app/features/work-packages/components/work-package-comment/wp-comment-field.component.ts","./src/app/shared/components/fields/edit/field-types/project-edit-field.component.html","./src/app/shared/components/fields/edit/field-types/project-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/hours-duration-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/user-edit-field.component.html","./src/app/shared/components/fields/edit/field-types/user-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/days-duration-edit-field.compontent.ts","./src/app/shared/components/fields/display/field-types/text-display-field.module.ts","./src/app/shared/components/fields/display/field-types/float-display-field.module.ts","./src/app/shared/components/fields/display/field-types/integer-display-field.module.ts","./src/app/shared/components/fields/display/field-types/resource-display-field.module.ts","./src/app/shared/components/fields/display/field-types/formattable-display-field.module.ts","./src/app/core/expression/expression.service.ts","./src/app/shared/components/fields/display/field-types/datetime-display-field.module.ts","./src/app/shared/components/fields/display/field-types/boolean-display-field.module.ts","./src/app/shared/components/fields/display/field-types/work-package-display-field.module.ts","./src/app/shared/components/fields/display/field-types/estimated-time-display-field.module.ts","./src/app/shared/components/fields/display/field-types/wp-spent-time-display-field.module.ts","./src/app/shared/components/fields/display/field-types/id-display-field.module.ts","./src/app/shared/components/fields/display/field-types/highlighted-resource-display-field.module.ts","./src/app/shared/components/fields/display/field-types/type-display-field.module.ts","./src/app/shared/components/fields/display/field-types/user-display-field.module.ts","./src/app/shared/components/fields/display/field-types/multiple-user-display-field.module.ts","./src/app/shared/components/fields/display/field-types/wp-id-display-field.module.ts","./src/app/shared/components/fields/display/field-types/project-status-display-field.module.ts","./src/app/shared/components/fields/display/field-types/plain-formattable-display-field.module.ts","./src/app/shared/components/fields/display/field-types/linked-work-package-display-field.module.ts","./src/app/shared/components/fields/display/field-types/days-duration-display-field.module.ts","./src/app/shared/components/fields/display/field-types/hours-duration-display-field.module.ts","./src/app/shared/components/fields/edit/field-types/boolean-edit-field/boolean-edit-field.module.ts","./src/app/shared/components/fields/edit/field-types/integer-edit-field/integer-edit-field.module.ts","./src/app/shared/components/fields/edit/field-types/text-edit-field/text-edit-field.module.ts","./src/app/shared/components/fields/edit/field-types/date-edit-field/date-edit-field.module.ts","./src/app/shared/components/fields/edit/field-types/select-edit-field/select-edit-field.module.ts","./src/app/shared/components/fields/openproject-fields.module.ts","./src/app/shared/components/fields/edit/edit-field.initializer.ts","./src/app/shared/components/fields/display/display-field.initializer.ts","./src/app/shared/components/file-links/file-link-icons/icon-mappings.ts","./src/app/shared/components/file-links/file-link-icons/file-link-list-item-icon.factory.ts","./src/app/shared/components/grids/widgets/widget-changeset.ts","./src/app/shared/components/grids/widgets/abstract-widget.component.ts","./src/app/shared/components/icon/icon.component.ts","./src/app/shared/components/icon/icon.module.ts","./src/app/shared/components/modal/modal-wrapper-augment.service.ts","./src/app/shared/components/modal/modal.component.ts","./src/app/shared/components/modal/modal.module.ts","./src/app/shared/components/modal/modal.service.ts","./src/app/shared/components/modals/confirm-dialog/confirm-dialog.modal.html","./src/app/shared/components/modals/confirm-dialog/confirm-dialog.modal.ts","./src/app/shared/components/modals/confirm-dialog/confirm-dialog.service.ts","./src/app/shared/components/modals/editor/macro-wp-button-modal/wp-button-macro.modal.html","./src/app/shared/components/modals/editor/macro-wp-button-modal/wp-button-macro.modal.ts","./src/app/shared/components/modals/editor/macro-wiki-include-page-modal/wiki-include-page-macro.modal.ts","./src/app/shared/components/modals/editor/macro-wiki-include-page-modal/wiki-include-page-macro.modal.html","./src/app/shared/components/modals/editor/macro-code-block-modal/code-block-macro.modal.ts","./src/app/shared/components/modals/editor/macro-code-block-modal/code-block-macro.modal.html","./src/app/shared/components/modals/editor/macro-child-pages-modal/child-pages-macro.modal.ts","./src/app/shared/components/modals/editor/macro-child-pages-modal/child-pages-macro.modal.html","./src/app/shared/components/modals/editor/editor-macros.service.ts","./src/app/shared/components/modals/export-modal/wp-table-export.modal.html","./src/app/shared/components/modals/export-modal/wp-table-export.modal.ts","./src/app/shared/components/modals/modal-wrapper/dynamic-content.modal.ts","./src/app/shared/components/modals/modal-wrapper/dynamic-content.modal.html","./src/app/core/state/is-not-null.ts","./src/app/shared/components/modals/wp-destroy-modal/wp-destroy.modal.html","./src/app/shared/components/modals/wp-destroy-modal/wp-destroy.modal.ts","./src/app/shared/components/no-results/no-results.component.html","./src/app/shared/components/no-results/no-results.component.ts","./src/app/shared/components/op-content-loader/op-content-loader.component.ts","./src/app/shared/components/op-content-loader/op-content-loader.component.html","./src/app/shared/components/op-content-loader/openproject-content-loader.module.ts","./src/app/shared/components/op-context-menu/handlers/op-context-menu-trigger.directive.ts","./src/app/shared/components/op-context-menu/handlers/wp-create-settings-menu.directive.ts","./src/app/shared/components/op-context-menu/icon-triggered-context-menu/icon-triggered-context-menu.component.ts","./src/app/shared/components/op-context-menu/icon-triggered-context-menu/icon-triggered-context-menu.component.html","./src/app/shared/components/op-context-menu/op-context-menu-handler.ts","./src/app/shared/components/op-context-menu/op-context-menu.html","./src/app/shared/components/op-context-menu/op-context-menu.component.ts","./src/app/shared/components/op-context-menu/op-context-menu.service.ts","./src/app/shared/components/op-context-menu/op-context-menu.types.ts","./src/app/features/work-packages/services/work-package-authorization.service.ts","./src/app/shared/components/op-context-menu/wp-context-menu/wp-single-context-menu.ts","./src/app/shared/components/op-context-menu/wp-context-menu/wp-static-context-menu-actions.ts","./src/app/shared/components/op-context-menu/wp-context-menu/wp-view-context-menu.directive.ts","./src/app/shared/components/op-date-picker/date-picker.directive.ts","./src/app/shared/components/op-date-picker/date-picker.module.ts","./src/app/shared/components/op-date-picker/datepicker.ts","./src/app/shared/components/op-date-picker/op-range-date-picker/op-range-date-picker.component.ts","./src/app/shared/components/op-date-picker/op-range-date-picker/op-range-date-picker.component.html","./src/app/shared/components/op-date-picker/op-single-date-picker/op-single-date-picker.component.ts","./src/app/shared/components/op-view-select/op-static-queries.service.ts","./src/app/shared/components/principal/principal-helper.ts","./src/app/shared/components/principal/principal-renderer.service.ts","./src/app/shared/components/principal/principal-rendering.module.ts","./src/app/shared/components/principal/principal.component.ts","./src/app/shared/components/project-include/insert-in-list.ts","./src/app/spot/components/toggle/toggle.component.html","./src/app/spot/components/toggle/toggle.component.ts","./src/app/shared/components/project-include/list/project-include-list.component.html","./src/app/shared/components/project-include/list/project-include-list.component.ts","./src/app/shared/components/project-include/project-include.component.html","./src/app/shared/components/project-include/project-include.component.ts","./src/app/shared/components/project-include/recursive-sort.ts","./src/app/shared/components/resizer/resizer.component.html","./src/app/shared/components/resizer/resizer.component.ts","./src/app/shared/components/resizer/resizer/wp-resizer.component.ts","./src/app/shared/components/searchable-project-list/loading-project-list.component.ts","./src/app/shared/components/searchable-project-list/loading-project-list.component.html","./src/app/shared/components/searchable-project-list/searchable-project-list.service.ts","./src/app/shared/components/table-pagination/pagination-instance.ts","./src/app/shared/components/table-pagination/pagination-service.ts","./src/app/shared/components/tabs/openproject-tabs.module.ts","./src/app/shared/components/tabs/scrollable-tabs/scrollable-tabs.component.html","./src/app/shared/components/tabs/scrollable-tabs/scrollable-tabs.component.ts","./src/app/shared/components/tabs/tab-badges/tab-count.component.html","./src/app/shared/components/tabs/tab-badges/tab-count.component.ts","./src/app/shared/components/time_entries/shared/modal/base.modal.html","./src/app/shared/components/time_entries/create/create.modal.ts","./src/app/shared/components/time_entries/create/create.service.ts","./src/app/shared/components/time_entries/edit/edit.modal.ts","./src/app/shared/components/time_entries/edit/edit.service.ts","./src/app/shared/components/time_entries/form/form.component.html","./src/app/shared/components/time_entries/form/form.component.ts","./src/app/shared/components/time_entries/openproject-time-entries.module.ts","./src/app/shared/components/time_entries/shared/modal/base.modal.ts","./src/app/shared/components/toaster/toast.service.ts","./src/app/shared/components/user-link/user-link.component.ts","./src/app/shared/directives/focus/autofocus.directive.ts","./src/app/shared/directives/focus/contain-helpers.ts","./src/app/shared/directives/focus/focus-helper.ts","./src/app/shared/directives/focus/focus-within.directive.ts","./src/app/shared/directives/focus/focus.module.ts","./src/app/shared/directives/highlight-col/highlight-col.directive.ts","./src/app/shared/directives/search-highlight.directive.ts","./src/app/shared/helpers/angular/inject-field.decorator.ts","./src/app/shared/helpers/angular/tracking-functions.ts","./src/app/shared/helpers/angular/until-destroyed.mixin.ts","./src/app/shared/helpers/api-v3/api-v3-filter-builder.ts","./src/app/shared/helpers/debug_output.ts","./src/app/shared/helpers/dom/set-window-cursor.helper.ts","./src/app/shared/helpers/drag-and-drop/dom-autoscroll.service.ts","./src/app/shared/helpers/drag-and-drop/drag-and-drop.helpers.ts","./src/app/shared/helpers/drag-and-drop/drag-and-drop.service.ts","./src/app/shared/helpers/focus-helpers.ts","./src/app/shared/helpers/images/path-helper.ts","./src/app/shared/helpers/keyCodes.enum.ts","./src/app/shared/helpers/link-handling/link-handling.ts","./src/app/shared/helpers/op-icon-builder.ts","./src/app/shared/helpers/random-string.ts","./src/app/shared/helpers/rxjs/debounced-event-emitter.ts","./src/app/shared/helpers/set-click-position/set-click-position.ts","./src/app/shared/components/dynamic-bootstrap/dynamic-bootstrap.module.ts","./src/app/shared/shared.module.ts","./src/app/spot/components/checkbox/checkbox.component.ts","./src/app/spot/components/checkbox/checkbox.component.html","./src/app/spot/components/drop-modal/drop-modal.component.html","./src/app/spot/components/drop-modal/drop-modal.component.ts","./src/app/spot/components/form-field/form-field.component.html","./src/app/spot/components/form-field/form-field.component.ts","./src/app/spot/components/selector-field/selector-field.component.html","./src/app/spot/components/selector-field/selector-field.component.ts","./src/app/spot/components/switch/switch.component.ts","./src/app/spot/components/switch/switch.component.html","./src/app/spot/components/text-field/text-field.component.html","./src/app/spot/components/text-field/text-field.component.ts","./src/app/spot/components/tooltip/tooltip.component.html","./src/app/spot/components/tooltip/tooltip.component.ts","./src/app/spot/drop-alignment-options.ts","./src/app/spot/spot.module.ts","./src/environments/environment.prod.ts","./src/app/shared/components/grids/areas/grid-area.ts","./src/app/shared/components/grids/areas/grid-widget-area.ts","./src/app/shared/components/grids/areas/grid-gap.ts","./src/app/shared/components/grids/grid/area.service.ts","./src/app/shared/components/grids/widgets/header/header.component.ts","./src/app/shared/components/grids/widgets/header/header.component.html","./src/app/shared/components/grids/grid/remove-widget.service.ts","./src/app/shared/components/grids/widgets/menu/widget-abstract-menu.component.ts","./src/app/shared/components/grids/widgets/menu/widget-menu.component.html","./src/app/shared/components/grids/widgets/menu/widget-menu.component.ts","./src/app/shared/components/grids/widgets/wp-calendar/wp-calendar.component.ts","./src/app/shared/components/grids/widgets/wp-calendar/wp-calendar.component.html","./src/app/shared/components/grids/widgets/time-entries/current-user/configuration-modal/services/configuration-modal/configuration-modal.service.ts","./src/app/shared/components/grids/widgets/time-entries/current-user/configuration-modal/configuration.modal.html","./src/app/shared/components/grids/widgets/time-entries/current-user/configuration-modal/configuration.modal.ts","./src/app/shared/components/grids/widgets/time-entries/current-user/time-entries-current-user-menu.component.ts","./src/app/features/calendar/te-calendar/te-calendar.template.html","./src/app/features/calendar/te-calendar/te-calendar.component.ts","./src/app/shared/components/grids/widgets/time-entries/current-user/time-entries-current-user.component.ts","./src/app/shared/components/grids/widgets/time-entries/current-user/time-entries-current-user.component.html","./src/app/shared/components/grids/widgets/widgets.service.ts","./src/app/shared/components/grids/widgets/documents/documents.component.html","./src/app/shared/components/grids/widgets/documents/documents.component.ts","./src/app/shared/components/grids/widgets/news/news.component.html","./src/app/shared/components/grids/widgets/news/news.component.ts","./src/app/shared/components/grids/grid/initialization.service.ts","./src/app/shared/components/work-package-graphs/configuration-modal/tabs/settings-tab.component.ts","./src/app/shared/components/work-package-graphs/configuration-modal/tabs/settings-tab.component.html","./src/app/shared/components/work-package-graphs/configuration-modal/tabs/filters-tab.component.ts","./src/app/shared/components/work-package-graphs/configuration-modal/tabs/filters-tab.component.html","./src/app/shared/components/work-package-graphs/configuration/wp-graph-configuration.ts","./src/app/shared/components/work-package-graphs/configuration/wp-graph-configuration.service.ts","./src/app/shared/components/work-package-graphs/configuration-modal/wp-graph-configuration.modal.ts","./src/app/shared/components/grids/widgets/menu/wp-set-menu.component.ts","./src/app/shared/components/grids/widgets/wp-graph/wp-graph-menu.component.ts","./src/app/shared/components/work-package-graphs/embedded/wp-embedded-graph.html","./src/app/shared/components/work-package-graphs/embedded/wp-embedded-graph.component.ts","./src/app/shared/components/grids/widgets/wp-graph/wp-graph.component.ts","./src/app/shared/components/grids/widgets/wp-graph/wp-graph.component.html","./src/app/shared/components/grids/widgets/wp-table/wp-table-menu.component.ts","./src/app/shared/components/grids/widgets/wp-table/wp-table.component.html","./src/app/shared/components/grids/widgets/wp-table/wp-table.component.ts","./src/app/shared/components/grids/widgets/wp-table/wp-table-qs.component.ts","./src/app/shared/components/grids/widgets/wp-table/wp-table-qs.component.html","./src/app/shared/components/work-package-graphs/configuration-modal/tabs/abstract-query-spaced-tab.component.ts","./src/app/shared/components/work-package-graphs/configuration-modal/tabs/filters-tab-inner.component.html","./src/app/shared/components/work-package-graphs/configuration-modal/tabs/filters-tab-inner.component.ts","./src/app/shared/components/work-package-graphs/configuration-modal/tabs/settings-tab-inner.component.html","./src/app/shared/components/work-package-graphs/configuration-modal/tabs/settings-tab-inner.component.ts","./src/app/shared/components/work-package-graphs/openproject-work-package-graphs.module.ts","./src/app/shared/components/grids/widgets/project-description/project-description.component.html","./src/app/shared/components/grids/widgets/project-description/project-description.component.ts","./src/app/shared/components/work-package-graphs/overview/wp-overview-graph.template.html","./src/app/shared/components/work-package-graphs/overview/wp-overview-graph.component.ts","./src/app/shared/components/grids/widgets/wp-overview/wp-overview.component.ts","./src/app/shared/components/grids/widgets/wp-overview/wp-overview.component.html","./src/app/shared/components/grids/widgets/custom-text/custom-text-edit-field.service.ts","./src/app/shared/components/grids/widgets/custom-text/custom-text.component.html","./src/app/shared/components/grids/widgets/custom-text/custom-text.component.ts","./src/app/shared/components/grids/widgets/project-details/project-details.component.html","./src/app/shared/components/grids/widgets/project-details/project-details.component.ts","./src/app/shared/components/grids/widgets/time-entries/list/time-entries-list.component.ts","./src/app/shared/components/grids/widgets/time-entries/list/time-entries-list.component.html","./src/app/shared/components/grids/widgets/time-entries/project/time-entries-project.component.ts","./src/app/shared/components/grids/widgets/subprojects/subprojects.component.html","./src/app/shared/components/grids/widgets/subprojects/subprojects.component.ts","./src/app/shared/components/grids/widgets/members/members.component.html","./src/app/shared/components/grids/widgets/members/members.component.ts","./src/app/shared/components/grids/widgets/project-status/project-status.component.html","./src/app/shared/components/grids/widgets/project-status/project-status.component.ts","./src/app/shared/components/grids/openproject-grids.module.ts","./src/app/core/routing/base/application-base.component.ts","./src/app/features/user-preferences/user-preferences.lazy-routes.ts","./src/app/features/in-app-notifications/in-app-notifications.lazy-routes.ts","./src/app/features/team-planner/team-planner/team-planner.lazy-routes.ts","./src/app/core/routing/openproject.routes.ts","./src/app/features/calendar/calendar.lazy-routes.ts","./src/app/shared/helpers/routing/mobile-guard.helper.ts","./src/app/core/routing/openproject-router.module.ts","./src/app/features/work-packages/routing/wp-full-view/wp-full-view.html","./src/app/features/work-packages/routing/wp-full-view/wp-full-view.component.ts","./src/app/shared/components/op-context-menu/handlers/wp-view-dropdown-menu.directive.ts","./src/app/features/work-packages/components/wp-buttons/wp-view-toggle-button/work-package-view-toggle-button.component.ts","./src/app/features/work-packages/components/wp-buttons/wp-details-view-button/wp-details-view-button.component.ts","./src/app/features/work-packages/components/wp-buttons/wp-timeline-toggle-button/wp-timeline-toggle-button.html","./src/app/features/work-packages/components/wp-buttons/wp-timeline-toggle-button/wp-timeline-toggle-button.component.ts","./src/app/shared/components/op-context-menu/handlers/wp-group-toggle-dropdown-menu.directive.ts","./src/app/features/work-packages/components/wp-buttons/wp-fold-toggle-button/wp-fold-toggle-button.component.ts","./src/app/features/work-packages/routing/wp-view-page/wp-view-page.component.ts","./src/app/features/work-packages/components/wp-copy/wp-copy-full-view.component.ts","./src/app/features/work-packages/routing/work-packages-routes.ts","./src/app/features/work-packages/openproject-work-package-routes.module.ts","./src/app/core/global_search/services/global-search.service.ts","./src/app/core/global_search/openproject-global-search.module.ts","./src/app/shared/components/grids/widgets/add/add.modal.html","./src/app/shared/components/grids/widgets/add/add.modal.ts","./src/app/shared/components/grids/grid/move.service.ts","./src/app/shared/components/grids/grid/drag-and-drop.service.ts","./src/app/shared/components/grids/grid/resize.service.ts","./src/app/shared/components/grids/grid/add-widget.service.ts","./src/app/shared/components/grids/grid/page/grid-page.component.ts","./src/app/shared/components/grids/grid/grid.component.html","./src/app/shared/components/grids/grid/grid.component.ts","./src/app/shared/components/grids/grid/page/grid-page.component.html","./src/app/features/dashboards/dashboard/dashboard.component.ts","./src/app/features/dashboards/openproject-dashboards.module.ts","./src/app/shared/components/modals/preview-modal/wp-preview-modal/wp-preview.modal.html","./src/app/shared/components/modals/preview-modal/wp-preview-modal/wp-preview.modal.ts","./src/app/core/setup/globals/global-listeners/preview-trigger.service.ts","./src/app/features/overview/overview.component.ts","./src/app/features/overview/openproject-overview.module.ts","./src/app/features/my-page/my-page.component.ts","./src/app/features/my-page/openproject-my-page.module.ts","./src/app/shared/directives/a11y/keyboard-shortcut.service.ts","./src/app/shared/components/autocompleter/members-autocompleter/members.module.ts","./src/app/core/augmenting/services/path-script.augment.service.ts","./src/app/core/augmenting/openproject-augmenting.module.ts","./src/app/features/invite-user-modal/invite-user-modal-augment.service.ts","./src/app/shared/components/option-list/option-list.component.html","./src/app/shared/components/option-list/option-list.component.ts","./src/app/features/invite-user-modal/project-selection/project-selection.component.html","./src/app/features/invite-user-modal/project-selection/project-selection.component.ts","./src/app/features/invite-user-modal/project-selection/project-allowed.validator.ts","./src/app/features/invite-user-modal/role/role-search.component.html","./src/app/features/invite-user-modal/role/role-search.component.ts","./src/app/spot/components/form-field/form-binding.directive.ts","./src/app/features/invite-user-modal/principal/principal-search.component.html","./src/app/features/invite-user-modal/principal/principal-search.component.ts","./src/app/features/invite-user-modal/principal/principal.component.html","./src/app/features/invite-user-modal/principal/principal.component.ts","./src/app/features/invite-user-modal/summary/summary.component.html","./src/app/features/invite-user-modal/summary/summary.component.ts","./src/app/features/invite-user-modal/success/success.component.ts","./src/app/features/invite-user-modal/success/success.component.html","./src/app/features/invite-user-modal/invite-user-modal.module.ts","./src/app/features/bim/revit_add_in/revit-add-in-settings-button.service.ts","./src/app/features/enterprise/openproject-enterprise.module.ts","./src/app/core/main-menu/main-menu-navigation.service.ts","./src/app/features/admin/types/type-banner.service.ts","./src/app/features/admin/types/group-edit-in-place.html","./src/app/features/admin/types/group-edit-in-place.component.ts","./src/app/features/admin/types/attribute-group.component.html","./src/app/features/admin/types/attribute-group.component.ts","./src/app/core/top-menu/top-menu.service.ts","./src/app/core/setup/globals/global-listeners/action-menu.ts","./src/app/features/admin/types/type-form-configuration.html","./src/app/features/admin/types/type-form-configuration.component.ts","./src/app/features/admin/types/query-group.component.ts","./src/app/features/admin/types/query-group.component.html","./src/app/features/admin/openproject-admin.module.ts","./src/app/features/work-packages/components/wp-table/embedded/wp-embedded-table-entry.component.ts","./src/app/features/work-packages/components/wp-table/embedded/embedded-tables-macro.component.ts","./src/app/core/global_search/global-search-work-packages.component.ts","./src/app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.html","./src/app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.component.ts","./src/app/shared/components/sidemenu/sidemenu.component.html","./src/app/shared/components/sidemenu/sidemenu.component.ts","./src/app/features/boards/boards-sidebar/boards-menu.component.html","./src/app/features/boards/boards-sidebar/boards-menu.component.ts","./src/app/core/global_search/global-search-work-packages-entry.component.ts","./src/app/shared/components/toaster/upload-progress.component.ts","./src/app/shared/components/toaster/toast.component.html","./src/app/shared/components/toaster/toast.component.ts","./src/app/shared/components/toaster/toasts-container.component.ts","./src/app/shared/components/editor/components/ckeditor-augmented-textarea/ckeditor-augmented-textarea.html","./src/app/shared/components/editor/components/ckeditor-augmented-textarea/ckeditor-augmented-textarea.component.ts","./src/app/shared/components/persistent-toggle/persistent-toggle.component.ts","./src/app/shared/components/hide-section/hide-section.service.ts","./src/app/shared/components/hide-section/hide-section-link/hide-section-link.component.ts","./src/app/shared/components/hide-section/hide-section-link/hide-section-link.component.html","./src/app/shared/components/hide-section/show-section-dropdown.component.ts","./src/app/shared/components/hide-section/add-section-dropdown/add-section-dropdown.component.html","./src/app/shared/components/hide-section/add-section-dropdown/add-section-dropdown.component.ts","./src/app/shared/components/tabs/content-tabs/content-tabs.component.ts","./src/app/shared/components/copy-to-clipboard/copy-to-clipboard.directive.ts","./src/app/core/global_search/input/global-search-input.component.html","./src/app/core/global_search/input/global-search-input.component.ts","./src/app/shared/components/collapsible-section/collapsible-section.component.ts","./src/app/shared/components/collapsible-section/collapsible-section.html","./src/app/shared/components/header-project-select/list/header-project-select-list.component.html","./src/app/shared/components/header-project-select/list/header-project-select-list.component.ts","./src/app/shared/components/header-project-select/header-project-select.component.html","./src/app/shared/components/header-project-select/header-project-select.component.ts","./src/app/shared/components/remote-field-updater/remote-field-updater.component.ts","./src/app/shared/components/op-view-select/op-view-select.component.ts","./src/app/shared/components/op-view-select/op-view-select.template.html","./src/app/core/global_search/title/global-search-title.component.ts","./src/app/core/global_search/title/global-search-title.component.html","./src/app/core/global_search/tabs/global-search-tabs.component.ts","./src/app/shared/components/autocompleter/members-autocompleter/members-autocompleter.component.ts","./src/app/shared/components/time_entries/edit/trigger-actions-entry.component.ts","./src/app/shared/components/fields/macros/attribute-model-loader.service.ts","./src/app/shared/components/fields/display/display-field.component.ts","./src/app/shared/components/fields/macros/attribute-value-macro.html","./src/app/shared/components/fields/macros/attribute-value-macro.component.ts","./src/app/shared/components/fields/macros/attribute-label-macro.html","./src/app/shared/components/fields/macros/attribute-label-macro.component.ts","./src/app/shared/helpers/string-helpers.ts","./src/app/shared/components/fields/macros/work-package-quickinfo-macro.html","./src/app/shared/components/fields/macros/work-package-quickinfo-macro.component.ts","./src/app/core/backup/op-backup.service.ts","./src/app/core/setup/globals/components/admin/backup.component.ts","./src/app/core/setup/globals/components/admin/backup.component.html","./src/app/features/enterprise/enterprise-base.component.html","./src/app/features/enterprise/enterprise-base.component.ts","./src/app/features/enterprise/enterprise-active-trial/ee-active-saved-trial.component.ts","./src/app/features/homescreen/blocks/new-features.component.ts","./src/app/features/bim/bcf/bcf-constants.const.ts","./src/app/core/main-menu/main-menu-toggle.component.html","./src/app/core/main-menu/main-menu-toggle.component.ts","./src/app/shared/components/resizer/resizer/main-menu-resizer.component.ts","./src/app/features/admin/editable-query-props/editable-query-props.component.ts","./src/app/features/admin/editable-query-props/editable-query-props.component.html","./src/app/features/in-app-notifications/bell/in-app-notification-bell.component.html","./src/app/features/in-app-notifications/bell/in-app-notification-bell.component.ts","./src/app/features/in-app-notifications/center/menu/state/ian-menu.store.ts","./src/app/features/in-app-notifications/center/menu/state/ian-menu.service.ts","./src/app/features/in-app-notifications/center/menu/menu.component.ts","./src/app/features/team-planner/team-planner/sidemenu/team-planner-sidemenu.component.html","./src/app/features/in-app-notifications/center/menu/menu.component.html","./src/app/features/team-planner/team-planner/sidemenu/team-planner-sidemenu.component.ts","./src/app/features/calendar/sidemenu/calendar-sidemenu.component.html","./src/app/features/calendar/sidemenu/calendar-sidemenu.component.ts","./src/app/shared/components/modal/modal-overlay.component.ts","./src/app/shared/components/modal/modal-overlay.component.html","./src/app/core/setup/global-dynamic-components.const.ts","./src/app/core/html-sanitize/html-sanitize.service.ts","./src/app/shared/components/modals/request-for-confirmation/password-confirmation.modal.ts","./src/app/shared/components/modals/request-for-confirmation/password-confirmation.modal.html","./src/app/features/plugins/plugin-context.ts","./src/app/features/plugins/openproject-plugins.module.ts","./src/app/features/plugins/linked/budgets/augment/cost-budget-subform.augment.service.ts","./src/app/features/plugins/linked/budgets/augment/cost-subform.augment.service.ts","./src/app/features/plugins/linked/budgets/hal/resources/budget-resource.ts","./src/app/features/plugins/linked/budgets/main.ts","./src/app/features/plugins/linked/budgets/augment/planned-costs-form.ts","./src/app/features/plugins/linked/costs/wp-display/costs-by-type-display-field.module.ts","./src/app/features/plugins/linked/costs/wp-display/currency-display-field.module.ts","./src/app/features/plugins/linked/costs/main.ts","./src/app/shared/helpers/images/resizer.ts","./src/app/features/plugins/linked/openproject-avatars/avatar-upload-form/avatar-upload-form.html","./src/app/features/plugins/linked/openproject-avatars/avatar-upload-form/avatar-upload-form.component.ts","./src/app/features/plugins/linked/openproject-avatars/main.ts","./src/app/features/plugins/linked/openproject-documents/hal/resources/document-resource.ts","./src/app/features/plugins/linked/openproject-documents/main.ts","./src/app/features/plugins/linked/openproject-github_integration/git-actions/git-actions.service.ts","./src/app/features/plugins/linked/openproject-github_integration/git-actions-menu/git-actions-menu.template.html","./src/app/features/plugins/linked/openproject-github_integration/git-actions-menu/git-actions-menu.component.ts","./src/app/features/plugins/linked/openproject-github_integration/git-actions-menu/git-actions-menu.directive.ts","./src/app/features/plugins/linked/openproject-github_integration/tab-header/tab-header.component.ts","./src/app/features/plugins/linked/openproject-github_integration/tab-header/tab-header.template.html","./src/app/features/plugins/linked/openproject-github_integration/pull-request/pull-request.component.html","./src/app/features/plugins/linked/openproject-github_integration/pull-request/pull-request.component.ts","./src/app/features/plugins/linked/openproject-github_integration/tab-prs/tab-prs.template.html","./src/app/features/plugins/linked/openproject-github_integration/tab-prs/tab-prs.component.ts","./src/app/features/plugins/linked/openproject-github_integration/github-tab/github-tab.component.ts","./src/app/features/plugins/linked/openproject-github_integration/github-tab/github-tab.template.html","./src/app/features/plugins/linked/openproject-github_integration/tab-prs/wp-github-prs.service.ts","./src/app/features/plugins/linked/openproject-github_integration/main.ts","./src/app/features/plugins/linked-plugins.module.ts","./src/app/core/state/days/day.store.ts","./src/app/core/state/days/day.service.ts","./src/app/core/state/openproject-state.module.ts","./src/app/app.module.ts","./src/app/core/errors/error-reporter-base.ts","./src/app/core/errors/sentry/sentry-reporter.ts","./src/app/core/errors/appsignal/appsignal-reporter.ts","./src/app/core/errors/local/local-reporter.ts","./src/app/core/setup/globals/global-listeners/request-for-confirmation.ts","./src/app/core/setup/globals/global-listeners/toggable-fieldset.ts","./src/app/core/setup/globals/global-listeners/setup-server-response.ts","./src/app/core/setup/globals/onboarding/onboarding_tour_trigger.ts","./src/app/core/setup/globals/global-listeners.ts","./src/app/core/setup/globals/global-listeners/augmented-date-picker.ts","./src/app/core/setup/globals/global-listeners/link-hijacking.ts","./src/app/core/setup/globals/global-listeners/refresh-on-form-changes.ts","./src/app/core/setup/globals/global-listeners/top-menu-scroll.ts","./src/app/core/setup/globals/global-listeners/settings.ts","./src/app/core/setup/globals/global-listeners/color-preview.ts","./src/app/core/setup/globals/global-listeners/danger-zone-validation.ts","./src/main.ts","./src/app/core/errors/configure-reporter.ts","./src/app/core/setup/init-locale.ts","./node_modules/codemirror/mode|lazy|/^/.*/.*/.js$/|groupOptions:%20%7B%7D|namespace%20object","./src/vendor/i18n.js-exposed","/app/frontend/node_modules/moment/locale|sync|/^//.*$/","./src/app/core/augmenting/dynamic-scripts|lazy|/^/.*$/|groupOptions:%20%7B%7D|namespace%20object","./src/locales|lazy|/^/.*/.js$/|groupOptions:%20%7B%7D|namespace%20object","./src/vendor/ckeditor/translations|lazy|/^/.*/.js$/|groupOptions:%20%7B%7D|namespace%20object"],"sourcesContent":["function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncaught exception popping up in devtools\n\treturn Promise.resolve().then(() => {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t});\n}\nwebpackEmptyAsyncContext.keys = () => ([]);\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 98255;\nmodule.exports = webpackEmptyAsyncContext;","// I18n.js\n// =======\n//\n// This small library provides the Rails I18n API on the Javascript.\n// You don't actually have to use Rails (or even Ruby) to use I18n.js.\n// Just make sure you export all translations in an object like this:\n//\n// I18n.translations.en = {\n// hello: \"Hello World\"\n// };\n//\n// See tests for specific formatting like numbers and dates.\n//\n\n// Using UMD pattern from\n// https://github.com/umdjs/umd#regular-module\n// `returnExports.js` version\n;(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(\"i18n\", function(){ return factory(root);});\n } else if (typeof module === 'object' && module.exports) {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory(root);\n } else {\n // Browser globals (root is window)\n root.I18n = factory(root);\n }\n}(this, function(global) {\n \"use strict\";\n\n // Use previously defined object if exists in current scope\n var I18n = global && global.I18n || {};\n\n // Just cache the Array#slice function.\n var slice = Array.prototype.slice;\n\n // Apply number padding.\n var padding = function(number) {\n return (\"0\" + number.toString()).substr(-2);\n };\n\n // Improved toFixed number rounding function with support for unprecise floating points\n // JavaScript's standard toFixed function does not round certain numbers correctly (for example 0.105 with precision 2).\n var toFixed = function(number, precision) {\n return decimalAdjust('round', number, -precision).toFixed(precision);\n };\n\n // Is a given variable an object?\n // Borrowed from Underscore.js\n var isObject = function(obj) {\n var type = typeof obj;\n return type === 'function' || type === 'object'\n };\n\n var isFunction = function(func) {\n var type = typeof func;\n return type === 'function'\n };\n\n // Check if value is different than undefined and null;\n var isSet = function(value) {\n return typeof(value) !== 'undefined' && value !== null;\n };\n\n // Is a given value an array?\n // Borrowed from Underscore.js\n var isArray = function(val) {\n if (Array.isArray) {\n return Array.isArray(val);\n };\n return Object.prototype.toString.call(val) === '[object Array]';\n };\n\n var isString = function(val) {\n return typeof value == 'string' || Object.prototype.toString.call(val) === '[object String]';\n };\n\n var isNumber = function(val) {\n return typeof val == 'number' || Object.prototype.toString.call(val) === '[object Number]';\n };\n\n var isBoolean = function(val) {\n return val === true || val === false;\n };\n\n var decimalAdjust = function(type, value, exp) {\n // If the exp is undefined or zero...\n if (typeof exp === 'undefined' || +exp === 0) {\n return Math[type](value);\n }\n value = +value;\n exp = +exp;\n // If the value is not a number or the exp is not an integer...\n if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {\n return NaN;\n }\n // Shift\n value = value.toString().split('e');\n value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp)));\n // Shift back\n value = value.toString().split('e');\n return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp));\n }\n\n var lazyEvaluate = function(message, scope) {\n if (isFunction(message)) {\n return message(scope);\n } else {\n return message;\n }\n }\n\n var merge = function (dest, obj) {\n var key, value;\n for (key in obj) if (obj.hasOwnProperty(key)) {\n value = obj[key];\n if (isString(value) || isNumber(value) || isBoolean(value) || isArray(value)) {\n dest[key] = value;\n } else {\n if (dest[key] == null) dest[key] = {};\n merge(dest[key], value);\n }\n }\n return dest;\n };\n\n // Set default days/months translations.\n var DATE = {\n day_names: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"]\n , abbr_day_names: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"]\n , month_names: [null, \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"]\n , abbr_month_names: [null, \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n , meridian: [\"AM\", \"PM\"]\n };\n\n // Set default number format.\n var NUMBER_FORMAT = {\n precision: 3\n , separator: \".\"\n , delimiter: \",\"\n , strip_insignificant_zeros: false\n };\n\n // Set default currency format.\n var CURRENCY_FORMAT = {\n unit: \"$\"\n , precision: 2\n , format: \"%u%n\"\n , sign_first: true\n , delimiter: \",\"\n , separator: \".\"\n };\n\n // Set default percentage format.\n var PERCENTAGE_FORMAT = {\n unit: \"%\"\n , precision: 3\n , format: \"%n%u\"\n , separator: \".\"\n , delimiter: \"\"\n };\n\n // Set default size units.\n var SIZE_UNITS = [null, \"kb\", \"mb\", \"gb\", \"tb\"];\n\n // Other default options\n var DEFAULT_OPTIONS = {\n // Set default locale. This locale will be used when fallback is enabled and\n // the translation doesn't exist in a particular locale.\n defaultLocale: \"en\"\n // Set the current locale to `en`.\n , locale: \"en\"\n // Set the translation key separator.\n , defaultSeparator: \".\"\n // Set the placeholder format. Accepts `{{placeholder}}` and `%{placeholder}`.\n , placeholder: /(?:\\{\\{|%\\{)(.*?)(?:\\}\\}?)/gm\n // Set if engine should fallback to the default locale when a translation\n // is missing.\n , fallbacks: false\n // Set the default translation object.\n , translations: {}\n // Set missing translation behavior. 'message' will display a message\n // that the translation is missing, 'guess' will try to guess the string\n , missingBehaviour: 'message'\n // if you use missingBehaviour with 'message', but want to know that the\n // string is actually missing for testing purposes, you can prefix the\n // guessed string by setting the value here. By default, no prefix!\n , missingTranslationPrefix: ''\n };\n\n // Set default locale. This locale will be used when fallback is enabled and\n // the translation doesn't exist in a particular locale.\n I18n.reset = function() {\n var key;\n for (key in DEFAULT_OPTIONS) {\n this[key] = DEFAULT_OPTIONS[key];\n }\n };\n\n // Much like `reset`, but only assign options if not already assigned\n I18n.initializeOptions = function() {\n var key;\n for (key in DEFAULT_OPTIONS) if (!isSet(this[key])) {\n this[key] = DEFAULT_OPTIONS[key];\n }\n };\n I18n.initializeOptions();\n\n // Return a list of all locales that must be tried before returning the\n // missing translation message. By default, this will consider the inline option,\n // current locale and fallback locale.\n //\n // I18n.locales.get(\"de-DE\");\n // // [\"de-DE\", \"de\", \"en\"]\n //\n // You can define custom rules for any locale. Just make sure you return a array\n // containing all locales.\n //\n // // Default the Wookie locale to English.\n // I18n.locales[\"wk\"] = function(locale) {\n // return [\"en\"];\n // };\n //\n I18n.locales = {};\n\n // Retrieve locales based on inline locale, current locale or default to\n // I18n's detection.\n I18n.locales.get = function(locale) {\n var result = this[locale] || this[I18n.locale] || this[\"default\"];\n\n if (isFunction(result)) {\n result = result(locale);\n }\n\n if (isArray(result) === false) {\n result = [result];\n }\n\n return result;\n };\n\n // The default locale list.\n I18n.locales[\"default\"] = function(locale) {\n var locales = []\n , list = []\n ;\n\n // Handle the inline locale option that can be provided to\n // the `I18n.t` options.\n if (locale) {\n locales.push(locale);\n }\n\n // Add the current locale to the list.\n if (!locale && I18n.locale) {\n locales.push(I18n.locale);\n }\n\n // Add the default locale if fallback strategy is enabled.\n if (I18n.fallbacks && I18n.defaultLocale) {\n locales.push(I18n.defaultLocale);\n }\n\n // Locale code format 1:\n // According to RFC4646 (http://www.ietf.org/rfc/rfc4646.txt)\n // language codes for Traditional Chinese should be `zh-Hant`\n //\n // But due to backward compatibility\n // We use older version of IETF language tag\n // @see http://www.w3.org/TR/html401/struct/dirlang.html\n // @see http://en.wikipedia.org/wiki/IETF_language_tag\n //\n // Format: `language-code = primary-code ( \"-\" subcode )*`\n //\n // primary-code uses ISO639-1\n // @see http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\n // @see http://www.iso.org/iso/home/standards/language_codes.htm\n //\n // subcode uses ISO 3166-1 alpha-2\n // @see http://en.wikipedia.org/wiki/ISO_3166\n // @see http://www.iso.org/iso/country_codes.htm\n //\n // @note\n // subcode can be in upper case or lower case\n // defining it in upper case is a convention only\n\n\n // Locale code format 2:\n // Format: `code = primary-code ( \"-\" region-code )*`\n // primary-code uses ISO 639-1\n // script-code uses ISO 15924\n // region-code uses ISO 3166-1 alpha-2\n // Example: zh-Hant-TW, en-HK, zh-Hant-CN\n //\n // It is similar to RFC4646 (or actually the same),\n // but seems to be limited to language, script, region\n\n // Compute each locale with its country code.\n // So this will return an array containing\n // `de-DE` and `de`\n // or\n // `zh-hans-tw`, `zh-hans`, `zh`\n // locales.\n locales.forEach(function(locale) {\n var localeParts = locale.split(\"-\");\n var firstFallback = null;\n var secondFallback = null;\n if (localeParts.length === 3) {\n firstFallback = [\n localeParts[0],\n localeParts[1]\n ].join(\"-\");\n secondFallback = localeParts[0];\n }\n else if (localeParts.length === 2) {\n firstFallback = localeParts[0];\n }\n\n if (list.indexOf(locale) === -1) {\n list.push(locale);\n }\n\n if (! I18n.fallbacks) {\n return;\n }\n\n [\n firstFallback,\n secondFallback\n ].forEach(function(nullableFallbackLocale) {\n // We don't want null values\n if (typeof nullableFallbackLocale === \"undefined\") { return; }\n if (nullableFallbackLocale === null) { return; }\n // We don't want duplicate values\n //\n // Comparing with `locale` first is faster than\n // checking whether value's presence in the list\n if (nullableFallbackLocale === locale) { return; }\n if (list.indexOf(nullableFallbackLocale) !== -1) { return; }\n\n list.push(nullableFallbackLocale);\n });\n });\n\n // No locales set? English it is.\n if (!locales.length) {\n locales.push(\"en\");\n }\n\n return list;\n };\n\n // Hold pluralization rules.\n I18n.pluralization = {};\n\n // Return the pluralizer for a specific locale.\n // If no specify locale is found, then I18n's default will be used.\n I18n.pluralization.get = function(locale) {\n return this[locale] || this[I18n.locale] || this[\"default\"];\n };\n\n // The default pluralizer rule.\n // It detects the `zero`, `one`, and `other` scopes.\n I18n.pluralization[\"default\"] = function(count) {\n switch (count) {\n case 0: return [\"zero\", \"other\"];\n case 1: return [\"one\"];\n default: return [\"other\"];\n }\n };\n\n // Return current locale. If no locale has been set, then\n // the current locale will be the default locale.\n I18n.currentLocale = function() {\n return this.locale || this.defaultLocale;\n };\n\n // Check if value is different than undefined and null;\n I18n.isSet = isSet;\n\n // Find and process the translation using the provided scope and options.\n // This is used internally by some functions and should not be used as an\n // public API.\n I18n.lookup = function(scope, options) {\n options = options || {}\n\n var locales = this.locales.get(options.locale).slice()\n , requestedLocale = locales[0]\n , locale\n , scopes\n , fullScope\n , translations\n ;\n\n fullScope = this.getFullScope(scope, options);\n\n while (locales.length) {\n locale = locales.shift();\n scopes = fullScope.split(this.defaultSeparator);\n translations = this.translations[locale];\n\n if (!translations) {\n continue;\n }\n while (scopes.length) {\n translations = translations[scopes.shift()];\n\n if (translations === undefined || translations === null) {\n break;\n }\n }\n\n if (translations !== undefined && translations !== null) {\n return translations;\n }\n }\n\n if (isSet(options.defaultValue)) {\n return lazyEvaluate(options.defaultValue, scope);\n }\n };\n\n // lookup pluralization rule key into translations\n I18n.pluralizationLookupWithoutFallback = function(count, locale, translations) {\n var pluralizer = this.pluralization.get(locale)\n , pluralizerKeys = pluralizer(count)\n , pluralizerKey\n , message;\n\n if (isObject(translations)) {\n while (pluralizerKeys.length) {\n pluralizerKey = pluralizerKeys.shift();\n if (isSet(translations[pluralizerKey])) {\n message = translations[pluralizerKey];\n break;\n }\n }\n }\n\n return message;\n };\n\n // Lookup dedicated to pluralization\n I18n.pluralizationLookup = function(count, scope, options) {\n options = options || {}\n var locales = this.locales.get(options.locale).slice()\n , requestedLocale = locales[0]\n , locale\n , scopes\n , translations\n , message\n ;\n scope = this.getFullScope(scope, options);\n\n while (locales.length) {\n locale = locales.shift();\n scopes = scope.split(this.defaultSeparator);\n translations = this.translations[locale];\n\n if (!translations) {\n continue;\n }\n\n while (scopes.length) {\n translations = translations[scopes.shift()];\n if (!isObject(translations)) {\n break;\n }\n if (scopes.length == 0) {\n message = this.pluralizationLookupWithoutFallback(count, locale, translations);\n }\n }\n if (message != null && message != undefined) {\n break;\n }\n }\n\n if (message == null || message == undefined) {\n if (isSet(options.defaultValue)) {\n if (isObject(options.defaultValue)) {\n message = this.pluralizationLookupWithoutFallback(count, options.locale, options.defaultValue);\n } else {\n message = options.defaultValue;\n }\n translations = options.defaultValue;\n }\n }\n\n return { message: message, translations: translations };\n };\n\n // Rails changed the way the meridian is stored.\n // It started with `date.meridian` returning an array,\n // then it switched to `time.am` and `time.pm`.\n // This function abstracts this difference and returns\n // the correct meridian or the default value when none is provided.\n I18n.meridian = function() {\n var time = this.lookup(\"time\");\n var date = this.lookup(\"date\");\n\n if (time && time.am && time.pm) {\n return [time.am, time.pm];\n } else if (date && date.meridian) {\n return date.meridian;\n } else {\n return DATE.meridian;\n }\n };\n\n // Merge several hash options, checking if value is set before\n // overwriting any value. The precedence is from left to right.\n //\n // I18n.prepareOptions({name: \"John Doe\"}, {name: \"Mary Doe\", role: \"user\"});\n // #=> {name: \"John Doe\", role: \"user\"}\n //\n I18n.prepareOptions = function() {\n var args = slice.call(arguments)\n , options = {}\n , subject\n ;\n\n while (args.length) {\n subject = args.shift();\n\n if (typeof(subject) != \"object\") {\n continue;\n }\n\n for (var attr in subject) {\n if (!subject.hasOwnProperty(attr)) {\n continue;\n }\n\n if (isSet(options[attr])) {\n continue;\n }\n\n options[attr] = subject[attr];\n }\n }\n\n return options;\n };\n\n // Generate a list of translation options for default fallbacks.\n // `defaultValue` is also deleted from options as it is returned as part of\n // the translationOptions array.\n I18n.createTranslationOptions = function(scope, options) {\n var translationOptions = [{scope: scope}];\n\n // Defaults should be an array of hashes containing either\n // fallback scopes or messages\n if (isSet(options.defaults)) {\n translationOptions = translationOptions.concat(options.defaults);\n }\n\n // Maintain support for defaultValue. Since it is always a message\n // insert it in to the translation options as such.\n if (isSet(options.defaultValue)) {\n translationOptions.push({ message: options.defaultValue });\n }\n\n return translationOptions;\n };\n\n // Translate the given scope with the provided options.\n I18n.translate = function(scope, options) {\n options = options || {}\n\n var translationOptions = this.createTranslationOptions(scope, options);\n\n var translation;\n\n var optionsWithoutDefault = this.prepareOptions(options)\n delete optionsWithoutDefault.defaultValue\n\n // Iterate through the translation options until a translation\n // or message is found.\n var translationFound =\n translationOptions.some(function(translationOption) {\n if (isSet(translationOption.scope)) {\n translation = this.lookup(translationOption.scope, optionsWithoutDefault);\n } else if (isSet(translationOption.message)) {\n translation = lazyEvaluate(translationOption.message, scope);\n }\n\n if (translation !== undefined && translation !== null) {\n return true;\n }\n }, this);\n\n if (!translationFound) {\n return this.missingTranslation(scope, options);\n }\n\n if (typeof(translation) === \"string\") {\n translation = this.interpolate(translation, options);\n } else if (isObject(translation) && isSet(options.count)) {\n translation = this.pluralize(options.count, scope, options);\n }\n\n return translation;\n };\n\n // This function interpolates the all variables in the given message.\n I18n.interpolate = function(message, options) {\n options = options || {}\n var matches = message.match(this.placeholder)\n , placeholder\n , value\n , name\n , regex\n ;\n\n if (!matches) {\n return message;\n }\n\n var value;\n\n while (matches.length) {\n placeholder = matches.shift();\n name = placeholder.replace(this.placeholder, \"$1\");\n\n if (isSet(options[name])) {\n value = options[name].toString().replace(/\\$/gm, \"_#$#_\");\n } else if (name in options) {\n value = this.nullPlaceholder(placeholder, message, options);\n } else {\n value = this.missingPlaceholder(placeholder, message, options);\n }\n\n regex = new RegExp(placeholder.replace(/\\{/gm, \"\\\\{\").replace(/\\}/gm, \"\\\\}\"));\n message = message.replace(regex, value);\n }\n\n return message.replace(/_#\\$#_/g, \"$\");\n };\n\n // Pluralize the given scope using the `count` value.\n // The pluralized translation may have other placeholders,\n // which will be retrieved from `options`.\n I18n.pluralize = function(count, scope, options) {\n options = this.prepareOptions({count: String(count)}, options)\n var pluralizer, message, result;\n\n result = this.pluralizationLookup(count, scope, options);\n if (result.translations == undefined || result.translations == null) {\n return this.missingTranslation(scope, options);\n }\n\n if (result.message != undefined && result.message != null) {\n return this.interpolate(result.message, options);\n }\n else {\n pluralizer = this.pluralization.get(options.locale);\n return this.missingTranslation(scope + '.' + pluralizer(count)[0], options);\n }\n };\n\n // Return a missing translation message for the given parameters.\n I18n.missingTranslation = function(scope, options) {\n //guess intended string\n if(this.missingBehaviour == 'guess'){\n //get only the last portion of the scope\n var s = scope.split('.').slice(-1)[0];\n //replace underscore with space && camelcase with space and lowercase letter\n return (this.missingTranslationPrefix.length > 0 ? this.missingTranslationPrefix : '') +\n s.replace('_',' ').replace(/([a-z])([A-Z])/g,\n function(match, p1, p2) {return p1 + ' ' + p2.toLowerCase()} );\n }\n\n var localeForTranslation = (options != null && options.locale != null) ? options.locale : this.currentLocale();\n var fullScope = this.getFullScope(scope, options);\n var fullScopeWithLocale = [localeForTranslation, fullScope].join(this.defaultSeparator);\n\n return '[missing \"' + fullScopeWithLocale + '\" translation]';\n };\n\n // Return a missing placeholder message for given parameters\n I18n.missingPlaceholder = function(placeholder, message, options) {\n return \"[missing \" + placeholder + \" value]\";\n };\n\n I18n.nullPlaceholder = function() {\n return I18n.missingPlaceholder.apply(I18n, arguments);\n };\n\n // Format number using localization rules.\n // The options will be retrieved from the `number.format` scope.\n // If this isn't present, then the following options will be used:\n //\n // - `precision`: `3`\n // - `separator`: `\".\"`\n // - `delimiter`: `\",\"`\n // - `strip_insignificant_zeros`: `false`\n //\n // You can also override these options by providing the `options` argument.\n //\n I18n.toNumber = function(number, options) {\n options = this.prepareOptions(\n options\n , this.lookup(\"number.format\")\n , NUMBER_FORMAT\n );\n\n var negative = number < 0\n , string = toFixed(Math.abs(number), options.precision).toString()\n , parts = string.split(\".\")\n , precision\n , buffer = []\n , formattedNumber\n , format = options.format || \"%n\"\n , sign = negative ? \"-\" : \"\"\n ;\n\n number = parts[0];\n precision = parts[1];\n\n while (number.length > 0) {\n buffer.unshift(number.substr(Math.max(0, number.length - 3), 3));\n number = number.substr(0, number.length -3);\n }\n\n formattedNumber = buffer.join(options.delimiter);\n\n if (options.strip_insignificant_zeros && precision) {\n precision = precision.replace(/0+$/, \"\");\n }\n\n if (options.precision > 0 && precision) {\n formattedNumber += options.separator + precision;\n }\n\n if (options.sign_first) {\n format = \"%s\" + format;\n }\n else {\n format = format.replace(\"%n\", \"%s%n\");\n }\n\n formattedNumber = format\n .replace(\"%u\", options.unit)\n .replace(\"%n\", formattedNumber)\n .replace(\"%s\", sign)\n ;\n\n return formattedNumber;\n };\n\n // Format currency with localization rules.\n // The options will be retrieved from the `number.currency.format` and\n // `number.format` scopes, in that order.\n //\n // Any missing option will be retrieved from the `I18n.toNumber` defaults and\n // the following options:\n //\n // - `unit`: `\"$\"`\n // - `precision`: `2`\n // - `format`: `\"%u%n\"`\n // - `delimiter`: `\",\"`\n // - `separator`: `\".\"`\n //\n // You can also override these options by providing the `options` argument.\n //\n I18n.toCurrency = function(number, options) {\n options = this.prepareOptions(\n options\n , this.lookup(\"number.currency.format\")\n , this.lookup(\"number.format\")\n , CURRENCY_FORMAT\n );\n\n return this.toNumber(number, options);\n };\n\n // Localize several values.\n // You can provide the following scopes: `currency`, `number`, or `percentage`.\n // If you provide a scope that matches the `/^(date|time)/` regular expression\n // then the `value` will be converted by using the `I18n.toTime` function.\n //\n // It will default to the value's `toString` function.\n //\n I18n.localize = function(scope, value, options) {\n options || (options = {});\n\n switch (scope) {\n case \"currency\":\n return this.toCurrency(value);\n case \"number\":\n scope = this.lookup(\"number.format\");\n return this.toNumber(value, scope);\n case \"percentage\":\n return this.toPercentage(value);\n default:\n var localizedValue;\n\n if (scope.match(/^(date|time)/)) {\n localizedValue = this.toTime(scope, value);\n } else {\n localizedValue = value.toString();\n }\n\n return this.interpolate(localizedValue, options);\n }\n };\n\n // Parse a given `date` string into a JavaScript Date object.\n // This function is time zone aware.\n //\n // The following string formats are recognized:\n //\n // yyyy-mm-dd\n // yyyy-mm-dd[ T]hh:mm::ss\n // yyyy-mm-dd[ T]hh:mm::ss\n // yyyy-mm-dd[ T]hh:mm::ssZ\n // yyyy-mm-dd[ T]hh:mm::ss+0000\n // yyyy-mm-dd[ T]hh:mm::ss+00:00\n // yyyy-mm-dd[ T]hh:mm::ss.123Z\n //\n I18n.parseDate = function(date) {\n var matches, convertedDate, fraction;\n // we have a date, so just return it.\n if (typeof(date) == \"object\") {\n return date;\n };\n\n matches = date.toString().match(/(\\d{4})-(\\d{2})-(\\d{2})(?:[ T](\\d{2}):(\\d{2}):(\\d{2})([\\.,]\\d{1,3})?)?(Z|\\+00:?00)?/);\n\n if (matches) {\n for (var i = 1; i <= 6; i++) {\n matches[i] = parseInt(matches[i], 10) || 0;\n }\n\n // month starts on 0\n matches[2] -= 1;\n\n fraction = matches[7] ? 1000 * (\"0\" + matches[7]) : null;\n\n if (matches[8]) {\n convertedDate = new Date(Date.UTC(matches[1], matches[2], matches[3], matches[4], matches[5], matches[6], fraction));\n } else {\n convertedDate = new Date(matches[1], matches[2], matches[3], matches[4], matches[5], matches[6], fraction);\n }\n } else if (typeof(date) == \"number\") {\n // UNIX timestamp\n convertedDate = new Date();\n convertedDate.setTime(date);\n } else if (date.match(/([A-Z][a-z]{2}) ([A-Z][a-z]{2}) (\\d+) (\\d+:\\d+:\\d+) ([+-]\\d+) (\\d+)/)) {\n // This format `Wed Jul 20 13:03:39 +0000 2011` is parsed by\n // webkit/firefox, but not by IE, so we must parse it manually.\n convertedDate = new Date();\n convertedDate.setTime(Date.parse([\n RegExp.$1, RegExp.$2, RegExp.$3, RegExp.$6, RegExp.$4, RegExp.$5\n ].join(\" \")));\n } else if (date.match(/\\d+ \\d+:\\d+:\\d+ [+-]\\d+ \\d+/)) {\n // a valid javascript format with timezone info\n convertedDate = new Date();\n convertedDate.setTime(Date.parse(date));\n } else {\n // an arbitrary javascript string\n convertedDate = new Date();\n convertedDate.setTime(Date.parse(date));\n }\n\n return convertedDate;\n };\n\n // Formats time according to the directives in the given format string.\n // The directives begins with a percent (%) character. Any text not listed as a\n // directive will be passed through to the output string.\n //\n // The accepted formats are:\n //\n // %a - The abbreviated weekday name (Sun)\n // %A - The full weekday name (Sunday)\n // %b - The abbreviated month name (Jan)\n // %B - The full month name (January)\n // %c - The preferred local date and time representation\n // %d - Day of the month (01..31)\n // %-d - Day of the month (1..31)\n // %H - Hour of the day, 24-hour clock (00..23)\n // %-H - Hour of the day, 24-hour clock (0..23)\n // %I - Hour of the day, 12-hour clock (01..12)\n // %-I - Hour of the day, 12-hour clock (1..12)\n // %m - Month of the year (01..12)\n // %-m - Month of the year (1..12)\n // %M - Minute of the hour (00..59)\n // %-M - Minute of the hour (0..59)\n // %p - Meridian indicator (AM or PM)\n // %S - Second of the minute (00..60)\n // %-S - Second of the minute (0..60)\n // %w - Day of the week (Sunday is 0, 0..6)\n // %y - Year without a century (00..99)\n // %-y - Year without a century (0..99)\n // %Y - Year with century\n // %z - Timezone offset (+0545)\n //\n I18n.strftime = function(date, format) {\n var options = this.lookup(\"date\")\n , meridianOptions = I18n.meridian()\n ;\n\n if (!options) {\n options = {};\n }\n\n options = this.prepareOptions(options, DATE);\n\n if (isNaN(date.getTime())) {\n throw new Error('I18n.strftime() requires a valid date object, but received an invalid date.');\n }\n\n var weekDay = date.getDay()\n , day = date.getDate()\n , year = date.getFullYear()\n , month = date.getMonth() + 1\n , hour = date.getHours()\n , hour12 = hour\n , meridian = hour > 11 ? 1 : 0\n , secs = date.getSeconds()\n , mins = date.getMinutes()\n , offset = date.getTimezoneOffset()\n , absOffsetHours = Math.floor(Math.abs(offset / 60))\n , absOffsetMinutes = Math.abs(offset) - (absOffsetHours * 60)\n , timezoneoffset = (offset > 0 ? \"-\" : \"+\") +\n (absOffsetHours.toString().length < 2 ? \"0\" + absOffsetHours : absOffsetHours) +\n (absOffsetMinutes.toString().length < 2 ? \"0\" + absOffsetMinutes : absOffsetMinutes)\n ;\n\n if (hour12 > 12) {\n hour12 = hour12 - 12;\n } else if (hour12 === 0) {\n hour12 = 12;\n }\n\n format = format.replace(\"%a\", options.abbr_day_names[weekDay]);\n format = format.replace(\"%A\", options.day_names[weekDay]);\n format = format.replace(\"%b\", options.abbr_month_names[month]);\n format = format.replace(\"%B\", options.month_names[month]);\n format = format.replace(\"%d\", padding(day));\n format = format.replace(\"%e\", day);\n format = format.replace(\"%-d\", day);\n format = format.replace(\"%H\", padding(hour));\n format = format.replace(\"%-H\", hour);\n format = format.replace(\"%I\", padding(hour12));\n format = format.replace(\"%-I\", hour12);\n format = format.replace(\"%m\", padding(month));\n format = format.replace(\"%-m\", month);\n format = format.replace(\"%M\", padding(mins));\n format = format.replace(\"%-M\", mins);\n format = format.replace(\"%p\", meridianOptions[meridian]);\n format = format.replace(\"%S\", padding(secs));\n format = format.replace(\"%-S\", secs);\n format = format.replace(\"%w\", weekDay);\n format = format.replace(\"%y\", padding(year));\n format = format.replace(\"%-y\", padding(year).replace(/^0+/, \"\"));\n format = format.replace(\"%Y\", year);\n format = format.replace(\"%z\", timezoneoffset);\n\n return format;\n };\n\n // Convert the given dateString into a formatted date.\n I18n.toTime = function(scope, dateString) {\n var date = this.parseDate(dateString)\n , format = this.lookup(scope)\n ;\n\n if (date.toString().match(/invalid/i)) {\n return date.toString();\n }\n\n if (!format) {\n return date.toString();\n }\n\n return this.strftime(date, format);\n };\n\n // Convert a number into a formatted percentage value.\n I18n.toPercentage = function(number, options) {\n options = this.prepareOptions(\n options\n , this.lookup(\"number.percentage.format\")\n , this.lookup(\"number.format\")\n , PERCENTAGE_FORMAT\n );\n\n return this.toNumber(number, options);\n };\n\n // Convert a number into a readable size representation.\n I18n.toHumanSize = function(number, options) {\n var kb = 1024\n , size = number\n , iterations = 0\n , unit\n , precision\n ;\n\n while (size >= kb && iterations < 4) {\n size = size / kb;\n iterations += 1;\n }\n\n if (iterations === 0) {\n unit = this.t(\"number.human.storage_units.units.byte\", {count: size});\n precision = 0;\n } else {\n unit = this.t(\"number.human.storage_units.units.\" + SIZE_UNITS[iterations]);\n precision = (size - Math.floor(size) === 0) ? 0 : 1;\n }\n\n options = this.prepareOptions(\n options\n , {unit: unit, precision: precision, format: \"%n%u\", delimiter: \"\"}\n );\n\n return this.toNumber(size, options);\n };\n\n I18n.getFullScope = function(scope, options) {\n options = options || {}\n\n // Deal with the scope as an array.\n if (isArray(scope)) {\n scope = scope.join(this.defaultSeparator);\n }\n\n // Deal with the scope option provided through the second argument.\n //\n // I18n.t('hello', {scope: 'greetings'});\n //\n if (options.scope) {\n scope = [options.scope, scope].join(this.defaultSeparator);\n }\n\n return scope;\n };\n /**\n * Merge obj1 with obj2 (shallow merge), without modifying inputs\n * @param {Object} obj1\n * @param {Object} obj2\n * @returns {Object} Merged values of obj1 and obj2\n *\n * In order to support ES3, `Object.prototype.hasOwnProperty.call` is used\n * Idea is from:\n * https://stackoverflow.com/questions/8157700/object-has-no-hasownproperty-method-i-e-its-undefined-ie8\n */\n I18n.extend = function ( obj1, obj2 ) {\n if (typeof(obj1) === \"undefined\" && typeof(obj2) === \"undefined\") {\n return {};\n }\n return merge(obj1, obj2);\n };\n\n // Set aliases, so we can save some typing.\n I18n.t = I18n.translate;\n I18n.l = I18n.localize;\n I18n.p = I18n.pluralize;\n\n return I18n;\n}));\n","import { Inject, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\n\n@Injectable({ providedIn: 'root' })\nexport class ActiveWindowService {\n private activeState$ = new BehaviorSubject(true);\n\n constructor(@Inject(DOCUMENT) document:Document) {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState) {\n debugLog(`Browser window has visibility state changed to ${document.visibilityState}`);\n this.activeState$.next(document.visibilityState === 'visible');\n }\n });\n }\n\n /**\n * Returns whether the browser window/tab is active\n */\n public get isActive():boolean {\n return this.activeState$.value;\n }\n\n /**\n * Observable for notifying when visibility changes\n */\n public get active$():Observable {\n return this.activeState$.asObservable();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { GridResource } from 'core-app/features/hal/resources/grid-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { Observable } from 'rxjs';\nimport { ApiV3GridForm } from 'core-app/core/apiv3/endpoints/grids/apiv3-grid-form';\n\nexport class ApiV3GridPaths extends ApiV3GettableResource {\n // Static paths\n readonly form = this.subResource('form', ApiV3GridForm);\n\n /**\n * Update a grid resource or payload\n * @param resource\n * @param schema\n */\n public patch(resource:GridResource|Object, schema:SchemaResource|null = null):Observable {\n const payload = this.form.extractPayload(resource, schema);\n\n return this\n .halResourceService\n .patch(this.path, payload);\n }\n\n /**\n * Delete a grid resource\n */\n public delete():Observable {\n return this\n .halResourceService\n .delete(this.path);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ApiV3GridPaths } from 'core-app/core/apiv3/endpoints/grids/apiv3-grid-paths';\nimport { GridResource } from 'core-app/features/hal/resources/grid-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { ApiV3GridForm } from 'core-app/core/apiv3/endpoints/grids/apiv3-grid-form';\nimport { Observable } from 'rxjs';\nimport {\n ApiV3ListParameters,\n ApiV3ListResourceInterface,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\n\nexport class ApiV3GridsPaths\n extends ApiV3ResourceCollection\n implements ApiV3ListResourceInterface {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'grids', ApiV3GridPaths);\n }\n\n readonly form = this.subResource('form', ApiV3GridForm);\n\n /**\n * Load a list of grids with a given list parameter filter\n * @param params\n */\n public list(params?:ApiV3ListParameters):Observable> {\n return this\n .halResourceService\n .get>(this.path + listParamsString(params));\n }\n\n /**\n * Create a new GridResource\n *\n * @param resource\n * @param schema\n */\n public post(resource:GridResource, schema:SchemaResource|null = null):Observable {\n return this\n .halResourceService\n .post(\n this.path,\n this.form.extractPayload(resource, schema),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { States } from 'core-app/core/states/states.service';\nimport { HasId, StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { concat, Observable, of } from 'rxjs';\nimport {\n mapTo, shareReplay, switchMap, take, tap,\n} from 'rxjs/operators';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport abstract class ApiV3Resource\n extends ApiV3GettableResource {\n @InjectField() states:States;\n\n @InjectField() schemaCache:SchemaCacheService;\n\n readonly cache = this.createCache();\n\n /**\n * Require the value to be loaded either when forced or the value is stale\n * according to the cache interval specified for this service.\n *\n * Returns an observable to the values stream of the state.\n *\n * @param force Load the value anyway.\n */\n public requireAndStream(force = false):Observable {\n const id = this.id.toString();\n\n // Refresh when stale or being forced\n if (this.cache.stale(id) || force) {\n const observable = this\n .load()\n .pipe(\n take(1),\n shareReplay(1),\n );\n\n this.cache.clearAndLoad(\n id,\n observable,\n );\n\n // Return concat of the loading observable\n // for error handling and the like,\n // but then continue with the streamed cache\n return concat(\n observable,\n this.cache.state(id).values$(),\n );\n }\n\n return this.cache.state(id).values$();\n }\n\n /**\n * Observe the values of this resource,\n * but do not request it actively.\n */\n public observe():Observable {\n return this\n .cache\n .observe(this.id.toString());\n }\n\n /**\n * Returns a (potentially cached) observable.\n *\n * Only observes one value.\n *\n * Accesses or modifies the global store for this resource.\n */\n get():Observable {\n return this\n .requireAndStream(false)\n .pipe(\n take(1),\n );\n }\n\n /**\n * Returns a freshly loaded value but ensuring the value\n * is also updated in the cache.\n *\n * Only observes one value.\n *\n * Accesses or modifies the global store for this resource.\n */\n refresh():Promise {\n return this\n .requireAndStream(true)\n .pipe(\n take(1),\n )\n // Use a promise to ensure this fires\n // even if caller isn't subscribing.\n .toPromise();\n }\n\n /**\n * Perform a request to the HalResourceService with the current path\n */\n protected load():Observable {\n return this\n .halResourceService\n .get(this.path)\n .pipe(\n switchMap((resource) => {\n if (resource.$links.schema) {\n return this.schemaCache\n .requireAndStream(resource.$links.schema.href)\n .pipe(\n take(1),\n mapTo(resource),\n );\n }\n return of(resource);\n }),\n ) as any; // T does not extend HalResource for virtual endpoints such as board, thus we need to cast here\n }\n\n /**\n * Update a single resource\n */\n protected touch(resource:T):void {\n this.cache.updateFor(resource);\n }\n\n /**\n * Inserts a collection response to cache as an rxjs tap function\n */\n protected cacheResponse():(source:Observable) => Observable {\n return (source$:Observable) => source$.pipe(\n tap(\n (resource:T) => this.touch(resource),\n ),\n );\n }\n\n /**\n * Creates the cache state instance\n */\n protected abstract createCache():StateCacheService;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { ApiV3Resource } from 'core-app/core/apiv3/cache/cachable-apiv3-resource';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { ApiV3FormResource } from 'core-app/core/apiv3/forms/apiv3-form-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { ApiV3TimeEntriesPaths } from 'core-app/core/apiv3/endpoints/time-entries/apiv3-time-entries-paths';\nimport { HalPayloadHelper } from 'core-app/features/hal/schemas/hal-payload.helper';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport class ApiV3TimeEntryPaths extends ApiV3Resource {\n // Static paths\n readonly form = this.subResource('form', ApiV3FormResource);\n\n /**\n * Update the time entry with the given payload.\n *\n * In case of updating from the hal resource, a schema resource is needed\n * to identify the writable attributes.\n * @param payload\n * @param schema\n */\n public patch(payload:Object, schema:SchemaResource|null = null):Observable {\n return this\n .halResourceService\n .patch(this.path, this.extractPayload(payload, schema))\n .pipe(\n tap((resource) => this.touch(resource)),\n );\n }\n\n /**\n * Delete the time entry under the current path\n */\n public delete():Observable {\n return this\n .halResourceService\n .delete(this.path)\n .pipe(\n tap(() => this.cache.clearSome(this.id.toString())),\n );\n }\n\n protected createCache():StateCacheService {\n return (this.parent as ApiV3TimeEntriesPaths).cache;\n }\n\n /**\n * Extract payload from the given request with schema.\n * This will ensure we will only write writable attributes and so on.\n *\n * @param resource\n * @param schema\n */\n protected extractPayload(resource:HalResource|Object|null, schema:SchemaResource|null = null) {\n if (resource instanceof HalResource && schema) {\n return HalPayloadHelper.extractPayloadFromSchema(resource, schema);\n } if (!(resource instanceof HalResource)) {\n return resource;\n }\n return {};\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource, ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { States } from 'core-app/core/states/states.service';\nimport { HasId, StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { Observable } from 'rxjs';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { tap } from 'rxjs/operators';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport abstract class ApiV3Collection<\n T extends HasId = HalResource,\n V extends ApiV3GettableResource = ApiV3GettableResource,\n X extends StateCacheService = StateCacheService,\n >\n extends ApiV3ResourceCollection {\n @InjectField() states:States;\n\n readonly cache:X = this.createCache();\n\n /**\n * Observe all value changes of the cache\n */\n public observeAll():Observable {\n return this.cache.observeAll();\n }\n\n /**\n * Inserts a collection or single response to cache as an rxjs tap function\n */\n protected cacheResponse():(source:Observable) => Observable {\n return (source$) => source$.pipe(\n tap(\n (response:R) => {\n if (response instanceof CollectionResource) {\n response.elements?.forEach(this.touch.bind(this));\n } else if (response instanceof HalResource) {\n this.touch(response as any);\n }\n },\n ),\n );\n }\n\n /**\n * Update a single resource\n */\n protected touch(resource:T):void {\n this.cache.updateFor(resource);\n }\n\n /**\n * Creates the cache state instance\n */\n protected abstract createCache():X;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { Injector } from '@angular/core';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { MultiInputState } from 'reactivestates';\n\nexport class TimeEntryCacheService extends StateCacheService {\n @InjectField() readonly states:States;\n\n @InjectField() readonly schemaCache:SchemaCacheService;\n\n constructor(readonly injector:Injector, state:MultiInputState) {\n super(state);\n }\n\n updateValue(id:string, val:TimeEntryResource):Promise {\n return this.schemaCache\n .ensureLoaded(val)\n .then(() => {\n this.putValue(id, val);\n return val;\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3TimeEntryPaths } from 'core-app/core/apiv3/endpoints/time-entries/apiv3-time-entry-paths';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3FormResource } from 'core-app/core/apiv3/forms/apiv3-form-resource';\nimport { Observable } from 'rxjs';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { ApiV3Collection } from 'core-app/core/apiv3/cache/cachable-apiv3-collection';\nimport {\n ApiV3ListParameters,\n ApiV3ListResourceInterface,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { TimeEntryCacheService } from 'core-app/core/apiv3/endpoints/time-entries/time-entry-cache.service';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { ApiV3GettableResource } from 'core-app/core/apiv3/paths/apiv3-resource';\n\nexport class ApiV3TimeEntriesPaths\n extends ApiV3Collection\n implements ApiV3ListResourceInterface {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'time_entries', ApiV3TimeEntryPaths);\n }\n\n // Static paths\n public readonly form = this.subResource('form', ApiV3FormResource);\n\n // /api/v3/time_entries/schema\n readonly schema = this.subResource>('schema');\n\n /**\n * Load a list of time entries with a given list parameter filter\n * @param params\n */\n public list(params?:ApiV3ListParameters):Observable> {\n return this\n .halResourceService\n .get>(this.path + listParamsString(params))\n .pipe(\n this.cacheResponse(),\n );\n }\n\n /**\n * Create a time entry resource from the given payload\n * @param payload\n */\n public post(payload:Object):Observable {\n return this\n .halResourceService\n .post(this.path, payload)\n .pipe(\n this.cacheResponse(),\n );\n }\n\n protected createCache():StateCacheService {\n return new TimeEntryCacheService(this.injector, this.states.timeEntries);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ICapability } from 'core-app/core/state/capabilities/capability.model';\nimport { ApiV3GettableResource } from 'core-app/core/apiv3/paths/apiv3-resource';\n\nexport class ApiV3CapabilityPaths extends ApiV3GettableResource {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3CapabilityPaths } from 'core-app/core/apiv3/endpoints/capabilities/apiv3-capability-paths';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ICapability } from 'core-app/core/state/capabilities/capability.model';\nimport { ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\n\nexport class ApiV3CapabilitiesPaths\n extends ApiV3ResourceCollection {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'capabilities', ApiV3CapabilityPaths);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { ApiV3GettableResource } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport {\n ApiV3ListParameters,\n ApiV3ListResourceInterface,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { ApiV3Filter } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\n\nexport class ApiV3AvailableProjectsPaths\n extends ApiV3GettableResource>\n implements ApiV3ListResourceInterface {\n /**\n * Load a list of available projects with a given list parameter filter\n * @param params\n */\n public list(params?:ApiV3ListParameters):Observable> {\n return this\n .halResourceService\n .get>(this.path + listParamsString(params));\n }\n\n /**\n * Performs a request against the available_projects endpoint\n * to see whether this is contained\n *\n * Returns whether the given id exists in the set\n * of available projects\n *\n * @param projectId\n */\n public exists(projectId:string):Observable {\n return this\n .halResourceService\n .get>(\n this.path,\n { filters: ApiV3Filter('id', '=', [projectId]).toJson() },\n )\n .pipe(\n map((collection) => collection.count > 0),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3FormResource } from 'core-app/core/apiv3/forms/apiv3-form-resource';\nimport { MembershipResourceEmbedded } from 'core-app/features/hal/resources/membership-resource';\n\nexport class ApiV3MembershipsForm extends ApiV3FormResource {\n /**\n * We need to override the grid widget extraction\n * to pass the correct payload to the API.\n *\n * @param resource\n * @param schema\n */\n public static extractPayload(resource:MembershipResourceEmbedded):Object {\n return {\n _links: {\n project: { href: resource.project.href },\n principal: { href: resource.principal.href },\n roles: resource.roles.map((role) => ({ href: role.href })),\n },\n _meta: {\n notificationMessage: {\n raw: resource.notificationMessage.raw,\n },\n },\n };\n }\n\n /**\n * Extract payload for the form from the request and optional schema.\n *\n * @param request\n * @param schema\n */\n public extractPayload(request:MembershipResourceEmbedded) {\n return ApiV3MembershipsForm.extractPayload(request);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource, ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3AvailableProjectsPaths } from 'core-app/core/apiv3/endpoints/projects/apiv3-available-projects-paths';\nimport {\n ApiV3ListParameters,\n ApiV3ListResourceInterface,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { Observable } from 'rxjs';\nimport { ApiV3MembershipsForm } from 'core-app/core/apiv3/endpoints/memberships/apiv3-memberships-form';\nimport { MembershipResource, MembershipResourceEmbedded } from 'core-app/features/hal/resources/membership-resource';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\n\nexport class ApiV3MembershipsPaths\n extends ApiV3ResourceCollection>\n implements ApiV3ListResourceInterface {\n // Static paths\n readonly form = this.subResource('form', ApiV3MembershipsForm);\n\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'memberships');\n }\n\n /**\n * Load a list of membership entries with a given list parameter filter\n * @param params\n */\n public list(params?:ApiV3ListParameters):Observable> {\n return this\n .halResourceService\n .get>(this.path + listParamsString(params));\n }\n\n // /api/v3/memberships/available_projects\n readonly available_projects = this.subResource('available_projects', ApiV3AvailableProjectsPaths);\n\n /**\n * Create a new MembershipResource\n *\n * @param resource\n */\n public post(resource:MembershipResourceEmbedded):Observable {\n const payload = this.form.extractPayload(resource);\n return this\n .halResourceService\n .post(\n this.path,\n payload,\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3ResourcePath } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { Observable } from 'rxjs';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { HttpClient } from '@angular/common/http';\nimport { IUserPreference } from 'core-app/features/user-preferences/state/user-preferences.model';\n\nexport class ApiV3UserPreferencesPaths extends ApiV3ResourcePath {\n @InjectField() http:HttpClient;\n\n /**\n * Perform a request to the backend to load preferences\n */\n public get():Observable {\n return this\n .http\n .get(\n this.path,\n );\n }\n\n /**\n * Perform a request to update preferences\n */\n public patch(payload:Partial):Observable {\n return this\n .http\n .patch(\n this.path,\n payload,\n { withCredentials: true, responseType: 'json' },\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { ApiV3Resource } from 'core-app/core/apiv3/cache/cachable-apiv3-resource';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { ApiV3UserPreferencesPaths } from 'core-app/core/apiv3/endpoints/users/apiv3-user-preferences-paths';\n\nexport class ApiV3UserPaths extends ApiV3Resource {\n readonly avatar = this.subResource('avatar');\n\n readonly preferences = this.subResource('preferences', ApiV3UserPreferencesPaths);\n\n protected createCache():StateCacheService {\n return new StateCacheService(this.states.users);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ApiV3UserPaths } from 'core-app/core/apiv3/endpoints/users/apiv3-user-paths';\nimport { Observable } from 'rxjs';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3FormResource } from 'core-app/core/apiv3/forms/apiv3-form-resource';\n\nexport class ApiV3UsersPaths extends ApiV3ResourceCollection {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'users', ApiV3UserPaths);\n }\n\n // Static paths\n\n // /api/v3/users/me\n public readonly me = this.subResource('me', ApiV3UserPaths);\n\n // /api/v3/users/form\n public readonly form = this.subResource('form', ApiV3FormResource);\n\n /**\n * Create a new UserResource\n *\n * @param resource\n */\n public post(resource:{\n // TODO: The typing here could be a lot better\n login?:string,\n firstName?:string,\n lastName?:string,\n email?:string,\n admin?:boolean,\n language?:string,\n password?:string,\n auth_source?:string,\n identity_url?:string,\n status:'invited'|'active',\n }):Observable {\n return this\n .halResourceService\n .post(\n this.path,\n resource,\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { TypeResource } from 'core-app/features/hal/resources/type-resource';\nimport { ApiV3Resource } from 'core-app/core/apiv3/cache/cachable-apiv3-resource';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { ApiV3TypesPaths } from 'core-app/core/apiv3/endpoints/types/apiv3-types-paths';\n\nexport class ApiV3TypePaths extends ApiV3Resource {\n protected createCache():StateCacheService {\n return (this.parent as ApiV3TypesPaths).cache;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { TypeResource } from 'core-app/features/hal/resources/type-resource';\nimport { ApiV3TypePaths } from 'core-app/core/apiv3/endpoints/types/apiv3-type-paths';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3Collection } from 'core-app/core/apiv3/cache/cachable-apiv3-collection';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\n\nexport class ApiV3TypesPaths extends ApiV3Collection {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'types', ApiV3TypePaths);\n }\n\n protected createCache():StateCacheService {\n return new StateCacheService(this.states.types);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injector } from '@angular/core';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { HttpClient } from '@angular/common/http';\nimport { SimpleResource } from 'core-app/core/apiv3/paths/path-resources';\n\nexport type QueryOrder = { [wpId:string]:number };\n\nexport class ApiV3QueryOrder extends SimpleResource {\n @InjectField() http:HttpClient;\n\n constructor(readonly injector:Injector,\n readonly basePath:string,\n readonly id:string|number) {\n super(basePath, id);\n }\n\n public get():Promise {\n return this.http\n .get(\n this.path,\n )\n .toPromise()\n .then((result) => result || {});\n }\n\n public update(delta:QueryOrder):Promise {\n return this.http\n .patch(\n this.path,\n { delta },\n { withCredentials: true },\n )\n .toPromise()\n .then((response:{ t:string }) => response.t);\n }\n\n public delete(id:string, ...wpIds:string[]) {\n const delta:QueryOrder = {};\n wpIds.forEach((id) => delta[id] = -1);\n\n return this.update(delta);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { ApiV3FormResource } from 'core-app/core/apiv3/forms/apiv3-form-resource';\nimport { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';\nimport { Observable } from 'rxjs';\nimport * as URI from 'urijs';\nimport { map, tap } from 'rxjs/operators';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { QueryFiltersService } from 'core-app/features/work-packages/components/wp-query/query-filters.service';\n\nexport class ApiV3QueryForm extends ApiV3FormResource {\n @InjectField() private queryFilters:QueryFiltersService;\n\n /**\n * Load the query form for the given existing (or new) query resource\n * @param query\n */\n public load(query:QueryResource):Observable<[QueryFormResource, QueryResource]> {\n // We need a valid payload so that we\n // can check whether form saving is possible.\n // The query needs a name to be valid.\n const payload:any = {\n name: query.name || '!!!__O__o__O__!!!',\n };\n\n if (query.project) {\n payload._links = {\n project: {\n href: query.project.href,\n },\n };\n }\n\n const { path } = this.apiRoot.queries.withOptionalId(query.id).form;\n return this.halResourceService\n .post(path, payload)\n .pipe(\n tap((form) => this.queryFilters.setSchemas(form.$embedded.schema.$embedded.filtersSchemas)),\n map((form) => [form, this.buildQueryResource(form)]),\n );\n }\n\n /**\n * Load the query form only with the given query props.\n *\n * @param params\n * @param queryId\n * @param projectIdentifier\n * @param payload\n */\n public loadWithParams(params:{ [key:string]:unknown }, queryId:string|null|undefined, projectIdentifier:string|undefined|null, payload:any = {}):Observable<[QueryFormResource, QueryResource]> {\n // We need a valid payload so that we\n // can check whether form saving is possible.\n // The query needs a name to be valid.\n if (!queryId && !payload.name) {\n payload.name = '!!!__O__o__O__!!!';\n }\n\n if (projectIdentifier) {\n payload._links = payload._links || {};\n payload._links.project = {\n href: this.apiRoot.projects.id(projectIdentifier).toString(),\n };\n }\n\n const { path } = this.apiRoot.queries.withOptionalId(queryId).form;\n const href = URI(path).search(params).toString();\n return this.halResourceService\n .post(href, payload)\n .pipe(\n tap((form) => this.queryFilters.setSchemas(form.$embedded.schema.$embedded.filtersSchemas)),\n map((form) => [form, this.buildQueryResource(form)]),\n );\n }\n\n protected buildQueryResource(form:QueryFormResource):QueryResource {\n return this.halResourceService.createHalResourceOfType('Query', form.payload);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { ApiV3QueryOrder } from 'core-app/core/apiv3/endpoints/queries/apiv3-query-order';\nimport { ApiV3QueryForm } from 'core-app/core/apiv3/endpoints/queries/apiv3-query-form';\nimport { Observable } from 'rxjs';\nimport { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { QueryFiltersService } from 'core-app/features/work-packages/components/wp-query/query-filters.service';\nimport { HalPayloadHelper } from 'core-app/features/hal/schemas/hal-payload.helper';\nimport { PaginationObject } from 'core-app/shared/components/table-pagination/pagination-service';\n\nexport class ApiV3QueryPaths extends ApiV3GettableResource {\n @InjectField() private queryFilters:QueryFiltersService;\n\n // Static paths\n readonly form = this.subResource('form', ApiV3QueryForm);\n\n // Order path\n readonly order = new ApiV3QueryOrder(this.injector, this.path, 'order');\n\n /**\n * Stream the response for the given query request\n * @param queryData\n */\n public parameterised(params:Object):Observable {\n return this.halResourceService\n .get(this.path, params);\n }\n\n /**\n * Update the given query\n * @param query\n * @param form\n */\n public patch(payload:QueryResource|Object, form?:QueryFormResource):Observable {\n if (payload instanceof QueryResource && form) {\n // Extracting requires having the filter schemas loaded as the dependencies\n this.queryFilters.mapSchemasIntoFilters(payload, form);\n payload = HalPayloadHelper.extractPayloadFromSchema(payload, form.schema);\n }\n\n return this\n .halResourceService\n .patch(this.path, payload);\n }\n\n /**\n * Delete the query\n */\n public delete() {\n return this\n .halResourceService\n .delete(this.path);\n }\n\n /**\n * Reload with a given pagination\n * @param pagination\n */\n public paginated(pagination:PaginationObject):Observable {\n return this.parameterised(pagination);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource, ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ApiV3QueryPaths } from 'core-app/core/apiv3/endpoints/queries/apiv3-query-paths';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3QueryForm } from 'core-app/core/apiv3/endpoints/queries/apiv3-query-form';\nimport { Observable } from 'rxjs';\nimport { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { ApiV3ListParameters, listParamsString } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { QueryFiltersService } from 'core-app/features/work-packages/components/wp-query/query-filters.service';\nimport { HalPayloadHelper } from 'core-app/features/hal/schemas/hal-payload.helper';\n\nexport class ApiV3QueriesPaths extends ApiV3ResourceCollection {\n @InjectField() private queryFilters:QueryFiltersService;\n\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'queries', ApiV3QueryPaths);\n }\n\n // Static paths\n // /api/v3/queries/form\n readonly form = this.subResource('form', ApiV3QueryForm);\n\n // /api/v3/queries/default\n readonly default = this.subResource>('default');\n\n // /api/v3/queries/filter_instance_schemas/:id\n readonly filter_instance_schemas = new ApiV3ResourceCollection(this.apiRoot, this.path, 'filter_instance_schemas');\n\n /**\n * Load a list of queries with a given list parameter filter\n * @param params\n */\n public list(params?:ApiV3ListParameters):Observable> {\n return this\n .halResourceService\n .get>(this.path + listParamsString(params));\n }\n\n /**\n * Locate a query for the response for the given query request.\n * This might be the default query or an existing query identified by its ID.\n * @param queryData\n * @param queryId\n * @param projectIdentifier\n */\n public find(queryData:Object, queryId?:string|null, projectIdentifier?:string|null|undefined):Observable {\n let path:string;\n\n if (queryId) {\n path = this.apiRoot.queries.id(queryId).toString();\n } else {\n path = this.apiRoot.withOptionalProject(projectIdentifier).queries.default.toString();\n }\n\n return this\n .halResourceService\n .get(path, queryData);\n }\n\n /**\n * Stream the response for the given query request\n *\n * @param params\n */\n public parameterised(params:Object):Observable {\n return this.halResourceService\n .get(\n this.default.path,\n params,\n );\n }\n\n /**\n * Create a new query resource\n *\n * @param payload Payload object or query HAL resource\n * @param form Form resource, needed when QueryResource is passed\n */\n public post(payload:QueryResource|Object, form?:QueryFormResource):Observable {\n if (payload instanceof QueryResource && form) {\n // Extracting requires having the filter schemas loaded as the dependencies\n this.queryFilters.mapSchemasIntoFilters(payload, form);\n payload = HalPayloadHelper.extractPayloadFromSchema(payload, form.schema);\n }\n\n return this\n .halResourceService\n .post(\n this.apiRoot.queries.path, payload,\n );\n }\n\n /**\n * Invert the starred state of the given query\n *\n * @param query\n */\n public toggleStarred(query:QueryResource):Promise {\n if (query.starred) {\n return query.unstar();\n }\n return query.star();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource, ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { from, Observable } from 'rxjs';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { map } from 'rxjs/operators';\nimport { ApiV3Filter } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\n\nexport class ApiV3RelationsPaths extends ApiV3ResourceCollection> {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'relations');\n }\n\n /**\n * Get all versions\n */\n public get():Observable> {\n return this\n .halResourceService\n .get>(this.path);\n }\n\n public loadInvolved(workPackageIds:string[]):Observable {\n const validIds = _.filter(workPackageIds, (id) => /\\d+/.test(id));\n\n if (validIds.length === 0) {\n return from([]);\n }\n\n return this\n .filtered(\n ApiV3Filter('involved', '=', validIds),\n )\n .getPaginatedResults();\n }\n}\n","import { ApiV3FormResource } from 'core-app/core/apiv3/forms/apiv3-form-resource';\nimport { FormResource } from 'core-app/features/hal/resources/form-resource';\nimport { Observable } from 'rxjs';\nimport { HalSource } from 'core-app/features/hal/resources/hal-resource';\n\nexport class ApiV3WorkPackageForm extends ApiV3FormResource {\n /**\n * Returns a promise to post `/api/v3/work_packages/form` with only the type part of the\n * provided payload being sent to the backend.\n *\n * @param payload: The payload to be sent to the backend\n * @returns A work package form resource prefilled with the provided payload.\n */\n public forTypePayload(payload:HalSource):Observable {\n const typePayload = payload._links.type ? { _links: { type: payload._links.type } } : { _links: {} };\n\n return this.post(payload);\n }\n\n /**\n * Returns a promise to post `/api/v3/work_packages/form` where the\n * payload sent to the backend has been provided.\n *\n * @param payload: The payload to be sent to the backend\n * @returns A work package form resource prefilled with the provided payload.\n */\n public forPayload(payload:Partial):Observable {\n return this.post(payload);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ApiV3RelationsPaths } from 'core-app/core/apiv3/endpoints/relations/apiv3-relations-paths';\nimport { ApiV3Resource } from 'core-app/core/apiv3/cache/cachable-apiv3-resource';\nimport { ApiV3WorkPackagesPaths } from 'core-app/core/apiv3/endpoints/work_packages/api-v3-work-packages-paths';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { ApiV3WorkPackageForm } from 'core-app/core/apiv3/endpoints/work_packages/apiv3-work-package-form';\n\nexport class ApiV3WorkPackagePaths extends ApiV3Resource {\n // /api/v3/(?:projectPath)/work_packages/(:workPackageId)/relations\n public readonly relations = this.subResource('relations', ApiV3RelationsPaths);\n\n // /api/v3/(?:projectPath)/work_packages/(:workPackageId)/revisions\n public readonly revisions = this.subResource('revisions');\n\n // /api/v3/(?:projectPath)/work_packages/(:workPackageId)/activities\n public readonly activities = this.subResource('activities');\n\n // /api/v3/(?:projectPath)/work_packages/(:workPackageId)/available_watchers\n public readonly available_watchers = this.subResource('available_watchers');\n\n // /api/v3/(?:projectPath)/work_packages/(:workPackageId)/available_projects\n public readonly available_projects = this.subResource('available_projects');\n\n // /api/v3/(?:projectPath)/work_packages/(:workPackageId)/github_pull_requests\n public readonly github_pull_requests = this.subResource('github_pull_requests');\n\n // /api/v3/(projects/:projectIdentifier)/work_packages/(:workPackageId)/form\n public readonly form:ApiV3WorkPackageForm = this.subResource('form', ApiV3WorkPackageForm);\n\n protected createCache():StateCacheService {\n return (this.parent as ApiV3WorkPackagesPaths).cache;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { MultiInputState } from 'reactivestates';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Injectable, Injector } from '@angular/core';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\n@Injectable()\nexport class WorkPackageCache extends StateCacheService {\n @InjectField() private schemaCacheService:SchemaCacheService;\n\n constructor(readonly injector:Injector,\n state:MultiInputState) {\n super(state);\n }\n\n updateValue(id:string, val:WorkPackageResource):Promise {\n return this.schemaCacheService.ensureLoaded(val).then(() => {\n this.putValue(id, val);\n return val;\n });\n }\n\n updateWorkPackage(wp:WorkPackageResource, immediate = false):Promise {\n if (immediate || isNewResource(wp)) {\n return super.updateValue(wp.id!, wp);\n }\n return this.updateValue(wp.id!, wp);\n }\n\n updateWorkPackageList(list:WorkPackageResource[], skipOnIdentical = true) {\n list.forEach((i) => {\n const wp = i;\n const workPackageId = wp.id!;\n const state = this.multiState.get(workPackageId);\n\n // If the work package is new, ignore the schema\n if (isNewResource(wp)) {\n state.putValue(wp);\n return;\n }\n\n // Ensure the schema is loaded\n // so that no consumer needs to call schema#$load manually\n this.schemaCacheService.ensureLoaded(wp).then(() => {\n // Check if the work package has changed\n if (skipOnIdentical && state.hasValue() && _.isEqual(state.value!.$source, wp.$source)) {\n debugLog('Skipping identical work package from updating');\n return;\n }\n\n state.putValue(wp);\n });\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { Observable } from 'rxjs';\nimport { ApiV3WorkPackagesPaths } from 'core-app/core/apiv3/endpoints/work_packages/api-v3-work-packages-paths';\nimport { take, tap } from 'rxjs/operators';\nimport { WorkPackageCache } from 'core-app/core/apiv3/endpoints/work_packages/work-package.cache';\nimport { States } from 'core-app/core/states/states.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\n\nexport class ApiV3WorkPackageCachedSubresource extends ApiV3GettableResource {\n @InjectField() private states:States;\n\n public get():Observable {\n return this\n .halResourceService\n .get(this.path)\n .pipe(\n tap((collection) => collection.schemas && this.updateSchemas(collection.schemas)),\n tap((collection) => this.cache.updateWorkPackageList(collection.elements)),\n take(1),\n );\n }\n\n protected get cache():WorkPackageCache {\n return (this.parent as unknown as ApiV3WorkPackagesPaths).cache;\n }\n\n private updateSchemas(schemas:CollectionResource) {\n schemas.elements.forEach((schema) => {\n this.states.schemas.get(schema.href as string).putValue(schema);\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Observable } from 'rxjs';\nimport { ApiV3WorkPackagePaths } from 'core-app/core/apiv3/endpoints/work_packages/api-v3-work-package-paths';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { ApiV3WorkPackageForm } from 'core-app/core/apiv3/endpoints/work_packages/apiv3-work-package-form';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3Collection } from 'core-app/core/apiv3/cache/cachable-apiv3-collection';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { WorkPackageCache } from 'core-app/core/apiv3/endpoints/work_packages/work-package.cache';\nimport { ApiV3GettableResource } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ApiV3WorkPackageCachedSubresource } from 'core-app/core/apiv3/endpoints/work_packages/api-v3-work-package-cached-subresource';\nimport {\n ApiV3FilterBuilder,\n ApiV3FilterValueType,\n ApiV3Filter,\n} from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\n\nexport class ApiV3WorkPackagesPaths extends ApiV3Collection {\n // Base path\n public readonly path:string;\n\n constructor(readonly apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'work_packages', ApiV3WorkPackagePaths);\n }\n\n // Static paths\n\n // /api/v3/(projects/:projectIdentifier)/work_packages/form\n public readonly form:ApiV3WorkPackageForm = this.subResource('form', ApiV3WorkPackageForm);\n\n /**\n *\n * Load a collection of work packages and put them all into cache\n *\n * @param ids\n */\n public requireAll(ids:string[]):Promise {\n if (ids.length === 0) {\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n this\n .loadCollectionsFor(_.uniq(ids))\n .then((pagedResults:WorkPackageCollectionResource[]) => {\n _.each(pagedResults, (results) => {\n if (results.schemas) {\n _.each(results.schemas.elements, (schema:SchemaResource) => {\n this.states.schemas.get(schema.href as string).putValue(schema);\n });\n }\n\n if (results.elements) {\n this.cache.updateWorkPackageList(results.elements);\n }\n });\n\n resolve(undefined);\n }, reject);\n });\n }\n\n /**\n * Create a work package from a form payload\n *\n * @param payload\n * @return {Promise}\n */\n public post(payload:Object):Observable {\n return this\n .halResourceService\n .post(this.path, payload)\n .pipe(\n this.cacheResponse(),\n );\n }\n\n filtered>(filters:ApiV3FilterBuilder, params:{ [p:string]:string } = {}):R {\n return super.filtered(filters, params, ApiV3WorkPackageCachedSubresource) as any;\n }\n\n /**\n * Shortcut to filter work packages by subject or ID\n * @param term\n * @param idOnly\n * @param additionalParams Additional set of params to the API\n */\n public filterByTypeaheadOrId(term:string, idOnly = false, additionalParams:{ [key:string]:string } = {}):ApiV3WorkPackageCachedSubresource {\n const filters:ApiV3FilterBuilder = new ApiV3FilterBuilder();\n\n if (idOnly) {\n filters.add('id', '=', [term]);\n } else {\n filters.add('typeahead', '**', [term]);\n }\n\n const params = {\n sortBy: '[[\"updatedAt\",\"desc\"]]',\n offset: '1',\n pageSize: '10',\n ...additionalParams,\n };\n\n return this.filtered(filters, params);\n }\n\n /**\n * Returns work packages within the ids array to be updated since \n * @param ids work package IDs to filter for\n * @param timestamp The timestamp to clip at\n */\n public filterUpdatedSince(ids:(string|null)[], timestamp:ApiV3FilterValueType):ApiV3WorkPackageCachedSubresource {\n const filters = new ApiV3FilterBuilder()\n .add('id', '=', (ids.filter((n) => n) as string[]))\n .add('updatedAt', '<>d', [timestamp, '']);\n\n const params = {\n offset: '1',\n pageSize: '10',\n };\n\n return this.filtered(filters, params);\n }\n\n /**\n * Loads the work packages collection for the given work package IDs.\n * Returns a WP Collection with schemas and results embedded.\n *\n * @param ids\n * @return {WorkPackageCollectionResource[]}\n */\n protected loadCollectionsFor(ids:string[]):Promise {\n return this\n .halResourceService\n .getAllPaginated(\n this.path,\n {\n filters: ApiV3Filter('id', '=', ids).toJson(),\n },\n )\n .toPromise();\n }\n\n protected createCache():WorkPackageCache {\n return new WorkPackageCache(this.injector, this.states.workPackages);\n }\n\n // /api/v3/(?:projectPath)/work_packages/(:workPackageId)/available_projects\n public readonly available_projects = this.subResource('available_projects');\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { VersionResource } from 'core-app/features/hal/resources/version-resource';\nimport { Observable } from 'rxjs';\nimport { ApiV3Resource } from 'core-app/core/apiv3/cache/cachable-apiv3-resource';\nimport { tap } from 'rxjs/operators';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\n\nexport class ApiV3VersionPaths extends ApiV3Resource {\n /**\n * Update a version resource with the given payload\n *\n * @param resource\n * @param payload\n */\n public patch(payload:Object):Observable {\n return this\n .halResourceService\n .patch(\n this.path,\n payload,\n )\n .pipe(\n tap((version) => this.touch(version)),\n );\n }\n\n protected createCache():StateCacheService {\n return new StateCacheService(this.states.versions);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { VersionResource } from 'core-app/features/hal/resources/version-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3FormResource } from 'core-app/core/apiv3/forms/apiv3-form-resource';\nimport { Observable } from 'rxjs';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { ApiV3AvailableProjectsPaths } from 'core-app/core/apiv3/endpoints/projects/apiv3-available-projects-paths';\nimport { ApiV3VersionPaths } from 'core-app/core/apiv3/endpoints/versions/apiv3-version-paths';\n\nexport class ApiV3VersionsPaths extends ApiV3ResourceCollection {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'versions', ApiV3VersionPaths);\n }\n\n // /api/v3/versions/form\n public readonly form = this.subResource('form', ApiV3FormResource);\n\n public readonly available_projects = this.subResource('available_projects', ApiV3AvailableProjectsPaths);\n\n /**\n * Get all versions\n */\n public get():Observable> {\n return this\n .halResourceService\n .get>(this.path);\n }\n\n /**\n * Create a version from the given payload\n *\n * @param payload\n * @return {Promise}\n */\n public post(payload:Object):Observable {\n return this\n .halResourceService\n .post(this.path, payload);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3FormResource } from 'core-app/core/apiv3/forms/apiv3-form-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { SimpleResource } from 'core-app/core/apiv3/paths/path-resources';\n\nexport class ApiV3ProjectCopyPaths extends SimpleResource {\n constructor(protected apiRoot:ApiV3Service,\n public basePath:string) {\n super(basePath, 'copy');\n }\n\n // /api/v3/projects/:project_id/copy/form\n public readonly form = new ApiV3FormResource(this.apiRoot, this.path, 'form');\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3QueriesPaths } from 'core-app/core/apiv3/endpoints/queries/apiv3-queries-paths';\nimport { ApiV3TypesPaths } from 'core-app/core/apiv3/endpoints/types/apiv3-types-paths';\nimport { ApiV3WorkPackagesPaths } from 'core-app/core/apiv3/endpoints/work_packages/api-v3-work-packages-paths';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { ApiV3Resource } from 'core-app/core/apiv3/cache/cachable-apiv3-resource';\nimport { ApiV3VersionsPaths } from 'core-app/core/apiv3/endpoints/versions/apiv3-versions-paths';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { ApiV3ProjectsPaths } from 'core-app/core/apiv3/endpoints/projects/apiv3-projects-paths';\nimport { ApiV3ProjectCopyPaths } from 'core-app/core/apiv3/endpoints/projects/apiv3-project-copy-paths';\n\nexport class ApiV3ProjectPaths extends ApiV3Resource {\n // /api/v3/projects/:project_id/available_assignees\n public readonly available_assignees = this.subResource('available_assignees');\n\n // /api/v3/projects/:project_id/queries\n public readonly queries = new ApiV3QueriesPaths(this.apiRoot, this.path);\n\n // /api/v3/projects/:project_id/types\n public readonly types = new ApiV3TypesPaths(this.apiRoot, this.path);\n\n // /api/v3/projects/:project_id/work_packages\n public readonly work_packages = new ApiV3WorkPackagesPaths(this.apiRoot, this.path);\n\n // /api/v3/projects/:project_id/versions\n public readonly versions = new ApiV3VersionsPaths(this.apiRoot, this.path);\n\n // /api/v3/projects/:project_id/copy\n public readonly copy = new ApiV3ProjectCopyPaths(this.apiRoot, this.path);\n\n protected createCache():StateCacheService {\n return (this.parent as ApiV3ProjectsPaths).cache;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { MultiInputState } from 'reactivestates';\nimport { Injectable, Injector } from '@angular/core';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\n\n@Injectable()\nexport class ProjectCache extends StateCacheService {\n @InjectField() private schemaCacheService:SchemaCacheService;\n\n constructor(readonly injector:Injector,\n state:MultiInputState) {\n super(state);\n }\n\n updateValue(id:string, val:ProjectResource):Promise {\n return this.schemaCacheService.ensureLoaded(val).then(() => {\n this.putValue(id, val);\n return val;\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3ProjectPaths } from 'core-app/core/apiv3/endpoints/projects/apiv3-project-paths';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport {\n ApiV3ListParameters,\n ApiV3ListResourceInterface,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { Observable } from 'rxjs';\nimport { ApiV3Collection } from 'core-app/core/apiv3/cache/cachable-apiv3-collection';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { ProjectCache } from 'core-app/core/apiv3/endpoints/projects/project.cache';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\n\nexport class ApiV3ProjectsPaths\n extends ApiV3Collection\n implements ApiV3ListResourceInterface {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'projects', ApiV3ProjectPaths);\n }\n\n // /api/v3/projects/schema\n public readonly schema = this.subResource('schema');\n\n /**\n * Load a list of project with a given list parameter filter\n *\n * @param params\n */\n public list(params?:ApiV3ListParameters):Observable> {\n return this\n .halResourceService\n .get>(this.path + listParamsString(params))\n .pipe(\n this.cacheResponse(),\n );\n }\n\n protected createCache():StateCacheService {\n return new ProjectCache(this.injector, this.states.projects);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { StatusResource } from 'core-app/features/hal/resources/status-resource';\nimport { ApiV3Resource } from 'core-app/core/apiv3/cache/cachable-apiv3-resource';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\n\nexport class ApiV3StatusPaths extends ApiV3Resource {\n protected createCache():StateCacheService {\n return new StateCacheService(this.states.statuses);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { StatusResource } from 'core-app/features/hal/resources/status-resource';\nimport { ApiV3StatusPaths } from 'core-app/core/apiv3/endpoints/statuses/apiv3-status-paths';\nimport { Observable } from 'rxjs';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { tap } from 'rxjs/operators';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\nexport class ApiV3StatusesPaths extends ApiV3ResourceCollection {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'statuses', ApiV3StatusPaths);\n }\n\n /**\n * Perform a request to the HalResourceService with the current path\n */\n public get():Observable> {\n return this\n .halResourceService\n .get>(this.path)\n .pipe(\n tap((collection) => {\n collection.elements.forEach((resource, id) => {\n this.id(resource.id!).cache.updateValue(resource.id!, resource);\n });\n }),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { RoleResource } from 'core-app/features/hal/resources/role-resource';\nimport { ApiV3Resource } from 'core-app/core/apiv3/cache/cachable-apiv3-resource';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\n\nexport class ApiV3RolePaths extends ApiV3Resource {\n protected createCache():StateCacheService {\n return new StateCacheService(this.states.roles);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { RoleResource } from 'core-app/features/hal/resources/role-resource';\nimport { ApiV3RolePaths } from 'core-app/core/apiv3/endpoints/roles/apiv3-role-paths';\nimport { Observable } from 'rxjs';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { tap } from 'rxjs/operators';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\nexport class ApiV3RolesPaths extends ApiV3ResourceCollection {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'roles', ApiV3RolePaths);\n }\n\n /**\n * Perform a request to the HalResourceService with the current path\n */\n public get():Observable> {\n return this\n .halResourceService\n .get>(this.path)\n .pipe(\n tap((collection) => {\n collection.elements.forEach((resource, id) => {\n this.id(resource.id!).cache.updateValue(resource.id!, resource);\n });\n }),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource, ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { Observable } from 'rxjs';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport {\n ApiV3ListParameters,\n ApiV3ListResourceInterface,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { NewsResource } from 'core-app/features/hal/resources/news-resource';\n\nexport class ApiV3NewsPaths\n extends ApiV3ResourceCollection>\n implements ApiV3ListResourceInterface {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'news');\n }\n\n /**\n * Load a list of time entries with a given list parameter filter\n * @param params\n */\n public list(params?:ApiV3ListParameters):Observable> {\n return this\n .halResourceService\n .get>(this.path + listParamsString(params));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource, ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { Observable } from 'rxjs';\nimport { HelpTextResource } from 'core-app/features/hal/resources/help-text-resource';\n\nexport class ApiV3HelpTextsPaths\n extends ApiV3ResourceCollection> {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'help_texts');\n }\n\n /**\n * Load a list of membership entries with a given list parameter filter\n * @param params\n */\n public get():Observable> {\n return this\n .halResourceService\n .get>(this.path);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ConfigurationResource } from 'core-app/features/hal/resources/configuration-resource';\nimport { Observable } from 'rxjs';\nimport { shareReplay } from 'rxjs/operators';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\nexport class ApiV3ConfigurationPath extends ApiV3GettableResource {\n private $configuration:Observable;\n\n constructor(protected apiRoot:ApiV3Service,\n readonly basePath:string) {\n super(apiRoot, basePath, 'configuration');\n }\n\n public get():Observable {\n if (this.$configuration) {\n return this.$configuration;\n }\n\n return this.$configuration = this.halResourceService\n .get(this.path)\n .pipe(\n shareReplay(),\n );\n }\n}\n","import { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\nimport { GridResource } from 'core-app/features/hal/resources/grid-resource';\nimport { CardHighlightingMode } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting-mode.const';\nimport { ApiV3Filter } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\n\nexport type BoardType = 'free'|'action';\n\nexport interface BoardWidgetOption {\n queryId:string;\n filters:ApiV3Filter[];\n}\n\nexport class Board {\n constructor(public grid:GridResource) {\n }\n\n public get id() {\n return this.grid.id;\n }\n\n public get name() {\n return this.grid.name;\n }\n\n public get editable() {\n return !!this.grid.updateImmediately;\n }\n\n public get isFree() {\n return !this.isAction;\n }\n\n public get isAction() {\n return this.grid.options.type === 'action';\n }\n\n public get actionAttribute():string|undefined {\n if (this.isFree) {\n return undefined;\n }\n\n return this.grid.options.attribute as string;\n }\n\n public set highlightingMode(val:CardHighlightingMode) {\n this.grid.options.highlightingMode = val;\n }\n\n public get highlightingMode():CardHighlightingMode {\n return (this.grid.options.highlightingMode || 'none') as CardHighlightingMode;\n }\n\n public set name(name:string) {\n this.grid.name = name;\n }\n\n public addQuery(widget:GridWidgetResource) {\n widget.isNewWidget = true;\n this.grid.widgets.push(widget);\n }\n\n public removeQuery(widget:GridWidgetResource) {\n this.grid.widgets = this.grid.widgets.filter((el) => el.options.queryId !== widget.options.queryId);\n }\n\n public get queries():GridWidgetResource[] {\n return this.grid.widgets;\n }\n\n public get createdAt() {\n return this.grid.createdAt;\n }\n\n public get filters():ApiV3Filter[] {\n return (this.grid.options.filters || []) as ApiV3Filter[];\n }\n\n public set filters(filters:ApiV3Filter[]) {\n this.grid.options.filters = filters;\n }\n\n public sortWidgets() {\n this.grid.widgets = this.grid.widgets.sort((a, b) => a.startColumn - b.startColumn);\n }\n\n public showStatusButton() {\n return this.actionAttribute !== 'status';\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Board } from 'core-app/features/boards/board/board';\nimport { Observable } from 'rxjs';\nimport { map, switchMap, tap } from 'rxjs/operators';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { ApiV3Resource } from 'core-app/core/apiv3/cache/cachable-apiv3-resource';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { ApiV3BoardsPaths } from 'core-app/core/apiv3/virtual/apiv3-boards-paths';\n\nexport class ApiV3BoardPath extends ApiV3Resource {\n /**\n * Perform a request to the HalResourceService with the current path\n */\n protected load():Observable {\n return this\n .apiRoot\n .grids\n .id(this.id)\n .get()\n .pipe(\n map((grid) => {\n const newBoard = new Board(grid);\n\n newBoard.sortWidgets();\n\n return newBoard;\n }),\n );\n }\n\n /**\n * Save the changes to the board\n */\n public save(board:Board):Observable {\n return this\n .fetchSchema(board)\n .pipe(\n switchMap((schema:SchemaResource) => this\n .apiRoot\n .grids\n .id(board.grid)\n .patch(board.grid, schema)),\n map((grid) => {\n board.grid = grid;\n board.sortWidgets();\n return board;\n }),\n this.cacheResponse(),\n );\n }\n\n public delete():Observable {\n return this\n .apiRoot\n .grids\n .id(this.id)\n .delete()\n .pipe(\n tap(() => this.cache.clearSome(this.id.toString())),\n );\n }\n\n private fetchSchema(board:Board):Observable {\n return this\n .apiRoot\n .grids\n .id(board.grid)\n .form\n .post({})\n .pipe(\n map((form) => form.schema),\n );\n }\n\n protected createCache():StateCacheService {\n return (this.parent as ApiV3BoardsPaths).cache;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { GridResource } from 'core-app/features/hal/resources/grid-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { Observable } from 'rxjs';\nimport { ApiV3ListParameters, listParamsString } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { Board, BoardType } from 'core-app/features/boards/board/board';\nimport { map, switchMap, tap } from 'rxjs/operators';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { ApiV3Collection } from 'core-app/core/apiv3/cache/cachable-apiv3-collection';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { ApiV3BoardPath } from 'core-app/core/apiv3/virtual/apiv3-board-path';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { MAGIC_PAGE_NUMBER } from 'core-app/core/apiv3/helpers/get-paginated-results';\n\nexport class ApiV3BoardsPaths extends ApiV3Collection {\n @InjectField() private authorisationService:AuthorisationService;\n\n @InjectField() private PathHelper:PathHelperService;\n\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'grids', ApiV3BoardPath);\n }\n\n /**\n * Load a list of grids with a given list parameter filter\n * @param params\n */\n public list(params?:ApiV3ListParameters):Observable {\n return this\n .halResourceService\n .get>(this.path + listParamsString(params))\n .pipe(\n tap((collection) => this.authorisationService.initModelAuth('boards', collection.$links)),\n map((collection) => collection.elements.map((grid) => {\n const board = new Board(grid);\n board.sortWidgets();\n this.touch(board);\n\n return board;\n })),\n );\n }\n\n /**\n * Return all boards in the current scope of the project\n *\n * @param projectIdentifier\n */\n public allInScope(projectIdentifier:string):Observable {\n const path = this.boardPath(projectIdentifier);\n return this.list({ filters: [['scope', '=', [path]]], pageSize: MAGIC_PAGE_NUMBER });\n }\n\n /**\n * Create a new board\n * @param type\n * @param name\n * @param projectIdentifier\n */\n public create(type:BoardType, name:string, projectIdentifier:string, actionAttribute?:string):Observable {\n const scope = this.boardPath(projectIdentifier);\n return this\n .createGrid(type, name, scope, actionAttribute)\n .pipe(\n map((grid) => new Board(grid)),\n );\n }\n\n /**\n * Retrieve the board path identifier for looking up grids.\n *\n * @param projectIdentifier The current project identifier\n */\n public boardPath(projectIdentifier:string) {\n return this.PathHelper.projectBoardsPath(projectIdentifier);\n }\n\n protected createCache():StateCacheService {\n const state = this.states.forType('boards');\n return new StateCacheService(state);\n }\n\n private createGrid(type:BoardType, name:string, scope:string, actionAttribute?:string):Observable {\n const payload:any = _.set({ name }, '_links.scope.href', scope);\n payload.options = {\n type,\n };\n\n if (actionAttribute) {\n payload.options.attribute = actionAttribute;\n }\n\n return this\n .apiRoot\n .grids\n .form\n .post(payload)\n .pipe(\n switchMap((form) => this\n .apiRoot\n .grids\n .post(form.payload.$source)),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { PlaceholderUserResource } from 'core-app/features/hal/resources/placeholder-user-resource';\nimport { Observable } from 'rxjs';\n\nexport class ApiV3PlaceholderUserPaths extends ApiV3GettableResource {\n /**\n * Update a placeholder user resource or payload\n * @param resource\n */\n public patch(resource:PlaceholderUserResource|{ name:string }):Observable {\n return this\n .halResourceService\n .patch(this.path, {\n name: resource.name,\n });\n }\n\n /**\n * Delete a placeholder user resource\n */\n public delete():Observable {\n return this\n .halResourceService\n .delete(this.path);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ApiV3PlaceholderUserPaths } from 'core-app/core/apiv3/endpoints/placeholder-users/apiv3-placeholder-user-paths';\nimport { PlaceholderUserResource } from 'core-app/features/hal/resources/placeholder-user-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { Observable } from 'rxjs';\nimport {\n ApiV3ListParameters,\n ApiV3ListResourceInterface,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\n\nexport class ApiV3PlaceholderUsersPaths\n extends ApiV3ResourceCollection\n implements ApiV3ListResourceInterface {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'placeholder_users', ApiV3PlaceholderUserPaths);\n }\n\n /**\n * Load a list of placeholder users with a given list parameter filter\n * @param params\n */\n public list(params?:ApiV3ListParameters):Observable> {\n return this\n .halResourceService\n .get>(this.path + listParamsString(params));\n }\n\n /**\n * Create a new PlaceholderUserResource\n *\n * @param resource\n */\n public post(resource:{ name:string }):Observable {\n return this\n .halResourceService\n .post(\n this.path,\n resource,\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { GroupResource } from 'core-app/features/hal/resources/group-resource';\nimport { Observable } from 'rxjs';\n\nexport class ApiV3GroupPaths extends ApiV3GettableResource {\n /**\n * Update a placeholder user resource or payload\n * @param resource\n */\n public patch(resource:GroupResource|{ name:string }):Observable {\n return this\n .halResourceService\n .patch(this.path, {\n name: resource.name,\n });\n }\n\n /**\n * Delete a placeholder user resource\n */\n public delete():Observable {\n return this\n .halResourceService\n .delete(this.path);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ApiV3GroupPaths } from 'core-app/core/apiv3/endpoints/groups/apiv3-group-paths';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { Observable } from 'rxjs';\nimport {\n ApiV3ListParameters,\n ApiV3ListResourceInterface,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { GroupResource } from 'core-app/features/hal/resources/group-resource';\n\nexport class ApiV3GroupsPaths\n extends ApiV3ResourceCollection\n implements ApiV3ListResourceInterface {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'groups', ApiV3GroupPaths);\n }\n\n /**\n * Load a list of placeholder users with a given list parameter filter\n * @param params\n */\n public list(params?:ApiV3ListParameters):Observable> {\n return this\n .halResourceService\n .get>(this.path + listParamsString(params));\n }\n\n /**\n * Create a new GroupResource\n *\n * @param resource\n */\n public post(resource:{ name:string }):Observable {\n return this\n .halResourceService\n .post(\n this.path,\n resource,\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { Observable } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { INotification } from 'core-app/core/state/in-app-notifications/in-app-notification.model';\n\nexport class ApiV3NotificationPaths extends ApiV3GettableResource {\n @InjectField() http:HttpClient;\n\n public markRead():Observable {\n return this\n .http\n .post(\n `${this.path}/read_ian`,\n {},\n {\n withCredentials: true,\n responseType: 'json',\n },\n );\n }\n\n public markUnread():Observable {\n return this\n .http\n .post(\n `${this.path}/unread_ian`,\n {},\n {\n withCredentials: true,\n responseType: 'json',\n },\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { Observable } from 'rxjs';\nimport {\n ApiV3ListParameters,\n ApiV3ListFilter,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { ApiV3NotificationPaths } from 'core-app/core/apiv3/endpoints/notifications/apiv3-notification-paths';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { HttpClient } from '@angular/common/http';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { ID } from '@datorama/akita';\nimport { INotification } from 'core-app/core/state/in-app-notifications/in-app-notification.model';\n\nexport class ApiV3NotificationsPaths\n extends ApiV3ResourceCollection {\n @InjectField() http:HttpClient;\n\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'notifications', ApiV3NotificationPaths);\n }\n\n public facet(facet:string, params?:ApiV3ListParameters):Observable> {\n if (facet === 'unread') {\n return this.unread(params);\n }\n return this.list(params);\n }\n\n /**\n * Load a list of events with a given list parameter filter\n * @param params\n */\n public list(params?:ApiV3ListParameters):Observable> {\n return this\n .http\n .get>(this.path + listParamsString(params));\n }\n\n public listPath(params?:ApiV3ListParameters):string {\n return this.path + listParamsString(params);\n }\n\n /**\n * Load unread events\n */\n public unread(additional?:ApiV3ListParameters):Observable> {\n const unreadFilter:ApiV3ListFilter = ['readIAN', '=', false];\n const filters = [\n ...(additional?.filters ? additional.filters : []),\n unreadFilter,\n ];\n const params:ApiV3ListParameters = {\n ...additional,\n filters,\n };\n\n return this.list(params);\n }\n\n /**\n * Mark all notifications as read\n * @param ids\n */\n public markRead(ids:Array):Observable {\n return this\n .http\n .post(\n `${this.path}/read_ian${listParamsString({ filters: [['id', '=', ids.map((id) => id.toString())]] })}`,\n {},\n {\n withCredentials: true,\n responseType: 'json',\n },\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Observable } from 'rxjs';\nimport { IView, IViewCreatePayload } from 'core-app/core/state/views/view.model';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { HttpClient } from '@angular/common/http';\nimport { map } from 'rxjs/operators';\nimport {\n ApiV3GettableResource,\n ApiV3ResourceCollection,\n} from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\nexport class ApiV3ViewsPaths extends ApiV3ResourceCollection> {\n @InjectField() http:HttpClient;\n\n constructor(\n protected apiRoot:ApiV3Service,\n protected basePath:string,\n ) {\n super(apiRoot, basePath, 'views');\n }\n\n /**\n * Create a new view\n *\n * @param resource\n * @param type The query's view type\n */\n post(resource:IViewCreatePayload, type:string):Observable {\n return this\n .http\n .post(\n `${this.path}/${type}`,\n resource,\n {\n withCredentials: true,\n responseType: 'json',\n },\n ).pipe(\n map((view:IView) => view),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ConfigurationResource } from 'core-app/features/hal/resources/configuration-resource';\nimport { Observable } from 'rxjs';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3GettableResource } from 'core-app/core/apiv3/paths/apiv3-resource';\n\nexport class Apiv3BackupsPath extends ApiV3GettableResource {\n constructor(protected apiRoot:ApiV3Service,\n readonly basePath:string) {\n super(apiRoot, basePath, 'backups');\n }\n\n public post(backupToken:string, includeAttachments:boolean):Observable {\n return this\n .halResourceService\n .post(\n this.path,\n { backupToken, attachments: includeAttachments },\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { IDay } from 'core-app/core/state/days/day.model';\n\nexport class ApiV3DayPaths extends ApiV3GettableResource {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3DayPaths } from 'core-app/core/apiv3/endpoints/days/api-v3-day-paths';\nimport { IDay } from 'core-app/core/state/days/day.model';\nimport {\n ApiV3GettableResource,\n ApiV3ResourceCollection,\n} from 'core-app/core/apiv3/paths/apiv3-resource';\n\nexport class ApiV3DaysPaths extends ApiV3ResourceCollection {\n // Base path\n public readonly path:string;\n\n constructor(readonly apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'days', ApiV3DayPaths);\n }\n\n // Static paths\n\n // /api/v3/days/week\n public readonly week = new ApiV3GettableResource(this.apiRoot, this.path, 'week', this);\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ApiV3GettableResource,\n ApiV3ResourceCollection,\n} from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { IStorage } from 'core-app/core/state/storages/storage.model';\n\nexport class Apiv3StoragesPaths\n extends ApiV3ResourceCollection> {\n // /api/v3/storages/files\n public readonly files = this.subResource('files');\n\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'storages');\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Injectable,\n Injector,\n} from '@angular/core';\nimport {\n ApiV3GettableResource,\n ApiV3ResourceCollection,\n} from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { Constructor } from '@angular/cdk/table';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { ApiV3GridsPaths } from 'core-app/core/apiv3/endpoints/grids/apiv3-grids-paths';\nimport { ApiV3TimeEntriesPaths } from 'core-app/core/apiv3/endpoints/time-entries/apiv3-time-entries-paths';\nimport { ApiV3CapabilitiesPaths } from 'core-app/core/apiv3/endpoints/capabilities/apiv3-capabilities-paths';\nimport { ApiV3MembershipsPaths } from 'core-app/core/apiv3/endpoints/memberships/apiv3-memberships-paths';\nimport { ApiV3UsersPaths } from 'core-app/core/apiv3/endpoints/users/apiv3-users-paths';\nimport { ApiV3TypesPaths } from 'core-app/core/apiv3/endpoints/types/apiv3-types-paths';\nimport { ApiV3QueriesPaths } from 'core-app/core/apiv3/endpoints/queries/apiv3-queries-paths';\nimport { ApiV3WorkPackagesPaths } from 'core-app/core/apiv3/endpoints/work_packages/api-v3-work-packages-paths';\nimport { ApiV3ProjectPaths } from 'core-app/core/apiv3/endpoints/projects/apiv3-project-paths';\nimport { ApiV3ProjectsPaths } from 'core-app/core/apiv3/endpoints/projects/apiv3-projects-paths';\nimport { ApiV3StatusesPaths } from 'core-app/core/apiv3/endpoints/statuses/apiv3-statuses-paths';\nimport { ApiV3RolesPaths } from 'core-app/core/apiv3/endpoints/roles/apiv3-roles-paths';\nimport { ApiV3VersionsPaths } from 'core-app/core/apiv3/endpoints/versions/apiv3-versions-paths';\nimport { ApiV3RelationsPaths } from 'core-app/core/apiv3/endpoints/relations/apiv3-relations-paths';\nimport { ApiV3NewsPaths } from 'core-app/core/apiv3/endpoints/news/apiv3-news-paths';\nimport { ApiV3HelpTextsPaths } from 'core-app/core/apiv3/endpoints/help_texts/apiv3-help-texts-paths';\nimport { ApiV3ConfigurationPath } from 'core-app/core/apiv3/endpoints/configuration/apiv3-configuration-path';\nimport { ApiV3BoardsPaths } from 'core-app/core/apiv3/virtual/apiv3-boards-paths';\nimport { RootResource } from 'core-app/features/hal/resources/root-resource';\nimport { ApiV3PlaceholderUsersPaths } from 'core-app/core/apiv3/endpoints/placeholder-users/apiv3-placeholder-users-paths';\nimport { ApiV3GroupsPaths } from 'core-app/core/apiv3/endpoints/groups/apiv3-groups-paths';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ApiV3NotificationsPaths } from 'core-app/core/apiv3/endpoints/notifications/apiv3-notifications-paths';\nimport { ApiV3ViewsPaths } from 'core-app/core/apiv3/endpoints/views/apiv3-views-paths';\nimport { Apiv3BackupsPath } from 'core-app/core/apiv3/endpoints/backups/apiv3-backups-path';\nimport { ApiV3DaysPaths } from 'core-app/core/apiv3/endpoints/days/api-v3-days-paths';\nimport { Apiv3StoragesPaths } from 'core-app/core/apiv3/endpoints/storages/apiv3-storages-paths';\n\n@Injectable({ providedIn: 'root' })\nexport class ApiV3Service {\n // /api/v3/attachments\n public readonly attachments = this.apiV3CollectionEndpoint('attachments');\n\n // /api/v3/backups\n public readonly backups = this.apiV3CustomEndpoint(Apiv3BackupsPath);\n\n // /api/v3/configuration\n public readonly configuration = this.apiV3CustomEndpoint(ApiV3ConfigurationPath);\n\n // /api/v3/days\n public readonly days = this.apiV3CustomEndpoint(ApiV3DaysPaths);\n\n // /api/v3/documents\n public readonly documents = this.apiV3CollectionEndpoint('documents');\n\n // /api/v3/file_links\n public readonly file_links = this.apiV3CollectionEndpoint('file_links');\n\n // /api/v3/notifications\n public readonly notifications = this.apiV3CustomEndpoint(ApiV3NotificationsPaths);\n\n // /api/v3/grids\n public readonly grids = this.apiV3CustomEndpoint(ApiV3GridsPaths);\n\n // /api/v3/principals\n public readonly principals = this.apiV3CollectionEndpoint('principals');\n\n // /api/v3/root\n public readonly root = this.apiV3SingularEndpoint('');\n\n // /api/v3/statuses\n public readonly statuses = this.apiV3CustomEndpoint(ApiV3StatusesPaths);\n\n // /api/v3/relations\n public readonly relations = this.apiV3CustomEndpoint(ApiV3RelationsPaths);\n\n // /api/v3/priorities\n public readonly priorities = this.apiV3CollectionEndpoint('priorities');\n\n // /api/v3/time_entries\n public readonly time_entries = this.apiV3CustomEndpoint(ApiV3TimeEntriesPaths);\n\n // /api/v3/actions\n public readonly actions = this.apiV3CollectionEndpoint('actions');\n\n // /api/v3/capabilities\n public readonly capabilities = this.apiV3CustomEndpoint(ApiV3CapabilitiesPaths);\n\n // /api/v3/memberships\n public readonly memberships = this.apiV3CustomEndpoint(ApiV3MembershipsPaths);\n\n // /api/v3/news\n public readonly news = this.apiV3CustomEndpoint(ApiV3NewsPaths);\n\n // /api/v3/storages\n public readonly storages = this.apiV3CustomEndpoint(Apiv3StoragesPaths);\n\n // /api/v3/types\n public readonly types = this.apiV3CustomEndpoint(ApiV3TypesPaths);\n\n // /api/v3/versions\n public readonly versions = this.apiV3CustomEndpoint(ApiV3VersionsPaths);\n\n // /api/v3/work_packages\n public readonly work_packages = this.apiV3CustomEndpoint(ApiV3WorkPackagesPaths);\n\n // /api/v3/queries\n public readonly queries = this.apiV3CustomEndpoint(ApiV3QueriesPaths);\n\n // /api/v3/projects\n public readonly projects = this.apiV3CustomEndpoint(ApiV3ProjectsPaths);\n\n // /api/v3/users\n public readonly users = this.apiV3CustomEndpoint(ApiV3UsersPaths);\n\n // /api/v3/placeholder_users\n public readonly placeholder_users = this.apiV3CustomEndpoint(ApiV3PlaceholderUsersPaths);\n\n // /api/v3/groups\n public readonly groups = this.apiV3CustomEndpoint(ApiV3GroupsPaths);\n\n // /api/v3/roles\n public readonly roles = this.apiV3CustomEndpoint(ApiV3RolesPaths);\n\n // /api/v3/help_texts\n public readonly help_texts = this.apiV3CustomEndpoint(ApiV3HelpTextsPaths);\n\n // /api/v3/job_statuses\n public readonly job_statuses = this.apiV3CollectionEndpoint('job_statuses');\n\n // /api/v3/views\n public readonly views = this.apiV3CustomEndpoint(ApiV3ViewsPaths);\n\n // VIRTUAL boards are /api/v3/grids + a scope filter\n public readonly boards = this.apiV3CustomEndpoint(ApiV3BoardsPaths);\n\n constructor(readonly injector:Injector,\n readonly pathHelper:PathHelperService) {\n }\n\n /**\n * Returns the part of the API that exists both\n * - WITHIN a project scope /api/v3/projects/*\n * - GLOBALLY /api/v3/*\n *\n * The available API endpoints are being restricted automatically by typescript.\n *\n * @param projectIdentifier\n */\n public withOptionalProject(projectIdentifier:string|number|null|undefined):ApiV3ProjectPaths|this {\n if (_.isNil(projectIdentifier)) {\n return this;\n }\n return this.projects.id(projectIdentifier);\n }\n\n public collectionFromString(fullPath:string) {\n const path = fullPath.replace(`${this.pathHelper.api.v3.apiV3Base}/`, '');\n\n return this.apiV3CollectionEndpoint(path);\n }\n\n private apiV3CollectionEndpoint>(segment:string, resource?:Constructor) {\n return new ApiV3ResourceCollection(this, this.pathHelper.api.v3.apiV3Base, segment, resource);\n }\n\n private apiV3CustomEndpoint(cls:Constructor):T {\n return new cls(this, this.pathHelper.api.v3.apiV3Base);\n }\n\n private apiV3SingularEndpoint(segment:string):ApiV3GettableResource {\n return new ApiV3GettableResource(this, this.pathHelper.api.v3.apiV3Base, segment);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { MultiInputState, State } from 'reactivestates';\nimport { Observable } from 'rxjs';\nimport {\n auditTime, map, share, startWith, take,\n} from 'rxjs/operators';\n\nexport interface HasId {\n id:string|null;\n}\n\nexport class StateCacheService {\n protected cacheDurationInMs:number;\n\n protected multiState:MultiInputState;\n\n constructor(state:MultiInputState, holdValuesForSeconds = 3600) {\n this.multiState = state;\n this.cacheDurationInMs = holdValuesForSeconds * 1000;\n }\n\n public state(id:string):State {\n return this.multiState.get(id);\n }\n\n /**\n * Touch the current state to fire subscribers.\n */\n public touch(id:string):void {\n const state = this.multiState.get(id);\n state.putValue(state.value, 'Touching the state');\n }\n\n /**\n * Get the current value\n */\n public current(id:string, fallback?:T):T|undefined {\n return this.state(id).getValueOr(fallback);\n }\n\n /**\n * Sets a promise to the state\n */\n public clearAndLoad(id:string, loader:Observable):Observable {\n const observable = loader\n .pipe(\n take(1),\n share(),\n );\n\n this\n .multiState.get(id)\n .clearAndPutFromPromise(observable.toPromise());\n\n return observable;\n }\n\n /**\n * Update the value due to application changes.\n *\n * @param id The value's identifier.\n * @param val The value.\n *\n * @return a promise of the value when it was inserted into cache\n */\n public updateValue(id:string, val:T):Promise {\n this.putValue(id, val);\n return Promise.resolve(val);\n }\n\n /**\n * Update the value due to application changes.\n *\n * @param resource The value.\n */\n public updateFor(resource:HasId):Promise {\n return this.updateValue(resource.id!, resource as any);\n }\n\n /**\n * Observe the value of the given id\n */\n public observe(id:string):Observable {\n return this.state(id).values$();\n }\n\n /**\n * Observe the changes of the given id\n */\n public changes$(id:string):Observable {\n return this.state(id).changes$();\n }\n\n /**\n * Observe the entire set of loaded results\n */\n public observeAll():Observable {\n return this.multiState\n .observeChange()\n .pipe(\n startWith([]),\n auditTime(250),\n map(() => {\n const mapped:T[] = [];\n _.each(this.multiState.getValueOr({}), (state:State) => {\n if (state.value) {\n mapped.push(state.value);\n }\n });\n\n return mapped;\n }),\n );\n }\n\n /**\n * Clear a set of cached states.\n * @param ids\n */\n public clearSome(...ids:string[]) {\n ids.forEach((id) => this.multiState.get(id).clear());\n }\n\n /**\n * Returns whether the state\n * @param id ID of the state\n * @return {boolean}\n */\n public stale(id:string):boolean {\n const state = this.multiState.get(id);\n\n // If there is an active request that is still pending\n if (state.hasActivePromiseRequest()) {\n return false;\n }\n\n return state.isPristine() || state.isValueOlderThan(this.cacheDurationInMs);\n }\n\n /**\n * Actually insert the value in the state right now.\n *\n * @param id\n * @param val\n */\n protected putValue(id:string, val:T) {\n this.multiState.get(id).putValue(val);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3FormResource } from 'core-app/core/apiv3/forms/apiv3-form-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { HalPayloadHelper } from 'core-app/features/hal/schemas/hal-payload.helper';\nimport { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport class ApiV3GridForm extends ApiV3FormResource {\n /**\n * We need to override the grid widget extraction\n * to pass the correct payload to the API.\n *\n * @param resource\n * @param schema\n */\n public static extractPayload(resource:HalResource|Object, schema:SchemaResource|null = null):Object {\n if (resource instanceof HalResource && schema) {\n const grid = resource;\n const payload = HalPayloadHelper.extractPayloadFromSchema(grid, schema);\n\n // The widget only states the type of the widget resource but does not explain\n // the widget itself. We therefore have to do that by hand.\n if (payload.widgets) {\n payload.widgets = grid.widgets.map((widget:GridWidgetResource) => ({\n id: widget.id,\n startRow: widget.startRow,\n endRow: widget.endRow,\n startColumn: widget.startColumn,\n endColumn: widget.endColumn,\n identifier: widget.identifier,\n options: widget.options,\n }));\n }\n\n return payload;\n }\n\n return resource || {};\n }\n\n /**\n * Extract payload for the form from the request and optional schema.\n *\n * @param request\n * @param schema\n */\n public extractPayload(request:HalResource|Object, schema:SchemaResource|null = null) {\n return ApiV3GridForm.extractPayload(request, schema);\n }\n}\n","import { ApiV3ResourcePath } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { FormResource } from 'core-app/features/hal/resources/form-resource';\nimport { Observable } from 'rxjs';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { HalPayloadHelper } from 'core-app/features/hal/schemas/hal-payload.helper';\n\nexport class ApiV3FormResource extends ApiV3ResourcePath {\n /**\n * POST to the form resource identified by this path\n * @param request The request payload\n */\n public post(request:Object = {}, schema:SchemaResource|null = null):Observable {\n return this\n .halResourceService\n .post(\n this.path,\n this.extractPayload(request, schema),\n );\n }\n\n /**\n * Extract payload for the form from the request and optional schema.\n *\n * @param request\n * @param schema\n */\n public extractPayload(request:T|Object, schema:SchemaResource|null = null) {\n return HalPayloadHelper.extractPayload(request, schema);\n }\n}\n","import {\n ApiV3Filter,\n ApiV3FilterBuilder,\n} from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\n\n/**\n * Add or append filters to a given base URL.\n * If the URL already had filters, it is appending them, overriding existing filters with the same key.\n *\n * @param basePath The base path to add filters to.\n * @param filters An ApiV3FilterBuilder object containing the filters to add.\n * @param params Additional query parameters to add, if any.\n */\nexport function addFiltersToPath(\n basePath:string,\n filters:ApiV3FilterBuilder,\n params:{ [key:string]:string } = {},\n):URL {\n const url = new URL(basePath, window.location.origin);\n\n if (url.searchParams.has('filters')) {\n const existingFilters = JSON.parse(url.searchParams.get('filters') as string) as ApiV3Filter[];\n url.searchParams.set('filters', JSON.stringify(existingFilters.concat(filters.filters)));\n } else {\n url.searchParams.set('filters', filters.toJson());\n }\n\n Object\n .keys(params)\n .forEach((key) => {\n url.searchParams.set(key, params[key]);\n });\n\n return url;\n}\n","import {\n map,\n mergeMap,\n} from 'rxjs/operators';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport {\n forkJoin,\n Observable,\n of,\n} from 'rxjs';\nimport { ApiV3PaginationParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\n/**\n * The API will resolve pageSize=-1 to the maximum value\n * we can request in one call. This is configurable under administration.\n */\nexport const MAGIC_PAGE_NUMBER = -1;\n\n/**\n * Right now, we still support HAL-class based collections as well as interface-based responses.\n */\ntype ApiV3CollectionType = CollectionResource|IHALCollection;\n\n/**\n * Extract the elements of either a HAL class or an interface\n */\nfunction extractCollectionElements(collection:ApiV3CollectionType):T[] {\n // Some API endpoints return an undefined _embedded.elements\n // so we ensure we return an array at all times.\n if (collection instanceof HalResource) {\n return collection.elements || [];\n }\n\n return collection._embedded?.elements || [];\n}\n\n/**\n * Get ALL pages of a potentially paginated APIv3 request, returning an array of collections\n *\n * @param request The requesting callback to request specific pages\n * @param pageSize The pageSize parameter to request, defaults to -1 (the maximum magic page number)\n * @return an array of HAL collections\n */\nexport function getPaginatedCollections>(\n request:(params:ApiV3PaginationParameters) => Observable,\n pageSize = MAGIC_PAGE_NUMBER,\n):Observable[]> {\n return request({ pageSize, offset: 1 })\n .pipe(\n mergeMap((collection:C) => {\n const resolvedSize = collection.pageSize;\n\n if (collection.total > collection.count) {\n const remaining = collection.total - collection.count;\n const pagesRemaining = Math.ceil(remaining / resolvedSize);\n const calls = new Array(pagesRemaining)\n .fill(null)\n .map((_, i) => request({ pageSize: resolvedSize, offset: i + 2 }));\n\n // Branch out and fetch all remaining pages in parallel.\n // Afterwards, merge the resulting list\n return forkJoin(...calls)\n .pipe(\n map((results:C[]) => [collection, ...results]),\n );\n }\n\n // The current page is the only page, return the results.\n return of([collection]);\n }),\n );\n}\n\n/**\n * Get ALL pages of a potentially paginated APIv3 request, returning all concatenated elements.\n *\n * @param request The requesting callback to request specific pages\n * @param pageSize The pageSize parameter to request, defaults to -1 (the maximum magic page number)\n * @return an array of plain HAL resources\n */\nexport function getPaginatedResults(\n request:(params:ApiV3PaginationParameters) => Observable>,\n pageSize = MAGIC_PAGE_NUMBER,\n):Observable {\n return getPaginatedCollections(request, pageSize)\n .pipe(\n map(\n (results:ApiV3CollectionType[]) => results.reduce(\n (acc, next) => acc.concat(extractCollectionElements(next)),\n [] as T[],\n ),\n ),\n );\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { Observable } from 'rxjs';\nimport { ApiV3FilterBuilder, FilterOperator } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\n\nexport type ApiV3ListFilter = [string, FilterOperator, boolean|string[]];\n\nexport interface ApiV3PaginationParameters {\n pageSize:number;\n offset:number;\n}\n\nexport interface ApiV3ListParameters extends Partial {\n filters?:ApiV3ListFilter[];\n sortBy?:[string, string][];\n groupBy?:string;\n select?:string[];\n}\n\nexport interface ApiV3ListResourceInterface {\n list(params:ApiV3ListParameters):Observable>;\n}\n\nexport function listParamsString(params?:ApiV3ListParameters):string {\n const queryProps = [];\n\n if (params && params.sortBy) {\n queryProps.push(`sortBy=${JSON.stringify(params.sortBy)}`);\n }\n\n if (params && params.groupBy) {\n queryProps.push(`groupBy=${params.groupBy}`);\n }\n\n // 0 should not be treated as false\n if (params && params.pageSize !== undefined) {\n queryProps.push(`pageSize=${params.pageSize}`);\n }\n\n // 0 should not be treated as false\n if (params && params.offset !== undefined) {\n queryProps.push(`offset=${params.offset}`);\n }\n\n if (params && params.select !== undefined) {\n queryProps.push(`select=${params.select.join(',')}`);\n }\n\n if (params && params.filters) {\n const filters = new ApiV3FilterBuilder();\n\n params.filters.forEach((filterParam) => {\n filters.add(...filterParam);\n });\n\n queryProps.push(filters.toParams());\n }\n\n let queryPropsString = '';\n\n if (queryProps.length) {\n queryPropsString = `?${queryProps.join('&')}`;\n }\n\n return queryPropsString;\n}\n","/* eslint-disable max-classes-per-file */\n\nimport { Constructor } from '@angular/cdk/table';\nimport {\n SimpleResource,\n SimpleResourceCollection,\n} from 'core-app/core/apiv3/paths/path-resources';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { Observable } from 'rxjs';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport {\n ApiV3Filter,\n ApiV3FilterBuilder,\n} from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { getPaginatedResults } from 'core-app/core/apiv3/helpers/get-paginated-results';\nimport { HttpClient } from '@angular/common/http';\nimport { addFiltersToPath } from 'core-app/core/apiv3/helpers/add-filters-to-path';\n\nexport class ApiV3ResourcePath extends SimpleResource {\n readonly injector = this.apiRoot.injector;\n\n @InjectField() halResourceService:HalResourceService;\n\n constructor(protected apiRoot:ApiV3Service,\n readonly basePath:string,\n readonly id:string|number,\n protected parent?:ApiV3ResourcePath|ApiV3ResourceCollection>) {\n super(basePath, id);\n }\n\n /**\n * Build a singular resource from the current segment\n *\n * @param segment Additional segment to add to the current path\n * @param cls Class to use as return type\n */\n protected subResource(\n segment:string,\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n cls:Constructor = ApiV3GettableResource as unknown as Constructor,\n ):R {\n // eslint-disable-next-line new-cap\n return new cls(this.apiRoot, this.path, segment, this);\n }\n}\n\nexport class ApiV3GettableResource extends ApiV3ResourcePath {\n /**\n * Perform a request to the HalResourceService with the current path\n */\n public get():Observable {\n return this\n .halResourceService\n .get(this.path) as unknown as Observable;\n }\n}\n\nexport class ApiV3GettableResourceCollection> extends ApiV3GettableResource {\n /**\n * Perform a request to the HalResourceService with the current path,\n * loading all pages into a single array\n */\n public getPaginatedResults():Observable {\n return getPaginatedResults(\n (pageParams) => this.halResourceService.request>('get', this.path, pageParams),\n -1,\n );\n }\n}\n\nexport class ApiV3ResourceCollection> extends SimpleResourceCollection {\n readonly injector = this.apiRoot.injector;\n\n @InjectField() http:HttpClient;\n\n @InjectField() halResourceService:HalResourceService;\n\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string,\n segment:string,\n protected resource?:Constructor) {\n super(basePath, segment, resource);\n }\n\n /**\n * Returns an instance of T for the given singular resource ID.\n *\n * @param input Identifier of the resource, may be a string or number, or a HalResource with id property.\n */\n public id(input:string|number|{ id:string|null }):T {\n let id:string;\n if (typeof input === 'string' || typeof input === 'number') {\n id = input.toString();\n } else {\n id = input.id as string;\n }\n\n return new (this.resource || ApiV3GettableResource)(this.apiRoot, this.path, id, this) as T;\n }\n\n public withOptionalId(id?:string|number|null):this|T {\n if (_.isNil(id)) {\n return this;\n }\n return this.id(id);\n }\n\n /**\n * Returns the path string to the requested endpoint.\n */\n public toString():string {\n return this.path;\n }\n\n /**\n * Returns the path string to the requested endpoint.\n */\n public toPath():string {\n return this.path;\n }\n\n /**\n * Returns a new resource with the path extended with a URL query\n * to match the filters.\n *\n * @param filters filter object to filter with\n * @param params additional URL params to append\n * @param resourceClass The APIV3 resource class to instantiate\n */\n public filtered>(filters:ApiV3FilterBuilder, params:{ [key:string]:string } = {}, resourceClass?:Constructor):R {\n const url = addFiltersToPath(this.path, filters, params);\n const cls = resourceClass || ApiV3GettableResourceCollection;\n // eslint-disable-next-line new-cap\n return new cls(this.apiRoot, url.pathname, url.search, this) as R;\n }\n\n /**\n * Signal the endpoint with a given set of filters and select params.\n * Returns an observable response.\n *\n * @param filters filter object to filter with\n * @param select The signalling parameters to request\n * @param params additional URL params to append\n */\n public signalled(filters:ApiV3FilterBuilder, select:string[], params:{ [key:string]:string } = {}):Observable {\n const url = addFiltersToPath(this.path, filters, { ...params, select: select.join(',') });\n\n return this\n .http\n .get(url.toString());\n }\n\n /**\n * Build a singular resource from the current segment\n *\n * @param segment Additional segment to add to the current path\n * @param cls Class to use as return type\n */\n protected subResource>(\n segment:string,\n cls:Constructor = ApiV3GettableResource as unknown as Constructor,\n ):R {\n // eslint-disable-next-line new-cap\n return new cls(this.apiRoot, this.path, segment, this);\n }\n}\n","import { Constructor } from '@angular/cdk/table';\n\n/**\n * Simple resource collection to construct paths for RESTful resources.\n * Base class for APIV3 and BCF API helpers\n */\nexport class SimpleResourceCollection {\n // Base path\n public readonly path:string;\n\n constructor(protected basePath:string, readonly segment:string, protected resource?:Constructor) {\n this.path = `${this.basePath}/${segment}`;\n }\n\n public id(id:string|number):T {\n return new (this.resource || SimpleResource)(this.path, id) as T;\n }\n\n /**\n * Returns either the collection itself, or the resource\n * located by the ID when present.\n *\n * TypeScript will reduce available endpoints to anything available\n * in this collection AND the resource.\n *\n * @param id\n */\n public withOptionalId(id?:string|number):this|T {\n if (_.isNil(id)) {\n return this;\n }\n return this.id(id);\n }\n\n public toString():string {\n return this.path;\n }\n\n public toPath():string {\n return this.path;\n }\n}\n\n/**\n * Singular RESTful resource object identified by a base path and ID\n */\nexport class SimpleResource {\n public readonly path:string;\n\n constructor(readonly basePath:string, readonly segment:string|number) {\n const separator = segment.toString().startsWith('?') ? '' : '/';\n this.path = `${this.basePath}${separator}${segment}`;\n }\n\n public toString() {\n return this.path;\n }\n\n public toPath():string {\n return this.path;\n }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n@Injectable({ providedIn: 'root' })\nexport class BrowserDetector {\n constructor(@Inject(DOCUMENT) private documentElement:Document) {\n }\n\n /**\n * Detect mobile browser based on the Rails determined UA\n * and resulting body class.\n */\n public get isMobile() {\n return this.hasBodyClass('-browser-mobile');\n }\n\n /**\n * ToDo: Remove all occurrences once Edge on Chromium is released\n */\n public get isEdge() {\n return this.hasBodyClass('-browser-edge');\n }\n\n private hasBodyClass(name:string):boolean {\n return this.documentElement.body.classList.contains(name);\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class DeviceService {\n public mobileWidthTreshold = 680;\n\n public get isMobile():boolean {\n return (window.innerWidth < this.mobileWidthTreshold);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport { Injectable } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ConfigurationResource } from 'core-app/features/hal/resources/configuration-resource';\nimport * as moment from 'moment';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Injectable({ providedIn: 'root' })\nexport class ConfigurationService {\n // fetches configuration from the ApiV3 endpoint\n // TODO: this currently saves the request between page reloads,\n // but could easily be stored in localStorage\n private configuration:ConfigurationResource;\n\n public initialized:Promise;\n\n public constructor(\n readonly I18n:I18nService,\n readonly apiV3Service:ApiV3Service,\n ) {\n this.initialized = this\n .loadConfiguration()\n .then(() => true)\n .catch(() => false);\n }\n\n public commentsSortedInDescendingOrder():boolean {\n return this.userPreference('commentSortDescending');\n }\n\n public warnOnLeavingUnsaved():boolean {\n return this.userPreference('warnOnLeavingUnsaved');\n }\n\n public autoHidePopups():boolean {\n return this.userPreference('autoHidePopups');\n }\n\n public isTimezoneSet():boolean {\n return !!this.timezone();\n }\n\n public timezone():string {\n return this.userPreference('timeZone');\n }\n\n public isDirectUploads():boolean {\n return !!this.prepareAttachmentURL;\n }\n\n public get prepareAttachmentURL():string {\n return _.get(this.configuration, ['prepareAttachment', 'href']) as string;\n }\n\n public get maximumAttachmentFileSize():number {\n return this.systemPreference('maximumAttachmentFileSize');\n }\n\n public get perPageOptions():number[] {\n return this.systemPreference('perPageOptions');\n }\n\n public dateFormatPresent():boolean {\n return !!this.systemPreference('dateFormat');\n }\n\n public dateFormat():string {\n return this.systemPreference('dateFormat');\n }\n\n public timeFormatPresent():boolean {\n return !!this.systemPreference('timeFormat');\n }\n\n public timeFormat():string {\n return this.systemPreference('timeFormat');\n }\n\n public startOfWeekPresent():boolean {\n return !!this.systemPreference('startOfWeek');\n }\n\n public startOfWeek():number {\n if (this.startOfWeekPresent()) {\n return this.systemPreference('startOfWeek');\n }\n return moment.localeData(I18n.locale).firstDayOfWeek();\n }\n\n public get hostName():string {\n return this.systemPreference('hostName');\n }\n\n public get activeFeatureFlags():string[] {\n return this.systemPreference('activeFeatureFlags');\n }\n\n private loadConfiguration() {\n return this\n .apiV3Service\n .configuration\n .get()\n .toPromise()\n .then((configuration) => {\n this.configuration = configuration;\n });\n }\n\n private userPreference(pref:string):T {\n return _.get(this.configuration, ['userPreferences', pref]) as T;\n }\n\n private systemPreference(pref:string):T {\n return _.get(this.configuration, pref) as T;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Injectable({ providedIn: 'root' })\nexport class CurrentProjectService {\n private current:{ id:string, identifier:string, name:string };\n\n constructor(\n private PathHelper:PathHelperService,\n private apiV3Service:ApiV3Service,\n ) {\n this.detect();\n }\n\n public get inProjectContext():boolean {\n return this.current !== undefined;\n }\n\n public get path():string|null {\n if (this.current) {\n return this.PathHelper.projectPath(this.current.identifier);\n }\n\n return null;\n }\n\n public get apiv3Path():string|null {\n if (this.current) {\n return this.apiV3Service.projects.id(this.current.id).toString();\n }\n\n return null;\n }\n\n public get id():string|null {\n return this.getCurrent('id');\n }\n\n public get name():string|null {\n return this.getCurrent('name');\n }\n\n public get identifier():string|null {\n return this.getCurrent('identifier');\n }\n\n private getCurrent(key:'id'|'identifier'|'name') {\n if (this.current && this.current[key]) {\n return this.current[key].toString();\n }\n\n return null;\n }\n\n /**\n * Detect the current project from its meta tag.\n */\n public detect() {\n const element:HTMLMetaElement|null = document.querySelector('meta[name=current_project]');\n if (element) {\n this.current = {\n id: element.dataset.projectId!,\n name: element.dataset.projectName!,\n identifier: element.dataset.projectIdentifier!,\n };\n }\n }\n}\n","import {\n Injector,\n NgModule,\n} from '@angular/core';\n\nimport { CurrentUserService } from './current-user.service';\nimport { CurrentUserStore } from './current-user.store';\nimport { CurrentUserQuery } from './current-user.query';\nimport { ErrorReporterBase } from 'core-app/core/errors/error-reporter-base';\nimport { take } from 'rxjs/operators';\n\nexport function bootstrapModule(injector:Injector):void {\n const currentUserService = injector.get(CurrentUserService);\n\n (window.ErrorReporter as ErrorReporterBase)\n .addHook(\n () => currentUserService\n .user$\n .pipe(\n take(1),\n )\n .toPromise()\n .then(({ id }) => ({ user: id || 'anon' })),\n );\n\n const userMeta = document.querySelectorAll('meta[name=current_user]')[0] as HTMLElement|undefined;\n currentUserService.setUser({\n id: userMeta?.dataset.id || null,\n name: userMeta?.dataset.name || null,\n mail: userMeta?.dataset.mail || null,\n });\n}\n\n@NgModule({\n providers: [\n CurrentUserService,\n CurrentUserStore,\n CurrentUserQuery,\n ],\n})\nexport class CurrentUserModule {\n constructor(injector:Injector) {\n bootstrapModule(injector);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Query } from '@datorama/akita';\nimport {\n CurrentUserState,\n CurrentUserStore,\n} from './current-user.store';\n\n@Injectable()\nexport class CurrentUserQuery extends Query {\n constructor(protected store:CurrentUserStore) {\n super(store);\n }\n\n isLoggedIn$ = this.select((state) => !!state.id);\n\n user$ = this.select(({ id, name, mail }) => ({ id, name, mail }));\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport {\n CurrentUser,\n CurrentUserStore,\n} from './current-user.store';\nimport { CurrentUserQuery } from './current-user.query';\nimport { CapabilitiesResourceService } from 'core-app/core/state/capabilities/capabilities.service';\nimport { Observable } from 'rxjs';\nimport {\n distinctUntilChanged,\n filter,\n map,\n switchMap,\n take,\n} from 'rxjs/operators';\nimport { ApiV3ListFilter } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { ICapability } from 'core-app/core/state/capabilities/capability.model';\n\n@Injectable({ providedIn: 'root' })\nexport class CurrentUserService {\n constructor(\n private apiV3Service:ApiV3Service,\n private currentUserStore:CurrentUserStore,\n private currentUserQuery:CurrentUserQuery,\n private capabilitiesService:CapabilitiesResourceService,\n ) {\n this.setupLegacyDataListeners();\n }\n\n public isLoggedIn$ = this.currentUserQuery.isLoggedIn$;\n\n public user$ = this.currentUserQuery.user$;\n\n /**\n * Set the current user object\n *\n * This refetches the global and current project capabilities\n */\n public setUser(user:CurrentUser):void {\n this.currentUserStore.update((state) => ({\n ...state,\n ...user,\n }));\n }\n\n /**\n * Returns the set of capabilities for the given context and/or actions\n */\n public capabilities$(actions:string[] = [], projectContext:string|null):Observable {\n return this\n .principalFilter$()\n .pipe(\n map((userFilter) => {\n const filters:ApiV3ListFilter[] = [userFilter];\n\n if (projectContext) {\n filters.push(['context', '=', [projectContext === 'global' ? 'g' : `p${projectContext}`]]);\n }\n\n if (actions.length > 0) {\n filters.push(['action', '=', actions]);\n }\n\n return { filters, pageSize: -1 };\n }),\n switchMap((params) => this.capabilitiesService.require(params)),\n );\n }\n\n /**\n * Returns an Observable indicating whether the current user has the required capabilities\n * in the provided context.\n */\n public hasCapabilities$(action:string|string[], projectContext:string|null):Observable {\n const actions = _.castArray(action);\n return this\n .capabilities$(actions, projectContext)\n .pipe(\n map((capabilities) => actions.reduce(\n (acc, contextAction) => acc && !!capabilities.find((cap) => cap._links.action.href.endsWith(`/api/v3/actions/${contextAction}`)),\n capabilities.length > 0,\n )),\n distinctUntilChanged(),\n );\n }\n\n /**\n * Returns an Observable indicating whether the current user\n * has any of the required capabilities in the provided context.\n */\n public hasAnyCapabilityOf$(actions:string|string[], projectContext:string|null):Observable {\n const actionsToFilter = _.castArray(actions);\n return this\n .capabilities$(actionsToFilter, projectContext)\n .pipe(\n map((capabilities) => capabilities.reduce(\n (acc, cap) => acc || !!actionsToFilter.find((action) => cap._links.action.href.endsWith(`/api/v3/actions/${action}`)),\n false,\n )),\n distinctUntilChanged(),\n );\n }\n\n /**\n * Returns a principal filter for the current user.\n */\n private principalFilter$():Observable {\n return this\n .user$\n .pipe(\n filter((user) => !!user.id),\n take(1),\n map((user) => ['principal', '=', [user.id as string]]),\n );\n }\n\n // Everything below this is deprecated legacy interfacing and should not be used\n\n private setupLegacyDataListeners() {\n this.currentUserQuery.user$.subscribe((user) => (this._user = user));\n this.currentUserQuery.isLoggedIn$.subscribe((isLoggedIn) => (this._isLoggedIn = isLoggedIn));\n }\n\n private _isLoggedIn = false;\n\n /** @deprecated Use the store mechanism `currentUserQuery.isLoggedIn$` */\n public get isLoggedIn():boolean {\n return this._isLoggedIn;\n }\n\n private _user:CurrentUser = {\n id: null,\n name: null,\n mail: null,\n };\n\n /** @deprecated Use the store mechanism `currentUserQuery.user$` */\n public get userId():string {\n return this._user.id || '';\n }\n\n /** @deprecated Use the store mechanism `currentUserQuery.user$` */\n public get name():string {\n return this._user.name || '';\n }\n\n /** @deprecated Use the store mechanism `currentUserQuery.user$` */\n public get mail():string {\n return this._user.mail || '';\n }\n\n /** @deprecated Use the store mechanism `currentUserQuery.user$` */\n public get href():string {\n return `/api/v3/users/${this.userId}`;\n }\n\n /** @deprecated Use `I18nService.locale` instead */\n public get language():string {\n return I18n.locale || 'en';\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport {\n Store,\n StoreConfig,\n} from '@datorama/akita';\n\nexport interface CurrentUser {\n id:string|null;\n name:string|null;\n mail:string|null;\n}\n\nexport interface CurrentUserState extends CurrentUser {\n}\n\nexport function createInitialState():CurrentUserState {\n return {\n id: null,\n name: null,\n mail: null,\n };\n}\n\n@Injectable()\n@StoreConfig({ name: 'current-user' })\nexport class CurrentUserStore extends Store {\n constructor() {\n super(createInitialState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport * as moment from 'moment-timezone';\nimport {\n Moment,\n} from 'moment';\n\ndeclare module 'moment' {\n interface Moment {\n tz():string|undefined;\n\n tz(timezone:string, keepLocalTime?:boolean):Moment;\n\n zoneAbbr():string;\n\n zoneName():string;\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class TimezoneService {\n constructor(\n readonly configurationService:ConfigurationService,\n readonly I18n:I18nService,\n ) {\n this.setupLocale();\n }\n\n public setupLocale():void {\n moment.locale(I18n.locale);\n }\n\n /**\n * Takes a utc date time string and turns it into\n * a local date time moment object.\n */\n public parseDatetime(datetime:string, format?:string):Moment {\n const d = moment.utc(datetime, format);\n\n if (this.configurationService.isTimezoneSet()) {\n d.local();\n d.tz(this.configurationService.timezone());\n }\n\n return d;\n }\n\n public parseDate(date:Date|string, format?:string):Moment {\n return moment(date, format);\n }\n\n /**\n * Parses the specified datetime and applies the user's configured timezone, if any.\n *\n * This will effectfully transform the [server] provided datetime object to the user's configured local timezone.\n *\n * @param {String} datetime in 'YYYY-MM-DDTHH:mm:ssZ' format\n * @returns {Moment}\n */\n public parseISODatetime(datetime:string):Moment {\n return this.parseDatetime(datetime, 'YYYY-MM-DDTHH:mm:ssZ');\n }\n\n public parseISODate(date:string):Moment {\n return this.parseDate(date, 'YYYY-MM-DD');\n }\n\n public formattedDate(date:string):string {\n const d = this.parseDate(date);\n return d.format(this.getDateFormat());\n }\n\n /**\n * Returns the number of days from today the given dateString is apart.\n * Negative means the date lies in the past.\n * @param dateString\n */\n public daysFromToday(dateString:string):number {\n const date = this.parseDate(dateString);\n const today = moment().startOf('day');\n\n return date.diff(today, 'days');\n }\n\n public formattedTime(datetimeString:string):string {\n return this.parseDatetime(datetimeString).format(this.getTimeFormat());\n }\n\n public formattedDatetime(datetimeString:string):string {\n const c = this.formattedDatetimeComponents(datetimeString);\n return `${c[0]} ${c[1]}`;\n }\n\n public formattedRelativeDateTime(datetimeString:string):string {\n const d = this.parseDatetime(datetimeString);\n return d.fromNow();\n }\n\n public formattedDatetimeComponents(datetimeString:string):string[] {\n const d = this.parseDatetime(datetimeString);\n return [\n d.format(this.getDateFormat()),\n d.format(this.getTimeFormat()),\n ];\n }\n\n public toHours(durationString:string):number {\n return Number(moment.duration(durationString).asHours().toFixed(2));\n }\n\n public toDays(durationString:string):number {\n return Number(moment.duration(durationString).asDays().toFixed(2));\n }\n\n public toISODuration(input:string|number, unit:'hours'|'days'):string {\n return moment.duration(input, unit).toIsoString();\n }\n\n public formattedDuration(durationString:string, unit:'hour'|'days' = 'hour'):string {\n switch (unit) {\n case 'hour':\n return this.I18n.t('js.units.hour', { count: this.toHours(durationString) });\n case 'days':\n return this.I18n.t('js.units.day', { count: this.toDays(durationString) });\n default:\n // Case fallthrough for eslint\n return '';\n }\n }\n\n public formattedISODate(date:any):string {\n return this.parseDate(date).format('YYYY-MM-DD');\n }\n\n public formattedISODateTime(datetime:any):string {\n return datetime.format();\n }\n\n public isValidISODate(date:any):boolean {\n return this.isValid(date, 'YYYY-MM-DD');\n }\n\n public isValidISODateTime(dateTime:string):boolean {\n return this.isValid(dateTime, 'YYYY-MM-DDTHH:mm:ssZ');\n }\n\n public isValid(date:string, dateFormat:string):boolean {\n const format = dateFormat || this.getDateFormat();\n return moment(date, [format], true).isValid();\n }\n\n public getDateFormat():string {\n return this.configurationService.dateFormatPresent() ? this.configurationService.dateFormat() : 'L';\n }\n\n public getTimeFormat():string {\n return this.configurationService.timeFormatPresent() ? this.configurationService.timeFormat() : 'LT';\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Injectable,\n Injector,\n} from '@angular/core';\nimport * as moment from 'moment';\nimport {\n take,\n tap,\n} from 'rxjs/operators';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WeekdayResourceService } from 'core-app/core/state/days/weekday.service';\nimport { IWeekday } from 'core-app/core/state/days/weekday.model';\nimport {\n Observable,\n of,\n} from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class WeekdayService {\n @InjectField() weekdaysService:WeekdayResourceService;\n\n private weekdays:IWeekday[];\n\n constructor(\n readonly injector:Injector,\n ) {}\n\n /**\n * @param date The iso day number (1-7) or a date instance\n * @return {boolean} whether the given iso day is working or not\n */\n public isNonWorkingDay(date:Date|number):boolean {\n const isoDayOfWeek = (typeof date === 'number') ? date : moment(date).isoWeekday();\n return !!(this.weekdays || []).find((wd) => wd.day === isoDayOfWeek && !wd.working);\n }\n\n public get nonWorkingDays():IWeekday[] {\n return this.weekdays.filter((day) => !day.working);\n }\n\n loadWeekdays():Observable {\n if (this.weekdays) {\n return of(this.weekdays);\n }\n\n return this\n .weekdaysService\n .require()\n .pipe(\n take(1),\n tap((weekdays) => {\n this.weekdays = weekdays;\n }),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Inject, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { enterpriseEditionUrl } from 'core-app/core/setup/globals/constants.const';\n\n@Injectable({ providedIn: 'root' })\nexport class BannersService {\n private readonly _banners:boolean = true;\n\n constructor(@Inject(DOCUMENT) protected documentElement:Document) {\n this._banners = documentElement.body.classList.contains('ee-banners-visible');\n }\n\n public get eeShowBanners():boolean {\n return this._banners;\n }\n\n public getEnterPriseEditionUrl({ referrer, hash }:{ referrer?:string, hash?:string } = {}) {\n const url = new URL(enterpriseEditionUrl);\n if (referrer) {\n url.searchParams.set('op_referrer', referrer);\n }\n\n if (hash) {\n url.hash = hash;\n }\n\n return url.toString();\n }\n\n public conditional(bannersVisible?:() => void, bannersNotVisible?:() => void) {\n this._banners ? this.callMaybe(bannersVisible) : this.callMaybe(bannersNotVisible);\n }\n\n private callMaybe(func?:Function) {\n func && func();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { HttpEvent, HttpResponse } from '@angular/common/http';\nimport { from, Observable, of } from 'rxjs';\nimport { share, switchMap } from 'rxjs/operators';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { getType } from 'mime';\nimport {\n OpenProjectFileUploadService, UploadBlob, UploadFile, UploadInProgress,\n} from './op-file-upload.service';\nimport { EXTERNAL_REQUEST_HEADER } from \"core-app/features/hal/http/openproject-header-interceptor\";\n\ninterface PrepareUploadResult {\n url:string;\n form:FormData;\n response:{\n _links:{\n completeUpload:{\n href:string;\n };\n };\n };\n}\n\n@Injectable()\nexport class OpenProjectDirectFileUploadService extends OpenProjectFileUploadService {\n /**\n * Upload a single file, get an UploadResult observable\n * @param {string} url\n * @param {UploadFile} file\n * @param {string} method\n */\n public uploadSingle(url:string, file:UploadFile|UploadBlob, method = 'post', responseType:'text'|'json' = 'text') {\n const observable = from(this.getDirectUploadFormFrom(url, file))\n .pipe(\n switchMap(this.uploadToExternal(file, method, responseType)),\n share(),\n );\n\n return [file, observable] as UploadInProgress;\n }\n\n private uploadToExternal(file:UploadFile|UploadBlob, method:string, responseType:string):(result:PrepareUploadResult) => Observable> {\n return (result) => {\n result.form.append('file', file, file.customName || file.name);\n\n return this.http.request(\n method,\n result.url,\n {\n body: result.form,\n // Observe the response, not the body\n observe: 'events',\n // This is important as the CORS policy for the bucket is * and you can't use credentials then,\n // besides we don't need them here anyway.\n headers: {\n [EXTERNAL_REQUEST_HEADER]: 'true',\n },\n responseType: responseType as 'json',\n // Subscribe to progress events. subscribe() will fire multiple times!\n reportProgress: true,\n },\n ).pipe(\n switchMap(this.finishUpload(result)),\n );\n };\n }\n\n private finishUpload(result:PrepareUploadResult):(result:HttpEvent) => Observable> {\n return (event) => {\n if (event instanceof HttpResponse) {\n return this\n .http\n .get(\n result.response?._links?.completeUpload?.href,\n { observe: 'response' },\n );\n }\n\n // Return as new observable due to switchMap\n return of(event);\n };\n }\n\n public async getDirectUploadFormFrom(url:string, file:UploadFile|UploadBlob):Promise {\n const fileName = file.customName || file.name;\n const contentType = (file.type || (fileName && getType(fileName)) || '' as string);\n\n const formData = new FormData();\n const metadata = {\n fileName,\n contentType,\n description: file.description,\n fileSize: file.size,\n };\n\n /*\n * @TODO We could calculate the MD5 hash here too and pass that.\n * The MD5 hash can be used as the `content-md5` option during the upload to S3 for instance.\n * This way S3 can verify the integrity of the file which we currently don't do.\n */\n\n // add the metadata object\n formData.append(\n 'metadata',\n JSON.stringify(metadata),\n );\n\n const result = await this.http.request(\n 'post',\n url,\n {\n body: formData,\n withCredentials: true,\n responseType: 'json',\n },\n ).toPromise();\n\n const form = new FormData();\n\n _.each(result._links.addAttachment.form_fields, (value, key) => {\n form.append(key, value);\n });\n\n return {\n form,\n url: result._links.addAttachment.href,\n response: result as any,\n };\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport {\n HttpClient, HttpEvent, HttpEventType, HttpResponse,\n} from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { filter, map, share } from 'rxjs/operators';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport interface UploadFile extends File {\n description?:string;\n customName?:string;\n}\n\nexport interface UploadBlob extends Blob {\n description?:string;\n customName?:string;\n name?:string;\n}\n\nexport type UploadHttpEvent = HttpEvent;\nexport type UploadInProgress = [UploadFile, Observable];\n\nexport interface UploadResult {\n uploads:UploadInProgress[];\n finished:Promise;\n}\n\nexport interface MappedUploadResult {\n uploads:UploadInProgress[];\n finished:Promise<{ response:any, uploadUrl:string }[]>;\n}\n\n@Injectable()\nexport class OpenProjectFileUploadService {\n constructor(protected http:HttpClient,\n protected halResource:HalResourceService) {\n }\n\n /**\n * Upload multiple files and return a promise for each uploading file and a single promise for all processed uploads\n * with their accessible URLs returned.\n * @param {string} url\n * @param {UploadFile[]} files\n * @param {string} method\n * @returns {Promise<{response:HalResource; uploadUrl:any}[]>}\n */\n public uploadAndMapResponse(url:string, files:UploadFile[], method = 'post') {\n const { uploads, finished } = this.upload(url, files);\n const mapped = finished\n .then((result:HalResource[]) => result.map((el:HalResource) => ({ response: el, uploadUrl: el.staticDownloadLocation.href }))) as Promise<{ response:HalResource, uploadUrl:string }[]>;\n\n return { uploads, finished: mapped } as MappedUploadResult;\n }\n\n /**\n * Upload multiple files and return a promise for each uploading file and a single promise for all processed uploads\n * Ignore directories.\n */\n public upload(url:string, files:UploadFile[], method = 'post'):UploadResult {\n files = _.filter(files, (file:UploadFile) => file.type !== 'directory');\n const uploads:UploadInProgress[] = _.map(files, (file:UploadFile) => this.uploadSingle(url, file, method));\n\n const finished = this.whenFinished(uploads);\n return { uploads, finished } as UploadResult;\n }\n\n /**\n * Upload a single file, get an UploadResult observable\n * @param {string} url\n * @param {UploadFile} file\n * @param {string} method\n */\n public uploadSingle(url:string, file:UploadFile|UploadBlob, method = 'post', responseType:'text'|'json' = 'json') {\n const formData = new FormData();\n const metadata = {\n description: file.description,\n fileName: file.customName || file.name,\n };\n\n // add the metadata object\n formData.append(\n 'metadata',\n JSON.stringify(metadata),\n );\n\n // Add the file\n formData.append('file', file, metadata.fileName);\n\n const observable = this\n .http\n .request(\n method,\n url,\n {\n body: formData,\n // Observe the response, not the body\n observe: 'events',\n withCredentials: true,\n responseType: responseType as any,\n // Subscribe to progress events. subscribe() will fire multiple times!\n reportProgress: true,\n },\n )\n .pipe(\n share(),\n );\n\n return [file, observable] as UploadInProgress;\n }\n\n /**\n * Create a promise for all uploaded responses when all uploads are fully uploaded.\n *\n * @param {UploadInProgress[]} uploads\n */\n private whenFinished(uploads:UploadInProgress[]):Promise {\n const promises = uploads.map(([_, observable]) => observable\n .pipe(\n filter((evt) => evt.type === HttpEventType.Response),\n map((evt:HttpResponse) => this.halResource.createHalResource(evt.body)),\n )\n .toPromise());\n\n return Promise.all(promises);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { IFCGonDefinition } from '../../features/bim/ifc_models/pages/viewer/ifc-models-data.service';\n\ndeclare global {\n interface Window {\n gon:GonType;\n }\n}\n\nexport interface GonType {\n [key:string]:unknown;\n ifc_models:IFCGonDefinition;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class GonService {\n get(...path:string[]):unknown|null {\n return _.get(window.gon, path, null);\n }\n\n /**\n * Get the gon object\n */\n get gon():GonType {\n return window.gon;\n }\n}\n","import { Title } from '@angular/platform-browser';\nimport { Injectable } from '@angular/core';\n\nconst titlePartsSeparator = ' | ';\n\n@Injectable({ providedIn: 'root' })\nexport class OpTitleService {\n constructor(private titleService:Title) {\n\n }\n\n public get current():string {\n return this.titleService.getTitle();\n }\n\n public get titleParts():string[] {\n return this.current.split(titlePartsSeparator);\n }\n\n public setFirstPart(value:string) {\n const parts = this.titleParts;\n parts[0] = value;\n\n this.titleService.setTitle(parts.join(titlePartsSeparator));\n }\n\n public prependFirstPart(value:string):void {\n const parts = this.titleParts;\n parts.unshift(value);\n\n this.titleService.setTitle(parts.join(titlePartsSeparator));\n }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * General components\n */\nexport interface GlobalI18n {\n t(translateId:string, parameters?:unknown):T;\n\n lookup(translateId:string):boolean|undefined;\n\n toNumber(num:number, options?:ToNumberOptions):string;\n\n toPercentage(num:number, options?:ToPercentageOptions):string;\n\n toCurrency(num:number, options?:ToCurrencyOptions):string;\n\n strftime(date:Date, format:string):string;\n\n toHumanSize(num:number, options?:ToHumanSizeOptions):string;\n\n toTime(format:string, date:Date):string;\n\n locale:string;\n firstDayOfWeek:number;\n pluralization:any;\n}\n\ninterface ToNumberOptions {\n precision?:number;\n separator?:string;\n delimiter?:string;\n strip_insignificant_zeros?:boolean;\n}\n\ntype ToPercentageOptions = ToNumberOptions;\n\ninterface ToCurrencyOptions extends ToNumberOptions {\n format?:string;\n unit?:string;\n sign_first?:boolean;\n}\n\ninterface ToHumanSizeOptions extends ToNumberOptions {\n format?:string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class I18nService {\n private i18n:GlobalI18n = window.I18n;\n\n public get locale():string {\n return this.i18n.locale;\n }\n\n public t = this.i18n.t.bind(this.i18n) as GlobalI18n['t'];\n\n public lookup = this.i18n.lookup.bind(this.i18n) as GlobalI18n['lookup'];\n\n public toTime = this.i18n.toTime.bind(this.i18n) as GlobalI18n['toTime'];\n\n public toNumber = this.i18n.toNumber.bind(this.i18n) as GlobalI18n['toNumber'];\n\n public toPercentage = this.i18n.toPercentage.bind(this.i18n) as GlobalI18n['toPercentage'];\n\n public toCurrency = this.i18n.toCurrency.bind(this.i18n) as GlobalI18n['toCurrency'];\n\n public strftime = this.i18n.strftime.bind(this.i18n) as GlobalI18n['strftime'];\n\n public toHumanSize = this.i18n.toHumanSize.bind(this.i18n) as GlobalI18n['toHumanSize'];\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\n\nexport const indicatorLocationSelector = '.loading-indicator--location';\nexport const indicatorBackgroundSelector = '.loading-indicator--background';\n\nexport function withLoadingIndicator(indicator:LoadingIndicator, delayStopTime?:number):(source:Observable) => Observable {\n return (source$:Observable) => {\n indicator.start();\n\n return source$.pipe(\n tap(\n () => indicator.delayedStop(delayStopTime),\n () => indicator.stop(),\n () => indicator.stop(),\n ),\n );\n };\n}\n\nexport function withDelayedLoadingIndicator(indicator:() => LoadingIndicator):(source:Observable) => Observable {\n return (source$:Observable) => {\n setTimeout(() => indicator().start());\n\n return source$.pipe(\n tap(\n () => undefined,\n () => indicator().stop(),\n () => indicator().stop(),\n ),\n );\n };\n}\n\nexport class LoadingIndicator {\n private indicatorTemplate =\n `
\n
\n
\n
\n
\n
\n
\n
\n
\n `;\n\n constructor(public indicator:JQuery) {\n }\n\n public set promise(promise:Promise) {\n this.start();\n\n // Keep bound method around\n const stopper = () => this.delayedStop();\n\n promise\n .then(stopper)\n .catch(stopper);\n }\n\n public start() {\n // If we're currently having an active indicator, remove that one\n this.stop();\n this.indicator.prepend(this.indicatorTemplate);\n }\n\n public delayedStop(time = 25) {\n setTimeout(() => this.stop(), time);\n }\n\n public stop() {\n this.indicator.find('.loading-indicator--background').remove();\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class LoadingIndicatorService {\n // Provide shortcut to the primarily used indicators\n public get table() {\n return this.indicator('table');\n }\n\n public get wpDetails() {\n return this.indicator('wpDetails');\n }\n\n public get modal() {\n return this.indicator('modal');\n }\n\n // Returns a getter function to an indicator\n // in case the indicator is shown conditionally\n public getter(name:string):() => LoadingIndicator {\n return this.indicator.bind(this, name);\n }\n\n // Return an indicator by name or element\n public indicator(indicator:string|JQuery):LoadingIndicator {\n if (typeof indicator === 'string') {\n indicator = this.getIndicatorAt(indicator);\n }\n\n return new LoadingIndicator(indicator);\n }\n\n private getIndicatorAt(name:string):JQuery {\n return jQuery(indicatorLocationSelector).filter(`[data-indicator-name=\"${name}\"]`);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Injectable({ providedIn: 'root' })\nexport class MainMenuToggleService {\n public toggleTitle:string;\n\n private elementWidth:number;\n\n private elementMinWidth = 11;\n\n private readonly defaultWidth:number = 230;\n\n private readonly localStorageKey:string = 'openProject-mainMenuWidth';\n\n private readonly localStorageStateKey:string = 'openProject-mainMenuCollapsed';\n\n @InjectField() currentProject:CurrentProjectService;\n\n private global = (window as any);\n\n private htmlNode = document.getElementsByTagName('html')[0];\n\n private mainMenu = jQuery('#main-menu')[0]; // main menu, containing sidebar and resizer\n\n private hideElements = jQuery('.can-hide-navigation');\n\n // Title needs to be sync in main-menu-toggle.component.ts and main-menu-resizer.component.ts\n private titleData = new BehaviorSubject('');\n\n public titleData$ = this.titleData.asObservable();\n\n // Notes all changes of the menu size (currently needed in wp-resizer.component.ts)\n private changeData = new BehaviorSubject({});\n\n public changeData$ = this.changeData.asObservable();\n\n constructor(protected I18n:I18nService,\n public injector:Injector,\n readonly deviceService:DeviceService) {\n }\n\n public initializeMenu():void {\n if (!this.mainMenu) {\n return;\n }\n\n this.elementWidth = parseInt(window.OpenProject.guardedLocalStorage(this.localStorageKey) as string);\n const menuCollapsed = window.OpenProject.guardedLocalStorage(this.localStorageStateKey) as string;\n\n if (!this.elementWidth) {\n this.saveWidth(this.mainMenu.offsetWidth);\n } else if (menuCollapsed && JSON.parse(menuCollapsed)) {\n this.closeMenu();\n } else {\n this.setWidth();\n }\n\n const currentProject:CurrentProjectService = this.injector.get(CurrentProjectService);\n if (jQuery(document.body).hasClass('controller-my') && this.elementWidth === 0 || currentProject.id === null) {\n this.saveWidth(this.defaultWidth);\n }\n\n // mobile version default: hide menu on initialization\n this.closeWhenOnMobile();\n }\n\n // click on arrow or hamburger icon\n public toggleNavigation(event?:JQuery.TriggeredEvent|Event):void {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n }\n\n if (!this.showNavigation) { // sidebar is hidden -> show menu\n if (this.deviceService.isMobile) { // mobile version\n this.setWidth(window.innerWidth);\n } else { // desktop version\n const savedWidth = parseInt(window.OpenProject.guardedLocalStorage(this.localStorageKey) as string);\n const widthToSave = savedWidth >= this.elementMinWidth ? savedWidth : this.defaultWidth;\n\n this.saveWidth(widthToSave);\n }\n } else { // sidebar is expanded -> close menu\n this.closeMenu();\n }\n\n // Set focus on first visible main menu item.\n // This needs to be called after AngularJS has rendered the menu, which happens some when after(!) we leave this\n // method here. So we need to set the focus after a timeout.\n setTimeout(() => {\n jQuery('#main-menu [class*=\"-menu-item\"]:visible').first().focus();\n }, 500);\n }\n\n public closeMenu():void {\n this.setWidth(0);\n window.OpenProject.guardedLocalStorage(this.localStorageStateKey, 'true');\n jQuery('.searchable-menu--search-input').blur();\n }\n\n public closeWhenOnMobile():void {\n if (this.deviceService.isMobile) {\n this.closeMenu();\n window.OpenProject.guardedLocalStorage(this.localStorageStateKey, 'false');\n }\n }\n\n public saveWidth(width?:number):void {\n this.setWidth(width);\n window.OpenProject.guardedLocalStorage(this.localStorageKey, String(this.elementWidth));\n window.OpenProject.guardedLocalStorage(this.localStorageStateKey, String(this.elementWidth === 0));\n }\n\n public setWidth(width?:any):void {\n if (width !== undefined) {\n // Leave a minimum amount of space for space for the content\n const maxMenuWidth = this.deviceService.isMobile ? window.innerWidth - 120 : window.innerWidth - 520;\n if (width > maxMenuWidth) {\n this.elementWidth = maxMenuWidth;\n } else {\n this.elementWidth = width as number;\n }\n }\n\n this.snapBack();\n this.setToggleTitle();\n this.toggleClassHidden();\n\n this.global.showNavigation = this.showNavigation;\n this.htmlNode.style.setProperty('--main-menu-width', `${this.elementWidth}px`);\n\n // Send change event when size of menu is changing (menu toggled or resized)\n const changeEvent = jQuery.Event('change');\n this.changeData.next(changeEvent);\n }\n\n public get showNavigation():boolean {\n return (this.elementWidth >= this.elementMinWidth);\n }\n\n private snapBack():void {\n if (this.elementWidth < this.elementMinWidth) {\n this.elementWidth = 0;\n }\n }\n\n private setToggleTitle():void {\n if (this.showNavigation) {\n this.toggleTitle = this.I18n.t('js.label_hide_project_menu');\n } else {\n this.toggleTitle = this.I18n.t('js.label_expand_project_menu');\n }\n this.titleData.next(this.toggleTitle);\n }\n\n private toggleClassHidden():void {\n this.hideElements.toggleClass('hidden-navigation', !this.showNavigation);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { input } from 'reactivestates';\nimport { Observable } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nexport type ModelLinks = { [action:string]:any };\nexport type ModelLinksHash = { [model:string]:ModelLinks };\n\n@Injectable({ providedIn: 'root' })\nexport class AuthorisationService {\n private links = input({});\n\n public initModelAuth(modelName:string, modelLinks:ModelLinks) {\n this.links.doModify((value:ModelLinksHash) => {\n const links = { ...value };\n links[modelName] = modelLinks;\n return links;\n });\n }\n\n public observeUntil(unsubscribe:Observable) {\n return this.links.values$().pipe(takeUntil(unsubscribe));\n }\n\n public can(modelName:string, action:string) {\n const links:ModelLinksHash = this.links.getValueOr({});\n return links[modelName] && (action in links[modelName]);\n }\n\n public cannot(modelName:string, action:string) {\n return !this.can(modelName, action);\n }\n}\n","import { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\n\nexport class ApiV3Paths {\n readonly apiV3Base:string;\n\n constructor(basePath:string) {\n this.apiV3Base = `${basePath}/api/v3`;\n }\n\n public get openApiSpecPath():string {\n return `${this.apiV3Base}/spec.json`;\n }\n\n /**\n * Preview markup path\n *\n * Primarily used from ckeditor-augmented-textarea\n * https://github.com/opf/commonmark-ckeditor-build/\n *\n * @param context\n */\n public previewMarkup(context:string) {\n const base = `${this.apiV3Base}/render/markdown`;\n\n if (context) {\n return `${base}?context=${context}`;\n }\n return base;\n }\n\n /**\n * Principals autocompleter path\n *\n * Primarily used from ckeditor-augmented-textarea\n * https://github.com/opf/commonmark-ckeditor-build/\n *\n */\n public principals(projectId:string|number, term:string|null) {\n const filters:ApiV3FilterBuilder = new ApiV3FilterBuilder();\n // Only real and activated users:\n filters.add('status', '!', ['3']);\n // that are members of that project:\n filters.add('member', '=', [projectId.toString()]);\n // That are users:\n filters.add('type', '=', ['User', 'Group']);\n\n if (term && term.length > 0) {\n // Containing the that substring:\n filters.add('name', '~', [term]);\n }\n\n return `${this.apiV3Base\n }/principals?${\n filters.toParams({ sortBy: '[[\"name\",\"asc\"]]', offset: '1', pageSize: '10' })}`;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { ApiV3Paths } from './apiv3-paths';\n\n@Injectable({ providedIn: 'root' })\nexport class PathHelperService {\n public readonly appBasePath = window.appBasePath || '';\n\n public readonly api = {\n v3: new ApiV3Paths(this.appBasePath),\n };\n\n public get staticBase() {\n return this.appBasePath;\n }\n\n public attachmentDownloadPath(attachmentIdentifier:string, slug:string|undefined) {\n const path = `${this.staticBase}/attachments/${attachmentIdentifier}`;\n\n if (slug) {\n return `${path}/${slug}`;\n }\n return path;\n }\n\n public attachmentContentPath(attachmentIdentifier:number|string) {\n return `${this.staticBase}/attachments/${attachmentIdentifier}/content`;\n }\n\n public ifcModelsPath(projectIdentifier:string) {\n return `${this.staticBase}/projects/${projectIdentifier}/ifc_models`;\n }\n\n public ifcModelsNewPath(projectIdentifier:string) {\n return `${this.ifcModelsPath(projectIdentifier)}/new`;\n }\n\n public ifcModelsEditPath(projectIdentifier:string, modelId:number|string) {\n return `${this.ifcModelsPath(projectIdentifier)}/${modelId}/edit`;\n }\n\n public ifcModelsDeletePath(projectIdentifier:string, modelId:number|string) {\n return `${this.ifcModelsPath(projectIdentifier)}/${modelId}`;\n }\n\n public bimDetailsPath(projectIdentifier:string, workPackageId:string, viewpoint:number|string|null = null) {\n let path = `${this.projectPath(projectIdentifier)}/bcf/details/${workPackageId}`;\n\n if (viewpoint !== null) {\n path += `?query_props=%7B\"t\"%3A\"id%3Adesc\"%2C\"dr\"%3A\"splitCards\"%7D&viewpoint=${viewpoint}`;\n }\n\n return path;\n }\n\n public highlightingCssPath() {\n return `${this.staticBase}/highlighting/styles`;\n }\n\n public forumPath(projectIdentifier:string, forumIdentifier:string) {\n return `${this.projectForumPath(projectIdentifier)}/${forumIdentifier}`;\n }\n\n public keyboardShortcutsHelpPath() {\n return `${this.staticBase}/help/keyboard_shortcuts`;\n }\n\n public messagePath(messageIdentifier:string) {\n return `${this.staticBase}/topics/${messageIdentifier}`;\n }\n\n public myPagePath() {\n return `${this.staticBase}/my/page`;\n }\n\n public myNotificationsSettingsPath() {\n return `${this.staticBase}/my/notifications`;\n }\n\n public newsPath(newsId:string) {\n return `${this.staticBase}/news/${newsId}`;\n }\n\n public notificationsPath():string {\n return `${this.staticBase}/notifications`;\n }\n\n public loginPath() {\n return `${this.staticBase}/login`;\n }\n\n public projectsPath() {\n return `${this.staticBase}/projects`;\n }\n\n public projectsNewPath():string {\n return `${this.staticBase}/projects/new`;\n }\n\n public projectPath(projectIdentifier:string) {\n return `${this.projectsPath()}/${projectIdentifier}`;\n }\n\n public projectActivityPath(projectIdentifier:string) {\n return `${this.projectPath(projectIdentifier)}/activity`;\n }\n\n public projectForumPath(projectIdentifier:string) {\n return `${this.projectPath(projectIdentifier)}/forums`;\n }\n\n public projectCalendarPath(projectId:string) {\n return `${this.projectPath(projectId)}/calendar`;\n }\n\n public projectMembershipsPath(projectId:string) {\n return `${this.projectPath(projectId)}/members`;\n }\n\n public projectNewsPath(projectId:string) {\n return `${this.projectPath(projectId)}/news`;\n }\n\n public projectTimeEntriesPath(projectIdentifier:string) {\n return `${this.projectPath(projectIdentifier)}/cost_reports`;\n }\n\n public projectWikiPath(projectId:string) {\n return `${this.projectPath(projectId)}/wiki`;\n }\n\n public projectWorkPackagePath(projectId:string, wpId:string|number) {\n return `${this.projectWorkPackagesPath(projectId)}/${wpId}`;\n }\n\n public projectWorkPackagesPath(projectId:string) {\n return `${this.projectPath(projectId)}/work_packages`;\n }\n\n public projectWorkPackageNewPath(projectId:string) {\n return `${this.projectWorkPackagesPath(projectId)}/new`;\n }\n\n public projectBoardsPath(projectIdentifier:string|null) {\n if (projectIdentifier) {\n return `${this.projectPath(projectIdentifier)}/boards`;\n }\n return `${this.staticBase}/boards`;\n }\n\n public projectDashboardsPath(projectIdentifier:string) {\n return `${this.projectPath(projectIdentifier)}/dashboards`;\n }\n\n public timeEntriesPath(workPackageId:string|number) {\n const suffix = '/time_entries';\n\n if (workPackageId) {\n return this.workPackagePath(workPackageId) + suffix;\n }\n return this.staticBase + suffix; // time entries root path\n }\n\n public usersPath() {\n return `${this.staticBase}/users`;\n }\n\n public groupsPath() {\n return `${this.staticBase}/groups`;\n }\n\n public placeholderUsersPath() {\n return `${this.staticBase}/placeholder_users`;\n }\n\n public userPath(id:string|number) {\n return `${this.usersPath()}/${id}`;\n }\n\n public placeholderUserPath(id:string|number) {\n return `${this.placeholderUsersPath()}/${id}`;\n }\n\n public groupPath(id:string|number) {\n return `${this.groupsPath()}/${id}`;\n }\n\n public rolesPath() {\n return `${this.staticBase}/roles`;\n }\n\n public rolePath(id:string|number) {\n return `${this.rolesPath()}/${id}`;\n }\n\n public versionsPath() {\n return `${this.staticBase}/versions`;\n }\n\n public versionEditPath(id:string|number) {\n return `${this.staticBase}/versions/${id}/edit`;\n }\n\n public versionShowPath(id:string|number) {\n return `${this.staticBase}/versions/${id}`;\n }\n\n public workPackagesPath() {\n return `${this.staticBase}/work_packages`;\n }\n\n public workPackagePath(id:string|number) {\n return `${this.staticBase}/work_packages/${id}`;\n }\n\n public workPackageCopyPath(workPackageId:string|number) {\n return `${this.workPackagePath(workPackageId)}/copy`;\n }\n\n public workPackageDetailsCopyPath(projectIdentifier:string, workPackageId:string|number) {\n return `${this.projectWorkPackagesPath(projectIdentifier)}/details/${workPackageId}/copy`;\n }\n\n public workPackagesBulkDeletePath() {\n return `${this.workPackagesPath()}/bulk`;\n }\n\n public textFormattingHelp() {\n return `${this.staticBase}/help/text_formatting`;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\n\n@Injectable()\nexport class FirstRouteService {\n public name:string;\n\n public params:any;\n\n constructor() {}\n\n public get isEmpty() {\n return !this.name;\n }\n\n public setIfFirst(stateName:string|undefined, params:any) {\n if (!this.isEmpty || !stateName) {\n return;\n }\n\n this.name = stateName;\n this.params = params;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport { State } from 'reactivestates';\nimport { Injectable } from '@angular/core';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { Observable } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { States } from 'core-app/core/states/states.service';\nimport { ISchemaProxy, SchemaProxy } from 'core-app/features/hal/schemas/schema-proxy';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { WorkPackageSchemaProxy } from 'core-app/features/hal/schemas/work-package-schema-proxy';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\n\n@Injectable()\nexport class SchemaCacheService extends StateCacheService {\n constructor(readonly states:States,\n readonly halResourceService:HalResourceService) {\n super(states.schemas);\n }\n\n public state(id:string|HalResource):State {\n return super.state(this.stateKey(id));\n }\n\n /**\n * Returns the schema of the provided resource.\n * This method assumes the schema is loaded and will fail if it is not.\n * @deprecated Assuming the schema to be loaded is deprecated. Rely on the states instead.\n * @param resource The HalResource for which the schema is to be returned\n * @return The schema for the HalResource\n */\n of(resource:HalResource):ISchemaProxy {\n const schema = this.state(resource).value;\n\n if (!schema) {\n throw new Error(`Schema for resource ${resource} was expected to be loaded but isn't.`);\n }\n\n if (resource._type === 'WorkPackage') {\n return WorkPackageSchemaProxy.create(schema, resource);\n }\n return SchemaProxy.create(schema, resource);\n }\n\n public getSchemaHref(resource:HalResource):string {\n const href = resource.$links.schema?.href;\n\n if (!href) {\n throw new Error(`Resource ${resource} has no schema to load.`);\n }\n\n return href;\n }\n\n /**\n * Ensure the given schema identified by its href is currently loaded.\n * @param resource The resource with a schema property or a string to the schema href.\n * @return A promise with the loaded schema.\n */\n ensureLoaded(resource:HalResource|string):Promise {\n const href = resource instanceof HalResource ? this.getSchemaHref(resource) : resource;\n\n return this\n .requireAndStream(href)\n .pipe(\n take(1),\n )\n .toPromise() as unknown as Promise;\n }\n\n /**\n * Require the value to be loaded either when forced or the value is stale\n * according to the cache interval specified for this service.\n *\n * Returns an observable to the values stream of the state.\n *\n * @param id The state to require\n * @param force Load the value anyway.\n */\n public requireAndStream(href:string, force = false):Observable {\n // Refresh when stale or being forced\n if (this.stale(href) || force) {\n this.clearAndLoad(\n href,\n this.load(href),\n );\n }\n\n return this.state(href).values$();\n }\n\n /**\n * Load the associated schema for the given work package, if needed.\n */\n protected load(href:string):Observable {\n return this\n .halResourceService\n .get(href)\n .pipe(\n take(1),\n );\n }\n\n protected loadAll(hrefs:string[]):Promise {\n return Promise.all(hrefs.map((href) => this.load(href)));\n }\n\n /**\n * Places the schema in the schema state of the resource.\n * @param resource The resource for which the schema is to be updated\n * @param schema\n */\n update(resource:HalResource, schema:SchemaResource) {\n this.multiState.get(this.stateKey(resource)).putValue(schema);\n }\n\n private stateKey(id:string|HalResource):string {\n if (id instanceof HalResource) {\n return this.getSchemaHref(id);\n }\n return id;\n }\n}\n","export const enterpriseEditionUrl = 'https://www.openproject.org/enterprise-edition/?op_edition=community-edition';\n\nexport const contactUrl:{ [locale:string]:string } = {\n en: 'https://www.openproject.org/contact/',\n de: 'https://www.openproject.org/de/kontakt/',\n};\n\nexport const pricingUrl = 'https://www.openproject.org/pricing';\n\nexport const enterpriseDocsUrl:{ [key:string]:string } = {\n website: 'https://www.openproject.org/enterprise-edition/',\n boards: 'https://www.openproject.org/docs/user-guide/agile-boards/#action-boards-enterprise-add-on',\n tableHighlighting: 'https://www.openproject.org/docs/user-guide/work-packages/work-package-table-configuration/#attribute-highlighting-enterprise-add-on',\n graphWidgets: 'https://www.openproject.org/docs/user-guide/project-overview/#work-package-graph-widgets-enterprise-add-on',\n};\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2020 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n\nimport { ComponentType } from '@angular/cdk/portal';\nimport { ApplicationRef } from '@angular/core';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\n\n/**\n * Optional bootstrap definition to allow selecting all matching\n * DOM nodes to manually bootstrap them.\n *\n * This differs from Angular's bootstrap module definition since it expects these\n * entries to be present on ALL pages. This is never the case for our optional\n * bootstrapped components.\n */\nexport interface OptionalBootstrapDefinition {\n // The DOM selector used to locate an optional node\n selector:string;\n // The component class tied to it.\n cls:ComponentType;\n // Whether the component may be embeddable in dynamically generated responses\n // e.g., previews\n embeddable?:boolean;\n}\n\n/**\n * Static lookup table for dynamically bootstrapped components within our application\n */\nexport class DynamicBootstrapper {\n private static optionalBoostrapComponents:OptionalBootstrapDefinition[] = [];\n\n /**\n * Register an optional bootstrap component to be dynamically bootstrapped\n * whenever it occurs in the initially loaded DOM.\n *\n * @param {OptionalBootstrapDefinition} definition\n */\n public static register(...defs:OptionalBootstrapDefinition[]) {\n this.optionalBoostrapComponents.push(...defs);\n }\n\n /**\n * Perform bootstrapping of matched elements within the given document.\n *\n * @param {ApplicationRef} appRef The application reference to lookup elements.\n * @param {Document} doc The document element\n * @param {OptionalBootstrapDefinition[]|undefined} definitions An optional set of components to bootstrap\n */\n public static bootstrapOptionalDocument(appRef:ApplicationRef, doc:Document, definitions = this.optionalBoostrapComponents) {\n this.performBootstrap(appRef, doc, false, definitions);\n }\n\n /**\n * Perform bootstrapping of embeddable elements within the given node.\n *\n * @param {ApplicationRef} appRef The application reference to lookup elements.\n * @param {HTMLElement} element A node to bootstrap elements within.\n * @param {OptionalBootstrapDefinition[]|undefined} definitions An optional set of components to bootstrap\n */\n public static bootstrapOptionalEmbeddable(appRef:ApplicationRef, element:HTMLElement, definitions = this.optionalBoostrapComponents) {\n // Delay the execution to avoid bootstrapping the embedded components while\n // the app is running the Change Detection. This was throwing \"ApplicationRef.tick\n // is called recursively\" error because of bootstrapOptionalEmbeddable and\n // bootstrapOptionalDocument were called too close (ie: ckEditor macros).\n Promise.resolve().then(() => this.performBootstrap(appRef, element, true, definitions));\n }\n\n /**\n * Get embeddable components\n */\n public static getEmbeddable() {\n return this.optionalBoostrapComponents.filter((el) => el.embeddable);\n }\n\n /**\n * Bootstrap within a given document (globally, all components available) or within an element (embeddable compoennts\n * only).\n *\n * @param {ApplicationRef} appRef\n * @param {Document | HTMLElement} root\n * @param {boolean} embedded\n */\n private static performBootstrap(appRef:ApplicationRef, root:Document|HTMLElement, embedded:boolean, definitions:OptionalBootstrapDefinition[]) {\n definitions\n .forEach((el) => {\n // Skip non-embeddable components in an embedded bootstrap.\n if (embedded && !el.embeddable) {\n return;\n }\n\n const elements = root.querySelectorAll(el.selector);\n for (let i = 0; i < elements.length; i++) {\n const target = elements[i];\n\n if (!embedded && target.closest('[op-dynamic-bootstrap]')) {\n debugLog(`Skipping nested bootstrap ${el.selector} in %O`, target);\n return;\n }\n\n appRef.bootstrap(el.cls, target);\n target.setAttribute('op-dynamic-bootstrap', 'true');\n }\n });\n }\n}\n","export const demoProjectName = 'Demo project';\nexport const scrumDemoProjectName = 'Scrum project';\nexport const onboardingTourStorageKey = 'openProject-onboardingTour';\nexport type OnboardingTourNames = 'prepareBacklogs'|'backlogs'|'taskboard'|'homescreen'|'main';\nexport enum ProjectName {\n demo = 'demo',\n scrum = 'scrum',\n}\n\nexport function waitForElement(element:string, container:string, execFunction:Function) {\n // Wait for the element to be ready\n const observer = new MutationObserver((mutations, observerInstance) => {\n if (jQuery(element).length) {\n observerInstance.disconnect(); // stop observing\n execFunction();\n }\n });\n observer.observe(jQuery(container)[0], {\n childList: true,\n subtree: true,\n });\n}\n\nexport function demoProjectsLinks() {\n const demoProjects = [];\n const demoProjectsLink = jQuery(`.widget-box.welcome a:contains(${demoProjectName})`);\n const scrumDemoProjectsLink = jQuery(`.widget-box.welcome a:contains(${scrumDemoProjectName})`);\n\n if (demoProjectsLink.length) {\n demoProjects.push(demoProjectsLink);\n }\n if (scrumDemoProjectsLink.length) {\n demoProjects.push(scrumDemoProjectsLink);\n }\n\n return demoProjects;\n}\n\nexport function preventClickHandler(e:any) {\n e.preventDefault();\n e.stopPropagation();\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\n(function ($) {\n $(() => {\n // set selected page for menu tree if provided.\n $('[data-selected-page]').closest('.tree-menu--container').each((_i:number, tree:HTMLElement) => {\n const selectedPage = $(tree).data('selected-page');\n\n if (selectedPage) {\n const selected = $(`[slug=\"${selectedPage}\"]`, tree);\n selected.toggleClass('-selected', true);\n if (selected.length > 0) {\n selected[0].scrollIntoView();\n }\n }\n });\n\n function toggle(event:any) {\n // ignore the event if a key different from ENTER was pressed.\n if (event.type === 'keypress' && event.which !== 13) {\n return false;\n }\n\n const target = $(event.target);\n const targetList = target.closest('ul.-with-hierarchy > li');\n targetList.toggleClass('-hierarchy-collapsed -hierarchy-expanded');\n return false;\n }\n\n // set click handlers for expanding and collapsing tree nodes\n $('.pages-hierarchy.-with-hierarchy .tree-menu--hierarchy-span').on('click keypress', toggle);\n });\n}(jQuery));\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\n/**\n * A set of global helpers that were used in the app/assets/javascript namespace\n * but exposed globally.\n *\n * It is used in some `link_to_function` helpers in Rails templates\n */\nexport class GlobalHelpers {\n public checkAll(selector:any, checked:any) {\n document\n .querySelectorAll(`#${selector} input[type=\"checkbox\"]:not([disabled])`)\n .forEach((el:HTMLInputElement) => el.checked = checked);\n }\n\n public toggleCheckboxesBySelector(selector:any) {\n const boxes = jQuery(selector);\n let all_checked = true;\n for (let i = 0; i < boxes.length; i++) {\n if (boxes[i].checked === false) {\n all_checked = false;\n }\n }\n for (let i = 0; i < boxes.length; i++) {\n boxes[i].checked = !all_checked;\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { OpenProjectPluginContext } from 'core-app/features/plugins/plugin-context';\nimport { input, InputState } from 'reactivestates';\nimport { take } from 'rxjs/operators';\nimport { GlobalHelpers } from 'core-app/core/setup/globals/global-helpers';\n\n/**\n * OpenProject instance methods\n */\nexport class OpenProject {\n public pluginContext:InputState = input();\n\n public helpers = new GlobalHelpers();\n\n /** Globally setable variable whether the page was edited */\n public pageWasEdited = false;\n\n /** Globally setable variable whether the page form is submitted.\n * Necessary to avoid a data loss warning on beforeunload */\n public pageIsSubmitted = false;\n\n /** Globally setable variable whether any of the EditFormComponent\n * contain changes.\n * Necessary to show a data loss warning on beforeunload when clicking\n * on a link out of the Angular app (ie: main side menu)\n * */\n public editFormsContainModelChanges:boolean;\n\n public getPluginContext():Promise {\n return this.pluginContext\n .values$()\n .pipe(take(1))\n .toPromise();\n }\n\n public get urlRoot():string {\n return jQuery('meta[name=app_base_path]').attr('content') || '';\n }\n\n public get environment():string {\n return jQuery('meta[name=openproject_initializer]').data('environment');\n }\n\n public get edition():string {\n return jQuery('meta[name=openproject_initializer]').data('edition');\n }\n\n public get isStandardEdition():boolean {\n return this.edition === 'standard';\n }\n\n public get isBimEdition():boolean {\n return this.edition === 'bim';\n }\n\n /**\n * Guard access to reads and writes to the localstorage due to corrupted local databases\n * in Firefox happening in one larger client.\n *\n * NS_ERROR_FILE_CORRUPTED\n *\n * @param {string} key\n * @param {string} newValue\n * @returns {string | undefined}\n */\n public guardedLocalStorage(key:string, newValue?:string):string | void {\n try {\n if (newValue !== undefined) {\n window.localStorage.setItem(key, newValue);\n } else {\n const value = window.localStorage.getItem(key);\n return value === null ? undefined : value;\n }\n } catch (e) {\n console.error('Failed to access your browsers local storage. Is your local database corrupted?');\n }\n }\n}\n\nwindow.OpenProject = new OpenProject();\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\n// 'Global' dependencies\n//\n// dependencies required by classic (Rails) and Angular application.\n\n// Lodash\nrequire('expose-loader?_!lodash');\n\n// jQuery\nrequire('expose-loader?jQuery!jquery');\nrequire('jquery-ujs');\n\nrequire('expose-loader?mousetrap!mousetrap/mousetrap.js');\n\n// Angular dependencies\nrequire('expose-loader?dragula!dragula/dist/dragula.min.js');\nrequire('@uirouter/angular');\n\n// Jquery UI\nrequire('jquery-ui/ui/core.js');\nrequire('jquery-ui/ui/position.js');\nrequire('jquery-ui/ui/disable-selection.js');\nrequire('jquery-ui/ui/widgets/sortable.js');\nrequire('jquery-ui/ui/widgets/dialog.js');\nrequire('jquery-ui/ui/widgets/tooltip.js');\n\nrequire('expose-loader?moment!moment');\nrequire('moment/locale/en-gb.js');\nrequire('moment/locale/de.js');\n\nrequire('jquery.caret');\n// Text highlight for autocompleter\nrequire('mark.js/dist/jquery.mark.min.js');\n// Micro Text fuzzy search library\nrequire('fuse.js');\n\nrequire('moment-timezone/builds/moment-timezone-with-data.min.js');\n\nrequire('expose-loader?URI!urijs');\nrequire('urijs/src/URITemplate');\n\nrequire('expose-loader?I18n!core-vendor/i18n');\n\n// Localization for fullcalendar\nrequire('@fullcalendar/core/locales-all');\n","import { Injectable } from '@angular/core';\nimport {\n Observable,\n Subject,\n} from 'rxjs';\nimport { ActionCreator } from 'ts-action/action';\nimport { ActionType } from 'ts-action';\nimport { ofType } from 'ts-action-operators';\n\nexport interface Action {\n type:string;\n\n [key:string]:unknown;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ActionsService {\n private actions = new Subject();\n\n /** Entire event stream */\n public actions$ = this.actions.asObservable();\n\n /**\n * Observe one or more event type\n * @param action The set of action creators to listen for\n * */\n ofType(action:C):Observable> {\n return this\n .actions$\n .pipe(\n ofType(action),\n );\n }\n\n dispatch(action:Action):void {\n this.actions.next(action);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { EntityStore, StoreConfig } from '@datorama/akita';\nimport { IAttachment } from 'core-app/core/state/attachments/attachment.model';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\n\nexport interface AttachmentsState extends CollectionState {}\n\n@StoreConfig({ name: 'attachments' })\nexport class AttachmentsStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport {\n HttpClient,\n HttpHeaders,\n} from '@angular/common/http';\nimport { applyTransaction } from '@datorama/akita';\nimport {\n from,\n Observable,\n} from 'rxjs';\nimport {\n catchError,\n map,\n tap,\n} from 'rxjs/operators';\nimport { AttachmentsStore } from 'core-app/core/state/attachments/attachments.store';\nimport { IAttachment } from 'core-app/core/state/attachments/attachment.model';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport {\n OpenProjectFileUploadService,\n UploadFile,\n} from 'core-app/core/file-upload/op-file-upload.service';\nimport { OpenProjectDirectFileUploadService } from 'core-app/core/file-upload/op-direct-file-upload.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { HalLink } from 'core-app/features/hal/hal-link/hal-link';\nimport isNewResource, { HAL_NEW_RESOURCE_ID } from 'core-app/features/hal/helpers/is-new-resource';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { insertCollectionIntoState, removeEntityFromCollectionAndState } from 'core-app/core/state/collection-store';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Injectable()\nexport class AttachmentsResourceService extends ResourceCollectionService {\n @InjectField() I18n:I18nService;\n\n @InjectField() fileUploadService:OpenProjectFileUploadService;\n\n @InjectField() directFileUploadService:OpenProjectDirectFileUploadService;\n\n @InjectField() configurationService:ConfigurationService;\n\n @InjectField() toastService:ToastService;\n\n /**\n * This method ensures that a specific collection is fetched, if not available.\n *\n * @param key The collection key, of the required collection.\n */\n requireCollection(key:string):void {\n if (this.store.getValue().collections[key]) {\n return;\n }\n\n this.fetchAttachments(key).subscribe();\n }\n\n /**\n * Fetches attachments by the attachment collection self link.\n * This link is used as key to store the result collection in the resource store.\n *\n * @param attachmentsSelfLink The self link of the attachment collection from the parent resource.\n */\n fetchAttachments(attachmentsSelfLink:string):Observable> {\n return this.http\n .get>(attachmentsSelfLink)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, attachmentsSelfLink)),\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n /**\n * Sends deletion request and updates the store collection of attachments.\n *\n * @param collectionKey The identifier of the current attachment collection.\n * @param attachment The attachment to be deleted.\n */\n removeAttachment(collectionKey:string, attachment:IAttachment):Observable {\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n return this.http\n .delete(attachment._links.delete.href, { withCredentials: true, headers })\n .pipe(\n tap(() => removeEntityFromCollectionAndState(this.store, attachment.id, collectionKey)),\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n /**\n * Sends an upload request and updates the store collection of attachments.\n *\n * @param resource The HAL resource to attach the files to\n * @param files The upload files to be attached.\n */\n attachFiles(resource:HalResource, files:UploadFile[]):Observable {\n const identifier = AttachmentsResourceService.getAttachmentsSelfLink(resource) || HAL_NEW_RESOURCE_ID;\n const href = this.getUploadTarget(resource);\n const isDirectUpload = !!this.getDirectUploadLink(resource);\n\n return this\n .addAttachments(\n identifier,\n href,\n files,\n isDirectUpload,\n );\n }\n\n /**\n * Sends an upload request and updates the store collection of attachments.\n *\n * @param collectionKey The identifier of the current attachment collection.\n * @param uploadHref The API target to perform the call against.\n * @param files The upload files to be attached.\n * @param isDirectUpload whether the provided upload target is a direct upload URL.\n */\n addAttachments(\n collectionKey:string,\n uploadHref:string,\n files:UploadFile[],\n isDirectUpload = false,\n ):Observable {\n return this\n .uploadAttachments(uploadHref, files, isDirectUpload)\n .pipe(\n tap((attachments) => {\n applyTransaction(() => {\n this.store.add(attachments);\n this.store.update(({ collections }) => (\n {\n collections: {\n ...collections,\n [collectionKey]: {\n ...collections[collectionKey],\n ids: (collections[collectionKey]?.ids || []).concat(attachments.map((a) => a.id)),\n },\n },\n }\n ));\n });\n }),\n );\n }\n\n private uploadAttachments(href:string, files:UploadFile[], isDirectUpload:boolean):Observable {\n const { uploads, finished } = isDirectUpload\n ? this.directFileUploadService.uploadAndMapResponse(href, files)\n : this.fileUploadService.uploadAndMapResponse(href, files);\n\n const message = this.I18n.t('js.label_upload_notification');\n const notification = this.toastService.addAttachmentUpload(message, uploads);\n\n return from(finished)\n .pipe(\n tap(() => {\n setTimeout(() => this.toastService.remove(notification), 700);\n }),\n map((result) => result.map(({ response }) => (response as HalResource).$source as IAttachment)),\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n /**\n * Get the upload target for a HAL resource, depending on its\n * persisted state and available links.\n *\n * This will be one of the following:\n * - The direct upload PREPARE URL endpoint for the resource (if direct upload active + resource persisted)\n * - The generic prepare URL endpoint (if direct upload active)\n * - The resource's own upload HAL link (if persisted)\n * - The generic APIv3 attachments endpoint (new resource, no direct upload)\n *\n * @param resource The resource we're uploading attachments for.\n * @returns {string} The API target URL to perform the upload against.\n * @private\n */\n private getUploadTarget(resource:HalResource):string {\n return this.getDirectUploadLink(resource)\n || AttachmentsResourceService.getAttachmentsSelfLink(resource)\n || this.apiV3Service.attachments.path;\n }\n\n private getDirectUploadLink(resource:HalResource):string|null {\n const links = resource.$links as unknown&{ prepareAttachment:HalLink };\n\n if (links.prepareAttachment) {\n return links.prepareAttachment.href as string;\n }\n\n if (isNewResource(resource)) {\n return this.configurationService.prepareAttachmentURL as string|null;\n }\n\n return null;\n }\n\n private static getAttachmentsSelfLink(resource:HalResource):string|null {\n const attachments = resource.attachments as unknown&{ href?:string };\n return attachments?.href || null;\n }\n\n protected createStore():CollectionStore {\n return new AttachmentsStore();\n }\n\n protected basePath():string {\n return this.apiV3Service.attachments.path;\n }\n}\n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\nimport { ICapability } from 'core-app/core/state/capabilities/capability.model';\n\nexport interface CapabilitiesState extends CollectionState {\n}\n\n@StoreConfig({ name: 'capabilities' })\nexport class CapabilitiesStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n catchError,\n map,\n switchMap,\n} from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { collectionKey } from 'core-app/core/state/collection-store';\nimport { ICapability } from 'core-app/core/state/capabilities/capability.model';\nimport { CapabilitiesStore } from 'core-app/core/state/capabilities/capabilities.store';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Injectable()\nexport class CapabilitiesResourceService extends ResourceCollectionService {\n @InjectField() toastService:ToastService;\n\n /**\n * Require the available capabilities for the given filter params\n * Returns a cached set if it was loaded already.\n *\n * @param params List params to require\n * @private\n */\n public require$(params:ApiV3ListParameters):Observable {\n const key = collectionKey(params);\n if (this.collectionExists(key) || this.collectionLoading(key)) {\n return this.loadedCollection(key);\n }\n\n return this\n .fetchCapabilities(params)\n .pipe(\n switchMap(() => this.loadedCollection(key)),\n );\n }\n\n /**\n * Returns the loaded capabilities for a context\n */\n public loadedCapabilities$(contextId:string):Observable {\n return this\n .query\n .selectAll()\n .pipe(\n map((capabilities) => capabilities.filter((cap) => cap._links.context.href.endsWith(`/${contextId}`))),\n );\n }\n\n public fetchCapabilities(params:ApiV3ListParameters):Observable> {\n return this\n .fetchCollection(params)\n .pipe(\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n protected createStore():CollectionStore {\n return new CapabilitiesStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .capabilities\n .path;\n }\n}\n","import {\n applyTransaction,\n EntityState,\n EntityStore,\n ID,\n} from '@datorama/akita';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport {\n ApiV3ListParameters,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { IHalResourceLinks } from 'core-app/core/state/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { filter } from 'lodash';\n\nexport interface CollectionResponse {\n ids:ID[];\n}\n\nexport interface CollectionState extends EntityState {\n /** Loaded notification collections */\n collections:Record;\n\n /** Loading collections */\n loadingCollections:Record;\n}\n\nexport interface CollectionItem {\n id:ID;\n}\n\nexport function mapHALCollectionToIDCollection(collection:IHALCollection):CollectionResponse {\n return {\n ids: collection._embedded.elements.map((el) => el.id),\n };\n}\n\n/**\n * Initialize the collection part of the entity store\n */\nexport function createInitialCollectionState():CollectionState {\n return {\n collections: {},\n loadingCollections: {},\n };\n}\n\n/**\n * Returns the collection key for the given APIv3 parameters\n *\n * @param params list params\n */\nexport function collectionKey(params:ApiV3ListParameters):string {\n return listParamsString(params);\n}\n\n/**\n * Mark a collection key as being loaded\n *\n * @param store An entity store for the collection\n * @param collectionUrl The key to insert the collection at\n * @param loading The loading state\n */\nexport function setCollectionLoading(\n store:EntityStore>,\n collectionUrl:string,\n):void {\n store.update(({ loadingCollections }) => (\n {\n loadingCollections: {\n ...loadingCollections,\n [collectionUrl]: true,\n },\n }\n ));\n}\n\n/**\n * Mark a collection key as no longer loading\n *\n * @param store An entity store for the collection\n * @param collectionUrl The key to insert the collection at\n */\nexport function removeCollectionLoading(\n store:EntityStore>,\n collectionUrl:string,\n):void {\n store.update(({ loadingCollections }) => (\n {\n loadingCollections: filter(loadingCollections, (_, key) => key !== collectionUrl),\n }\n ));\n}\n\n/**\n * Insert a collection into the given entity store\n *\n * @param store An entity store for the collection\n * @param collection A loaded collection\n * @param collectionUrl The key to insert the collection at\n */\nexport function insertCollectionIntoState(\n store:EntityStore>,\n collection:IHALCollection,\n collectionUrl:string,\n):void {\n const { elements } = collection._embedded as { elements:undefined|T[] };\n\n // Some JSON endpoints return no elements result if there are no elements\n const ids = elements?.map((el) => el.id) || [];\n\n applyTransaction(() => {\n // Avoid inserting when elements is not defined\n if (elements && elements.length > 0) {\n store.upsertMany(elements);\n }\n\n store.update(({ collections }) => (\n {\n collections: {\n ...collections,\n [collectionUrl]: {\n ids,\n },\n },\n }\n ));\n });\n}\n\nexport function removeEntityFromCollectionAndState(\n store:EntityStore>,\n entityId:ID,\n collectionUrl:string,\n):void {\n applyTransaction(() => {\n store.remove(entityId);\n store.update(({ collections }) => (\n {\n collections: {\n ...collections,\n [collectionUrl]: {\n ...collections[collectionUrl],\n ids: (collections[collectionUrl]?.ids || []).filter((id) => id !== entityId),\n },\n },\n }\n ));\n });\n}\n\nexport function collectionFrom(elements:T[]):IHALCollection {\n const count = elements.length;\n\n return {\n _type: 'Collection',\n count,\n total: count,\n pageSize: count,\n offset: 1,\n _embedded: {\n elements,\n },\n };\n}\n\n/**\n * Takes a collection of elements that do not have an ID, and extract the ID from self link.\n * @param collection a IHALCollection with elements that have a self link\n * @returns the same collection with elements extended with an ID derived from the self link.\n */\nexport function extendCollectionElementsWithId(\n collection:IHALCollection,\n):IHALCollection {\n const elements = collection._embedded.elements.map((element) => ({\n ...element,\n id: idFromLink(element._links.self.href),\n }));\n\n return {\n ...collection,\n _embedded: {\n ...collection._embedded,\n elements,\n },\n };\n}\n","import {\n EntityStore,\n StoreConfig,\n} from '@datorama/akita';\nimport {\n CollectionState,\n createInitialCollectionState,\n} from 'core-app/core/state/collection-store';\nimport { IWeekday } from 'core-app/core/state/days/weekday.model';\n\nexport interface WeekdayState extends CollectionState {\n}\n\n@StoreConfig({ name: 'weekdays' })\nexport class WeekdayStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n map,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport {\n EMPTY,\n Observable,\n} from 'rxjs';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport {\n extendCollectionElementsWithId,\n insertCollectionIntoState,\n} from 'core-app/core/state/collection-store';\nimport { WeekdayStore } from 'core-app/core/state/days/weekday.store';\nimport { IWeekday } from 'core-app/core/state/days/weekday.model';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\n\n@Injectable()\nexport class WeekdayResourceService extends ResourceCollectionService {\n require():Observable {\n return this\n .query\n .selectHasCache()\n .pipe(\n switchMap((hasCache) => (hasCache ? EMPTY : this.fetchWeekdays())),\n switchMap(() => this.query.selectAll()),\n );\n }\n\n protected fetchWeekdays():Observable> {\n const collectionURL = 'all'; // We load all weekdays\n\n return this\n .http\n .get>(this.basePath())\n .pipe(\n map((collection) => extendCollectionElementsWithId(collection)),\n tap((collection) => insertCollectionIntoState(this.store, collection, collectionURL)),\n );\n }\n\n protected createStore():CollectionStore {\n return new WeekdayStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .days\n .week\n .path;\n }\n}\n","import 'reflect-metadata';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { ActionCreator } from 'ts-action/action';\nimport { Action } from 'ts-action';\nimport { takeWhile } from 'rxjs/operators';\n\n/**\n * This interface specifies a constraint on the classes that can\n * be used as an @EffectHandler.\n *\n * As we depend on the ActionsService, we need that as a public property.\n */\nexport interface EffectClass {\n actions$:ActionsService;\n ngOnDestroy?():void;\n}\n\nconst EffectHandlers = Symbol('EffectHandlers');\n\ntype EffectHandlerItem = { callback:(action:Action) => void, action:ActionCreator };\n\n/**\n * The EffectHandler decorates a class to be used for effects callbacks\n * To use, add it to a store service like so\n *\n * ```\n * @Injectable()\n * @EffectHandler\n * export class FooStoreService {\n * @EffectCallback(someActionName)\n * private actionCallback(action:ReturnType) {\n * // Effect callback for the given action\n * }\n * }\n */\n/* The class decorator requires any[] args to it to function */\n\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\nexport function EffectHandler(constructor:T):any {\n return class extends constructor {\n private serviceDestroyed = false;\n\n /* The class decorator requires any[] args to it to function */\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n constructor(...args:any[]) {\n super(...args);\n\n // Access the handlers registered in the @EffectCallback method decorator\n // We're accessing a separate symbol on the base class that is not present\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const handlers = constructor.prototype[EffectHandlers] as Map;\n if (handlers) {\n handlers.forEach((item:EffectHandlerItem, key:string) => {\n debugLog(`[${constructor.name}] Subscribing to effect ${key}`);\n\n // Subscribe to the specified action for the duration of this service's life.\n this.actions$\n .ofType(item.action)\n .pipe(\n takeWhile(() => !this.serviceDestroyed),\n )\n .subscribe((instance) => {\n // Wrap callback in a try-catch to avoid completing the subscription.\n try {\n item.callback.call(this, instance);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n console.error(`Error thrown in effect callback ${key}: ${e}`);\n }\n });\n });\n }\n }\n\n ngOnDestroy():void {\n this.serviceDestroyed = true;\n if (super.ngOnDestroy) {\n super.ngOnDestroy();\n }\n }\n };\n}\n\n/**\n * The EffectCallback decorates a method of a `@EffectHandler` decorated class\n * to be used for effects callbacks.\n *\n * The decorator subscribes to the actionService for the given service for\n * the lifetime of the service.\n *\n * Example:\n *\n * ```\n * @Injectable()\n * @EffectHandler\n * export class FooStoreService {\n * @EffectCallback(someActionName)\n * private actionCallback(action:ReturnType) {\n * // Effect callback for the given action\n * }\n * }\n */\nexport function EffectCallback(action:ActionCreator) {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n return (service:unknown, property:string, descriptor:PropertyDescriptor):void => {\n const target = service as { [EffectHandlers]:Map };\n if (!target[EffectHandlers]) {\n // We're assigning the symbol property in the base class\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,no-param-reassign\n target[EffectHandlers] = new Map();\n }\n\n // Here we just add some information that class decorator will use\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n target[EffectHandlers].set(property, { action, callback: descriptor.value as (action:Action) => void });\n };\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\nimport { EntityStore, StoreConfig } from '@datorama/akita';\nimport { IFileLink } from 'core-app/core/state/file-links/file-link.model';\n\nexport interface FileLinksState extends CollectionState {}\n\n@StoreConfig({ name: 'file_links' })\nexport class FileLinksStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { applyTransaction } from '@datorama/akita';\nimport { Injectable } from '@angular/core';\nimport { HttpHeaders } from '@angular/common/http';\nimport { from, Observable } from 'rxjs';\nimport {\n groupBy,\n mergeMap,\n reduce,\n switchMap,\n tap,\n} from 'rxjs/operators';\n\nimport { IFileLink } from 'core-app/core/state/file-links/file-link.model';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { FileLinksStore } from 'core-app/core/state/file-links/file-links.store';\nimport { insertCollectionIntoState, removeEntityFromCollectionAndState } from 'core-app/core/state/collection-store';\nimport { CollectionStore, ResourceCollectionService } from 'core-app/core/state/resource-collection.service';\nimport { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport { IStorageFile } from 'core-app/core/state/storage-files/storage-file.model';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Injectable()\nexport class FileLinksResourceService extends ResourceCollectionService {\n @InjectField() toastService:ToastService;\n\n updateCollectionsForWorkPackage(fileLinksSelfLink:string):Observable {\n return this.http\n .get>(fileLinksSelfLink)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, fileLinksSelfLink)),\n switchMap((collection) => from(collection._embedded.elements)),\n groupBy(\n (fileLink) => fileLink._links.storage.href,\n (fileLink) => fileLink,\n ),\n mergeMap((group$) => {\n const seed = { storage: group$.key, fileLinks: [] as IFileLink[] };\n return group$.pipe(reduce((acc, fileLink) => {\n acc.fileLinks = [...acc.fileLinks, fileLink];\n return acc;\n }, seed));\n }),\n tap((fileLinkCollections) => {\n const storageId = idFromLink(fileLinkCollections.storage);\n const collectionKey = `${fileLinksSelfLink}?filters=[{\"storage\":{\"operator\":\"=\",\"values\":[\"${storageId}\"]}}]`;\n const collection = { _embedded: { elements: fileLinkCollections.fileLinks } } as IHALCollection;\n insertCollectionIntoState(this.store, collection, collectionKey);\n }),\n reduce((acc, group) => acc.concat(group.fileLinks), [] as IFileLink[]),\n );\n }\n\n protected createStore():CollectionStore {\n return new FileLinksStore();\n }\n\n remove(collectionKey:string, fileLink:IFileLink):void {\n if (!fileLink._links.delete) {\n return;\n }\n\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n this.http\n .delete(fileLink._links.delete.href, { withCredentials: true, headers })\n .subscribe(\n () => removeEntityFromCollectionAndState(this.store, fileLink.id, collectionKey),\n this.toastAndThrow.bind(this),\n );\n }\n\n addFileLinks(collectionKey:string, addFileLinksHref:string, storage:IHalResourceLink, filesToLink:IStorageFile[]):void {\n const elements = filesToLink.map((file) => ({\n originData: {\n id: file.id,\n name: file.name,\n mimeType: file.mimeType,\n size: file.size,\n createdAt: file.createdAt,\n lastModifiedAt: file.lastModifiedAt,\n createdByName: file.createdByName,\n lastModifiedByName: file.lastModifiedByName,\n },\n _links: { storage },\n }));\n\n this.http\n .post>(addFileLinksHref, { _type: 'Collection', _embedded: { elements } })\n .subscribe(\n (collection) => {\n applyTransaction(() => {\n const newFileLinks = collection._embedded.elements;\n this.store.add(newFileLinks);\n this.store.update(\n ({ collections }) => (\n {\n collections: {\n ...collections,\n [collectionKey]: {\n ...collections[collectionKey],\n ids: (collections[collectionKey]?.ids || []).concat(newFileLinks.map((link) => link.id)),\n },\n },\n }\n ),\n );\n });\n },\n this.toastAndThrow.bind(this),\n );\n }\n\n protected basePath():string {\n return this.apiV3Service.file_links.path;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private toastAndThrow(error:any):void {\n this.toastService.addError(error);\n throw error;\n }\n}\n","import { ID } from '@datorama/akita';\nimport {\n IHalResourceLink,\n IHalResourceLinks,\n} from 'core-app/core/state/hal-resource';\n\nexport const NOTIFICATIONS_MAX_SIZE = 100;\n\nexport interface IInAppNotificationHalResourceLinks extends IHalResourceLinks {\n actor:IHalResourceLink;\n project:IHalResourceLink;\n resource:IHalResourceLink;\n activity:IHalResourceLink;\n}\n\nexport type IInAppNotificationDetailsAttribute = 'startDate'|'dueDate'|'date';\n\nexport interface IInAppNotificationDetailsResource {\n property:IInAppNotificationDetailsAttribute;\n value:string|null;\n\n _links:{\n self:IHalResourceLink;\n schema:IHalResourceLink;\n };\n}\n\nexport interface IInAppNotificationHalResourceEmbedded {\n details:IInAppNotificationDetailsResource[];\n}\n\nexport interface INotification {\n id:ID;\n subject:string;\n createdAt:string;\n updatedAt:string;\n reason:string;\n readIAN:boolean|null;\n readEmail:boolean|null;\n\n // Mark a notification to be kept in the center even though it was saved as \"read\".\n keep?:boolean;\n // Show message of a notification?\n expanded:boolean;\n\n _links:IInAppNotificationHalResourceLinks;\n _embedded:IInAppNotificationHalResourceEmbedded;\n}\n","import { ID } from '@datorama/akita';\nimport {\n action,\n props,\n} from 'ts-action';\n\nexport const markNotificationsAsRead = action(\n '[IAN] Mark notifications as read',\n props<{ origin:string, notifications:ID[] }>(),\n);\n\nexport const notificationsMarkedRead = action(\n '[IAN] Notifications were marked as read',\n props<{ origin:string, notifications:ID[] }>(),\n);\n\nexport const notificationCountIncreased = action(\n '[IAN] The backend sent a notification count that was higher than the last known',\n props<{ origin:string, count:number }>(),\n);\n\nexport const centerUpdatedInPlace = action(\n '[IAN] The notification center updated the notification list without a full page refresh',\n props<{ origin:string }>(),\n);\n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { INotification } from './in-app-notification.model';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\n\nexport interface InAppNotificationsState extends CollectionState {\n}\n\n@StoreConfig({ name: 'in-app-notifications' })\nexport class InAppNotificationsStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport { tap } from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { ID } from '@datorama/akita';\nimport {\n markNotificationsAsRead,\n notificationsMarkedRead,\n} from 'core-app/core/state/in-app-notifications/in-app-notifications.actions';\nimport { EffectCallback, EffectHandler } from 'core-app/core/state/effects/effect-handler.decorator';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { InAppNotificationsStore } from './in-app-notifications.store';\nimport { INotification } from './in-app-notification.model';\nimport { CollectionStore, ResourceCollectionService } from 'core-app/core/state/resource-collection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@EffectHandler\n@Injectable()\nexport class InAppNotificationsResourceService extends ResourceCollectionService {\n @InjectField() actions$:ActionsService;\n\n update(id:ID, inAppNotification:Partial):void {\n this.store.update(id, inAppNotification);\n }\n\n markAsRead(notifications:ID[]):Observable {\n return this\n .apiV3Service\n .notifications\n .markRead(notifications)\n .pipe(\n tap(() => {\n this.store.update(notifications, { readIAN: true });\n }),\n );\n }\n\n /**\n * Mark the given notification IDs as read through the API.\n */\n @EffectCallback(markNotificationsAsRead)\n private markNotificationsAsRead(action:ReturnType) {\n this\n .markAsRead(action.notifications)\n .subscribe(() => (\n this.actions$.dispatch(notificationsMarkedRead(action))\n ));\n }\n\n protected createStore():CollectionStore {\n return new InAppNotificationsStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .notifications\n .path;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport default function isDefinedEntity(entity:T|undefined):entity is T {\n return entity !== undefined;\n}\n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { IPrincipal } from './principal.model';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\n\nexport interface PrincipalsState extends CollectionState {\n}\n\n@StoreConfig({ name: 'principals' })\nexport class PrincipalsStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n catchError,\n tap,\n} from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { applyTransaction } from '@datorama/akita';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport {\n collectionKey,\n insertCollectionIntoState,\n} from 'core-app/core/state/collection-store';\nimport { EffectHandler } from 'core-app/core/state/effects/effect-handler.decorator';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { PrincipalsStore } from './principals.store';\nimport { IPrincipal } from './principal.model';\nimport { IUser } from 'core-app/core/state/principals/user.model';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@EffectHandler\n@Injectable()\nexport class PrincipalsResourceService extends ResourceCollectionService {\n @InjectField() actions$:ActionsService;\n\n @InjectField() toastService:ToastService;\n\n fetchUser(id:string|number):Observable {\n return this.http\n .get(this.apiV3Service.users.id(id).path)\n .pipe(\n tap((data) => {\n applyTransaction(() => {\n this.store.upsertMany([data]);\n });\n }),\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n fetchPrincipals(params:ApiV3ListParameters):Observable> {\n const collectionURL = collectionKey(params);\n\n return this\n .http\n .get>(this.basePath() + collectionURL)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, collectionURL)),\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n protected createStore():CollectionStore {\n return new PrincipalsStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .principals\n .path;\n }\n}\n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\nimport { IProject } from './project.model';\n\nexport interface ProjectsState extends CollectionState {\n}\n\n@StoreConfig({ name: 'projects' })\nexport class ProjectsStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { tap } from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { IProject } from './project.model';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { ProjectsStore } from 'core-app/core/state/projects/projects.store';\n\n@Injectable()\nexport class ProjectsResourceService extends ResourceCollectionService {\n update(link:string):Observable {\n return this.http.get(link)\n .pipe(\n tap((project) => {\n this.store.upsertMany([project]);\n }),\n );\n }\n\n protected createStore():CollectionStore {\n return new ProjectsStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .projects\n .path;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n EntityStore,\n ID,\n QueryEntity,\n} from '@datorama/akita';\nimport { Observable } from 'rxjs';\nimport {\n catchError,\n filter,\n finalize,\n map,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport {\n collectionKey,\n CollectionResponse,\n CollectionState,\n insertCollectionIntoState,\n removeCollectionLoading,\n setCollectionLoading,\n} from 'core-app/core/state/collection-store';\nimport { omit } from 'lodash';\nimport isDefinedEntity from 'core-app/core/state/is-defined-entity';\nimport { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport {\n HttpClient,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport {\n Injectable,\n Injector,\n} from '@angular/core';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\n\nexport type CollectionStore = EntityStore>;\n\nexport interface ResourceCollectionLoadOptions {\n handleErrors:boolean;\n}\n\n@Injectable()\nexport abstract class ResourceCollectionService {\n protected store:CollectionStore = this.createStore();\n\n protected query = new QueryEntity(this.store);\n\n constructor(\n readonly injector:Injector,\n readonly http:HttpClient,\n readonly apiV3Service:ApiV3Service,\n readonly toastService:ToastService,\n ) {\n }\n\n /**\n * Require the results for the given filter params\n * Returns a cached set if it was loaded already.\n *\n * @param params List params to require\n * @private\n */\n public require(params:ApiV3ListParameters):Observable {\n const key = collectionKey(params);\n if (this.collectionExists(key) || this.collectionLoading(key)) {\n return this.loadedCollection(key);\n }\n\n return this\n .fetchCollection(params)\n .pipe(\n switchMap(() => this.loadedCollection(key)),\n );\n }\n\n /**\n * Retrieve a collection from the store\n *\n * @param key The collection key to fetch\n */\n collection(key:string):Observable {\n return this\n .collectionState(key)\n .pipe(\n switchMap((collection) => this.query.selectMany(collection?.ids || [])),\n );\n }\n\n /**\n * Return a collection observable that triggers only when the collection is loaded.\n * @param key\n */\n loadedCollection(key:string):Observable {\n return this\n .collectionState(key)\n .pipe(\n filter((collection) => !!collection),\n switchMap((collection:CollectionResponse) => this.query.selectMany(collection.ids)),\n );\n }\n\n /**\n * Return a collection observable that triggers only when the collection is loaded.\n * @param key\n */\n collectionState(key:string):Observable {\n return this\n .query\n .select()\n .pipe(\n map((state) => state.collections[key]),\n );\n }\n\n /**\n * Lookup a single entity from the store\n * @param id\n */\n lookup(id:ID):Observable {\n return this\n .query\n .selectEntity(id)\n .pipe(filter(isDefinedEntity));\n }\n\n /**\n * Lookup multiple entities from the store\n */\n lookupMany(ids:ID[]):Observable {\n return this\n .query\n .selectMany(ids);\n }\n\n /**\n * Checks, if the store already has a resource loaded by id.\n * @param id\n */\n exists(id:ID):boolean {\n return this.query.hasEntity(id);\n }\n\n /**\n * Checks, if the store already has a collection given the key\n */\n collectionExists(input:string|ApiV3ListParameters):boolean {\n const key = typeof input === 'string' ? input : collectionKey(input);\n return !!this\n .query\n .getValue()\n .collections[key];\n }\n\n /**\n * Checks, if the store already has a collection given the key\n */\n collectionLoading(input:string|ApiV3ListParameters):boolean {\n const key = typeof input === 'string' ? input : collectionKey(input);\n return this\n .query\n .getValue()\n .loadingCollections[key] === true;\n }\n\n /**\n * Clear a collection key\n * @param key Collection key to clear\n */\n clear(key:string):void {\n this\n .store\n .update(\n ({ collections }) => ({\n collections: omit(collections, key),\n }),\n );\n }\n\n /**\n * Update a single entity in the store\n *\n * @param id The id to update\n * @param entity A section of the entity to update\n */\n update(id:ID, entity:Partial):void {\n this.store.update(id, entity);\n }\n\n /**\n * Fetch a given collection, returning only its results\n */\n fetchResults(params:ApiV3ListParameters|string):Observable {\n return this\n .fetchCollection(params)\n .pipe(\n map((collection) => collection._embedded.elements),\n );\n }\n\n /**\n * Fetch a given collection, ensuring it is being flagged as loaded\n *\n * @param params {ApiV3ListParameters|string} collection key or list params to build collection key from\n * @param options {ResourceCollectionLoadOptions} Handle collection loading errors within the resource service\n */\n fetchCollection(\n params:ApiV3ListParameters|string,\n options:ResourceCollectionLoadOptions = { handleErrors: true },\n ):Observable> {\n const key = typeof params === 'string' ? params : collectionKey(params);\n\n setCollectionLoading(this.store, key);\n\n return this\n .http\n .get>(this.basePath() + key)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, key)),\n finalize(() => removeCollectionLoading(this.store, key)),\n catchError((error:unknown) => {\n if (options.handleErrors) {\n this.handleCollectionLoadingError(error as HttpErrorResponse, key);\n }\n\n throw error;\n }),\n );\n }\n\n /**\n * Create a new instance of this resource service's underlying store.\n * @protected\n */\n protected abstract createStore():CollectionStore;\n\n /**\n * Base path for this collection\n * @protected\n */\n protected abstract basePath():string;\n\n /**\n * By default, add a toast error in case of loading errors\n * @param error\n * @param _collectionKey\n * @protected\n */\n protected handleCollectionLoadingError(error:HttpErrorResponse, _collectionKey:string):void {\n this.toastService.addError(error);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { EntityStore, StoreConfig } from '@datorama/akita';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\nimport { IStorageFile } from 'core-app/core/state/storage-files/storage-file.model';\n\nexport interface StorageFilesState extends CollectionState {}\n\n@StoreConfig({\n name: 'storage-files',\n resettable: true,\n})\nexport class StorageFilesStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map, tap } from 'rxjs/operators';\n\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { IStorageFile } from 'core-app/core/state/storage-files/storage-file.model';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport { StorageFilesStore } from 'core-app/core/state/storage-files/storage-files.store';\nimport { insertCollectionIntoState } from 'core-app/core/state/collection-store';\n\n@Injectable()\nexport class StorageFilesResourceService extends ResourceCollectionService {\n protected createStore():CollectionStore {\n return new StorageFilesStore();\n }\n\n files(link:IHalResourceLink):Observable {\n if (this.collectionExists(link.href)) {\n return this.collection(link.href);\n }\n\n return this.http\n .get>(link.href)\n .pipe(\n tap((collection) => {\n insertCollectionIntoState(this.store, collection, link.href);\n }),\n map((collection) => collection._embedded.elements),\n );\n }\n\n reset():void {\n this.store.reset();\n }\n\n protected basePath():string {\n return this.apiV3Service.storages.files.path;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { EntityStore, StoreConfig } from '@datorama/akita';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\nimport { IStorage } from 'core-app/core/state/storages/storage.model';\n\nexport interface StoragesState extends CollectionState {}\n\n@StoreConfig({ name: 'storages' })\nexport class StoragesStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { forkJoin } from 'rxjs';\nimport { IStorage } from 'core-app/core/state/storages/storage.model';\nimport { StoragesStore } from 'core-app/core/state/storages/storages.store';\nimport { insertCollectionIntoState } from 'core-app/core/state/collection-store';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\n\n@Injectable()\nexport class StoragesResourceService extends ResourceCollectionService {\n updateCollection(key:string, storageLinks:IHalResourceLink[]):void {\n forkJoin(\n storageLinks.map((link) => this.http.get(link.href)),\n ).subscribe((storages) => {\n const storageCollection = { _embedded: { elements: storages } } as IHALCollection;\n insertCollectionIntoState(this.store, storageCollection, key);\n });\n }\n\n protected createStore():CollectionStore {\n return new StoragesStore();\n }\n\n protected basePath():string {\n return this.apiV3Service.storages.path;\n }\n}\n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\nimport { IView } from './view.model';\n\nexport interface ViewsState extends CollectionState {\n}\n\n@StoreConfig({ name: 'views' })\nexport class ViewsStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport { EffectHandler } from 'core-app/core/state/effects/effect-handler.decorator';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { ViewsStore } from 'core-app/core/state/views/views.store';\nimport { IView } from 'core-app/core/state/views/view.model';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@EffectHandler\n@Injectable()\nexport class ViewsResourceService extends ResourceCollectionService {\n @InjectField() actions$:ActionsService;\n\n protected createStore():CollectionStore {\n return new ViewsStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .views\n .path;\n }\n}\n","import { InputState, multiInput, MultiInputState, StatesGroup } from 'reactivestates';\nimport { Subject } from 'rxjs';\nimport { TypeResource } from 'core-app/features/hal/resources/type-resource';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { VersionResource } from 'core-app/features/hal/resources/version-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { StatusResource } from 'core-app/features/hal/resources/status-resource';\nimport { PlaceholderUserResource } from 'core-app/features/hal/resources/placeholder-user-resource';\nimport { RoleResource } from 'core-app/features/hal/resources/role-resource';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { PostResource } from 'core-app/features/hal/resources/post-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\n\nexport class States extends StatesGroup {\n name = 'MainStore';\n\n /* /api/v3/projects */\n projects:MultiInputState = multiInput();\n\n /* /api/v3/work_packages */\n workPackages = multiInput();\n\n /* /api/v3/wiki_pages */\n posts = multiInput();\n\n /* /api/v3/schemas */\n schemas = multiInput();\n\n /* /api/v3/types */\n types = multiInput();\n\n /* /api/v3/statuses */\n statuses = multiInput();\n\n /* /api/v3/time_entries */\n timeEntries = multiInput();\n\n /* /api/v3/versions */\n versions = multiInput();\n\n /* /api/v3/users */\n users = multiInput();\n\n /* /api/v3/placeholder_users */\n placeholderUsers = multiInput();\n\n /* /api/v3/roles */\n roles = multiInput();\n\n // Global events to isolated changes\n changes = {\n // Global subject on changes to the given query ID\n queries: new Subject(),\n };\n\n // Additional state map that can be dynamically registered.\n additional:{ [id:string]:MultiInputState } = {};\n\n forType(stateName:string):MultiInputState {\n let state = (this as any)[stateName] || this.additional[stateName];\n\n if (!state) {\n state = this.additional[stateName] = multiInput();\n }\n\n return state;\n }\n\n forResource(resource:T):InputState|undefined {\n const stateName = `${_.camelCase(resource._type)}s`;\n const state = this.forType(stateName);\n\n return state && state.get(resource.id!);\n }\n\n public add(name:string, state:MultiInputState) {\n this.additional[name] = state;\n }\n}\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\n\nexport const backlogsPageComponentSelector = 'op-backlogs-page';\n\n@Component({\n selector: backlogsPageComponentSelector,\n // Empty wrapper around legacy backlogs for CSS loading\n // that got removed in the Rails assets pipeline\n encapsulation: ViewEncapsulation.None,\n template: '',\n styleUrls: [\n './styles/backlogs.sass',\n ],\n})\nexport class BacklogsPageComponent implements OnInit {\n ngOnInit() {\n document.getElementById('projected-content')!.hidden = false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { Constructor } from '@angular/cdk/table';\nimport { SimpleResource, SimpleResourceCollection } from 'core-app/core/apiv3/paths/path-resources';\n\nexport class BcfResourcePath extends SimpleResource {\n constructor(readonly injector:Injector,\n basePath:string,\n readonly id:string|number) {\n super(basePath, id);\n }\n}\n\nexport class BcfResourceCollectionPath extends SimpleResourceCollection {\n constructor(readonly injector:Injector,\n protected basePath:string,\n segment:string,\n protected resource?:Constructor) {\n super(basePath, segment, resource);\n }\n\n public id(id:string|number):T {\n return new (this.resource || BcfResourcePath)(this.injector, this.path, id) as T;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HttpClient, HttpErrorResponse, HttpParams } from '@angular/common/http';\nimport { Injector } from '@angular/core';\nimport { TypedJSON } from 'typedjson';\nimport { Constructor } from '@angular/cdk/table';\nimport { Observable, throwError } from 'rxjs';\nimport {\n HTTPClientHeaders,\n HTTPClientOptions,\n HTTPClientParamMap,\n HTTPSupportedMethods,\n} from 'core-app/features/hal/http/http.interfaces';\nimport { catchError, map } from 'rxjs/operators';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { URLParamsEncoder } from 'core-app/features/hal/services/url-params-encoder';\n\nexport class BcfApiRequestService {\n @InjectField() http:HttpClient;\n\n /**\n * Create a BCF api request service.\n * Optionally pass a resource map to map the resulting data to with TypedJson.\n *\n * @param injector Injector\n * @param resourceClass Optional mapped resource class with TypedJson annotations\n */\n constructor(readonly injector:Injector,\n readonly resourceClass?:Constructor) {\n }\n\n /**\n * Request GET from the given BCF API 2.1 resource and map it to +resourceClass+.\n *\n * @param path API path to request\n * @param params Request query params\n * @param headers optional headers map\n */\n get(path:string, params:HTTPClientParamMap, headers:HTTPClientHeaders = {}):Observable {\n const config:HTTPClientOptions = {\n headers,\n params: new HttpParams({ encoder: new URLParamsEncoder(), fromObject: params }),\n withCredentials: true,\n responseType: 'json',\n };\n\n return this._request('get', path, config);\n }\n\n /**\n * Request the given BCF API 2.1 resource and map it to +resourceClass+.\n *\n * @param method request method\n * @param path API path to request\n * @param data Request payload (URL params for get, JSON payload otherwise)\n * @param headers Request headers\n */\n public request(method:HTTPSupportedMethods, path:string, data:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}):Observable {\n // HttpClient requires us to create HttpParams instead of passing data for get\n // so forward to that method instead.\n if (method === 'get') {\n return this.get(path, data, headers);\n }\n\n const config:HTTPClientOptions = {\n body: data || {},\n headers,\n withCredentials: true,\n responseType: 'json',\n };\n\n return this._request(method, path, config);\n }\n\n /**\n * Perform the request with httpClient and deserialize the result\n *\n * @param method Request method\n * @param path Request path\n * @param config HTTP client configuration\n *\n * @private\n */\n private _request(method:HTTPSupportedMethods, path:string, config:HTTPClientOptions):Observable {\n return this\n .http\n .request(method, path, config)\n .pipe(\n map((response:any) => this.deserialize(response)),\n catchError((error:HttpErrorResponse) => {\n console.error(`Failed to ${method} ${path}: ${error.name}`);\n return throwError(error);\n }),\n );\n }\n\n /**\n * Deserialize the JSON data into the mapped resource class, if given.\n * @param data JSON API response.\n */\n protected deserialize(data:any):T {\n if (this.resourceClass) {\n const serializer = new TypedJSON(this.resourceClass);\n return serializer.parse(data)!;\n }\n return data;\n }\n}\n","import { jsonMember, jsonObject } from 'typedjson';\n\n@jsonObject\nexport class BcfProjectResource {\n @jsonMember\n project_id:number;\n\n @jsonMember\n name:string;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { jsonArrayMember, jsonMember, jsonObject } from 'typedjson';\nimport * as moment from 'moment';\nimport { Moment } from 'moment';\n\n@jsonObject\nexport class BcfTopicAuthorizationMap {\n @jsonArrayMember(String)\n topic_actions:string[];\n\n @jsonArrayMember(String)\n topic_status:string[];\n}\n\n@jsonObject\nexport class BcfTopicResource {\n @jsonMember\n guid:string;\n\n @jsonMember\n topic_type:string;\n\n @jsonMember\n topic_status:string;\n\n @jsonMember\n priority:string;\n\n @jsonArrayMember(String)\n reference_links:string[];\n\n @jsonMember\n title:string;\n\n @jsonMember({ preserveNull: true })\n index:number|null;\n\n @jsonArrayMember(String)\n labels:string[];\n\n @jsonMember({ deserializer: (value) => moment(value), serializer: (timestamp:Moment) => timestamp.toISOString() })\n creation_date:Moment;\n\n @jsonMember\n creation_author:string;\n\n @jsonMember({ deserializer: (value) => moment(value), serializer: (timestamp:Moment) => timestamp.toISOString() })\n modified_date:Moment;\n\n @jsonMember({ preserveNull: true })\n modified_author:string|null;\n\n @jsonMember\n assigned_to:string;\n\n @jsonMember({ preserveNull: true })\n stage:string|null;\n\n @jsonMember\n description:string;\n\n @jsonMember({\n deserializer: (value) => moment(value),\n serializer: (timestamp:Moment) => timestamp.format('YYYY-MM-DD'),\n })\n due_date:Moment;\n\n @jsonMember\n authorization:BcfTopicAuthorizationMap;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { BcfResourcePath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { HTTPClientHeaders, HTTPClientParamMap } from 'core-app/features/hal/http/http.interfaces';\nimport { Observable } from 'rxjs';\nimport { BcfViewpointSelection } from 'core-app/features/bim/bcf/api/bcf-api.model';\n\nexport class BcfViewpointSelectionPath extends BcfResourcePath {\n readonly bcfViewpointsService = new BcfApiRequestService(this.injector);\n\n get(params:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}):Observable {\n return this.bcfViewpointsService.get(this.toPath(), params, headers);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { BcfResourcePath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { HTTPClientHeaders, HTTPClientParamMap } from 'core-app/features/hal/http/http.interfaces';\nimport { Observable } from 'rxjs';\nimport { BcfViewpointVisibility } from 'core-app/features/bim/bcf/api/bcf-api.model';\n\nexport class BcfViewpointVisibilityPaths extends BcfResourcePath {\n readonly bcfViewpointsService = new BcfApiRequestService(this.injector);\n\n get(params:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}):Observable {\n return this.bcfViewpointsService.get(this.toPath(), params, headers);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HTTPClientHeaders, HTTPClientParamMap } from 'core-app/features/hal/http/http.interfaces';\nimport { BcfResourcePath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { BcfViewpointSelectionPath } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint-selection.paths';\nimport { Observable } from 'rxjs';\nimport { BcfViewpointVisibilityPaths } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint-visibility.paths';\nimport { BcfViewpoint } from 'core-app/features/bim/bcf/api/bcf-api.model';\nimport { map } from 'rxjs/operators';\n\nexport class BcfViewpointPaths extends BcfResourcePath {\n readonly bcfViewpointsService = new BcfApiRequestService(this.injector);\n\n public readonly selection = new BcfViewpointSelectionPath(this.injector, this.path, 'selection');\n\n public readonly visibility = new BcfViewpointVisibilityPaths(this.injector, this.path, 'visibility');\n\n get(params:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}):Observable {\n return this.bcfViewpointsService.get(this.toPath(), params, headers);\n }\n\n delete(headers:HTTPClientHeaders = {}):Observable {\n return this.bcfViewpointsService\n .request('delete', this.toPath(), {}, headers)\n .pipe(\n map(() => { }),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { BcfResourceCollectionPath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { Observable } from 'rxjs';\nimport { BcfViewpointPaths } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint.paths';\nimport { CreateBcfViewpointData } from 'core-app/features/bim/bcf/api/bcf-api.model';\n\nexport class BcfViewpointCollectionPath extends BcfResourceCollectionPath {\n readonly bcfViewpointService = new BcfApiRequestService(this.injector);\n\n post(viewpoint:CreateBcfViewpointData):Observable {\n return this\n .bcfViewpointService\n .request(\n 'post',\n this.toPath(),\n viewpoint,\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { BcfResourceCollectionPath, BcfResourcePath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfTopicResource } from 'core-app/features/bim/bcf/api/topics/bcf-topic.resource';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { BcfViewpointPaths } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint.paths';\nimport { BcfViewpointCollectionPath } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint-collection.paths';\nimport { HTTPClientHeaders, HTTPClientParamMap } from 'core-app/features/hal/http/http.interfaces';\nimport { Observable } from 'rxjs';\n\nexport class BcfTopicPaths extends BcfResourcePath {\n readonly bcfTopicService = new BcfApiRequestService(this.injector, BcfTopicResource);\n\n /** /comments */\n public readonly comments = new BcfResourceCollectionPath(this.injector, this.path, 'comments');\n\n /** /viewpoints */\n public readonly viewpoints = new BcfViewpointCollectionPath(this.injector, this.path, 'viewpoints', BcfViewpointPaths);\n\n get(params:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}):Observable {\n return this.bcfTopicService.get(this.toPath(), params, headers);\n }\n}\n","import { BcfResourceCollectionPath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { HTTPClientHeaders, HTTPClientParamMap } from 'core-app/features/hal/http/http.interfaces';\nimport { Observable } from 'rxjs';\nimport { BcfTopicPaths } from 'core-app/features/bim/bcf/api/topics/bcf-topic.paths';\nimport { Injector } from '@angular/core';\nimport { BcfTopicResource } from 'core-app/features/bim/bcf/api/topics/bcf-topic.resource';\n\nexport class BcfTopicCollectionPath extends BcfResourceCollectionPath {\n readonly bcfTopicService = new BcfApiRequestService(this.injector, BcfTopicResource);\n\n constructor(readonly injector:Injector,\n protected basePath:string,\n segment:string) {\n super(injector, basePath, segment, BcfTopicPaths);\n }\n\n get(params:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}) {\n throw new Error('Not implemented');\n }\n\n /**\n * Create a topic from its to-be-associated work package\n */\n post(payload:any):Observable {\n return this\n .bcfTopicService\n .request(\n 'post',\n this.toPath(),\n payload,\n );\n }\n}\n","import { jsonArrayMember, jsonObject } from 'typedjson';\n\n@jsonObject\nexport class BcfExtensionResource {\n @jsonArrayMember(String)\n topic_actions:string[];\n\n @jsonArrayMember(String)\n project_actions:string[];\n\n @jsonArrayMember(String)\n comment_actions:string[];\n}\n","import { BcfResourcePath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { HTTPClientHeaders, HTTPClientParamMap } from 'core-app/features/hal/http/http.interfaces';\nimport { BcfExtensionResource } from 'core-app/features/bim/bcf/api/extensions/bcf-extension.resource';\n\nexport class BcfExtensionPaths extends BcfResourcePath {\n readonly bcfExtensionService = new BcfApiRequestService(this.injector, BcfExtensionResource);\n\n get(params:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}) {\n return this.bcfExtensionService.get(this.toPath(), params, headers);\n }\n}\n","import { BcfResourcePath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { BcfProjectResource } from 'core-app/features/bim/bcf/api/projects/bcf-project.resource';\nimport { HTTPClientHeaders, HTTPClientParamMap } from 'core-app/features/hal/http/http.interfaces';\nimport { BcfTopicCollectionPath } from 'core-app/features/bim/bcf/api/topics/bcf-viewpoint-collection.paths';\nimport { BcfExtensionPaths } from 'core-app/features/bim/bcf/api/extensions/bcf-extension.paths';\n\nexport class BcfProjectPaths extends BcfResourcePath {\n readonly bcfProjectService = new BcfApiRequestService(this.injector, BcfProjectResource);\n\n /** /topics */\n public readonly topics = new BcfTopicCollectionPath(this.injector, this.path, 'topics');\n\n public readonly extensions = new BcfExtensionPaths(this.injector, this.path, 'extensions');\n\n get(params:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}) {\n return this.bcfProjectService.get(this.toPath(), params, headers);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { BcfResourceCollectionPath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfProjectPaths } from 'core-app/features/bim/bcf/api/projects/bcf-project.paths';\n\n@Injectable({ providedIn: 'root' })\nexport class BcfApiService {\n public readonly bcfApiVersion = '2.1';\n\n public readonly appBasePath = window.appBasePath || '';\n\n public readonly bcfApiBase = `${this.appBasePath}/api/bcf/${this.bcfApiVersion}`;\n\n // /api/bcf/:version/projects\n public readonly projects = new BcfResourceCollectionPath(this.injector, this.bcfApiBase, 'projects', BcfProjectPaths);\n\n constructor(readonly injector:Injector) {\n }\n\n /**\n * Parse the given string into a BCF resource path\n *\n * @param href\n */\n parse(href:string):T {\n if (!href.startsWith(this.bcfApiBase)) {\n throw new Error(`Cannot parse ${href} into BCF resource.`);\n }\n\n const parts = href\n .replace(`${this.bcfApiBase}/`, '')\n .split('/');\n\n // Try to find a target collection or resource\n let current:any = this;\n\n for (let i = 0; i < parts.length; i++) {\n const pathOrId:string = parts[i];\n if (pathOrId in current) {\n // Current has a member named like this URL part\n // descend into it\n current = current[pathOrId];\n } else if (current instanceof BcfResourceCollectionPath) {\n // Otherwise, assume we're looking for an ID\n current = current.id(pathOrId);\n } else {\n // Otherwise, return the current\n break;\n }\n }\n\n return current === this ? undefined : current;\n }\n}\n","import { Injectable, Injector } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { StateService } from '@uirouter/core';\nimport { CreateBcfViewpointData } from 'core-app/features/bim/bcf/api/bcf-api.model';\n\n@Injectable()\nexport abstract class ViewerBridgeService {\n @InjectField() state:StateService;\n\n /**\n * Determine whether a viewer should be shown\n */\n abstract shouldShowViewer:boolean;\n\n protected constructor(readonly injector:Injector) {}\n\n /**\n * Get a viewpoint from the viewer\n */\n abstract getViewpoint$():Observable;\n\n /**\n * Show the given viewpoint JSON in the viewer\n */\n abstract showViewpoint(workPackage:WorkPackageResource, index:number):void;\n\n /**\n * Determine whether a viewer is present to ensure we can show viewpoints\n */\n abstract viewerVisible():boolean;\n\n /**\n * Fires when viewer becomes visible.\n */\n abstract viewerVisible$:Observable;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { HalLink } from 'core-app/features/hal/hal-link/hal-link';\n\n@Injectable()\nexport class BcfPathHelperService {\n constructor(readonly pathHelper:PathHelperService) {\n }\n\n public projectImportIssuePath(projectIdentifier:string) {\n return `${this.pathHelper.projectPath(projectIdentifier)}/issues/upload`;\n }\n\n public projectExportIssuesPath(projectIdentifier:string, filters:string|null) {\n if (filters) {\n return `${this.pathHelper.projectPath(projectIdentifier)}/work_packages.bcf?filters=${filters}`;\n }\n return `${this.pathHelper.projectPath(projectIdentifier)}/work_packages.bcf`;\n }\n\n public snapshotPath(viewpoint:HalLink) {\n return `${viewpoint.href}/snapshot`;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { BcfApiService } from 'core-app/features/bim/bcf/api/bcf-api.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { BcfViewpointPaths } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint.paths';\nimport { ViewerBridgeService } from 'core-app/features/bim/bcf/bcf-viewer-bridge/viewer-bridge.service';\nimport { map, switchMap, tap } from 'rxjs/operators';\nimport { forkJoin, Observable, of } from 'rxjs';\nimport { BcfTopicResource } from 'core-app/features/bim/bcf/api/topics/bcf-topic.resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { BcfViewpointData, CreateBcfViewpointData } from 'core-app/features/bim/bcf/api/bcf-api.model';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\n@Injectable()\nexport class ViewpointsService {\n topicUUID:string|number;\n\n @InjectField() bcfApi:BcfApiService;\n\n @InjectField() viewerBridge:ViewerBridgeService;\n\n @InjectField() apiV3Service:ApiV3Service;\n\n constructor(readonly injector:Injector) { }\n\n public getViewPointResource(workPackage:WorkPackageResource, index:number):BcfViewpointPaths {\n const viewpointHref = (workPackage.bcfViewpoints as HalResource[])[index].href as string;\n\n return this.bcfApi.parse(viewpointHref);\n }\n\n public getViewPoint$(workPackage:WorkPackageResource, index:number):Observable {\n const viewpointResource = this.getViewPointResource(workPackage, index);\n\n return forkJoin({\n viewpoint: viewpointResource.get(),\n selection: viewpointResource.selection.get(),\n visibility: viewpointResource.visibility.get(),\n })\n .pipe(\n map(({ viewpoint, selection, visibility }) => {\n const data = viewpoint as BcfViewpointData;\n data.components = {\n selection: selection.selection,\n visibility: visibility.visibility,\n };\n return data;\n }),\n );\n }\n\n public deleteViewPoint$(workPackage:WorkPackageResource, index:number):Observable {\n const viewpointResource = this.getViewPointResource(workPackage, index);\n\n return viewpointResource\n .delete()\n .pipe(\n // Update the work package to reload the viewpoints\n tap(() => this.apiV3Service.work_packages.id(workPackage).requireAndStream(true)),\n );\n }\n\n public saveViewpoint$(workPackage:WorkPackageResource, viewpoint?:CreateBcfViewpointData):Observable {\n const projectLink = (workPackage.project as HalResource).href;\n const wpProjectId = idFromLink(projectLink);\n const topicUUID$ = this.setBcfTopic$(workPackage);\n // Default to the current viewer's viewpoint\n const viewpoint$ = viewpoint\n ? of(viewpoint)\n : this.viewerBridge.getViewpoint$();\n\n return forkJoin({\n topicUUID: topicUUID$,\n viewpoint: viewpoint$,\n })\n .pipe(\n switchMap((results) => this.bcfApi\n .projects.id(wpProjectId)\n .topics.id(results.topicUUID)\n .viewpoints\n .post(results.viewpoint)),\n // Update the work package to reload the viewpoints\n tap(() => this.apiV3Service.work_packages.id(workPackage).requireAndStream(true)),\n );\n }\n\n public setBcfTopic$(workPackage:WorkPackageResource):Observable {\n if (this.topicUUID) {\n return of(this.topicUUID);\n }\n const topicHref = (workPackage.bcfTopic as HalResource)?.href;\n const topicUUID$ = topicHref\n ? of(this.bcfApi.parse(topicHref).id)\n : this.createBcfTopic$(workPackage);\n\n return topicUUID$.pipe(\n map((topicUUID) => {\n this.topicUUID = topicUUID;\n return this.topicUUID;\n }),\n );\n }\n\n private createBcfTopic$(workPackage:WorkPackageResource):Observable {\n const wpProjectId = idFromLink(workPackage.project.href);\n const wpPayload = workPackage.convertBCF.payload;\n\n return this.bcfApi\n .projects.id(wpProjectId)\n .topics\n .post(wpPayload)\n .pipe(\n map((resource:BcfTopicResource) => {\n this.topicUUID = resource.guid;\n return this.topicUUID;\n }),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { BcfPathHelperService } from 'core-app/features/bim/bcf/helper/bcf-path-helper.service';\n\nexport class BcfThumbnailDisplayField extends DisplayField {\n @InjectField() bcfPathHelper:BcfPathHelperService;\n\n public render(element:HTMLElement, displayText:string):void {\n const viewpoints = this.resource.bcfViewpoints;\n if (viewpoints && viewpoints.length > 0) {\n const viewpoint = viewpoints[0];\n element.innerHTML = `\n \n `;\n } else {\n element.innerHTML = '';\n }\n }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n@Injectable()\nexport class BcfDetectorService {\n constructor(@Inject(DOCUMENT) private documentElement:Document) {\n }\n\n /**\n * Detect whether the BCF module was activated,\n * resulting in a body class.\n */\n public get isBcfActivated() {\n return this.hasBodyClass('bcf-activated');\n }\n\n private hasBodyClass(name:string):boolean {\n return this.documentElement.body.classList.contains(name);\n }\n}\n","import { multiInput } from 'reactivestates';\nimport { BcfExtensionResource } from 'core-app/features/bim/bcf/api/extensions/bcf-extension.resource';\nimport { BcfApiService } from 'core-app/features/bim/bcf/api/bcf-api.service';\nimport { Observable } from 'rxjs';\nimport { map, take } from 'rxjs/operators';\nimport { Injectable } from '@angular/core';\n\nexport type AllowedExtensionKey = keyof BcfExtensionResource;\n\n@Injectable({ providedIn: 'root' })\nexport class BcfAuthorizationService {\n // Poor mans caching to avoid repeatedly fetching from the backend.\n protected authorizationMap = multiInput();\n\n constructor(readonly bcfApi:BcfApiService) {\n }\n\n /**\n * Returns an observable boolean whether the given action\n * is authorized in the project by using the project extensions.\n *\n * Ensures the extension is loaded only once per project\n *\n * @param projectIdentifier Project identifier to check permission in\n * @param extension The extension key to check for\n * @param action The desired action\n */\n public authorized$(projectIdentifier:string, extension:AllowedExtensionKey, action:string):Observable {\n const state = this.authorizationMap.get(projectIdentifier);\n\n state.putFromPromiseIfPristine(() => this.bcfApi\n .projects.id(projectIdentifier)\n .extensions\n .get()\n .toPromise());\n\n return state\n .values$()\n .pipe(\n map(\n (resource) => resource[extension] && resource[extension].includes(action),\n ),\n );\n }\n\n /**\n * One-time check to determine current allowed state.\n *\n * @param projectIdentifier Project identifier to check permission in\n * @param extension The extension key to check for\n * @param action The desired action\n */\n public isAllowedTo(projectIdentifier:string, extension:AllowedExtensionKey, action:string):Promise {\n return this\n .authorized$(projectIdentifier, extension, action)\n .pipe(\n take(1),\n )\n .toPromise()\n .catch(() => false);\n }\n}\n","\n
\n
\n
\n

\n
\n
\n\n
0\">\n \n \n
\n\n \n \n {{text.viewpoint}} \n \n
\n
","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n ViewChild,\n} from '@angular/core';\nimport { StateService } from '@uirouter/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { NgxGalleryComponent, NgxGalleryOptions } from '@kolkov/ngx-gallery';\nimport { HalLink } from 'core-app/features/hal/hal-link/hal-link';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ViewerBridgeService } from 'core-app/features/bim/bcf/bcf-viewer-bridge/viewer-bridge.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { WorkPackageCreateService } from 'core-app/features/work-packages/components/wp-new/wp-create.service';\nimport { BcfAuthorizationService } from 'core-app/features/bim/bcf/api/bcf-authorization.service';\nimport { ViewpointsService } from 'core-app/features/bim/bcf/helper/viewpoints.service';\nimport { BcfViewpointItem } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint-item.interface';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { BcfViewService } from 'core-app/features/bim/ifc_models/pages/viewer/bcf-view.service';\nimport { filter, take } from 'rxjs/operators';\n\n@Component({\n templateUrl: './bcf-wp-attribute-group.component.html',\n styleUrls: ['./bcf-wp-attribute-group.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [ViewpointsService],\n})\nexport class BcfWpAttributeGroupComponent extends UntilDestroyedMixin implements AfterViewInit, OnDestroy, OnInit {\n @Input() workPackage:WorkPackageResource;\n\n @ViewChild(NgxGalleryComponent) gallery:NgxGalleryComponent;\n\n text = {\n bcf: this.I18n.t('js.bcf.label_bcf'),\n viewpoint: this.I18n.t('js.bcf.viewpoint'),\n add_viewpoint: this.I18n.t('js.bcf.add_viewpoint'),\n show_viewpoint: this.I18n.t('js.bcf.show_viewpoint'),\n delete_viewpoint: this.I18n.t('js.bcf.delete_viewpoint'),\n text_are_you_sure: this.I18n.t('js.text_are_you_sure'),\n notice_successful_create: this.I18n.t('js.notice_successful_create'),\n notice_successful_delete: this.I18n.t('js.notice_successful_delete'),\n };\n\n galleryOptions:NgxGalleryOptions[] = [\n {\n width: '100%',\n height: '400px',\n\n // Show first thumbnail by default\n startIndex: 0,\n\n // Show only one image (\"thumbnail\")\n // and disable the large image slideshow\n image: false,\n thumbnailsColumns: 1,\n // Ensure thumbnails are ALWAYS shown\n thumbnailsAutoHide: false,\n // For BCFs all information shall be visible\n thumbnailSize: 'contain',\n imageAnimation: '',\n previewAnimation: false,\n previewCloseOnEsc: true,\n previewKeyboardNavigation: true,\n imageSize: 'contain',\n imageArrowsAutoHide: true,\n // thumbnailsArrowsAutoHide: true,\n thumbnailsMargin: 5,\n thumbnailMargin: 5,\n previewDownload: true,\n previewCloseOnClick: true,\n arrowPrevIcon: 'icon-arrow-left2',\n arrowNextIcon: 'icon-arrow-right2',\n closeIcon: 'icon-close',\n downloadIcon: 'icon-download',\n thumbnailActions: this.actions(),\n actions: this.actions(),\n },\n // max-width 800\n {\n breakpoint: 800,\n width: '100%',\n height: '400px',\n imagePercent: 80,\n thumbnailsPercent: 20,\n thumbnailsMargin: 5,\n thumbnailMargin: 5,\n },\n // max-width 680\n {\n breakpoint: 680,\n height: '200px',\n thumbnailsColumns: 3,\n thumbnailsMargin: 5,\n thumbnailMargin: 5,\n },\n ];\n\n viewpoints:BcfViewpointItem[] = [];\n\n galleryImages:any[] = [];\n\n // Store whether viewing is allowed\n viewAllowed = false;\n\n // Store whether viewpoint creation is allowed\n createAllowed = false;\n\n // Currently, this is static. Need observable if this changes over time\n viewerVisible = false;\n\n projectId:string;\n\n constructor(readonly state:StateService,\n readonly bcfAuthorization:BcfAuthorizationService,\n readonly viewerBridge:ViewerBridgeService,\n readonly apiV3Service:ApiV3Service,\n readonly wpCreate:WorkPackageCreateService,\n readonly toastService:ToastService,\n @Optional() readonly bcfViewer:BcfViewService,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n readonly viewpointsService:ViewpointsService) {\n super();\n }\n\n ngAfterViewInit():void {\n // Observe changes on the work package to update the viewpoints\n this.observeChanges();\n }\n\n ngOnInit():void {\n this.viewerBridge.viewerVisible$.subscribe((visible:boolean) => {\n if (visible) {\n this.viewerVisible = true;\n } else {\n this.viewerVisible = false;\n }\n this.cdRef.detectChanges();\n });\n }\n\n protected observeChanges() {\n this\n .apiV3Service\n .work_packages\n .id(this.workPackage)\n .requireAndStream()\n .pipe(this.untilDestroyed())\n .subscribe(async (wp) => {\n this.workPackage = wp;\n\n if (!this.projectId) {\n await this.initialize(this.workPackage);\n }\n\n if (wp.bcfViewpoints) {\n this.refreshViewpoints(wp.bcfViewpoints);\n }\n });\n }\n\n async initialize(workPackage:WorkPackageResource) {\n this.projectId = idFromLink(workPackage.project.href);\n this.viewAllowed = await this.bcfAuthorization.isAllowedTo(this.projectId, 'project_actions', 'viewTopic');\n this.createAllowed = await this.bcfAuthorization.isAllowedTo(this.projectId, 'topic_actions', 'createViewpoint');\n\n this.loadViewpointFromRoute(workPackage);\n this.cdRef.detectChanges();\n }\n\n refreshViewpoints(viewpoints:HalLink[]):void {\n this.viewpoints = viewpoints.map((el:HalLink) => ({ href: el.href, snapshotURL: `${el.href}/snapshot` }));\n\n this.setViewpointsOnGallery(this.viewpoints);\n }\n\n protected showViewpoint(workPackage:WorkPackageResource, index:number):void {\n if (this.bcfViewer && this.viewerBridge.shouldShowViewer) {\n // FIXME: This component shouldn't know about the state of the BCF module. bcfViewer is null, when outside of\n // BCF module. Inside BCF module, we try to avoid hard transition, with sending an update to the bcf view\n // state before showing a viewpoint.\n switch (this.bcfViewer.currentViewerState()) {\n case 'table':\n this.bcfViewer.update('splitTable');\n break;\n case 'cards':\n this.bcfViewer.update('splitCards');\n break;\n default:\n }\n\n // wait until viewer is visible after view state update before showing viewpoint\n this.viewerBridge.viewerVisible$\n .pipe(\n filter((visible) => visible),\n take(1),\n )\n .subscribe(() => this.viewerBridge.showViewpoint(workPackage, index));\n } else {\n this.viewerBridge.showViewpoint(workPackage, index);\n }\n }\n\n protected deleteViewpoint(workPackage:WorkPackageResource, index:number):void {\n if (!window.confirm(this.text.text_are_you_sure)) {\n return;\n }\n\n this.viewpointsService\n .deleteViewPoint$(workPackage, index)\n .subscribe(() => {\n this.toastService.addSuccess(this.text.notice_successful_delete);\n this.gallery.preview.close();\n });\n }\n\n public saveViewpoint(workPackage:WorkPackageResource) {\n this.viewpointsService\n .saveViewpoint$(workPackage)\n .subscribe(() => {\n this.toastService.addSuccess(this.text.notice_successful_create);\n this.showIndex = this.viewpoints.length;\n });\n }\n\n protected loadViewpointFromRoute(workPackage:WorkPackageResource) {\n if (typeof (this.state.params.viewpoint) === 'number') {\n const index = this.state.params.viewpoint;\n this.showViewpoint(workPackage, index);\n this.showIndex = index;\n this.selectViewpointInGallery();\n void this.state.go('.', { ...this.state.params, viewpoint: undefined }, { reload: false });\n }\n }\n\n public shouldShowGroup() {\n return this.viewAllowed\n && (this.viewpoints.length > 0\n || (this.createAllowed && this.viewerVisible));\n }\n\n // Gallery functionality\n protected actions() {\n return [\n {\n icon: 'icon-view-model',\n onClick: (evt:any, index:number) => {\n this.showViewpoint(this.workPackage, index);\n this.gallery.preview.close();\n },\n titleText: this.text.show_viewpoint,\n },\n {\n icon: 'icon-delete',\n onClick: (evt:any, index:number) => this.deleteViewpoint(this.workPackage, index),\n titleText: this.text.delete_viewpoint,\n },\n ];\n }\n\n // eslint-disable-next-line class-methods-use-this\n public galleryPreviewOpen():void {\n jQuery('.op-app-header').addClass('-no-z-index');\n }\n\n // eslint-disable-next-line class-methods-use-this\n public galleryPreviewClose():void {\n jQuery('.op-app-header').removeClass('-no-z-index');\n }\n\n public selectViewpointInGallery() {\n setTimeout(() => this.gallery?.show(this.showIndex), 250);\n }\n\n public onGalleryChanged(event:{ index:number }) {\n this.showIndex = event.index;\n }\n\n protected set showIndex(value:number) {\n const options = [...this.galleryOptions];\n options[0].startIndex = value;\n this.galleryOptions = options;\n }\n\n protected get showIndex():number {\n return this.galleryOptions[0].startIndex!;\n }\n\n protected setViewpointsOnGallery(viewpoints:BcfViewpointItem[]) {\n const { length } = viewpoints;\n\n this.setThumbnailProperties(length);\n\n if (this.showIndex < 0 || length < 1) {\n this.showIndex = 0;\n } else if (this.showIndex >= length) {\n this.showIndex = length - 1;\n }\n\n this.galleryImages = viewpoints.map((viewpoint) => ({\n small: viewpoint.snapshotURL,\n medium: viewpoint.snapshotURL,\n big: viewpoint.snapshotURL,\n }));\n this.cdRef.detectChanges();\n }\n\n protected setThumbnailProperties(viewpointCount:number) {\n const options = [...this.galleryOptions];\n\n options[0].thumbnailsColumns = viewpointCount < 5 ? viewpointCount : 4;\n options[1].thumbnailsColumns = viewpointCount < 5 ? viewpointCount : 4;\n options[2].thumbnailsColumns = viewpointCount < 4 ? viewpointCount : 3;\n\n options[0].height = `${this.dynamicThumbnailHeight(viewpointCount)}px`;\n options[1].height = `${this.dynamicThumbnailHeight(viewpointCount)}px`;\n options[2].height = `${this.dynamicThumbnailHeight(viewpointCount)}px`;\n\n this.galleryOptions = options;\n }\n\n protected dynamicThumbnailHeight(viewpointCount:number):number {\n return Math.max(Math.round(300 / viewpointCount), 120);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { AfterViewInit, ChangeDetectionStrategy, Component } from '@angular/core';\nimport { BcfWpAttributeGroupComponent } from 'core-app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component';\nimport { switchMap, take } from 'rxjs/operators';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { forkJoin } from 'rxjs';\nimport { BcfViewpointItem } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint-item.interface';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\n@Component({\n templateUrl: './bcf-wp-attribute-group.component.html',\n styleUrls: ['./bcf-wp-attribute-group.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BcfNewWpAttributeGroupComponent extends BcfWpAttributeGroupComponent implements AfterViewInit {\n galleryViewpoints:BcfViewpointItem[] = [];\n\n ngAfterViewInit():void {\n if (this.viewerVisible) {\n super.ngAfterViewInit();\n\n // Save any leftover viewpoints when saving the work package\n if (isNewResource(this.workPackage)) {\n this.observeCreation();\n }\n }\n }\n\n // Because this is a new WorkPackage, in order to save the\n // viewpoints on it we need to:\n // - Wait until the WorkPackage is created\n // - Create the BCFTopic on it to save the viewpoints\n private observeCreation() {\n this.wpCreate\n .onNewWorkPackage()\n .pipe(\n this.untilDestroyed(),\n take(1),\n switchMap((wp:WorkPackageResource) => this.viewpointsService.setBcfTopic$(wp), (wp) => wp),\n switchMap((wp:WorkPackageResource) => {\n this.workPackage = wp;\n const observables = this.galleryViewpoints\n .filter((viewPointItem) => !viewPointItem.href && viewPointItem.viewpoint)\n .map((viewPointItem) => this.viewpointsService.saveViewpoint$(this.workPackage, viewPointItem.viewpoint));\n\n return forkJoin(observables);\n }),\n )\n .subscribe(() => {\n this.showIndex = this.galleryViewpoints.length - 1;\n });\n }\n\n // Disable show viewpoint functionality\n showViewpoint(_workPackage:WorkPackageResource, _index:number):void {\n\n }\n\n deleteViewpoint(workPackage:WorkPackageResource, index:number):void {\n this.galleryViewpoints = this.galleryViewpoints.filter((_, i) => i !== index);\n\n this.setViewpointsOnGallery(this.galleryViewpoints);\n }\n\n saveViewpoint():void {\n this.viewerBridge\n .getViewpoint$()\n .subscribe((viewpoint) => {\n const newViewpoint = {\n snapshotURL: viewpoint.snapshot.snapshot_data,\n viewpoint,\n };\n\n this.galleryViewpoints = [\n ...this.galleryViewpoints,\n newViewpoint,\n ];\n\n this.setViewpointsOnGallery(this.galleryViewpoints);\n\n // Select the last created viewpoint and show it\n this.showIndex = this.galleryViewpoints.length - 1;\n this.selectViewpointInGallery();\n });\n }\n\n shouldShowGroup():boolean {\n return this.createAllowed && this.viewerVisible;\n }\n\n protected actions():{ icon:string, onClick:(evt:unknown, index:number) => void, titleText:string }[] {\n // Show only delete button\n return super\n .actions()\n .filter((el) => el.icon === 'icon-delete');\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport {\n distinctUntilChanged, filter, first, map,\n} from 'rxjs/operators';\nimport { ViewerBridgeService } from 'core-app/features/bim/bcf/bcf-viewer-bridge/viewer-bridge.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ViewpointsService } from 'core-app/features/bim/bcf/helper/viewpoints.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { BcfViewpointData, CreateBcfViewpointData } from 'core-app/features/bim/bcf/api/bcf-api.model';\n\ndeclare global {\n interface Window {\n RevitBridge:{\n sendMessageToRevit:(messageType:string, trackingId:string, payload:string) => void,\n sendMessageToOpenProject:(message:string) => void\n };\n }\n}\n\ntype RevitBridgeMessage = {\n messageType:string,\n trackingId:string,\n messagePayload:CreateBcfViewpointData\n};\n\n@Injectable()\nexport class RevitBridgeService extends ViewerBridgeService {\n public shouldShowViewer = false;\n\n public viewerVisible$ = new BehaviorSubject(false);\n\n private revitMessageReceivedSource = new Subject();\n\n private trackingIdNumber = 0;\n\n @InjectField() viewpointsService:ViewpointsService;\n\n revitMessageReceived$ = this.revitMessageReceivedSource.asObservable();\n\n constructor(readonly injector:Injector) {\n super(injector);\n\n if (window.RevitBridge) {\n this.hookUpRevitListener();\n } else {\n window.addEventListener('revit.plugin.ready', () => {\n this.hookUpRevitListener();\n }, { once: true });\n }\n }\n\n public viewerVisible():boolean {\n return this.viewerVisible$.getValue();\n }\n\n public getViewpoint$():Observable {\n const trackingId = this.newTrackingId();\n\n this.sendMessageToRevit('ViewpointGenerationRequest', trackingId, '');\n\n return this.revitMessageReceived$\n .pipe(\n distinctUntilChanged(),\n filter((message) => message.messageType === 'ViewpointData' && message.trackingId === trackingId),\n first(),\n map((message) => {\n // FIXME: Deprecated code\n // the handling of the message payload is only needed to be compatible to the revit add-in <= 2.3.2. In\n // newer versions the message payload is sent correctly and needs no special treatment\n const viewpointJson = message.messagePayload;\n\n if (viewpointJson.snapshot.hasOwnProperty('snapshot_type') // eslint-disable-line no-prototype-builtins\n && viewpointJson.snapshot.hasOwnProperty('snapshot_data')) { // eslint-disable-line no-prototype-builtins\n // already correctly formatted payload\n return viewpointJson;\n }\n\n // at this point snapshot data should be sent as a base64 string\n viewpointJson.snapshot = {\n snapshot_type: 'png',\n snapshot_data: viewpointJson.snapshot as unknown as string,\n };\n\n return viewpointJson;\n }),\n );\n }\n\n public showViewpoint(workPackage:WorkPackageResource, index:number):void {\n this.viewpointsService\n .getViewPoint$(workPackage, index)\n .subscribe((viewpoint:BcfViewpointData) => this.sendMessageToRevit(\n 'ShowViewpoint', this.newTrackingId(), JSON.stringify(viewpoint),\n ));\n }\n\n sendMessageToRevit(messageType:string, trackingId:string, messagePayload:string):void {\n if (!this.viewerVisible()) {\n return;\n }\n\n window.RevitBridge.sendMessageToRevit(messageType, trackingId, messagePayload);\n }\n\n private hookUpRevitListener() {\n window.RevitBridge.sendMessageToOpenProject = (messageString:string) => {\n const { messageType, trackingId, messagePayload } = JSON.parse(messageString) as {\n messageType:string,\n trackingId:string,\n messagePayload:string\n };\n\n this.revitMessageReceivedSource.next({\n messageType,\n trackingId,\n messagePayload: JSON.parse(messagePayload) as CreateBcfViewpointData,\n });\n };\n this.viewerVisible$.next(true);\n }\n\n newTrackingId():string {\n this.trackingIdNumber += 1;\n return String(this.trackingIdNumber);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Injector,\n NgModule,\n} from '@angular/core';\nimport { OPSharedModule } from 'core-app/shared/shared.module';\nimport { NgxGalleryModule } from '@kolkov/ngx-gallery';\nimport { DisplayFieldService } from 'core-app/shared/components/fields/display/display-field.service';\nimport { BcfThumbnailDisplayField } from 'core-app/features/bim/bcf/fields/display/bcf-thumbnail-field.module';\nimport { BcfDetectorService } from 'core-app/features/bim/bcf/helper/bcf-detector.service';\nimport { BcfPathHelperService } from 'core-app/features/bim/bcf/helper/bcf-path-helper.service';\nimport { ViewpointsService } from 'core-app/features/bim/bcf/helper/viewpoints.service';\nimport { BcfImportButtonComponent } from 'core-app/features/bim/ifc_models/toolbar/import-export-bcf/bcf-import-button.component';\nimport { BcfExportButtonComponent } from 'core-app/features/bim/ifc_models/toolbar/import-export-bcf/bcf-export-button.component';\nimport { IFCViewerService } from 'core-app/features/bim/ifc_models/ifc-viewer/ifc-viewer.service';\nimport { ViewerBridgeService } from 'core-app/features/bim/bcf/bcf-viewer-bridge/viewer-bridge.service';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { BcfWpAttributeGroupComponent } from 'core-app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component';\nimport { BcfNewWpAttributeGroupComponent } from 'core-app/features/bim/bcf/bcf-wp-attribute-group/bcf-new-wp-attribute-group.component';\nimport { RevitBridgeService } from 'core-app/features/bim/revit_add_in/revit-bridge.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { RefreshButtonComponent } from 'core-app/features/bim/ifc_models/toolbar/import-export-bcf/refresh-button.component';\n\n/**\n * Determines based on the current user agent whether\n * we're running in Revit or not.\n *\n * Depending on that, we use the IFC viewer service for showing/saving viewpoints.\n */\nexport const viewerBridgeServiceFactory = (injector:Injector) => {\n if (window.navigator.userAgent.search('Revit') > -1) {\n return new RevitBridgeService(injector);\n }\n return injector.get(IFCViewerService, new IFCViewerService(injector));\n};\n\n@NgModule({\n imports: [\n OPSharedModule,\n NgxGalleryModule,\n ],\n providers: [\n {\n provide: ViewerBridgeService,\n useFactory: viewerBridgeServiceFactory,\n deps: [Injector],\n },\n BcfDetectorService,\n BcfPathHelperService,\n ViewpointsService,\n ],\n declarations: [\n BcfWpAttributeGroupComponent,\n BcfNewWpAttributeGroupComponent,\n BcfImportButtonComponent,\n BcfExportButtonComponent,\n RefreshButtonComponent,\n ],\n exports: [\n BcfImportButtonComponent,\n BcfExportButtonComponent,\n RefreshButtonComponent,\n ],\n})\nexport class OpenprojectBcfModule {\n static bootstrapCalled = false;\n\n constructor(injector:Injector) {\n OpenprojectBcfModule.bootstrap(injector);\n }\n\n // The static property prevents running the function\n // multiple times. This happens e.g. when the module is included\n // into a plugin's module.\n public static bootstrap(injector:Injector):void {\n if (this.bootstrapCalled) {\n return;\n }\n\n this.bootstrapCalled = true;\n\n const displayFieldService = injector.get(DisplayFieldService);\n displayFieldService\n .addFieldType(BcfThumbnailDisplayField, 'bcfThumbnail', [\n 'BCF Thumbnail',\n ]);\n\n const hookService = injector.get(HookService);\n hookService.register('prependedAttributeGroups', (workPackage:WorkPackageResource) => {\n if (!window.OpenProject.isBimEdition) {\n return;\n }\n\n if (isNewResource(workPackage)) {\n return BcfNewWpAttributeGroupComponent;\n }\n return BcfWpAttributeGroupComponent;\n });\n }\n}\n","// @ts-ignore\nimport { utils } from '@xeokit/xeokit-sdk/dist/xeokit-sdk.es';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { IFCGonDefinition } from '../pages/viewer/ifc-models-data.service';\n\n/**\n * Default server client which loads content via HTTP from the file system.\n */\nexport class XeokitServer {\n private ifcModels:IFCGonDefinition;\n\n /**\n *\n * @param config\n * @param.config.pathHelper instance of PathHelperService.\n */\n constructor(private pathHelper:PathHelperService) {\n this.ifcModels = window.gon.ifc_models;\n }\n\n /**\n * Gets the manifest of all projects.\n * @param done\n * @param error\n */\n getProjects(done:Function, _error:Function) {\n done({ projects: this.ifcModels.projects });\n }\n\n /**\n * Gets a manifest for a project.\n * @param projectId\n * @param done\n * @param error\n */\n getProject(projectData:any, done:Function, _error:Function) {\n const manifestData = {\n id: projectData[0].id,\n name: projectData[0].name,\n models: this.ifcModels.models,\n viewerContent: {\n modelsLoaded: this.ifcModels.shown_models,\n },\n viewerConfigs: {},\n };\n\n done(manifestData);\n }\n\n /**\n * Gets geometry for a model within a project.\n * @param projectId\n * @param modelId\n * @param done\n * @param error\n */\n getGeometry(projectId:string, modelId:number, done:Function, error:Function) {\n const attachmentId = this.ifcModels.xkt_attachment_ids[modelId];\n console.log(`Loading model geometry for: ${attachmentId}`);\n utils.loadArraybuffer(this.pathHelper.attachmentContentPath(attachmentId), done, error);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { XeokitServer } from 'core-app/features/bim/ifc_models/xeokit/xeokit-server';\nimport { ViewerBridgeService } from 'core-app/features/bim/bcf/bcf-viewer-bridge/viewer-bridge.service';\nimport { BehaviorSubject, Observable, of } from 'rxjs';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { BcfApiService } from 'core-app/features/bim/bcf/api/bcf-api.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ViewpointsService } from 'core-app/features/bim/bcf/helper/viewpoints.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { HttpClient } from '@angular/common/http';\nimport { IfcProjectDefinition } from 'core-app/features/bim/ifc_models/pages/viewer/ifc-models-data.service';\nimport { BIMViewer } from '@xeokit/xeokit-bim-viewer/dist/xeokit-bim-viewer.es';\nimport { BcfViewpointData, CreateBcfViewpointData } from 'core-app/features/bim/bcf/api/bcf-api.model';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\nexport interface XeokitElements {\n canvasElement:HTMLElement;\n explorerElement:HTMLElement;\n toolbarElement:HTMLElement;\n inspectorElement:HTMLElement;\n navCubeCanvasElement:HTMLElement;\n busyModelBackdropElement:HTMLElement;\n enableEditModels?:boolean;\n keyboardEventsElement?:HTMLElement;\n}\n\n/**\n * Options for saving current viewpoint in xeokit-bim-viewer.\n * See: https://xeokit.github.io/xeokit-bim-viewer/docs/class/src/BIMViewer.js~BIMViewer.html#instance-method-saveBCFViewpoint\n */\nexport interface BCFCreationOptions {\n spacesVisible?:boolean;\n spaceBoundariesVisible?:boolean;\n openingsVisible?:boolean;\n defaultInvisible?:boolean;\n reverseClippingPlanes?:boolean;\n}\n\n/**\n * Options for loading a viewpoint into xeokit-bim-viewer.\n * See: https://xeokit.github.io/xeokit-bim-viewer/docs/class/src/BIMViewer.js~BIMViewer.html#instance-method-loadBCFViewpoint\n */\nexport interface BCFLoadOptions {\n rayCast?:boolean;\n immediate?:boolean;\n duration?:number;\n updateCompositeObjects?:boolean;\n reverseClippingPlanes?:boolean;\n}\n\n/**\n * Wrapping type from xeokit module. Can be removed after we get a real type package.\n */\ntype Controller = {\n on:(event:string, callback:(event:unknown) => void) => string\n};\n\n/**\n * Wrapping type from xeokit module. Can be removed after we get a real type package.\n */\ntype XeokitBimViewer = Controller&{\n loadProject:(projectId:string) => void,\n saveBCFViewpoint:(options:BCFCreationOptions) => CreateBcfViewpointData,\n loadBCFViewpoint:(bcfViewpoint:BcfViewpointData, options:BCFLoadOptions) => void,\n setKeyboardEnabled:(enabled:boolean) => true,\n destroy:() => void\n};\n\n@Injectable()\nexport class IFCViewerService extends ViewerBridgeService {\n public shouldShowViewer = true;\n\n public viewerVisible$ = new BehaviorSubject(false);\n\n public inspectorVisible$ = new BehaviorSubject(false);\n\n private xeokitViewer:XeokitBimViewer|undefined;\n\n @InjectField() pathHelper:PathHelperService;\n\n @InjectField() bcfApi:BcfApiService;\n\n @InjectField() viewpointsService:ViewpointsService;\n\n @InjectField() currentProjectService:CurrentProjectService;\n\n @InjectField() httpClient:HttpClient;\n\n constructor(readonly injector:Injector) {\n super(injector);\n }\n\n public newViewer(elements:XeokitElements, projects:IfcProjectDefinition[]):void {\n const server = new XeokitServer(this.pathHelper);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n const viewerUI = new BIMViewer(server, elements) as XeokitBimViewer;\n\n viewerUI.on('modelLoaded', () => this.viewerVisible$.next(true));\n\n viewerUI.loadProject(projects[0].id);\n\n viewerUI.on('addModel', () => { // \"Add\" selected in Models tab's context menu\n window.location.href = this.pathHelper.ifcModelsNewPath(this.currentProjectService.identifier as string);\n });\n\n viewerUI.on('openInspector', () => {\n this.inspectorVisible$.next(true);\n });\n\n viewerUI.on('editModel', (event:{ modelId:number|string }) => { // \"Edit\" selected in Models tab's context menu\n window.location.href = this.pathHelper.ifcModelsEditPath(this.currentProjectService.identifier as string, event.modelId);\n });\n\n viewerUI.on('deleteModel', (event:{ modelId:number|string }) => { // \"Delete\" selected in Models tab's context menu\n // We don't have an API for IFC models yet. We need to use the normal Rails form posts for deletion.\n const formData = new FormData();\n formData.append(\n 'authenticity_token',\n jQuery('meta[name=csrf-token]').attr('content') as string,\n );\n formData.append(\n '_method',\n 'delete',\n );\n\n this.httpClient.post(\n this.pathHelper.ifcModelsDeletePath(\n this.currentProjectService.identifier as string, event.modelId,\n ),\n formData,\n )\n .subscribe()\n .add(() => {\n // Ensure we reload after every request.\n // We need to reload to get a fresh CSRF token for a successive\n // model deletion placed as a META element into the HTML HEAD.\n window.location.reload();\n });\n });\n\n this.viewer = viewerUI;\n }\n\n public destroy():void {\n this.viewerVisible$.next(false);\n\n if (!this.viewer) {\n return;\n }\n\n this.viewer.destroy();\n this.viewer = undefined;\n }\n\n public get viewer():XeokitBimViewer|undefined {\n return this.xeokitViewer;\n }\n\n public set viewer(viewer:XeokitBimViewer|undefined) {\n this.xeokitViewer = viewer;\n }\n\n public setKeyboardEnabled(val:boolean):void {\n this.viewer?.setKeyboardEnabled(val);\n }\n\n public getViewpoint$():Observable {\n if (!this.viewer) {\n return of();\n }\n\n const opts:BCFCreationOptions = { spacesVisible: true, reverseClippingPlanes: true };\n const viewpoint = this.viewer.saveBCFViewpoint(opts);\n\n // The backend rejects viewpoints with bitmaps\n viewpoint.bitmaps = null;\n\n return of(viewpoint);\n }\n\n public showViewpoint(workPackage:WorkPackageResource, index:number):void {\n if (this.viewerVisible()) {\n const opts:BCFLoadOptions = { updateCompositeObjects: true, reverseClippingPlanes: true };\n this.viewpointsService\n .getViewPoint$(workPackage, index)\n .subscribe((viewpoint) => {\n this.viewer?.loadBCFViewpoint(viewpoint, opts);\n });\n } else {\n // FIXME: When triggering showViewpoint from anywhere outside BCF module, there is no viewer shown and we have\n // no means of setting it from here. Hence we must make a hard transition to bcf details route of the\n // current work package.\n window.location.href = this.pathHelper.bimDetailsPath(\n idFromLink((workPackage.project as HalResource).href),\n workPackage.id || '',\n index,\n );\n }\n }\n\n public viewerVisible():boolean {\n return !!this.viewer;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageQueryStateService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-base.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { ViewerBridgeService } from 'core-app/features/bim/bcf/bcf-viewer-bridge/viewer-bridge.service';\n\nexport const bcfCardsViewIdentifier = 'cards';\nexport const bcfViewerViewIdentifier = 'viewer';\nexport const bcfSplitViewTableIdentifier = 'splitTable';\nexport const bcfSplitViewCardsIdentifier = 'splitCards';\nexport const bcfTableViewIdentifier = 'table';\n\nexport type BcfViewState = 'cards'|'viewer'|'splitTable'|'splitCards'|'table';\n\n@Injectable()\nexport class BcfViewService extends WorkPackageQueryStateService {\n public text:{ [key:string]:string } = {\n cards: this.I18n.t('js.views.card'),\n viewer: this.I18n.t('js.ifc_models.views.viewer'),\n splitTable: this.I18n.t('js.ifc_models.views.split'),\n splitCards: this.I18n.t('js.ifc_models.views.split_cards'),\n table: this.I18n.t('js.views.list'),\n };\n\n public icon:{ [key:string]:string } = {\n cards: 'icon-view-card',\n viewer: 'icon-view-model',\n splitTable: 'icon-view-split-viewer-table',\n splitCards: 'icon-view-split2',\n table: 'icon-view-list',\n };\n\n constructor(\n private readonly I18n:I18nService,\n private readonly viewerBridgeService:ViewerBridgeService,\n protected readonly querySpace:IsolatedQuerySpace,\n ) {\n super(querySpace);\n }\n\n hasChanged(query:QueryResource):boolean {\n return this.current !== query.displayRepresentation;\n }\n\n applyToQuery(query:QueryResource):boolean {\n // eslint-disable-next-line no-param-reassign\n query.displayRepresentation = this.current;\n return true;\n }\n\n public valueFromQuery(query:QueryResource):BcfViewState|undefined {\n const dr = query.displayRepresentation;\n\n switch (dr) {\n case 'splitCards':\n case 'splitTable':\n case 'cards':\n case 'table':\n case 'viewer':\n return dr;\n default:\n return this.viewerBridgeService.shouldShowViewer ? 'splitCards' : 'cards';\n }\n }\n\n public currentViewerState():BcfViewState|undefined {\n return this.current;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BoardActionService } from 'core-app/features/boards/board/board-actions/board-action.service';\nimport { ITileViewEntry } from 'core-app/features/boards/tile-view/tile-view.component';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\n\n@Injectable({ providedIn: 'root' })\nexport class BoardActionsRegistryService {\n constructor(\n private bannersService:BannersService,\n ) {}\n\n private mapping:{ [attribute:string]:BoardActionService } = {};\n\n public add(attribute:string, service:BoardActionService):void {\n this.mapping[attribute] = service;\n }\n\n public available():ITileViewEntry[] {\n return _.map(this.mapping, (service:BoardActionService, attribute:string) => ({\n attribute,\n text: service.localizedName,\n icon: '',\n description: '',\n image: '',\n disabled: this.bannersService.eeShowBanners,\n }));\n }\n\n public get(attribute:string):BoardActionService {\n if (this.mapping[attribute]) {\n return this.mapping[attribute];\n }\n\n throw new Error(`No action service exists for ${attribute}`);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { Board } from 'core-app/features/boards/board/board';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3Filter } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\n\n@Injectable({ providedIn: 'root' })\nexport class BoardListsService {\n private v3 = this.pathHelper.api.v3;\n\n constructor(private readonly CurrentProject:CurrentProjectService,\n private readonly pathHelper:PathHelperService,\n private readonly apiV3Service:ApiV3Service,\n private readonly halResourceService:HalResourceService,\n private readonly toastService:ToastService,\n private readonly I18n:I18nService) {\n\n }\n\n private create(params:Object, filters:ApiV3Filter[]):Promise {\n const filterJson = JSON.stringify(filters);\n\n return this\n .apiV3Service\n .queries\n .form\n .loadWithParams(\n {\n pageSize: 0,\n filters: filterJson,\n },\n undefined,\n this.CurrentProject.identifier,\n this.buildQueryRequest(params),\n )\n .toPromise()\n .then(([form, query]) => {\n // When the permission to create public queries is missing, throw an error.\n // Otherwise private queries would be created.\n if (form.schema.public.writable) {\n return this\n .apiV3Service\n .queries\n .post(query, form)\n .toPromise();\n }\n throw new Error(this.I18n.t('js.boards.error_permission_missing'));\n });\n }\n\n /**\n * Add a free query to the board\n */\n public addFreeQuery(board:Board, queryParams:Object) {\n const filter = this.freeBoardQueryFilter();\n return this.addQuery(board, queryParams, [filter]);\n }\n\n /**\n * Add an empty query to the board\n * @param board\n * @param query\n */\n public async addQuery(board:Board, queryParams:Object, filters:ApiV3Filter[]):Promise {\n const count = board.queries.length;\n try {\n const query = await this.create(queryParams, filters);\n\n const source = {\n _type: 'GridWidget',\n identifier: 'work_package_query',\n startRow: 1,\n endRow: 2,\n startColumn: count + 1,\n endColumn: count + 2,\n options: {\n queryId: query.id,\n filters,\n },\n };\n\n const resource = this.halResourceService.createHalResourceOfClass(GridWidgetResource, source);\n board.addQuery(resource);\n } catch (e) {\n this.toastService.addError(e);\n console.error(e);\n }\n return board;\n }\n\n private buildQueryRequest(params:Object) {\n return {\n public: true,\n _links: {\n sortBy: [\n { href: `${this.v3.apiV3Base}/queries/sort_bys/manualSorting-asc` },\n { href: `${this.v3.apiV3Base}/queries/sort_bys/id-asc` },\n ],\n },\n ...params,\n };\n }\n\n private freeBoardQueryFilter():ApiV3Filter {\n return { manualSort: { operator: 'ow', values: [] } };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BoardListsService } from 'core-app/features/boards/board/board-list/board-lists.service';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { Board, BoardType } from 'core-app/features/boards/board/board';\nimport { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { BoardActionsRegistryService } from 'core-app/features/boards/board/board-actions/board-actions-registry.service';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\nexport interface CreateBoardParams {\n type:BoardType;\n boardName?:string;\n attribute?:string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class BoardService {\n public currentBoard$:BehaviorSubject = new BehaviorSubject(null);\n\n private loadAllPromise:Promise|undefined;\n\n private text = {\n unnamed_board: this.I18n.t('js.boards.label_unnamed_board'),\n action_board: (attr:string) => this.I18n.t('js.boards.board_type.action_by_attribute',\n { attribute: this.I18n.t(`js.boards.board_type.action_type.${attr}`) }),\n unnamed_list: this.I18n.t('js.boards.label_unnamed_list'),\n };\n\n constructor(protected apiV3Service:ApiV3Service,\n protected PathHelper:PathHelperService,\n protected CurrentProject:CurrentProjectService,\n protected halResourceService:HalResourceService,\n protected boardActions:BoardActionsRegistryService,\n protected I18n:I18nService,\n protected boardsList:BoardListsService) {\n }\n\n /**\n * Return all boards in the current scope of the project\n *\n * @param projectIdentifier\n */\n public loadAllBoards(projectIdentifier:string|null = this.CurrentProject.identifier, force = false) {\n if (!(force || this.loadAllPromise === undefined)) {\n return this.loadAllPromise;\n }\n\n return this.loadAllPromise = this\n .apiV3Service\n .boards\n .allInScope(projectIdentifier!)\n .toPromise();\n }\n\n /**\n * Check whether the current user can manage board-type grids.\n */\n public canManage(board:Board):boolean {\n return !!board.grid.$links.delete;\n }\n\n /**\n * Save the changes to the board\n */\n public save(board:Board):Observable {\n this.reorderWidgets(board);\n return this\n .apiV3Service\n .boards\n .id(board)\n .save(board);\n }\n\n /**\n * Create a new board\n * @param name\n */\n public async create(params:CreateBoardParams):Promise {\n const board = await this\n .apiV3Service\n .boards\n .create(params.type, this.boardName(params), this.CurrentProject.identifier!, params.attribute).toPromise();\n\n if (params.type === 'free') {\n await this.boardsList.addFreeQuery(board, { name: this.text.unnamed_list });\n } else {\n await this.boardActions.get(params.attribute!).addInitialColumnsForAction(board);\n }\n\n await this.save(board).toPromise();\n\n return board;\n }\n\n public delete(board:Board):Promise {\n return this\n .apiV3Service\n .boards\n .id(board)\n .delete()\n .toPromise();\n }\n\n /**\n * Build a default board name\n */\n private boardName(params:CreateBoardParams) {\n if (params.boardName) {\n return params.boardName;\n }\n\n if (params.type === 'action') {\n return this.text.action_board(params.attribute!);\n }\n\n return this.text.unnamed_board;\n }\n\n /**\n * Reorders the widgets to correspond to the available columns\n * @param board\n */\n private reorderWidgets(board:Board) {\n board.grid.columnCount = Math.max(board.grid.widgets.length, 1);\n board.grid.widgets.map((el:GridWidgetResource, index:number) => {\n el.startColumn = index + 1;\n el.endColumn = index + 2;\n return el;\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\n\n/**\n * The service is intended to store all the updates caused to a query by a user.\n * It is e.g. used to not update the board list when the current user moved a card within a list/query.\n */\n\n@Injectable()\nexport class CausedUpdatesService {\n /** contains all the updates to the query caused by modifications of the user */\n private causedUpdates:string[] = [];\n\n public includes(query:QueryResource) {\n return this.causedUpdates.includes(this.cacheValue(query));\n }\n\n public add(query:QueryResource) {\n if (this.causedUpdates.length > 100) {\n this.causedUpdates.splice(0, 90);\n }\n\n this.causedUpdates.push(this.cacheValue(query));\n }\n\n private cacheValue(query:QueryResource) {\n return query.updatedAt + query.href;\n }\n}\n","
\n \n \n
\n {{ tile.text }}\n

\n
\n \n
\n","import {\n ChangeDetectionStrategy, Component, EventEmitter, Input, Output,\n} from '@angular/core';\n\nexport interface ITileViewEntry {\n text:string;\n attribute:string;\n icon:string;\n description:string;\n image:string;\n disabled?:boolean;\n}\n\n@Component({\n selector: 'tile-view',\n styleUrls: ['./tile-view.component.sass'],\n templateUrl: './tile-view.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TileViewComponent {\n @Input() public tiles:ITileViewEntry[];\n\n @Input() public disable = false;\n\n @Output() public create = new EventEmitter();\n\n public created(attribute:string) {\n this.create.emit(attribute);\n }\n}\n","\n
{{text.board_type}}
\n\n
\n\n
\n \n \n

\n

\n
\n \n \n
\n
\n\n
\n
\n \n {{ text.cancel_button }}\n \n
\n
\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectorRef,\n Component,\n ElementRef,\n Inject,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { BoardType } from 'core-app/features/boards/board/board';\nimport { StateService } from '@uirouter/core';\nimport { BoardService } from 'core-app/features/boards/board/board.service';\nimport { BoardActionsRegistryService } from 'core-app/features/boards/board/board-actions/board-actions-registry.service';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { imagePath } from 'core-app/shared/helpers/images/path-helper';\nimport { ITileViewEntry } from '../tile-view/tile-view.component';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { enterpriseDocsUrl } from 'core-app/core/setup/globals/constants.const';\n\n@Component({\n templateUrl: './new-board-modal.html',\n})\nexport class NewBoardModalComponent extends OpModalComponent implements OnInit {\n @ViewChild('actionAttributeSelect', { static: true }) actionAttributeSelect:ElementRef;\n\n public showClose = true;\n\n public confirmed = false;\n\n public available = this.boardActions.available();\n\n public inFlight = false;\n\n public eeShowBanners = false;\n\n public text = {\n close_popup: this.I18n.t('js.close_popup_title'),\n\n free_board: this.I18n.t('js.boards.board_type.free'),\n free_board_text: this.I18n.t('js.boards.board_type.free_text'),\n free_board_title: this.I18n.t('js.boards.board_type.board_type_title.basic'),\n board_type: this.I18n.t('js.boards.board_type.text'),\n\n action_board: this.I18n.t('js.boards.board_type.action'),\n action_board_text: this.I18n.t('js.boards.board_type.action_text'),\n select_attribute: this.I18n.t('js.boards.board_type.select_attribute'),\n select_board_type: this.I18n.t('js.boards.board_type.select_board_type'),\n placeholder: this.I18n.t('js.placeholders.selection'),\n\n teaser_text: this.I18n.t('js.boards.upsale.teaser_text'),\n upgrade_to_ee_text: this.I18n.t('js.boards.upsale.upgrade'),\n more_info_ee_link: enterpriseDocsUrl.boards,\n cancel_button: this.I18n.t('js.button_cancel'),\n };\n\n constructor(\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly elementRef:ElementRef,\n readonly cdRef:ChangeDetectorRef,\n readonly state:StateService,\n readonly boardService:BoardService,\n readonly boardActions:BoardActionsRegistryService,\n readonly halNotification:HalResourceNotificationService,\n readonly loadingIndicatorService:LoadingIndicatorService,\n readonly I18n:I18nService,\n readonly boardActionRegistry:BoardActionsRegistryService,\n readonly bannersService:BannersService,\n readonly toastService:ToastService,\n ) {\n super(locals, cdRef, elementRef);\n this.initiateTiles();\n }\n\n ngOnInit():void {\n super.ngOnInit();\n this.eeShowBanners = this.bannersService.eeShowBanners;\n }\n\n public createBoard(attribute:string):void {\n if (attribute === 'basic') {\n this.createFree();\n } else {\n this.createAction(attribute);\n }\n }\n\n private initiateTiles() {\n this.available.unshift({\n attribute: 'basic',\n text: this.text.free_board_title,\n icon: 'icon-boards',\n description: this.text.free_board_text,\n image: imagePath('board_creation_modal/lists.svg'),\n });\n this.addIcon(this.available);\n this.addDescription(this.available);\n this.addText(this.available);\n this.addImage(this.available);\n }\n\n private createFree() {\n this.create({ type: 'free' });\n }\n\n private createAction(attribute:string):void {\n if (this.eeShowBanners) {\n this.toastService.addError(this.I18n.t('js.upsale.ee_only'));\n return;\n }\n\n this.create({ type: 'action', attribute });\n }\n\n private create(params:{ type:BoardType, attribute?:string }) {\n this.inFlight = true;\n\n this.loadingIndicatorService.modal.promise = this.boardService\n .create(params)\n .then((board) => {\n this.inFlight = false;\n this.closeMe();\n this.state.go('boards.partitioned.show', { board_id: board.id, isNew: true });\n })\n .catch((error:unknown) => {\n this.inFlight = false;\n this.halNotification.handleRawError(error);\n });\n }\n\n private addDescription(tiles:ITileViewEntry[]) {\n tiles.forEach((element) => {\n if (element.attribute !== 'basic') {\n const service = this.boardActionRegistry.get(element.attribute);\n element.description = service.description;\n }\n });\n }\n\n private addIcon(tiles:ITileViewEntry[]) {\n tiles.forEach((element) => {\n if (element.attribute !== 'basic') {\n const service = this.boardActionRegistry.get(element.attribute);\n element.icon = service.icon;\n }\n });\n }\n\n private addText(tiles:ITileViewEntry[]) {\n tiles.forEach((element) => {\n if (element.attribute !== 'basic') {\n const service = this.boardActionRegistry.get(element.attribute);\n element.text = service.text;\n }\n });\n }\n\n private addImage(tiles:ITileViewEntry[]) {\n tiles.forEach((element) => {\n if (element.attribute !== 'basic') {\n const service = this.boardActionRegistry.get(element.attribute);\n element.image = service.image;\n }\n });\n }\n}\n","import {\n ElementRef,\n Injectable,\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\n\n@Injectable()\nexport class OpCalendarService extends UntilDestroyedMixin {\n resize$ = new Subject();\n\n resizeObs:ResizeObserver;\n\n constructor(\n readonly weekdayService:WeekdayService,\n ) {\n super();\n }\n\n resizeObserver(v:ElementRef|undefined):void {\n if (!v) {\n return;\n }\n\n if (!this.resizeObs) {\n this.resizeObs = new ResizeObserver(() => this.resize$.next());\n }\n\n this.resizeObs.observe(v.nativeElement);\n }\n\n applyNonWorkingDay({ date }:{ date?:Date }):string[] {\n if (date && this.weekdayService.isNonWorkingDay(date)) {\n return ['fc-non-working-day'];\n }\n\n return [];\n }\n}\n","import {\n Injectable,\n Injector,\n} from '@angular/core';\nimport {\n CalendarOptions,\n DatesSetArg,\n DayCellContentArg,\n DayCellMountArg,\n DayHeaderContentArg,\n EventApi,\n EventDropArg,\n SlotLabelContentArg,\n SlotLaneContentArg,\n} from '@fullcalendar/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { splitViewRoute } from 'core-app/features/work-packages/routing/split-view-routes.helper';\nimport { StateService } from '@uirouter/angular';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { Observable } from 'rxjs';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { take } from 'rxjs/operators';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport {\n QueryPropsFilter,\n UrlParamsHelperService,\n} from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { UIRouterGlobals } from '@uirouter/core';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { WorkPackagesListChecksumService } from 'core-app/features/work-packages/components/wp-list/wp-list-checksum.service';\nimport {\n EventReceiveArg,\n EventResizeDoneArg,\n} from '@fullcalendar/interaction';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\nimport * as moment from 'moment';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { isClickedWithModifier } from 'core-app/shared/helpers/link-handling/link-handling';\nimport { uiStateLinkClass } from 'core-app/features/work-packages/components/wp-fast-table/builders/ui-state-link-builder';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { WorkPackageViewContextMenu } from 'core-app/shared/components/op-context-menu/wp-context-menu/wp-view-context-menu.directive';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { OpCalendarService } from 'core-app/features/calendar/op-calendar.service';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\n\nexport interface CalendarViewEvent {\n el:HTMLElement;\n event:EventApi;\n}\n\n// The CalenderOptions typings are missing daygrid hooks\ninterface CalendarOptionsWithDayGrid extends CalendarOptions {\n dayGridClassNames:(data:DayCellMountArg) => void;\n}\n\n@Injectable()\nexport class OpWorkPackagesCalendarService extends UntilDestroyedMixin {\n static MAX_DISPLAYED = 100;\n\n tooManyResultsText:string|null;\n\n currentWorkPackages$:Observable = this\n .querySpace\n .results\n .values$()\n .pipe(\n take(1),\n );\n\n constructor(\n private I18n:I18nService,\n private configuration:ConfigurationService,\n private sanitizer:DomSanitizer,\n private $state:StateService,\n readonly injector:Injector,\n readonly schemaCache:SchemaCacheService,\n readonly toastService:ToastService,\n readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly wpListService:WorkPackagesListService,\n readonly wpListChecksumService:WorkPackagesListChecksumService,\n readonly urlParamsHelper:UrlParamsHelperService,\n readonly querySpace:IsolatedQuerySpace,\n readonly apiV3Service:ApiV3Service,\n readonly halResourceService:HalResourceService,\n readonly uiRouterGlobals:UIRouterGlobals,\n readonly timezoneService:TimezoneService,\n readonly halEditing:HalResourceEditingService,\n readonly wpTableSelection:WorkPackageViewSelectionService,\n readonly contextMenuService:OPContextMenuService,\n readonly calendarService:OpCalendarService,\n readonly weekdayService:WeekdayService,\n ) {\n super();\n }\n\n workPackagesListener$(callbackFn:() => void):void {\n this\n .querySpace\n .results\n .values$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n callbackFn();\n });\n }\n\n calendarOptions(additionalOptions:CalendarOptions):CalendarOptions {\n return { ...this.defaultOptions(), ...additionalOptions };\n }\n\n eventDate(workPackage:WorkPackageResource, type:'start'|'due'):string {\n if (this.isMilestone(workPackage)) {\n return workPackage.date;\n }\n return workPackage[`${type}Date`] as string;\n }\n\n isMilestone(workPackage:WorkPackageResource):boolean {\n return this.schemaCache.of(workPackage).isMilestone as boolean;\n }\n\n warnOnTooManyResults(collection:WorkPackageCollectionResource, isStatic = false):void {\n if (collection.count < collection.total) {\n this.tooManyResultsText = this.I18n.t('js.calendar.too_many',\n {\n count: collection.total,\n max: OpWorkPackagesCalendarService.MAX_DISPLAYED,\n });\n } else {\n this.tooManyResultsText = null;\n }\n\n if (this.tooManyResultsText && !isStatic) {\n this.toastService.addNotice(this.tooManyResultsText);\n }\n }\n\n async updateTimeframe(\n fetchInfo:{ start:Date, end:Date, timeZone:string },\n projectIdentifier:string|undefined,\n ):Promise {\n if (this.areFiltersEmpty && this.querySpace.query.value) {\n // nothing to do\n return Promise.resolve();\n }\n\n const startDate = moment(fetchInfo.start).format('YYYY-MM-DD');\n const endDate = moment(fetchInfo.end).format('YYYY-MM-DD');\n\n let queryId:string|null = null;\n if (this.urlParams.query_id) {\n queryId = this.urlParams.query_id as string;\n }\n\n // We derive the necessary props in the following cases\n // 1. We load a queryId with no props\n // 2. We load visible query props or empty\n // 3. We are already loaded and are refetching data (for changed dates, e.g.)\n let queryProps:string|undefined;\n\n if (this.initializingWithQuery) {\n // This is the case on initially loading the calendar with a query_id present in the url params but no\n // query props to overwrite the query settings.\n // We want to always use the currently displayed time interval to be filtered for\n // so we need to adapt any eventually existing dateInterval filter to have that time interval. If no\n // such filter exists yet, we need to add it to the existing filter set.\n // In order to do both, we first need to fetch the query as we cannot signal\n // to the backend yet to only add this one filter but leave the rest unchanged.\n const initialQuery = await this\n .apiV3Service\n .queries\n .find({ pageSize: 0 }, queryId)\n .toPromise();\n\n queryProps = this.generateQueryProps(\n initialQuery,\n startDate,\n endDate,\n );\n } else if (this.initializingWithQueryProps) {\n // This is the case on initially loading the calendar with query_props present in the url params.\n // There might also be a query_id but the settings persisted in it are overwritten by the props.\n if (this.urlParams.query_props) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const oldQueryProps:{ [key:string]:unknown } = JSON.parse(this.urlParams.query_props);\n\n // Update the date period of the calendar in the filter\n const newQueryProps = {\n ...oldQueryProps,\n f: [\n ...(oldQueryProps.f as QueryPropsFilter[]).filter((filter:QueryPropsFilter) => filter.n !== 'datesInterval'),\n OpWorkPackagesCalendarService.dateFilter(startDate, endDate),\n ],\n };\n\n queryProps = JSON.stringify(newQueryProps);\n } else {\n queryProps = OpWorkPackagesCalendarService.defaultQueryProps(startDate, endDate);\n }\n } else {\n queryProps = this.generateQueryProps(\n this.querySpace.query.value as QueryResource,\n startDate,\n endDate,\n );\n\n // There are no query props, ensure that they are not being shown the next load\n this.wpListChecksumService.set(queryId, queryProps);\n }\n\n return this\n .wpListService\n .fromQueryParams({ query_id: queryId, query_props: queryProps }, projectIdentifier || undefined)\n .toPromise();\n }\n\n public generateQueryProps(\n query:QueryResource,\n startDate:string,\n endDate:string,\n ):string {\n return this.urlParamsHelper.encodeQueryJsonParams(\n query,\n (props) => ({\n ...props,\n pp: OpWorkPackagesCalendarService.MAX_DISPLAYED,\n pa: 1,\n f: [\n ...props.f.filter((filter) => filter.n !== 'datesInterval'),\n OpWorkPackagesCalendarService.dateFilter(startDate, endDate),\n ],\n }),\n );\n }\n\n public get initialView():string|undefined {\n return this.urlParams.cview as string|undefined;\n }\n\n dateEditable(wp:WorkPackageResource):boolean {\n const schema = this.schemaCache.of(wp);\n const schemaEditable = schema.isAttributeEditable('startDate') && schema.isAttributeEditable('dueDate');\n return (wp.isLeaf || wp.scheduleManually) && schemaEditable;\n }\n\n eventDurationEditable(wp:WorkPackageResource):boolean {\n return this.dateEditable(wp) && !this.isMilestone(wp);\n }\n\n /**\n * The end date from fullcalendar is open, which means it targets\n * the next day instead of current day 23:59:59.\n * @param end A string representation of the end date\n */\n public getEndDateFromTimestamp(end:string):string {\n return moment(end).subtract(1, 'd').format('YYYY-MM-DD');\n }\n\n public openSplitView(id:string, onlyWhenOpen = false):void {\n this.wpTableSelection.setSelection(id, -1);\n\n // Only open the split view if already open, otherwise only clicking the details opens\n if (onlyWhenOpen && !this.$state.includes('**.details.*')) {\n return;\n }\n\n void this.$state.go(\n `${splitViewRoute(this.$state)}.tabs`,\n { workPackageId: id, tabIdentifier: 'overview' },\n );\n }\n\n public openFullView(id:string):void {\n this.wpTableSelection.setSelection(id, -1);\n\n void this.$state.go(\n 'work-packages.show',\n { workPackageId: id },\n );\n }\n\n public onCardClicked({ workPackageId, event }:{ workPackageId:string, event:MouseEvent }):void {\n if (isClickedWithModifier(event)) {\n return;\n }\n\n this.openSplitView(workPackageId, true);\n }\n\n public onCardDblClicked({ workPackageId, event }:{ workPackageId:string, event:MouseEvent }):void {\n if (isClickedWithModifier(event)) {\n return;\n }\n\n this.openFullView(workPackageId);\n }\n\n public showEventContextMenu({ workPackageId, event }:{ workPackageId:string, event:MouseEvent }):void {\n if (isClickedWithModifier(event)) {\n return;\n }\n\n // We want to keep the original context menu on hrefs\n // (currently, this is only the id)\n if ((event.target as HTMLElement).closest(`.${uiStateLinkClass}`)) {\n debugLog('Allowing original context menu on state link');\n return;\n }\n\n // Set the selection to single\n this.wpTableSelection.setSelection(workPackageId, -1);\n\n event.preventDefault();\n\n const handler = new WorkPackageViewContextMenu(this.injector, workPackageId, jQuery(event.target as HTMLElement));\n this.contextMenuService.show(handler, event);\n }\n\n private defaultOptions():CalendarOptionsWithDayGrid {\n return {\n editable: false,\n locale: this.I18n.locale,\n fixedWeekCount: false,\n firstDay: this.configuration.startOfWeek(),\n timeZone: this.configuration.isTimezoneSet() ? this.configuration.timezone() : 'local',\n height: 'auto',\n headerToolbar: {\n left: 'prev,next today',\n center: 'title',\n right: '',\n },\n initialDate: this.initialDate,\n initialView: this.initialView,\n datesSet: (dates) => this.updateDateParam(dates),\n dayHeaderClassNames: (data:DayHeaderContentArg) => this.calendarService.applyNonWorkingDay(data),\n dayCellClassNames: (data:DayCellContentArg) => this.calendarService.applyNonWorkingDay(data),\n dayGridClassNames: (data:DayCellContentArg) => this.calendarService.applyNonWorkingDay(data),\n slotLaneClassNames: (data:SlotLaneContentArg) => this.calendarService.applyNonWorkingDay(data),\n slotLabelClassNames: (data:SlotLabelContentArg) => this.calendarService.applyNonWorkingDay(data),\n };\n }\n\n private static defaultQueryProps(startDate:string, endDate:string) {\n const props = {\n c: ['id'],\n t:\n 'id:asc',\n f: [\n { n: 'status', o: '*', v: [] },\n this.dateFilter(startDate, endDate),\n ],\n dr: 'cards',\n hi: false,\n pp: OpWorkPackagesCalendarService.MAX_DISPLAYED,\n pa: 1,\n };\n\n return JSON.stringify(props);\n }\n\n private static dateFilter(startDate:string, endDate:string):QueryPropsFilter {\n return { n: 'datesInterval', o: '<>d', v: [startDate, endDate] };\n }\n\n private get initializingWithQueryProps():boolean {\n // Initialise with current query props\n // If the filters are empty, they still need to be initialised (with empty props)\n return (this.areFiltersEmpty || this.urlParams.query_props) as boolean;\n }\n\n private get initializingWithQuery():boolean {\n return this.areFiltersEmpty\n && !!this.urlParams.query_id\n && !this.urlParams.query_props;\n }\n\n private get urlParams() {\n return this.uiRouterGlobals.params;\n }\n\n private get areFiltersEmpty():boolean {\n return this.wpTableFilters.isEmpty;\n }\n\n private get initialDate():string|undefined {\n const date = this.urlParams.cdate as string|undefined;\n if (date) {\n return this.timezoneService.formattedISODate(date);\n }\n\n return undefined;\n }\n\n private updateDateParam(dates:DatesSetArg) {\n void this.$state.go(\n '.',\n {\n cdate: this.timezoneService.formattedISODate(dates.view.currentStart),\n cview: dates.view.type,\n },\n {\n custom: { notify: false },\n },\n );\n }\n\n updateDates(resizeInfo:EventResizeDoneArg|EventDropArg|EventReceiveArg, dragged?:boolean):ResourceChangeset {\n const workPackage = resizeInfo.event.extendedProps.workPackage as WorkPackageResource;\n const changeset = this.halEditing.edit(workPackage);\n if (!workPackage.ignoreNonWorkingDays && workPackage.duration && dragged) {\n changeset.setValue('duration', workPackage.duration);\n } else {\n const due = moment(resizeInfo.event.endStr)\n .subtract(1, 'day')\n .format('YYYY-MM-DD');\n changeset.setValue('dueDate', due);\n }\n changeset.setValue('startDate', resizeInfo.event.startStr);\n return changeset;\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\n \n
\n
\n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ViewChild,\n} from '@angular/core';\nimport { WorkPackagesCalendarComponent } from 'core-app/features/calendar/wp-calendar/wp-calendar.component';\nimport {\n DynamicComponentDefinition,\n PartitionedQuerySpacePageComponent,\n ToolbarButtonComponentDefinition,\n ViewPartitionState,\n} from 'core-app/features/work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component';\nimport { WorkPackageFilterContainerComponent } from 'core-app/features/work-packages/components/filters/filter-container/filter-container.directive';\nimport { WorkPackageFilterButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-filter-button/wp-filter-button.component';\nimport { ZenModeButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/zen-mode-toggle-button/zen-mode-toggle-button.component';\nimport { WorkPackageSettingsButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-settings-button/wp-settings-button.component';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { QueryParamListenerService } from 'core-app/features/work-packages/components/wp-query/query-param-listener.service';\nimport { OpProjectIncludeComponent } from 'core-app/shared/components/project-include/project-include.component';\n\n@Component({\n templateUrl: '../../work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component.html',\n styleUrls: [\n '../../work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component.sass',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n QueryParamListenerService,\n ],\n})\nexport class WorkPackagesCalendarPageComponent extends PartitionedQuerySpacePageComponent {\n @ViewChild(WorkPackagesCalendarComponent, { static: true }) calendarElement:WorkPackagesCalendarComponent;\n\n text = {\n title: this.I18n.t('js.calendar.title'),\n unsaved_title: this.I18n.t('js.calendar.unsaved_title'),\n };\n\n /** Go back using back-button */\n backButtonCallback:() => void;\n\n /** Current query title to render */\n selectedTitle = this.text.unsaved_title;\n\n filterContainerDefinition:DynamicComponentDefinition = {\n component: WorkPackageFilterContainerComponent,\n };\n\n /** We need to pass the correct partition state to the view to manage the grid */\n currentPartition:ViewPartitionState = '-split';\n\n /** Show a toolbar */\n showToolbar = true;\n\n /** Toolbar is not editable */\n titleEditingEnabled = false;\n\n /** Saveable */\n showToolbarSaveButton = true;\n\n /** Toolbar is always enabled */\n toolbarDisabled = false;\n\n /** Define the buttons shown in the toolbar */\n toolbarButtonComponents:ToolbarButtonComponentDefinition[] = [\n {\n component: OpProjectIncludeComponent,\n },\n {\n component: WorkPackageFilterButtonComponent,\n },\n {\n component: ZenModeButtonComponent,\n },\n {\n component: WorkPackageSettingsButtonComponent,\n containerClasses: 'hidden-for-mobile',\n show: ():boolean => this.authorisationService.can('query', 'updateImmediately'),\n inputs: {\n hideTableOptions: true,\n },\n },\n ];\n\n /**\n * We need to set the current partition to the grid to ensure\n * either side gets expanded to full width if we're not in '-split' mode.\n *\n * @param state The current or entering state\n */\n setPartition(state:{ data:{ partition?:ViewPartitionState } }):void {\n this.currentPartition = state.data?.partition || '-split';\n }\n\n protected staticQueryName(_query:QueryResource):string {\n return this.text.unsaved_title;\n }\n\n /**\n * @protected\n */\n protected loadInitialQuery():void {\n // We never load the initial query as the calendar service does all that.\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Ng2StateDeclaration } from '@uirouter/angular';\nimport { makeSplitViewRoutes } from 'core-app/features/work-packages/routing/split-view-routes.template';\nimport { WorkPackageSplitViewComponent } from 'core-app/features/work-packages/routing/wp-split-view/wp-split-view.component';\nimport { WorkPackagesBaseComponent } from 'core-app/features/work-packages/routing/wp-base/wp--base.component';\nimport { WorkPackagesCalendarComponent } from 'core-app/features/calendar/wp-calendar/wp-calendar.component';\nimport { WorkPackagesCalendarPageComponent } from 'core-app/features/calendar/wp-calendar-page/wp-calendar-page.component';\n\nexport const CALENDAR_ROUTES:Ng2StateDeclaration[] = [\n {\n name: 'calendar',\n parent: 'optional_project',\n url: '/calendars/:query_id?&query_props&cdate&cview',\n redirectTo: 'calendar.page',\n views: {\n '!$default': { component: WorkPackagesBaseComponent },\n },\n params: {\n query_id: { type: 'opQueryId', dynamic: true },\n cdate: { type: 'string', dynamic: true },\n cview: { type: 'string', dynamic: true },\n // Use custom encoder/decoder that ensures validity of URL string\n query_props: { type: 'opQueryString' },\n },\n },\n {\n name: 'calendar.page',\n component: WorkPackagesCalendarPageComponent,\n redirectTo: 'calendar.page.show',\n data: {\n bodyClasses: 'router--calendar',\n },\n },\n {\n name: 'calendar.page.show',\n data: {\n baseRoute: 'calendar.page.show',\n },\n views: {\n 'content-left': { component: WorkPackagesCalendarComponent },\n },\n },\n ...makeSplitViewRoutes(\n 'calendar.page.show',\n undefined,\n WorkPackageSplitViewComponent,\n ),\n];\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { OPSharedModule } from 'core-app/shared/shared.module';\nimport { NgModule } from '@angular/core';\nimport { FullCalendarModule } from '@fullcalendar/angular';\nimport { WorkPackagesCalendarComponent } from 'core-app/features/calendar/wp-calendar/wp-calendar.component';\nimport { OpenprojectWorkPackagesModule } from 'core-app/features/work-packages/openproject-work-packages.module';\nimport { UIRouterModule } from '@uirouter/angular';\nimport { TimeEntryCalendarComponent } from 'core-app/features/calendar/te-calendar/te-calendar.component';\nimport { OpenprojectFieldsModule } from 'core-app/shared/components/fields/openproject-fields.module';\nimport { OpenprojectTimeEntriesModule } from 'core-app/shared/components/time_entries/openproject-time-entries.module';\nimport { WorkPackagesCalendarPageComponent } from 'core-app/features/calendar/wp-calendar-page/wp-calendar-page.component';\nimport { CALENDAR_ROUTES } from 'core-app/features/calendar/calendar.routes';\nimport { CalendarSidemenuComponent } from './sidemenu/calendar-sidemenu.component';\n\n@NgModule({\n imports: [\n // Commons\n OPSharedModule,\n\n // Routes for /calendar\n UIRouterModule.forChild({ states: CALENDAR_ROUTES }),\n\n // Work Package module\n OpenprojectWorkPackagesModule,\n\n // Time entry module\n OpenprojectTimeEntriesModule,\n\n // Editable fields e.g. for modals\n OpenprojectFieldsModule,\n\n // Calendar component\n FullCalendarModule,\n ],\n declarations: [\n // Work package calendars\n WorkPackagesCalendarPageComponent,\n WorkPackagesCalendarComponent,\n TimeEntryCalendarComponent,\n CalendarSidemenuComponent,\n ],\n exports: [\n WorkPackagesCalendarComponent,\n TimeEntryCalendarComponent,\n ],\n})\nexport class OpenprojectCalendarModule {\n}\n","
\n \n \n \n
\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport {\n CalendarOptions,\n DateSelectArg,\n EventDropArg,\n EventInput,\n} from '@fullcalendar/core';\nimport { EventClickArg, FullCalendarComponent, ToolbarInput } from '@fullcalendar/angular';\nimport dayGridPlugin from '@fullcalendar/daygrid';\nimport * as moment from 'moment';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\nimport { States } from 'core-app/core/states/states.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport {\n WorkPackageViewFiltersService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { StateService } from '@uirouter/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport interactionPlugin, { EventDragStartArg, EventDragStopArg, EventResizeDoneArg } from '@fullcalendar/interaction';\nimport {\n HalResourceEditingService,\n} from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { splitViewRoute } from 'core-app/features/work-packages/routing/split-view-routes.helper';\nimport {\n CalendarViewEvent,\n OpWorkPackagesCalendarService,\n} from 'core-app/features/calendar/op-work-packages-calendar.service';\nimport { OpCalendarService } from 'core-app/features/calendar/op-calendar.service';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\n\n@Component({\n templateUrl: './wp-calendar.template.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./wp-calendar.sass'],\n selector: 'op-wp-calendar',\n providers: [\n OpWorkPackagesCalendarService,\n OpCalendarService,\n ],\n})\nexport class WorkPackagesCalendarComponent extends UntilDestroyedMixin implements OnInit {\n @ViewChild(FullCalendarComponent) ucCalendar:FullCalendarComponent;\n\n @ViewChild('ucCalendar', { read: ElementRef })\n set ucCalendarElement(v:ElementRef|undefined) {\n this.calendar.resizeObserver(v);\n }\n\n @Input() static = false;\n\n calendarOptions$ = new Subject();\n\n private alreadyLoaded = false;\n\n text = {\n cannot_drag_to_non_working_day: this.I18n.t('js.team_planner.cannot_drag_to_non_working_day'),\n };\n\n constructor(\n readonly states:States,\n readonly $state:StateService,\n readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly wpListService:WorkPackagesListService,\n readonly querySpace:IsolatedQuerySpace,\n readonly schemaCache:SchemaCacheService,\n private element:ElementRef,\n readonly i18n:I18nService,\n readonly toastService:ToastService,\n private sanitizer:DomSanitizer,\n private I18n:I18nService,\n private configuration:ConfigurationService,\n readonly calendar:OpCalendarService,\n readonly workPackagesCalendar:OpWorkPackagesCalendarService,\n readonly currentProject:CurrentProjectService,\n readonly halEditing:HalResourceEditingService,\n readonly halNotification:HalResourceNotificationService,\n readonly weekdayService:WeekdayService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.wpTableFilters.hidden.push(\n 'project',\n );\n this.calendar.resize$\n .pipe(\n this.untilDestroyed(),\n debounceTime(50),\n )\n .subscribe(() => {\n this.ucCalendar.getApi().updateSize();\n });\n\n // Clear any old subscribers\n this.querySpace.stopAllSubscriptions.next();\n\n this.setupWorkPackagesListener();\n this.initializeCalendar();\n }\n\n public calendarEventsFunction(fetchInfo:{ start:Date, end:Date, timeZone:string },\n successCallback:(events:EventInput[]) => void):void|PromiseLike {\n if (this.alreadyLoaded) {\n this.alreadyLoaded = false;\n const events = this.updateResults(this.querySpace.results.value!);\n successCallback(events);\n } else {\n this\n .workPackagesCalendar\n .currentWorkPackages$\n .subscribe((collection:WorkPackageCollectionResource) => {\n const events = this.updateResults((collection));\n successCallback(events);\n });\n }\n\n void this.workPackagesCalendar.updateTimeframe(fetchInfo, this.currentProject.identifier || undefined);\n }\n\n // eslint-disable-next-line @angular-eslint/use-lifecycle-interface\n ngOnDestroy():void {\n super.ngOnDestroy();\n this.calendar.resizeObs?.disconnect();\n }\n\n private initializeCalendar() {\n const additionalOptions:{ [key:string]:unknown } = {\n height: '100%',\n headerToolbar: this.buildHeader(),\n eventSources: [\n {\n id: 'work_packages',\n events: this.calendarEventsFunction.bind(this) as unknown,\n },\n {\n events: [],\n id: 'background',\n color: 'red',\n background: 'red',\n textColor: 'white',\n display: 'background',\n editable: false,\n },\n ],\n plugins: [\n dayGridPlugin,\n interactionPlugin,\n ],\n // DnD configuration\n selectable: true,\n select: this.handleDateClicked.bind(this) as unknown,\n eventResizableFromStart: true,\n editable: true,\n eventDidMount: (evt:CalendarViewEvent) => {\n const { el, event } = evt;\n if (event.source?.id === 'background') {\n return;\n }\n const workPackage = event.extendedProps.workPackage as WorkPackageResource;\n el.dataset.workPackageId = workPackage.id as string;\n },\n eventResize: (resizeInfo:EventResizeDoneArg) => {\n const due = moment(resizeInfo.event.endStr).subtract(1, 'day').toDate();\n const start = moment(resizeInfo.event.startStr).toDate();\n const wp = resizeInfo.event.extendedProps.workPackage as WorkPackageResource;\n if (!wp.ignoreNonWorkingDays && (this.weekdayService.isNonWorkingDay(start) || this.weekdayService.isNonWorkingDay(due))) {\n this.toastService.addError(this.text.cannot_drag_to_non_working_day);\n resizeInfo?.revert();\n return;\n }\n void this.updateEvent(resizeInfo, false);\n },\n eventDrop: (dropInfo:EventDropArg) => {\n const start = moment(dropInfo.event.startStr).toDate();\n const wp = dropInfo.event.extendedProps.workPackage as WorkPackageResource;\n if (!wp.ignoreNonWorkingDays && this.weekdayService.isNonWorkingDay(start)) {\n this.toastService.addError(this.text.cannot_drag_to_non_working_day);\n dropInfo?.revert();\n return;\n }\n void this.updateEvent(dropInfo, true);\n },\n eventResizeStart: (resizeInfo:EventResizeDoneArg) => {\n const wp = resizeInfo.event.extendedProps.workPackage as WorkPackageResource;\n if (!wp.ignoreNonWorkingDays) {\n this.addBackgroundEventsForNonWorkingDays();\n }\n },\n eventResizeStop: () => this.removeBackGroundEvents(),\n eventDragStart: (dragInfo:EventDragStartArg) => {\n const wp = dragInfo.event.extendedProps.workPackage as WorkPackageResource;\n if (!wp.ignoreNonWorkingDays) {\n this.addBackgroundEventsForNonWorkingDays();\n }\n },\n eventDragStop: (dragInfo:EventDragStopArg) => {\n const { el } = dragInfo;\n el.style.removeProperty('pointer-events');\n this.removeBackGroundEvents();\n },\n eventClick: (evt:EventClickArg) => {\n const workPackageId = (evt.event.extendedProps.workPackage as WorkPackageResource).id as string;\n // Currently the calendar widget is shown on multiple pages,\n // but only the calendar module itself is a partitioned query space which can deal with a split screen request\n if (this.$state.includes('calendar')) {\n this.workPackagesCalendar.openSplitView(workPackageId);\n } else {\n void this.$state.go(\n 'work-packages.show',\n { workPackageId },\n );\n }\n },\n };\n\n if (this.static) {\n additionalOptions.initialView = 'dayGridWeek';\n }\n\n void Promise.all([\n this.configuration.initialized,\n this.weekdayService.loadWeekdays().toPromise(),\n ])\n .then(() => {\n this.calendarOptions$.next(\n this.workPackagesCalendar.calendarOptions(additionalOptions),\n );\n });\n }\n\n public buildHeader():false|ToolbarInput|undefined {\n if (this.static) {\n return false;\n }\n return {\n right: 'dayGridMonth,dayGridWeek',\n center: 'title',\n left: 'prev,next today',\n };\n }\n\n public openContextMenu(event:MouseEvent):void {\n const eventContainer = (event.target as HTMLElement).closest('.fc-event') as HTMLElement|undefined;\n if (!eventContainer) {\n return;\n }\n\n const workPackageId = eventContainer.dataset.workPackageId as string;\n this.workPackagesCalendar.showEventContextMenu({ workPackageId, event });\n }\n\n private setupWorkPackagesListener():void {\n this.workPackagesCalendar.workPackagesListener$(() => {\n this.alreadyLoaded = true;\n this.ucCalendar.getApi().refetchEvents();\n });\n }\n\n private updateResults(collection:WorkPackageCollectionResource) {\n this.workPackagesCalendar.warnOnTooManyResults(collection, this.static);\n return this.mapToCalendarEvents(collection.elements);\n }\n\n private mapToCalendarEvents(workPackages:WorkPackageResource[]) {\n return workPackages.map((workPackage:WorkPackageResource) => {\n const startDate = this.workPackagesCalendar.eventDate(workPackage, 'start');\n const endDate = this.workPackagesCalendar.eventDate(workPackage, 'due');\n\n const exclusiveEnd = moment(endDate).add(1, 'days').format('YYYY-MM-DD');\n\n return {\n title: workPackage.subject,\n start: startDate,\n editable: this.workPackagesCalendar.eventDurationEditable(workPackage),\n end: exclusiveEnd,\n allDay: true,\n className: `__hl_background_type_${workPackage.type.id || ''}`,\n workPackage,\n };\n });\n }\n\n private async updateEvent(info:EventResizeDoneArg|EventDropArg, dragged:boolean):Promise {\n const changeset = this.workPackagesCalendar.updateDates(info, dragged);\n\n try {\n const result = await this.halEditing.save(changeset);\n this.halNotification.showSave(result.resource, result.wasNew);\n } catch (e) {\n this.halNotification.handleRawError(e, changeset.projectedResource);\n info.revert();\n }\n }\n\n private handleDateClicked(info:DateSelectArg) {\n const due = moment(info.endStr).subtract(1, 'day').toDate();\n const nonWorkingDays = this.weekdayService.isNonWorkingDay(info.start) || this.weekdayService.isNonWorkingDay(due);\n\n const defaults = {\n startDate: info.startStr,\n dueDate: this.workPackagesCalendar.getEndDateFromTimestamp(info.endStr),\n ignoreNonWorkingDays: nonWorkingDays,\n };\n\n void this.$state.go(\n splitViewRoute(this.$state, 'new'),\n {\n defaults,\n tabIdentifier: 'overview',\n },\n );\n }\n\n private removeBackGroundEvents() {\n this\n .ucCalendar\n .getApi()\n .getEvents()\n .filter((el) => el.source?.id === 'background')\n .forEach((el) => el.remove());\n }\n\n private addBackgroundEventsForNonWorkingDays() {\n const api = this.ucCalendar.getApi();\n let currentStartDate = this.ucCalendar.getApi().view.activeStart;\n const currentEndDate = this.ucCalendar.getApi().view.activeEnd;\n const nonWorkingDays = new Array<{ start:Date|string, end:Date|string }>();\n\n while (currentStartDate.toString() !== currentEndDate.toString()) {\n if (this.weekdayService.isNonWorkingDay(currentStartDate)) {\n nonWorkingDays.push({\n start: moment(currentStartDate).format('YYYY-MM-DD'),\n end: moment(currentStartDate).add('1', 'day').format('YYYY-MM-DD'),\n });\n }\n currentStartDate = moment(currentStartDate).add('1', 'day').toDate();\n }\n nonWorkingDays.forEach((day) => {\n api.addEvent({ ...day }, 'background');\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\nexport class EEActiveTrialBase extends UntilDestroyedMixin {\n public text = {\n label_email: this.I18n.t('js.label_email'),\n label_expires_at: this.I18n.t('js.admin.enterprise.trial.form.label_expires_at'),\n label_maximum_users: this.I18n.t('js.admin.enterprise.trial.form.label_maximum_users'),\n label_company: this.I18n.t('js.admin.enterprise.trial.form.label_company'),\n label_domain: this.I18n.t('js.admin.enterprise.trial.form.label_domain'),\n label_starts_at: this.I18n.t('js.admin.enterprise.trial.form.label_starts_at'),\n label_subscriber: this.I18n.t('js.admin.enterprise.trial.form.label_subscriber'),\n text_expired: this.I18n.t('js.admin.enterprise.text_expired'),\n text_reprieve_days_left: (days:number) => this.I18n.t('js.admin.enterprise.text_reprieve_days_left', { days }),\n };\n\n constructor(readonly I18n:I18nService) {\n super();\n }\n}\n","export interface LocalizedLinkMap {\n [key:string]:string;\n\n en:string;\n}\n\n/**\n * Return the matching link for the current locale\n *\n * @param map A hash of locale => URL to use\n */\nexport function localizeLink(map:LocalizedLinkMap) {\n const { locale } = I18n;\n\n return map[locale] || map.en;\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
\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n} from '@angular/core';\nimport {\n FormBuilder,\n Validators,\n} from '@angular/forms';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { EnterpriseTrialService } from 'core-app/features/enterprise/enterprise-trial.service';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { localizeLink } from 'core-app/shared/helpers/i18n/localized-link';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { IEnterpriseData } from 'core-app/features/enterprise/enterprise-trial.model';\n\nconst newsletterURL = 'https://www.openproject.org/newsletter/';\n\n@Component({\n selector: 'enterprise-trial-form',\n templateUrl: './ee-trial-form.component.html',\n styleUrls: ['./ee-trial-form.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EETrialFormComponent {\n // Retain used values\n userData:Partial = this.eeTrialService.current.data || {};\n\n // The current request host\n requestHost = window.location.host;\n\n // The configured host name\n configuredHost = this.configurationService.hostName;\n\n trialForm = this.formBuilder.group({\n company: [this.userData.company, Validators.required],\n first_name: [this.userData.first_name, Validators.required],\n last_name: [this.userData.last_name, Validators.required],\n email: ['', [Validators.required, Validators.email]],\n domain: [this.userData.domain || this.configuredHost, Validators.required],\n general_consent: [null, Validators.required],\n newsletter_consent: null,\n language: this.currentUserService.language,\n });\n\n public text = {\n general_consent: this.I18n.t('js.admin.enterprise.trial.form.general_consent', {\n link_terms: localizeLink({\n en: 'https://www.openproject.org/terms-of-service/',\n de: 'https://www.openproject.org/de/nutzungsbedingungen/',\n }),\n link_privacy: localizeLink({\n en: 'https://www.openproject.org/data-privacy-and-security/',\n de: 'https://www.openproject.org/de/datenschutz/',\n }),\n }),\n label_test_ee: this.I18n.t('js.admin.enterprise.trial.form.test_ee'),\n label_company: this.I18n.t('js.admin.enterprise.trial.form.label_company'),\n label_first_name: this.I18n.t('js.admin.enterprise.trial.form.label_first_name'),\n label_last_name: this.I18n.t('js.admin.enterprise.trial.form.label_last_name'),\n label_email: this.I18n.t('js.label_email'),\n label_domain: this.I18n.t('js.admin.enterprise.trial.form.label_domain'),\n domain_mismatch: this.I18n.t('js.admin.enterprise.trial.form.domain_mismatch'),\n privacy_policy: this.I18n.t('js.admin.enterprise.trial.form.privacy_policy'),\n receive_newsletter: this.I18n.t('js.admin.enterprise.trial.form.receive_newsletter', { link: newsletterURL }),\n terms_of_service: this.I18n.t('js.admin.enterprise.trial.form.terms_of_service'),\n };\n\n constructor(\n readonly elementRef:ElementRef,\n readonly I18n:I18nService,\n readonly formBuilder:FormBuilder,\n readonly currentUserService:CurrentUserService,\n readonly configurationService:ConfigurationService,\n readonly eeTrialService:EnterpriseTrialService,\n ) {\n }\n\n // checks if mail is valid after input field was edited by the user\n // displays message for user\n public checkMailField():void {\n const data = this.trialForm.value as IEnterpriseData;\n if (data.email !== '' && this.trialForm.controls.email.errors) {\n this.eeTrialService.store.update({ emailInvalid: true });\n } else {\n this.eeTrialService.store.update({ emailInvalid: false, error: undefined });\n }\n }\n}\n","
\n
\n\n
\n\n
\n \n
\n \n
\n \n
\n \n
\n \n
\n
\n
\n {{ text.quick_overview }}\n
\n
\n \n
\n
\n
\n
\n\n \n
\n
\n \n \n
\n \n
\n \n \n
\n
\n
\n
\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Inject,\n Input,\n ViewChild,\n} from '@angular/core';\nimport {\n DomSanitizer,\n SafeResourceUrl,\n} from '@angular/platform-browser';\nimport {\n FormControl,\n FormGroup,\n} from '@angular/forms';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { EETrialFormComponent } from 'core-app/features/enterprise/enterprise-modal/enterprise-trial-form/ee-trial-form.component';\nimport { EnterpriseTrialService } from 'core-app/features/enterprise/enterprise-trial.service';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nexport const eeOnboardingVideoURL = 'https://www.youtube.com/embed/zLMSydhFSkw?autoplay=1';\n\n@Component({\n selector: 'enterprise-trial-modal',\n templateUrl: './enterprise-trial.modal.html',\n styleUrls: ['./enterprise-trial.modal.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EnterpriseTrialModalComponent extends OpModalComponent implements AfterViewInit {\n @ViewChild(EETrialFormComponent, { static: false }) formComponent:EETrialFormComponent;\n\n @Input() public opReferrer:string;\n\n public trialForm:FormGroup;\n\n public trustedEEVideoURL:SafeResourceUrl;\n\n public text = {\n button_submit: this.I18n.t('js.modals.button_submit'),\n button_cancel: this.I18n.t('js.modals.button_cancel'),\n button_continue: this.I18n.t('js.button_continue'),\n close_popup: this.I18n.t('js.close_popup_title'),\n heading_confirmation: this.I18n.t('js.admin.enterprise.trial.confirmation'),\n heading_next_steps: this.I18n.t('js.admin.enterprise.trial.next_steps'),\n heading_test_ee: this.I18n.t('js.admin.enterprise.trial.test_ee'),\n quick_overview: this.I18n.t('js.admin.enterprise.trial.quick_overview'),\n };\n\n headerText$:Observable = this\n .eeTrialService\n .observe$\n .pipe(\n map(({ status }) => {\n if (status === 'mailSubmitted') {\n return this.text.heading_confirmation;\n }\n\n if (status === 'startTrial') {\n return this.text.heading_next_steps;\n }\n\n return this.text.heading_test_ee;\n }),\n );\n\n showState$ = this\n .eeTrialService\n .observe$\n .pipe(\n map(({ status, cancelled }) => {\n if (!status || cancelled) {\n return 'trial-form';\n }\n if (status === 'mailSubmitted' && !cancelled) {\n return 'trial-waiting';\n }\n\n return 'overview';\n }),\n );\n\n constructor(readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n readonly domSanitizer:DomSanitizer,\n public eeTrialService:EnterpriseTrialService) {\n super(locals, cdRef, elementRef);\n this.trustedEEVideoURL = this.trustedURL(eeOnboardingVideoURL);\n }\n\n ngAfterViewInit():void {\n this.trialForm = this.formComponent.trialForm;\n }\n\n // checks if form is valid and submits it\n public onSubmit():void {\n if (this.trialForm.valid) {\n this.trialForm.addControl('_type', new FormControl('enterprise-trial'));\n void this.eeTrialService.sendForm(this.trialForm);\n }\n }\n\n public startEnterpriseTrial():void {\n // open onboarding modal screen\n this.eeTrialService.setStartTrialStatus();\n }\n\n public closeModal(event:Event):void {\n this.closeMe(event);\n\n const { status, confirmed } = this.eeTrialService.current;\n // refresh page to show enterprise trial\n if (status === 'startTrial' || confirmed) {\n window.location.reload();\n } else if (status === 'mailSubmitted') {\n window.location.reload();\n return;\n }\n\n this.eeTrialService.store.update({ modalOpen: false });\n }\n\n public trustedURL(url:string):SafeResourceUrl {\n return this.domSanitizer.bypassSecurityTrustResourceUrl(url);\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
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n \n \n
\n
\n
\n
\n
","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectorRef,\n Component,\n ElementRef,\n OnInit,\n} from '@angular/core';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { EnterpriseTrialService } from 'core-app/features/enterprise/enterprise-trial.service';\nimport {\n HttpClient,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport { EEActiveTrialBase } from 'core-app/features/enterprise/enterprise-active-trial/ee-active-trial.base';\nimport { GonService } from 'core-app/core/gon/gon.service';\nimport { EXTERNAL_REQUEST_HEADER } from 'core-app/features/hal/http/openproject-header-interceptor';\nimport { IEnterpriseData } from 'core-app/features/enterprise/enterprise-trial.model';\n\n@Component({\n selector: 'enterprise-active-trial',\n templateUrl: './ee-active-trial.component.html',\n styleUrls: ['./ee-active-trial.component.sass'],\n})\nexport class EEActiveTrialComponent extends EEActiveTrialBase implements OnInit {\n public subscriber:string;\n\n public email:string;\n\n public company:string;\n\n public domain:string;\n\n public userCount:string;\n\n public startsAt:string;\n\n public expiresAt:string;\n\n constructor(readonly elementRef:ElementRef,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n readonly http:HttpClient,\n readonly Gon:GonService,\n public eeTrialService:EnterpriseTrialService) {\n super(I18n);\n }\n\n ngOnInit() {\n if (!this.subscriber) {\n void this.eeTrialService.userData$\n .pipe(\n distinctUntilChanged(),\n this.untilDestroyed(),\n )\n .subscribe((data:IEnterpriseData) => {\n this.formatUserData(data);\n this.cdRef.detectChanges();\n });\n\n this.initialize();\n }\n }\n\n private initialize():void {\n const eeTrialKey = this.Gon.get('ee_trial_key') as { value:string }|undefined;\n const { data } = this.eeTrialService.current;\n\n if (eeTrialKey && !data) {\n // after reload: get data from Augur using the trial key saved in gon\n const trialLink = `${this.eeTrialService.baseUrlAugur}/public/v1/trials/${eeTrialKey.value}`;\n this.eeTrialService.store.update({ trialLink });\n this.getUserDataFromAugur(trialLink);\n }\n }\n\n // use the trial key saved in the db\n // to get the user data from Augur\n private getUserDataFromAugur(trialLink:string) {\n this\n .http\n .get(\n `${trialLink}/details`,\n {\n headers: {\n [EXTERNAL_REQUEST_HEADER]: 'true',\n },\n },\n )\n .toPromise()\n .then((data:IEnterpriseData) => {\n this.eeTrialService.store.update({ data });\n this.eeTrialService.retryConfirmation();\n })\n .catch(() => {\n // Check whether the mail has been confirmed by now\n this.eeTrialService.getToken();\n });\n }\n\n private formatUserData(userForm:IEnterpriseData) {\n this.subscriber = `${userForm.first_name} ${userForm.last_name}`;\n this.email = userForm.email;\n this.company = userForm.company;\n this.domain = userForm.domain;\n }\n}\n","\n \n\n

{{ text.confirmation_info(created, email) }}

\n

\n {{ text.status_label }} \n \n {{ text.status_waiting }}\n\n \n \n {{ text.resend }}\n \n {{ text.session_timeout }}\n\n \n {{ text.status_confirmed }}\n \n \n

\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component,\n ElementRef,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { EnterpriseTrialService } from 'core-app/features/enterprise/enterprise-trial.service';\nimport { HttpClient } from '@angular/common/http';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { EXTERNAL_REQUEST_HEADER } from 'core-app/features/hal/http/openproject-header-interceptor';\nimport { IEnterpriseData } from 'core-app/features/enterprise/enterprise-trial.model';\n\n@Component({\n selector: 'enterprise-trial-waiting',\n templateUrl: './ee-trial-waiting.component.html',\n styleUrls: ['./ee-trial-waiting.component.sass'],\n})\nexport class EETrialWaitingComponent implements OnInit {\n created = this.timezoneService.formattedDate(new Date().toString());\n\n email = '';\n\n public text = {\n confirmation_info: (date:string, email:string) => this.I18n.t('js.admin.enterprise.trial.confirmation_info', {\n date,\n email,\n }),\n resend: this.I18n.t('js.admin.enterprise.trial.resend_link'),\n resend_success: this.I18n.t('js.admin.enterprise.trial.resend_success'),\n resend_warning: this.I18n.t('js.admin.enterprise.trial.resend_warning'),\n session_timeout: this.I18n.t('js.admin.enterprise.trial.session_timeout'),\n status_confirmed: this.I18n.t('js.admin.enterprise.trial.status_confirmed'),\n status_label: this.I18n.t('js.admin.enterprise.trial.status_label'),\n status_waiting: this.I18n.t('js.admin.enterprise.trial.status_waiting'),\n };\n\n constructor(readonly elementRef:ElementRef,\n readonly I18n:I18nService,\n protected http:HttpClient,\n protected toastService:ToastService,\n public eeTrialService:EnterpriseTrialService,\n readonly timezoneService:TimezoneService) {\n }\n\n ngOnInit():void {\n const eeTrialKey = window.gon.ee_trial_key as { created:string }|undefined;\n if (eeTrialKey) {\n const savedDateStr = eeTrialKey.created.split(' ')[0];\n this.created = this.timezoneService.formattedDate(savedDateStr);\n }\n\n this.eeTrialService\n .userData$\n .pipe(\n distinctUntilChanged(),\n )\n .subscribe((data:IEnterpriseData) => {\n this.email = data.email;\n });\n }\n\n // resend mail if resend link has been clicked\n public resendMail():void {\n const { resendLink } = this.eeTrialService.store.getValue();\n\n if (!resendLink) {\n return;\n }\n\n this.eeTrialService.store.update({ cancelled: false });\n this.http.post(\n resendLink,\n {},\n {\n headers: {\n [EXTERNAL_REQUEST_HEADER]: 'true',\n },\n },\n )\n .toPromise()\n .then(() => {\n this.toastService.addSuccess(this.text.resend_success);\n this.eeTrialService.retryConfirmation();\n })\n .catch(() => {\n const { trialLink } = this.eeTrialService.store.getValue();\n if (trialLink) {\n // Check whether the mail has been confirmed by now\n this.eeTrialService.getToken();\n } else {\n this.toastService.addError(this.text.resend_warning);\n }\n });\n }\n}\n","import {\n Store,\n StoreConfig,\n} from '@datorama/akita';\nimport { IEnterpriseTrial } from 'core-app/features/enterprise/enterprise-trial.model';\n\nexport function createInitialState():IEnterpriseTrial {\n return {\n modalOpen: false,\n confirmed: false,\n cancelled: false,\n emailInvalid: false,\n };\n}\n\n@StoreConfig({ name: 'enterprise-trial' })\nexport class EnterpriseTrialStore extends Store {\n constructor() {\n super(createInitialState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport {\n HttpClient,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport { Query } from '@datorama/akita';\nimport {\n filter,\n map,\n shareReplay,\n} from 'rxjs/operators';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { EXTERNAL_REQUEST_HEADER } from 'core-app/features/hal/http/openproject-header-interceptor';\nimport { EnterpriseTrialStore } from 'core-app/features/enterprise/enterprise-trial.store';\nimport { GonType } from 'core-app/core/gon/gon.service';\nimport {\n EnterpriseTrialErrorHalResource,\n EnterpriseTrialHalResource,\n IEnterpriseData,\n IEnterpriseTrial,\n} from 'core-app/features/enterprise/enterprise-trial.model';\nimport isDefinedEntity from 'core-app/core/state/is-defined-entity';\n\n@Injectable()\nexport class EnterpriseTrialService {\n readonly store = new EnterpriseTrialStore();\n\n private query = new Query(this.store);\n\n confirmed$ = this.query.select('confirmed');\n\n cancelled$ = this.query.select('cancelled');\n\n status$ = this.query.select('status');\n\n observe$ = this.query.select();\n\n userData$ = this.query\n .select('data')\n .pipe(filter(isDefinedEntity));\n\n emailError$ = this\n .query\n .select()\n .pipe(\n map(({ error, emailInvalid }) => {\n if (emailInvalid) {\n return this.text.invalid_email;\n }\n\n const errorResponse = error?.error as { identifier?:string };\n if (error && errorResponse.identifier === 'user_already_created_trial') {\n return this.text.taken_email;\n }\n return null;\n }),\n shareReplay(1),\n );\n\n domainTaken$ = this\n .query\n .select()\n .pipe(\n map(({ error }) => {\n const errorResponse = error?.error as { identifier?:string };\n if (error && errorResponse.identifier === 'domain_taken') {\n return this.text.taken_domain;\n }\n return null;\n }),\n shareReplay(1),\n );\n\n public readonly baseUrlAugur:string;\n\n public readonly tokenVersion:string;\n\n public text = {\n invalid_email: this.I18n.t('js.admin.enterprise.trial.form.invalid_email'),\n taken_email: this.I18n.t('js.admin.enterprise.trial.form.taken_email'),\n taken_domain: this.I18n.t('js.admin.enterprise.trial.form.taken_domain'),\n };\n\n constructor(readonly I18n:I18nService,\n protected http:HttpClient,\n readonly pathHelper:PathHelperService,\n protected toastService:ToastService) {\n const gon = window.gon as (GonType&{ augur_url:string, token_version:string, ee_trial_key?:string });\n this.baseUrlAugur = gon.augur_url;\n this.tokenVersion = gon.token_version;\n\n if (gon.ee_trial_key) {\n this.setMailSubmittedStatus();\n }\n }\n\n // send POST request with form object\n // receive an enterprise trial link to access a token\n public sendForm(form:FormGroup):Promise {\n const request:unknown = { ...form.value, token_version: this.tokenVersion };\n return this.http\n .post(\n `${this.baseUrlAugur}/public/v1/trials`,\n request,\n {\n headers: {\n [EXTERNAL_REQUEST_HEADER]: 'true',\n },\n },\n )\n .toPromise()\n .then((enterpriseTrial:EnterpriseTrialHalResource) => {\n const trialLink = enterpriseTrial._links.self.href;\n const data = form.value as IEnterpriseData;\n\n this.store.update({\n trialLink,\n data,\n cancelled: false,\n });\n\n void this.saveTrialKey(trialLink);\n this.retryConfirmation();\n })\n .catch((error:HttpErrorResponse) => {\n // mail is invalid or user already created a trial\n if (error.status === 422 || error.status === 400) {\n this.store.update({ error });\n } else {\n const description = (error.error as { description?:string }).description;\n this.toastService.addWarning(description || I18n.t('js.error.internal'));\n }\n });\n }\n\n // get a token from the trial link if user confirmed mail\n public getToken():void {\n // 2) GET /public/v1/trials/:id\n this.http.get(\n this.store.getValue().trialLink as string,\n {\n headers: {\n [EXTERNAL_REQUEST_HEADER]: 'true',\n },\n },\n )\n .toPromise()\n .then(async (res:{ token_retrieved?:boolean, token:string }) => {\n // show confirmed status and enable continue btn\n this.store.update({ confirmed: true });\n\n // returns token if mail was confirmed\n // -> if token is new (token_retrieved: false) save token in backend\n if (!res.token_retrieved) {\n await this.saveToken(res.token);\n }\n })\n .catch((error:HttpErrorResponse) => {\n const errorResponse = error.error as EnterpriseTrialErrorHalResource;\n // returns error 422 while waiting of confirmation\n if (error.status === 422 && errorResponse.identifier === 'waiting_for_email_verification') {\n // get resend button link\n const resendLink = errorResponse._links.resend.href;\n this.store.update({ resendLink });\n\n const { status, cancelled } = this.store.getValue();\n\n // save a key for the requested trial\n if (!status || cancelled) { // only do it once\n void this.saveTrialKey(resendLink);\n }\n // open next modal window -> status waiting\n this.setMailSubmittedStatus();\n this.store.update({ confirmed: false });\n } else if (errorResponse?.message) {\n this.toastService.addError(errorResponse.message);\n } else {\n this.toastService.addError(error.error || I18n.t('js.error.internal'));\n }\n });\n }\n\n // save a part of the resend link in db\n // which allows to remember if a user has already requested a trial token\n // and to ask for the corresponding user data saved in Augur\n private saveTrialKey(resendlink:string):Promise {\n // extract token from resend link\n const trialKey = resendlink.split('/')[6];\n return this.http.post(\n `${this.pathHelper.appBasePath}/admin/enterprise/save_trial_key`,\n { trial_key: trialKey },\n { withCredentials: true },\n )\n .toPromise()\n .catch((e:HttpErrorResponse) => {\n const errorResponse = e.error as EnterpriseTrialErrorHalResource;\n this.toastService.addError(errorResponse.message || e.message || e);\n });\n }\n\n // save received token in controller\n private saveToken(token:string) {\n return this.http.post(\n `${this.pathHelper.appBasePath}/admin/enterprise`,\n { enterprise_token: { encoded_token: token } },\n { withCredentials: true },\n )\n .toPromise()\n .then(() => {\n const { modalOpen } = this.store.getValue();\n // load page if mail was confirmed and modal window is not open\n if (!modalOpen) {\n setTimeout(() => { // display confirmed status before reloading\n window.location.reload();\n }, 500);\n }\n })\n .catch((error:HttpErrorResponse) => {\n // Delete the trial key as the token could not be saved and thus something is wrong with the token.\n // Without this deletion, we run into an endless loop of an confirmed mail, but no saved token.\n void this.http\n .delete(\n `${this.pathHelper.api.v3.apiV3Base}/admin/enterprise/delete_trial_key`,\n { withCredentials: true },\n )\n .toPromise();\n\n const errorResponse = error.error as EnterpriseTrialErrorHalResource;\n this.toastService.addError(errorResponse.description || I18n.t('js.error.internal'));\n });\n }\n\n // retry request while waiting for mail confirmation\n public retryConfirmation(delay = 5000, retries = 60):void {\n const { cancelled, confirmed } = this.store.getValue();\n\n if (cancelled || confirmed) {\n // no need to retry\n return;\n }\n\n if (retries === 0) {\n this.store.update({ cancelled: true });\n } else {\n this.getToken();\n setTimeout(() => {\n this.retryConfirmation(delay, retries - 1);\n }, delay);\n }\n }\n\n public setStartTrialStatus():void {\n this.store.update({ status: 'startTrial' });\n }\n\n public setMailSubmittedStatus():void {\n this.store.update({ status: 'mailSubmitted' });\n }\n\n public get current():IEnterpriseTrial {\n return this.store.getValue();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Injector,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { EnterpriseTrialModalComponent } from 'core-app/features/enterprise/enterprise-modal/enterprise-trial.modal';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { EnterpriseTrialService } from 'core-app/features/enterprise/enterprise-trial.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { HttpClient } from '@angular/common/http';\nimport { GonService } from 'core-app/core/gon/gon.service';\nimport { IEnterpriseData } from 'core-app/features/enterprise/enterprise-trial.model';\n\nexport const freeTrialButtonSelector = 'free-trial-button';\n\nexport interface EETrialKey {\n created:string;\n value:string;\n}\n@Component({\n selector: freeTrialButtonSelector,\n templateUrl: './free-trial-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FreeTrialButtonComponent implements OnInit {\n created = this.timezoneService.formattedDate(new Date().toString());\n\n email = '';\n\n public text = {\n button_trial: this.I18n.t('js.admin.enterprise.upsale.button_start_trial'),\n confirmation_info: (date:string, email:string):string => this.I18n.t('js.admin.enterprise.trial.confirmation_info', {\n date,\n email,\n }),\n };\n\n constructor(protected I18n:I18nService,\n protected opModalService:OpModalService,\n readonly injector:Injector,\n readonly http:HttpClient,\n readonly cdRef:ChangeDetectorRef,\n readonly Gon:GonService,\n public eeTrialService:EnterpriseTrialService,\n readonly timezoneService:TimezoneService) {\n }\n\n ngOnInit():void {\n this.eeTrialService\n .userData$\n .pipe(\n distinctUntilChanged(),\n )\n .subscribe((userForm:IEnterpriseData) => {\n this.email = userForm.email;\n this.cdRef.detectChanges();\n });\n\n this.initialize();\n }\n\n private initialize():void {\n const eeTrialKey = this.Gon.get('ee_trial_key') as EETrialKey;\n if (eeTrialKey) {\n const savedDateStr = eeTrialKey.created.split(' ')[0];\n this.created = this.timezoneService.formattedDate(savedDateStr);\n\n const { data } = this.eeTrialService.store.getValue();\n if (data) {\n // after reload: get data from Augur using the trial key saved in gon\n const trialLink = `${this.eeTrialService.baseUrlAugur}/public/v1/trials/${eeTrialKey.value}`;\n this.eeTrialService.store.update({ trialLink });\n this.getUserDataFromAugur(trialLink);\n }\n }\n }\n\n private getUserDataFromAugur(trialLink:string):void {\n this.http\n .get(`${trialLink}/details`)\n .toPromise()\n .then((data:IEnterpriseData) => {\n this.eeTrialService.store.update({ data });\n this.eeTrialService.retryConfirmation();\n })\n .catch(() => {\n // Check whether the mail has been confirmed by now\n this.eeTrialService.getToken();\n });\n }\n\n public openTrialModal():void {\n // cancel request and open first modal window\n this.eeTrialService.store.update({ cancelled: true, modalOpen: true });\n this.opModalService.show(EnterpriseTrialModalComponent, this.injector);\n }\n\n public get trialRequested():boolean {\n const eeTrialKey = this.Gon.get('ee_trial_key') as EETrialKey|undefined;\n return !!eeTrialKey;\n }\n}\n","\n \n {{ text.button_trial }}\n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { HTTPSupportedMethods } from 'core-app/features/hal/http/http.interfaces';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\n\nexport interface HalLinkInterface {\n href:string|null;\n method:HTTPSupportedMethods;\n title?:string;\n templated?:boolean;\n payload?:any;\n type?:string;\n identifier?:string;\n}\n\nexport interface HalLinkSource {\n href:string|null;\n title:string;\n}\n\nexport interface CallableHalLink extends HalLinkInterface {\n $link:this;\n data?:Promise;\n}\n\nexport class HalLink implements HalLinkInterface {\n constructor(public requestMethod:(method:HTTPSupportedMethods, href:string, data:any, headers:any) => Promise,\n public href:string|null = null,\n public title:string = '',\n public method:HTTPSupportedMethods = 'get',\n public templated:boolean = false,\n public payload?:any,\n public type:string = 'application/json',\n public identifier?:string) {\n }\n\n /**\n * Create the HalLink from an object with the HalLinkInterface.\n */\n public static fromObject(halResourceService:HalResourceService, link:HalLinkInterface):HalLink {\n return new HalLink(\n (method:HTTPSupportedMethods, href:string, data:any, headers:any) => halResourceService.request(method, href, data, headers).toPromise(),\n link.href,\n link.title,\n link.method,\n link.templated,\n link.payload,\n link.type,\n link.identifier,\n );\n }\n\n /**\n * Fetch the resource.\n */\n public $fetch(...params:any[]):Promise {\n const [data, headers] = params;\n return this.requestMethod(this.method, this.href as string, data, headers);\n }\n\n /**\n * Prepare the templated link and return a CallableHalLink with the templated parameters set\n *\n * @returns {CallableHalLink}\n */\n public $prepare(templateValues:{ [templateKey:string]:string }) {\n if (!this.templated) {\n throw new Error(`The link ${this.href} is not templated.`);\n }\n\n let href = _.clone(this.href) || '';\n _.each(templateValues, (value:string, key:string) => {\n const regexp = new RegExp(`{${key}}`);\n href = href.replace(regexp, value);\n });\n\n return new HalLink(\n this.requestMethod,\n href,\n this.title,\n this.method,\n false,\n this.payload,\n this.type,\n this.identifier,\n ).$callable();\n }\n\n /**\n * Return a function that fetches the resource.\n *\n * @returns {CallableHalLink}\n */\n public $callable():CallableHalLink {\n const linkFunc:any = (...params:any[]) => this.$fetch(...params);\n\n _.extend(linkFunc, {\n $link: this,\n href: this.href,\n title: this.title,\n method: this.method,\n templated: this.templated,\n payload: this.payload,\n type: this.type,\n identifier: this.identifier,\n });\n\n return linkFunc;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport namespace OpenprojectHalModuleHelpers {\n export function lazy(obj:HalResource,\n property:string,\n getter:{ ():any },\n setter?:{ (value:any):void }):void {\n if (_.isObject(obj)) {\n let done = false;\n let value:any;\n const config:any = {\n get() {\n if (!done) {\n value = getter();\n done = true;\n }\n return value;\n },\n set: ():void => undefined,\n\n configurable: true,\n enumerable: true,\n };\n\n if (setter) {\n config.set = (val:any) => {\n value = setter(val);\n done = true;\n };\n }\n\n Object.defineProperty(obj, property, config);\n }\n }\n}\n","import * as ObservableArray from 'observable-array';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { HalLink } from 'core-app/features/hal/hal-link/hal-link';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { OpenprojectHalModuleHelpers } from 'core-app/features/hal/helpers/lazy-accessor';\n\ninterface HalSource {\n _links:any;\n _embedded:any;\n _type?:string;\n type?:any;\n}\n\nexport function cloneHalResourceCollection(values:T[]|undefined):T[] {\n if (_.isNil(values)) {\n return [];\n }\n return values.map((v) => v.$copy());\n}\n\nexport function cloneHalResource(value:T|undefined):T|undefined {\n if (_.isNil(value)) {\n return value;\n }\n return value.$copy();\n}\n\nexport function initializeHalProperties(halResourceService:HalResourceService, halResource:T) {\n setSource();\n setupLinks();\n setupEmbedded();\n proxyProperties();\n setLinksAsProperties();\n setEmbeddedAsProperties();\n\n function setSource() {\n if (!halResource.$source._links) {\n halResource.$source._links = {};\n }\n\n if (!halResource.$source._links.self) {\n halResource.$source._links.self = { href: null };\n }\n }\n\n function asHalResource(value?:HalSource, loaded = true):HalResource|HalSource|undefined|null {\n if (_.isNil(value)) {\n return value;\n }\n\n if (value._links || value._embedded || value._type) {\n return halResourceService.createHalResource(value, loaded);\n }\n\n return value;\n }\n\n function proxyProperties() {\n halResource.$embeddableKeys().forEach((property:any) => {\n Object.defineProperty(halResource, property, {\n get() {\n const value = halResource.$source[property];\n return asHalResource(value, true);\n },\n\n set(value) {\n halResource.$source[property] = value;\n },\n\n enumerable: true,\n configurable: true,\n });\n });\n }\n\n function setLinksAsProperties() {\n halResource.$linkableKeys().forEach((linkName:string) => {\n OpenprojectHalModuleHelpers.lazy(halResource, linkName,\n () => {\n const link:any = halResource.$links[linkName].$link || halResource.$links[linkName];\n\n if (Array.isArray(link)) {\n const items = link.map((item) => halResourceService.createLinkedResource(halResource,\n linkName,\n item.$link));\n var property:HalResource[] = new ObservableArray(...items).on('change', () => {\n property.forEach((item) => {\n if (!item.$link) {\n property.splice(property.indexOf(item), 1);\n }\n });\n\n halResource.$source._links[linkName] = property.map((item) => item.$link);\n });\n\n return property;\n }\n\n if (link.href) {\n if (link.method !== 'get') {\n return HalLink.fromObject(halResourceService, link).$callable();\n }\n\n return halResourceService.createLinkedResource(halResource, linkName, link);\n }\n\n return null;\n },\n (val:any) => setter(val, linkName));\n });\n }\n\n function setEmbeddedAsProperties() {\n if (!halResource.$source._embedded) {\n return;\n }\n\n Object.keys(halResource.$source._embedded).forEach((name) => {\n OpenprojectHalModuleHelpers.lazy(halResource,\n name,\n () => halResource.$embedded[name],\n (val:any) => setter(val, name));\n });\n }\n\n function setupProperty(name:string, callback:(element:any) => any) {\n const instanceName = `$${name}`;\n const sourceName = `_${name}`;\n const sourceObj:any = halResource.$source[sourceName];\n\n if (_.isObject(sourceObj)) {\n Object.keys(sourceObj).forEach((propName) => {\n OpenprojectHalModuleHelpers.lazy((halResource)[instanceName],\n propName,\n () => callback((sourceObj as any)[propName]));\n });\n }\n }\n\n function setupLinks() {\n setupProperty('links',\n (link) => {\n if (Array.isArray(link)) {\n return link.map((l) => HalLink.fromObject(halResourceService, l).$callable());\n }\n return HalLink.fromObject(halResourceService, link).$callable();\n });\n }\n\n function setupEmbedded() {\n setupProperty('embedded', (element:any) => {\n if (Array.isArray(element)) {\n return element.map((source) => asHalResource(source, true));\n }\n\n if (_.isObject(element)) {\n _.each(element, (child:any, name:string) => {\n if (child && (child._embedded || child._links)) {\n OpenprojectHalModuleHelpers.lazy(element as any,\n name,\n () => asHalResource(child, true));\n }\n });\n }\n\n return asHalResource(element, true);\n });\n }\n\n function setter(val:HalResource[]|HalResource|{ href?:string }, linkName:string) {\n const isArray = Array.isArray(val);\n\n if (!val) {\n halResource.$source._links[linkName] = { href: null };\n } else if (isArray) {\n halResource.$source._links[linkName] = (val as HalResource[]).map((el:any) => ({ href: el.href }));\n } else if (val.hasOwnProperty('$link')) {\n const link = (val as HalResource).$link;\n\n if (link.href) {\n halResource.$source._links[linkName] = link;\n }\n } else if ('href' in val) {\n halResource.$source._links[linkName] = { href: val.href };\n }\n\n if (halResource.$embedded && halResource.$embedded[linkName]) {\n halResource.$embedded[linkName] = val;\n\n if (isArray) {\n halResource.$source._embedded[linkName] = (val as HalResource[]).map((el) => el.$source);\n } else {\n halResource.$source._embedded[linkName] = _.get(val, '$source', val);\n }\n }\n\n return val;\n }\n}\n","export default function idFromLink(href:string|null):string {\n const idPart = (href || '').split('/').pop()!;\n return decodeURIComponent(idPart);\n}\n","export const HAL_NEW_RESOURCE_ID = 'new';\n\nexport default function isNewResource(resource:{ id:string|null }):boolean {\n return !resource.id || resource.id === HAL_NEW_RESOURCE_ID;\n}\n","export default function isPersistedResource(resource:{ id:string|null }):boolean {\n return !!(resource.id && resource.id !== 'new');\n}\n","import {\n HttpEvent, HttpHandler, HttpInterceptor, HttpRequest,\n} from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { Injectable } from '@angular/core';\n\nexport const EXTERNAL_REQUEST_HEADER = 'X-External-Request';\n\n@Injectable()\nexport class OpenProjectHeaderInterceptor implements HttpInterceptor {\n intercept(req:HttpRequest, next:HttpHandler):Observable> {\n const withCredentials = req.headers.get(EXTERNAL_REQUEST_HEADER) !== 'true';\n\n if (withCredentials) {\n return this.handleAuthenticatedRequest(req, next);\n } else {\n return this.handleExternalRequest(req, next);\n }\n }\n\n private handleExternalRequest(req:HttpRequest, next:HttpHandler):Observable> {\n // Clone the request to add the new header\n const clonedRequest = req.clone({\n withCredentials: false,\n headers: req.headers.delete(EXTERNAL_REQUEST_HEADER),\n });\n\n return next.handle(clonedRequest);\n }\n\n private handleAuthenticatedRequest(req:HttpRequest, next:HttpHandler):Observable> {\n const csrf_token:string|undefined = jQuery('meta[name=csrf-token]').attr('content');\n\n let newHeaders = req.headers\n .set('X-Authentication-Scheme', 'Session')\n .set('X-Requested-With', 'XMLHttpRequest');\n\n if (csrf_token) {\n newHeaders = newHeaders.set('X-CSRF-TOKEN', csrf_token);\n }\n\n // Clone the request to add the new header\n const clonedRequest = req.clone({\n withCredentials: true,\n headers: newHeaders,\n });\n\n // Pass the cloned request instead of the original request to the next handle\n return next.handle(clonedRequest);\n }\n}\n","import {\n ErrorHandler,\n Injectable,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ErrorResource } from 'core-app/features/hal/resources/error-resource';\nimport { HalError } from 'core-app/features/hal/services/hal-error';\nimport { HttpErrorResponse } from '@angular/common/http';\n\ninterface RejectedPromise {\n rejection:unknown;\n}\n\n@Injectable()\nexport class HalAwareErrorHandler extends ErrorHandler {\n private text = {\n internal_error: this.I18n.t('js.error.internal'),\n };\n\n constructor(private readonly I18n:I18nService) {\n super();\n }\n\n public handleError(error:unknown):void {\n let message:string = this.text.internal_error;\n\n // Angular wraps our errors into uncaught promises if\n // no one catches the error explicitly. Unwrap the error in that case\n if ((error as RejectedPromise)?.rejection instanceof HalError) {\n this.handleError((error as RejectedPromise).rejection);\n return;\n }\n\n if (error instanceof HalError) {\n console.error('Returned HTTP HAL error resource %O', error.message);\n message = error.httpError?.status >= 500 ? `${message} ${error.message}` : error.message;\n HalAwareErrorHandler.captureError(error.httpError);\n } else if (error instanceof ErrorResource) {\n console.error('Returned error resource %O', error);\n message += ` ${error.errorMessages.join('\\n')}`;\n } else if (error instanceof HalResource) {\n console.error('Returned hal resource %O', error);\n message += `Resource returned ${error.name}`;\n } else if (error instanceof Error) {\n window.ErrorReporter.captureException(error);\n } else if (error instanceof HttpErrorResponse) {\n HalAwareErrorHandler.captureError(error);\n message = error.message;\n } else if (typeof error === 'string') {\n window.ErrorReporter.captureMessage(error);\n message = error;\n }\n\n super.handleError(message);\n }\n\n /**\n * Report any errors to sentry, if configured.\n * Sentry will filter according to their error status\n *\n * @param error\n * @private\n */\n private static captureError(error:Error|HttpErrorResponse):void {\n window.ErrorReporter.captureException(error);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { Attachable } from 'core-app/features/hal/resources/mixins/attachable-mixin';\n\nexport interface WikiPageResourceLinks {\n addAttachment(attachment:HalResource):Promise;\n}\n\nclass WikiPageBaseResource extends HalResource {\n public $links:WikiPageResourceLinks;\n\n private attachmentsBackend = false;\n}\n\nexport const WikiPageResource = Attachable(WikiPageBaseResource);\n\nexport type WikiPageResource = HalResource;\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { Attachable } from 'core-app/features/hal/resources/mixins/attachable-mixin';\n\nexport interface MeetingContentResourceLinks {\n addAttachment(attachment:HalResource):Promise;\n}\n\nclass MeetingContentBaseResource extends HalResource {\n public $links:MeetingContentResourceLinks;\n\n private attachmentsBackend = false;\n}\n\nexport const MeetingContentResource = Attachable(MeetingContentBaseResource);\n\nexport type MeetingContentResource = HalResource;\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { Attachable } from 'core-app/features/hal/resources/mixins/attachable-mixin';\n\nexport interface PostResourceLinks {\n addAttachment(attachment:HalResource):Promise;\n}\n\nclass PostBaseResource extends HalResource {\n public $links:PostResourceLinks;\n\n private attachmentsBackend = false;\n}\n\nexport const PostResource = Attachable(PostBaseResource);\n\nexport type PostResource = PostResourceLinks;\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { InputState } from 'reactivestates';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport Formattable = api.v3.Formattable;\n\nexport class TimeEntryResource extends HalResource {\n project:ProjectResource;\n\n activity:HalResource;\n\n comment:Formattable;\n\n workPackage:WorkPackageResource;\n\n spentOn:string;\n\n public get state():InputState {\n return this.states.timeEntries.get(this.id as string) as unknown as InputState;\n }\n\n /**\n * Exclude the schema _link from the linkable Resources.\n */\n public $linkableKeys():string[] {\n return _.without(super.$linkableKeys(), 'schema');\n }\n}\n\nexport interface TimeEntryResource {\n delete():Promise;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport class NewsResource extends HalResource {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { RoleResource } from 'core-app/features/hal/resources/role-resource';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport Formattable = api.v3.Formattable;\n\nexport interface MembershipResourceLinks {\n update(payload:unknown):Promise;\n updateImmediately(payload:unknown):Promise;\n delete():Promise;\n}\n\nexport interface MembershipResourceEmbedded {\n principal:HalResource;\n roles:RoleResource[];\n project:ProjectResource;\n notificationMessage:Formattable;\n}\n\nexport class MembershipResource extends HalResource {\n}\n\nexport interface MembershipResource extends MembershipResourceLinks, MembershipResourceEmbedded {}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport class GroupResource extends HalResource {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\n\nexport class RootResource extends HalResource {\n public user:UserResource;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { InputState } from 'reactivestates';\n\nexport class TypeResource extends HalResource {\n public color:string;\n\n public get state():InputState {\n return this.states.types.get(this.href as string) as any;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\nexport class QueryOperatorResource extends HalResource {\n public get id():string {\n return this.$source.id || idFromLink(this.href);\n }\n\n public set id(val:string) {\n this.$source.id = val;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ErrorResource, v3ErrorIdentifierMultipleErrors } from 'core-app/features/hal/resources/error-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\n\nexport interface FormResourceLinks {\n commit(payload:any):Promise;\n}\n\nexport interface FormResourceEmbedded {\n schema:SchemaResource;\n validationErrors:{ [attribute:string]:ErrorResource };\n}\n\nexport class FormResource extends HalResource {\n public schema:SchemaResource;\n\n public validationErrors:{ [attribute:string]:ErrorResource };\n\n public getErrors():ErrorResource|null {\n const errors = _.values(this.validationErrors);\n const count = errors.length;\n\n if (count === 0) {\n return null;\n }\n\n let resource;\n if (count === 1) {\n resource = new ErrorResource(this.injector, errors[0], true, this.halInitializer, 'Error');\n } else {\n resource = new ErrorResource(this.injector, {}, true, this.halInitializer, 'Error');\n resource.errorIdentifier = v3ErrorIdentifierMultipleErrors;\n resource.errors = errors;\n }\n resource.isValidationError = true;\n return resource;\n }\n}\n\nexport interface FormResource extends FormResourceEmbedded, FormResourceLinks {}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { Attachable } from 'core-app/features/hal/resources/mixins/attachable-mixin';\nimport { CallableHalLink } from 'core-app/features/hal/hal-link/hal-link';\n\nexport class HelpTextBaseResource extends HalResource {\n public attribute:string;\n\n public attributeCaption:string;\n\n public scope:string;\n\n public helpText:api.v3.Formattable;\n}\n\nexport const HelpTextResource = Attachable(HelpTextBaseResource);\n\nexport interface HelpTextResource extends HelpTextBaseResource {\n editText?:CallableHalLink;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { InputState } from 'reactivestates';\n\nexport class SchemaResource extends HalResource {\n public get state():InputState {\n return this.states.schemas.get(this.href as string) as any;\n }\n\n public get availableAttributes() {\n return _.keys(this.$source).filter((name) => name.indexOf('_') !== 0);\n }\n\n // Find the attribute name with a matching (localized) name;\n public attributeFromLocalizedName(name:string):string|null {\n let match:string|null = null;\n\n for (const attribute of this.availableAttributes) {\n const fieldSchema = this[attribute];\n if (fieldSchema?.name === name) {\n match = attribute;\n break;\n }\n }\n\n return match;\n }\n}\n\nexport class SchemaAttributeObject {\n public type:string;\n\n public name:string;\n\n public required:boolean;\n\n public hasDefault:boolean;\n\n public writable:boolean;\n\n public allowedValues:T[] | CollectionResource;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport class SchemaDependencyResource extends HalResource {\n public dependencies:any;\n\n public forValue(value:string):any {\n return this.dependencies[value];\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { HalLink } from 'core-app/features/hal/hal-link/hal-link';\nimport { QueryOperatorResource } from 'core-app/features/hal/resources/query-operator-resource';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { SchemaAttributeObject, SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { QueryFilterResource } from 'core-app/features/hal/resources/query-filter-resource';\nimport { SchemaDependencyResource } from 'core-app/features/hal/resources/schema-dependency-resource';\n\nexport interface QueryFilterInstanceSchemaResourceLinks {\n self:HalLink;\n filter:QueryFilterResource;\n}\n\nexport class QueryFilterInstanceSchemaResource extends SchemaResource {\n public $links:QueryFilterInstanceSchemaResourceLinks;\n\n public operator:SchemaAttributeObject;\n\n public filter:SchemaAttributeObject;\n\n public dependency:SchemaDependencyResource;\n\n public values:SchemaAttributeObject|null;\n\n public type = 'QueryFilterInstanceSchema';\n\n public get availableOperators():HalResource[] | CollectionResource {\n return this.operator.allowedValues;\n }\n\n public get allowedFilterValue():QueryFilterResource {\n if (this.filter.allowedValues instanceof CollectionResource) {\n return this.filter.allowedValues.elements[0];\n }\n\n return this.filter.allowedValues[0];\n }\n\n public $initialize(source:any) {\n super.$initialize(source);\n\n if (source._dependencies) {\n this.dependency = new SchemaDependencyResource(this.injector, source._dependencies[0], true, this.halInitializer, 'SchemaDependency');\n }\n }\n\n public getFilter():QueryFilterInstanceResource {\n const operator = (this.operator.allowedValues as HalResource[])[0];\n const filter = (this.filter.allowedValues as HalResource[])[0];\n const source:any = {\n name: filter.name,\n _links: {\n filter: filter.$source._links.self,\n schema: this.$source._links.self,\n operator: operator.$source._links.self,\n },\n };\n\n if (this.definesAllowedValues()) {\n source._links.values = [];\n } else {\n source.values = [];\n }\n\n return new QueryFilterInstanceResource(this.injector, source, true, this.halInitializer, 'QueryFilterInstance');\n }\n\n public isValueRequired():boolean {\n return !!(this.values);\n }\n\n public isResourceValue():boolean {\n return !!(this.values && this.values.allowedValues);\n }\n\n public loadedAllowedValues():boolean {\n return Array.isArray(this.values?.allowedValues);\n }\n\n public resultingSchema(operator:QueryOperatorResource):QueryFilterInstanceSchemaResource {\n const staticSchema = this.$source;\n const dependentSchema = this.dependency.forValue(operator.href!.toString());\n const resultingSchema = {};\n\n _.merge(resultingSchema, staticSchema, dependentSchema);\n\n return new QueryFilterInstanceSchemaResource(this.injector, resultingSchema, true, this.halInitializer, 'QueryFilterInstanceSchema');\n }\n\n private definesAllowedValues() {\n return _.some(this._dependencies[0].dependencies,\n (dependency:any) => dependency.values && dependency.values._links && dependency.values._links.allowedValues);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\n\nexport interface WorkPackageCollectionResourceEmbedded {\n elements:WorkPackageResource[];\n groups:GroupObject[];\n}\n\nexport class WorkPackageCollectionResource extends CollectionResource {\n public schemas:CollectionResource;\n\n public createWorkPackage:any;\n\n public elements:WorkPackageResource[];\n\n public groups:GroupObject[];\n\n public totalSums?:{ [key:string]:number };\n\n public sumsSchema?:SchemaResource;\n\n public representations:Array;\n}\n\nexport interface WorkPackageCollectionResource extends WorkPackageCollectionResourceEmbedded {}\n\n/**\n * A reference to a group object as returned from the API.\n * Augmented with state information such as collapsed state.\n */\nexport interface GroupObject {\n value:any;\n count:number;\n collapsed?:boolean;\n index:number;\n identifier:string;\n sums:{ [attribute:string]:number|null };\n href:{ href:string }[];\n _links:{\n valueLink:{ href:string }[];\n groupBy:{ href:string };\n };\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { CustomActionResource } from 'core-app/features/hal/resources/custom-action-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { WikiPageResource } from 'core-app/features/hal/resources/wiki-page-resource';\nimport { MeetingContentResource } from 'core-app/features/hal/resources/meeting-content-resource';\nimport { PostResource } from 'core-app/features/hal/resources/post-resource';\nimport { StatusResource } from 'core-app/features/hal/resources/status-resource';\nimport { AttachmentCollectionResource } from 'core-app/features/hal/resources/attachment-collection-resource';\nimport { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\nimport { GridResource } from 'core-app/features/hal/resources/grid-resource';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { NewsResource } from 'core-app/features/hal/resources/news-resource';\nimport { VersionResource } from 'core-app/features/hal/resources/version-resource';\nimport { MembershipResource } from 'core-app/features/hal/resources/membership-resource';\nimport { RoleResource } from 'core-app/features/hal/resources/role-resource';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { GroupResource } from 'core-app/features/hal/resources/group-resource';\nimport { RootResource } from 'core-app/features/hal/resources/root-resource';\nimport { TypeResource } from 'core-app/features/hal/resources/type-resource';\nimport { QueryOperatorResource } from 'core-app/features/hal/resources/query-operator-resource';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { FormResource } from 'core-app/features/hal/resources/form-resource';\nimport { HelpTextResource } from 'core-app/features/hal/resources/help-text-resource';\nimport {\n HalResourceFactoryConfigInterface,\n HalResourceService,\n} from 'core-app/features/hal/services/hal-resource.service';\nimport { QueryFilterInstanceSchemaResource } from 'core-app/features/hal/resources/query-filter-instance-schema-resource';\nimport { ErrorResource } from 'core-app/features/hal/resources/error-resource';\nimport { SchemaDependencyResource } from 'core-app/features/hal/resources/schema-dependency-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { QueryFilterResource } from 'core-app/features/hal/resources/query-filter-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\n\nconst halResourceDefaultConfig:{ [typeName:string]:HalResourceFactoryConfigInterface } = {\n WorkPackage: {\n cls: WorkPackageResource,\n attrTypes: {\n parent: 'WorkPackage',\n ancestors: 'WorkPackage',\n children: 'WorkPackage',\n relations: 'Relation',\n schema: 'Schema',\n status: 'Status',\n type: 'Type',\n },\n },\n Activity: {\n cls: HalResource,\n attrTypes: {\n user: 'User',\n },\n },\n 'Activity::Comment': {\n cls: HalResource,\n attrTypes: {\n user: 'User',\n },\n },\n 'Activity::Revision': {\n cls: HalResource,\n attrTypes: {\n user: 'User',\n },\n },\n Relation: {\n cls: RelationResource,\n attrTypes: {\n from: 'WorkPackage',\n to: 'WorkPackage',\n },\n },\n Schema: {\n cls: SchemaResource,\n },\n Type: {\n cls: TypeResource,\n },\n Status: {\n cls: StatusResource,\n },\n SchemaDependency: {\n cls: SchemaDependencyResource,\n },\n Error: {\n cls: ErrorResource,\n },\n User: {\n cls: UserResource,\n },\n Group: {\n cls: GroupResource,\n },\n Collection: {\n cls: CollectionResource,\n },\n WorkPackageCollection: {\n cls: WorkPackageCollectionResource,\n },\n AttachmentCollection: {\n cls: AttachmentCollectionResource,\n },\n Query: {\n cls: QueryResource,\n attrTypes: {\n filters: 'QueryFilterInstance',\n },\n },\n Form: {\n cls: FormResource,\n attrTypes: {\n payload: 'FormPayload',\n },\n },\n FormPayload: {\n cls: HalResource,\n attrTypes: {\n attachments: 'AttachmentsCollection',\n },\n },\n QueryFilterInstance: {\n cls: QueryFilterInstanceResource,\n attrTypes: {\n schema: 'QueryFilterInstanceSchema',\n filter: 'QueryFilter',\n operator: 'QueryOperator',\n },\n },\n QueryFilterInstanceSchema: {\n cls: QueryFilterInstanceSchemaResource,\n },\n QueryFilter: {\n cls: QueryFilterResource,\n },\n Root: {\n cls: RootResource,\n },\n QueryOperator: {\n cls: QueryOperatorResource,\n },\n HelpText: {\n cls: HelpTextResource,\n },\n CustomAction: {\n cls: CustomActionResource,\n },\n WikiPage: {\n cls: WikiPageResource,\n },\n MeetingContent: {\n cls: MeetingContentResource,\n },\n Post: {\n cls: PostResource,\n },\n Project: {\n cls: ProjectResource,\n },\n Role: {\n cls: RoleResource,\n },\n Grid: {\n cls: GridResource,\n },\n GridWidget: {\n cls: GridWidgetResource,\n },\n TimeEntry: {\n cls: TimeEntryResource,\n },\n Membership: {\n cls: MembershipResource,\n },\n News: {\n cls: NewsResource,\n },\n Version: {\n cls: VersionResource,\n },\n};\n\nexport function initializeHalResourceConfig(halResourceService:HalResourceService) {\n return () => {\n _.each(halResourceDefaultConfig, (value, key) => halResourceService.registerResource(key, value));\n };\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n APP_INITIALIZER,\n ErrorHandler,\n NgModule,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HalAwareErrorHandler } from 'core-app/features/hal/services/hal-aware-error-handler';\nimport { initializeHalResourceConfig } from 'core-app/features/hal/services/hal-resource.config';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\n\n@NgModule({\n imports: [\n CommonModule,\n ],\n providers: [\n { provide: ErrorHandler, useClass: HalAwareErrorHandler },\n {\n provide: APP_INITIALIZER, useFactory: initializeHalResourceConfig, deps: [HalResourceService], multi: true,\n },\n HalResourceNotificationService,\n ],\n})\nexport class OpenprojectHalModule { }\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\n\nexport class AttachmentCollectionResource extends CollectionResource {\n public $initialize(source:any) {\n super.$initialize(source);\n\n this.elements = this.elements || [];\n }\n}\n\nexport interface AttachmentCollectionResource {\n elements:HalResource[];\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport class CollectionResource extends HalResource {\n public elements:T[];\n\n public count:number;\n\n public total:number;\n\n public pageSize:number;\n\n public offset:number;\n\n /**\n * Update the collection's elements and return them in a promise.\n * This is useful, as angular does not recognize update made by $load.\n */\n public updateElements():Promise {\n if (this.href) {\n return this.$load().then((collection:this) => this.elements = collection.elements);\n }\n return Promise.resolve();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport interface CustomActionResourceLinks {\n self():Promise;\n executeImmediately(payload:any):Promise;\n}\n\nexport interface CustomActionResourceEmbedded {\n description:string;\n}\n\nexport class CustomActionResource extends HalResource {\n}\n\nexport interface CustomActionResource extends CustomActionResourceLinks, CustomActionResourceEmbedded {}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { HttpErrorResponse } from '@angular/common/http';\n\nexport const v3ErrorIdentifierQueryInvalid = 'urn:openproject-org:api:v3:errors:InvalidQuery';\nexport const v3ErrorIdentifierMultipleErrors = 'urn:openproject-org:api:v3:errors:MultipleErrors';\n\nexport interface IHalErrorBase {\n _type:string;\n message:string;\n errorIdentifier:string;\n}\n\nexport function isHalError(err:unknown):err is IHalErrorBase {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n const hasOwn = (key:string):boolean => Object.prototype.hasOwnProperty.call(err, key);\n return !!err && hasOwn('_type') && hasOwn('message') && hasOwn('errorIdentifier');\n}\n\nexport interface IHalSingleError extends IHalErrorBase {\n _embedded:{\n details:{\n attribute:string;\n }\n }\n}\n\nexport interface IHalMultipleError extends IHalErrorBase {\n _embedded:{\n errors:IHalSingleError[];\n }\n}\n\nexport class ErrorResource extends HalResource {\n public errors:any[];\n\n public message:string;\n\n public details:any;\n\n public errorIdentifier:string;\n\n /** We may get a reference to the underlying http error */\n public httpError?:HttpErrorResponse;\n\n public isValidationError = false;\n\n /**\n * Override toString to ensure the resource can\n * be printed nicely on console and in errors\n */\n public toString():string {\n return `[ErrorResource ${this.message}]`;\n }\n\n public get errorMessages():string[] {\n if (this.isMultiErrorMessage()) {\n return this.errors.map((error) => error.message);\n }\n\n return [this.message];\n }\n\n public isMultiErrorMessage():boolean {\n return this.errorIdentifier === v3ErrorIdentifierMultipleErrors;\n }\n\n public getInvolvedAttributes():string[] {\n let columns = [];\n\n if (this.details) {\n columns = [{ details: this.details }];\n } else if (this.errors) {\n columns = this.errors;\n }\n\n return _.flatten(columns.map((resource:ErrorResource) => {\n if (resource.errorIdentifier === v3ErrorIdentifierMultipleErrors) {\n return this.extractMultiError(resource)[0];\n }\n return resource.details.attribute;\n }));\n }\n\n public getMessagesPerAttribute():{ [attribute:string]:string[] } {\n const perAttribute:any = {};\n\n if (this.details) {\n perAttribute[this.details.attribute] = [this.message];\n } else {\n _.forEach(this.errors, (error:any) => {\n if (error.errorIdentifier === v3ErrorIdentifierMultipleErrors) {\n const [attribute, messages] = this.extractMultiError(error);\n const current = perAttribute[attribute] || [];\n perAttribute[attribute] = current.concat(messages);\n } else if (perAttribute[error.details.attribute]) {\n perAttribute[error.details.attribute].push(error.message);\n } else {\n perAttribute[error.details.attribute] = [error.message];\n }\n });\n }\n\n return perAttribute;\n }\n\n protected extractMultiError(resource:ErrorResource):[string, string[]] {\n const { attribute } = resource.errors[0].details;\n const messages = resource.errors.map((el:ErrorResource) => el.message);\n\n return [attribute, messages];\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\nimport { Attachable } from 'core-app/features/hal/resources/mixins/attachable-mixin';\n\nexport interface GridResourceLinks {\n update(payload:unknown):Promise;\n updateImmediately(payload:unknown):Promise;\n delete():Promise;\n}\n\nexport class GridBaseResource extends HalResource {\n public widgets:GridWidgetResource[];\n\n public options:{ [key:string]:unknown };\n\n public rowCount:number;\n\n public columnCount:number;\n\n public $initialize(source:any) {\n super.$initialize(source);\n\n this.widgets = this\n .widgets\n .map((widget:Object) => {\n const widgetResource = new GridWidgetResource(this.injector,\n widget,\n true,\n this.halInitializer,\n 'GridWidget');\n\n widgetResource.grid = this;\n\n return widgetResource;\n });\n }\n\n readonly attachmentsBackend = true;\n\n public async updateAttachments():Promise {\n return this.attachments.$update().then(() => {\n this.states.forResource(this)!.putValue(this);\n return this.attachments;\n });\n }\n}\n\nexport const GridResource = Attachable(GridBaseResource);\n\nexport interface GridResource extends Partial, GridBaseResource {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { GridResource } from 'core-app/features/hal/resources/grid-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\n\nexport class GridWidgetResource extends HalResource {\n @InjectField() protected halResource:HalResourceService;\n\n public identifier:string;\n\n public startRow:number;\n\n public endRow:number;\n\n public startColumn:number;\n\n public endColumn:number;\n\n public options:{ [key:string]:unknown };\n\n public get height() {\n return this.endRow - this.startRow;\n }\n\n public get width() {\n return this.endColumn - this.startColumn;\n }\n\n public grid:GridResource;\n\n public get schema():SchemaResource {\n return this.halResource.createHalResource({ _type: 'Schema' }, true);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { InputState } from 'reactivestates';\nimport { Injector } from '@angular/core';\nimport { States } from 'core-app/core/states/states.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { HalLinkInterface } from 'core-app/features/hal/hal-link/hal-link';\nimport { ICKEditorContext } from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\nexport interface HalResourceClass {\n new(injector:Injector,\n source:any,\n $loaded:boolean,\n halInitializer:(halResource:T) => void,\n $halType:string):T;\n}\n\nexport type HalSourceLink = { href:string|null, title?:string };\n\nexport type HalSourceLinks = {\n [key:string]:HalSourceLink\n};\n\nexport type HalSource = {\n [key:string]:string|number|boolean|null|HalSourceLinks,\n _links:HalSourceLinks\n};\n\nexport class HalResource {\n // TODO this is the source of many issues in the frontend\n // because it no longer properly type checks stuff\n // Since 2019-10-21 I'm documenting what bugs this caused:\n // https://community.openproject.com/wp/31462\n [attribute:string]:any;\n\n // The API type reported from API\n public _type:string;\n\n // Internal initialization time for objects\n // created in the frontend\n public __initialized_at:number;\n\n // The HalResource that this type maps to\n // This will almost always be equal to _type, however may be different for dynamic types\n // e.g., { _type: 'StatusFilterInstance', $halType: 'QueryFilterInstance' }.\n //\n // This is required for attributes to be correctly mapped according to their configuration.\n public $halType:string;\n\n @InjectField() states:States;\n\n @InjectField() I18n!:I18nService;\n\n /**\n * Constructs and initializes the HalResource. For this, the halResoureFactory is required.\n *\n * However, We can't inject the HalResourceFactory here because it itself depends on this class.\n * So if you need to initialize a HalResource, use +HalResourceFactory.createHalResource+ instead.\n *\n * @param {Injector} injector\n * @param $halType The HalResource type that this instance maps to\n * @param $source\n * @param {boolean} $loaded\n * @param {Function} initializer The initializer callback to HAL-transform all linked and embedded resources.\n *\n */\n public constructor(\n public injector:Injector,\n public $source:any,\n public $loaded:boolean,\n public halInitializer:(halResource:any) => void,\n $halType:string,\n ) {\n this.$halType = $halType;\n this.$initialize($source);\n }\n\n public static getEmptyResource(self:{ href:string|null } = { href: null }):any {\n return { _links: { self } };\n }\n\n public $links:any = {};\n\n public $embedded:any = {};\n\n public $self:Promise;\n\n public _name:string;\n\n public static matchFromLink(href:string, expectedResource:string):string|null {\n const match = new RegExp(`/api/v3/${expectedResource}/(\\\\d+)`).exec(href);\n return match && match[1];\n }\n\n public $initialize(source:any) {\n this.$source = source.$source || source;\n this.halInitializer(this);\n }\n\n /**\n * Override toString to ensure the resource can\n * be printed nicely on console and in errors\n */\n public toString() {\n if (this.href) {\n return `[HalResource href=${this.href}]`;\n }\n return `[HalResource id=${this.id}]`;\n }\n\n /**\n * Returns the ID and ensures it's a string, null.\n * Returns a string when:\n * - The embedded ID is actually set\n * - The self link is terminated by a number.\n */\n public get id():string|null {\n if (this.$source.id) {\n return this.$source.id.toString();\n }\n\n const id = idFromLink(this.href);\n if (/^\\d+$/.exec(id)) {\n return id;\n }\n\n return null;\n }\n\n public set id(val:string|null) {\n this.$source.id = val;\n }\n\n /**\n * Retain the internal tracking identifier from the given other work package.\n * This is due to us needing to identify a work package beyond its actual ID,\n * because that changes upon saving.\n *\n * @param other\n */\n public retainFrom(other:HalResource) {\n this.__initialized_at = other.__initialized_at;\n }\n\n /**\n * Create a HalResource from the copied source of the given, other HalResource.\n *\n * @param {HalResource} other\n * @returns A HalResource with the identitical copied source of other.\n */\n public $copy(source:Object = {}):T {\n const clone:HalResourceClass = this.constructor as any;\n\n return new clone(this.injector, _.merge(this.$plain(), source), this.$loaded, this.halInitializer, this.$halType);\n }\n\n public $plain():any {\n return _.cloneDeep(this.$source);\n }\n\n public get $isHal():boolean {\n return true;\n }\n\n public get $link():HalLinkInterface {\n return this.$links.self.$link;\n }\n\n public get name():string {\n return this._name || this.$link.title || '';\n }\n\n public set name(name:string) {\n this._name = name;\n }\n\n public get href():string|null {\n return this.$link.href;\n }\n\n /**\n * Return the associated state to this HAL resource, if any.\n */\n public get state():InputState|null {\n return null;\n }\n\n /**\n * Update the state\n */\n public push(newValue:this):Promise {\n if (this.state) {\n this.state.putValue(newValue);\n }\n\n return Promise.resolve();\n }\n\n public previewPath():string|undefined {\n if (isNewResource(this) && this.project) {\n return this.project.href;\n }\n\n return undefined;\n }\n\n public getEditorContext(fieldName:string):ICKEditorContext {\n return { type: 'constrained' };\n }\n\n public $load(force = false):Promise {\n if (!this.state) {\n return this.$loadResource(force);\n }\n\n const { state } = this;\n\n if (force) {\n state.clear();\n }\n\n // If nobody has asked yet for the resource to be $loaded, do it ourselves.\n // Otherwise, we risk returning a promise, that will never be resolved.\n state.putFromPromiseIfPristine(() => this.$loadResource(force));\n\n return >state.valuesPromise().then((source:any) => {\n this.$initialize(source);\n this.$loaded = true;\n return this;\n });\n }\n\n protected $loadResource(force = false):Promise {\n if (!force) {\n if (this.$loaded) {\n return Promise.resolve(this);\n }\n\n if (!this.$loaded && this.$self) {\n return this.$self;\n }\n }\n\n // Reset and load this resource\n this.$loaded = false;\n this.$self = this.$links.self({}).then((source:any) => {\n this.$loaded = true;\n this.$initialize(source.$source);\n return this;\n });\n\n return this.$self;\n }\n\n /**\n * Update the resource ignoring the cache.\n */\n public $update() {\n return this.$load(true);\n }\n\n /**\n * Specify this resource's embedded keys that should be transformed with resources.\n * Use this to restrict, e.g., links that should not be made properties if you have a custom get/setter.\n */\n public $embeddableKeys():string[] {\n const properties = Object.keys(this.$source);\n return _.without(properties, '_links', '_embedded', 'id');\n }\n\n /**\n * Specify this resource's keys that should not be transformed with resources.\n * Use this to restrict, e.g., links that should not be made properties if you have a custom get/setter.\n */\n public $linkableKeys():string[] {\n const properties = Object.keys(this.$links);\n return _.without(properties, 'self');\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { OpenProjectDirectFileUploadService } from 'core-app/core/file-upload/op-direct-file-upload.service';\nimport { OpenProjectFileUploadService, UploadFile } from 'core-app/core/file-upload/op-file-upload.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { AttachmentCollectionResource } from 'core-app/features/hal/resources/attachment-collection-resource';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\ntype Constructor = new (...args:any[]) => T;\n\nexport function Attachable>(Base:TBase) {\n return class extends Base {\n public attachments:AttachmentCollectionResource;\n\n private ToastService:ToastService;\n\n private halNotification:HalResourceNotificationService;\n\n private opFileUpload:OpenProjectFileUploadService;\n\n private opDirectFileUpload:OpenProjectDirectFileUploadService;\n\n private pathHelper:PathHelperService;\n\n private apiV3Service:ApiV3Service;\n\n private config:ConfigurationService;\n\n /**\n * Can be used in the mixed in class to disable\n * attempts to upload attachments right away.\n */\n private attachmentsBackend:boolean|null;\n\n /**\n * Return whether the user is able to upload an attachment.\n *\n * If either the `addAttachment` link is provided or the resource is being created,\n * adding attachments is allowed.\n */\n public get canAddAttachments():boolean {\n return !!this.$links.addAttachment || isNewResource(this);\n }\n\n /**\n *\n */\n public get hasAttachments():boolean {\n return _.get(this.attachments, 'elements.length', 0) > 0;\n }\n\n /**\n * Try to find an existing file's download URL given its filename\n * @param file\n */\n public lookupDownloadLocationByName(file:string):string|null {\n if (!(this.attachments && this.attachments.elements)) {\n return null;\n }\n\n const match = _.find(this.attachments.elements, (res:HalResource) => res.name === file);\n return _.get(match, 'staticDownloadLocation.href', null);\n }\n\n /**\n * Remove the given attachment either from the pending attachments or from\n * the attachment collection, if it is a resource.\n *\n * Removing it from the elements array assures that the view gets updated immediately.\n * If an error occurs, the user gets notified and the attachment is pushed to the elements.\n */\n public removeAttachment(attachment:any):Promise {\n _.pull(this.attachments.elements, attachment);\n\n if (attachment.$isHal) {\n return attachment.delete()\n .then(() => {\n if (this.attachmentsBackend) {\n this.updateAttachments();\n } else {\n this.attachments.count = Math.max(this.attachments.count - 1, 0);\n }\n })\n .catch((error:any) => {\n this.halNotification.handleRawError(error, this as any);\n this.attachments.elements.push(attachment);\n });\n }\n return Promise.resolve();\n }\n\n /**\n * Get updated attachments from the server and push the state\n *\n * Return a promise that returns the attachments. Reject, if the work package has\n * no attachments.\n */\n public updateAttachments():Promise {\n return this\n .attachments\n .updateElements()\n .then(() => {\n this.updateState();\n return this.attachments;\n });\n }\n\n /**\n * Upload the given attachments, update the resource and notify the user.\n * Return an updated AttachmentCollectionResource.\n */\n public uploadAttachments(files:UploadFile[]):Promise {\n const { uploads, finished } = this.performUpload(files);\n\n const message = I18n.t('js.label_upload_notification');\n const notification = this.ToastService.addAttachmentUpload(message, uploads);\n\n return finished\n .then((result:{ response:HalResource, uploadUrl:string }[]) => {\n setTimeout(() => this.ToastService.remove(notification), 700);\n\n this.attachments.count += result.length;\n result.forEach((r) => {\n this.attachments.elements.push(r.response);\n });\n this.updateState();\n\n return result;\n })\n .catch((error:HttpErrorResponse) => {\n let message:undefined|string;\n console.error('Error while uploading: %O', error);\n\n if (error.error instanceof ErrorEvent) {\n // A client-side or network error occurred.\n message = this.I18n.t('js.error_attachment_upload', { error });\n } else if (_.get(error, 'error._type') === 'Error') {\n message = error.error.message;\n } else {\n // The backend returned an unsuccessful response code.\n message = error.error;\n }\n\n this.halNotification.handleRawError(message);\n return message || I18n.t('js.error.internal');\n });\n }\n\n private performUpload(files:UploadFile[]) {\n let href:string = this.directUploadURL || '';\n\n if (href) {\n return this.opDirectFileUpload.uploadAndMapResponse(href, files);\n } if (isNewResource(this) || !this.id || !this.attachmentsBackend) {\n href = this.apiV3Service.attachments.path;\n } else {\n href = this.addAttachment.$link.href;\n }\n\n return this.opFileUpload.uploadAndMapResponse(href, files);\n }\n\n private get directUploadURL():string|null {\n if (this.$links.prepareAttachment) {\n return this.$links.prepareAttachment.href;\n }\n\n if (isNewResource(this)) {\n return this.config.prepareAttachmentURL;\n }\n return null;\n }\n\n private updateState() {\n if (this.state) {\n this.state.putValue(this as any);\n }\n }\n\n public $initialize(source:any) {\n if (!this.ToastService) {\n this.ToastService = this.injector.get(ToastService);\n }\n if (!this.halNotification) {\n this.halNotification = this.injector.get(HalResourceNotificationService);\n }\n if (!this.opFileUpload) {\n this.opFileUpload = this.injector.get(OpenProjectFileUploadService);\n }\n if (!this.opDirectFileUpload) {\n this.opDirectFileUpload = this.injector.get(OpenProjectDirectFileUploadService);\n }\n if (!this.config) {\n this.config = this.injector.get(ConfigurationService);\n }\n if (!this.pathHelper) {\n this.pathHelper = this.injector.get(PathHelperService);\n }\n\n if (!this.apiV3Service) {\n this.apiV3Service = this.injector.get(ApiV3Service);\n }\n\n super.$initialize(source);\n\n const attachments = this.attachments || { $source: {}, elements: [] };\n this.attachments = new AttachmentCollectionResource(\n this.injector,\n attachments,\n false,\n this.halInitializer,\n 'HalResource',\n );\n }\n };\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ICKEditorContext } from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';\n\nexport class ProjectResource extends HalResource {\n public get state() {\n return this.states.projects.get(this.id!) as any;\n }\n\n public getEditorContext(fieldName:string):ICKEditorContext {\n if (['statusExplanation', 'description'].indexOf(fieldName) !== -1) {\n return { type: 'full', macros: 'resource' };\n }\n\n return { type: 'constrained' };\n }\n\n /**\n * Exclude the schema _link from the linkable Resources.\n */\n public $linkableKeys():string[] {\n return _.without(super.$linkableKeys(), 'schema');\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { QueryOperatorResource } from 'core-app/features/hal/resources/query-operator-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { QueryFilterInstanceSchemaResource } from 'core-app/features/hal/resources/query-filter-instance-schema-resource';\nimport { QueryFilterResource } from 'core-app/features/hal/resources/query-filter-resource';\n\nexport class QueryFilterInstanceResource extends HalResource {\n public filter:QueryFilterResource;\n\n public operator:QueryOperatorResource;\n\n public values:HalResource[]|string[];\n\n private memoizedCurrentSchemas:{ [key:string]:QueryFilterInstanceSchemaResource } = {};\n\n @InjectField(SchemaCacheService) schemaCache:SchemaCacheService;\n\n @InjectField(PathHelperService) pathHelper:PathHelperService;\n\n public $initialize(source:any) {\n super.$initialize(source);\n\n this.$links.schema = {\n href: `${this.pathHelper.api.v3.apiV3Base}/queries/filter_instance_schemas/${idFromLink(this.filter.href)}`,\n };\n }\n\n public get id():string {\n return this.filter.id;\n }\n\n public get name():string {\n return this.filter.name;\n }\n\n /**\n * Get the complete current schema.\n *\n * The filter instance's schema is made up of a static and a variable part.\n * The variable part depends on the currently selected operator.\n * Therefore, the schema differs based on the selected operator.\n */\n public get currentSchema():QueryFilterInstanceSchemaResource|null {\n if (!this.operator) {\n return null;\n }\n\n const key = this.operator.href!.toString();\n\n if (this.memoizedCurrentSchemas[key] === undefined) {\n try {\n this.memoizedCurrentSchemas[key] = this.schemaCache.of(this).resultingSchema(this.operator);\n } catch (e) {\n console.error(`Failed to access filter schema${e}`);\n }\n }\n\n return this.memoizedCurrentSchemas[key];\n }\n\n public isCompletelyDefined() {\n return this.values.length || (this.currentSchema && !this.currentSchema.isValueRequired());\n }\n\n public findOperator(operatorSymbol:string):QueryOperatorResource|undefined {\n return _.find(this.schemaCache.of(this).availableOperators, (operator:QueryOperatorResource) => operator.id === operatorSymbol) as QueryOperatorResource|undefined;\n }\n\n public isTemplated() {\n let flag = false;\n (this.values as any[]).find((value:any) => {\n const href:string = value?.href || value.toString() || '';\n flag = href.includes('{id}');\n });\n return flag;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { QueryFilterInstanceSchemaResource } from 'core-app/features/hal/resources/query-filter-instance-schema-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\nexport interface QueryFilterResourceEmbedded {\n schema:QueryFilterInstanceSchemaResource;\n}\n\nexport class QueryFilterResource extends HalResource {\n public $embedded:QueryFilterResourceEmbedded;\n\n public values:any[];\n\n public get id():string {\n return this.$source.id || idFromLink(this.href);\n }\n\n public set id(newId:string) {\n this.$source.id = newId;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { HighlightingMode } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting-mode.const';\nimport { QueryOrder } from 'core-app/core/apiv3/endpoints/queries/apiv3-query-order';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { QuerySortByResource } from 'core-app/features/hal/resources/query-sort-by-resource';\nimport { QueryGroupByResource } from 'core-app/features/hal/resources/query-group-by-resource';\n\nexport interface QueryResourceEmbedded {\n results:WorkPackageCollectionResource;\n columns:QueryColumn[];\n groupBy:QueryGroupByResource|undefined;\n project:ProjectResource;\n sortBy:QuerySortByResource[];\n filters:QueryFilterInstanceResource[];\n}\n\nexport type TimelineZoomLevel = 'days'|'weeks'|'months'|'quarters'|'years'|'auto';\n\nexport interface TimelineLabels {\n left:string|null;\n right:string|null;\n farRight:string|null;\n}\n\nexport class QueryResource extends HalResource {\n public $embedded:QueryResourceEmbedded;\n\n public results:WorkPackageCollectionResource;\n\n public columns:QueryColumn[];\n\n public groupBy:QueryGroupByResource|undefined;\n\n public sortBy:QuerySortByResource[];\n\n public setSortBy(newSortBy:QuerySortByResource[]):void {\n this.sortBy = newSortBy;\n }\n\n public filters:QueryFilterInstanceResource[];\n\n public starred:boolean;\n\n public sums:boolean;\n\n public hasError:boolean;\n\n public timelineVisible:boolean;\n\n public timelineZoomLevel:TimelineZoomLevel;\n\n public highlightingMode:HighlightingMode;\n\n public highlightedAttributes:HalResource[]|undefined;\n\n public displayRepresentation:string|undefined;\n\n public timelineLabels:TimelineLabels;\n\n public showHierarchies:boolean;\n\n public public:boolean;\n\n public hidden:boolean;\n\n public project:ProjectResource;\n\n public includeSubprojects:boolean;\n\n public ordered_work_packages:QueryOrder;\n\n public $initialize(source:any) {\n super.$initialize(source);\n\n this.filters = this\n .filters\n .map((filter:unknown) => new QueryFilterInstanceResource(\n this.injector,\n filter,\n true,\n this.halInitializer,\n 'QueryFilterInstance',\n ));\n }\n}\n\nexport interface QueryResourceLinks {\n updateImmediately?(attributes:any):Promise;\n}\n\nexport interface QueryResource extends QueryResourceLinks {}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport const QUERY_SORT_BY_ASC = 'urn:openproject-org:api:v3:queries:directions:asc';\nexport const QUERY_SORT_BY_DESC = 'urn:openproject-org:api:v3:queries:directions:desc';\n\nexport interface QuerySortByResourceEmbedded {\n column:QueryColumn;\n direction:QuerySortByDirection;\n}\n\nexport class QuerySortByResource extends HalResource {\n public $embedded:QuerySortByResourceEmbedded;\n\n public column:QueryColumn;\n\n public direction:QuerySortByDirection;\n}\n\n/**\n * A direction for sorting\n */\nexport class QuerySortByDirection extends HalResource {\n public get id():string {\n return this.href!.split('/').pop()!;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\nexport interface RelationResourceLinks {\n delete():Promise;\n\n updateImmediately(payload:any):Promise;\n}\n\nexport class RelationResource extends HalResource {\n static RELATION_TYPES(includeParentChild = true):string[] {\n const types = [\n 'relates',\n 'duplicates',\n 'duplicated',\n 'blocks',\n 'blocked',\n 'precedes',\n 'follows',\n 'includes',\n 'partof',\n 'requires',\n 'required',\n ];\n\n if (includeParentChild) {\n types.push('parent', 'children');\n }\n\n return types;\n }\n\n static LOCALIZED_RELATION_TYPES(includeParentchild = true) {\n const relationTypes = RelationResource.RELATION_TYPES(includeParentchild);\n\n return relationTypes.map((key:string) => ({ name: key, label: I18n.t(`js.relation_labels.${key}`) }));\n }\n\n static DEFAULT() {\n return 'relates';\n }\n\n // Properties\n public description:string|null;\n\n public type:any;\n\n public reverseType:string;\n\n // Links\n public $links:RelationResourceLinks;\n\n public to:WorkPackageResource;\n\n public from:WorkPackageResource;\n\n public normalizedType(workPackage:WorkPackageResource) {\n return this.denormalized(workPackage).relationType;\n }\n\n /**\n * Return the denormalized relation data, seeing the relation.from to be `workPackage`.\n *\n * @param workPackage\n * @return {{id, href, relationType: string, workPackageType}}\n */\n public denormalized(workPackage:WorkPackageResource):DenormalizedRelationData {\n const target = (this.to.href === workPackage.href) ? 'from' : 'to';\n\n return {\n target: this[target],\n targetId: this[target].id!,\n relationType: target === 'from' ? this.reverseType : this.type,\n reverseRelationType: target === 'from' ? this.type : this.reverseType,\n };\n }\n\n /**\n * Return whether the given work package id is involved in this relation.\n * @param wpId\n * @return {boolean}\n */\n public isInvolved(wpId:string) {\n return _.values(this.ids).indexOf(wpId.toString()) >= 0;\n }\n\n /**\n * Get the involved IDs, returning an object to the ids.\n */\n public get ids() {\n return {\n from: idFromLink(this.from.href!),\n to: idFromLink(this.to.href!),\n };\n }\n\n public updateDescription(description:string) {\n return this.$links.updateImmediately({ description });\n }\n\n public updateType(type:any) {\n return this.$links.updateImmediately({ type });\n }\n}\n\nexport interface RelationResource extends RelationResourceLinks {}\n\nexport interface DenormalizedRelationData {\n target:WorkPackageResource;\n targetId:string;\n relationType:string;\n reverseRelationType:string;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport class RoleResource extends HalResource {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { InputState } from 'reactivestates';\n\nexport class StatusResource extends HalResource {\n isClosed:boolean;\n\n isDefault:boolean;\n\n isReadonly:boolean;\n\n public get state():InputState {\n return this.states.statuses.get(this.href as string) as any;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { InputState } from 'reactivestates';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport class UserResource extends HalResource {\n // Properties\n public login:string;\n\n public firstName:string;\n\n public lastName:string;\n\n public email:string;\n\n public avatar:string;\n\n public status:string;\n\n // Links\n public lock:HalResource;\n\n public unlock:HalResource;\n\n public delete:HalResource;\n\n public showUser:HalResource;\n\n public static get active_user_statuses() {\n return ['active', 'registered'];\n }\n\n public get state():InputState {\n return this.states.users.get(this.href as string) as any;\n }\n\n public get showUserPath() {\n return this.showUser ? this.showUser.$link.href : null;\n }\n\n public get isActive() {\n return UserResource.active_user_statuses.indexOf(this.status) >= 0;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport class VersionResource extends HalResource {\n status:string;\n\n public definingProject:HalResource;\n\n public isLocked() {\n return this.status === 'locked';\n }\n\n public isOpen() {\n return this.status === 'open';\n }\n\n public isClosed() {\n return this.status === 'closed';\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { InputState } from 'reactivestates';\nimport { WorkPackagesActivityService } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/wp-activity.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { OpenProjectFileUploadService } from 'core-app/core/file-upload/op-file-upload.service';\nimport { AttachmentCollectionResource } from 'core-app/features/hal/resources/attachment-collection-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { TypeResource } from 'core-app/features/hal/resources/type-resource';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { FormResource } from 'core-app/features/hal/resources/form-resource';\nimport { Attachable } from 'core-app/features/hal/resources/mixins/attachable-mixin';\nimport { ICKEditorContext } from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\nexport interface WorkPackageResourceEmbedded {\n activities:CollectionResource;\n ancestors:WorkPackageResource[];\n assignee:HalResource|any;\n attachments:AttachmentCollectionResource;\n fileLinks?:CollectionResource;\n author:HalResource|any;\n availableWatchers:HalResource|any;\n category:HalResource|any;\n children:WorkPackageResource[];\n parent:WorkPackageResource|null;\n priority:HalResource|any;\n project:HalResource|any;\n relations:CollectionResource;\n responsible:HalResource|any;\n revisions:CollectionResource|any;\n status:HalResource|any;\n timeEntries:HalResource[]|any[];\n type:TypeResource;\n version:HalResource|any;\n watchers:CollectionResource;\n // For regular work packages\n startDate:string;\n dueDate:string;\n // Only for milestones\n date:string;\n relatedBy:RelationResource|null;\n scheduleManually:boolean;\n}\n\nexport interface WorkPackageResourceLinks extends WorkPackageResourceEmbedded {\n addAttachment(attachment:HalResource):Promise;\n\n addChild(child:HalResource):Promise;\n\n addComment(comment:unknown, headers?:any):Promise;\n\n addRelation(relation:any):Promise|undefined;\n\n addWatcher(watcher:HalResource):Promise;\n\n changeParent(params:any):Promise;\n\n copy():Promise;\n\n delete():Promise;\n\n logTime():Promise;\n\n move():Promise;\n\n removeWatcher():Promise;\n\n self():Promise;\n\n update(payload:any):Promise>;\n\n updateImmediately(payload:any):Promise;\n\n watch():Promise;\n}\n\nexport interface WorkPackageLinksObject extends WorkPackageResourceLinks {\n schema:HalResource;\n}\n\nexport class WorkPackageBaseResource extends HalResource {\n public $embedded:WorkPackageResourceEmbedded;\n\n public $links:WorkPackageLinksObject;\n\n public subject:string;\n\n public updatedAt:Date;\n\n public lockVersion:number;\n\n public description:any;\n\n public activities:CollectionResource;\n\n public attachments:AttachmentCollectionResource;\n\n @InjectField() I18n!:I18nService;\n\n @InjectField() states:States;\n\n @InjectField() wpActivity:WorkPackagesActivityService;\n\n @InjectField() apiV3Service:ApiV3Service;\n\n @InjectField() ToastService:ToastService;\n\n @InjectField() workPackageNotificationService:WorkPackageNotificationService;\n\n @InjectField() pathHelper:PathHelperService;\n\n @InjectField() opFileUpload:OpenProjectFileUploadService;\n\n readonly attachmentsBackend = true;\n\n /**\n * Return the ids of all its ancestors, if any\n */\n public get ancestorIds():string[] {\n const { ancestors } = this as any;\n return ancestors.map((el:WorkPackageResource) => el.id!);\n }\n\n /**\n * Return \": (#)\" if type and id are known.\n */\n public subjectWithType(truncateSubject = 40):string {\n const type = this.type ? `${this.type.name}: ` : '';\n const subject = this.subjectWithId(truncateSubject);\n\n return `${type}${subject}`;\n }\n\n /**\n * Return \" (#)\" if the id is known.\n */\n public subjectWithId(truncateSubject = 40):string {\n const id = isNewResource(this) ? '' : ` (#${this.id})`;\n const subject = _.truncate(this.subject, { length: truncateSubject });\n\n return `${subject}${id}`;\n }\n\n public get isLeaf():boolean {\n const { children } = this.$links;\n return !(children && children.length > 0);\n }\n\n public previewPath() {\n if (!isNewResource(this)) {\n return this.apiV3Service.work_packages.id(this.id!).path;\n }\n return super.previewPath();\n }\n\n public getEditorContext(fieldName:string):ICKEditorContext {\n return {\n type: fieldName === 'description' ? 'full' : 'constrained',\n macros: false,\n ...(fieldName.startsWith('customField') && { disabledMentions: ['user'] }),\n };\n }\n\n public isParentOf(otherWorkPackage:WorkPackageResource) {\n return otherWorkPackage.parent?.$links.self.$link.href === this.$links.self.$link.href;\n }\n\n /**\n * Invalidate a set of linked resources of this work package.\n * And inform the cache service about the work package update.\n *\n * Return a promise that returns the linked resources as properties.\n * Return a rejected promise, if the resource is not a property of the work package.\n */\n public updateLinkedResources(...resourceNames:string[]):Promise {\n const resources:{ [id:string]:Promise } = {};\n\n resourceNames.forEach((name) => {\n const linked = this[name];\n resources[name] = linked ? linked.$update() : Promise.reject(undefined);\n });\n\n const promise = Promise.all(_.values(resources));\n promise.then(() => {\n this.wpCacheService.touch(this.id!);\n });\n\n return promise;\n }\n\n public $initialize(source:any) {\n super.$initialize(source);\n\n const attachments:any = this.attachments || { $source: {}, elements: [] };\n this.attachments = new AttachmentCollectionResource(\n this.injector,\n // Attachments MAY be an array if we're building from a form\n _.get(attachments, '$source', attachments),\n false,\n this.halInitializer,\n 'HalResource',\n );\n }\n\n /**\n * Exclude the schema _link from the linkable Resources.\n */\n public $linkableKeys():string[] {\n return _.without(super.$linkableKeys(), 'schema');\n }\n\n /**\n * Return the associated state to this HAL resource, if any.\n */\n public get state():InputState {\n return this.states.workPackages.get(this.id!) as any;\n }\n\n /**\n * Update the state\n */\n public push(newValue:this):Promise {\n this.wpActivity.clear(newValue.id);\n\n // If there is a parent, its view has to be updated as well\n if (newValue.parent) {\n this.apiV3Service.work_packages.id(newValue.parent).refresh();\n }\n\n return this.apiV3Service.work_packages.cache.updateWorkPackage(newValue as any);\n }\n}\n\nexport const WorkPackageResource = Attachable(WorkPackageBaseResource);\n\nexport interface WorkPackageResource extends WorkPackageBaseResource, WorkPackageResourceLinks, WorkPackageResourceEmbedded {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\n\nexport class HalPayloadHelper {\n /**\n * Extract payload from the given request with schema.\n * This will ensure we will only write writable attributes and so on.\n *\n * @param resource\n * @param schema\n */\n static extractPayload(resource:T|Object|null, schema:SchemaResource|null = null):Object {\n if (resource instanceof HalResource && schema) {\n return this.extractPayloadFromSchema(resource, schema);\n } if (resource && !(resource instanceof HalResource)) {\n return resource;\n }\n return {};\n }\n\n /**\n * Extract writable payload from a HAL resource class to be used for API calls.\n *\n * The schema contains writable information about attributes, which is what this method\n * iterates in order to build the HAL-compatible object.\n *\n * @param resource A HalResource to extract payload from\n * @param schema The associated schema to determine writable state of attributes\n */\n static extractPayloadFromSchema(resource:T, schema:SchemaResource) {\n const payload:any = {\n _links: {},\n };\n\n const nonLinkProperties = [];\n\n for (const key in schema) {\n if (schema.hasOwnProperty(key) && schema[key] && schema[key].writable) {\n if (resource.$links[key]) {\n if (Array.isArray(resource[key])) {\n payload._links[key] = _.map(resource[key], (element) => ({ href: (element as HalResource).href }));\n } else {\n payload._links[key] = {\n href: (resource[key] && resource[key].href),\n };\n }\n } else {\n nonLinkProperties.push(key);\n }\n }\n }\n\n _.each(nonLinkProperties, (property) => {\n if (resource.hasOwnProperty(property) || resource[property]) {\n if (Array.isArray(resource[property])) {\n payload[property] = _.map(resource[property], (element:any) => {\n if (element instanceof HalResource) {\n return this.extractPayloadFromSchema(element, element.currentSchema || element.schema);\n }\n return element;\n });\n } else {\n payload[property] = resource[property];\n }\n }\n });\n\n return payload;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\nexport interface ISchemaProxy extends SchemaResource {\n ofProperty(property:string):IFieldSchema;\n isAttributeEditable(property:string):boolean;\n isEditable:boolean;\n}\n\nexport class SchemaProxy implements ProxyHandler {\n constructor(protected schema:SchemaResource,\n protected resource:HalResource) {\n }\n\n static create(schema:SchemaResource, resource:HalResource) {\n return new Proxy(\n schema,\n new this(schema, resource),\n ) as ISchemaProxy;\n }\n\n get(schema:SchemaResource, property:PropertyKey, receiver:any):any {\n switch (property) {\n case 'ofProperty': {\n return this.proxyMethod(this.ofProperty);\n }\n case 'isAttributeEditable': {\n return this.proxyMethod(this.isAttributeEditable);\n }\n case 'mappedName': {\n return this.proxyMethod(this.mappedName);\n }\n case 'isEditable': {\n return this.isEditable;\n }\n default: {\n return Reflect.get(schema, property, receiver);\n }\n }\n }\n\n /**\n * Returns the part of the schema relevant for the provided property.\n *\n * We use it to support the virtual attribute 'combinedDate' which is the combination of the three\n * attributes 'startDate', 'dueDate' and 'scheduleManually'. That combination exists only in the front end\n * and not on the native schema. As a property needs to be writable for us to allow the user editing,\n * we need to mark the writability positively if any of the combined properties are writable.\n *\n * @param property the schema part is desired for\n */\n public ofProperty(property:string):IFieldSchema|null {\n const propertySchema = this.schema[this.mappedName(property)];\n\n if (propertySchema) {\n return { ...propertySchema, writable: this.isEditable && propertySchema && propertySchema.writable };\n }\n return null;\n }\n\n /**\n * Return whether the resource is editable with the user's permission\n * on the given resource package attribute.\n * In order to be editable, there needs to be an update link on the resource and the schema for\n * the attribute needs to indicate the writability.\n *\n * @param property\n */\n public isAttributeEditable(property:string):boolean {\n const propertySchema = this.ofProperty(property);\n\n return !!propertySchema && propertySchema.writable;\n }\n\n /**\n * Return whether the user in general has permission to edit the resource.\n * This check is required, but not sufficient to check all attribute restrictions.\n *\n * Use +isAttributeEditable(property)+ for this case.\n */\n public get isEditable() {\n return isNewResource(this.resource) || !!this.resource.$links.update;\n }\n\n public mappedName(property:string):string {\n return property;\n }\n\n private proxyMethod(method:Function) {\n const self = this;\n\n // Returning a Proxy here so that the call is bound\n // to the SchemaProxy instance.\n return new Proxy(method, {\n apply(_, __, argumentsList) {\n return method.apply(self, [argumentsList[0]]);\n },\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { SchemaProxy } from 'core-app/features/hal/schemas/schema-proxy';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { StatusResource } from 'core-app/features/hal/resources/status-resource';\n\nexport class WorkPackageSchemaProxy extends SchemaProxy {\n get(schema:SchemaResource, property:PropertyKey, receiver:any):any {\n switch (property) {\n case 'isMilestone': {\n return this.isMilestone;\n }\n case 'isReadonly': {\n return this.isReadonly;\n }\n default: {\n return super.get(schema, property, receiver);\n }\n }\n }\n\n /**\n * Returns the part of the schema relevant for the provided property.\n *\n * We use it to support the virtual attribute 'combinedDate' which is the combination of the three\n * attributes 'startDate', 'dueDate' and 'scheduleManually'. That combination exists only in the front end\n * and not on the native schema. As a property needs to be writable for us to allow the user editing,\n * we need to mark the writability positively if any of the combined properties are writable.\n *\n * @param property the schema part is desired for\n */\n public ofProperty(property:string) {\n if (property === 'combinedDate') {\n const propertySchema = super.ofProperty('startDate');\n\n if (!propertySchema) {\n return null;\n }\n\n propertySchema.writable = propertySchema.writable\n || this.isAttributeEditable('dueDate')\n || this.isAttributeEditable('scheduleManually');\n\n return propertySchema;\n }\n return super.ofProperty(property);\n }\n\n public get isReadonly():boolean {\n return (this.resource.readonly as boolean) || !!(this.resource.status as StatusResource|null)?.isReadonly;\n }\n\n /**\n * Return whether the work package is editable with the user's permission\n * on the given work package attribute.\n *\n * @param property\n */\n public isAttributeEditable(property:string):boolean {\n if (this.isReadonly && property !== 'status') {\n return false;\n } if (['startDate', 'dueDate', 'date'].includes(property)\n && this.resource.scheduleManually) {\n // This is a blatant shortcut but should be adequate.\n return super.isAttributeEditable('scheduleManually');\n }\n return super.isAttributeEditable(property);\n }\n\n public get isMilestone():boolean {\n return this.schema.hasOwnProperty('date');\n }\n\n public mappedName(property:string):string {\n if (this.isMilestone && (property === 'startDate' || property === 'dueDate')) {\n return 'date';\n }\n return property;\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { ErrorResource } from 'core-app/features/hal/resources/error-resource';\n\nexport class HalError extends Error {\n readonly name = 'HALError';\n\n get message():string {\n return this.resource?.message || this.httpError?.message || 'Unknown error';\n }\n\n get errorIdentifier():string {\n return this.resource?.errorIdentifier || 'unknown';\n }\n\n constructor(\n readonly httpError:HttpErrorResponse,\n readonly resource:ErrorResource|null,\n ) {\n super();\n Object.setPrototypeOf(this, HalError.prototype);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { buffer, debounceTime, filter } from 'rxjs/operators';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ResourceChangesetCommit } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\n\nexport interface HalEvent {\n id:string;\n eventType:string;\n resourceType:string;\n commit?:ResourceChangesetCommit;\n}\n\nexport interface HalCreatedEvent extends HalEvent {\n eventType:'created';\n}\n\nexport interface HalUpdatedEvent extends HalEvent {\n eventType:'updated';\n}\n\nexport interface RelatedWorkPackageEvent extends HalEvent {\n eventType:'association';\n relatedWorkPackage:string|null;\n relationType:string;\n}\n\nexport interface HalDeletedEvent extends HalEvent {\n eventType:'deleted';\n}\n\nexport type HalEventTypes =\n HalCreatedEvent|HalUpdatedEvent|RelatedWorkPackageEvent|HalDeletedEvent;\n\n@Injectable({ providedIn: 'root' })\nexport class HalEventsService {\n private _events = new Subject();\n\n /** Entire event stream */\n public events$ = this._events.asObservable();\n\n /** Aggregated events */\n public aggregated$(resourceType:string, debounceTimeInMs = 500):Observable {\n return this\n .events$\n .pipe(\n filter((event:HalEvent) => event.resourceType === resourceType),\n buffer(this.events$.pipe(debounceTime(debounceTimeInMs))),\n );\n }\n\n public push(resourceReference:HalResource|{ id:string, _type:string }, event:Partial) {\n event.id = resourceReference.id!;\n event.resourceType = resourceReference._type!;\n\n this._events.next(event as HalEvent);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { StateService } from '@uirouter/core';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { Injectable, Injector } from '@angular/core';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { ErrorResource } from 'core-app/features/hal/resources/error-resource';\nimport { HalError } from 'core-app/features/hal/services/hal-error';\n\n@Injectable()\nexport class HalResourceNotificationService {\n @InjectField() protected I18n:I18nService;\n\n @InjectField() protected $state:StateService;\n\n @InjectField() protected halResourceService:HalResourceService;\n\n @InjectField() protected ToastService:ToastService;\n\n @InjectField() protected loadingIndicator:LoadingIndicatorService;\n\n @InjectField() protected schemaCache:SchemaCacheService;\n\n constructor(public injector:Injector) {\n }\n\n public showSave(resource:HalResource, isCreate = false) {\n const message:any = {\n message: this.I18n.t(`js.notice_successful_${isCreate ? 'create' : 'update'}`),\n };\n\n this.ToastService.addSuccess(message);\n }\n\n /**\n * Handle any kind of error response:\n * - HAL ErrorResources\n * - Angular HttpErrorResponses\n * - Older .data error responses\n * - String error messages\n *\n * @param response\n * @param resource\n */\n public handleRawError(response:unknown, resource?:HalResource) {\n console.error('Handling error message %O for work package %O', response, resource);\n\n // Some transformation may already have returned the error as a HAL resource,\n // which we will forward to handleErrorResponse\n if (response instanceof HalError && resource) {\n return this.handleErrorResponse(response.resource, resource);\n }\n\n const errorBody = this.retrieveError(response);\n\n if (errorBody instanceof HalResource) {\n return this.handleErrorResponse(errorBody, resource);\n }\n\n if (typeof (response) === 'string') {\n this.ToastService.addError(response);\n return;\n }\n\n if (response instanceof Error) {\n this.ToastService.addError(response.message);\n return;\n }\n\n this.showGeneralError(errorBody || response);\n }\n\n /**\n * Retrieve an error message string from the given unknown response.\n * @param response\n */\n public retrieveErrorMessage(response:unknown):string {\n const error = this.retrieveError(response);\n\n if (error instanceof ErrorResource || error instanceof HalError) {\n return error.message;\n }\n\n if (typeof (error) === 'string') {\n return error;\n }\n\n return this.I18n.t('js.error.internal');\n }\n\n public retrieveError(response:unknown):ErrorResource|unknown {\n // we try to detect what we got, this may either be an HttpErrorResponse,\n // some older XHR response object or a string\n let errorBody:any = response;\n\n // Angular http response have an error body attribute\n if (response instanceof HttpErrorResponse) {\n errorBody = response.message || response.error;\n }\n\n // Some older response may have a data attribute\n if (_.get(response, 'data._type') === 'Error') {\n errorBody = (response as any).data;\n }\n\n if (errorBody && errorBody._type === 'Error') {\n return this.halResourceService.createHalResourceOfClass(ErrorResource, errorBody);\n }\n\n return errorBody;\n }\n\n protected handleErrorResponse(errorResource:any, resource?:HalResource) {\n if (errorResource instanceof HalError && resource) {\n return this.showError(errorResource.resource, resource);\n }\n\n if (!(errorResource instanceof ErrorResource)) {\n return this.showGeneralError(errorResource);\n }\n\n if (resource) {\n return this.showError(errorResource, resource);\n }\n\n return this.showApiErrorMessages(errorResource);\n }\n\n public showError(errorResource:any, resource:HalResource) {\n this.showCustomError(errorResource, resource) || this.showApiErrorMessages(errorResource);\n }\n\n public showGeneralError(message?:unknown) {\n let error = this.I18n.t('js.error.internal');\n\n if (typeof (message) === 'string' || _.has(message, 'toString')) {\n error += ` ${(message as any).toString()}`;\n }\n\n this.ToastService.addError(error);\n }\n\n public showEditingBlockedError(attribute:string) {\n this.ToastService.addError(this.I18n.t(\n 'js.hal.error.edit_prohibited',\n { attribute },\n ));\n }\n\n protected showCustomError(errorResource:any, resource:HalResource) {\n if (errorResource.errorIdentifier === 'urn:openproject-org:api:v3:errors:PropertyFormatError') {\n const schema = this.schemaCache.of(resource).ofProperty(errorResource.details.attribute);\n const attributeName = schema.name;\n const attributeType = schema.type.toLowerCase();\n const i18nString = `js.hal.error.format.${attributeType}`;\n\n if (this.I18n.lookup(i18nString) === undefined) {\n return false;\n }\n\n this.ToastService.addError(this.I18n.t(i18nString,\n { attribute: attributeName }));\n\n return true;\n }\n return false;\n }\n\n protected showApiErrorMessages(errorResource:any) {\n const messages = errorResource.errorMessages;\n\n if (messages.length > 1) {\n this.ToastService.addError('', messages);\n } else {\n this.ToastService.addError(messages[0]);\n }\n\n return true;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\n@Injectable({ providedIn: 'root' })\nexport class HalResourceSortingService {\n /**\n * List of sortable properties by HAL type\n */\n private config:{ [typeName:string]:string } = {\n user: 'name',\n project: 'name',\n };\n\n constructor() {\n }\n\n /**\n * Sort the given HalResource based on its type.\n * If the type is not given, guess from the first element.\n *\n * @param {T[]} elements A collection of HalResources of type T\n * @param {string} type The HAL type of the collection\n * @returns {T[]} The sorted collection of HalResources\n */\n public sort(elements:T[], type?:string) {\n if (elements.length === 0) {\n return elements;\n }\n\n const halType = type || elements[0]._type;\n if (!halType) {\n return elements;\n }\n\n const property = this.sortingProperty(halType);\n if (property) {\n return _.sortBy(elements, (v) => v[property].toLowerCase());\n }\n return elements;\n }\n\n /**\n * Transform the HAL type into the sorting property map.\n *\n * - Removes the leading multi identifier [] (e.g., from []User)\n * - Transforms to lowercase\n *\n * @param {string} type\n * @returns {string | undefined}\n */\n public sortingProperty(type:string):string | undefined {\n // Remove multi identifier and map to lowercase\n type = type\n .toLowerCase()\n .replace(/^\\[\\]/, '');\n\n return this.config[type];\n }\n\n public hasSortingProperty(type:string) {\n return this.sortingProperty(type) !== undefined;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Injectable,\n Injector,\n} from '@angular/core';\nimport {\n HttpClient,\n HttpErrorResponse,\n HttpParams,\n} from '@angular/common/http';\nimport {\n catchError,\n map,\n} from 'rxjs/operators';\nimport {\n Observable,\n throwError,\n} from 'rxjs';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { ErrorResource } from 'core-app/features/hal/resources/error-resource';\nimport * as Pako from 'pako';\nimport * as base64 from 'byte-base64';\nimport { whenDebugging } from 'core-app/shared/helpers/debug_output';\nimport {\n HTTPClientHeaders,\n HTTPClientOptions,\n HTTPClientParamMap,\n HTTPSupportedMethods,\n} from 'core-app/features/hal/http/http.interfaces';\nimport {\n HalLink,\n HalLinkInterface,\n} from 'core-app/features/hal/hal-link/hal-link';\nimport { URLParamsEncoder } from 'core-app/features/hal/services/url-params-encoder';\nimport {\n HalResource,\n HalResourceClass,\n} from 'core-app/features/hal/resources/hal-resource';\nimport { initializeHalProperties } from '../helpers/hal-resource-builder';\nimport { HalError } from 'core-app/features/hal/services/hal-error';\nimport { getPaginatedCollections } from 'core-app/core/apiv3/helpers/get-paginated-results';\n\nexport interface HalResourceFactoryConfigInterface {\n cls?:any;\n attrTypes?:{ [attrName:string]:string };\n}\n\ninterface ErrorWithType {\n _type?:string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class HalResourceService {\n /**\n * List of all known hal resources, extendable.\n */\n private config:{ [typeName:string]:HalResourceFactoryConfigInterface } = {};\n\n constructor(\n readonly injector:Injector,\n readonly http:HttpClient,\n ) {\n }\n\n /**\n * Perform a HTTP request and return a HalResource promise.\n */\n public request(method:HTTPSupportedMethods, href:string, data?:unknown, headers:HTTPClientHeaders = {}):Observable {\n // HttpClient requires us to create HttpParams instead of passing data for get\n // so forward to that method instead.\n if (method === 'get') {\n return this.get(href, data as HTTPClientParamMap|undefined, headers);\n }\n\n const config:HTTPClientOptions = {\n body: data || {},\n headers,\n withCredentials: true,\n responseType: 'json',\n };\n\n return this.performRequest(method, href, config);\n }\n\n private performRequest(method:HTTPSupportedMethods, href:string, config:HTTPClientOptions):Observable {\n return this.http.request(method, href, config)\n .pipe(\n map((response:unknown) => this.createHalResource(response)),\n catchError((error:HttpErrorResponse) => {\n whenDebugging(() => console.error(`Failed to ${method} ${href}: ${error.name}`));\n return this.createErrorObservable(error);\n }),\n );\n }\n\n /**\n * Perform a GET request and return a resource promise.\n *\n * @param href\n * @param params\n * @param headers\n * @returns {Promise}\n */\n public get(href:string, params?:HTTPClientParamMap, headers?:HTTPClientHeaders):Observable {\n const config:HTTPClientOptions = {\n headers,\n params: new HttpParams({ encoder: new URLParamsEncoder(), fromObject: params }),\n withCredentials: true,\n responseType: 'json',\n };\n\n return this.performRequest('get', href, config);\n }\n\n /**\n * Return all potential pages to the request, when the elements returned from API is smaller\n * than the expected.\n *\n * @param href The URL to request\n * @param params Parameters to pass to each paged request\n * @param headers Headers to pass to each paged request\n * @return {Observable}\n */\n public getAllPaginated(\n href:string,\n params:Record = {},\n headers:HTTPClientHeaders = {},\n ):Observable {\n return getPaginatedCollections(\n (pageParams) => {\n const requestParams = { ...params, ...pageParams };\n return this.request>('get', href, this.toEprops(requestParams), headers);\n },\n (params.pageSize as number|undefined) || -1,\n ) as Observable;\n }\n\n /**\n * Perform a PUT request and return a resource promise.\n * @param href\n * @param data\n * @param headers\n * @returns {Promise}\n */\n public put(href:string, data?:any, headers?:HTTPClientHeaders):Observable {\n return this.request('put', href, data, headers);\n }\n\n /**\n * Perform a POST request and return a resource promise.\n *\n * @param href\n * @param data\n * @param headers\n * @returns {Promise}\n */\n public post(href:string, data?:any, headers?:HTTPClientHeaders):Observable {\n return this.request('post', href, data, headers);\n }\n\n /**\n * Perform a PATCH request and return a resource promise.\n *\n * @param href\n * @param data\n * @param headers\n * @returns {Promise}\n */\n public patch(href:string, data?:any, headers?:HTTPClientHeaders):Observable {\n return this.request('patch', href, data, headers);\n }\n\n /**\n * Perform a DELETE request and return a resource promise\n *\n * @param href\n * @param data\n * @param headers\n * @returns {Promise}\n */\n public delete(href:string, data?:any, headers?:HTTPClientHeaders):Observable {\n return this.request('delete', href, data, headers);\n }\n\n /**\n * Register a HalResource for use with the API.\n * @param {HalResourceStatic} resource\n */\n public registerResource(key:string, entry:HalResourceFactoryConfigInterface) {\n this.config[key] = entry;\n }\n\n /**\n * Get the default class.\n * Initially, it's HalResource.\n *\n * @returns {HalResource}\n */\n public get defaultClass():HalResourceClass {\n const defaultCls:HalResourceClass = HalResource;\n return defaultCls;\n }\n\n /**\n * Create a HalResource from a source object.\n * If the APIv3 _type attribute is defined and the type is configured,\n * the respective class will be used for instantiation.\n *\n *\n * @param source\n * @returns {HalResource}\n */\n public createHalResource(source:any, loaded = true):T {\n if (_.isNil(source)) {\n source = HalResource.getEmptyResource();\n }\n\n const type = source._type || 'HalResource';\n return this.createHalResourceOfType(type, source, loaded);\n }\n\n public createHalResourceOfType(type:string, source:any, loaded = false) {\n const resourceClass:HalResourceClass = this.getResourceClassOfType(type);\n const initializer = (halResource:T) => initializeHalProperties(this, halResource);\n const resource = new resourceClass(this.injector, source, loaded, initializer, type);\n\n return resource;\n }\n\n /**\n * Create a resource class of the given class\n * @param resourceClass\n * @param source\n * @param loaded\n */\n public createHalResourceOfClass(resourceClass:HalResourceClass, source:any, loaded = false) {\n const initializer = (halResource:T) => initializeHalProperties(this, halResource);\n const type = source._type || 'HalResource';\n const resource = new resourceClass(this.injector, source, loaded, initializer, type);\n\n return resource;\n }\n\n /**\n * Create a linked HalResource from the given link.\n *\n * @param {HalLinkInterface} link\n * @returns {HalResource}\n */\n public fromLink(link:HalLinkInterface) {\n const resource = HalResource.getEmptyResource(HalLink.fromObject(this, link));\n return this.createHalResource(resource, false);\n }\n\n /**\n * Create an empty HAL resource with only the self link set.\n * @param href Self link of the HAL resource\n */\n public fromSelfLink(href:string|null) {\n const source = { _links: { self: { href } } };\n return this.createHalResource(source);\n }\n\n /**\n * Get a linked resource from its HalLink with the correct type.\n */\n public createLinkedResource(halResource:T, linkName:string, link:HalLinkInterface) {\n const source = HalResource.getEmptyResource();\n const fromType = halResource.$halType;\n const toType = this.getResourceClassOfAttribute(fromType, linkName) || 'HalResource';\n\n source._links.self = link;\n\n return this.createHalResourceOfType(toType, source, false);\n }\n\n /**\n * Get the configured resource class of a type.\n *\n * @param type\n * @returns {HalResource}\n */\n protected getResourceClassOfType(type:string):HalResourceClass {\n const config = this.config[type];\n return (config && config.cls) ? config.cls : this.defaultClass;\n }\n\n /**\n * Get the hal type for an attribute\n *\n * @param type\n * @param attribute\n * @returns {any}\n */\n protected getResourceClassOfAttribute(type:string, attribute:string):string|null {\n const typeConfig = this.config[type];\n const types = (typeConfig && typeConfig.attrTypes) || {};\n return types[attribute];\n }\n\n protected toEprops(params:unknown):{ eprops:string } {\n const deflatedArray = Pako.deflate(JSON.stringify(params));\n const compressed = base64.bytesToBase64(deflatedArray);\n\n return { eprops: compressed };\n }\n\n private createErrorObservable(error:HttpErrorResponse):Observable {\n let resource:ErrorResource|null = null;\n\n const body = error.error as string|ErrorWithType|unknown;\n // eslint-disable-next-line no-underscore-dangle\n if (typeof body === 'object' && (body as ErrorWithType)?._type) {\n resource = this.createHalResource(error.error);\n }\n\n return throwError(new HalError(error, resource));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HttpParameterCodec } from '@angular/common/http';\n\nexport class URLParamsEncoder implements HttpParameterCodec {\n encodeKey(key:string):string {\n return encodeURIComponent(key);\n }\n\n encodeValue(value:string):string {\n return encodeURIComponent(value);\n }\n\n decodeKey(key:string):string {\n return decodeURIComponent(key);\n }\n\n decodeValue(value:string):string {\n return decodeURIComponent(value);\n }\n}\n","import {\n Store,\n StoreConfig,\n} from '@datorama/akita';\n\nexport interface IanBellState {\n totalUnread:number;\n}\n\nexport function createInitialState():IanBellState {\n return {\n totalUnread: 0,\n };\n}\n\n@StoreConfig({ name: 'ian-bell' })\nexport class IanBellStore extends Store {\n constructor() {\n super(createInitialState());\n }\n}\n","import { pairwise, filter, map } from 'rxjs/operators';\nimport { Query } from '@datorama/akita';\nimport {\n IanBellState,\n IanBellStore,\n} from 'core-app/features/in-app-notifications/bell/state/ian-bell.store';\n\nexport class IanBellQuery extends Query {\n unread$ = this.select('totalUnread');\n\n unreadCountIncreased$ = this.unread$.pipe(\n pairwise(),\n filter(([last, curr]) => curr > last),\n map(([, curr]) => curr),\n );\n\n constructor(protected store:IanBellStore) {\n super(store);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { IanBellStore } from './ian-bell.store';\nimport {\n InAppNotificationsResourceService,\n} from 'core-app/core/state/in-app-notifications/in-app-notifications.service';\nimport { IAN_FACET_FILTERS } from 'core-app/features/in-app-notifications/center/state/ian-center.store';\nimport {\n map,\n tap,\n skip,\n catchError,\n} from 'rxjs/operators';\nimport {\n EMPTY,\n Observable,\n} from 'rxjs';\nimport { IanBellQuery } from 'core-app/features/in-app-notifications/bell/state/ian-bell.query';\nimport {\n EffectCallback,\n EffectHandler,\n} from 'core-app/core/state/effects/effect-handler.decorator';\nimport {\n notificationsMarkedRead,\n notificationCountIncreased,\n} from 'core-app/core/state/in-app-notifications/in-app-notifications.actions';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\n\n/**\n * The BellService is injected into root here (and the store is thus made global),\n * because we are dependent in many places on the information about how many notifications there are in total.\n * Instead of repeating these requests, we prefer to use the global store for now.\n */\n@Injectable({ providedIn: 'root' })\n@EffectHandler\nexport class IanBellService {\n readonly id = 'ian-bell';\n\n readonly store = new IanBellStore();\n\n readonly query = new IanBellQuery(this.store);\n\n unread$ = this.query.unread$;\n\n constructor(\n readonly actions$:ActionsService,\n readonly resourceService:InAppNotificationsResourceService,\n ) {\n this.query.unreadCountIncreased$.pipe(skip(1)).subscribe((count) => {\n this.actions$.dispatch(notificationCountIncreased({ origin: this.id, count }));\n });\n }\n\n fetchUnread():Observable {\n return this\n .resourceService\n .fetchCollection(\n { filters: IAN_FACET_FILTERS.unread, pageSize: 0 },\n { handleErrors: false },\n )\n .pipe(\n map((result) => result.total),\n tap(\n (count) => {\n this.store.update({ totalUnread: count });\n },\n (error) => {\n console.error('Failed to load notifications: %O', error);\n this.store.update({ totalUnread: -1 });\n },\n ),\n catchError(() => EMPTY),\n );\n }\n\n @EffectCallback(notificationsMarkedRead)\n private reloadOnNotificationRead(action:ReturnType) {\n this.store.update(({ totalUnread }) => ({ totalUnread: totalUnread - action.notifications.length }));\n }\n}\n","import { Store, StoreConfig } from '@datorama/akita';\nimport { CollectionResponse } from 'core-app/core/state/collection-store';\nimport { ApiV3ListFilter } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { NOTIFICATIONS_MAX_SIZE } from 'core-app/core/state/in-app-notifications/in-app-notification.model';\nimport { INotificationPageQueryParameters } from 'core-app/features/in-app-notifications/in-app-notifications.routes';\n\nexport type InAppNotificationFacet = 'unread'|'all';\n\nexport interface IanCenterState {\n params:{\n page:number;\n pageSize:number;\n };\n activeFacet:InAppNotificationFacet;\n filters:INotificationPageQueryParameters;\n\n activeCollection:CollectionResponse;\n\n /** Number of elements not showing after max values loaded */\n notLoaded:number;\n}\n\nexport const IAN_FACET_FILTERS:Record = {\n unread: [['readIAN', '=', false]],\n all: [],\n};\n\nexport function createInitialState():IanCenterState {\n return {\n params: {\n pageSize: NOTIFICATIONS_MAX_SIZE,\n page: 1,\n },\n filters: {},\n activeCollection: { ids: [] },\n activeFacet: 'unread',\n notLoaded: 0,\n };\n}\n\n@StoreConfig({ name: 'ian-center' })\nexport class IanCenterStore extends Store {\n constructor() {\n super(createInitialState());\n }\n}\n","import {\n Injectable,\n Injector,\n} from '@angular/core';\nimport {\n debounceTime,\n defaultIfEmpty,\n distinctUntilChanged,\n map,\n mapTo,\n pluck,\n shareReplay,\n switchMap,\n take,\n tap,\n} from 'rxjs/operators';\nimport {\n forkJoin,\n from,\n Observable,\n Subject,\n} from 'rxjs';\nimport {\n ID,\n Query,\n} from '@datorama/akita';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n IToast,\n ToastService,\n} from 'core-app/shared/components/toaster/toast.service';\nimport {\n centerUpdatedInPlace,\n markNotificationsAsRead,\n notificationCountIncreased,\n notificationsMarkedRead,\n} from 'core-app/core/state/in-app-notifications/in-app-notifications.actions';\nimport { INotification } from 'core-app/core/state/in-app-notifications/in-app-notification.model';\nimport {\n EffectCallback,\n EffectHandler,\n} from 'core-app/core/state/effects/effect-handler.decorator';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { InAppNotificationsResourceService } from 'core-app/core/state/in-app-notifications/in-app-notifications.service';\nimport {\n collectionKey,\n mapHALCollectionToIDCollection,\n} from 'core-app/core/state/collection-store';\nimport { INotificationPageQueryParameters } from 'core-app/features/in-app-notifications/in-app-notifications.routes';\nimport {\n IAN_FACET_FILTERS,\n IanCenterStore,\n InAppNotificationFacet,\n} from './ian-center.store';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { UIRouterGlobals } from '@uirouter/core';\nimport { StateService } from '@uirouter/angular';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport {\n ApiV3ListFilter,\n ApiV3ListParameters,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\n\n@Injectable()\n@EffectHandler\nexport class IanCenterService extends UntilDestroyedMixin {\n readonly id = 'ian-center';\n\n readonly store = new IanCenterStore();\n\n readonly query = new Query(this.store);\n\n activeFacet$ = this.query.select('activeFacet');\n\n notLoaded$ = this.query.select('notLoaded');\n\n paramsChanges$ = this.query.select(['params', 'activeFacet']);\n\n activeCollection$ = this.query.select('activeCollection');\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n activeReason$:Observable = this.uiRouterGlobals.params$!.pipe(\n this.untilDestroyed(),\n distinctUntilChanged(),\n map((params) => {\n if (params.filter === 'reason') {\n return params.name as string;\n }\n\n return null;\n }),\n shareReplay(1),\n );\n\n loading$:Observable = this.query.selectLoading();\n\n selectNotifications$:Observable = this\n .activeCollection$\n .pipe(\n switchMap((collection) => {\n const lookupId = (id:ID) => this.resourceService.lookup(id).pipe(take(1));\n return forkJoin(collection.ids.map(lookupId))\n .pipe(defaultIfEmpty([]));\n }),\n );\n\n aggregatedCenterNotifications$ = this\n .selectNotifications$\n .pipe(\n map((notifications) => (\n _.groupBy(notifications, (notification) => notification._links.resource?.href || 'none')\n )),\n distinctUntilChanged(),\n );\n\n notifications$ = this\n .aggregatedCenterNotifications$\n .pipe(\n map((items) => Object.values(items)),\n distinctUntilChanged(),\n );\n\n hasNotifications$ = this\n .notifications$\n .pipe(\n distinctUntilChanged(),\n map((items) => items.length > 0),\n distinctUntilChanged(),\n );\n\n hasMoreThanPageSize$ = this\n .notLoaded$\n .pipe(\n map((notLoaded) => notLoaded > 0),\n distinctUntilChanged(),\n );\n\n get params():ApiV3ListParameters {\n const state = this.store.getValue();\n const hasFilters = state.filters.name && state.filters.filter;\n return {\n ...state.params,\n filters: [\n ...IAN_FACET_FILTERS[state.activeFacet],\n ...(\n hasFilters\n ? ([[state.filters.filter, '=', [state.filters.name]]] as ApiV3ListFilter[])\n : []\n ),\n ],\n };\n }\n\n private activeReloadToast:IToast|null = null;\n\n private reload = new Subject();\n\n private onReload = this.reload.pipe(\n debounceTime(0),\n tap((setToLoading) => {\n if (setToLoading) {\n this.store.setLoading(true);\n }\n }),\n switchMap(() => this\n .resourceService\n .fetchCollection(this.params)\n .pipe(\n switchMap(\n (results) => from(this.sideLoadInvolvedWorkPackages(results._embedded.elements))\n .pipe(\n mapTo(mapHALCollectionToIDCollection(results)),\n ),\n ),\n )),\n\n // We need to be slower than the onReload subscribers set below.\n // Because they're subscribers they're called next in the callback queue.\n // We need our loading state to be set to false only after all data is in the store,\n // but we cannot guarantee that here, since the data is set _after_ this piece of code\n // gets run. The solution is to queue this piece of code back, allowing the store contents\n // update before the loading state gets reset.\n tap(() => setTimeout(() => this.store.setLoading(false))),\n );\n\n public selectedNotificationIndex = 0;\n\n public selectedNotification:INotification;\n\n stateChanged$ = this.uiRouterGlobals.params$?.pipe(\n this.untilDestroyed(),\n pluck('workPackageId'),\n distinctUntilChanged(),\n map((workPackageId:string) => (workPackageId ? this.apiV3Service.work_packages.id(workPackageId).path : undefined)),\n shareReplay(),\n );\n\n constructor(\n readonly I18n:I18nService,\n readonly injector:Injector,\n readonly resourceService:InAppNotificationsResourceService,\n readonly actions$:ActionsService,\n readonly apiV3Service:ApiV3Service,\n readonly toastService:ToastService,\n readonly uiRouterGlobals:UIRouterGlobals,\n readonly state:StateService,\n readonly deviceService:DeviceService,\n ) {\n super();\n this.reload.subscribe();\n\n if (this.stateChanged$) {\n this.stateChanged$.subscribe(() => {\n this.updateSelectedNotification();\n });\n }\n }\n\n setFilters(filters:INotificationPageQueryParameters):void {\n this.store.update({ filters });\n this.onReload.pipe(take(1)).subscribe((collection) => {\n this.store.update({ activeCollection: collection });\n });\n this.reload.next(true);\n }\n\n setFacet(facet:InAppNotificationFacet):void {\n this.store.update({ activeFacet: facet });\n this.onReload.pipe(take(1)).subscribe((collection) => {\n this.store.update({ activeCollection: collection });\n });\n\n if (facet === 'unread') {\n if (this.selectedNotification?.readIAN) {\n this.goToCenter();\n }\n }\n this.reload.next(true);\n }\n\n markAsRead(notifications:ID[]):void {\n this.actions$.dispatch(\n markNotificationsAsRead({ origin: this.id, notifications }),\n );\n }\n\n markAllAsRead():void {\n const key = collectionKey(this.params);\n this\n .resourceService\n .collection(key)\n .pipe(\n take(1),\n )\n .subscribe((elements) => {\n const ids:ID[] = elements\n .filter((notification) => notification.readIAN === false)\n .map((notification) => notification.id);\n\n if (ids.length > 0) {\n this.markAsRead(ids);\n }\n });\n }\n\n openSplitScreen(wpId:string|null, tabIdentifier:string = 'activity'):void {\n void this.state.go(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/restrict-template-expressions\n `${this.state.current.data.baseRoute}.details.tabs`,\n { workPackageId: wpId, tabIdentifier },\n );\n }\n\n goToCenter():void {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/restrict-template-expressions\n void this.state.go(this.state.current.data.baseRoute);\n }\n\n showNextNotification():void {\n void this\n .notifications$\n .pipe(\n take(1),\n ).subscribe((notifications:INotification[][]) => {\n if (notifications.length <= 0) {\n void this.state.go(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/restrict-template-expressions\n `${this.state.current.data.baseRoute}`,\n );\n return;\n }\n if (notifications[0][0]._links.resource || notifications[this.selectedNotificationIndex][0]._links.resource) {\n const wpId = idFromLink(notifications[this.selectedNotificationIndex >= notifications.length ? 0 : this.selectedNotificationIndex][0]._links.resource.href);\n this.openSplitScreen(wpId);\n }\n });\n }\n\n /**\n * Check for updates after bell count increased\n */\n @EffectCallback(notificationCountIncreased)\n private checkForNewNotifications() {\n this.onReload.pipe(take(1)).subscribe((collection) => {\n const { activeCollection } = this.query.getValue();\n const hasNewNotifications = !collection.ids.reduce(\n (allInOldCollection, id) => allInOldCollection && activeCollection.ids.includes(id),\n true,\n );\n\n if (!hasNewNotifications) {\n return;\n }\n\n if (this.activeReloadToast) {\n this.toastService.remove(this.activeReloadToast);\n this.activeReloadToast = null;\n }\n\n this.activeReloadToast = this.toastService.add({\n type: 'info',\n message: this.I18n.t('js.notifications.center.new_notifications.message'),\n link: {\n text: this.I18n.t('js.notifications.center.new_notifications.link_text'),\n target: () => {\n this.store.update({ activeCollection: collection });\n this.actions$.dispatch(centerUpdatedInPlace({ origin: this.id }));\n this.activeReloadToast = null;\n },\n },\n });\n });\n this.reload.next(false);\n }\n\n /**\n * Reload after notifications were successfully marked as read\n */\n @EffectCallback(notificationsMarkedRead)\n private reloadOnNotificationRead(action:ReturnType) {\n const { activeCollection } = this.query.getValue();\n this.store.update({\n activeCollection: {\n ids: activeCollection.ids.filter((activeID) => !action.notifications.includes(activeID)),\n },\n });\n\n if (!this.deviceService.isMobile && this.state.includes('**.details.*')) {\n this.showNextNotification();\n }\n }\n\n private sideLoadInvolvedWorkPackages(elements:INotification[]):Promise {\n const { cache } = this.apiV3Service.work_packages;\n const wpIds = elements\n .map((element) => {\n const href = element._links.resource?.href;\n return href && HalResource.matchFromLink(href, 'work_packages');\n })\n .filter((id) => id && cache.stale(id)) as string[];\n\n const promise = this\n .apiV3Service\n .work_packages\n .requireAll(_.compact(wpIds));\n\n wpIds.forEach((id) => {\n cache.clearAndLoad(\n id,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n from(promise).pipe(map(() => cache.current(id)!)),\n );\n });\n\n return promise;\n }\n\n private updateSelectedNotification() {\n this\n .notifications$\n .pipe(\n take(1),\n )\n .subscribe(\n (notifications:INotification[][]) => {\n for (let i = 0; i < notifications.length; ++i) {\n if (notifications[i][0]._links.resource\n && idFromLink(notifications[i][0]._links.resource.href) === this.uiRouterGlobals.params.workPackageId) {\n this.selectedNotificationIndex = i;\n [this.selectedNotification] = notifications[i];\n return;\n }\n }\n },\n );\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\nimport { StatusResource } from 'core-app/features/hal/resources/status-resource';\n\n@Component({\n selector: 'op-in-app-notification-status',\n styleUrls: ['./in-app-notification-status.component.sass'],\n templateUrl: './in-app-notification-status.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InAppNotificationStatusComponent implements OnChanges {\n @Input() status:StatusResource;\n\n highlightClass:string;\n\n ngOnChanges(changes:SimpleChanges):void {\n if (changes.status) {\n const status = changes.status as { currentValue:StatusResource };\n this.highlightClass = Highlighting.backgroundClass('status', status.currentValue.id || '');\n }\n }\n}\n","\n \n\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n OnInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport { INotification } from 'core-app/core/state/in-app-notifications/in-app-notification.model';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport * as moment from 'moment';\nimport { Moment } from 'moment';\n\n@Component({\n selector: 'op-in-app-notification-date-alert',\n templateUrl: './in-app-notification-date-alert.component.html',\n styleUrls: ['./in-app-notification-date-alert.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class InAppNotificationDateAlertComponent implements OnInit {\n @Input() aggregatedNotifications:INotification[];\n\n @Input() workPackage:WorkPackageResource;\n\n @HostBinding('class.op-ian-date-alert') className = true;\n\n @HostBinding('class.op-ian-date-alert_overdue') isOverdue:boolean;\n\n alertText:string;\n\n dateIsPast:boolean;\n\n propertyText:string;\n\n text = {\n work_package_is: this.I18n.t('js.notifications.date_alerts.work_package_is'),\n overdue: this.I18n.t('js.notifications.date_alerts.overdue'),\n overdue_since: (difference_in_days:string):string =>\n this.I18n.t('js.notifications.date_alerts.overdue_since', { difference_in_days }),\n property_is: (difference_in_days:string):string =>\n this.I18n.t('js.notifications.date_alerts.property_is', { difference_in_days }),\n property_was: (difference_in_days:string):string =>\n this.I18n.t('js.notifications.date_alerts.property_was', { difference_in_days }),\n property_deleted: this.I18n.t('js.notifications.date_alerts.property_is_deleted'),\n startDate: this.I18n.t('js.work_packages.properties.startDate'),\n dueDate: this.I18n.t('js.work_packages.properties.dueDate'),\n date: this.I18n.t('js.notifications.date_alerts.milestone_date'),\n due_today: this.I18n.t('js.notifications.date_alerts.property_today'),\n };\n\n constructor(\n private I18n:I18nService,\n private timezoneService:TimezoneService,\n ) { }\n\n ngOnInit():void {\n // Find the most important date alert\n const interestingAlert = this.deriveMostRelevantAlert(this.aggregatedNotifications);\n\n const detail = interestingAlert._embedded.details[0];\n const property = detail.property;\n\n if (!detail.value) {\n this.propertyText = this.text[property];\n this.alertText = this.text.property_deleted;\n } else {\n this.deriveDueDate(detail.value, property);\n }\n }\n\n private deriveDueDate(value:string, property:'startDate'|'dueDate'|'date') {\n const dateValue = this.timezoneService.parseISODate(value).startOf('day');\n const today = moment();\n this.dateIsPast = dateValue.isBefore(today, 'day');\n this.isOverdue = this.dateIsPast && ['date', 'dueDate'].includes(property);\n const diff = this.dateDiff(dateValue);\n this.propertyText = (this.isOverdue && diff > 0) ? this.text.overdue : this.text[property];\n this.alertText = this.buildAlertText(diff);\n }\n\n private buildAlertText(daysDiff:number):string {\n if (daysDiff === 0) {\n return this.text.due_today;\n }\n\n const daysText = this.I18n.t('js.units.day', { count: daysDiff });\n if (this.isOverdue) {\n return this.text.overdue_since(daysText);\n }\n\n if (this.dateIsPast) {\n return this.text.property_was(daysText);\n }\n\n return this.text.property_is(daysText);\n }\n\n private dateDiff(reference:Moment):number {\n const now = moment().startOf('day');\n return Math.abs(now.diff(reference, 'days'));\n }\n\n private deriveMostRelevantAlert(aggregatedNotifications:INotification[]) {\n // Second case: We have one date alert + some others\n const dateAlerts = aggregatedNotifications.filter((notification) => notification.reason === 'dateAlert');\n const first = aggregatedNotifications[0];\n if (dateAlerts.length > 1) {\n const found = dateAlerts.find((notification) => notification._embedded.details[0].property === 'dueDate');\n return found || first;\n }\n\n // We only have one\n return first;\n }\n}\n","\n&ngsp;\n\n","\n
\n \n 1 && actors.length < 4\">\n {{ text.and }}\n \n \n 2\" [textContent]=\"', '\">\n \n 3\"> {{ text_for_additional_authors(actors.length - 3) }}\n
\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n OnInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport { INotification } from 'core-app/core/state/in-app-notifications/in-app-notification.model';\nimport { PrincipalLike } from 'core-app/shared/components/principal/principal-types';\nimport {\n Observable,\n timer,\n} from 'rxjs';\nimport {\n distinctUntilChanged,\n map,\n} from 'rxjs/operators';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { DeviceService } from 'core-app/core/browser/device.service';\n\n@Component({\n selector: 'op-in-app-notification-actors-line',\n templateUrl: './in-app-notification-actors-line.component.html',\n styleUrls: ['./in-app-notification-actors-line.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class InAppNotificationActorsLineComponent implements OnInit {\n @HostBinding('class.op-ian-actors') className = true;\n\n @Input() aggregatedNotifications:INotification[];\n\n @Input() notification:INotification;\n\n // The actor, if any\n actors:PrincipalLike[] = [];\n\n // Fixed notification time\n fixedTime:string;\n\n // Format relative elapsed time (n seconds/minutes/hours ago)\n // at an interval for auto updating\n relativeTime$:Observable;\n\n text = {\n and: this.I18n.t('js.notifications.center.label_actor_and'),\n and_other_singular: this.I18n.t('js.notifications.center.and_more_users.one'),\n and_other_plural: (count:number):string => this.I18n.t('js.notifications.center.and_more_users.other',\n { count }),\n loading: this.I18n.t('js.ajax.loading'),\n placeholder: this.I18n.t('js.placeholders.default'),\n mark_as_read: this.I18n.t('js.notifications.center.mark_as_read'),\n updated_by_at: (age:string):string => this.I18n.t('js.notifications.center.text_update_date',\n { date: age }),\n };\n\n constructor(\n readonly deviceService:DeviceService,\n private I18n:I18nService,\n private timezoneService:TimezoneService,\n ) { }\n\n ngOnInit():void {\n this.buildActors();\n this.buildTime();\n }\n\n text_for_additional_authors(number:number):string {\n if (number === 1) {\n return this.text.and_other_singular;\n }\n\n return this.text.and_other_plural(number);\n }\n\n private buildTime() {\n this.fixedTime = this.timezoneService.formattedDatetime(this.notification.createdAt);\n this.relativeTime$ = timer(0, 10000)\n .pipe(\n map(() => this.text.updated_by_at(\n this.timezoneService.formattedRelativeDateTime(this.notification.createdAt),\n )),\n distinctUntilChanged(),\n );\n }\n\n private buildActors() {\n const actors = this\n .aggregatedNotifications\n .map((notification) => {\n const { actor } = notification._links;\n\n if (!actor) {\n return null;\n }\n\n return {\n href: actor.href,\n name: actor.title,\n };\n })\n .filter((actor) => actor !== null) as PrincipalLike[];\n\n this.actors = _.uniqBy(actors, (item) => item.href);\n }\n}\n","\n \n \n
\n \n
\n\n \n \n \n - -\n \n\n \n \n {{ item.key }}, \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 \n \n \n\n \n
\n \n \n
\n
\n
\n\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n OnInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Observable } from 'rxjs';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport {\n map,\n shareReplay,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { take } from 'rxjs/internal/operators/take';\nimport { StateService } from '@uirouter/angular';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { INotification } from 'core-app/core/state/in-app-notifications/in-app-notification.model';\nimport { IanCenterService } from 'core-app/features/in-app-notifications/center/state/ian-center.service';\nimport { DeviceService } from 'core-app/core/browser/device.service';\n\n@Component({\n selector: 'op-in-app-notification-entry',\n templateUrl: './in-app-notification-entry.component.html',\n styleUrls: ['./in-app-notification-entry.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class InAppNotificationEntryComponent implements OnInit {\n @HostBinding('class.op-ian-item') className = true;\n\n @Input() notification:INotification;\n\n @Input() aggregatedNotifications:INotification[];\n\n workPackage$:Observable|null = null;\n\n showDateAlert$:Observable = this\n .storeService\n .activeReason$\n .pipe(\n map((reason) => reason === 'date_alert'),\n map((dateAlertFiltered) => {\n const dateAlerts = this.aggregatedNotifications.filter((notification) => notification.reason === 'dateAlert');\n return dateAlertFiltered || dateAlerts.length === this.aggregatedNotifications.length;\n }),\n shareReplay(1),\n );\n\n loading$ = this.storeService.query.selectLoading();\n\n stateChanged$ = this.storeService.stateChanged$;\n\n // The translated reason, if available\n translatedReasons:{ [reason:string]:number };\n\n project?:{ href:string, title:string, showUrl:string };\n\n text = {\n loading: this.I18n.t('js.ajax.loading'),\n placeholder: this.I18n.t('js.placeholders.default'),\n mark_as_read: this.I18n.t('js.notifications.center.mark_as_read'),\n };\n\n constructor(\n readonly apiV3Service:ApiV3Service,\n readonly I18n:I18nService,\n readonly storeService:IanCenterService,\n readonly timezoneService:TimezoneService,\n readonly pathHelper:PathHelperService,\n readonly state:StateService,\n readonly deviceService:DeviceService,\n ) {\n }\n\n ngOnInit():void {\n this.buildTranslatedReason();\n this.buildProject();\n this.loadWorkPackage();\n }\n\n private loadWorkPackage() {\n const href = this.notification._links.resource?.href;\n const id = href && HalResource.matchFromLink(href, 'work_packages');\n // not a work package reference\n if (id) {\n this.workPackage$ = this\n .apiV3Service\n .work_packages\n .id(id)\n .requireAndStream();\n }\n }\n\n showDetails():void {\n if (!this.workPackage$) {\n return;\n }\n\n this\n .workPackage$\n .pipe(\n take(1),\n withLatestFrom(this.showDateAlert$),\n )\n .subscribe(([wp, openDetailsTab]) => {\n const tab = openDetailsTab ? 'overview' : 'activity';\n this.storeService.openSplitScreen(wp.id, tab);\n });\n }\n\n projectClicked(event:MouseEvent):void { // eslint-disable-line class-methods-use-this\n event.stopPropagation();\n }\n\n markAsRead(event:MouseEvent, notifications:INotification[]):void {\n event.stopPropagation();\n this.storeService.markAsRead(notifications.map((el) => el.id));\n }\n\n isMobile():boolean {\n return this.deviceService.isMobile;\n }\n\n private buildTranslatedReason() {\n const reasons:{ [reason:string]:number } = {};\n\n this\n .aggregatedNotifications\n .forEach((notification) => {\n const translatedReason = this.I18n.t(\n `js.notifications.reasons.${notification.reason}`,\n { defaultValue: notification.reason || this.text.placeholder },\n );\n\n reasons[translatedReason] = reasons[translatedReason] || 0;\n reasons[translatedReason] += 1;\n });\n\n this.translatedReasons = reasons;\n }\n\n private buildProject() {\n const { project } = this.notification._links;\n\n if (project) {\n this.project = {\n ...project,\n showUrl: this.pathHelper.projectPath(idFromLink(project.href)),\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
\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n filter,\n map,\n} from 'rxjs/operators';\nimport { StateService } from '@uirouter/angular';\nimport { UIRouterGlobals } from '@uirouter/core';\nimport { IanCenterService } from 'core-app/features/in-app-notifications/center/state/ian-center.service';\nimport {\n INotification,\n NOTIFICATIONS_MAX_SIZE,\n} from 'core-app/core/state/in-app-notifications/in-app-notification.model';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { IanBellService } from 'core-app/features/in-app-notifications/bell/state/ian-bell.service';\nimport { imagePath } from 'core-app/shared/helpers/images/path-helper';\n\n@Component({\n selector: 'op-in-app-notification-center',\n templateUrl: './in-app-notification-center.component.html',\n styleUrls: ['./in-app-notification-center.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InAppNotificationCenterComponent implements OnInit {\n maxSize = NOTIFICATIONS_MAX_SIZE;\n\n hasMoreThanPageSize$ = this.storeService.hasMoreThanPageSize$;\n\n hasNotifications$ = this.storeService.hasNotifications$;\n\n notifications$ = this.storeService.notifications$;\n\n loading$ = this.storeService.loading$;\n\n private totalCount$ = this.bellService.unread$;\n\n noResultText$ = this\n .totalCount$\n .pipe(\n map((count:number) => (count > 0 ? this.text.no_results.with_current_filter : this.text.no_results.at_all)),\n );\n\n totalCountWarning$ = this\n .storeService\n .notLoaded$\n .pipe(\n filter((notLoaded) => notLoaded > 0),\n map((notLoaded:number) => this.I18n.t(\n 'js.notifications.center.total_count_warning',\n { newest_count: this.maxSize, more_count: notLoaded },\n )),\n );\n\n stateChanged$ = this.storeService.stateChanged$;\n\n originalOrder = ():number => 0;\n\n reasonMenuItems = [\n {\n key: 'mentioned',\n title: this.I18n.t('js.notifications.menu.mentioned'),\n },\n {\n key: 'assigned',\n title: this.I18n.t('js.label_assignee'),\n },\n {\n key: 'responsible',\n title: this.I18n.t('js.notifications.menu.accountable'),\n },\n {\n key: 'watched',\n title: this.I18n.t('js.notifications.menu.watched'),\n },\n {\n key: 'dateAlert',\n title: this.I18n.t('js.notifications.menu.date_alert'),\n },\n ];\n\n selectedFilter = this.reasonMenuItems.find((item) => item.key === this.uiRouterGlobals.params.name)?.title;\n\n image = {\n no_notification: imagePath('notification-center/empty-state-no-notification.svg'),\n no_selection: imagePath('notification-center/empty-state-no-selection.svg'),\n loading: imagePath('notification-center/notification_loading.gif'),\n };\n\n trackNotificationGroups = (i:number, item:INotification[]):string => item\n .map((el) => `${el.id}@${el.updatedAt}`)\n .join(',');\n\n text = {\n no_notification: this.I18n.t('js.notifications.center.empty_state.no_notification'),\n no_notification_with_current_filter_project: this.I18n.t('js.notifications.center.empty_state.no_notification_with_current_project_filter'),\n no_notification_with_current_filter: this.I18n.t('js.notifications.center.empty_state.no_notification_with_current_filter', { filter: this.selectedFilter }),\n no_selection: this.I18n.t('js.notifications.center.empty_state.no_selection'),\n change_notification_settings: this.I18n.t(\n 'js.notifications.settings.change_notification_settings',\n { url: this.pathService.myNotificationsSettingsPath() },\n ),\n title: this.I18n.t('js.notifications.title'),\n button_close: this.I18n.t('js.button_close'),\n no_results: {\n at_all: this.I18n.t('js.notifications.center.no_results.at_all'),\n with_current_filter: this.I18n.t('js.notifications.center.no_results.with_current_filter'),\n },\n };\n\n constructor(\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef,\n readonly I18n:I18nService,\n readonly storeService:IanCenterService,\n readonly bellService:IanBellService,\n readonly uiRouterGlobals:UIRouterGlobals,\n readonly state:StateService,\n readonly apiV3:ApiV3Service,\n readonly pathService:PathHelperService,\n ) {\n }\n\n ngOnInit():void {\n this.storeService.setFacet('unread');\n this.storeService.setFilters({\n filter: this.uiRouterGlobals.params.filter, // eslint-disable-line @typescript-eslint/no-unsafe-assignment\n name: this.uiRouterGlobals.params.name, // eslint-disable-line @typescript-eslint/no-unsafe-assignment\n });\n }\n\n noNotificationText(hasNotifications:boolean, totalNotifications:number):string {\n if (!(!hasNotifications && totalNotifications > 0)) {\n return this.text.no_notification;\n }\n return (this.uiRouterGlobals.params.filter === 'project' ? this.text.no_notification_with_current_filter_project : this.text.no_notification_with_current_filter);\n }\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n@Component({\n selector: 'op-notification-settings-button',\n templateUrl: './notification-settings-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NotificationSettingsButtonComponent {\n myNotificationSettingsLink = this.pathHelper.myNotificationsSettingsPath();\n\n text = {\n mySettings: this.I18n.t('js.notifications.settings.title'),\n };\n\n constructor(\n private I18n:I18nService,\n private pathHelper:PathHelperService,\n ) {\n }\n}\n","\n \n \n \n \n\n","\n \n \n \n \n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IanCenterService } from 'core-app/features/in-app-notifications/center/state/ian-center.service';\nimport {\n IAN_FACET_FILTERS,\n InAppNotificationFacet,\n} from 'core-app/features/in-app-notifications/center/state/ian-center.store';\n\n@Component({\n selector: 'op-activate-facet',\n templateUrl: './activate-facet-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ActivateFacetButtonComponent {\n text = {\n facets: {\n unread: this.I18n.t('js.notifications.facets.unread'),\n all: this.I18n.t('js.notifications.facets.all'),\n },\n facet_titles: {\n unread: this.I18n.t('js.notifications.facets.unread_title'),\n all: this.I18n.t('js.notifications.facets.all_title'),\n },\n };\n\n availableFacets = Object.keys(IAN_FACET_FILTERS);\n\n activeFacet$ = this.storeService.activeFacet$;\n\n constructor(\n private I18n:I18nService,\n private storeService:IanCenterService,\n ) {\n }\n\n activateFacet(facet:InAppNotificationFacet):void {\n this.storeService.setFacet(facet);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IanCenterService } from 'core-app/features/in-app-notifications/center/state/ian-center.service';\n\n@Component({\n selector: 'op-mark-all-as-read-button',\n templateUrl: './mark-all-as-read-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MarkAllAsReadButtonComponent {\n text = {\n mark_all_read: this.I18n.t('js.notifications.center.mark_all_read'),\n };\n\n constructor(\n private I18n:I18nService,\n private storeService:IanCenterService,\n ) {\n }\n\n markAllRead():void {\n this.storeService.markAllAsRead();\n }\n}\n","\n \n \n \n \n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Injector,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport {\n ToolbarButtonComponentDefinition,\n ViewPartitionState,\n} from 'core-app/features/work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component';\nimport {\n StateService,\n TransitionService,\n} from '@uirouter/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { NotificationSettingsButtonComponent } from 'core-app/features/in-app-notifications/center/toolbar/settings/notification-settings-button.component';\nimport { ActivateFacetButtonComponent } from 'core-app/features/in-app-notifications/center/toolbar/facet/activate-facet-button.component';\nimport { MarkAllAsReadButtonComponent } from 'core-app/features/in-app-notifications/center/toolbar/mark-all-as-read/mark-all-as-read-button.component';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { BackRoutingService } from 'core-app/features/work-packages/components/back-routing/back-routing.service';\nimport { IanCenterService } from 'core-app/features/in-app-notifications/center/state/ian-center.service';\nimport { OpTitleService } from 'core-app/core/html/op-title.service';\n\n@Component({\n templateUrl: '../../work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component.html',\n styleUrls: [\n '../../work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component.sass',\n ],\n providers: [\n IanCenterService,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InAppNotificationCenterPageComponent extends UntilDestroyedMixin implements OnInit, OnDestroy {\n text = {\n title: this.I18n.t('js.notifications.title'),\n };\n\n /** Disable the back button */\n backButtonCallback = undefined;\n\n /** Current query title to render */\n selectedTitle = this.text.title;\n\n /** Disable filter container for now */\n filterContainerDefinition = null;\n\n /** We need to pass the correct partition state to the view to manage the grid */\n currentPartition:ViewPartitionState = '-split';\n\n /** Show a toolbar */\n showToolbar = true;\n\n /** Toolbar is not editable */\n titleEditingEnabled = false;\n\n /** Listener callbacks */\n // eslint-disable-next-line @typescript-eslint/ban-types\n removeTransitionSubscription:Function;\n\n /** Not saveable */\n showToolbarSaveButton = false;\n\n /** Toolbar is always enabled */\n toolbarDisabled = false;\n\n /** Define the buttons shown in the toolbar */\n toolbarButtonComponents:ToolbarButtonComponentDefinition[] = [\n {\n component: ActivateFacetButtonComponent,\n containerClasses: 'form--field-inline-buttons-container',\n },\n {\n component: MarkAllAsReadButtonComponent,\n },\n {\n component: NotificationSettingsButtonComponent,\n containerClasses: 'hidden-for-mobile',\n },\n ];\n\n /** Global referrer set when coming to the notification center */\n private documentReferer:string;\n\n constructor(\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n readonly $transitions:TransitionService,\n readonly state:StateService,\n readonly injector:Injector,\n readonly apiV3Service:ApiV3Service,\n readonly backRoutingService:BackRoutingService,\n readonly titleService:OpTitleService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.documentReferer = document.referrer;\n\n this.setInitialHtmlTitle();\n\n this.removeTransitionSubscription = this.$transitions.onSuccess({}, ():any => {\n this.titleService.setFirstPart(this.text.title);\n });\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n this.removeTransitionSubscription();\n }\n\n /**\n * We need to set the current partition to the grid to ensure\n * either side gets expanded to full width if we're not in '-split' mode.\n *\n * @param state The current or entering state\n */\n setPartition(state:{ data:{ partition?:ViewPartitionState } }):void {\n this.currentPartition = state.data?.partition || '-split';\n }\n\n // For shared template compliance\n // eslint-disable-next-line class-methods-use-this\n updateTitleName(_val:string):void {\n }\n\n // For shared template compliance\n // eslint-disable-next-line class-methods-use-this\n changeChangesFromTitle(_val:string):void {\n }\n\n private setInitialHtmlTitle():void {\n const currentTitleParts = this.titleService.titleParts;\n\n // Prepend \"Notifications\" if only the application name is shown\n if (currentTitleParts.length === 1) {\n this.titleService.prependFirstPart(this.text.title);\n }\n\n // A click on the left side menu of the notification center newly triggers the center page (and thus the ngOnInit).\n // So the transition hook only works for changing the content of the split screen but not when switching for example\n // from \"watched\" to \"mentioned\".\n // So we override the first part in this case to make sure that there is not the name of a WP is shown when there is no split screen visible.\n if (currentTitleParts[0] !== this.text.title) {\n this.titleService.setFirstPart(this.text.title);\n }\n }\n}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { videoPath } from 'core-app/shared/helpers/videos/path-helper';\n\n@Component({\n selector: 'op-ian-date-alerts-upsale',\n templateUrl: './ian-date-alerts-upsale.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InAppNotificationsDateAlertsUpsaleComponent {\n video = videoPath('notification-center/date-alert-notifications.mp4');\n\n text = {\n title: this.I18n.t('js.notifications.date_alerts.upsale.title'),\n description: this.I18n.t('js.notifications.date_alerts.upsale.description'),\n };\n\n constructor(\n readonly I18n:I18nService,\n ) { }\n}\n","/**\n * Returns an absolute asset path from the assets/videos/ folder\n *\n * e.g., to access:\n * frontend/src/assets/videos/enterprise/date-alert-notification-settings.mp4\n *\n * use\n * imagePath('enterprise/date-alert-notification-settings.mp4')\n *\n *\n * @param video Path to the video starting from frontend/src/assets/videos\n */\nexport function videoPath(video:string):string {\n return `${__webpack_public_path__}assets/videos/${video}`;\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Ng2StateDeclaration } from '@uirouter/angular';\nimport { makeSplitViewRoutes } from 'core-app/features/work-packages/routing/split-view-routes.template';\nimport { WorkPackageSplitViewComponent } from 'core-app/features/work-packages/routing/wp-split-view/wp-split-view.component';\nimport { InAppNotificationCenterComponent } from 'core-app/features/in-app-notifications/center/in-app-notification-center.component';\nimport { InAppNotificationCenterPageComponent } from 'core-app/features/in-app-notifications/center/in-app-notification-center-page.component';\nimport { WorkPackagesBaseComponent } from 'core-app/features/work-packages/routing/wp-base/wp--base.component';\nimport { InAppNotificationsDateAlertsUpsaleComponent } from 'core-app/features/in-app-notifications/date-alerts-upsale/ian-date-alerts-upsale.component';\n\nexport interface INotificationPageQueryParameters {\n filter?:string;\n name?:string;\n}\n\nexport const IAN_ROUTES:Ng2StateDeclaration[] = [\n {\n name: 'notifications',\n parent: 'root',\n url: '/notifications?{filter:string}&{name:string}',\n data: {\n bodyClasses: 'router--work-packages-base',\n },\n redirectTo: 'notifications.center.show',\n views: {\n '!$default': { component: WorkPackagesBaseComponent },\n },\n },\n {\n url: '/date_alerts',\n name: 'notifications.date_alerts_upsale',\n component: InAppNotificationsDateAlertsUpsaleComponent,\n },\n {\n name: 'notifications.center',\n component: InAppNotificationCenterPageComponent,\n redirectTo: 'notifications.center.show',\n },\n {\n name: 'notifications.center.show',\n data: {\n baseRoute: 'notifications.center.show',\n },\n views: {\n 'content-left': { component: InAppNotificationCenterComponent },\n },\n },\n ...makeSplitViewRoutes(\n 'notifications.center.show',\n undefined,\n WorkPackageSplitViewComponent,\n ),\n];\n","import { NgModule } from '@angular/core';\nimport { OPSharedModule } from 'core-app/shared/shared.module';\nimport { CommonModule } from '@angular/common';\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\nimport { InAppNotificationBellComponent } from 'core-app/features/in-app-notifications/bell/in-app-notification-bell.component';\nimport { InAppNotificationEntryComponent } from 'core-app/features/in-app-notifications/entry/in-app-notification-entry.component';\nimport { OpenprojectPrincipalRenderingModule } from 'core-app/shared/components/principal/principal-rendering.module';\nimport { UIRouterModule } from '@uirouter/angular';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { IAN_ROUTES } from 'core-app/features/in-app-notifications/in-app-notifications.routes';\nimport { InAppNotificationCenterComponent } from 'core-app/features/in-app-notifications/center/in-app-notification-center.component';\nimport { InAppNotificationCenterPageComponent } from 'core-app/features/in-app-notifications/center/in-app-notification-center-page.component';\nimport { IanMenuComponent } from 'core-app/features/in-app-notifications/center/menu/menu.component';\nimport { OpenprojectWorkPackagesModule } from 'core-app/features/work-packages/openproject-work-packages.module';\nimport { DynamicModule } from 'ng-dynamic-component';\nimport { InAppNotificationStatusComponent } from './entry/status/in-app-notification-status.component';\nimport { NotificationSettingsButtonComponent } from './center/toolbar/settings/notification-settings-button.component';\nimport { ActivateFacetButtonComponent } from './center/toolbar/facet/activate-facet-button.component';\nimport { MarkAllAsReadButtonComponent } from './center/toolbar/mark-all-as-read/mark-all-as-read-button.component';\nimport { OpenprojectContentLoaderModule } from 'core-app/shared/components/op-content-loader/openproject-content-loader.module';\nimport { EmptyStateComponent } from './center/empty-state/empty-state.component';\nimport { IanBellService } from 'core-app/features/in-app-notifications/bell/state/ian-bell.service';\nimport { InAppNotificationActorsLineComponent } from './entry/actors-line/in-app-notification-actors-line.component';\nimport { InAppNotificationDateAlertComponent } from './entry/date-alert/in-app-notification-date-alert.component';\nimport { InAppNotificationsDateAlertsUpsaleComponent } from 'core-app/features/in-app-notifications/date-alerts-upsale/ian-date-alerts-upsale.component';\n\n@NgModule({\n declarations: [\n InAppNotificationBellComponent,\n InAppNotificationCenterComponent,\n InAppNotificationEntryComponent,\n InAppNotificationCenterPageComponent,\n InAppNotificationStatusComponent,\n NotificationSettingsButtonComponent,\n ActivateFacetButtonComponent,\n MarkAllAsReadButtonComponent,\n IanMenuComponent,\n EmptyStateComponent,\n InAppNotificationActorsLineComponent,\n InAppNotificationDateAlertComponent,\n InAppNotificationsDateAlertsUpsaleComponent,\n ],\n imports: [\n OPSharedModule,\n // Routes for /backlogs\n UIRouterModule.forChild({\n states: IAN_ROUTES,\n }),\n DynamicModule,\n CommonModule,\n IconModule,\n OpenprojectPrincipalRenderingModule,\n OpenprojectWorkPackagesModule,\n OpenprojectContentLoaderModule,\n ScrollingModule,\n ],\n providers: [\n IanBellService,\n ],\n})\nexport class OpenProjectInAppNotificationsModule {\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { InviteUserButtonComponent } from 'core-app/features/invite-user-modal/button/invite-user-button.component';\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\n\n@NgModule({\n declarations: [\n InviteUserButtonComponent,\n ],\n imports: [\n CommonModule,\n IconModule,\n ],\n exports: [\n InviteUserButtonComponent,\n ],\n})\nexport class InviteUserButtonModule { }\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, EventEmitter } from '@angular/core';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { InviteUserModalComponent } from './invite-user.component';\n\n/**\n * This service triggers user-invite modals to clicks on elements\n * with the attribute [invite-user-modal-augment] set.\n */\n@Injectable()\nexport class OpInviteUserModalService {\n public close = new EventEmitter();\n\n constructor(\n protected opModalService:OpModalService,\n protected currentProjectService:CurrentProjectService,\n ) {\n }\n\n public open(projectId:string|null = this.currentProjectService.id) {\n this.opModalService.show(\n InviteUserModalComponent,\n 'global',\n { projectId },\n ).subscribe((modal) => modal\n .closingEvent\n .subscribe((modal:InviteUserModalComponent) => {\n this.close.emit(modal.data);\n }));\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Inject,\n OnInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { PrincipalData } from 'core-app/shared/components/principal/principal-types';\nimport { RoleResource } from 'core-app/features/hal/resources/role-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\n\nenum Steps {\n ProjectSelection,\n Principal,\n Summary,\n Success,\n}\n\nexport enum PrincipalType {\n User = 'User',\n Placeholder = 'PlaceholderUser',\n Group = 'Group',\n}\n\n@Component({\n templateUrl: './invite-user.component.html',\n styleUrls: ['./invite-user.component.sass'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InviteUserModalComponent extends OpModalComponent implements OnInit {\n public Steps = Steps;\n\n public step = Steps.ProjectSelection;\n\n /* Data that is returned from the modal on close */\n public data:any = null;\n\n public type:PrincipalType|null = null;\n\n public project:ProjectResource|null = null;\n\n public principalData:PrincipalData = {\n principal: null,\n customFields: {},\n };\n\n public role:RoleResource|null = null;\n\n public message = '';\n\n public createdNewPrincipal = false;\n\n public get loading():boolean {\n return this.locals.projectId && !this.project;\n }\n\n constructor(\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef,\n readonly apiV3Service:ApiV3Service,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit():void {\n super.ngOnInit();\n\n if (this.locals.projectId) {\n this.apiV3Service.projects.id(this.locals.projectId).get().subscribe(\n (data) => {\n this.project = data;\n this.cdRef.markForCheck();\n },\n () => {\n this.locals.projectId = null;\n this.cdRef.markForCheck();\n },\n );\n }\n }\n\n onProjectSelectionSave({ type, project }:{ type:PrincipalType, project:ProjectResource|null }):void {\n this.type = type;\n this.project = project;\n this.goTo(Steps.Principal);\n }\n\n onPrincipalSave({\n principalData, isAlreadyMember, role, message,\n }:{ principalData:PrincipalData, isAlreadyMember:boolean, role:RoleResource, message:string }):void {\n this.principalData = principalData;\n this.role = role;\n this.message = message;\n if (isAlreadyMember) {\n return this.closeWithPrincipal();\n }\n\n return this.goTo(Steps.Summary);\n }\n\n onSuccessfulSubmission($event:{ principal:HalResource }):void {\n if (this.principalData.principal !== $event.principal && this.type === PrincipalType.User) {\n this.createdNewPrincipal = true;\n }\n this.principalData.principal = $event.principal;\n this.goTo(Steps.Success);\n }\n\n goTo(step:Steps):void {\n this.step = step;\n }\n\n closeWithPrincipal():void {\n this.data = this.principalData.principal;\n this.closeMe();\n }\n}\n","\n\n\n\n\n\n\n\n","\n {{ title }}\n\n
\n\n
\n
\n
\n \n
\n
\n
\n \n \n {{ text.download_starts }}\n \n \n \n

\n
    \n
  • \n
\n\n

\n \n \n \n

\n
\n
\n
\n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Inject,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n HttpClient,\n HttpErrorResponse,\n HttpResponse,\n} from '@angular/common/http';\nimport {\n Observable,\n timer,\n} from 'rxjs';\nimport {\n switchMap,\n takeWhile,\n} from 'rxjs/operators';\nimport {\n LoadingIndicatorService,\n withDelayedLoadingIndicator,\n} from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport {\n JobStatusEnum,\n JobStatusInterface,\n} from 'core-app/features/job-status/job-status.interface';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { EXTERNAL_REQUEST_HEADER } from 'core-app/features/hal/http/openproject-header-interceptor';\n\n@Component({\n templateUrl: './job-status.modal.html',\n styleUrls: ['./job-status.modal.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class JobStatusModalComponent extends OpModalComponent implements OnInit {\n public text = {\n title: this.I18n.t('js.job_status.title'),\n closePopup: this.I18n.t('js.close_popup_title'),\n redirect: this.I18n.t('js.job_status.redirect'),\n redirect_errors: `${this.I18n.t('js.job_status.redirect_errors')} `,\n redirect_link: this.I18n.t('js.job_status.redirect_link'),\n errors: this.I18n.t('js.job_status.errors'),\n download_starts: this.I18n.t('js.job_status.download_starts'),\n click_to_download: this.I18n.t('js.job_status.click_to_download'),\n };\n\n /** The job ID reference */\n public jobId:string;\n\n /** Whether to show the loading indicator */\n public isLoading = false;\n\n /** The current status */\n public status:JobStatusEnum;\n\n /** An associated icon to render, if any */\n public statusIcon:string|null;\n\n /** Public message to show */\n public message:string;\n\n /** Payload object of the response */\n public payload:any;\n\n /** Title to show */\n public title:string = this.text.title;\n\n /** A link in case the job results in a download */\n public downloadHref:string|null = null;\n\n @ViewChild('downloadLink') private downloadLink:ElementRef;\n\n constructor(@Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n readonly elementRef:ElementRef,\n readonly pathHelper:PathHelperService,\n readonly apiV3Service:ApiV3Service,\n readonly loadingIndicator:LoadingIndicatorService,\n readonly toastService:ToastService,\n readonly httpClient:HttpClient) {\n super(locals, cdRef, elementRef);\n\n this.jobId = locals.jobId;\n }\n\n ngOnInit() {\n super.ngOnInit();\n this.listenOnJobStatus();\n }\n\n private listenOnJobStatus() {\n timer(0, 2000)\n .pipe(\n switchMap(() => this.performRequest()),\n takeWhile((response) => !!response.body && this.continuedStatus(response.body), true),\n this.untilDestroyed(),\n withDelayedLoadingIndicator(this.loadingIndicator.getter('modal')),\n ).subscribe(\n (response) => this.onResponse(response),\n (error) => this.handleError(error),\n () => { this.isLoading = false; },\n );\n }\n\n private iconForStatus():string|null {\n switch (this.status) {\n case 'cancelled':\n case 'failure':\n case 'error':\n return 'icon-error';\n break;\n case 'success':\n return 'icon-checkmark';\n break;\n default:\n return null;\n }\n }\n\n /**\n * Determine whether the given status continues the timer\n * @param response\n */\n private continuedStatus(response:JobStatusInterface) {\n return ['in_queue', 'in_process'].includes(response.status);\n }\n\n private onResponse(response:HttpResponse) {\n const { body } = response;\n\n if (!body) {\n throw new Error(response as any);\n }\n\n const status = this.status = body.status;\n\n this.message = body.message\n || this.I18n.t(`js.job_status.generic_messages.${status}`, { defaultValue: status });\n\n this.payload = body.payload;\n if (body.payload) {\n this.title = body.payload.title || this.text.title;\n this.handleRedirect(body.payload);\n this.handleDownload(body.payload?.download);\n }\n\n this.statusIcon = this.iconForStatus();\n this.cdRef.detectChanges();\n }\n\n private handleRedirect(payload:JobStatusInterface['payload']) {\n if (payload?.redirect && !payload?.errors) {\n setTimeout(() => { window.location.href = payload.redirect as string; }, 2000);\n this.message += `. ${this.text.redirect}`;\n }\n }\n\n private handleDownload(redirectionUrl?:string) {\n if (redirectionUrl !== undefined) {\n // Get the file url from the redirectionUrl\n this.httpClient\n .get(redirectionUrl, {\n observe: 'response',\n responseType: 'text',\n // This might or might not be an external request (depending on the configuration of an S3 storage)\n // But not having headers like X-CSRF-TOKEN set works in both cases.\n headers: {\n [EXTERNAL_REQUEST_HEADER]: 'true',\n },\n })\n .subscribe((response) => {\n this.downloadHref = response.url;\n\n this.cdRef.detectChanges();\n this.downloadLink.nativeElement.click();\n }, (error:HttpErrorResponse) => {\n // In this case, most typically, there is a CORS error.\n // Instead of failing completely, we show a manual link for the user to click themselves.\n if (error.status === 0) {\n this.downloadHref = redirectionUrl;\n\n this.cdRef.detectChanges();\n }\n });\n }\n }\n\n private performRequest():Observable> {\n return this\n .httpClient\n .get(\n this.jobUrl,\n { observe: 'response', responseType: 'json' },\n );\n }\n\n private handleError(error:HttpErrorResponse) {\n if (error?.status === 404) {\n this.statusIcon = 'icon-help';\n this.message = this.I18n.t('js.job_status.generic_messages.not_found');\n } else {\n this.statusIcon = 'icon-error';\n this.message = error?.message || this.I18n.t('js.error.internal');\n this.toastService.addError(this.message);\n }\n\n this.cdRef.detectChanges();\n }\n\n private get jobUrl():string {\n return this.apiV3Service.job_statuses.id(this.jobId).toString();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HookService {\n private hooks:{ [hook:string]:Function[] } = {};\n\n public register(id:string, callback:Function) {\n if (!callback) {\n return;\n }\n\n if (!this.hooks[id]) {\n this.hooks[id] = [];\n }\n\n this.hooks[id].push(callback);\n }\n\n public call(id:string, ...params:any[]):any[] {\n const results = [];\n\n if (this.hooks[id]) {\n for (let x = 0; x < this.hooks[id].length; x++) {\n const result = this.hooks[id][x](...params);\n\n if (result) {\n results.push(result);\n }\n }\n }\n\n return results;\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { StateService } from '@uirouter/core';\nimport { IOPFormlyFieldSettings } from 'core-app/shared/components/dynamic-forms/typings';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\n\n@Component({\n selector: 'app-projects',\n templateUrl: './projects.component.html',\n styleUrls: ['./projects.component.scss'],\n})\nexport class ProjectsComponent extends UntilDestroyedMixin implements OnInit {\n projectsPath:string;\n\n formMethod = 'patch';\n\n text:{ [key:string]:string };\n\n dynamicFieldsSettingsPipe:(dynamicFieldsSettings:IOPFormlyFieldSettings[]) => IOPFormlyFieldSettings[];\n\n hiddenFields = ['identifier', 'active'];\n\n constructor(\n private _pathHelperService:PathHelperService,\n private _$state:StateService,\n private _currentProjectService:CurrentProjectService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.projectsPath = this._currentProjectService.apiv3Path!;\n this.dynamicFieldsSettingsPipe = (dynamicFieldsSettings) => dynamicFieldsSettings\n .reduce((formattedDynamicFieldsSettings:IOPFormlyFieldSettings[], dynamicFormField) => {\n if (this.isFieldHidden(dynamicFormField.key)) {\n dynamicFormField = {\n ...dynamicFormField,\n hide: true,\n };\n }\n\n return [...formattedDynamicFieldsSettings, dynamicFormField];\n }, []);\n }\n\n private isFieldHidden(name:string|undefined) {\n return this.hiddenFields.includes(name || '');\n }\n}\n","","import { Component, OnInit, ViewChild } from '@angular/core';\nimport { StateService, UIRouterGlobals } from '@uirouter/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { IDynamicFieldGroupConfig, IOPFormlyFieldSettings } from 'core-app/shared/components/dynamic-forms/typings';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { map } from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { JobStatusModalComponent } from 'core-app/features/job-status/job-status-modal/job-status.modal';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { DynamicFormComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-form/dynamic-form.component';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport interface ProjectTemplateOption {\n href:string|null;\n name:string;\n}\n\n@Component({\n selector: 'op-new-project',\n templateUrl: './new-project.component.html',\n styleUrls: ['./new-project.component.sass'],\n})\nexport class NewProjectComponent extends UntilDestroyedMixin implements OnInit {\n formUrl:string|null;\n\n resourcePath:string;\n\n dynamicFieldsSettingsPipe = this.fieldSettingsPipe.bind(this);\n\n fieldGroups:IDynamicFieldGroupConfig[];\n\n initialPayload:Record = {};\n\n text = {\n use_template: this.I18n.t('js.project.use_template'),\n no_template_selected: this.I18n.t('js.project.no_template_selected'),\n advancedSettingsLabel: this.I18n.t('js.forms.advanced_settings'),\n copySettingsLabel: this.I18n.t('js.project.copy.copy_options'),\n };\n\n hiddenFields:string[] = [\n 'identifier',\n 'active',\n ];\n\n copyableTemplateFilter = new ApiV3FilterBuilder()\n .add('user_action', '=', ['projects/copy']) // no null values\n .add('templated', '=', true);\n\n templateOptions$:Observable =\n this\n .apiV3Service\n .projects\n .filtered(\n this.copyableTemplateFilter,\n { pageSize: '-1' },\n )\n .get()\n .pipe(\n map((response) => response.elements.map((el:HalResource) => ({ href: el.href, name: el.name }))),\n );\n\n templateForm = new FormGroup({\n template: new FormControl(),\n });\n\n get templateControl() {\n return this.templateForm.get('template');\n }\n\n @ViewChild(DynamicFormComponent) dynamicForm:DynamicFormComponent;\n\n constructor(\n private apiV3Service:ApiV3Service,\n private uIRouterGlobals:UIRouterGlobals,\n private pathHelperService:PathHelperService,\n private modalService:OpModalService,\n private $state:StateService,\n private I18n:I18nService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.resourcePath = this.apiV3Service.projects.path;\n this.fieldGroups = [{\n name: this.text.advancedSettingsLabel,\n fieldsFilter: (field) => !['name', 'parent'].includes(field.templateOptions?.property as string)\n && !this.isMeta(field.templateOptions?.property)\n && !(field.templateOptions?.required\n && !field.templateOptions.hasDefault\n && field.templateOptions.payloadValue == null),\n },\n {\n name: this.text.copySettingsLabel,\n fieldsFilter: (field:IOPFormlyFieldSettings) => this.isMeta(field.templateOptions?.property),\n }];\n\n if (this.uIRouterGlobals.params.parent_id) {\n this.setParentAsPayload(this.uIRouterGlobals.params.parent_id);\n }\n }\n\n onSubmitted(response:HalSource) {\n if (response._type === 'JobStatus') {\n this.modalService.show(JobStatusModalComponent, 'global', { jobId: response.jobId });\n } else {\n window.location.href = this.pathHelperService.projectPath(response.identifier as string);\n }\n }\n\n onTemplateSelected(selected:{ href:string|null }) {\n this.initialPayload = {\n ...this.initialPayload,\n name: this.dynamicForm.model.name,\n _meta: {\n ...(this.initialPayload?._meta as Record),\n sendNotifications: false,\n },\n };\n this.formUrl = selected?.href ? `${selected.href}/copy` : null;\n }\n\n private isHiddenField(key:string|undefined):boolean {\n // We explicitly want to show the sendNotifications param\n if (key === '_meta.sendNotifications') {\n return false;\n }\n\n return !!key && (this.hiddenFields.includes(key) || this.isMeta(key));\n }\n\n private isMeta(property:string|undefined):boolean {\n return !!property && (property.startsWith('copy') || property === 'sendNotifications');\n }\n\n private setParentAsPayload(parentId:string) {\n const href = this.apiV3Service.projects.id(parentId).path;\n\n this.initialPayload = {\n _links: {\n parent: {\n href,\n },\n },\n };\n }\n\n private fieldSettingsPipe(dynamicFieldsSettings:IOPFormlyFieldSettings[]):IOPFormlyFieldSettings[] {\n return dynamicFieldsSettings.map((field) => ({ ...field, hide: this.isHiddenField(field.key) }));\n }\n}\n","\n
\n \n \n \n \n
\n\n\n","import {\n IDynamicFieldGroupConfig,\n IOPFormlyFieldSettings,\n IOPFormlyTemplateOptions,\n} from 'core-app/shared/components/dynamic-forms/typings';\nimport { JobStatusModalComponent } from 'core-app/features/job-status/job-status-modal/job-status.modal';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { Component, OnInit } from '@angular/core';\nimport { StateService } from '@uirouter/core';\n\n@Component({\n selector: 'op-copy-project',\n templateUrl: './copy-project.component.html',\n})\nexport class CopyProjectComponent extends UntilDestroyedMixin implements OnInit {\n dynamicFieldsSettingsPipe = this.fieldSettingsPipe.bind(this);\n\n fieldGroups:IDynamicFieldGroupConfig[];\n\n formUrl:string;\n\n hiddenFields:string[] = [\n 'identifier',\n 'active',\n ];\n\n text = {\n advancedSettingsLabel: this.I18n.t('js.forms.advanced_settings'),\n copySettingsLabel: this.I18n.t('js.project.copy.copy_options'),\n };\n\n constructor(\n private apiV3Service:ApiV3Service,\n private currentProjectService:CurrentProjectService,\n private pathHelperService:PathHelperService,\n private modalService:OpModalService,\n private $state:StateService,\n private I18n:I18nService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.formUrl = this.apiV3Service.projects.id(this.currentProjectService.id!).copy.form.path;\n this.fieldGroups = [\n {\n name: this.text.advancedSettingsLabel,\n fieldsFilter: (field:IOPFormlyFieldSettings) => !this.isMeta(field.templateOptions?.property) && !this.isPrimaryAttribute(field.templateOptions),\n },\n {\n name: this.text.copySettingsLabel,\n fieldsFilter: (field:IOPFormlyFieldSettings) => this.isMeta(field.templateOptions?.property),\n },\n ];\n }\n\n onSubmitted(response:HalSource) {\n this.modalService.show(JobStatusModalComponent, 'global', { jobId: response.jobId });\n }\n\n private isHiddenField(key:string|undefined):boolean {\n return !!key && this.hiddenFields.includes(key);\n }\n\n private fieldSettingsPipe(dynamicFieldsSettings:IOPFormlyFieldSettings[]):IOPFormlyFieldSettings[] {\n return this.sortedCopyFields(dynamicFieldsSettings)\n .map((field) => ({ ...field, hide: this.isHiddenField(field.key) }));\n }\n\n private isPrimaryAttribute(to?:IOPFormlyTemplateOptions):boolean {\n if (!to) {\n return false;\n }\n\n return (to.required\n && !to.hasDefault\n && to.payloadValue == null)\n || to.property === 'name'\n || to.property === 'parent';\n }\n\n private isMeta(property:string|undefined):boolean {\n return !!property && (property.startsWith('copy') || property === 'sendNotifications');\n }\n\n // Sorts the copy options by their label.\n // The order of the rest of the fields is left unchanged but all copy options are returned first.\n private sortedCopyFields(dynamicFieldsSettings:IOPFormlyFieldSettings[]):IOPFormlyFieldSettings[] {\n const sortedCopyFields = dynamicFieldsSettings\n .filter((field) => field.key && field.key.startsWith('_meta.copy'))\n .sort((fieldA, fieldB) => {\n if (!fieldA.templateOptions\n || !fieldA.templateOptions.label\n || !fieldB.templateOptions\n || !fieldB.templateOptions.label) {\n return 0;\n }\n\n return fieldA.templateOptions.label.localeCompare(fieldB.templateOptions.label);\n });\n\n const nonCopyFields = dynamicFieldsSettings\n .filter((field) => !field.key || !field.key.startsWith('_meta.copy'));\n\n // Now all copy fields are before the non Copy fields.\n // That way, the \"Sent notifications\" is after the copy fields.\n // For the rest, it does not make a difference since the _meta\n // fields are rendered in a separate group.\n return sortedCopyFields.concat(nonCopyFields);\n }\n}\n","","import { Ng2StateDeclaration, UIRouter } from '@uirouter/angular';\nimport { ProjectsComponent } from 'core-app/features/projects/components/projects/projects.component';\nimport { NewProjectComponent } from 'core-app/features/projects/components/new-project/new-project.component';\nimport { CopyProjectComponent } from 'core-app/features/projects/components/copy-project/copy-project.component';\n\nexport const PROJECTS_ROUTES:Ng2StateDeclaration[] = [\n {\n name: 'project_settings',\n parent: 'optional_project',\n url: '/settings/general/',\n component: ProjectsComponent,\n },\n {\n name: 'project_copy',\n parent: 'optional_project',\n url: '/copy',\n component: CopyProjectComponent,\n },\n {\n name: 'new_project',\n url: '/projects/new?parent_id',\n component: NewProjectComponent,\n },\n];\n\nexport function uiRouterProjectsConfiguration(uiRouter:UIRouter) {\n // Ensure projects/ are being redirected correctly\n // cf., https://community.openproject.com/wp/29754\n uiRouter.urlService.rules\n .when(\n new RegExp('^/projects/(.*)/settings/general$'),\n (match:string[]) => `/projects/${match[1]}/settings/general/`,\n );\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { NgModule } from '@angular/core';\nimport { OpenprojectHalModule } from 'core-app/features/hal/openproject-hal.module';\nimport { UIRouterModule } from '@uirouter/angular';\nimport { OpenprojectFieldsModule } from 'core-app/shared/components/fields/openproject-fields.module';\nimport { PROJECTS_ROUTES, uiRouterProjectsConfiguration } from 'core-app/features/projects/projects-routes';\nimport { DynamicFormsModule } from 'core-app/shared/components/dynamic-forms/dynamic-forms.module';\nimport { NewProjectComponent } from 'core-app/features/projects/components/new-project/new-project.component';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { OPSharedModule } from 'core-app/shared/shared.module';\nimport { CopyProjectComponent } from 'core-app/features/projects/components/copy-project/copy-project.component';\nimport { ProjectsComponent } from './components/projects/projects.component';\n\n@NgModule({\n imports: [\n // Commons\n OPSharedModule,\n ReactiveFormsModule,\n\n OpenprojectHalModule,\n OpenprojectFieldsModule,\n UIRouterModule.forChild({\n states: PROJECTS_ROUTES,\n config: uiRouterProjectsConfiguration,\n }),\n DynamicFormsModule,\n ],\n declarations: [\n ProjectsComponent,\n NewProjectComponent,\n CopyProjectComponent,\n ],\n})\nexport class OpenprojectProjectsModule {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { BackRoutingService } from 'core-app/features/work-packages/components/back-routing/back-routing.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n@Component({\n templateUrl: './back-button.component.html',\n styleUrls: ['./back-button.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'op-back-button',\n})\nexport class BackButtonComponent {\n @Input() public linkClass:string;\n\n @Input() public customBackMethod:() => unknown;\n\n public text = {\n goBack: this.I18n.t('js.button_back'),\n };\n\n constructor(readonly backRoutingService:BackRoutingService,\n readonly I18n:I18nService) {\n }\n\n public goBack():void {\n if (this.customBackMethod) {\n this.customBackMethod();\n } else {\n this.backRoutingService.goBack();\n }\n }\n}\n","\n \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { StateService, Transition } from '@uirouter/core';\nimport { KeepTabService } from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport interface BackRouteOptions {\n name:string;\n params:{};\n parent:string;\n baseRoute:string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class BackRoutingService {\n @InjectField() private $state:StateService;\n\n @InjectField() private keepTab:KeepTabService;\n\n private _backRoute:BackRouteOptions;\n\n constructor(readonly injector:Injector) {\n }\n\n private goToOtherState(route:string, params:Record):Promise {\n return this.$state.go(route, params);\n }\n\n private goBackToDetailsState(preferListOverSplit:boolean, baseRoute:string):void {\n if (preferListOverSplit) {\n this.goToOtherState(baseRoute, this.backRoute.params);\n } else {\n const state = `${baseRoute}.details.tabs`;\n const params = { ...this.backRoute.params, tabIdentifier: this.keepTab.currentDetailsTab };\n this.goToOtherState(state, params);\n }\n }\n\n private goBackNotToDetailsState():void {\n if (this.backRoute.parent) {\n this.goToOtherState(this.backRoute.name, this.backRoute.params).then(() => {\n this.$state.reload();\n });\n } else {\n this.goToOtherState(this.backRoute.name, this.backRoute.params);\n }\n }\n\n private goBackToPreviousState(preferListOverSplit:boolean, baseRoute:string):void {\n if (this.keepTab.isDetailsState(this.backRoute.parent)) {\n this.goBackToDetailsState(preferListOverSplit, baseRoute);\n } else {\n this.goBackNotToDetailsState();\n }\n }\n\n public goBack(preferListOverSplit = false) {\n // Default: back to list\n // When coming from a deep link or a create form\n const baseRoute = this.backRoute?.baseRoute || this.$state.current.data.baseRoute || 'work-packages.partitioned.list';\n // if we are in the first state\n if (!this.backRoute && baseRoute.includes('show')) {\n this.$state.reload();\n } else if (!this.backRoute || this.backRoute.name.includes('new')) {\n this.$state.go(baseRoute, this.$state.params);\n } else {\n this.goBackToPreviousState(preferListOverSplit, baseRoute);\n }\n }\n\n public goToBaseState() {\n const baseRoute = this.$state.current.data.baseRoute || 'work-packages.partitioned.list';\n this.$state.go(baseRoute, this.$state.params);\n }\n\n public sync(transition:Transition) {\n const fromState = transition.from();\n const toState = transition.to();\n\n // Set backRoute to know where we came from\n if (fromState.name\n && fromState.data\n && toState.data\n && fromState.data.parent !== toState.data.parent) {\n const paramsFromCopy = { ...transition.params('from') };\n this.backRoute = {\n name: fromState.name,\n params: paramsFromCopy,\n parent: fromState.data.parent,\n baseRoute: fromState.data.baseRoute,\n };\n }\n }\n\n public set backRoute(route:BackRouteOptions) {\n this._backRoute = route;\n }\n\n public get backRoute():BackRouteOptions {\n return this._backRoute;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { EditFormComponent } from 'core-app/shared/components/fields/edit/edit-form/edit-form.component';\n\n@Component({\n templateUrl: './wp-edit-actions-bar.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'wp-edit-actions-bar',\n})\nexport class WorkPackageEditActionsBarComponent {\n @Output('onSave') public onSave = new EventEmitter();\n\n @Output('onCancel') public onCancel = new EventEmitter();\n\n public _saving = false;\n\n public text = {\n save: this.I18n.t('js.button_save'),\n cancel: this.I18n.t('js.button_cancel'),\n };\n\n constructor(private I18n:I18nService,\n private editForm:EditFormComponent,\n private cdRef:ChangeDetectorRef) {\n }\n\n public set saving(active:boolean) {\n this._saving = active;\n this.cdRef.detectChanges();\n }\n\n public get saving() {\n return this._saving;\n }\n\n public save():void {\n if (this.saving) {\n return;\n }\n\n this.saving = true;\n this.editForm\n .submit()\n .then(() => {\n this.saving = false;\n this.onSave.emit();\n })\n .catch(() => {\n this.saving = false;\n });\n }\n\n public cancel():void {\n this.editForm.cancel();\n this.onCancel.emit();\n }\n}\n","
\n \n \n \n \n \n \n \n \n
\n","\n \n \n\n\n\n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n Output,\n\n} from '@angular/core';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { Observable } from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { WorkPackageFiltersService } from 'core-app/features/work-packages/components/filters/wp-filters/wp-filters.service';\n\n@Component({\n templateUrl: './filter-container.directive.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'op-filter-container',\n})\nexport class WorkPackageFilterContainerComponent extends UntilDestroyedMixin implements OnInit, OnDestroy {\n @Input('showFilterButton') showFilterButton = false;\n\n @Input('filterButtonText') filterButtonText:string = I18n.t('js.button_filter');\n\n @Output() public filtersChanged = new DebouncedEventEmitter(componentDestroyed(this));\n\n public visible$:Observable;\n\n public filters = this.wpTableFilters.current;\n\n public loaded = false;\n\n constructor(\n readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly cdRef:ChangeDetectorRef,\n readonly wpFiltersService:WorkPackageFiltersService,\n ) {\n super();\n this.visible$ = this.wpFiltersService.observeUntil(componentDestroyed(this));\n }\n\n ngOnInit():void {\n this.wpTableFilters\n .pristine$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n this.filters = this.wpTableFilters.current;\n this.loaded = true;\n this.cdRef.detectChanges();\n });\n }\n\n public replaceIfComplete(filters:QueryFilterInstanceResource[]) {\n const available = filters.filter((el) => this.wpTableFilters.isAvailable(el));\n this.wpTableFilters.replaceIfComplete(available);\n this.filtersChanged.emit(available);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, EventEmitter, Output } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { Subject } from 'rxjs';\nimport {\n debounceTime, distinctUntilChanged, map, tap,\n} from 'rxjs/operators';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { input } from 'reactivestates';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { QueryFilterResource } from 'core-app/features/hal/resources/query-filter-resource';\n\n@Component({\n selector: 'wp-filter-by-text-input',\n templateUrl: './quick-filter-by-text-input.html',\n})\n\nexport class WorkPackageFilterByTextInputComponent extends UntilDestroyedMixin {\n @Output() public deactivateFilter = new EventEmitter();\n\n public text = {\n createWithDropdown: this.I18n.t('js.work_packages.create.button'),\n createButton: this.I18n.t('js.label_work_package'),\n explanation: this.I18n.t('js.label_create_work_package'),\n placeholder: this.I18n.t('js.work_packages.placeholder_filter_by_text'),\n };\n\n /** Observable to the current search filter term */\n public searchTerm = input('');\n\n /** Input for search requests */\n public searchTermChanged:Subject = new Subject();\n\n constructor(readonly I18n:I18nService,\n readonly querySpace:IsolatedQuerySpace,\n readonly wpTableFilters:WorkPackageViewFiltersService) {\n super();\n\n this.wpTableFilters\n .pristine$()\n .pipe(\n this.untilDestroyed(),\n map(() => {\n const currentSearchFilter = this.wpTableFilters.find('search');\n return currentSearchFilter ? (currentSearchFilter.values[0] as string) : '';\n }),\n )\n .subscribe((upstreamTerm:string) => {\n console.log(`upstream ${upstreamTerm} ${(this.searchTerm as any).timestampOfLastValue}`);\n if (!this.searchTerm.value || this.searchTerm.isValueOlderThan(500)) {\n console.log(`Upstream value setting to ${upstreamTerm}`);\n this.searchTerm.putValue(upstreamTerm);\n }\n });\n\n this.searchTermChanged\n .pipe(\n this.untilDestroyed(),\n distinctUntilChanged(),\n tap((val) => this.searchTerm.putValue(val)),\n debounceTime(500),\n )\n .subscribe((term) => {\n if (term.length > 0) {\n this.wpTableFilters.replace('search', (filter) => {\n filter.operator = filter.findOperator('**')!;\n filter.values = [term];\n });\n } else {\n const filter = this.wpTableFilters.find('search');\n\n this.wpTableFilters.remove(filter!);\n\n this.deactivateFilter.emit(filter);\n }\n });\n }\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component, EventEmitter, Input, Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\n\n@Component({\n selector: 'op-filter-boolean-value',\n templateUrl: './filter-boolean-value.component.html',\n})\nexport class FilterBooleanValueComponent {\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new EventEmitter();\n\n constructor(readonly I18n:I18nService) {\n }\n\n public get value():HalResource | string {\n return this.filter.values[0];\n }\n\n public onFilterUpdated(val:string | HalResource) {\n this.filter.values[0] = val;\n this.filterChanged.emit(this.filter);\n }\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, Input, Output } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { QueryFilterResource } from 'core-app/features/hal/resources/query-filter-resource';\n\n@Component({\n selector: 'op-filter-integer-value',\n templateUrl: './filter-integer-value.component.html',\n})\nexport class FilterIntegerValueComponent extends UntilDestroyedMixin {\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new DebouncedEventEmitter(componentDestroyed(this));\n\n constructor(readonly I18n:I18nService,\n readonly schemaCache:SchemaCacheService) {\n super();\n }\n\n public get value() {\n return parseInt(this.filter.values[0] as string);\n }\n\n public set value(val) {\n if (typeof (val) === 'number') {\n this.filter.values = [val.toString()];\n } else {\n this.filter.values = [];\n }\n\n this.filterChanged.emit(this.filter);\n }\n\n public get unit() {\n switch ((this.schema.filter.allowedValues as QueryFilterResource[])[0].id) {\n case 'startDate':\n case 'dueDate':\n case 'updatedAt':\n case 'createdAt':\n return this.I18n.t('js.work_packages.time_relative.days');\n default:\n return '';\n }\n }\n\n private get schema() {\n return this.schemaCache.of(this.filter);\n }\n}\n","
\n \n \n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, Input, Output } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\n\n@Component({\n selector: 'op-filter-date-value',\n templateUrl: './filter-date-value.component.html',\n})\nexport class FilterDateValueComponent extends UntilDestroyedMixin {\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new DebouncedEventEmitter(componentDestroyed(this));\n\n constructor(readonly timezoneService:TimezoneService,\n readonly I18n:I18nService) {\n super();\n }\n\n public get value():HalResource|string {\n return this.filter.values[0];\n }\n\n public set value(val) {\n this.filter.values = [val as string];\n this.filterChanged.emit(this.filter);\n }\n\n public parser(data:any) {\n if (moment(data, 'YYYY-MM-DD', true).isValid()) {\n return data;\n }\n return null;\n }\n\n public formatter(data:any) {\n if (moment(data, 'YYYY-MM-DD', true).isValid()) {\n const d = this.timezoneService.parseDate(data);\n return this.timezoneService.formattedISODate(d);\n }\n return null;\n }\n}\n","
\n \n \n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { Component, Input, Output } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport * as moment from 'moment';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\n\n@Component({\n selector: 'op-filter-dates-value',\n templateUrl: './filter-dates-value.component.html',\n})\nexport class FilterDatesValueComponent extends UntilDestroyedMixin {\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new DebouncedEventEmitter(componentDestroyed(this));\n\n readonly text = {\n spacer: this.I18n.t('js.filter.value_spacer'),\n };\n\n constructor(readonly timezoneService:TimezoneService,\n readonly I18n:I18nService) {\n super();\n }\n\n public get begin():any {\n return this.filter.values[0];\n }\n\n public set begin(val:any) {\n this.filter.values[0] = val || '';\n this.filterChanged.emit(this.filter);\n }\n\n public get end():HalResource|string {\n return this.filter.values[1];\n }\n\n public set end(val) {\n this.filter.values[1] = val || '';\n this.filterChanged.emit(this.filter);\n }\n\n public parser(data:any) {\n if (moment(data, 'YYYY-MM-DD', true).isValid()) {\n return data;\n }\n return null;\n }\n\n public formatter(data:any) {\n if (moment(data, 'YYYY-MM-DD', true).isValid()) {\n const d = this.timezoneService.parseDate(data);\n return this.timezoneService.formattedISODate(d);\n }\n return null;\n }\n}\n","
\n \n \n\n \n \n\n \n \n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Moment } from 'moment';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OnInit, Directive } from '@angular/core';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\n\n@Directive()\nexport abstract class AbstractDateTimeValueController extends UntilDestroyedMixin implements OnInit {\n public filter:QueryFilterInstanceResource;\n\n constructor(protected I18n:I18nService,\n protected timezoneService:TimezoneService) {\n super();\n }\n\n ngOnInit() {\n _.remove(this.filter.values as string[], (value) => !this.timezoneService.isValidISODateTime(value));\n }\n\n public abstract get lowerBoundary():Moment|null;\n\n public abstract get upperBoundary():Moment|null;\n\n public isoDateParser(data:any) {\n if (!this.timezoneService.isValidISODate(data)) {\n return '';\n }\n const d = this.timezoneService.parseISODatetime(data);\n return this.timezoneService.formattedISODateTime(d);\n }\n\n public isoDateFormatter(data:any) {\n if (!this.timezoneService.isValidISODateTime(data)) {\n return '';\n }\n const d = this.timezoneService.parseISODatetime(data);\n return this.timezoneService.formattedISODate(d);\n }\n\n public get isTimeZoneDifferent() {\n const value = this.lowerBoundary || this.upperBoundary;\n\n if (!value) {\n return false;\n }\n return value.hours() !== 0 || value.minutes() !== 0;\n }\n\n public get timeZoneText() {\n if (this.lowerBoundary && this.upperBoundary) {\n return this.I18n.t('js.filter.time_zone_converted.two_values',\n {\n from: this.lowerBoundary.format('YYYY-MM-DD HH:mm'),\n to: this.upperBoundary.format('YYYY-MM-DD HH:mm'),\n });\n } if (this.upperBoundary) {\n return this.I18n.t('js.filter.time_zone_converted.only_end',\n { to: this.upperBoundary.format('YYYY-MM-DD HH:mm') });\n } if (this.lowerBoundary) {\n return this.I18n.t('js.filter.time_zone_converted.only_start',\n { from: this.lowerBoundary.format('YYYY-MM-DD HH:mm') });\n }\n\n return '';\n }\n}\n","
\n \n \n \n \n \n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component, Input, OnInit, Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport { Moment } from 'moment';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { AbstractDateTimeValueController } from '../abstract-filter-date-time-value/abstract-filter-date-time-value.controller';\n\n@Component({\n selector: 'op-filter-date-time-value',\n templateUrl: './filter-date-time-value.component.html',\n})\nexport class FilterDateTimeValueComponent extends AbstractDateTimeValueController implements OnInit {\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new DebouncedEventEmitter(componentDestroyed(this));\n\n constructor(readonly I18n:I18nService,\n readonly timezoneService:TimezoneService) {\n super(I18n, timezoneService);\n }\n\n public get value():HalResource|string {\n return this.filter.values[0];\n }\n\n public get valueString() {\n return this.filter.values[0].toString();\n }\n\n public set value(val) {\n this.filter.values = [val as string];\n this.filterChanged.emit(this.filter);\n }\n\n public get lowerBoundary():Moment|null {\n if (this.value && this.timezoneService.isValidISODateTime(this.valueString)) {\n return this.timezoneService.parseDatetime(this.valueString);\n }\n\n return null;\n }\n\n public get upperBoundary():Moment|null {\n if (this.value && this.timezoneService.isValidISODateTime(this.valueString)) {\n return this.timezoneService.parseDatetime(this.valueString).add(24, 'hours');\n }\n\n return null;\n }\n}\n","
\n \n \n\n \n \n\n \n \n \n \n \n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { Moment } from 'moment';\nimport {\n Component, Input, OnInit, Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { AbstractDateTimeValueController } from '../abstract-filter-date-time-value/abstract-filter-date-time-value.controller';\n\n@Component({\n selector: 'op-filter-date-times-value',\n templateUrl: './filter-date-times-value.component.html',\n})\nexport class FilterDateTimesValueComponent extends AbstractDateTimeValueController implements OnInit {\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new DebouncedEventEmitter(componentDestroyed(this));\n\n readonly text = {\n spacer: this.I18n.t('js.filter.value_spacer'),\n };\n\n constructor(readonly I18n:I18nService,\n readonly timezoneService:TimezoneService) {\n super(I18n, timezoneService);\n }\n\n public get begin():HalResource|string {\n return this.filter.values[0];\n }\n\n public set begin(val) {\n this.filter.values[0] = val || '';\n this.filterChanged.emit(this.filter);\n }\n\n public get end() {\n return this.filter.values[1];\n }\n\n public set end(val) {\n this.filter.values[1] = val || '';\n this.filterChanged.emit(this.filter);\n }\n\n public get lowerBoundary():Moment|null {\n if (this.begin && this.timezoneService.isValidISODateTime(this.begin.toString())) {\n return this.timezoneService.parseDatetime(this.begin.toString());\n }\n return null;\n }\n\n public get upperBoundary():Moment|null {\n if (this.end && this.timezoneService.isValidISODateTime(this.end.toString())) {\n return this.timezoneService.parseDatetime(this.end.toString());\n }\n return null;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, Input, Output } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\n\n@Component({\n selector: 'op-filter-string-value',\n templateUrl: './filter-string-value.component.html',\n})\nexport class FilterStringValueComponent extends UntilDestroyedMixin {\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new DebouncedEventEmitter(componentDestroyed(this));\n\n readonly text = {\n enter_text: this.I18n.t('js.work_packages.description_enter_text'),\n };\n\n constructor(readonly I18n:I18nService) {\n super();\n }\n\n public get value():HalResource|string {\n return this.filter.values[0];\n }\n\n public set value(val) {\n if (val.length) {\n this.filter.values[0] = val;\n } else {\n this.filter.values.length = 0;\n }\n this.filterChanged.emit(this.filter);\n }\n}\n","
\n \n \n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { IProjectAutocompleteItem } from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocomplete-item';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3ListFilter } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\n\n@Component({\n selector: 'op-filter-project',\n templateUrl: './filter-project.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FilterProjectComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new DebouncedEventEmitter(componentDestroyed(this));\n\n additionalProjectApiFilters:ApiV3ListFilter[] = [];\n\n constructor(\n readonly I18n:I18nService,\n readonly apiV3Service:ApiV3Service,\n readonly currentProjectService:CurrentProjectService,\n ) {\n super();\n }\n\n ngOnInit():void {\n const projectID = this.currentProjectService.id;\n if (projectID && (this.filter.id === 'subprojectId' || this.filter.id === 'onlySubproject')) {\n this.additionalProjectApiFilters.push(['ancestor', '=', [projectID]]);\n }\n }\n\n async onChange(val:HalResource[]|IProjectAutocompleteItem[]):Promise {\n if (val === this.filter.values || val === undefined) {\n return;\n }\n\n if (!val) {\n this.filter.values.length = 0;\n this.filterChanged.emit(this.filter);\n return;\n }\n\n // The project autocompleter does not return HalResources, but most filters want them.\n // Here we change from one to the other\n const projects = await this.apiV3Service.projects.list({\n filters: [\n ['id', '=', val.map((p:HalResource|IProjectAutocompleteItem) => String(p.id) || '')],\n ],\n }).toPromise();\n\n this.filter.values = projects.elements;\n this.filterChanged.emit(this.filter);\n }\n}\n","\n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResourceSortingService } from 'core-app/features/hal/services/hal-resource-sorting.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { NgSelectComponent } from '@ng-select/ng-select';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\n\n@Component({\n selector: 'op-filter-toggled-multiselect-value',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './filter-toggled-multiselect-value.component.html',\n})\nexport class FilterToggledMultiselectValueComponent implements OnInit, AfterViewInit {\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new EventEmitter();\n\n @ViewChild('ngSelectInstance', { static: true }) ngSelectInstance:NgSelectComponent;\n\n public availableOptions:HalResource[] = [];\n\n readonly text = {\n placeholder: this.I18n.t('js.placeholders.selection'),\n };\n\n constructor(readonly halResourceService:HalResourceService,\n readonly halSorting:HalResourceSortingService,\n readonly PathHelper:PathHelperService,\n readonly apiV3Service:ApiV3Service,\n readonly currentUser:CurrentUserService,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService) {\n }\n\n ngOnInit():void {\n /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */\n const values = (this.filter.currentSchema!.values!.allowedValues as HalResource[]);\n this.availableOptions = this.halSorting.sort(values);\n }\n\n ngAfterViewInit():void {\n if (this.ngSelectInstance && this.shouldFocus) {\n this.ngSelectInstance.focus();\n }\n }\n\n public get value():unknown[] {\n return this.filter.values;\n }\n\n public setValues(val:HalResource[]|string[]|string|HalResource):void {\n this.filter.values = _.castArray(val) as HalResource[]|string[];\n this.filterChanged.emit(this.filter);\n this.cdRef.detectChanges();\n }\n}\n","\n \n\n","import { NgSelectComponent } from '@ng-select/ng-select';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport {\n Observable,\n of,\n} from 'rxjs';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport {\n map,\n shareReplay,\n switchMap,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Resource } from 'core-app/core/apiv3/cache/cachable-apiv3-resource';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n NgZone,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { take } from 'rxjs/internal/operators/take';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { compareByHref } from 'core-app/shared/helpers/angular/tracking-functions';\n\n@Component({\n selector: 'op-filter-searchable-multiselect-value',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './filter-searchable-multiselect-value.component.html',\n})\nexport class FilterSearchableMultiselectValueComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public filter:QueryFilterInstanceResource;\n\n @Input() public shouldFocus = false;\n\n @Output() public filterChanged = new EventEmitter();\n\n private meValue = this.halResourceService.createHalResource(\n {\n _links: {\n self: {\n href: this.apiV3Service.users.me.path,\n title: this.I18n.t('js.label_me'),\n },\n },\n }, true,\n );\n\n autocompleterFn = (searchTerm:string):Observable => this.autocomplete(searchTerm);\n\n initialRequest$:Observable;\n\n itemTracker = (item:HalResource):string => item.href || item.id || item.name;\n\n compareByHref = compareByHref;\n\n resourceType:string|null = null;\n\n readonly text = {\n placeholder: this.I18n.t('js.placeholders.selection'),\n };\n\n public get value():string[]|HalResource[] {\n return this.filter.values;\n }\n\n @ViewChild('ngSelectInstance', { static: true }) ngSelectInstance:NgSelectComponent;\n\n constructor(readonly halResourceService:HalResourceService,\n readonly apiV3Service:ApiV3Service,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n protected currentProject:CurrentProjectService,\n protected currentUser:CurrentUserService,\n readonly halNotification:HalResourceNotificationService,\n readonly ngZone:NgZone) {\n super();\n }\n\n ngOnInit():void {\n if (this.filter.id === 'id') {\n this.resourceType = 'work_packages';\n }\n\n this.initialRequest$ = this\n .loadCollection('')\n .pipe(\n shareReplay(1),\n );\n }\n\n private autocomplete(matching:string):Observable {\n return this\n .initialRequest$\n .pipe(\n switchMap((initialLoad) => {\n // If we already loaded all values, just compare in the frontend\n if (initialLoad.count === initialLoad.total) {\n return this.matchingItems(initialLoad.elements, matching);\n }\n\n // Otherwise, request the matching API call\n return this\n .loadCollection(matching)\n .pipe(\n switchMap((collection) => this.withMeValue(matching, collection.elements)),\n );\n }),\n );\n }\n\n matchingItems(elements:HalResource[], matching:string):Observable {\n let filtered:HalResource[];\n\n if (matching === '' || !matching) {\n filtered = elements;\n } else {\n const lowered = matching.toLowerCase();\n filtered = elements.filter((el) => (el.id as string).includes(lowered) || el.name.toLowerCase().includes(lowered));\n }\n\n return this.withMeValue(matching, filtered);\n }\n\n private loadCollection(matching:string):Observable {\n const filters:ApiV3FilterBuilder = this.createFilters(matching);\n\n return (this.apiV3Service.collectionFromString(this.allowedValuesLink) as\n ApiV3ResourceCollection)\n .filtered(filters, { pageSize: '-1' })\n .get();\n }\n\n private createFilters(matching:string):ApiV3FilterBuilder {\n const filters = new ApiV3FilterBuilder();\n\n if (matching) {\n filters.add('typeahead', '**', [matching]);\n }\n\n return filters;\n }\n\n public setValues(val:any) {\n this.filter.values = val.length > 0 ? (Array.isArray(val) ? val : [val]) : [] as HalResource[];\n this.filterChanged.emit(this.filter);\n this.cdRef.detectChanges();\n }\n\n private get allowedValuesLink():string {\n /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */\n const { href } = this.filter.currentSchema!.values!.allowedValues as { href:string };\n\n return href;\n }\n\n private withMeValue(matching:string, elements:HalResource[]):Observable {\n if (!this.isUserResource || (!!matching && matching !== 'me')) {\n return of(elements);\n }\n\n return this\n .currentUser\n .isLoggedIn$\n .pipe(\n take(1),\n withLatestFrom(this.currentUser.user$),\n map(([logged, user]) => {\n if (logged && user) {\n return [this.meValue].concat(elements);\n }\n\n return elements;\n }),\n );\n }\n\n private get isUserResource() {\n const type = _.get(this.filter.currentSchema, 'values.type', null) as string;\n return type && type.indexOf('User') > 0;\n }\n}\n","
\n\n \n
\n","\n \n \n \n\n \n
\n\n \n {{ filter.name }}\n {{ text.open_filter }}\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 \n
\n
\n\n \n\n
\n \n \n \n
\n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component, EventEmitter, Input, OnInit, Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { halHref, compareByHref } from 'core-app/shared/helpers/angular/tracking-functions';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { QueryFilterResource } from 'core-app/features/hal/resources/query-filter-resource';\n\n@Component({\n selector: '[query-filter]',\n templateUrl: './query-filter.component.html',\n})\nexport class QueryFilterComponent implements OnInit {\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new EventEmitter();\n\n @Output() public deactivateFilter = new EventEmitter();\n\n public availableOperators:any;\n\n public showValuesInput = false;\n\n public eeShowBanners = false;\n\n public trackByHref = halHref;\n\n public compareByHref = compareByHref;\n\n public text = {\n open_filter: this.I18n.t('js.filter.description.text_open_filter'),\n close_filter: this.I18n.t('js.filter.description.text_close_filter'),\n label_filter_add: this.I18n.t('js.work_packages.label_filter_add'),\n upsale_for_more: this.I18n.t('js.filter.upsale_for_more'),\n upsale_link: this.I18n.t('js.filter.upsale_link'),\n button_delete: this.I18n.t('js.button_delete'),\n };\n\n constructor(readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly schemaCache:SchemaCacheService,\n readonly I18n:I18nService,\n readonly currentProject:CurrentProjectService,\n readonly bannerService:BannersService) {\n }\n\n public onFilterUpdated(filter:QueryFilterInstanceResource) {\n this.filter = filter;\n this.showValuesInput = this.showValues();\n this.filterChanged.emit();\n }\n\n public removeThisFilter() {\n this.deactivateFilter.emit(this.filter);\n }\n\n public get valueType():string|undefined {\n if (this.filter.currentSchema && this.filter.currentSchema.values) {\n return this.filter.currentSchema.values.type;\n }\n\n return undefined;\n }\n\n ngOnInit() {\n this.eeShowBanners = this.bannerService.eeShowBanners;\n this.availableOperators = this.schemaCache.of(this.filter).availableOperators;\n this.showValuesInput = this.showValues();\n }\n\n private showValues() {\n return this.filter.currentSchema!.isValueRequired() && this.filter.currentSchema!.values!.type !== '[1]Boolean';\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\n
    \n \n \n
    \n
  • \n
\n \n \n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, Output, ViewChild,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport { trackByName } from 'core-app/shared/helpers/angular/tracking-functions';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { NgSelectComponent } from '@ng-select/ng-select';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { WorkPackageFiltersService } from 'core-app/features/work-packages/components/filters/wp-filters/wp-filters.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { QueryFilterResource } from 'core-app/features/hal/resources/query-filter-resource';\nimport { enterpriseDocsUrl } from 'core-app/core/setup/globals/constants.const';\n\nconst ADD_FILTER_SELECT_INDEX = -1;\n\n@Component({\n selector: 'op-query-filters',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './query-filters.component.html',\n})\nexport class QueryFiltersComponent extends UntilDestroyedMixin implements OnInit, OnChanges {\n @ViewChild(NgSelectComponent) public ngSelectComponent:NgSelectComponent;\n\n @Input() public filters:QueryFilterInstanceResource[];\n\n @Input() public showCloseFilter = false;\n\n @Output() public filtersChanged = new DebouncedEventEmitter(\n componentDestroyed(this),\n 500,\n );\n\n public remainingFilters:any[] = [];\n\n public eeShowBanners = false;\n\n public focusElementIndex = 0;\n\n public trackByName = trackByName;\n\n public text = {\n open_filter: this.I18n.t('js.filter.description.text_open_filter'),\n label_filter_add: this.I18n.t('js.work_packages.label_filter_add'),\n close_filter: this.I18n.t('js.filter.description.text_close_filter'),\n upsale_for_more: this.I18n.t('js.filter.upsale_for_more'),\n upsale_link: this.I18n.t('js.filter.upsale_link'),\n more_info_link: enterpriseDocsUrl.website,\n close_form: this.I18n.t('js.close_form_title'),\n selected_filter_list: this.I18n.t('js.label_selected_filter_list'),\n button_delete: this.I18n.t('js.button_delete'),\n please_select: this.I18n.t('js.placeholders.selection'),\n filter_by_text: this.I18n.t('js.work_packages.label_filter_by_text'),\n };\n\n constructor(readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly wpFiltersService:WorkPackageFiltersService,\n readonly I18n:I18nService,\n readonly bannerService:BannersService) {\n super();\n }\n\n ngOnInit() {\n this.eeShowBanners = this.bannerService.eeShowBanners;\n }\n\n ngOnChanges() {\n this.updateRemainingFilters();\n }\n\n public onFilterAdded(filterToBeAdded:QueryFilterResource) {\n if (filterToBeAdded) {\n const newFilter = this.wpTableFilters.instantiate(filterToBeAdded);\n this.filters.push(newFilter);\n\n const index = this.currentFilterLength();\n this.updateFilterFocus(index);\n this.updateRemainingFilters();\n\n this.filtersChanged.emit(this.filters);\n this.ngSelectComponent.clearItem(filterToBeAdded);\n }\n }\n\n public closeFilter() {\n this.wpFiltersService.toggleVisibility();\n }\n\n public deactivateFilter(removedFilter:QueryFilterInstanceResource) {\n const index = this.filters.indexOf(removedFilter);\n _.remove(this.filters, (f) => f.id === removedFilter.id);\n\n this.filtersChanged.emit(this.filters);\n\n this.updateFilterFocus(index);\n this.updateRemainingFilters();\n }\n\n public get isSecondSpacerVisible():boolean {\n const hasSearch = !!_.find(this.filters, (f) => f.id === 'search');\n const hasAvailableFilter = !!this.filters.find((f) => f.id !== 'search' && this.isFilterAvailable(f));\n\n return hasSearch && hasAvailableFilter;\n }\n\n private updateRemainingFilters() {\n this.remainingFilters = _.sortBy(this.wpTableFilters.remainingVisibleFilters(this.filters), 'name');\n }\n\n private updateFilterFocus(index:number) {\n const activeFilterCount = this.currentFilterLength();\n\n if (activeFilterCount === 0) {\n this.focusElementIndex = ADD_FILTER_SELECT_INDEX;\n } else {\n const filterIndex = (index < activeFilterCount) ? index : activeFilterCount - 1;\n const filter = this.currentFilterAt(filterIndex);\n this.focusElementIndex = this.filters.indexOf(filter);\n }\n }\n\n public currentFilterLength() {\n return this.filters.length;\n }\n\n public currentFilterAt(index:number) {\n return this.filters[index];\n }\n\n public isFilterAvailable(filter:QueryFilterResource):boolean {\n return (this.wpTableFilters.availableFilters.some((availableFilter) => availableFilter.id === filter.id)\n && !(this.wpTableFilters.hidden.includes(filter.id) || filter.isTemplated()));\n }\n\n public onOpen() {\n setTimeout(() => {\n const component = this.ngSelectComponent as any;\n if (component && component.dropdownPanel) {\n component.dropdownPanel._updatePosition();\n }\n }, 25);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { input } from 'reactivestates';\nimport { Observable } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\n@Injectable()\nexport class WorkPackageFiltersService {\n private readonly state = input(false);\n\n public get visible() {\n return this.state.getValueOr(false);\n }\n\n public set visible(val:boolean) {\n this.state.putValue(val);\n }\n\n public observeUntil(unsubscribe:Observable) {\n return this.state.values$().pipe(takeUntil(unsubscribe));\n }\n\n public toggleVisibility() {\n this.state.doModify((current) => !current);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { Subject } from 'rxjs';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\n@Injectable()\nexport class CommentService {\n // Replacement for ng1 $scope.$emit on activty-entry to mark comments to be quoted.\n // Should be generalized if needed for more than that.\n public quoteEvents = new Subject();\n\n constructor(\n readonly I18n:I18nService,\n private workPackageNotificationService:WorkPackageNotificationService,\n private toastService:ToastService,\n ) {\n }\n\n public createComment(workPackage:WorkPackageResource, comment:{ raw:string }) {\n return workPackage.addComment(\n { comment },\n { 'Content-Type': 'application/json; charset=UTF-8' },\n )\n .catch((error:any) => this.errorAndReject(error, workPackage));\n }\n\n public updateComment(activity:HalResource, comment:string) {\n const options = {\n ajax: {\n method: 'PATCH',\n data: JSON.stringify({ comment }),\n contentType: 'application/json; charset=utf-8',\n },\n };\n\n return activity.update(\n { comment },\n { 'Content-Type': 'application/json; charset=UTF-8' },\n ).then((activity:HalResource) => {\n this.toastService.addSuccess(\n this.I18n.t('js.work_packages.comment_updated'),\n );\n\n return activity;\n }).catch((error:any) => this.errorAndReject(error));\n }\n\n private errorAndReject(error:HalResource, workPackage?:WorkPackageResource) {\n this.workPackageNotificationService.handleRawError(error, workPackage);\n\n // returning a reject will enable to correctly work with subsequent then/catch handlers.\n return Promise.reject(error);\n }\n}\n","\n \n \n \n \n \n \n \n \n \n \n\n\n\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component, Input, EventEmitter, Output,\n} from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageRelationsHierarchyService } from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\n\n@Component({\n templateUrl: './wp-breadcrumb-parent.html',\n selector: 'wp-breadcrumb-parent',\n})\nexport class WorkPackageBreadcrumbParentComponent {\n @Input('workPackage') workPackage:WorkPackageResource;\n\n @Output('onSwitch') onSwitch = new EventEmitter();\n\n public isSaving = false;\n\n public text = {\n edit_parent: this.I18n.t('js.relation_buttons.change_parent'),\n set_or_remove_parent: this.I18n.t('js.relations_autocomplete.parent_placeholder'),\n remove_parent: this.I18n.t('js.relation_buttons.remove_parent'),\n set_parent: this.I18n.t('js.relation_buttons.set_parent'),\n };\n\n private editing:boolean;\n\n public constructor(\n protected readonly I18n:I18nService,\n protected readonly wpRelationsHierarchy:WorkPackageRelationsHierarchyService,\n protected readonly notificationService:WorkPackageNotificationService,\n ) {\n }\n\n public canModifyParent():boolean {\n return !!this.workPackage.changeParent;\n }\n\n public get parent() {\n return this.workPackage && this.workPackage.parent;\n }\n\n public get active():boolean {\n return this.editing;\n }\n\n public close():void {\n this.toggle(false);\n }\n\n public open():void {\n this.toggle(true);\n }\n\n public updateParent(newParent:WorkPackageResource|null) {\n this.close();\n const newParentId = newParent ? newParent.id : null;\n if (_.get(this.parent, 'id', null) === newParentId) {\n return;\n }\n\n this.isSaving = true;\n this.wpRelationsHierarchy.changeParent(this.workPackage, newParentId)\n .catch((error:any) => {\n this.notificationService.handleRawError(error, this.workPackage);\n })\n .then(() => this.isSaving = false); // Behaves as .finally()\n }\n\n private toggle(state:boolean) {\n if (this.editing !== state) {\n this.editing = state;\n this.onSwitch.emit(this.editing);\n }\n }\n}\n","
\n
    \n 0\">\n
  • \n {{ hierarchyLabel }}: \n
  • \n \n \n \n \n \n
    \n 1 }\">\n \n \n
\n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, Input } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\n@Component({\n templateUrl: './wp-breadcrumb.html',\n styleUrls: ['./wp-breadcrumb.sass'],\n selector: 'wp-breadcrumb',\n})\nexport class WorkPackageBreadcrumbComponent {\n @Input('workPackage') workPackage:WorkPackageResource;\n\n public text = {\n parent: this.I18n.t('js.relations_hierarchy.parent_headline'),\n hierarchy: this.I18n.t('js.relations_hierarchy.hierarchy_headline'),\n };\n\n constructor(private I18n:I18nService) {\n }\n\n public inputActive = false;\n\n public get hierarchyCount() {\n return this.workPackage.ancestors.length;\n }\n\n public get hierarchyLabel() {\n return (this.hierarchyCount === 1) ? this.text.parent : this.text.hierarchy;\n }\n\n public updateActiveInput(val:boolean) {\n this.inputActive = val;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\nexport interface ButtonControllerText {\n activate:string;\n deactivate:string;\n label:string;\n buttonText:string;\n}\n\nexport abstract class AbstractWorkPackageButtonComponent extends UntilDestroyedMixin {\n public disabled:boolean;\n\n public buttonId:string;\n\n public iconClass:string;\n\n public accessKey:number;\n\n public isActive = false;\n\n protected text:ButtonControllerText;\n\n constructor(public I18n:I18nService) {\n super();\n\n this.text = {\n activate: this.I18n.t('js.label_activate'),\n deactivate: this.I18n.t('js.label_deactivate'),\n label: this.labelKey ? this.I18n.t(this.labelKey) : '',\n buttonText: this.textKey ? this.I18n.t(this.textKey) : '',\n };\n }\n\n public get label():string {\n return this.text.label;\n }\n\n public get buttonText():string {\n return this.text.buttonText;\n }\n\n public get labelKey():string {\n return '';\n }\n\n public get textKey():string {\n return '';\n }\n\n protected get activationPrefix():string {\n return !this.isActive ? `${this.text.activate} ` : '';\n }\n\n protected get deactivationPrefix():string {\n return this.isActive ? `${this.text.deactivate} ` : '';\n }\n\n protected get prefix():string {\n return this.activationPrefix || this.deactivationPrefix;\n }\n\n public isToggle():boolean {\n return false;\n }\n\n public abstract performAction(event:Event):void;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { OpContextMenuItem } from 'core-app/shared/components/op-context-menu/op-context-menu.types';\nimport { StateService } from '@uirouter/core';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { Directive, ElementRef, Input } from '@angular/core';\nimport { isClickedWithModifier } from 'core-app/shared/helpers/link-handling/link-handling';\nimport { OpContextMenuTrigger } from 'core-app/shared/components/op-context-menu/handlers/op-context-menu-trigger.directive';\nimport { BrowserDetector } from 'core-app/core/browser/browser-detector.service';\nimport { WorkPackageCreateService } from 'core-app/features/work-packages/components/wp-new/wp-create.service';\nimport { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\nimport { TypeResource } from 'core-app/features/hal/resources/type-resource';\n\n@Directive({\n selector: '[opTypesCreateDropdown]',\n})\nexport class OpTypesContextMenuDirective extends OpContextMenuTrigger {\n @Input('projectIdentifier') public projectIdentifier:string|null|undefined;\n\n @Input('stateName') public stateName:string;\n\n @Input('dropdownActive') active:boolean;\n\n constructor(readonly elementRef:ElementRef,\n readonly opContextMenu:OPContextMenuService,\n readonly browserDetector:BrowserDetector,\n readonly wpCreate:WorkPackageCreateService,\n readonly $state:StateService) {\n super(elementRef, opContextMenu);\n }\n\n ngAfterViewInit():void {\n super.ngAfterViewInit();\n\n if (!this.active) {\n return;\n }\n\n // Force full-view create if in mobile view\n if (this.browserDetector.isMobile) {\n this.stateName = 'work-packages.new';\n }\n }\n\n protected open(evt:JQuery.TriggeredEvent) {\n this\n .wpCreate\n .getEmptyForm(this.projectIdentifier)\n .then((form) => {\n this.buildItems(form.schema.type.allowedValues);\n this.opContextMenu.show(this, evt);\n });\n }\n\n public get locals():{ showAnchorRight?:boolean, contextMenuId?:string, items:OpContextMenuItem[] } {\n return {\n items: this.items,\n contextMenuId: 'types-context-menu',\n };\n }\n\n private buildItems(types:TypeResource[]) {\n this.items = types.map((type:TypeResource) => ({\n disabled: false,\n linkText: type.name,\n href: this.$state.href(this.stateName, { type: type.id! }),\n ariaLabel: type.name,\n class: Highlighting.inlineClass('type', type.id!),\n onClick: ($event:JQuery.TriggeredEvent) => {\n if (isClickedWithModifier($event)) {\n return false;\n }\n\n this.$state.go(this.stateName, { type: type.id });\n return true;\n },\n }));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { StateService, TransitionService } from '@uirouter/core';\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { Observable } from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\n\n@Component({\n selector: 'wp-create-button',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './wp-create-button.html',\n})\nexport class WorkPackageCreateButtonComponent extends UntilDestroyedMixin implements OnInit, OnDestroy {\n @Input('allowed') allowedWhen:string[];\n\n @Input('stateName$') stateName$:Observable;\n\n allowed:boolean;\n\n disabled:boolean;\n\n projectIdentifier:string|null;\n\n types:any;\n\n transitionUnregisterFn:Function;\n\n text = {\n title: this.I18n.t('js.work_packages.create.title'),\n createWithDropdown: this.I18n.t('js.work_packages.create.button'),\n createButton: this.I18n.t('js.label_work_package'),\n explanation: this.I18n.t('js.label_create_work_package'),\n };\n\n constructor(readonly $state:StateService,\n readonly currentProject:CurrentProjectService,\n readonly authorisationService:AuthorisationService,\n readonly transition:TransitionService,\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef) {\n super();\n }\n\n ngOnInit() {\n this.projectIdentifier = this.currentProject.identifier;\n\n // Find the first permission that is allowed\n this.authorisationService\n .observeUntil(componentDestroyed(this))\n .subscribe(() => {\n this.allowed = !!this\n .allowedWhen\n .find((combined) => {\n const [module, permission] = combined.split('.');\n return this.authorisationService.can(module, permission);\n });\n\n this.updateDisabledState();\n });\n\n this.transitionUnregisterFn = this.transition.onSuccess({}, this.updateDisabledState.bind(this));\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n this.transitionUnregisterFn();\n }\n\n private updateDisabledState() {\n this.disabled = !this.allowed || this.$state.includes('**.new');\n this.cdRef.detectChanges();\n }\n}\n","
\n \n \n \n \n \n
\n","\n \n \n {{ buttonText }}\n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { AbstractWorkPackageButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-buttons.module';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit,\n} from '@angular/core';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { WorkPackageFiltersService } from 'core-app/features/work-packages/components/filters/wp-filters/wp-filters.service';\n\n@Component({\n selector: 'wp-filter-button',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './wp-filter-button.html',\n})\nexport class WorkPackageFilterButtonComponent extends AbstractWorkPackageButtonComponent implements OnInit {\n public count:number;\n\n public initialized = false;\n\n public buttonId = 'work-packages-filter-toggle-button';\n\n public iconClass = 'icon-filter';\n\n public title = this.I18n.t('js.work_packages.filters.title');\n\n constructor(\n readonly I18n:I18nService,\n protected cdRef:ChangeDetectorRef,\n protected wpFiltersService:WorkPackageFiltersService,\n protected wpTableFilters:WorkPackageViewFiltersService,\n ) {\n super(I18n);\n }\n\n ngOnInit():void {\n this.setupObserver();\n }\n\n public get labelKey():string {\n return 'js.button_filter';\n }\n\n public get textKey():string {\n return 'js.toolbar.filter';\n }\n\n public get label():string {\n return this.prefix + this.text.label;\n }\n\n public get filterCount():number {\n return this.count;\n }\n\n public performAction(event:Event) {\n this.toggleVisibility();\n }\n\n public toggleVisibility() {\n this.wpFiltersService.toggleVisibility();\n }\n\n private setupObserver() {\n this.wpTableFilters\n .live$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n this.count = this.wpTableFilters.currentlyVisibleFilters.length;\n this.initialized = true;\n this.cdRef.detectChanges();\n });\n\n this.wpFiltersService\n .observeUntil(componentDestroyed(this))\n .subscribe(() => {\n this.isActive = this.wpFiltersService.visible;\n this.cdRef.detectChanges();\n });\n }\n}\n","\n\n \n \n \n\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WpSingleViewService } from 'core-app/features/work-packages/routing/wp-view-base/state/wp-single-view.service';\n\n@Component({\n selector: 'op-work-package-mark-notification-button',\n templateUrl: './work-package-mark-notification-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageMarkNotificationButtonComponent {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public showWithText:boolean;\n\n text = {\n mark_as_read: this.I18n.t('js.notifications.center.mark_as_read'),\n };\n\n constructor(\n private I18n:I18nService,\n private storeService:WpSingleViewService,\n ) {\n }\n\n markAllBelongingNotificationsAsRead():void {\n this.storeService.markAllAsRead();\n }\n}\n","import { States } from 'core-app/core/states/states.service';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport {\n Component, EventEmitter, Input, Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\n\nexport interface QuerySharingChange {\n isStarred:boolean;\n isPublic:boolean;\n}\n\n@Component({\n selector: 'query-sharing-form',\n templateUrl: './query-sharing-form.html',\n})\nexport class QuerySharingFormComponent {\n @Input() public isSave:boolean;\n\n @Input() public isStarred:boolean;\n\n @Input() public isPublic:boolean;\n\n @Output() public onChange = new EventEmitter();\n\n public text = {\n showInMenu: this.I18n.t('js.label_star_query'),\n visibleForOthers: this.I18n.t('js.label_public_query'),\n\n showInMenuText: this.I18n.t('js.work_packages.query.star_text'),\n visibleForOthersText: this.I18n.t('js.work_packages.query.public_text'),\n };\n\n constructor(readonly states:States,\n readonly querySpace:IsolatedQuerySpace,\n readonly authorisationService:AuthorisationService,\n readonly I18n:I18nService) {\n }\n\n public get canStar() {\n return this.isSave\n || this.authorisationService.can('query', 'star')\n || this.authorisationService.can('query', 'unstar');\n }\n\n public get canPublish() {\n const form = this.querySpace.queryForm.value!;\n\n return this.authorisationService.can('query', 'updateImmediately')\n && form.schema.public.writable;\n }\n\n public updateStarred(val:boolean) {\n this.isStarred = val;\n this.changed();\n }\n\n public updatePublic(val:boolean) {\n this.isPublic = val;\n this.changed();\n }\n\n public changed() {\n this.onChange.emit({ isStarred: !!this.isStarred, isPublic: !!this.isPublic });\n }\n}\n","
\n
\n \n
\n
\n
\n\n
\n
\n \n
\n
\n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport {\n ChangeDetectorRef, Component, ElementRef, Inject, OnInit,\n} from '@angular/core';\nimport { QuerySharingChange } from 'core-app/shared/components/modals/share-modal/query-sharing-form.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\n\n@Component({\n templateUrl: './query-sharing.modal.html',\n})\nexport class QuerySharingModalComponent extends OpModalComponent implements OnInit {\n public query:QueryResource;\n\n public isStarred = false;\n\n public isPublic = false;\n\n public isBusy = false;\n\n public text = {\n title: this.I18n.t('js.modals.form_submit.title'),\n text: this.I18n.t('js.modals.form_submit.text'),\n save_as: this.I18n.t('js.label_save_as'),\n label_name: this.I18n.t('js.modals.label_name'),\n label_visibility_settings: this.I18n.t('js.label_visibility_settings'),\n button_save: this.I18n.t('js.modals.button_save'),\n button_cancel: this.I18n.t('js.button_cancel'),\n close_popup: this.I18n.t('js.close_popup_title'),\n };\n\n constructor(\n readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly I18n:I18nService,\n readonly states:States,\n readonly querySpace:IsolatedQuerySpace,\n readonly cdRef:ChangeDetectorRef,\n readonly wpListService:WorkPackagesListService,\n readonly halNotification:HalResourceNotificationService,\n readonly toastService:ToastService,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit():void {\n super.ngOnInit();\n\n this.query = this.querySpace.query.value!;\n\n this.isStarred = this.query.starred;\n this.isPublic = this.query.public;\n }\n\n public setValues(change:QuerySharingChange):void {\n this.isStarred = change.isStarred;\n this.isPublic = change.isPublic;\n }\n\n public get afterFocusOn():HTMLElement {\n return document.getElementById('work-packages-settings-button') as HTMLElement;\n }\n\n public saveQuery($event:Event):void {\n if (this.isBusy) {\n return;\n }\n\n this.isBusy = true;\n const promises = [];\n\n if (this.query.public !== this.isPublic) {\n this.query.public = this.isPublic;\n\n promises.push(this.wpListService.save(this.query));\n }\n\n if (this.query.starred !== this.isStarred) {\n promises.push(this.wpListService.toggleStarred(this.query));\n }\n\n Promise\n .all(promises)\n .then(() => {\n this.closeMe($event);\n this.isBusy = false;\n })\n .catch(() => {\n this.toastService.addError(this.I18n.t('js.error.query_saving'));\n this.isBusy = false;\n });\n }\n}\n","\n
{{text.label_visibility_settings}}
\n\n
\n\n \n \n\n
\n
\n \n \n
\n
\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectorRef, Component, ElementRef, Inject, ViewChild,\n} from '@angular/core';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { QuerySharingChange } from 'core-app/shared/components/modals/share-modal/query-sharing-form.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { States } from 'core-app/core/states/states.service';\n\n@Component({\n templateUrl: './save-query.modal.html',\n})\nexport class SaveQueryModalComponent extends OpModalComponent {\n public queryName = '';\n\n public isStarred = false;\n\n public isPublic = false;\n\n public isBusy = false;\n\n @ViewChild('queryNameField', { static: true }) queryNameField:ElementRef;\n\n public text = {\n title: this.I18n.t('js.modals.form_submit.title'),\n text: this.I18n.t('js.modals.form_submit.text'),\n save_as: this.I18n.t('js.label_save_as'),\n label_name: this.I18n.t('js.modals.label_name'),\n label_visibility_settings: this.I18n.t('js.label_visibility_settings'),\n button_save: this.I18n.t('js.modals.button_save'),\n button_cancel: this.I18n.t('js.button_cancel'),\n close_popup: this.I18n.t('js.close_popup_title'),\n };\n\n constructor(\n readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly I18n:I18nService,\n readonly states:States,\n readonly querySpace:IsolatedQuerySpace,\n readonly wpListService:WorkPackagesListService,\n readonly halNotification:HalResourceNotificationService,\n readonly cdRef:ChangeDetectorRef,\n readonly toastService:ToastService,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n public setValues(change:QuerySharingChange):void {\n this.isStarred = change.isStarred;\n this.isPublic = change.isPublic;\n }\n\n public onOpen():void {\n this.queryNameField.nativeElement.focus();\n }\n\n public get afterFocusOn():HTMLElement {\n return document.getElementById('work-packages-settings-button') as HTMLElement;\n }\n\n public saveQueryAs($event:Event):void {\n $event.preventDefault();\n\n if (this.isBusy || !this.queryName) {\n return;\n }\n\n this.isBusy = true;\n const query = this.querySpace.query.value!;\n query.public = this.isPublic;\n\n this.wpListService\n .create(query, this.queryName)\n .then((savedQuery:QueryResource):Promise => {\n if (this.isStarred && !savedQuery.starred) {\n return this.wpListService.toggleStarred(savedQuery).then(() => this.closeMe($event));\n }\n\n this.closeMe($event);\n return Promise.resolve(true);\n })\n .catch((error:any) => this.halNotification.handleRawError(error))\n .then(() => this.isBusy = false); // Same as .finally()\n }\n}\n","\n

{{text.save_as}}

\n \n
\n\n \n
\n \n
\n
\n \n
\n
\n
\n
\n \n

{{ text.label_visibility_settings }}

\n \n \n \n \n\n
\n
\n \n \n
\n
\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Directive, ElementRef, Injector, Input,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { OpContextMenuTrigger } from 'core-app/shared/components/op-context-menu/handlers/op-context-menu-trigger.directive';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { WpTableConfigurationModalComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport {\n selectableTitleIdentifier,\n triggerEditingEvent,\n} from 'core-app/shared/components/editable-toolbar-title/editable-toolbar-title.component';\nimport { QuerySharingModalComponent } from 'core-app/shared/components/modals/share-modal/query-sharing.modal';\nimport { WpTableExportModalComponent } from 'core-app/shared/components/modals/export-modal/wp-table-export.modal';\nimport { SaveQueryModalComponent } from 'core-app/shared/components/modals/save-modal/save-query.modal';\nimport { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';\nimport isPersistedResource from 'core-app/features/hal/helpers/is-persisted-resource';\n\n@Directive({\n selector: '[opSettingsContextMenu]',\n})\nexport class OpSettingsMenuDirective extends OpContextMenuTrigger {\n @Input('opSettingsContextMenu-query') public query:QueryResource;\n\n @Input() public hideTableOptions:boolean;\n\n private form:QueryFormResource;\n\n private loadingPromise:PromiseLike;\n\n private focusAfterClose = true;\n\n constructor(readonly elementRef:ElementRef,\n readonly opContextMenu:OPContextMenuService,\n readonly opModalService:OpModalService,\n readonly wpListService:WorkPackagesListService,\n readonly authorisationService:AuthorisationService,\n readonly states:States,\n readonly injector:Injector,\n readonly querySpace:IsolatedQuerySpace,\n readonly I18n:I18nService) {\n super(elementRef, opContextMenu);\n }\n\n ngAfterViewInit():void {\n super.ngAfterViewInit();\n\n this.querySpace.query.values$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((queryUpdate) => {\n this.query = queryUpdate;\n });\n\n this.loadingPromise = this.querySpace.queryForm.valuesPromise();\n\n this.querySpace.queryForm.values$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((formUpdate) => {\n this.form = formUpdate;\n });\n }\n\n protected open(evt:JQuery.TriggeredEvent) {\n this.loadingPromise.then(() => {\n this.buildItems();\n this.opContextMenu.show(this, evt);\n });\n }\n\n public get locals() {\n return {\n contextMenuId: 'settingsDropdown',\n items: this.items,\n };\n }\n\n /**\n * Positioning args for jquery-ui position.\n *\n * @param {Event} openerEvent\n */\n public positionArgs(evt:JQuery.TriggeredEvent) {\n const additionalPositionArgs = {\n my: 'right top',\n at: 'right bottom',\n };\n\n const position = super.positionArgs(evt);\n _.assign(position, additionalPositionArgs);\n\n return position;\n }\n\n public onClose() {\n if (this.focusAfterClose) {\n this.afterFocusOn.focus();\n }\n }\n\n private allowQueryAction(event:JQuery.TriggeredEvent, action:any) {\n return this.allowAction(event, 'query', action);\n }\n\n private allowWorkPackageAction(event:JQuery.TriggeredEvent, action:any) {\n return this.allowAction(event, 'work_packages', action);\n }\n\n private allowFormAction(event:JQuery.TriggeredEvent, action:string) {\n if (this.form.$links[action]) {\n return true;\n }\n event.stopPropagation();\n return false;\n }\n\n private allowAction(event:JQuery.TriggeredEvent, modelName:string, action:any) {\n if (this.authorisationService.can(modelName, action)) {\n return true;\n }\n event.stopPropagation();\n return false;\n }\n\n private buildItems() {\n this.items = [\n {\n // Configuration modal\n disabled: false,\n linkText: this.I18n.t('js.toolbar.settings.configure_view'),\n hidden: this.hideTableOptions,\n icon: 'icon-settings',\n onClick: ($event:JQuery.TriggeredEvent) => {\n this.opContextMenu.close();\n this.opModalService.show(WpTableConfigurationModalComponent, this.injector);\n\n return true;\n },\n },\n {\n // Insert columns\n linkText: this.I18n.t('js.work_packages.query.insert_columns'),\n hidden: this.hideTableOptions,\n icon: 'icon-columns',\n class: 'hidden-for-mobile',\n onClick: () => {\n this.opModalService.show(\n WpTableConfigurationModalComponent,\n this.injector,\n { initialTab: 'columns' },\n );\n return true;\n },\n },\n {\n // Sort by\n linkText: this.I18n.t('js.toolbar.settings.sort_by'),\n hidden: this.hideTableOptions,\n icon: 'icon-sort-by',\n onClick: () => {\n this.opModalService.show(\n WpTableConfigurationModalComponent,\n this.injector,\n { initialTab: 'sort-by' },\n );\n return true;\n },\n },\n {\n // Group by\n linkText: this.I18n.t('js.toolbar.settings.group_by'),\n hidden: this.hideTableOptions,\n icon: 'icon-group-by',\n class: 'hidden-for-mobile',\n onClick: () => {\n this.opModalService.show(\n WpTableConfigurationModalComponent,\n this.injector,\n { initialTab: 'display-settings' },\n );\n return true;\n },\n },\n {\n // Rename query shortcut\n disabled: !this.query.id || this.authorisationService.cannot('query', 'updateImmediately'),\n linkText: this.I18n.t('js.toolbar.settings.page_settings'),\n icon: 'icon-edit',\n onClick: ($event:JQuery.TriggeredEvent) => {\n if (this.allowQueryAction($event, 'update')) {\n this.focusAfterClose = false;\n jQuery(`${selectableTitleIdentifier}`).trigger(triggerEditingEvent);\n }\n\n return true;\n },\n },\n {\n // Query save modal\n disabled: this.authorisationService.cannot('query', 'updateImmediately'),\n linkText: this.I18n.t('js.toolbar.settings.save'),\n icon: 'icon-save',\n onClick: ($event:JQuery.TriggeredEvent) => {\n const { query } = this;\n if (!isPersistedResource(query) && this.allowQueryAction($event, 'updateImmediately')) {\n this.opModalService.show(SaveQueryModalComponent, this.injector);\n } else if (query.id && this.allowQueryAction($event, 'updateImmediately')) {\n this.wpListService.save(query);\n }\n\n return true;\n },\n },\n {\n // Query save as modal\n disabled: this.form ? !this.form.$links.create_new : this.authorisationService.cannot('query', 'updateImmediately'),\n linkText: this.I18n.t('js.toolbar.settings.save_as'),\n icon: 'icon-save',\n onClick: ($event:JQuery.TriggeredEvent) => {\n if (this.allowFormAction($event, 'create_new')) {\n this.opModalService.show(SaveQueryModalComponent, this.injector);\n }\n\n return true;\n },\n },\n {\n // Delete query\n disabled: this.authorisationService.cannot('query', 'delete'),\n linkText: this.I18n.t('js.toolbar.settings.delete'),\n icon: 'icon-delete',\n onClick: ($event:JQuery.TriggeredEvent) => {\n if (this.allowQueryAction($event, 'delete')\n && window.confirm(this.I18n.t('js.text_query_destroy_confirmation'))) {\n this.wpListService.delete();\n }\n\n return true;\n },\n },\n {\n // Export query\n disabled: this.authorisationService.cannot('work_packages', 'representations'),\n linkText: this.I18n.t('js.toolbar.settings.export'),\n hidden: this.hideTableOptions,\n icon: 'icon-export',\n onClick: ($event:JQuery.TriggeredEvent) => {\n if (this.allowWorkPackageAction($event, 'representations')) {\n this.opModalService.show(WpTableExportModalComponent, this.injector);\n }\n\n return true;\n },\n },\n {\n // Sharing modal\n disabled: this.authorisationService.cannot('query', 'unstar') && this.authorisationService.cannot('query', 'star'),\n linkText: this.I18n.t('js.toolbar.settings.visibility_settings'),\n icon: 'icon-watched',\n onClick: ($event:JQuery.TriggeredEvent) => {\n if (this.allowQueryAction($event, 'unstar') || this.allowQueryAction($event, 'star')) {\n this.opModalService.show(QuerySharingModalComponent, this.injector);\n }\n\n return true;\n },\n },\n {\n divider: true,\n hidden: !(this.query.results.customFields && this.form.configureForm),\n },\n {\n // Settings modal\n hidden: !this.query.results.customFields || this.hideTableOptions,\n href: this.query.results.customFields && this.query.results.customFields.href,\n linkText: this.query.results.customFields && this.query.results.customFields.name,\n icon: 'icon-custom-fields',\n onClick: () => false,\n },\n ];\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n@Component({\n templateUrl: './wp-settings-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageSettingsButtonComponent {\n @Input() hideTableOptions = false;\n\n public text = {\n more_actions: this.I18n.t('js.button_more_actions'),\n };\n\n constructor(readonly I18n:I18nService) {\n }\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { StateService } from '@uirouter/core';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { Directive, ElementRef, Input } from '@angular/core';\nimport { OpContextMenuTrigger } from 'core-app/shared/components/op-context-menu/handlers/op-context-menu-trigger.directive';\n\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\n@Directive({\n selector: '[wpStatusDropdown]',\n})\nexport class WorkPackageStatusDropdownDirective extends OpContextMenuTrigger {\n @Input('wpStatusDropdown-workPackage') public workPackage:WorkPackageResource;\n\n constructor(readonly elementRef:ElementRef,\n readonly opContextMenu:OPContextMenuService,\n readonly $state:StateService,\n protected workPackageNotificationService:WorkPackageNotificationService,\n protected halEditing:HalResourceEditingService,\n protected toastService:ToastService,\n protected I18n:I18nService,\n protected halEvents:HalEventsService) {\n super(elementRef, opContextMenu);\n }\n\n protected open(evt:JQuery.TriggeredEvent) {\n const change = this.halEditing.changeFor(this.workPackage);\n\n change.getForm().then((form:any) => {\n const statuses = form.schema.status.allowedValues;\n this.buildItems(statuses);\n\n const { writable } = change.schema.status;\n if (!writable) {\n this.toastService.addError(this.I18n.t('js.work_packages.message_work_package_status_blocked'));\n } else {\n this.opContextMenu.show(this, evt);\n }\n });\n }\n\n public get locals() {\n return {\n items: this.items,\n contextMenuId: 'wp-status-context-menu',\n };\n }\n\n private updateStatus(status:HalResource) {\n const change = this.halEditing.changeFor(this.workPackage);\n change.projectedResource.status = status;\n\n if (!isNewResource(this.workPackage)) {\n this.halEditing\n .save(change)\n .then(() => {\n this.workPackageNotificationService.showSave(this.workPackage);\n });\n }\n }\n\n private buildItems(statuses:CollectionResource) {\n this.items = statuses.map((status:HalResource) => ({\n disabled: false,\n linkText: status.name,\n postIcon: status.isReadonly ? 'icon-locked' : null,\n postIconTitle: this.I18n.t('js.work_packages.message_work_package_read_only'),\n class: Highlighting.inlineClass('status', status.id!),\n onClick: () => {\n this.updateStatus(status);\n return true;\n },\n }));\n }\n}\n","\n \n \n \n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport {\n ChangeDetectorRef, Component, Input, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\n\n@Component({\n selector: 'wp-status-button',\n styleUrls: ['./wp-status-button.component.sass'],\n templateUrl: './wp-status-button.html',\n})\nexport class WorkPackageStatusButtonComponent extends UntilDestroyedMixin implements OnInit {\n @Input('workPackage') public workPackage:WorkPackageResource;\n\n @Input() public small = false;\n\n public text = {\n explanation: this.I18n.t('js.label_edit_status'),\n workPackageReadOnly: this.I18n.t('js.work_packages.message_work_package_read_only'),\n workPackageStatusBlocked: this.I18n.t('js.work_packages.message_work_package_status_blocked'),\n };\n\n constructor(readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n readonly schemaCache:SchemaCacheService,\n readonly halEditing:HalResourceEditingService) {\n super();\n }\n\n ngOnInit() {\n this.halEditing\n .temporaryEditResource(this.workPackage)\n .values$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp) => {\n this.workPackage = wp;\n\n if (this.workPackage.status) {\n this.workPackage.status.$load();\n }\n\n this.cdRef.detectChanges();\n });\n }\n\n public get buttonTitle() {\n if (this.schema.isReadonly) {\n return this.text.workPackageReadOnly;\n } if (this.schema.isEditable && !this.allowed) {\n return this.text.workPackageStatusBlocked;\n }\n return '';\n }\n\n public get statusHighlightClass() {\n const { status } = this;\n if (!status) {\n return;\n }\n return Highlighting.backgroundClass('status', status.id!);\n }\n\n public get status():HalResource {\n return this.workPackage.status;\n }\n\n public get isReadonly() {\n return this.schema.isReadonly;\n }\n\n public get allowed() {\n return this.schema.isAttributeEditable('status');\n }\n\n private get schema() {\n if (this.halEditing.typedState(this.workPackage).hasValue()) {\n return this.halEditing.typedState(this.workPackage).value!.schema;\n }\n return this.schemaCache.of(this.workPackage);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\nimport * as sfimport from 'screenfull';\nimport { Screenfull } from 'screenfull';\nimport { AbstractWorkPackageButtonComponent } from '../wp-buttons.module';\n\nconst screenfull:Screenfull = sfimport as any;\nexport const zenModeComponentSelector = 'zen-mode-toggle-button';\n\n@Component({\n templateUrl: '../wp-button.template.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: zenModeComponentSelector,\n})\nexport class ZenModeButtonComponent extends AbstractWorkPackageButtonComponent {\n public buttonId = 'work-packages-zen-mode-toggle-button';\n\n public buttonClass = 'toolbar-icon';\n\n public iconClass = 'icon-zen-mode';\n\n static inZenMode = false;\n\n private activateLabel:string;\n\n private deactivateLabel:string;\n\n constructor(readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef) {\n super(I18n);\n\n this.activateLabel = I18n.t('js.zen_mode.button_activate');\n this.deactivateLabel = I18n.t('js.zen_mode.button_deactivate');\n const self = this;\n\n if (screenfull.enabled) {\n screenfull.onchange(() => {\n // This event might get triggered several times for once leaving\n // fullscreen mode.\n if (!screenfull.isFullscreen) {\n self.deactivateZenMode();\n }\n });\n }\n }\n\n public get label():string {\n if (this.isActive) {\n return this.deactivateLabel;\n }\n return this.activateLabel;\n }\n\n public isToggle():boolean {\n return true;\n }\n\n private deactivateZenMode():void {\n this.isActive = ZenModeButtonComponent.inZenMode = false;\n jQuery('body').removeClass('zen-mode');\n this.disabled = false;\n if (screenfull.enabled && screenfull.isFullscreen) {\n screenfull.exit();\n }\n this.cdRef.detectChanges();\n }\n\n private activateZenMode() {\n this.isActive = ZenModeButtonComponent.inZenMode = true;\n jQuery('body').addClass('zen-mode');\n if (screenfull.enabled) {\n screenfull.request();\n }\n this.cdRef.detectChanges();\n }\n\n public performAction(evt:Event):false {\n if (ZenModeButtonComponent.inZenMode) {\n this.deactivateZenMode();\n } else {\n this.activateZenMode();\n }\n\n evt.preventDefault();\n return false;\n }\n}\n","\n","import { Injector } from '@angular/core';\nimport { CardEventHandler } from 'core-app/features/work-packages/components/wp-card-view/event-handler/card-view-handler-registry';\nimport { WorkPackageCardViewComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { WorkPackageCardViewService } from 'core-app/features/work-packages/components/wp-card-view/services/wp-card-view.service';\nimport { StateService } from '@uirouter/core';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class CardClickHandler implements CardEventHandler {\n // Injections\n @InjectField() deviceService:DeviceService;\n\n @InjectField() $state:StateService;\n\n @InjectField() wpTableSelection:WorkPackageViewSelectionService;\n\n @InjectField() wpTableFocus:WorkPackageViewFocusService;\n\n @InjectField() wpCardView:WorkPackageCardViewService;\n\n constructor(public readonly injector:Injector,\n card:WorkPackageCardViewComponent) {\n }\n\n public get EVENT() {\n return 'click.cardView.card';\n }\n\n public get SELECTOR() {\n return `[data-qa-selector=\"op-wp-single-card\"]`;\n }\n\n public eventScope(card:WorkPackageCardViewComponent) {\n return jQuery(card.container.nativeElement);\n }\n\n public handleEvent(card:WorkPackageCardViewComponent, evt:JQuery.TriggeredEvent) {\n const target = jQuery(evt.target);\n\n // Ignore links\n if (target.is('a') || target.parent().is('a')) {\n return true;\n }\n\n // Locate the card from event\n const element = target.closest('wp-single-card');\n const wpId = element.data('workPackageId');\n\n if (!wpId) {\n return true;\n }\n\n this.handleWorkPackage(card, wpId, element, evt);\n\n return false;\n }\n\n protected handleWorkPackage(card:WorkPackageCardViewComponent, wpId:any, element:JQuery, evt:JQuery.TriggeredEvent) {\n this.setSelection(card, wpId, element, evt);\n\n card.itemClicked.emit({ workPackageId: wpId, double: false });\n }\n\n protected setSelection(card:WorkPackageCardViewComponent, wpId:string, element:JQuery, evt:JQuery.TriggeredEvent) {\n const classIdentifier = element.data('classIdentifier');\n const index = this.wpCardView.findRenderedCard(classIdentifier);\n\n // Update single selection if no modifier present\n if (!(evt.ctrlKey || evt.metaKey || evt.shiftKey)) {\n this.wpTableSelection.setSelection(wpId, index);\n }\n\n // Multiple selection if shift present\n if (evt.shiftKey) {\n this.wpTableSelection.setMultiSelectionFrom(this.wpCardView.renderedCards, wpId, index);\n }\n\n // Single selection expansion if ctrl / cmd(mac)\n if (evt.ctrlKey || evt.metaKey) {\n this.wpTableSelection.toggleRow(wpId);\n }\n\n card.selectionChanged.emit(this.wpTableSelection.getSelectedWorkPackageIds());\n\n // The current card is the last selected work package\n // not matter what other card are (de-)selected below.\n // Thus save that card for the details view button.\n this.wpTableFocus.updateFocus(wpId);\n }\n}\n","import { Injector } from '@angular/core';\nimport { CardEventHandler } from 'core-app/features/work-packages/components/wp-card-view/event-handler/card-view-handler-registry';\nimport { WorkPackageCardViewComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { StateService } from '@uirouter/core';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class CardDblClickHandler implements CardEventHandler {\n @InjectField() $state:StateService;\n\n @InjectField() wpTableSelection:WorkPackageViewSelectionService;\n\n constructor(public readonly injector:Injector,\n card:WorkPackageCardViewComponent) {\n }\n\n public get EVENT() {\n return 'dblclick.cardView.card';\n }\n\n public get SELECTOR() {\n return `[data-qa-selector=\"op-wp-single-card\"]`;\n }\n\n public eventScope(card:WorkPackageCardViewComponent) {\n return jQuery(card.container.nativeElement);\n }\n\n public handleEvent(card:WorkPackageCardViewComponent, evt:JQuery.TriggeredEvent) {\n const target = jQuery(evt.target);\n\n // Ignore links\n if (target.is('a') || target.parent().is('a')) {\n return true;\n }\n\n // Locate the row from event\n const element = target.closest('wp-single-card');\n const wpId = element.data('workPackageId');\n\n if (!wpId) {\n return true;\n }\n\n card.itemClicked.emit({ workPackageId: wpId, double: true });\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { CardEventHandler } from 'core-app/features/work-packages/components/wp-card-view/event-handler/card-view-handler-registry';\nimport { WorkPackageCardViewComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { uiStateLinkClass } from 'core-app/features/work-packages/components/wp-fast-table/builders/ui-state-link-builder';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { WorkPackageCardViewService } from 'core-app/features/work-packages/components/wp-card-view/services/wp-card-view.service';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { WorkPackageViewContextMenu } from 'core-app/shared/components/op-context-menu/wp-context-menu/wp-view-context-menu.directive';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class CardRightClickHandler implements CardEventHandler {\n // Injections\n @InjectField() wpTableSelection:WorkPackageViewSelectionService;\n\n @InjectField() wpCardView:WorkPackageCardViewService;\n\n @InjectField() opContextMenu:OPContextMenuService;\n\n constructor(public readonly injector:Injector,\n card:WorkPackageCardViewComponent) {\n }\n\n public get EVENT() {\n return 'contextmenu.cardView.rightclick';\n }\n\n public get SELECTOR() {\n return `[data-qa-selector=\"op-wp-single-card\"]`;\n }\n\n public eventScope(card:WorkPackageCardViewComponent) {\n return jQuery(card.container.nativeElement);\n }\n\n public handleEvent(card:WorkPackageCardViewComponent, evt:JQuery.TriggeredEvent) {\n const target = jQuery(evt.target);\n\n // We want to keep the original context menu on hrefs\n // (currently, this is only the id)\n if (target.closest(`.${uiStateLinkClass}`).length) {\n debugLog('Allowing original context menu on state link');\n return true;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n\n // Locate the card from event\n const element = target.closest('wp-single-card');\n const wpId = element.data('workPackageId');\n\n if (!wpId) {\n return true;\n }\n const classIdentifier = element.data('classIdentifier');\n const index = this.wpCardView.findRenderedCard(classIdentifier);\n\n if (!this.wpTableSelection.isSelected(wpId)) {\n this.wpTableSelection.setSelection(wpId, index);\n }\n\n const handler = new WorkPackageViewContextMenu(this.injector, wpId, jQuery(evt.target) as JQuery, {}, card.showInfoButton);\n this.opContextMenu.show(handler, evt);\n\n return false;\n }\n}\n","import { WorkPackageCardViewComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { CardClickHandler } from 'core-app/features/work-packages/components/wp-card-view/event-handler/click-handler';\nimport { CardDblClickHandler } from 'core-app/features/work-packages/components/wp-card-view/event-handler/double-click-handler';\nimport { CardRightClickHandler } from 'core-app/features/work-packages/components/wp-card-view/event-handler/right-click-handler';\nimport {\n WorkPackageViewEventHandler,\n WorkPackageViewHandlerRegistry,\n} from 'core-app/features/work-packages/routing/wp-view-base/event-handling/event-handler-registry';\n\nexport type CardEventHandler = WorkPackageViewEventHandler;\n\nexport class CardViewHandlerRegistry extends WorkPackageViewHandlerRegistry {\n protected eventHandlers:((c:WorkPackageCardViewComponent) => CardEventHandler)[] = [\n // Clicking on the card (not within a cell)\n (c) => new CardClickHandler(this.injector, c),\n // Double Clicking on the row (not within a cell)\n (c) => new CardDblClickHandler(this.injector, c),\n // Right clicking on cards\n (t) => new CardRightClickHandler(this.injector, t),\n ];\n}\n","import { Injectable, Injector, Optional } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageViewOrderService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageCreateService } from 'core-app/features/work-packages/components/wp-new/wp-create.service';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { DragAndDropService } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.service';\nimport { findIndex } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.helpers';\nimport { WorkPackageCardViewComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\n@Injectable()\nexport class WorkPackageCardDragAndDropService {\n private _workPackages:WorkPackageResource[];\n\n /** Whether the card view has an active inline created wp */\n public activeInlineCreateWp?:WorkPackageResource;\n\n /** A reference to the component in use, to have access to the current input variables */\n public cardView:WorkPackageCardViewComponent;\n\n public constructor(readonly states:States,\n readonly injector:Injector,\n readonly reorderService:WorkPackageViewOrderService,\n readonly wpCreate:WorkPackageCreateService,\n readonly notificationService:WorkPackageNotificationService,\n readonly apiV3Service:ApiV3Service,\n readonly currentProject:CurrentProjectService,\n @Optional() readonly dragService:DragAndDropService,\n readonly wpInlineCreate:WorkPackageInlineCreateService) {\n\n }\n\n public init(componentRef:WorkPackageCardViewComponent) {\n this.cardView = componentRef;\n }\n\n public destroy() {\n if (this.dragService !== null) {\n this.dragService.remove(this.cardView.container.nativeElement);\n }\n }\n\n public registerDragAndDrop() {\n // The DragService may not have been provided\n // in which case we do not provide drag and drop\n if (this.dragService === null) {\n return;\n }\n\n this.dragService.register({\n dragContainer: this.cardView.container.nativeElement,\n scrollContainers: [this.cardView.container.nativeElement],\n moves: (card:HTMLElement) => {\n const wpId:string = card.dataset.workPackageId!;\n const workPackage = this.states.workPackages.get(wpId).value;\n\n return !!workPackage && this.cardView.canDragOutOf(workPackage) && !card.dataset.isNew;\n },\n accepts: () => this.cardView.dragInto,\n onMoved: async (card:HTMLElement) => {\n const wpId:string = card.dataset.workPackageId!;\n const toIndex = findIndex(card);\n\n const newOrder = await this.reorderService.move(this.currentOrder, wpId, toIndex);\n this.updateOrder(newOrder);\n\n this.cardView.onMoved.emit();\n },\n onRemoved: (card:HTMLElement) => {\n const wpId:string = card.dataset.workPackageId!;\n\n const newOrder = this.reorderService.remove(this.currentOrder, wpId);\n this.updateOrder(newOrder);\n },\n onAdded: async (card:HTMLElement) => {\n const wpId:string = card.dataset.workPackageId!;\n const toIndex = findIndex(card);\n\n const workPackage = await this\n .apiV3Service\n .work_packages\n .id(wpId)\n .get()\n .toPromise();\n const result = await this.addWorkPackageToQuery(workPackage, toIndex);\n\n if (card.parentElement) {\n card.parentElement.removeChild(card);\n }\n\n return result;\n },\n });\n }\n\n /**\n * Get the current work packages\n */\n public get workPackages():WorkPackageResource[] {\n return this._workPackages;\n }\n\n /**\n * Set work packages array,\n * remembering to keep the active inline-create\n */\n public set workPackages(workPackages:WorkPackageResource[]) {\n if (this.activeInlineCreateWp) {\n const existingNewWp = this._workPackages.find((o) => isNewResource(o));\n\n // If there is already a card for a new WP,\n // we have to replace this one by the new activeInlineCreateWp\n if (existingNewWp) {\n const index = this._workPackages.indexOf(existingNewWp);\n this._workPackages[index] = this.activeInlineCreateWp;\n } else {\n this._workPackages = [this.activeInlineCreateWp, ...workPackages];\n }\n } else {\n this._workPackages = [...workPackages];\n }\n }\n\n /**\n * Get current order\n */\n private get currentOrder():string[] {\n return this.workPackages\n .filter((wp) => wp && !isNewResource(wp))\n .map((el) => el.id!);\n }\n\n /**\n * Update current order\n */\n private updateOrder(newOrder:string[]) {\n newOrder = _.uniq(newOrder);\n\n Promise\n .all(newOrder.map((id) => this\n .apiV3Service\n .work_packages\n .id(id)\n .get()\n .toPromise()))\n .then((workPackages:WorkPackageResource[]) => {\n this.workPackages = workPackages;\n this.cardView.cdRef.detectChanges();\n });\n }\n\n /**\n * Inline create a new card\n */\n public addNewCard() {\n this.wpCreate\n .createOrContinueWorkPackage(this.currentProject.identifier)\n .then((changeset:WorkPackageChangeset) => {\n this.activeInlineCreateWp = changeset.projectedResource;\n this.workPackages = this.workPackages;\n this.cardView.cdRef.detectChanges();\n });\n }\n\n /**\n * Add the given work package to the query\n */\n async addWorkPackageToQuery(workPackage:WorkPackageResource, toIndex = -1):Promise {\n try {\n await this.cardView.workPackageAddedHandler(workPackage);\n const newOrder = await this.reorderService.add(this.currentOrder, workPackage.id!, toIndex);\n this.updateOrder(newOrder);\n return true;\n } catch (e) {\n this.notificationService.handleRawError(e, workPackage);\n }\n\n return false;\n }\n\n /**\n * Remove the new card\n */\n public removeReferenceWorkPackageForm() {\n if (this.activeInlineCreateWp) {\n this.removeCard(this.activeInlineCreateWp);\n }\n }\n\n removeCard(wp:WorkPackageResource) {\n const index = this.workPackages.indexOf(wp);\n this.workPackages.splice(index, 1);\n this.activeInlineCreateWp = undefined;\n\n if (!isNewResource(wp)) {\n const newOrder = this.reorderService.remove(this.currentOrder, wp.id!);\n this.updateOrder(newOrder);\n }\n }\n\n /**\n * On new card saved\n */\n async onCardSaved(wp:WorkPackageResource) {\n const index = this.workPackages.findIndex((el) => el.id === 'new');\n\n if (index !== -1) {\n this.activeInlineCreateWp = undefined;\n\n // Add this item to the results\n const newOrder = await this.reorderService.add(this.currentOrder, wp.id!, index);\n this.updateOrder(newOrder);\n\n // Notify inline create service\n this.wpInlineCreate.newInlineWorkPackageCreated.next(wp.id!);\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\n\n@Injectable()\nexport class WorkPackageCardViewService {\n public constructor(readonly querySpace:IsolatedQuerySpace) {\n }\n\n public classIdentifier(wp:WorkPackageResource) {\n // The same class names are used for the proximity to the table representation.\n return `wp-row-${wp.id}`;\n }\n\n public get renderedCards() {\n return this.querySpace.tableRendered.getValueOr([]);\n }\n\n public findRenderedCard(classIdentifier:string):number {\n const index = _.findIndex(this.renderedCards, (card) => card.classIdentifier === classIdentifier);\n\n return index;\n }\n\n public updateRenderedCardsValues(workPackages:WorkPackageResource[]) {\n this.querySpace.tableRendered.putValue(\n workPackages.map((wp) => ({\n classIdentifier: this.classIdentifier(wp),\n workPackageId: wp.id,\n hidden: false,\n })),\n );\n }\n}\n","
\n
\n \n \n
\n\n \n \n \n\n
\n
\n
\n\n
\n \n
\n\n\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Injector,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { WorkPackageCreateService } from 'core-app/features/work-packages/components/wp-new/wp-create.service';\nimport { trackByHrefAndProperty } from 'core-app/shared/helpers/angular/tracking-functions';\nimport { CardHighlightingMode } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting-mode.const';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { StateService } from '@uirouter/core';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewOrderService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport {\n filter,\n map,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { CausedUpdatesService } from 'core-app/features/boards/board/caused-updates/caused-updates.service';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { CardViewHandlerRegistry } from 'core-app/features/work-packages/components/wp-card-view/event-handler/card-view-handler-registry';\nimport { WorkPackageCardViewService } from 'core-app/features/work-packages/components/wp-card-view/services/wp-card-view.service';\nimport { WorkPackageCardDragAndDropService } from 'core-app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport {\n WorkPackageViewHandlerToken,\n WorkPackageViewOutputs,\n} from 'core-app/features/work-packages/routing/wp-view-base/event-handling/event-handler-registry';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\nexport type CardViewOrientation = 'horizontal'|'vertical';\n\n@Component({\n selector: 'wp-card-view',\n styleUrls: ['./styles/wp-card-view.component.sass', './styles/wp-card-view-horizontal.sass', './styles/wp-card-view-vertical.sass'],\n templateUrl: './wp-card-view.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageCardViewComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit, WorkPackageViewOutputs {\n @Input('dragOutOfHandler') public canDragOutOf:(wp:WorkPackageResource) => boolean;\n\n @Input() public dragInto:boolean;\n\n @Input() public highlightingMode:CardHighlightingMode;\n\n @Input() public workPackageAddedHandler:(wp:WorkPackageResource) => Promise;\n\n @Input() public showStatusButton = true;\n\n @Input() public showInfoButton = false;\n\n @Input() public orientation:CardViewOrientation = 'vertical';\n\n /** Whether cards are removable */\n @Input() public cardsRemovable = false;\n\n /** Whether a notification box shall be shown when there are no WP to display */\n @Input() public showEmptyResultsBox = false;\n\n /** Whether on special mobile version of the cards shall be shown */\n @Input() public shrinkOnMobile = false;\n\n /** Container reference */\n @ViewChild('container', { static: true }) public container:ElementRef;\n\n @Output() public onMoved = new EventEmitter();\n\n @Output() selectionChanged = new EventEmitter();\n\n @Output() itemClicked = new EventEmitter<{ workPackageId:string, double:boolean }>();\n\n @Output() stateLinkClicked = new EventEmitter<{ workPackageId:string, requestedState:string }>();\n\n public trackByHref = trackByHrefAndProperty('lockVersion');\n\n public query:QueryResource;\n\n public isResultEmpty = false;\n\n public columns:QueryColumn[];\n\n public text = {\n removeCard: this.I18n.t('js.card.remove_from_list'),\n addNewCard: this.I18n.t('js.card.add_new'),\n noResults: {\n title: this.I18n.t('js.work_packages.no_results.title'),\n description: this.I18n.t('js.work_packages.no_results.description'),\n },\n };\n\n public inReference = false;\n\n public referenceClass = this.wpInlineCreate.referenceComponentClass;\n\n // We need to mount a dynamic component into the view\n // but map the following output\n public referenceOutputs = {\n onCancel: () => this.setReferenceMode(false),\n onReferenced: (wp:WorkPackageResource) => this.cardDragDrop.addWorkPackageToQuery(wp, 0),\n };\n\n isNewResource = isNewResource;\n\n constructor(readonly querySpace:IsolatedQuerySpace,\n readonly states:States,\n readonly injector:Injector,\n readonly $state:StateService,\n readonly I18n:I18nService,\n readonly wpCreate:WorkPackageCreateService,\n readonly wpInlineCreate:WorkPackageInlineCreateService,\n readonly notificationService:WorkPackageNotificationService,\n readonly halEvents:HalEventsService,\n readonly authorisationService:AuthorisationService,\n readonly causedUpdates:CausedUpdatesService,\n readonly cdRef:ChangeDetectorRef,\n readonly pathHelper:PathHelperService,\n readonly wpTableSelection:WorkPackageViewSelectionService,\n readonly wpViewOrder:WorkPackageViewOrderService,\n readonly cardView:WorkPackageCardViewService,\n readonly cardDragDrop:WorkPackageCardDragAndDropService,\n readonly deviceService:DeviceService) {\n super();\n }\n\n ngOnInit() {\n this.registerCreationCallback();\n\n // Observe changes to the work packages in this view\n this.halEvents\n .aggregated$('WorkPackage')\n .pipe(\n map((events) => events.filter((event) => event.eventType === 'updated')),\n filter((events) => {\n const wpIds:string[] = this.workPackages.map((el) => el.id!.toString());\n return !!events.find((event) => wpIds.indexOf(event.id) !== -1);\n }),\n ).subscribe(() => {\n this.workPackages = this.workPackages.map((wp) => this.states.workPackages.get(wp.id!).getValueOr(wp));\n this.cdRef.detectChanges();\n });\n\n this.querySpace.results\n .values$()\n .pipe(\n withLatestFrom(this.querySpace.query.values$()),\n this.untilDestroyed(),\n ).subscribe(([results, query]) => {\n this.query = query;\n this.workPackages = this.wpViewOrder.orderedWorkPackages();\n this.cardView.updateRenderedCardsValues(this.workPackages);\n this.isResultEmpty = this.workPackages.length === 0;\n this.cdRef.detectChanges();\n });\n }\n\n ngAfterViewInit() {\n this.cardDragDrop.init(this);\n\n // Register Drag & Drop only on desktop\n if (!this.deviceService.isMobile) {\n this.cardDragDrop.registerDragAndDrop();\n }\n\n // Register event handlers for the cards\n const registry = this.injector.get(WorkPackageViewHandlerToken, CardViewHandlerRegistry);\n if (registry instanceof CardViewHandlerRegistry) {\n registry.attachTo(this);\n } else {\n new registry(this.injector).attachTo(this);\n }\n this.wpTableSelection.registerSelectAllListener(() => this.cardView.renderedCards);\n this.wpTableSelection.registerDeselectAllListener();\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n this.cardDragDrop.destroy();\n }\n\n public get workPackages():WorkPackageResource[] {\n return this.cardDragDrop.workPackages;\n }\n\n public set workPackages(workPackages:WorkPackageResource[]) {\n this.cardDragDrop.workPackages = workPackages;\n }\n\n public setReferenceMode(mode:boolean) {\n this.inReference = mode;\n this.cdRef.detectChanges();\n }\n\n public addNewCard() {\n this.cardDragDrop.addNewCard();\n }\n\n public removeCard(wp:WorkPackageResource) {\n this.cardDragDrop.removeCard(wp);\n }\n\n async onCardSaved(wp:WorkPackageResource) {\n await this.cardDragDrop.onCardSaved(wp);\n }\n\n public classes() {\n let classes = 'wp-cards-container ';\n classes += `-${this.orientation}`;\n classes += this.shrinkOnMobile ? ' -shrink' : '';\n\n return classes;\n }\n\n /**\n * Listen to newly created work packages to detect whether the WP is the one we created,\n * and properly reset inline create in this case\n */\n private registerCreationCallback() {\n this.wpCreate\n .onNewWorkPackage()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(async (wp:WorkPackageResource) => {\n this.onCardSaved(wp);\n });\n }\n}\n","\n\n
\n
\n\n
\n
\n \n \n \n\n \n \n \n\n 0\"\n [attr.data-tooltip]=\"disabledInfo.text\"\n class=\"-multiline op-wp-single-card--card-action op-wp-single-card--card-action_closed\"\n [ngClass]=\"'tooltip--' + disabledInfo.orientation\"\n icon-classes=\"icon-context icon-not-supported\">\n \n
\n
\n\n \n
\n \n \n \n \n
\n
\n\n
\n \n - {{wpProjectName(workPackage)}}\n \n \n #{{workPackage.id}}\n \n\n \n \n {{startDate(workPackage)}} -\n \n\n \n\n \n\n \n - {{endDate(workPackage)}}\n \n \n\n \n \n \n \n
\n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { uiStateLinkClass } from 'core-app/features/work-packages/components/wp-fast-table/builders/ui-state-link-builder';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\nimport {\n StateService,\n UIRouterGlobals,\n} from '@uirouter/core';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { WorkPackageCardViewService } from 'core-app/features/work-packages/components/wp-card-view/services/wp-card-view.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CardHighlightingMode } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting-mode.const';\nimport { CardViewOrientation } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { isClickedWithModifier } from 'core-app/shared/helpers/link-handling/link-handling';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { StatusResource } from 'core-app/features/hal/resources/status-resource';\nimport { combineLatest } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n@Component({\n selector: 'wp-single-card',\n styleUrls: ['./wp-single-card.component.sass'],\n templateUrl: './wp-single-card.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageSingleCardComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public selectedWhenOpen = false;\n\n @Input() public showInfoButton = false;\n\n @Input() public showStatusButton = true;\n\n @Input() public showRemoveButton = false;\n\n @Input() public highlightingMode:CardHighlightingMode = 'inline';\n\n @Input() public draggable = false;\n\n @Input() public orientation:CardViewOrientation = 'vertical';\n\n @Input() public shrinkOnMobile = false;\n\n @Input() public disabledInfo?:{ text:string, orientation:'left'|'right' };\n\n @Input() public showAsInlineCard = false;\n\n @Input() public showStartDate = true;\n\n @Input() public showEndDate = true;\n\n @Input() public isClosed = false;\n\n @Input() public showAsGhost = false;\n\n @Output() onRemove = new EventEmitter();\n\n @Output() stateLinkClicked = new EventEmitter<{ workPackageId:string, requestedState:string }>();\n\n @Output() cardClicked = new EventEmitter<{ workPackageId:string, event:MouseEvent }>();\n\n @Output() cardDblClicked = new EventEmitter<{ workPackageId:string, event:MouseEvent }>();\n\n @Output() cardContextMenu = new EventEmitter<{ workPackageId:string, event:MouseEvent }>();\n\n public uiStateLinkClass:string = uiStateLinkClass;\n\n public selected = false;\n\n public text = {\n removeCard: this.I18n.t('js.card.remove_from_list'),\n detailsView: this.I18n.t('js.button_open_details'),\n };\n\n public isNewResource = isNewResource;\n\n private dateTimeFormatYear = new Intl.DateTimeFormat(this.I18n.locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n\n private dateTimeFormat = new Intl.DateTimeFormat(this.I18n.locale, {\n month: 'short',\n day: 'numeric',\n });\n\n constructor(\n readonly pathHelper:PathHelperService,\n readonly I18n:I18nService,\n readonly $state:StateService,\n readonly uiRouterGlobals:UIRouterGlobals,\n readonly wpTableSelection:WorkPackageViewSelectionService,\n readonly wpTableFocus:WorkPackageViewFocusService,\n readonly cardView:WorkPackageCardViewService,\n readonly cdRef:ChangeDetectorRef,\n readonly timezoneService:TimezoneService,\n ) {\n super();\n }\n\n ngOnInit():void {\n // Update selection state\n combineLatest([\n this.wpTableSelection.live$(),\n this.uiRouterGlobals.params$,\n ])\n .pipe(\n this.untilDestroyed(),\n map(() => {\n if (this.selectedWhenOpen) {\n return this.uiRouterGlobals.params.workPackageId === this.workPackage.id;\n }\n\n return this.wpTableSelection.isSelected(this.workPackage.id as string);\n }),\n )\n .subscribe((selected) => {\n this.selected = selected;\n this.cdRef.detectChanges();\n });\n }\n\n public classIdentifier(wp:WorkPackageResource):string {\n return this.cardView.classIdentifier(wp);\n }\n\n public emitStateLinkClicked(event:MouseEvent, wp:WorkPackageResource, detail?:boolean):void {\n if (isClickedWithModifier(event)) {\n return;\n }\n\n const classIdentifier = this.classIdentifier(wp);\n const stateToEmit = detail ? 'split' : 'show';\n\n this.wpTableSelection.setSelection(wp.id!, this.cardView.findRenderedCard(classIdentifier));\n this.wpTableFocus.updateFocus(wp.id!);\n this.stateLinkClicked.emit({ workPackageId: wp.id!, requestedState: stateToEmit });\n event.preventDefault();\n }\n\n public cardClasses():{ [className:string]:boolean } {\n const base = 'op-wp-single-card';\n\n return {\n [`${base}_selected`]: this.selected,\n [`${base}_draggable`]: this.draggable,\n [`${base}_new`]: isNewResource(this.workPackage),\n [`${base}_shrink`]: this.shrinkOnMobile,\n [`${base}_inline`]: this.showAsInlineCard,\n [`${base}_closed`]: this.isClosed,\n [`${base}_ghosted`]: this.showAsGhost,\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n [`${base}-${this.workPackage.id}`]: !!this.workPackage.id,\n [`${base}_${this.orientation}`]: true,\n };\n }\n\n cardTitle():string {\n return `${this.workPackage.subject} (${(this.workPackage.status as StatusResource).name})`;\n }\n\n // eslint-disable-next-line class-methods-use-this\n public wpTypeAttribute(wp:WorkPackageResource):string {\n return wp.type.name;\n }\n\n // eslint-disable-next-line class-methods-use-this\n public wpSubject(wp:WorkPackageResource):string {\n return wp.subject;\n }\n\n // eslint-disable-next-line class-methods-use-this\n public wpProjectName(wp:WorkPackageResource):string {\n return wp.project?.name;\n }\n\n public wpDates(wp:WorkPackageResource):string {\n const { startDate, dueDate } = wp;\n\n if (startDate && dueDate) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore see https://github.com/microsoft/TypeScript/issues/46905\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n return String(this.dateTimeFormatYear.formatRange(new Date(startDate), new Date(dueDate)));\n }\n\n if (!startDate && dueDate) {\n return `– ${this.dateTimeFormatYear.format(new Date(dueDate))}`;\n }\n\n if (startDate && !dueDate) {\n return `${this.dateTimeFormatYear.format(new Date(startDate))} –`;\n }\n\n return '';\n }\n\n startDate(wp:WorkPackageResource):string {\n const { startDate } = wp;\n if (!startDate) {\n return '';\n }\n\n return this.dateTimeFormat.format(new Date(startDate));\n }\n\n endDate(wp:WorkPackageResource):string {\n const { dueDate } = wp;\n if (!dueDate) {\n return '';\n }\n\n return this.dateTimeFormat.format(new Date(dueDate));\n }\n\n wpOverDueHighlighting(wp:WorkPackageResource):string {\n const diff = this.timezoneService.daysFromToday(wp.dueDate);\n return Highlighting.overdueDate(diff);\n }\n\n public fullWorkPackageLink(wp:WorkPackageResource):string {\n return this.$state.href('work-packages.show', { workPackageId: wp.id });\n }\n\n public cardHighlightingClass(wp:WorkPackageResource):string {\n return this.cardHighlighting(wp);\n }\n\n public typeHighlightingClass(wp:WorkPackageResource):string {\n return this.attributeHighlighting('type', wp);\n }\n\n public onRemoved(wp:WorkPackageResource):void {\n this.onRemove.emit(wp);\n }\n\n public cardCoverImageShown(wp:WorkPackageResource):boolean {\n return this.bcfSnapshotPath(wp) !== null;\n }\n\n // eslint-disable-next-line class-methods-use-this\n public bcfSnapshotPath(wp:WorkPackageResource):string|null {\n return wp.bcfViewpoints && wp.bcfViewpoints.length > 0 ? `${wp.bcfViewpoints[0].href}/snapshot` : null;\n }\n\n private cardHighlighting(wp:WorkPackageResource):string {\n if (['status', 'priority', 'type'].includes(this.highlightingMode)) {\n return Highlighting.backgroundClass(this.highlightingMode, wp[this.highlightingMode].id);\n }\n return '';\n }\n\n // eslint-disable-next-line class-methods-use-this\n private attributeHighlighting(type:string, wp:WorkPackageResource):string {\n return Highlighting.inlineClass(type, wp.type.id!);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { take } from 'rxjs/operators';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageCreateComponent } from 'core-app/features/work-packages/components/wp-new/wp-create.component';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\n\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { Directive } from '@angular/core';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Directive()\nexport class WorkPackageCopyController extends WorkPackageCreateComponent {\n private __initialized_at:number;\n\n private copiedWorkPackageId:string;\n\n /** Are we in the copying substates ? */\n public copying = true;\n\n @InjectField() wpRelations:WorkPackageRelationsService;\n\n @InjectField() halEditing:HalResourceEditingService;\n\n ngOnInit() {\n super.ngOnInit();\n\n this.wpCreate.onNewWorkPackage()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp:WorkPackageResource) => {\n if (wp.__initialized_at === this.__initialized_at) {\n this.wpRelations.addCommonRelation(wp.id!, 'relates', this.copiedWorkPackageId);\n }\n });\n }\n\n protected createdWorkPackage() {\n this.copiedWorkPackageId = this.stateParams.copiedFromWorkPackageId;\n return new Promise((resolve, reject) => {\n this\n .apiV3Service\n .work_packages\n .id(this.copiedWorkPackageId)\n .get()\n .pipe(\n take(1),\n )\n .subscribe((wp:WorkPackageResource) => {\n this.createCopyFrom(wp).then(resolve, reject);\n });\n });\n }\n\n protected setTitle() {\n this.titleService.setFirstPart(this.I18n.t('js.work_packages.copy.title'));\n }\n\n private createCopyFrom(wp:WorkPackageResource) {\n const sourceChangeset:WorkPackageChangeset = this.halEditing.changeFor(wp);\n\n return this.wpCreate\n .copyWorkPackage(sourceChangeset)\n .then((copyChangeset) => {\n this.__initialized_at = copyChangeset.pristineResource.__initialized_at;\n\n this\n .apiV3Service\n .work_packages\n .cache\n .updateWorkPackage(copyChangeset.pristineResource, true);\n\n this.halEditing.updateValue('new', copyChangeset);\n\n return copyChangeset;\n });\n }\n}\n","import { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { Injector } from '@angular/core';\nimport { compareByHrefOrString } from 'core-app/shared/helpers/angular/tracking-functions';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { FilterOperator } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\n\nexport class WorkPackageFilterValues {\n @InjectField() currentUser:CurrentUserService;\n\n @InjectField() halResourceService:HalResourceService;\n\n @InjectField() currentProject:CurrentProjectService;\n\n handlers:Partial void>> = {\n '=': this.applyFirstValue.bind(this),\n '!*': this.setToNull.bind(this),\n };\n\n constructor(\n public injector:Injector,\n private filters:QueryFilterInstanceResource[],\n private excluded:string[] = [],\n ) {}\n\n applyDefaultsFromFilters(change:WorkPackageChangeset|Object):void {\n _.each(this.filters, (filter) => {\n // Exclude filters specified in constructor\n if (this.excluded.indexOf(filter.id) !== -1) {\n return;\n }\n\n // Special case due to the introduction of the project include dropdown\n // If we are in a project, we want the create wp to be part of that project.\n // Only for embedded tables, there might be different filter values necessary.\n if (filter.id === 'project') {\n const projectFilter = _.find(filter.values, (resource:HalResource|string) => {\n return ((resource instanceof HalResource) ? resource.href : resource) === this.currentProject.apiv3Path;\n });\n this.setValue(change, 'project', projectFilter || filter.values[0]);\n\n return;\n }\n\n // ID filters should never be taken over\n if (filter.id === 'id') {\n return;\n }\n\n // Look for a handler with the filter's operator\n const operator = filter.operator.id as FilterOperator;\n const handler = this.handlers[operator];\n\n // Apply the filter if there is any\n handler?.call(this, change, filter);\n });\n }\n\n /**\n * Apply a positive value from a '=' [value] filter\n *\n * @param filter A positive '=' filter with at least one value\n * @private\n */\n private applyFirstValue(change:WorkPackageChangeset|{ [id:string]:any }, filter:QueryFilterInstanceResource):void {\n // Avoid setting a value if current value is in filter list\n // and more than one value selected\n if (this.filterAlreadyApplied(change, filter)) {\n return;\n }\n\n // Select the first value\n const value = filter.values[0];\n\n // Avoid empty values\n if (value) {\n const attributeName = this.mapFilterToAttribute(filter);\n this.setValueFor(change, attributeName, value);\n }\n }\n\n /**\n * Set a value no null for a none type filter (!*)\n *\n * @param filter A none '!*' filter\n * @private\n */\n private setToNull(change:WorkPackageChangeset|{ [id:string]:any }, filter:QueryFilterInstanceResource):void {\n const attributeName = this.mapFilterToAttribute(filter);\n\n this.setValue(change, attributeName, { href: null });\n }\n\n private setValueFor(change:WorkPackageChangeset|Object, field:string, value:string|HalResource):void {\n const newValue = this.findSpecialValue(value, field) || value;\n\n if (newValue) {\n this.setValue(change, field, newValue);\n }\n }\n\n private setValue(change:WorkPackageChangeset|{ [id:string]:any }, field:string, value:any):void {\n if (change instanceof WorkPackageChangeset) {\n change.setValue(field, value);\n } else {\n change[field] = value;\n }\n }\n\n /**\n * Returns special values for which no allowed values exist (e.g., parent ID in embedded queries)\n * @param {string | HalResource} value\n * @param {string} field\n */\n private findSpecialValue(value:string|HalResource, field:string):string|HalResource|undefined {\n if (field === 'parent') {\n return value;\n }\n\n if (value instanceof HalResource && value.href === '/api/v3/users/me' && this.currentUser.isLoggedIn) {\n return this.halResourceService.fromSelfLink(`/api/v3/users/${this.currentUser.userId}`);\n }\n\n return undefined;\n }\n\n /**\n * Avoid applying filter values when changeset already matches one of the selected values\n * @param filter\n */\n private filterAlreadyApplied(change:WorkPackageChangeset|{ [id:string]:any }, filter:any):boolean {\n let current = change instanceof WorkPackageChangeset ? change.projectedResource[filter.id] : change[filter.id];\n current = _.castArray(current);\n\n for (let i = 0; i < filter.values.length; i++) {\n for (let j = 0; j < current.length; j++) {\n if (compareByHrefOrString(current[j], filter.values[i])) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Some filter ids need to be mapped to a different attribute name\n * in order to be processed correctly.\n *\n * @param filter The filter to map\n * @returns An attribute name string to set\n * @private\n */\n private mapFilterToAttribute(filter:any):string {\n if (filter.id === 'onlySubproject') {\n return 'project';\n }\n\n // Default to returning the filter id\n return filter.id;\n }\n}\n","import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { WorkPackageSchemaProxy } from 'core-app/features/hal/schemas/work-package-schema-proxy';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\nexport class WorkPackageChangeset extends ResourceChangeset {\n public setValue(key:string, val:any) {\n super.setValue(key, val);\n\n if (key === 'project' || key === 'type') {\n this.updateForm();\n }\n }\n\n protected applyChanges(payload:any):any {\n // Explicitly delete the description if it was not set by the user.\n // if it was set by the user, #applyChanges will set it again.\n // Otherwise, the backend will set it for us.\n delete payload.description;\n\n return super.applyChanges(payload);\n }\n\n protected setNewDefaultFor(key:string, val:unknown) {\n // Special handling for taking over the description\n // to the pristine resource\n if (key === 'description' && isNewResource(this.pristineResource)) {\n this.pristineResource.description = val;\n return;\n }\n\n super.setNewDefaultFor(key, val);\n }\n\n /**\n * Get the best schema currently available, either the default resource schema (must exist).\n * If loaded, return the form schema, which provides better information on writable status\n * and contains available values.\n */\n public get schema():SchemaResource {\n if (this.form$.hasValue()) {\n return WorkPackageSchemaProxy.create(super.schema, this.projectedResource);\n }\n return super.schema;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component, ElementRef, Input, OnInit,\n} from '@angular/core';\nimport { EditFormComponent } from 'core-app/shared/components/fields/edit/edit-form/edit-form.component';\n\n@Component({\n selector: 'wp-replacement-label',\n templateUrl: './wp-replacement-label.html',\n})\nexport class WorkPackageReplacementLabelComponent implements OnInit {\n @Input('fieldName') public fieldName:string;\n\n private $element:JQuery;\n\n constructor(protected wpeditForm:EditFormComponent,\n protected elementRef:ElementRef) {\n }\n\n ngOnInit() {\n this.$element = jQuery(this.elementRef.nativeElement);\n }\n\n public activate(evt:JQuery.TriggeredEvent) {\n // Skip clicks on help texts\n const target = jQuery(evt.target);\n if (target.closest('.help-text--entry').length) {\n return true;\n }\n\n const field = this.wpeditForm.fields[this.fieldName];\n field && field.handleUserActivate(null);\n\n return false;\n }\n}\n","\n \n\n","import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport {\n DisplayFieldRenderer,\n editFieldContainerClass,\n} from 'core-app/shared/components/fields/display/display-field-renderer';\nimport { Injector } from '@angular/core';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport const tdClassName = 'wp-table--cell-td';\nexport const editCellContainer = 'wp-table--cell-container';\n\nexport class CellBuilder {\n @InjectField(SchemaCacheService) schemaCache:SchemaCacheService;\n\n public fieldRenderer = new DisplayFieldRenderer(this.injector, 'table');\n\n constructor(public injector:Injector) {\n }\n\n public build(workPackage:WorkPackageResource, column:QueryColumn) {\n const td = document.createElement('td');\n const attribute = column.id;\n td.classList.add(tdClassName, attribute);\n\n if (attribute === 'subject') {\n td.classList.add('-max');\n }\n\n const schema = this.schemaCache.of(workPackage).ofProperty(attribute);\n if (schema && schema.type === 'User') {\n td.classList.add('-contains-avatar');\n }\n\n const container = document.createElement('span');\n container.classList.add(editCellContainer, editFieldContainerClass, attribute);\n const displayElement = this.fieldRenderer.render(workPackage, attribute, null);\n\n container.appendChild(displayElement);\n td.appendChild(container);\n\n return td;\n }\n\n public refresh(container:HTMLElement, workPackage:WorkPackageResource, attribute:string) {\n const displayElement = this.fieldRenderer.render(workPackage, attribute, null);\n\n container.innerHTML = '';\n container.appendChild(displayElement);\n }\n}\n","export namespace Highlighting {\n export function backgroundClass(property:string, id:string|number) {\n return `__hl_background_${property}_${id}`;\n }\n\n export function inlineClass(property:string, id:string|number) {\n return `__hl_inline_${property}_${id}`;\n }\n\n export function colorClass(highlightColorTextInline:boolean, id:string|number) {\n if (highlightColorTextInline) {\n return `__hl_inline_color_${id}_text`;\n }\n return `__hl_inline_color_${id}_dot`;\n }\n\n /**\n * Given the difference from today (negative = n days in the past),\n * output the fixed overdue classes\n * @param diff\n */\n export function overdueDate(diff:number):string {\n if (diff === 0) {\n return '__hl_date_due_today';\n }\n // At least one day\n if (diff <= -1) {\n return '__hl_date_overdue';\n }\n\n return '__hl_date_not_overdue';\n }\n\n export function isBright(styles:CSSStyleDeclaration, property:string, id:string|number) {\n const variable = `--hl-${property}-${id}-dark`;\n return styles.getPropertyValue(variable) !== '';\n }\n}\n","import { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\n\nexport const internalSortColumn = {\n id: '__internal-sorthandle',\n} as QueryColumn;\n\nexport const internalContextMenuColumn = {\n id: '__internal-contextMenu',\n} as QueryColumn;\n","import { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { SingleRowBuilder } from 'core-app/features/work-packages/components/wp-fast-table/builders/rows/single-row-builder';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { DisplayFieldService } from 'core-app/shared/components/fields/display/display-field.service';\nimport { groupedRowClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-rows-helpers';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { GroupObject } from 'core-app/features/hal/resources/wp-collection-resource';\n\nexport class GroupSumsBuilder extends SingleRowBuilder {\n @InjectField() readonly querySpace:IsolatedQuerySpace;\n\n @InjectField() readonly schemaCache:SchemaCacheService;\n\n @InjectField() readonly displayFieldService:DisplayFieldService;\n\n public text = {\n sum: this.I18n.t('js.label_sum'),\n };\n\n public buildSumsRow(group:GroupObject) {\n const tr:HTMLTableRowElement = document.createElement('tr');\n tr.classList.add('wp-table--sums-row', 'wp-table--row', groupedRowClassName(group.index));\n\n this.renderColumns(group.sums, tr);\n\n return tr;\n }\n\n public renderColumns(sums:{ [key:string]:any }, tr:HTMLTableRowElement) {\n this.augmentedColumns.forEach((column, i:number) => {\n const td = document.createElement('td');\n const div = this.renderContent(sums, column.id, this.sumsSchema[column.id]);\n\n if (i === 0) {\n this.appendFirstLabel(div);\n }\n\n td.appendChild(div);\n tr.append(td);\n });\n }\n\n private appendFirstLabel(div:HTMLElement) {\n const span = document.createElement('span');\n span.textContent = `${this.text.sum}`;\n span.title = `${this.text.sum}`;\n div.prepend(span);\n }\n\n private get sumsSchema():SchemaResource {\n // The schema is ensured to be loaded by wpViewAdditionalElementsService\n const results = this.querySpace.results.value!;\n const href = results.sumsSchema!.href!;\n\n return this.schemaCache.state(href).value!;\n }\n\n private renderContent(sums:any, name:string, fieldSchema:IFieldSchema) {\n const div = document.createElement('div');\n div.classList.add('wp-table--sum-container', name);\n\n // The field schema for this element may be undefined\n // because it is not summable.\n if (!fieldSchema) {\n return div;\n }\n\n const field = this.displayFieldService.getField(\n sums,\n name,\n fieldSchema,\n { injector: this.injector, container: 'table', options: {} },\n );\n\n if (!field.isEmpty()) {\n field.render(div, field.valueString);\n }\n\n return div;\n }\n}\n","// Separated from render passes to avoid cyclic dependencies\nexport const rowGroupClassName = 'wp-table--group-header';\nexport const collapsedRowClass = '-collapsed';\n","import { GroupObject } from 'core-app/features/hal/resources/wp-collection-resource';\n\nexport function groupIdentifier(group:GroupObject) {\n let value = group.value || 'nullValue';\n\n if (group.href) {\n try {\n value += group.href.map((el) => el.href).join('-');\n } catch (e) {\n console.error(`Failed to extract group identifier for ${group.value}`);\n }\n }\n\n value = value.toLowerCase().replace(/[^a-z0-9]+/g, '-');\n return `${groupByProperty(group)}-${value}`;\n}\n\nexport function groupName(group:GroupObject) {\n const { value } = group;\n if (value === null) {\n return '-';\n }\n return value;\n}\n\nexport function groupByProperty(group:GroupObject):string {\n return group._links.groupBy.href.split('/').pop()!;\n}\n\n/**\n * Get the row group class name for the given group id.\n */\nexport function groupedRowClassName(groupIndex:number) {\n return `__row-group-${groupIndex}`;\n}\n\n/**\n * Get the group type from its identifier.\n */\nexport function groupTypeFromIdentifier(groupIdentifier:string) {\n return groupIdentifier.split('-')[0];\n}\n\n/**\n * Get the group id from its identifier.\n */\nexport function groupIdFromIdentifier(groupIdentifier:string) {\n return groupIdentifier.split('-').pop();\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { SingleRowBuilder } from 'core-app/features/work-packages/components/wp-fast-table/builders/rows/single-row-builder';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { States } from 'core-app/core/states/states.service';\nimport {\n collapsedGroupClass,\n hierarchyGroupClass,\n hierarchyRootClass,\n} from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-hierarchy-helpers';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport const indicatorCollapsedClass = '-hierarchy-collapsed';\nexport const hierarchyCellClassName = 'wp-table--hierarchy-span';\nexport const additionalHierarchyRowClassName = 'wp-table--hierarchy-aditional-row';\nexport const hierarchyIndentation = 20;\nexport const hierarchyBaseIndentation = 25;\n\nexport class SingleHierarchyRowBuilder extends SingleRowBuilder {\n // Injected\n @InjectField() public wpTableHierarchies:WorkPackageViewHierarchiesService;\n\n @InjectField() public states:States;\n\n // Retain a map of hierarchy elements present in the table\n // with at least a visible child\n public parentsWithVisibleChildren:{ [id:string]:boolean };\n\n public text:{\n leaf:(level:number) => string;\n expanded:(level:number) => string;\n collapsed:(level:number) => string;\n };\n\n constructor(public readonly injector:Injector,\n protected workPackageTable:WorkPackageTable) {\n super(injector, workPackageTable);\n\n this.text = {\n leaf: (level:number) => this.I18n.t('js.work_packages.hierarchy.leaf', { level }),\n expanded: (level:number) => this.I18n.t('js.work_packages.hierarchy.children_expanded',\n { level }),\n collapsed: (level:number) => this.I18n.t('js.work_packages.hierarchy.children_collapsed',\n { level }),\n };\n }\n\n /**\n * Refresh a single row after structural changes.\n * Remembers and re-adds the hierarchy indicator if necessary.\n */\n public refreshRow(workPackage:WorkPackageResource, jRow:JQuery):JQuery {\n // Remove any old hierarchy\n const newRow = super.refreshRow(workPackage, jRow);\n newRow.find('.wp-table--hierarchy-span').remove();\n this.appendHierarchyIndicator(workPackage, newRow);\n\n return newRow;\n }\n\n /**\n * Build the columns on the given empty row\n */\n public buildEmpty(workPackage:WorkPackageResource):[HTMLTableRowElement, boolean] {\n const [element, _] = super.buildEmpty(workPackage);\n const [classes, hidden] = this.ancestorRowData(workPackage);\n element.classList.add(...classes);\n\n this.appendHierarchyIndicator(workPackage, jQuery(element));\n return [element, hidden];\n }\n\n /**\n * Returns a set of\n * @param workPackage\n */\n public ancestorRowData(workPackage:WorkPackageResource):[string[], boolean] {\n const state = this.wpTableHierarchies.current;\n const rowClasses:string[] = [];\n let hidden = false;\n\n if (this.parentsWithVisibleChildren[workPackage.id!]) {\n rowClasses.push(hierarchyRootClass(workPackage.id!));\n }\n\n if (_.isArray(workPackage.ancestors)) {\n workPackage.ancestors.forEach((ancestor) => {\n rowClasses.push(hierarchyGroupClass(ancestor.id!));\n\n if (state.collapsed[ancestor.id!]) {\n hidden = true;\n rowClasses.push(collapsedGroupClass(ancestor.id!));\n }\n });\n }\n\n return [rowClasses, hidden];\n }\n\n /**\n * Append an additional ancestor row that is not yet loaded\n */\n public buildAncestorRow(ancestor:WorkPackageResource,\n ancestorGroups:string[],\n index:number):[HTMLTableRowElement, boolean] {\n const workPackage = this.states.workPackages.get(ancestor.id!).value!;\n const [tr, hidden] = this.buildEmpty(workPackage);\n tr.classList.add(additionalHierarchyRowClassName);\n return [tr, hidden];\n }\n\n /**\n * Append to the row of hierarchy level a hierarchy indicator.\n * @param workPackage\n * @param jRow jQuery row element\n * @param level Indentation level\n */\n private appendHierarchyIndicator(workPackage:WorkPackageResource, jRow:JQuery, level?:number):void {\n const hierarchyLevel = level === undefined || null ? workPackage.ancestors.length : level;\n const hierarchyElement = this.buildHierarchyIndicator(workPackage, jRow, hierarchyLevel);\n\n jRow.find('td.subject')\n .addClass('-with-hierarchy')\n .prepend(hierarchyElement);\n\n // Assure that the content is still visible when the hierarchy indentation is very large\n jRow.find('td.subject').css('minWidth', `${125 + (hierarchyIndentation * hierarchyLevel)}px`);\n jRow.find('td.subject .wp-table--cell-container')\n .css('width', `calc(100% - ${hierarchyBaseIndentation}px - ${hierarchyIndentation * hierarchyLevel}px)`);\n }\n\n /**\n * Build the hierarchy indicator at the given indentation level.\n */\n private buildHierarchyIndicator(workPackage:WorkPackageResource, jRow:JQuery|null, level:number):HTMLElement {\n const hierarchyIndicator = document.createElement('span');\n const collapsed = this.wpTableHierarchies.collapsed(workPackage.id!);\n const indicatorWidth = `${hierarchyBaseIndentation + (hierarchyIndentation * level)}px`;\n hierarchyIndicator.classList.add(hierarchyCellClassName);\n hierarchyIndicator.style.width = indicatorWidth;\n hierarchyIndicator.dataset.indentation = indicatorWidth;\n\n if (this.parentsWithVisibleChildren[workPackage.id!]) {\n const className = collapsed ? indicatorCollapsedClass : '';\n hierarchyIndicator.innerHTML = `\n \n \n ${this.text.expanded(\n level,\n )}\n ${this.text.collapsed(\n level,\n )}\n \n `;\n } else {\n hierarchyIndicator.innerHTML = `\n \n ${this.text.leaf(level)}\n \n `;\n }\n\n return hierarchyIndicator;\n }\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageViewRelationColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-relation-columns.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { States } from 'core-app/core/states/states.service';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { WorkPackageRelationsService } from '../../wp-relations/wp-relations.service';\nimport { QueryColumn } from '../../wp-query/query-column';\nimport { tdClassName } from './cell-builder';\n\nexport const relationCellTdClassName = 'wp-table--relation-cell-td';\nexport const relationCellIndicatorClassName = 'wp-table--relation-indicator';\n\nexport class RelationCellbuilder {\n @InjectField() states:States;\n\n @InjectField() wpRelations:WorkPackageRelationsService;\n\n @InjectField() wpTableRelationColumns:WorkPackageViewRelationColumnsService;\n\n constructor(public readonly injector:Injector) {\n }\n\n public build(workPackage:WorkPackageResource, column:QueryColumn) {\n const td = document.createElement('td');\n td.classList.add(tdClassName, relationCellTdClassName, column.id);\n td.dataset.columnId = column.id;\n\n // Get current expansion and value state\n const expanded = this.wpTableRelationColumns.getExpandFor(workPackage.id!) === column.id;\n const relationState = this.wpRelations.state(workPackage.id!).value;\n const relations = this.wpTableRelationColumns.relationsForColumn(workPackage,\n relationState,\n column);\n\n const indicator = this.renderIndicator();\n const badge = this.renderBadge(relations);\n\n if (expanded) {\n td.classList.add('-expanded');\n }\n\n if (relations.length > 0) {\n td.appendChild(badge);\n td.appendChild(indicator);\n }\n\n return td;\n }\n\n private renderIndicator() {\n const indicator = document.createElement('span');\n indicator.classList.add(relationCellIndicatorClassName);\n indicator.setAttribute('aria-hidden', 'true');\n indicator.setAttribute('tabindex', '0');\n\n return indicator;\n }\n\n private renderBadge(relations:RelationResource[]) {\n const badge = document.createElement('span');\n badge.classList.add('wp-table--relation-count');\n\n badge.textContent = `${relations.length}`;\n badge.classList.add('badge', '-border-only');\n\n return badge;\n }\n}\n","import { Injector } from '@angular/core';\nimport { OpTableActionsService } from 'core-app/features/work-packages/components/wp-table/table-actions/table-actions.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { contextMenuSpanClassName, contextMenuTdClassName } from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { internalContextMenuColumn } from 'core-app/features/work-packages/components/wp-fast-table/builders/internal-sort-columns';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { tdClassName } from './cell-builder';\n\nexport class TableActionRenderer {\n // Injections\n @InjectField() tableActionsService:OpTableActionsService;\n\n constructor(public readonly injector:Injector) {\n }\n\n public build(workPackage:WorkPackageResource):HTMLElement {\n // Append details button\n const td = document.createElement('td');\n td.classList.add(tdClassName, contextMenuTdClassName, internalContextMenuColumn.id, 'hide-when-print');\n\n // Wrap any actions in a span\n const span = document.createElement('span');\n span.classList.add(contextMenuSpanClassName);\n\n this.tableActionsService\n .render(workPackage)\n .forEach((el:HTMLElement) => {\n span.appendChild(el);\n });\n\n td.appendChild(span);\n return td;\n }\n}\n","import { Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { locateTableRowByIdentifier } from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-row-helpers';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { TableActionRenderer } from 'core-app/features/work-packages/components/wp-fast-table/builders/table-action-renderer';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport {\n internalContextMenuColumn,\n internalSortColumn,\n} from 'core-app/features/work-packages/components/wp-fast-table/builders/internal-sort-columns';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { checkedClassName } from '../ui-state-link-builder';\nimport { RelationCellbuilder } from '../relation-cell-builder';\nimport { CellBuilder, tdClassName } from '../cell-builder';\nimport { WorkPackageTable } from '../../wp-fast-table';\nimport { isRelationColumn, QueryColumn } from '../../../wp-query/query-column';\n\n// Work package table row entries\nexport const tableRowClassName = 'wp-table--row';\n// Work package and timeline rows\nexport const commonRowClassName = 'wp--row';\n\nexport class SingleRowBuilder {\n // Injections\n @InjectField() wpTableSelection:WorkPackageViewSelectionService;\n\n @InjectField() wpTableColumns:WorkPackageViewColumnsService;\n\n @InjectField() I18n!:I18nService;\n\n // Cell builder instance\n protected cellBuilder = new CellBuilder(this.injector);\n\n // Relation cell builder instance\n protected relationCellBuilder = new RelationCellbuilder(this.injector);\n\n // Details Link builder\n protected contextLinkBuilder = new TableActionRenderer(this.injector);\n\n // Build the augmented columns set to render with\n protected readonly augmentedColumns:QueryColumn[] = this.buildAugmentedColumns();\n\n constructor(public readonly injector:Injector,\n protected workPackageTable:WorkPackageTable) {\n }\n\n /**\n * Returns the current set of columns\n */\n public get columns():QueryColumn[] {\n return this.wpTableColumns.getColumns();\n }\n\n /**\n * Returns the current set of columns, augmented by the internal columns\n * we add for buttons and timeline.\n */\n private buildAugmentedColumns():QueryColumn[] {\n const columns = [...this.columns, internalContextMenuColumn];\n\n if (this.workPackageTable.configuration.dragAndDropEnabled) {\n columns.unshift(internalSortColumn);\n }\n\n return columns;\n }\n\n public buildCell(workPackage:WorkPackageResource, column:QueryColumn):HTMLElement|null {\n // handle relation types\n if (isRelationColumn(column)) {\n return this.relationCellBuilder.build(workPackage, column);\n }\n\n // Handle property types\n switch (column.id) {\n case internalContextMenuColumn.id:\n if (this.workPackageTable.configuration.actionsColumnEnabled) {\n return this.contextLinkBuilder.build(workPackage);\n } if (this.workPackageTable.configuration.columnMenuEnabled) {\n const td = document.createElement('td');\n td.classList.add('hide-when-print');\n return td;\n }\n return null;\n\n default:\n return this.cellBuilder.build(workPackage, column);\n }\n }\n\n /**\n * Build the columns on the given empty row\n */\n public buildEmpty(workPackage:WorkPackageResource):[HTMLTableRowElement, boolean] {\n const row = this.createEmptyRow(workPackage);\n return this.buildEmptyRow(workPackage, row);\n }\n\n /**\n * Create an empty unattached row element for the given work package\n * @param workPackage\n * @returns {any}\n */\n public createEmptyRow(workPackage:WorkPackageResource) {\n const identifier = this.classIdentifier(workPackage);\n const tr = document.createElement('tr');\n tr.setAttribute('tabindex', '0');\n tr.dataset.workPackageId = workPackage.id!;\n tr.dataset.classIdentifier = identifier;\n tr.classList.add(\n tableRowClassName,\n commonRowClassName,\n identifier,\n `${identifier}-table`,\n 'issue',\n );\n\n return tr;\n }\n\n /**\n * In case the table will end up empty, we insert a placeholder\n * row to provide some space within the tbody.\n */\n public get placeholderRow() {\n const tr:HTMLTableRowElement = document.createElement('tr');\n const td:HTMLTableCellElement = document.createElement('td');\n\n tr.classList.add('wp--placeholder-row');\n td.colSpan = this.augmentedColumns.length;\n tr.appendChild(td);\n\n return tr;\n }\n\n public classIdentifier(workPackage:WorkPackageResource) {\n return `wp-row-${workPackage.id}`;\n }\n\n /**\n * Refresh a row that is currently being edited, that is, some edit fields may be open\n */\n public refreshRow(workPackage:WorkPackageResource, jRow:JQuery):JQuery {\n // Detach all current edit cells\n const cells = jRow.find(`.${tdClassName}`).detach();\n\n // Remember the order of all new edit cells\n const newCells:HTMLElement[] = [];\n\n this.augmentedColumns.forEach((column:QueryColumn) => {\n const oldTd = cells.filter(`td.${column.id}`);\n\n // Treat internal columns specially\n // and skip the replacement of the column if this is being edited.\n // But only do that, if the column existed before. Sometimes, e.g. when lacking permissions\n // the column was not correctly created (with the intended classes). This code then\n // increases the robustness.\n if ((column.id.startsWith('__internal') || this.isColumnBeingEdited(workPackage, column)) && oldTd.length) {\n newCells.push(oldTd[0]);\n return;\n }\n\n // Otherwise, refresh that cell and append it\n const cell = this.buildCell(workPackage, column);\n\n if (cell) {\n newCells.push(cell);\n }\n });\n\n jRow.prepend(newCells);\n return jRow;\n }\n\n protected isColumnBeingEdited(workPackage:WorkPackageResource, column:QueryColumn) {\n const form = this.workPackageTable.editing.forms[workPackage.id!];\n\n return form && form.activeFields[column.id];\n }\n\n protected buildEmptyRow(workPackage:WorkPackageResource, row:HTMLTableRowElement):[HTMLTableRowElement, boolean] {\n const change = this.workPackageTable.editing.change(workPackage);\n const cells:{ [attribute:string]:JQuery } = {};\n\n if (change && !change.isEmpty()) {\n // Try to find an old instance of this row\n const oldRow = locateTableRowByIdentifier(this.classIdentifier(workPackage));\n\n change.changedAttributes.forEach((attribute:string) => {\n cells[attribute] = oldRow.find(`.${tdClassName}.${attribute}`);\n });\n }\n\n this.augmentedColumns.forEach((column:QueryColumn) => {\n let cell:Element|null;\n const oldCell:JQuery|undefined = cells[column.id];\n\n if (oldCell && oldCell.length) {\n debugLog(`Rendering previous open column ${column.id} on ${workPackage.id}`);\n jQuery(row).append(oldCell);\n } else {\n cell = this.buildCell(workPackage, column);\n\n if (cell) {\n row.appendChild(cell);\n }\n }\n });\n\n // Set the row selection state\n if (this.wpTableSelection.isSelected(workPackage.id!)) {\n row.classList.add(checkedClassName);\n }\n\n return [row, false];\n }\n}\n","import { Injector } from '@angular/core';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { commonRowClassName } from '../rows/single-row-builder';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport const timelineCellClassName = 'wp-timeline-cell';\n\nexport class TimelineRowBuilder {\n @InjectField() public states:States;\n\n @InjectField() public wpTableTimeline:WorkPackageViewTimelineService;\n\n constructor(public readonly injector:Injector,\n protected workPackageTable:WorkPackageTable) {\n }\n\n public build(workPackageId:string|null) {\n const cell = document.createElement('div');\n cell.classList.add(timelineCellClassName, commonRowClassName);\n\n if (workPackageId) {\n cell.dataset.workPackageId = workPackageId;\n }\n\n return cell;\n }\n\n /**\n * Build and insert a timeline row for the given work package using the additional classes.\n * @param workPackage\n * @param timelineBody\n * @param rowClasses\n */\n public insert(workPackageId:string|null,\n timelineBody:DocumentFragment|HTMLElement,\n rowClasses:string[] = []) {\n const cell = this.build(workPackageId);\n cell.classList.add(...rowClasses);\n\n timelineBody.appendChild(cell);\n }\n}\n","import { StateService } from '@uirouter/core';\nimport { KeepTabService } from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\n\nexport const uiStateLinkClass = '__ui-state-link';\nexport const checkedClassName = '-checked';\n\nexport class UiStateLinkBuilder {\n constructor(public readonly $state:StateService,\n public readonly keepTab:KeepTabService) {\n }\n\n public linkToDetails(workPackageId:string, title:string, content:string) {\n return this.build(workPackageId, 'split', title, content);\n }\n\n public linkToShow(workPackageId:string, title:string, content:string) {\n return this.build(workPackageId, 'show', title, content);\n }\n\n private build(workPackageId:string, state:'show'|'split', title:string, content:string) {\n const a = document.createElement('a');\n let tabState:string;\n let tabIdentifier:string;\n\n if (state === 'show') {\n tabState = 'work-packages.show.tabs';\n tabIdentifier = this.keepTab.currentShowTab;\n } else {\n tabState = 'work-packages.partitioned.list.details.tabs';\n tabIdentifier = this.keepTab.currentDetailsTab;\n }\n a.href = this.$state.href(\n tabState,\n {\n workPackageId,\n tabIdentifier,\n },\n );\n a.classList.add(uiStateLinkClass);\n a.dataset.workPackageId = workPackageId;\n a.dataset.wpState = state;\n\n a.setAttribute('title', title);\n a.textContent = content;\n\n return a;\n }\n}\n","import { KeyCodes } from 'core-app/shared/helpers/keyCodes.enum';\nimport { TableEventComponent } from 'core-app/features/work-packages/components/wp-fast-table/handlers/table-handler-registry';\nimport { WorkPackageTable } from '../wp-fast-table';\n\n/**\n * Execute the callback if the given JQuery Event is either an ENTER key or a click\n */\nexport function onClickOrEnter(evt:JQuery.TriggeredEvent, callback:() => void) {\n if (evt.type === 'click' || (evt.type === 'keydown' && evt.which === KeyCodes.ENTER)) {\n callback();\n return false;\n }\n\n return true;\n}\n\nexport abstract class ClickOrEnterHandler {\n public handleEvent(view:TableEventComponent, evt:JQuery.TriggeredEvent) {\n onClickOrEnter(evt, () => this.processEvent(view.workPackageTable, evt));\n }\n\n protected abstract processEvent(table:WorkPackageTable, evt:JQuery.TriggeredEvent):boolean;\n}\n","/**\n * Returns the collapsed group class for the given ancestor id\n */\nexport function collapsedGroupClass(ancestorId = ''):string {\n return `__collapsed-group-${ancestorId}`;\n}\n\nexport function hierarchyGroupClass(ancestorId:string):string {\n return `__hierarchy-group-${ancestorId}`;\n}\n\nexport function hierarchyRootClass(ancestorId:string):string {\n return `__hierarchy-root-${ancestorId}`;\n}\n\nexport function ancestorClassIdentifier(ancestorId:string) {\n return `wp-ancestor-row-${ancestorId}`;\n}\n","/**\n * Return the row html id attribute for the given work package ID.\n */\nimport { collapsedGroupClass } from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-hierarchy-helpers';\n\nexport function rowId(workPackageId:string):string {\n return `wp-row-${workPackageId}-table`;\n}\n\nexport function relationRowClass():string {\n return `wp-table--relations-aditional-row`;\n}\n\nexport function locateTableRow(workPackageId:string):JQuery {\n return jQuery(`.${rowId(workPackageId)}`);\n}\n\nexport function locateTableRowByIdentifier(identifier:string) {\n return jQuery(`.${identifier}-table`);\n}\n\nexport function isInsideCollapsedGroup(el?:Element | null) {\n if (!el) {\n return false;\n }\n\n return Array.from(el.classList).find((listClass) => listClass.includes(collapsedGroupClass())) != null;\n}\n\nexport function locatePredecessorBySelector(el:HTMLElement, selector:string):HTMLElement|null {\n let previous = el.previousElementSibling;\n\n while (previous) {\n if (previous.matches(selector)) {\n return previous as HTMLElement;\n }\n previous = previous.previousElementSibling;\n }\n\n return null;\n}\n\nexport function scrollTableRowIntoView(workPackageId:string):void {\n try {\n const element = locateTableRow(workPackageId);\n const container = element.scrollParent()!;\n const containerTop = container.scrollTop()!;\n const containerBottom = containerTop + container.height()!;\n\n const elemTop = element[0].offsetTop;\n const elemBottom = elemTop + element.height()!;\n\n if (elemTop < containerTop) {\n container[0].scrollTop = elemTop;\n } else if (elemBottom > containerBottom) {\n container[0].scrollTop = elemBottom - container.height()!;\n }\n } catch (e) {\n console.warn(`Can't scroll row element into view: ${e}`);\n }\n}\n","import { Injector } from '@angular/core';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageTable } from '../../wp-fast-table';\nimport { PrimaryRenderPass } from '../primary-render-pass';\n\nexport abstract class RowsBuilder {\n @InjectField() public states:States;\n\n constructor(public readonly injector:Injector, public workPackageTable:WorkPackageTable) {\n }\n\n /**\n * Build all rows of the table.\n */\n public abstract buildRows():PrimaryRenderPass;\n\n /**\n * Determine if this builder applies to the current view mode.\n */\n public isApplicable(table:WorkPackageTable) {\n return true;\n }\n}\n","import { Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { rowGroupClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-classes.constants';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { GroupObject } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { groupName } from './grouped-rows-helpers';\n\nexport function groupClassNameFor(group:GroupObject) {\n return `group-${group.identifier}`;\n}\n\nexport class GroupHeaderBuilder {\n @InjectField() public I18n:I18nService;\n\n public text:{ collapse:string, expand:string };\n\n constructor(public readonly injector:Injector) {\n this.text = {\n collapse: this.I18n.t('js.label_collapse'),\n expand: this.I18n.t('js.label_expand'),\n };\n }\n\n public buildGroupRow(group:GroupObject, colspan:number) {\n const row = document.createElement('tr');\n let togglerIconClass; let\n text;\n\n if (group.collapsed) {\n text = this.text.expand;\n togglerIconClass = 'icon-plus';\n } else {\n text = this.text.collapse;\n togglerIconClass = 'icon-minus2';\n }\n\n row.classList.add(rowGroupClassName, groupClassNameFor(group));\n row.id = `wp-table-rowgroup-${group.index}`;\n row.dataset.groupIndex = (group.index).toString();\n row.dataset.groupIdentifier = group.identifier;\n row.innerHTML = `\n \n
\n ${_.escape(text)}\n
\n
\n ${_.escape(groupName(group))}\n \n (${group.count})\n \n
\n \n `;\n\n return row;\n }\n}\n","import { Injector } from '@angular/core';\nimport { PrimaryRenderPass, RowRenderInfo } from 'core-app/features/work-packages/components/wp-fast-table/builders/primary-render-pass';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { WorkPackageViewHighlightingService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-highlighting.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class HighlightingRenderPass {\n @InjectField() wpTableHighlighting:WorkPackageViewHighlightingService;\n\n @InjectField() querySpace:IsolatedQuerySpace;\n\n constructor(public readonly injector:Injector,\n private table:WorkPackageTable,\n private tablePass:PrimaryRenderPass) {\n\n }\n\n public render() {\n // If highlighting is done inline in attributes, skip\n if (!this.isApplicable) {\n return;\n }\n\n const highlightAttribute = this.wpTableHighlighting.current.mode;\n\n // Get the computed style to identify bright properties\n const styles = window.getComputedStyle(document.body);\n\n // Render for each original row, clone it since we're modifying the tablepass\n this.tablePass.renderedOrder.forEach((row:RowRenderInfo, position:number) => {\n // We only care for rows that are natural work packages\n if (!row.workPackage) {\n return;\n }\n\n // Get the loaded attribute of the WP\n const property = row.workPackage[highlightAttribute] as HalResource;\n\n // We only color rows that have an active attribute\n if (!property) {\n return;\n }\n\n const id = property.id!;\n const element:HTMLElement = this.tablePass.tableBody.children[position] as HTMLElement;\n element.classList.add(Highlighting.backgroundClass(highlightAttribute, id));\n });\n }\n\n private get isApplicable() {\n return !(this.wpTableHighlighting.isInline || this.wpTableHighlighting.isDisabled);\n }\n}\n","import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { tdClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/cell-builder';\nimport { Injector } from '@angular/core';\nimport { TableDragActionsRegistryService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-actions-registry.service';\nimport { TableDragActionService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-action.service';\nimport { internalSortColumn } from 'core-app/features/work-packages/components/wp-fast-table/builders/internal-sort-columns';\n\n/** Debug the render position */\nconst RENDER_DRAG_AND_DROP_POSITION = false;\n\nexport class DragDropHandleBuilder {\n // Injections\n private actionService:TableDragActionService;\n\n constructor(public readonly injector:Injector) {\n const dragActionRegistry = this.injector.get(TableDragActionsRegistryService);\n this.actionService = dragActionRegistry.get(injector);\n }\n\n /**\n * Renders an angular CDK drag component into the column\n */\n public build(workPackage:WorkPackageResource, position?:number):HTMLElement {\n // Append sort handle\n const td = document.createElement('td');\n\n td.classList.add(tdClassName, internalSortColumn.id);\n\n if (!this.actionService.canPickup(workPackage)) {\n return td;\n }\n\n td.classList.add('wp-table--sort-td', internalSortColumn.id, 'hide-when-print');\n\n // Wrap handle as span\n const span = document.createElement('span');\n span.classList.add('wp-table--drag-and-drop-handle', 'icon-drag-handle');\n td.appendChild(span);\n\n if (RENDER_DRAG_AND_DROP_POSITION) {\n const text = document.createElement('span');\n text.textContent = `${position}`;\n td.appendChild(text);\n }\n\n return td;\n }\n}\n","import { Injector } from '@angular/core';\nimport { DragDropHandleBuilder } from 'core-app/features/work-packages/components/wp-fast-table/builders/drag-and-drop/drag-drop-handle-builder';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { WorkPackageViewOrderService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { QueryOrder } from 'core-app/core/apiv3/endpoints/queries/apiv3-query-order';\nimport { PrimaryRenderPass, RowRenderInfo } from '../primary-render-pass';\n\nexport class DragDropHandleRenderPass {\n @InjectField() public wpTableColumns:WorkPackageViewColumnsService;\n\n @InjectField() public wpTableOrder:WorkPackageViewOrderService;\n\n // Drag & Drop handle builder\n protected dragDropHandleBuilder = new DragDropHandleBuilder(this.injector);\n\n constructor(public readonly injector:Injector,\n private table:WorkPackageTable,\n private tablePass:PrimaryRenderPass) {\n }\n\n public render() {\n if (!this.table.configuration.dragAndDropEnabled) {\n return;\n }\n\n this.wpTableOrder.withLoadedPositions().then((positions:QueryOrder) => {\n this.tablePass.renderedOrder.forEach((row:RowRenderInfo, position:number) => {\n // We only care for rows that are natural work packages and are not relation sub-rows\n if (!row.workPackage || row.renderType === 'relations') {\n return;\n }\n\n const handle = this.dragDropHandleBuilder.build(row.workPackage, positions[row.workPackage.id!]);\n\n if (handle) {\n row.element.replaceChild(handle, row.element.firstElementChild!);\n }\n });\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { PrimaryRenderPass, RowRenderInfo } from '../primary-render-pass';\nimport { TimelineRowBuilder } from './timeline-row-builder';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport class TimelineRenderPass {\n /** Row builders */\n protected timelineBuilder:TimelineRowBuilder;\n\n /** Resulting timeline body */\n public timelineBody:DocumentFragment;\n\n constructor(public readonly injector:Injector,\n private table:WorkPackageTable,\n private tablePass:PrimaryRenderPass) {\n }\n\n public render() {\n // Prepare and reset the render pass\n this.timelineBody = document.createDocumentFragment();\n this.timelineBuilder = new TimelineRowBuilder(this.injector, this.table);\n\n // Render into timeline fragment\n this.tablePass.renderedOrder.forEach((row:RowRenderInfo) => {\n const wpId = row.workPackage ? row.workPackage.id : null;\n\n const secondary = this.timelineBuilder.build(wpId);\n secondary.classList.add(row.classIdentifier, `${row.classIdentifier}-timeline`, ...row.additionalClasses);\n this.timelineBody.appendChild(secondary);\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { RelationColumnType } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-relation-columns.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { States } from 'core-app/core/states/states.service';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { commonRowClassName, SingleRowBuilder, tableRowClassName } from '../rows/single-row-builder';\nimport { tdClassName } from '../cell-builder';\nimport { WorkPackageTable } from '../../wp-fast-table';\nimport { isRelationColumn, QueryColumn } from '../../../wp-query/query-column';\n\nexport function relationGroupClass(workPackageId:string) {\n return `__relations-expanded-from-${workPackageId}`;\n}\n\nexport function relationIdentifier(targetId:string, workPackageId:string) {\n return `wp-relation-row-${workPackageId}-to-${targetId}`;\n}\n\nexport const relationCellClassName = 'wp-table--relation-cell-td';\n\nexport class RelationRowBuilder extends SingleRowBuilder {\n @InjectField() public states:States;\n\n @InjectField() public I18n:I18nService;\n\n constructor(public readonly injector:Injector,\n protected workPackageTable:WorkPackageTable) {\n super(injector, workPackageTable);\n }\n\n /**\n * For additional relation rows, we don't want to render an expandable relation cell,\n * but instead we render the relation label.\n * @param workPackage\n * @param column\n * @return {any}\n */\n public buildCell(workPackage:WorkPackageResource, column:QueryColumn):HTMLElement|null {\n // handle relation types\n if (isRelationColumn(column)) {\n return this.emptyRelationCell(column);\n }\n\n return super.buildCell(workPackage, column);\n }\n\n /**\n * Build the columns on the given empty row\n */\n public buildEmptyRelationRow(from:WorkPackageResource, relation:RelationResource, type:RelationColumnType):[HTMLElement, WorkPackageResource] {\n const denormalized = relation.denormalized(from);\n\n const to = this.states.workPackages.get(denormalized.targetId).value!;\n\n // Let the primary row builder build the row\n const row = this.createEmptyRelationRow(from, to);\n const [tr, _] = super.buildEmptyRow(to, row);\n\n return [tr, to];\n }\n\n /**\n * Create an empty unattached row element for the given work package\n * @param workPackage\n * @returns {any}\n */\n public createEmptyRelationRow(from:WorkPackageResource, to:WorkPackageResource) {\n const identifier = this.relationClassIdentifier(from, to);\n const tr = document.createElement('tr');\n tr.dataset.workPackageId = to.id!;\n tr.dataset.classIdentifier = identifier;\n\n tr.classList.add(\n commonRowClassName, tableRowClassName, 'issue',\n 'wp-table--relations-aditional-row',\n identifier,\n `${identifier}-table`,\n relationGroupClass(from.id!),\n );\n\n return tr;\n }\n\n public relationClassIdentifier(from:WorkPackageResource, to:WorkPackageResource) {\n return relationIdentifier(to.id!, from.id!);\n }\n\n /**\n *\n * @param from\n * @param denormalized\n * @param type\n */\n public appendRelationLabel(jRow:JQuery, from:WorkPackageResource, relation:RelationResource, columnId:string, type:RelationColumnType) {\n const denormalized = relation.denormalized(from);\n let typeLabel = '';\n\n // Add the relation label if this is a \"Relations for \" column\n if (type === 'toType') {\n typeLabel = this.I18n.t(`js.relation_labels.${denormalized.reverseRelationType}`);\n }\n // Add the WP type label if this is a \" Relations\" column\n if (type === 'ofType') {\n const wp = this.states.workPackages.get(denormalized.target.id!).value!;\n typeLabel = wp.type.name;\n }\n\n const relationLabel = document.createElement('span');\n relationLabel.classList.add('relation-row--type-label');\n relationLabel.textContent = typeLabel;\n\n const textNode = document.createTextNode(denormalized.target.name);\n\n jRow.find(`.${relationCellClassName}`).empty();\n jRow.find(`.${relationCellClassName}.${columnId}`).append(relationLabel);\n }\n\n protected emptyRelationCell(column:QueryColumn) {\n const cell = document.createElement('td');\n cell.classList.add(relationCellClassName, tdClassName, column.id);\n\n return cell;\n }\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport {\n RelationColumnType,\n WorkPackageViewRelationColumnsService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-relation-columns.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { relationGroupClass, RelationRowBuilder } from './relation-row-builder';\nimport { PrimaryRenderPass, RowRenderInfo } from '../primary-render-pass';\n\nexport interface RelationRenderInfo extends RowRenderInfo {\n data:{\n relation:RelationResource;\n columnId:string;\n relationType:RelationColumnType;\n };\n}\n\nexport class RelationsRenderPass {\n @InjectField() wpRelations:WorkPackageRelationsService;\n\n @InjectField() wpTableColumns:WorkPackageViewColumnsService;\n\n @InjectField() wpTableRelationColumns:WorkPackageViewRelationColumnsService;\n\n public relationRowBuilder:RelationRowBuilder;\n\n constructor(public readonly injector:Injector,\n private table:WorkPackageTable,\n private tablePass:PrimaryRenderPass) {\n this.relationRowBuilder = new RelationRowBuilder(injector, table);\n }\n\n public render() {\n // If no relation column active, skip this pass\n if (!this.isApplicable) {\n return;\n }\n\n // Render for each original row, clone it since we're modifying the tablepass\n const rendered = _.clone(this.tablePass.renderedOrder);\n rendered.forEach((row:RowRenderInfo, position:number) => {\n // We only care for rows that are natural work packages\n if (!row.workPackage) {\n return;\n }\n\n // If the work package has no relations, ignore\n const { workPackage } = row;\n const fromId = workPackage.id!;\n const state = this.wpRelations.state(fromId);\n if (!state.hasValue() || _.size(state.value) === 0) {\n return;\n }\n\n this.wpTableRelationColumns.relationsToExtendFor(workPackage,\n state.value,\n (relation:RelationResource, column:QueryColumn, type:any) => {\n // Build each relation row (currently sorted by order defined in API)\n const [relationRow, target] = this.relationRowBuilder.buildEmptyRelationRow(\n workPackage,\n relation,\n type,\n );\n\n // Augment any data for the belonging work package row to it\n relationRow.classList.add(...row.additionalClasses);\n this.relationRowBuilder.appendRelationLabel(jQuery(relationRow),\n workPackage,\n relation,\n column.id,\n type);\n\n // Insert next to the work package row\n // If no relations exist until here, directly under the row\n // otherwise as the last element of the relations\n // Insert into table\n this.tablePass.spliceRow(\n relationRow,\n `.${this.relationRowBuilder.classIdentifier(workPackage)},.${relationGroupClass(fromId)}`,\n {\n classIdentifier: this.relationRowBuilder.relationClassIdentifier(workPackage, target),\n additionalClasses: row.additionalClasses.concat(['wp-table--relations-aditional-row']),\n workPackage: target,\n belongsTo: workPackage,\n renderType: 'relations',\n hidden: row.hidden,\n data: {\n relation,\n columnId: column.id,\n relationType: type,\n },\n } as RelationRenderInfo,\n );\n });\n });\n }\n\n public refreshRelationRow(renderedRow:RelationRenderInfo,\n workPackage:WorkPackageResource,\n oldRow:JQuery) {\n const newRow = this.relationRowBuilder.refreshRow(workPackage, oldRow);\n this.relationRowBuilder.appendRelationLabel(newRow,\n renderedRow.belongsTo!,\n renderedRow.data.relation,\n renderedRow.data.columnId,\n renderedRow.data.relationType);\n\n return newRow;\n }\n\n private get isApplicable() {\n return this.wpTableColumns.hasRelationColumns();\n }\n}\n","import { Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { HighlightingRenderPass } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/row-highlight-render-pass';\nimport { DragDropHandleRenderPass } from 'core-app/features/work-packages/components/wp-fast-table/builders/drag-and-drop/drag-drop-handle-render-pass';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { States } from 'core-app/core/states/states.service';\nimport { timeOutput } from 'core-app/shared/helpers/debug_output';\nimport { TimelineRenderPass } from './timeline/timeline-render-pass';\nimport { SingleRowBuilder } from './rows/single-row-builder';\nimport { RelationRenderInfo, RelationsRenderPass } from './relations/relations-render-pass';\nimport { WorkPackageTable } from '../wp-fast-table';\n\nexport type RenderedRowType = 'primary'|'relations';\n\nexport interface RowRenderInfo {\n // The rendered row\n element:HTMLTableRowElement;\n // Unique class name as an identifier to uniquely identify the row in both table and timeline\n classIdentifier:string;\n // Additional classes to be added by any secondary render passes\n additionalClasses:string[];\n // If this row is a work package, contains a reference to the rendered WP\n workPackage:WorkPackageResource|null;\n // If this is an additional row not present, this contains a reference to the WP\n // it originated from\n belongsTo?:WorkPackageResource;\n // The type of row this was rendered from\n renderType:RenderedRowType;\n // Marks if the row is currently hidden to the user\n hidden:boolean;\n // Additional data by the render passes\n data?:any;\n}\n\nexport abstract class PrimaryRenderPass {\n @InjectField() halEditing:HalResourceEditingService;\n\n @InjectField() states:States;\n\n @InjectField() I18n!:I18nService;\n\n /** The rendered order of rows of work package IDs or , if not a work package row */\n public renderedOrder:RowRenderInfo[];\n\n /** Resulting table body */\n public tableBody:DocumentFragment;\n\n /** Additional render pass that handles timeline rendering */\n public timeline:TimelineRenderPass;\n\n /** Additional render pass that handles table relation rendering */\n public relations:RelationsRenderPass;\n\n /** Additional render pass that handles drag'n'drop handle rendering */\n public dragDropHandle:DragDropHandleRenderPass;\n\n /** Additional render pass that handles highlighting of rows */\n public highlighting:HighlightingRenderPass;\n\n constructor(public readonly injector:Injector,\n public workPackageTable:WorkPackageTable,\n public rowBuilder:SingleRowBuilder) {\n }\n\n /**\n * Execute the entire render pass, executing this pass and all subsequent registered passes\n * for timeline and relations.\n * @return {PrimaryRenderPass}\n */\n public render():this {\n timeOutput('Primary render pass', () => {\n // Prepare and reset the render pass\n this.prepare();\n\n // Render into the table fragment\n this.doRender();\n\n // Post render\n this.postRender();\n });\n\n // Render subsequent passes\n // that may modify the structure of the table\n this.highlighting.render();\n\n timeOutput('Relations render pass', () => {\n this.relations.render();\n });\n\n timeOutput('Drag handle render pass', () => {\n this.dragDropHandle.render();\n });\n\n // Synchronize the rows to timeline\n timeOutput('Timelines render pass', () => {\n this.timeline.render();\n });\n\n return this;\n }\n\n /**\n * Refresh a single row using the render pass it was originally created from.\n * @param row\n */\n public refresh(row:RowRenderInfo, workPackage:WorkPackageResource, body:HTMLElement) {\n const oldRow = jQuery(body).find(`.${row.classIdentifier}`);\n let replacement:JQuery|null = null;\n\n switch (row.renderType) {\n case 'primary':\n replacement = this.rowBuilder.refreshRow(workPackage, oldRow);\n break;\n case 'relations':\n replacement = this.relations.refreshRelationRow(row as RelationRenderInfo, workPackage, oldRow);\n }\n\n if (replacement !== null && oldRow.length) {\n oldRow.replaceWith(replacement);\n }\n }\n\n public get result():RenderedWorkPackage[] {\n return this.renderedOrder.map((row) => ({\n classIdentifier: row.classIdentifier,\n workPackageId: row.workPackage ? row.workPackage.id : null,\n hidden: row.hidden,\n }));\n }\n\n /**\n * Splice a row into a specific location of the current render pass through the given selector.\n *\n * 1. Insert into the document fragment after the last match of the selector\n * 2. Splice into the renderedOrder array.\n */\n public spliceRow(row:HTMLElement, selector:string, renderedInfo:RowRenderInfo) {\n // Insert into table using the selector\n // If it matches multiple, select the last element\n const target = jQuery(this.tableBody)\n .find(selector)\n .last();\n\n target.after(row);\n\n // Splice the renderedOrder at this exact location\n const index = target.index();\n this.renderedOrder.splice(index + 1, 0, renderedInfo);\n }\n\n protected prepare() {\n this.timeline = new TimelineRenderPass(this.injector, this.workPackageTable, this);\n this.relations = new RelationsRenderPass(this.injector, this.workPackageTable, this);\n this.dragDropHandle = new DragDropHandleRenderPass(this.injector, this.workPackageTable, this);\n this.highlighting = new HighlightingRenderPass(this.injector, this.workPackageTable, this);\n this.tableBody = document.createDocumentFragment();\n this.renderedOrder = [];\n }\n\n /**\n * The actual render function of this renderer.\n */\n protected abstract doRender():void;\n\n /**\n * Post render shared among all sub passes\n */\n protected postRender():void {\n if (this.renderedOrder.length === 0 && this.workPackageTable.renderPlaceholderRow) {\n this.tableBody.appendChild(this.rowBuilder.placeholderRow);\n }\n }\n\n /**\n * Append a work package row to both containers\n * @param workPackage The work package, if the row belongs to one\n * @param row HTMLElement to append\n * @param rowClasses Additional classes to apply to the timeline row for mirroring purposes\n * @param hidden whether the row was rendered hidden\n */\n protected appendRow(workPackage:WorkPackageResource,\n row:HTMLTableRowElement,\n additionalClasses:string[] = [],\n hidden = false) {\n this.tableBody.appendChild(row);\n\n this.renderedOrder.push({\n classIdentifier: this.rowBuilder.classIdentifier(workPackage),\n additionalClasses,\n workPackage,\n renderType: 'primary',\n element: row,\n hidden,\n });\n }\n\n /**\n * Append a non-work package row to both containers\n * @param row HTMLElement to append\n * @param classIdentifer a unique identifier for the two rows (one each in table/timeline).\n * @param hidden whether the row was rendered hidden\n */\n protected appendNonWorkPackageRow(row:HTMLTableRowElement,\n classIdentifer:string,\n additionalClasses:string[] = [],\n hidden = false) {\n row.classList.add(classIdentifer);\n this.tableBody.appendChild(row);\n\n this.renderedOrder.push({\n element: row,\n classIdentifier: classIdentifer,\n additionalClasses,\n workPackage: null,\n renderType: 'primary',\n hidden,\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageTable } from '../../../wp-fast-table';\nimport { PrimaryRenderPass } from '../../primary-render-pass';\nimport { SingleRowBuilder } from '../../rows/single-row-builder';\n\nexport class PlainRenderPass extends PrimaryRenderPass {\n constructor(public readonly injector:Injector,\n public workPackageTable:WorkPackageTable,\n public rowBuilder:SingleRowBuilder) {\n super(injector, workPackageTable, rowBuilder);\n }\n\n /**\n * The actual render function of this renderer.\n */\n protected doRender():void {\n this.workPackageTable.originalRows.forEach((wpId:string) => {\n const row = this.workPackageTable.originalRowIndex[wpId];\n const [tr] = this.rowBuilder.buildEmpty(row.object);\n row.element = tr;\n this.appendRow(row.object, tr);\n this.tableBody.appendChild(tr);\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { collapsedRowClass } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-classes.constants';\nimport { GroupSumsBuilder } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/grouped/group-sums-builder';\nimport { GroupObject } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { WorkPackageTable } from '../../../wp-fast-table';\nimport { WorkPackageTableRow } from '../../../wp-table.interfaces';\nimport { SingleRowBuilder } from '../../rows/single-row-builder';\nimport { PlainRenderPass } from '../plain/plain-render-pass';\nimport { groupClassNameFor, GroupHeaderBuilder } from './group-header-builder';\nimport { groupByProperty, groupedRowClassName } from './grouped-rows-helpers';\n\nexport const groupRowClass = '-group-row';\n\nexport class GroupedRenderPass extends PlainRenderPass {\n private sumsBuilder = new GroupSumsBuilder(this.injector, this.workPackageTable);\n\n constructor(public readonly injector:Injector,\n public workPackageTable:WorkPackageTable,\n public groups:GroupObject[],\n public headerBuilder:GroupHeaderBuilder,\n public colspan:number) {\n super(injector, workPackageTable, new SingleRowBuilder(injector, workPackageTable));\n }\n\n /**\n * Rebuild the entire grouped tbody from the given table\n */\n protected doRender() {\n let currentGroup:GroupObject | null = null;\n const { length } = this.workPackageTable.originalRows;\n this.workPackageTable.originalRows.forEach((wpId:string, index:number) => {\n const row = this.workPackageTable.originalRowIndex[wpId];\n const nextGroup = this.matchingGroup(row.object);\n const groupsChanged = currentGroup !== nextGroup;\n\n // Render the sums row\n if (currentGroup && groupsChanged) {\n this.renderSumsRow(currentGroup);\n }\n\n // Render the next group row\n if (nextGroup && groupsChanged) {\n const groupClass = groupClassNameFor(nextGroup);\n const rowElement = this.headerBuilder.buildGroupRow(nextGroup, this.colspan);\n this.appendNonWorkPackageRow(rowElement, groupClass, [groupRowClass]);\n currentGroup = nextGroup;\n }\n\n row.group = currentGroup;\n this.buildSingleRow(row);\n });\n\n // Render the last sums row\n if (currentGroup) {\n this.renderSumsRow(currentGroup);\n }\n }\n\n /**\n * Find a matching group for the given work package.\n * The API sadly doesn't provide us with the information which group a WP belongs to.\n */\n private matchingGroup(workPackage:WorkPackageResource) {\n return _.find(this.groups, (group:GroupObject) => {\n let property = workPackage[groupByProperty(group)];\n // explicitly check for undefined as `false` (bool) is a valid value.\n if (property === undefined) {\n property = null;\n }\n\n // If the property is a multi-value\n // Compare the href's of all resources with the ones in valueLink\n if (_.isArray(property)) {\n return this.matchesMultiValue(property as HalResource[], group);\n }\n\n /// / If its a linked resource, compare the href,\n /// / which is an array of links the resource offers\n if (property && property.href) {\n return !!_.find(group._links.valueLink, (l:any):any => property.href === l.href);\n }\n\n // Otherwise, fall back to simple value comparison.\n let value = group.value === '' ? null : group.value;\n\n if (value && typeof value === 'string') {\n // For matching we have to remove the % sign which is shown when grouping after progress\n value = value.replace('%', '');\n }\n\n // Values provided by the API are always string\n // so avoid triple equal here\n // tslint:disable-next-line\n return value == property;\n }) as GroupObject;\n }\n\n private matchesMultiValue(property:HalResource[], group:GroupObject) {\n if (property.length !== group.href.length) {\n return false;\n }\n\n const joinedOrderedHrefs = (objects:any[]) => _.map(objects, (object) => object.href).sort().join(', ');\n\n return _.isEqualWith(\n property,\n group.href,\n (a, b) => joinedOrderedHrefs(a) === joinedOrderedHrefs(b),\n );\n }\n\n /**\n * Enhance a row from the rowBuilder with group information.\n */\n private buildSingleRow(row:WorkPackageTableRow):void {\n const { group } = row;\n\n if (!group) {\n console.warn(\"All rows should have a group, but this one doesn't %O\", row);\n }\n\n let hidden = false;\n const additionalClasses:string[] = [];\n\n const [tr, _] = this.rowBuilder.buildEmpty(row.object);\n\n if (group) {\n additionalClasses.push(groupedRowClassName(group.index));\n hidden = !!group.collapsed;\n\n if (hidden) {\n additionalClasses.push(collapsedRowClass);\n }\n }\n\n row.element = tr;\n tr.classList.add(...additionalClasses);\n this.appendRow(row.object, tr, additionalClasses, hidden);\n }\n\n /**\n * Render the sums row for the current group\n */\n private renderSumsRow(group:GroupObject) {\n if (!group.sums) {\n return;\n }\n\n const groupClass = groupClassNameFor(group);\n const rowElement = this.sumsBuilder.buildSumsRow(group);\n this.appendNonWorkPackageRow(rowElement, groupClass);\n }\n}\n","import { Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport {\n collapsedRowClass,\n rowGroupClassName,\n} from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-classes.constants';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { States } from 'core-app/core/states/states.service';\nimport { GroupObject } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { WorkPackageTable } from '../../../wp-fast-table';\nimport { tableRowClassName } from '../../rows/single-row-builder';\nimport { RowsBuilder } from '../rows-builder';\nimport { GroupHeaderBuilder } from './group-header-builder';\nimport { GroupedRenderPass } from './grouped-render-pass';\nimport { groupedRowClassName, groupIdentifier } from './grouped-rows-helpers';\n\nexport class GroupedRowsBuilder extends RowsBuilder {\n // Injections\n @InjectField() private readonly querySpace:IsolatedQuerySpace;\n\n @InjectField() public states:States;\n\n @InjectField() public wpTableColumns:WorkPackageViewColumnsService;\n\n @InjectField() public I18n:I18nService;\n\n constructor(public readonly injector:Injector, workPackageTable:WorkPackageTable) {\n super(injector, workPackageTable);\n }\n\n /**\n * The hierarchy builder is only applicable if the hierarchy mode is active\n */\n public isApplicable(table:WorkPackageTable) {\n return !_.isEmpty(this.groups);\n }\n\n /**\n * Returns the reference to the last table.groups state value\n */\n public get groups() {\n return this.querySpace.groups.value || [];\n }\n\n /**\n * Returns the reference to the last table.collapesedGroups state value\n */\n public get collapsedGroups() {\n return this.querySpace.collapsedGroups.value || {};\n }\n\n public get colspan() {\n // Columns + manual sorting column + settings column\n return this.wpTableColumns.columnCount + 2;\n }\n\n public buildRows() {\n const builder = new GroupHeaderBuilder(this.injector);\n return new GroupedRenderPass(\n this.injector,\n this.workPackageTable,\n this.getGroupData(),\n builder,\n this.colspan,\n ).render();\n }\n\n /**\n * Refresh the group expansion state\n */\n public refreshExpansionState() {\n const groups = this.getGroupData();\n const rendered = this.querySpace.tableRendered.value!;\n const builder = new GroupHeaderBuilder(this.injector);\n\n jQuery(this.workPackageTable.tableAndTimelineContainer)\n .find(`.${rowGroupClassName}`)\n .each((i:number, oldRow:Element) => {\n const groupIndex = jQuery(oldRow).data('groupIndex');\n const group = groups[groupIndex];\n\n // Refresh the group header\n const newRow = builder.buildGroupRow(group, this.colspan);\n\n if (oldRow.parentNode) {\n oldRow.parentNode.replaceChild(newRow, oldRow);\n }\n\n // Set expansion state of contained rows\n const affected = jQuery(this.workPackageTable.tableAndTimelineContainer)\n .find(`.${groupedRowClassName(groupIndex)}`);\n affected.toggleClass(collapsedRowClass, !!group.collapsed);\n\n // Update the hidden section of the rendered state\n affected.filter(`.${tableRowClassName}`).each((i, el) => {\n // Get the index of this row\n const index = jQuery(el).index();\n\n // Update the hidden state\n rendered[index].hidden = !!group.collapsed;\n });\n });\n\n this.querySpace.tableRendered.putValue(rendered, 'Updated hidden state of rows after group change.');\n }\n\n /**\n * Augment the given groups with the current collapsed state data.\n */\n private getGroupData() {\n return this.groups.map((group:GroupObject, index:number) => {\n group.index = index;\n if (group._links && group._links.valueLink) {\n group.href = group._links.valueLink;\n }\n group.identifier = groupIdentifier(group);\n group.collapsed = this.collapsedGroups[group.identifier];\n return group;\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { PrimaryRenderPass, RowRenderInfo } from 'core-app/features/work-packages/components/wp-fast-table/builders/primary-render-pass';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { WorkPackageTableRow } from 'core-app/features/work-packages/components/wp-fast-table/wp-table.interfaces';\nimport {\n ancestorClassIdentifier,\n hierarchyGroupClass,\n} from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-hierarchy-helpers';\nimport { WorkPackageViewHierarchies } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-hierarchies';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { additionalHierarchyRowClassName, SingleHierarchyRowBuilder } from './single-hierarchy-row-builder';\n\nexport class HierarchyRenderPass extends PrimaryRenderPass {\n @InjectField() querySpace:IsolatedQuerySpace;\n\n @InjectField() states:States;\n\n @InjectField() apiV3Service:ApiV3Service;\n\n @InjectField() wpTableHierarchies:WorkPackageViewHierarchiesService;\n\n // Remember which rows were already rendered\n readonly rendered:{ [workPackageId:string]:boolean } = {};\n\n // Remember additional parents inserted that are not part of the results table\n private additionalParents:{ [workPackageId:string]:WorkPackageResource } = {};\n\n // Defer children to be rendered when their parent occurs later in the table\n private deferred:{ [parentId:string]:WorkPackageResource[] } = {};\n\n // Collapsed state\n private hierarchies:WorkPackageViewHierarchies;\n\n // Build a map of hierarchy elements present in the table\n // with at least a visible child\n public parentsWithVisibleChildren:{ [id:string]:boolean } = {};\n\n constructor(public readonly injector:Injector,\n public workPackageTable:WorkPackageTable,\n public rowBuilder:SingleHierarchyRowBuilder) {\n super(injector, workPackageTable, rowBuilder);\n }\n\n protected prepare() {\n super.prepare();\n\n this.hierarchies = this.wpTableHierarchies.current;\n\n _.each(this.workPackageTable.originalRowIndex, (row) => {\n row.object.ancestors.forEach((ancestor:WorkPackageResource) => {\n this.parentsWithVisibleChildren[ancestor.id!] = true;\n });\n });\n\n this.rowBuilder.parentsWithVisibleChildren = this.parentsWithVisibleChildren;\n }\n\n /**\n * Render the hierarchy table into the document fragment\n */\n protected doRender() {\n this.workPackageTable.originalRows.forEach((wpId:string) => {\n const row:WorkPackageTableRow = this.workPackageTable.originalRowIndex[wpId];\n const workPackage:WorkPackageResource = row.object;\n\n // If we need to defer this row, skip it for now\n if (this.deferInsertion(workPackage)) {\n return;\n }\n\n if (workPackage.ancestors.length) {\n // If we have ancestors, render it\n this.buildWithHierarchy(row);\n } else {\n // Render a work package root with no parents\n const [tr, hidden] = this.rowBuilder.buildEmpty(workPackage);\n row.element = tr;\n this.tableBody.appendChild(tr);\n this.markRendered(tr, workPackage, hidden);\n }\n\n // Render all potentially deferred rows\n this.renderAllDeferredChildren(workPackage);\n });\n }\n\n /**\n * If the given work package has a visible ancestor in the table, return true\n * and remember the work package until the ancestor is rendered.\n * @param workPackage\n * @returns {boolean}\n */\n public deferInsertion(workPackage:WorkPackageResource):boolean {\n const { ancestors } = workPackage;\n\n // Will only defer if at least one ancestor exists\n if (ancestors.length === 0) {\n return false;\n }\n\n // Cases for wp\n // 1. No wp.ancestors in table -> Render them immediately (defer=false)\n // 2. Parent in table -> defered[parent] = wp\n // 3. Parent not in table BUT a ancestor in table\n // -> deferred[a ancestor] = parent\n // -> deferred[parent] = wp\n // 4. Any ancestor already rendered -> Render normally (don't defer)\n const ancestorChain = ancestors.concat([workPackage]);\n for (let i = ancestorChain.length - 2; i >= 0; --i) {\n const parent = ancestorChain[i];\n\n const inTable = this.workPackageTable.originalRowIndex[parent.id!];\n const alreadyRendered = this.rendered[parent.id!];\n\n if (alreadyRendered) {\n // parent is already rendered.\n // Don't defer, but render all intermediate parents below it\n return false;\n }\n\n if (inTable) {\n // Get the current elements\n let elements = this.deferred[parent.id!] || [];\n // Append to them the child and all children below\n let newElements:WorkPackageResource[] = ancestorChain.slice(i + 1, ancestorChain.length);\n newElements = newElements.map((child) => this.apiV3Service.work_packages.cache.state(child.id!).value!);\n // Append all new elements\n elements = elements.concat(newElements);\n // Remove duplicates (Regression #29652)\n this.deferred[parent.id!] = _.uniqBy(elements, (el) => el.id!);\n return true;\n }\n // Otherwise, continue the chain upwards\n }\n\n return false;\n }\n\n /**\n * Render any deferred children of the given work package. If recursive children were\n * deferred, each of them will be passed through renderCallback.\n * @param workPackage\n */\n private renderAllDeferredChildren(workPackage:WorkPackageResource) {\n const wpId = workPackage.id!;\n const deferredChildren = this.deferred[wpId] || [];\n\n // If the work package has deferred children to render,\n // run them through the callback\n deferredChildren.forEach((child:WorkPackageResource) => {\n this.insertUnderParent(this.getOrBuildRow(child), child.parent || workPackage);\n\n // Descend into any children the child WP might have and callback\n this.renderAllDeferredChildren(child);\n });\n }\n\n private getOrBuildRow(workPackage:WorkPackageResource) {\n let row:WorkPackageTableRow = this.workPackageTable.originalRowIndex[workPackage.id!];\n\n if (!row) {\n row = { object: workPackage } as WorkPackageTableRow;\n }\n\n return row;\n }\n\n private buildWithHierarchy(row:WorkPackageTableRow) {\n // Ancestor data [root, med, thisrow]\n const { ancestors } = row.object;\n const ancestorGroups:string[] = [];\n\n // Iterate ancestors\n ancestors.forEach((el:WorkPackageResource, index:number) => {\n const ancestor = this.states.workPackages.get(el.id!).getValueOr(el);\n\n // If we see the parent the first time,\n // build it as an additional row and insert it into the ancestry\n if (!this.rendered[ancestor.id!]) {\n const [ancestorRow, hidden] = this.rowBuilder.buildAncestorRow(ancestor, ancestorGroups, index);\n // Insert the ancestor row, either right here if it's a root node\n // Or below the appropriate parent\n\n if (index === 0) {\n // Special case, first ancestor => root without parent\n this.tableBody.appendChild(ancestorRow);\n this.markRendered(ancestorRow, ancestor, hidden, true);\n } else {\n // This ancestor must be inserted in the last position of its root\n const parent = ancestors[index - 1];\n this.insertAtExistingHierarchy(ancestor, ancestorRow, parent, hidden, true);\n }\n\n // Remember we just added this extra ancestor row\n this.additionalParents[ancestor.id!] = ancestor;\n }\n\n // Push the correct ancestor groups for identifiying a hierarchy group\n ancestorGroups.push(hierarchyGroupClass(ancestor.id!));\n ancestors.slice(0, index).forEach((previousAncestor) => {\n ancestorGroups.push(hierarchyGroupClass(previousAncestor.id!));\n });\n });\n\n // Insert this row to parent\n const parent = _.last(ancestors);\n this.insertUnderParent(row, parent!);\n }\n\n /**\n * Insert the given node as a child of the parent\n * @param row\n * @param parent\n */\n private insertUnderParent(row:WorkPackageTableRow, parent:WorkPackageResource) {\n const [tr, hidden] = this.rowBuilder.buildEmpty(row.object);\n row.element = tr;\n this.insertAtExistingHierarchy(row.object, tr, parent, hidden, false);\n }\n\n /**\n * Mark the given work package as rendered\n * @param workPackage\n * @param hidden\n * @param isAncestor\n */\n private markRendered(row:HTMLTableRowElement, workPackage:WorkPackageResource, hidden = false, isAncestor = false) {\n this.rendered[workPackage.id!] = true;\n this.renderedOrder.push(this.buildRenderInfo(row, workPackage, hidden, isAncestor));\n }\n\n /**\n * Append a row to the given parent hierarchy group.\n */\n private insertAtExistingHierarchy(workPackage:WorkPackageResource,\n el:HTMLTableRowElement,\n parent:WorkPackageResource,\n hidden:boolean,\n isAncestor:boolean) {\n // Either append to the hierarchy group root (= the parentID row itself)\n const hierarchyRoot = `.__hierarchy-root-${parent.id}`;\n // Or, if it has descendants, append to the LATEST of that set\n const hierarchyGroup = `.__hierarchy-group-${parent.id}`;\n\n // Insert into table\n this.spliceRow(\n el,\n `${hierarchyRoot},${hierarchyGroup}`,\n this.buildRenderInfo(el, workPackage, hidden, isAncestor),\n );\n\n this.rendered[workPackage.id!] = true;\n }\n\n private buildRenderInfo(row:HTMLTableRowElement, workPackage:WorkPackageResource, hidden:boolean, isAncestor:boolean):RowRenderInfo {\n const info:RowRenderInfo = {\n element: row,\n classIdentifier: '',\n additionalClasses: [],\n workPackage,\n renderType: 'primary',\n hidden,\n };\n\n const [ancestorClasses, _] = this.rowBuilder.ancestorRowData(workPackage);\n\n if (isAncestor) {\n info.additionalClasses = [additionalHierarchyRowClassName].concat(ancestorClasses);\n info.classIdentifier = ancestorClassIdentifier(workPackage.id!);\n } else {\n info.additionalClasses = ancestorClasses;\n info.classIdentifier = this.rowBuilder.classIdentifier(workPackage);\n }\n\n return info;\n }\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageTable } from '../../../wp-fast-table';\nimport { RowsBuilder } from '../rows-builder';\nimport { HierarchyRenderPass } from './hierarchy-render-pass';\nimport { SingleHierarchyRowBuilder } from './single-hierarchy-row-builder';\n\nexport class HierarchyRowsBuilder extends RowsBuilder {\n // Injections\n @InjectField() states:States;\n\n @InjectField() wpTableColumns:WorkPackageViewColumnsService;\n\n @InjectField() wpTableHierarchies:WorkPackageViewHierarchiesService;\n\n // The group expansion state\n constructor(public readonly injector:Injector, public workPackageTable:WorkPackageTable) {\n super(injector, workPackageTable);\n }\n\n /**\n * The hierarchy builder is only applicable if the hierarchy mode is active\n */\n public isApplicable(_table:WorkPackageTable) {\n return this.wpTableHierarchies.isEnabled;\n }\n\n /**\n * Rebuild the entire grouped tbody from the given table\n */\n public buildRows():HierarchyRenderPass {\n const builder = new SingleHierarchyRowBuilder(this.injector, this.workPackageTable);\n return new HierarchyRenderPass(this.injector, this.workPackageTable, builder).render();\n }\n}\n","import { Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageTable } from '../../../wp-fast-table';\nimport { PrimaryRenderPass } from '../../primary-render-pass';\nimport { SingleRowBuilder } from '../../rows/single-row-builder';\nimport { RowsBuilder } from '../rows-builder';\nimport { PlainRenderPass } from './plain-render-pass';\n\nexport class PlainRowsBuilder extends RowsBuilder {\n // Injections\n @InjectField() public I18n:I18nService;\n\n // The group expansion state\n constructor(public readonly injector:Injector, workPackageTable:WorkPackageTable) {\n super(injector, workPackageTable);\n }\n\n /**\n * Rebuild the entire grouped tbody from the given table\n */\n public buildRows():PrimaryRenderPass {\n const builder = new SingleRowBuilder(this.injector, this.workPackageTable);\n return new PlainRenderPass(this.injector, this.workPackageTable, builder).render();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injector } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { States } from 'core-app/core/states/states.service';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\n\nimport { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { FocusHelperService } from 'core-app/shared/directives/focus/focus-helper';\nimport { EditingPortalService } from 'core-app/shared/components/fields/edit/editing-portal/editing-portal-service';\nimport { CellBuilder, editCellContainer, tdClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/cell-builder';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { EditForm } from 'core-app/shared/components/fields/edit/edit-form/edit-form';\nimport { editModeClassName } from 'core-app/shared/components/fields/edit/edit-field.component';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\nexport const activeFieldContainerClassName = 'inline-edit--active-field';\nexport const activeFieldClassName = 'inline-edit--field';\n\nexport class TableEditForm extends EditForm {\n @InjectField() public wpTableColumns:WorkPackageViewColumnsService;\n\n @InjectField() public apiV3Service!:ApiV3Service;\n\n @InjectField() public states:States;\n\n @InjectField() public FocusHelper:FocusHelperService;\n\n @InjectField() public editingPortalService:EditingPortalService;\n\n // Use cell builder to reset edit fields\n private cellBuilder = new CellBuilder(this.injector);\n\n // Subscription\n private resourceSubscription:Subscription = this\n .apiV3Service\n .work_packages\n .id(this.workPackageId)\n .requireAndStream()\n .subscribe((wp) => this.resource = wp);\n\n constructor(public injector:Injector,\n public table:WorkPackageTable,\n public workPackageId:string,\n public classIdentifier:string) {\n super(injector);\n }\n\n destroy() {\n this.resourceSubscription.unsubscribe();\n }\n\n public findContainer(fieldName:string):JQuery {\n return this.rowContainer.find(`.${tdClassName}.${fieldName} .${editCellContainer}`).first();\n }\n\n public findCell(fieldName:string) {\n return this.rowContainer.find(`.${tdClassName}.${fieldName}`).first();\n }\n\n public activateField(form:EditForm, schema:IFieldSchema, fieldName:string, errors:string[]):Promise {\n return this.waitForContainer(fieldName)\n .then((cell) => {\n // Forcibly set the width since the edit field may otherwise\n // be given more width. Thereby preserve a minimum width of 150.\n // To avoid flickering content, the padding is removed, too.\n const td = this.findCell(fieldName);\n td.addClass(editModeClassName);\n let width = parseInt(td.css('width'));\n width = width > 150 ? width - 10 : 150;\n td.css('max-width', `${width}px`);\n td.css('width', `${width}px`);\n\n return this.editingPortalService.create(\n cell,\n this.injector,\n form,\n schema,\n fieldName,\n errors,\n );\n });\n }\n\n public reset(fieldName:string, focus?:boolean) {\n const cell = this.findContainer(fieldName);\n const td = this.findCell(fieldName);\n\n if (cell.length) {\n this.findCell(fieldName).css('width', '');\n this.findCell(fieldName).css('max-width', '');\n this.cellBuilder.refresh(cell[0], this.resource, fieldName);\n td.removeClass(editModeClassName);\n\n if (focus) {\n this.FocusHelper.focus(cell[0]);\n }\n }\n }\n\n public requireVisible(fieldName:string):Promise {\n this.wpTableColumns.addColumn(fieldName);\n return this.waitForContainer(fieldName);\n }\n\n protected focusOnFirstError():void {\n // Focus the first field that is erroneous\n jQuery(this.table.tableAndTimelineContainer)\n .find(`.${activeFieldContainerClassName}.-error .${activeFieldClassName}`)\n .first()\n .trigger('focus');\n }\n\n /**\n * Load the resource form to get the current field schema with all\n * values loaded.\n * @param fieldName\n */\n protected loadFieldSchema(fieldName:string, noWarnings = false):Promise {\n // We need to handle start/due date cases like they were combined dates\n if (['startDate', 'dueDate', 'date'].includes(fieldName)) {\n fieldName = 'combinedDate';\n }\n\n return super.loadFieldSchema(fieldName, noWarnings);\n }\n\n // Ensure the given field is visible.\n // We may want to look into MutationObserver if we need this in several places.\n private waitForContainer(fieldName:string):Promise {\n return new Promise((resolve, reject) => {\n const interval = setInterval(() => {\n const container = this.findContainer(fieldName);\n\n if (container.length > 0) {\n clearInterval(interval);\n resolve(container[0]);\n }\n }, 100);\n });\n }\n\n private get rowContainer() {\n return jQuery(this.table.tableAndTimelineContainer).find(`.${this.classIdentifier}-table`);\n }\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { EditForm } from 'core-app/shared/components/fields/edit/edit-form/edit-form';\nimport { TableEditForm } from 'core-app/features/work-packages/components/wp-edit-form/table-edit-form';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class WorkPackageTableEditingContext {\n @InjectField() public halEditing:HalResourceEditingService;\n\n constructor(readonly table:WorkPackageTable,\n readonly injector:Injector) {\n }\n\n public forms:{ [wpId:string]:TableEditForm } = {};\n\n public reset() {\n _.each(this.forms, (form) => form.destroy());\n this.forms = {};\n }\n\n public change(workPackage:WorkPackageResource):WorkPackageChangeset|undefined {\n return this.halEditing.typedState(workPackage).value;\n }\n\n // TODO\n public stopEditing(workPackage:WorkPackageResource) {\n this.halEditing.stopEditing(workPackage);\n\n const existing = this.forms[workPackage.id!];\n if (existing) {\n existing.destroy();\n delete this.forms[workPackage.id!];\n }\n }\n\n public startEditing(workPackage:WorkPackageResource, classIdentifier:string):EditForm {\n const wpId = workPackage.id!;\n const existing = this.forms[wpId];\n if (existing) {\n return existing;\n }\n\n // Get any existing edit state for this work package\n return this.forms[wpId] = new TableEditForm(this.injector, this.table, wpId, classIdentifier);\n }\n}\n","import { Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WorkPackageViewCollapsedGroupsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-collapsed-groups.service';\nimport { WorkPackageTableConfiguration } from 'core-app/features/work-packages/components/wp-table/wp-table-configuration';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { WorkPackageTimelineTableController } from '../wp-table/timeline/container/wp-timeline-container.directive';\nimport { GroupedRowsBuilder } from './builders/modes/grouped/grouped-rows-builder';\nimport { HierarchyRowsBuilder } from './builders/modes/hierarchy/hierarchy-rows-builder';\nimport { PlainRowsBuilder } from './builders/modes/plain/plain-rows-builder';\nimport { RowsBuilder } from './builders/modes/rows-builder';\nimport { PrimaryRenderPass } from './builders/primary-render-pass';\nimport { WorkPackageTableEditingContext } from './wp-table-editing';\nimport { WorkPackageTableRow } from './wp-table.interfaces';\n\nexport class WorkPackageTable {\n @InjectField() querySpace:IsolatedQuerySpace;\n\n @InjectField() apiV3Service:ApiV3Service;\n\n @InjectField() states:States;\n\n @InjectField() I18n!:I18nService;\n\n @InjectField() workPackageViewCollapsedGroupsService:WorkPackageViewCollapsedGroupsService;\n\n public originalRows:string[] = [];\n\n public originalRowIndex:{ [id:string]:WorkPackageTableRow } = {};\n\n private hierarchyRowsBuilder = new HierarchyRowsBuilder(this.injector, this);\n\n private groupedRowsBuilder = new GroupedRowsBuilder(this.injector, this);\n\n private plainRowsBuilder = new PlainRowsBuilder(this.injector, this);\n\n // WP rows builder\n // Ordered by priority\n private builders = [this.hierarchyRowsBuilder, this.groupedRowsBuilder, this.plainRowsBuilder];\n\n // Last render pass used for refreshing single rows\n public lastRenderPass:PrimaryRenderPass|null = null;\n\n // Work package editing context handler in the table, which handles open forms\n // and their contexts\n public editing:WorkPackageTableEditingContext = new WorkPackageTableEditingContext(this, this.injector);\n\n constructor(public readonly injector:Injector,\n public tableAndTimelineContainer:HTMLElement,\n public scrollContainer:HTMLElement,\n public tbody:HTMLElement,\n public timelineBody:HTMLElement,\n public timelineController:WorkPackageTimelineTableController,\n public configuration:WorkPackageTableConfiguration) {\n }\n\n public get renderedRows() {\n return this.querySpace.tableRendered.getValueOr([]);\n }\n\n public findRenderedRow(classIdentifier:string):[number, RenderedWorkPackage] {\n const index = _.findIndex(this.renderedRows, (row) => row.classIdentifier === classIdentifier);\n\n return [index, this.renderedRows[index]];\n }\n\n public get rowBuilder():RowsBuilder {\n return _.find(this.builders, (builder:RowsBuilder) => builder.isApplicable(this))!;\n }\n\n /**\n * Build the row index and positions from the given set of ordered work packages.\n * @param rows\n */\n private buildIndex(rows:WorkPackageResource[]) {\n this.originalRowIndex = {};\n this.originalRows = rows.map((wp:WorkPackageResource, i:number) => {\n const wpId = wp.id!;\n\n // Ensure we get the latest version\n wp = this.apiV3Service.work_packages.cache.current(wpId, wp)!;\n\n this.originalRowIndex[wpId] = { object: wp, workPackageId: wpId, position: i };\n return wpId;\n });\n }\n\n /**\n *\n * @param rows\n */\n public initialSetup(rows:WorkPackageResource[]) {\n // Build the row representation\n this.buildIndex(rows);\n\n // Draw work packages\n this.redrawTableAndTimeline();\n }\n\n /**\n * Removes the contents of this table's tbody and redraws\n * all elements.\n */\n public redrawTableAndTimeline() {\n const renderPass = this.performRenderPass(false);\n\n // Insert timeline body\n requestAnimationFrame(() => {\n this.tbody.innerHTML = '';\n this.timelineBody.innerHTML = '';\n this.tbody.appendChild(renderPass.tableBody);\n this.timelineBody.appendChild(renderPass.timeline.timelineBody);\n\n // Mark rendering event in a timeout to let DOM process\n setTimeout(() => this.querySpace.tableRendered.putValue(renderPass.result));\n });\n }\n\n /**\n * Redraw all elements in the table section only\n */\n public redrawTable() {\n const renderPass = this.performRenderPass();\n this.querySpace.tableRendered.putValue(renderPass.result);\n }\n\n /**\n * Redraw single rows for a given work package being updated.\n */\n public refreshRows(workPackage:WorkPackageResource) {\n const pass = this.lastRenderPass;\n if (!pass) {\n debugLog('Trying to refresh a singular row without a previous render pass.');\n return;\n }\n\n _.each(pass.renderedOrder, (row) => {\n if (row.workPackage && row.workPackage.id === workPackage.id!) {\n debugLog(`Refreshing rendered row ${row.classIdentifier}`);\n row.workPackage = workPackage;\n pass.refresh(row, workPackage, this.tbody);\n }\n });\n }\n\n /**\n * Determine whether we need an empty placeholder row.\n * When D&D is enabled, the table requires a drag target that is non-empty,\n * and the tbody cannot be resized appropriately.\n */\n public get renderPlaceholderRow() {\n return this.configuration.dragAndDropEnabled;\n }\n\n /**\n * Perform the render pass\n * @param insert whether to insert the result (set to false for timeline)\n */\n private performRenderPass(insert = true) {\n this.editing.reset();\n const renderPass = this.lastRenderPass = this.rowBuilder.buildRows();\n\n // Insert table body\n if (insert) {\n requestAnimationFrame(() => {\n this.tbody.innerHTML = '';\n this.tbody.appendChild(renderPass.tableBody);\n });\n }\n\n return renderPass;\n }\n\n setGroupsCollapseState(newState:{ [key:string]:boolean }) {\n this.querySpace.collapsedGroups.putValue(newState);\n\n const t0 = performance.now();\n this.groupedRowsBuilder.refreshExpansionState();\n const t1 = performance.now();\n\n debugLog(`Group redraw took ${t1 - t0} milliseconds.`);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output,\n} from '@angular/core';\nimport { WorkPackageViewHighlightingService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-highlighting.service';\nimport { CardViewOrientation } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { HighlightingMode } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting-mode.const';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { DragAndDropService } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.service';\nimport { WorkPackageCardDragAndDropService } from 'core-app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { WorkPackageTableConfiguration } from 'core-app/features/work-packages/components/wp-table/wp-table-configuration';\nimport { WorkPackageViewOutputs } from 'core-app/features/work-packages/routing/wp-view-base/event-handling/event-handler-registry';\n\n@Component({\n selector: 'wp-grid',\n template: `\n \n \n\n
\n \n
\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n DragAndDropService,\n WorkPackageCardDragAndDropService,\n ],\n})\nexport class WorkPackagesGridComponent implements WorkPackageViewOutputs {\n @Input() public configuration:WorkPackageTableConfiguration;\n\n @Input() public showResizer = false;\n\n @Input() public resizerClass = '';\n\n @Input() public resizerStorageKey = '';\n\n @Output() selectionChanged = new EventEmitter();\n\n @Output() itemClicked = new EventEmitter<{ workPackageId:string, double:boolean }>();\n\n @Output() stateLinkClicked = new EventEmitter<{ workPackageId:string, requestedState:string }>();\n\n public canDragOutOf:() => boolean;\n\n public dragInto:boolean;\n\n public gridOrientation:CardViewOrientation = 'horizontal';\n\n public highlightingMode:HighlightingMode = 'none';\n\n constructor(readonly wpTableHighlight:WorkPackageViewHighlightingService,\n readonly wpTableSortBy:WorkPackageViewSortByService,\n readonly wpList:WorkPackagesListService,\n readonly querySpace:IsolatedQuerySpace,\n readonly cdRef:ChangeDetectorRef) {\n }\n\n ngOnInit() {\n this.dragInto = this.configuration.dragAndDropEnabled;\n this.canDragOutOf = () => this.configuration.dragAndDropEnabled;\n\n this.wpTableHighlight\n .updates$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n distinctUntilChanged(),\n )\n .subscribe(() => {\n this.highlightingMode = this.wpTableHighlight.current.mode;\n this.cdRef.detectChanges();\n });\n }\n\n public switchToManualSorting() {\n const query = this.querySpace.query.value;\n if (query && this.wpTableSortBy.switchToManualSorting(query)) {\n void this.wpList.createOrSave(query);\n }\n }\n}\n","import { Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { tdClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/cell-builder';\nimport { internalContextMenuColumn } from 'core-app/features/work-packages/components/wp-fast-table/builders/internal-sort-columns';\nimport { EditForm } from 'core-app/shared/components/fields/edit/edit-form/edit-form';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageTable } from '../wp-fast-table/wp-fast-table';\nimport { rowId } from '../wp-fast-table/helpers/wp-table-row-helpers';\nimport {\n commonRowClassName,\n SingleRowBuilder,\n tableRowClassName,\n} from '../wp-fast-table/builders/rows/single-row-builder';\n\nexport const inlineCreateRowClassName = 'wp-inline-create-row';\nexport const inlineCreateCancelClassName = 'wp-table--cancel-create-link';\n\nexport class InlineCreateRowBuilder extends SingleRowBuilder {\n // Injections\n @InjectField() public states:States;\n\n @InjectField() public wpTableSelection:WorkPackageViewSelectionService;\n\n @InjectField() public wpTableColumns:WorkPackageViewColumnsService;\n\n @InjectField() public I18n:I18nService;\n\n protected text:{ cancelButton:string };\n\n constructor(public readonly injector:Injector,\n workPackageTable:WorkPackageTable) {\n super(injector, workPackageTable);\n\n this.text = {\n cancelButton: this.I18n.t('js.button_cancel'),\n };\n }\n\n public buildCell(workPackage:WorkPackageResource, column:QueryColumn):HTMLElement|null {\n switch (column.id) {\n case internalContextMenuColumn.id:\n return this.buildCancelButton();\n default:\n return super.buildCell(workPackage, column);\n }\n }\n\n public buildNew(workPackage:WorkPackageResource, form:EditForm):[HTMLElement, boolean] {\n // Get any existing edit state for this work package\n const [row, hidden] = this.buildEmpty(workPackage);\n\n return [row, hidden];\n }\n\n /**\n * Create an empty unattached row element for the given work package\n * @param workPackage\n * @returns {any}\n */\n public createEmptyRow(workPackage:WorkPackageResource) {\n const identifier = this.classIdentifier(workPackage);\n const tr = document.createElement('tr');\n tr.id = rowId(workPackage.id!);\n tr.dataset.workPackageId = workPackage.id!;\n tr.dataset.classIdentifier = identifier;\n tr.classList.add(\n inlineCreateRowClassName, commonRowClassName, tableRowClassName, 'issue',\n identifier,\n `${identifier}-table`,\n );\n\n return tr;\n }\n\n protected buildCancelButton() {\n const td = document.createElement('td');\n td.classList.add(tdClassName, 'wp-table--cancel-create-td');\n\n td.innerHTML = `\n \n \n `;\n\n return td;\n }\n}\n","\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Injector,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { filter } from 'rxjs/operators';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport {\n combineLatest,\n Subscription,\n} from 'rxjs';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { EditForm } from 'core-app/shared/components/fields/edit/edit-form/edit-form';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport {\n inlineCreateCancelClassName,\n InlineCreateRowBuilder,\n inlineCreateRowClassName,\n} from './inline-create-row-builder';\nimport { WorkPackageCreateService } from '../wp-new/wp-create.service';\nimport { WorkPackageTable } from '../wp-fast-table/wp-fast-table';\nimport { onClickOrEnter } from '../wp-fast-table/handlers/click-or-enter-handler';\n\n@Component({\n selector: '[wpInlineCreate]',\n templateUrl: './wp-inline-create.component.html',\n})\nexport class WorkPackageInlineCreateComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit {\n @Input('wp-inline-create--table') table:WorkPackageTable;\n\n @Input('wp-inline-create--project-identifier') projectIdentifier:string;\n\n @Output('wp-inline-create--showing') showing = new EventEmitter();\n\n // inner state\n public canAdd = false;\n\n public canReference = false;\n\n // Inline create / reference row is active\n public mode:'inactive'|'create'|'reference' = 'inactive';\n\n public focus = false;\n\n public text = this.wpInlineCreate.buttonTexts;\n\n private currentWorkPackage:WorkPackageResource|null;\n\n private workPackageEditForm:EditForm|undefined;\n\n private editingSubscription:Subscription|undefined;\n\n private $element:JQuery;\n\n get isActive():boolean {\n return this.mode !== 'inactive';\n }\n\n constructor(public readonly injector:Injector,\n protected readonly elementRef:ElementRef,\n protected readonly schemaCache:SchemaCacheService,\n protected readonly I18n:I18nService,\n protected readonly querySpace:IsolatedQuerySpace,\n protected readonly cdRef:ChangeDetectorRef,\n protected readonly wpCreate:WorkPackageCreateService,\n protected readonly wpInlineCreate:WorkPackageInlineCreateService,\n protected readonly wpTableColumns:WorkPackageViewColumnsService,\n protected readonly wpTableFocus:WorkPackageViewFocusService,\n protected readonly authorisationService:AuthorisationService) {\n super();\n }\n\n ngOnInit() {\n this.$element = jQuery(this.elementRef.nativeElement);\n }\n\n ngAfterViewInit():void {\n combineLatest([\n this.wpInlineCreate.canAdd,\n this.wpInlineCreate.canReference,\n ])\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(([canAdd, canReference]) => {\n this.canAdd = canAdd;\n this.canReference = this.hasReferenceClass && canReference;\n this.cdRef.detectChanges();\n this.showing.emit(this.canAdd || this.canReference);\n });\n\n // Register callback on newly created work packages\n this.registerCreationCallback();\n\n // Watch on this scope when the columns change and refresh this row\n this.refreshOnColumnChanges();\n\n // Cancel edition of current new row\n this.registerCancelHandler();\n }\n\n /**\n * Reset the inline creation row on the cancel button,\n * which is dynamically inserted into the action row by the inline create renderer.\n */\n private registerCancelHandler() {\n this.$element.on('click keydown', `.${inlineCreateCancelClassName}`, (evt:JQuery.TriggeredEvent) => {\n onClickOrEnter(evt, () => {\n this.resetRow();\n });\n\n evt.stopImmediatePropagation();\n return false;\n });\n }\n\n /**\n * Since the table is refreshed imperatively whenever columns are changed,\n * we need to manually ensure the inline create row gets refreshed as well.\n */\n private refreshOnColumnChanges() {\n this.wpTableColumns\n .updates$()\n .pipe(\n filter(() => this.isActive), // Take only when row is inserted\n this.untilDestroyed(),\n )\n .subscribe(() => this.refreshRow());\n }\n\n /**\n * Listen to newly created work packages to detect whether the WP is the one we created,\n * and properly reset inline create in this case\n */\n private registerCreationCallback() {\n this.wpCreate\n .onNewWorkPackage()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp:WorkPackageResource) => {\n if (this.currentWorkPackage && this.currentWorkPackage.__initialized_at === wp.__initialized_at) {\n // Remove row and focus\n this.resetRow();\n\n // Split view on the last inserted id if any\n if (!this.table.configuration.isEmbedded) {\n this.wpTableFocus.updateFocus(wp.id!);\n }\n\n // Notify inline create service\n this.wpInlineCreate.newInlineWorkPackageCreated.next(wp.id!);\n } else {\n // Remove current row\n this.wpCreate.cancelCreation();\n this.removeWorkPackageRow();\n this.showRow();\n }\n\n this.cdRef.detectChanges();\n });\n }\n\n public handleAddRowClick() {\n this.addWorkPackageRow();\n return false;\n }\n\n public handleReferenceClick() {\n this.mode = 'reference';\n return false;\n }\n\n public get referenceClass() {\n return this.wpInlineCreate.referenceComponentClass;\n }\n\n public get hasReferenceClass() {\n return !!this.referenceClass;\n }\n\n public addWorkPackageRow() {\n this.wpCreate\n .createOrContinueWorkPackage(this.projectIdentifier)\n .then((change:WorkPackageChangeset) => {\n const wp = this.currentWorkPackage = change.projectedResource;\n\n this.editingSubscription = this\n .wpCreate\n .changesetUpdates$()\n .pipe(\n filter(() => !!this.currentWorkPackage),\n ).subscribe((form) => {\n if (!this.isActive) {\n this.insertRow(wp);\n } else {\n this.schemaCache.update(this.currentWorkPackage!, form.schema);\n this.refreshRow();\n }\n });\n });\n }\n\n private insertRow(wp:WorkPackageResource) {\n // Actually render the row\n const form = this.workPackageEditForm = this.renderInlineCreateRow(wp);\n\n setTimeout(() => {\n // Activate any required fields\n form.activateMissingFields();\n\n // Hide the button row\n this.hideRow();\n });\n }\n\n private refreshRow() {\n const builder = new InlineCreateRowBuilder(this.injector, this.table);\n const rowElement = this.$element.find(`.${inlineCreateRowClassName}`);\n\n if (rowElement.length && this.currentWorkPackage) {\n builder.refreshRow(this.currentWorkPackage, rowElement);\n }\n }\n\n /**\n * Actually render the row manually\n * in the same fashion as all rows in the table are rendered.\n *\n * @param wp Work package to be rendered\n * @returns The work package form of the row\n */\n private renderInlineCreateRow(wp:WorkPackageResource):EditForm {\n const builder = new InlineCreateRowBuilder(this.injector, this.table);\n const form = this.table.editing.startEditing(wp, builder.classIdentifier(wp));\n\n const [row] = builder.buildNew(wp, form);\n this.$element.append(row);\n\n return form;\n }\n\n /**\n * Reset the new work package row and refocus on the button\n */\n @HostListener('keydown.escape')\n public resetRow() {\n this.focus = true;\n this.removeWorkPackageRow();\n // Manually cancelled, show the row again\n setTimeout(() => {\n this.showRow();\n this.cdRef.detectChanges();\n }, 50);\n }\n\n public removeWorkPackageRow() {\n this.wpCreate.cancelCreation();\n this.currentWorkPackage = null;\n this.$element.find('.wp-row-new').remove();\n if (this.editingSubscription) {\n this.editingSubscription.unsubscribe();\n }\n }\n\n public showRow() {\n this.mode = 'inactive';\n this.cdRef.detectChanges();\n }\n\n public hideRow() {\n this.mode = 'create';\n this.cdRef.detectChanges();\n }\n\n public get colspan():number {\n return this.wpTableColumns.columnCount + 1;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Injectable,\n Injector,\n OnDestroy,\n} from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport {\n Observable,\n of,\n Subject,\n} from 'rxjs';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\n\n@Injectable()\nexport class WorkPackageInlineCreateService implements OnDestroy {\n @InjectField() I18n!:I18nService;\n\n @InjectField() protected readonly currentUser:CurrentUserService;\n\n @InjectField() protected readonly currentProject:CurrentProjectService;\n\n constructor(readonly injector:Injector) {\n }\n\n /**\n * A separate reference pane for the inline create component\n */\n public readonly referenceComponentClass:ComponentType|null = null;\n\n /**\n * A related work package for the inline create context\n */\n public referenceTarget:WorkPackageResource|null = null;\n\n /**\n * Reference button text\n */\n public readonly buttonTexts = {\n reference: '',\n create: this.I18n.t('js.label_create_work_package'),\n };\n\n public get canAdd():Observable {\n return this.canCreateWorkPackages();\n }\n\n public get canReference():Observable {\n return of(false);\n }\n\n /**\n * Observable capability check for work_packages/create and /edit.\n * Edit is included as inline create saves quickly, preventing further edits for users\n * that don't also have edit permisison.\n *\n * @protected\n */\n protected canCreateWorkPackages(projectId:string|null = this.currentProject.id):Observable {\n return this\n .currentUser\n .hasCapabilities$(\n ['work_packages/create', 'work_packages/update'],\n projectId || null,\n );\n }\n\n /** Allow callbacks to happen on newly created inline work packages */\n public newInlineWorkPackageCreated = new Subject();\n\n /** Allow callbacks to happen on newly created inline work packages */\n public newInlineWorkPackageReferenced = new Subject();\n\n /**\n * Ensure hierarchical injected versions of this service correctly unregister\n */\n ngOnDestroy():void {\n this.newInlineWorkPackageCreated.complete();\n this.newInlineWorkPackageReferenced.complete();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { StateService, TransitionPromise } from '@uirouter/core';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { Injectable } from '@angular/core';\nimport { WorkPackageViewPagination } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-pagination';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\n\n@Injectable()\nexport class WorkPackagesListChecksumService {\n constructor(protected UrlParamsHelper:UrlParamsHelperService,\n protected $state:StateService) {\n }\n\n public id:string|null;\n\n public checksum:string|null;\n\n public visibleChecksum:string|null;\n\n public updateIfDifferent(query:QueryResource,\n pagination:WorkPackageViewPagination):Promise {\n const newQueryChecksum = this.getNewChecksum(query, pagination);\n let routePromise:Promise = Promise.resolve();\n\n if (this.isUninitialized()) {\n // Do nothing\n } else if (this.isIdDifferent(query.id)) {\n routePromise = this.maintainUrlQueryState(query.id, null);\n\n this.clear();\n } else if (this.isChecksumDifferent(newQueryChecksum)) {\n routePromise = this.maintainUrlQueryState(query.id, newQueryChecksum);\n }\n\n this.set(query.id, newQueryChecksum);\n return routePromise;\n }\n\n public update(query:QueryResource, pagination:WorkPackageViewPagination) {\n const newQueryChecksum = this.getNewChecksum(query, pagination);\n\n this.set(query.id, newQueryChecksum);\n\n this.maintainUrlQueryState(query.id, newQueryChecksum);\n }\n\n public setToQuery(query:QueryResource, pagination:WorkPackageViewPagination) {\n const newQueryChecksum = this.getNewChecksum(query, pagination);\n\n this.set(query.id, newQueryChecksum);\n\n return this.maintainUrlQueryState(query.id, null);\n }\n\n public isQueryOutdated(query:QueryResource,\n pagination:WorkPackageViewPagination) {\n const newQueryChecksum = this.getNewChecksum(query, pagination);\n\n return this.isOutdated(query.id, newQueryChecksum);\n }\n\n public executeIfOutdated(newId:string,\n newChecksum:string|null,\n callback:Function) {\n if (this.isUninitialized() || this.isOutdated(newId, newChecksum)) {\n this.set(newId, newChecksum);\n\n callback();\n }\n }\n\n public set(id:string|null, checksum:string|null) {\n this.id = id;\n this.checksum = checksum;\n }\n\n public clear() {\n this.id = null;\n this.checksum = null;\n this.visibleChecksum = null;\n }\n\n public isUninitialized() {\n return !this.id && !this.checksum;\n }\n\n private isIdDifferent(otherId:string|null) {\n return this.id !== otherId;\n }\n\n private isChecksumDifferent(otherChecksum:string) {\n return this.checksum && otherChecksum !== this.checksum;\n }\n\n private isOutdated(otherId:string|null, otherChecksum:string|null) {\n const hasCurrentQueryID = !!this.id;\n const hasCurrentChecksum = !!this.checksum;\n const idChanged = (this.id !== otherId);\n\n const checksumChanged = (otherChecksum !== this.checksum);\n const visibleChecksumChanged = (this.checksum && !otherChecksum && this.visibleChecksum);\n\n return (\n // Can only be outdated if either ID or props set\n (hasCurrentQueryID || hasCurrentChecksum)\n && (\n // Query ID changed\n idChanged\n // Query ID same + query props changed\n || (!idChanged && checksumChanged && (otherChecksum || this.visibleChecksum))\n // No query ID set\n || (!hasCurrentQueryID && visibleChecksumChanged)\n )\n );\n }\n\n private getNewChecksum(query:QueryResource, pagination:WorkPackageViewPagination) {\n return this.UrlParamsHelper.encodeQueryJsonParams(\n query,\n {\n pp: pagination.perPage,\n pa: pagination.page,\n },\n );\n }\n\n private maintainUrlQueryState(id:string|null, checksum:string|null):TransitionPromise {\n this.visibleChecksum = checksum;\n\n return this.$state.go(\n '.',\n { query_props: checksum, query_id: id },\n { custom: { notify: false } },\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { Injectable } from '@angular/core';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { QueryFilterInstanceSchemaResource } from 'core-app/features/hal/resources/query-filter-instance-schema-resource';\nimport { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';\nimport { QueryFilterResource } from 'core-app/features/hal/resources/query-filter-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { QuerySortByResource } from 'core-app/features/hal/resources/query-sort-by-resource';\nimport { QueryGroupByResource } from 'core-app/features/hal/resources/query-group-by-resource';\nimport { QueryColumn } from '../wp-query/query-column';\n\n@Injectable()\nexport class WorkPackagesListInvalidQueryService {\n constructor(protected halResourceService:HalResourceService) {\n }\n\n public restoreQuery(query:QueryResource, form:QueryFormResource) {\n this.restoreFilters(query, form.payload, form.schema);\n this.restoreColumns(query, form.payload, form.schema);\n this.restoreSortBy(query, form.payload, form.schema);\n this.restoreGroupBy(query, form.payload, form.schema);\n this.restoreOtherProperties(query, form.payload);\n }\n\n private restoreFilters(query:QueryResource, payload:QueryResource, querySchema:SchemaResource) {\n let filters = _.map((payload.filters), (filter) => {\n const filterInstanceSchema = _.find(querySchema.filtersSchemas.elements, (schema:QueryFilterInstanceSchemaResource) => (schema.filter.allowedValues as QueryFilterResource[])[0].href === filter.filter.href);\n\n if (!filterInstanceSchema) {\n return null;\n }\n\n const recreatedFilter = filterInstanceSchema.getFilter();\n\n const operator = _.find(filterInstanceSchema.operator.allowedValues, (operator) => operator.href === filter.operator.href);\n\n if (operator) {\n recreatedFilter.operator = operator;\n }\n\n recreatedFilter.values.length = 0;\n _.each(filter.values, (value) => recreatedFilter.values.push(value));\n\n return recreatedFilter;\n });\n\n filters = _.compact(filters);\n\n // clear filters while keeping reference\n query.filters.length = 0;\n _.each(filters, (filter) => query.filters.push(filter));\n }\n\n private restoreColumns(query:QueryResource, stubQuery:QueryResource, schema:SchemaResource) {\n let columns = _.map(stubQuery.columns, (column) => _.find((schema.columns.allowedValues as QueryColumn[]), (candidate) => candidate.href === column.href));\n\n columns = _.compact(columns);\n\n query.columns.length = 0;\n _.each(columns, (column) => query.columns.push(column!));\n }\n\n private restoreSortBy(query:QueryResource, stubQuery:QueryResource, schema:SchemaResource) {\n let sortBys = _.map((stubQuery.sortBy), (sortBy) => _.find((schema.sortBy.allowedValues as QuerySortByResource[]), (candidate) => candidate.href === sortBy.href)!);\n\n sortBys = _.compact(sortBys);\n\n query.sortBy.length = 0;\n _.each(sortBys, (sortBy) => query.sortBy.push(sortBy));\n }\n\n private restoreGroupBy(query:QueryResource, stubQuery:QueryResource, schema:SchemaResource) {\n const groupBy = _.find((schema.groupBy.allowedValues as QueryGroupByResource[]), (candidate) => stubQuery.groupBy && stubQuery.groupBy.href === candidate.href) as any;\n\n query.groupBy = groupBy;\n }\n\n private restoreOtherProperties(query:QueryResource, stubQuery:QueryResource) {\n _.without(Object.keys(stubQuery.$source), '_links', 'filters').forEach((property:any) => {\n query[property] = stubQuery[property];\n });\n\n _.without(Object.keys(stubQuery.$source._links), 'columns', 'groupBy', 'sortBy').forEach((property:any) => {\n query[property] = stubQuery[property];\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { StateService } from '@uirouter/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable } from '@angular/core';\nimport isPersistedResource from 'core-app/features/hal/helpers/is-persisted-resource';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n from,\n Observable,\n of,\n} from 'rxjs';\nimport { input } from 'reactivestates';\nimport {\n catchError,\n mapTo,\n mergeMap,\n share,\n switchMap,\n take,\n} from 'rxjs/operators';\nimport {\n WorkPackageViewPaginationService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-pagination.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3QueriesPaths } from 'core-app/core/apiv3/endpoints/queries/apiv3-queries-paths';\nimport { ApiV3QueryPaths } from 'core-app/core/apiv3/endpoints/queries/apiv3-query-paths';\nimport { PaginationService } from 'core-app/shared/components/table-pagination/pagination-service';\nimport { ErrorResource } from 'core-app/features/hal/resources/error-resource';\nimport { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';\nimport { WorkPackageStatesInitializationService } from './wp-states-initialization.service';\nimport { WorkPackagesListInvalidQueryService } from './wp-list-invalid-query.service';\nimport { WorkPackagesQueryViewService } from 'core-app/features/work-packages/components/wp-list/wp-query-view.service';\n\nexport interface QueryDefinition {\n queryParams:{ query_id?:string|null, query_props?:string|null };\n projectIdentifier?:string;\n}\n\n@Injectable()\nexport class WorkPackagesListService {\n // We remember the query requests coming in so we can ensure only the latest request is being tended to\n private queryRequests = input();\n\n // This mapped observable requests the latest query automatically.\n private queryLoading = this.queryRequests\n .values$()\n .pipe(\n switchMap((q:QueryDefinition) => from(this.ensurePerPageKnown().then(() => q))),\n // Stream the query request, switchMap will call previous requests to be cancelled\n switchMap((q:QueryDefinition) => this.streamQueryRequest(q.queryParams, q.projectIdentifier)),\n // Map the observable from the stream to a new one that completes when states are loaded\n mergeMap((query:QueryResource) => {\n // load the form if needed\n this.conditionallyLoadForm(query);\n\n // Project the loaded query into the table states and confirm the query is fully loaded\n this.wpStatesInitialization.initialize(query, query.results);\n return of(query);\n }),\n // Share any consecutive requests to the same resource, this is due to switchMap\n // diverting observables to the LATEST emitted.\n share(),\n );\n\n constructor(\n protected toastService:ToastService,\n readonly I18n:I18nService,\n protected UrlParamsHelper:UrlParamsHelperService,\n protected authorisationService:AuthorisationService,\n protected $state:StateService,\n protected apiV3Service:ApiV3Service,\n protected states:States,\n protected querySpace:IsolatedQuerySpace,\n protected pagination:PaginationService,\n protected configuration:ConfigurationService,\n protected wpTablePagination:WorkPackageViewPaginationService,\n protected wpStatesInitialization:WorkPackageStatesInitializationService,\n protected wpListInvalidQueryService:WorkPackagesListInvalidQueryService,\n protected wpQueryView:WorkPackagesQueryViewService,\n ) { }\n\n /**\n * Stream a query request as a HTTP observable. Each request to this method will\n * result in a new HTTP request.\n *\n * @param queryParams\n * @param projectIdentifier\n */\n private streamQueryRequest(queryParams:{ query_id?:string|null, query_props?:string|null }, projectIdentifier?:string):Observable {\n const decodedProps = this.getCurrentQueryProps(queryParams);\n const queryData = this.UrlParamsHelper.buildV3GetQueryFromJsonParams(decodedProps);\n const stream = this\n .apiV3Service\n .queries\n .find(queryData, queryParams.query_id, projectIdentifier);\n\n return stream.pipe(\n catchError((error) => {\n // Load a default query\n const queryProps = this.UrlParamsHelper.buildV3GetQueryFromJsonParams(decodedProps);\n return from(this.handleQueryLoadingError(error, queryProps, queryParams.query_id, projectIdentifier));\n }),\n );\n }\n\n /**\n * Load a query.\n * The query is either a persisted query, identified by the query_id parameter, or the default query. Both will be modified by the parameters in the query_props parameter.\n */\n public fromQueryParams(queryParams:{ query_id?:string|null, query_props?:string }, projectIdentifier?:string):Observable {\n this.queryRequests.clear();\n this.queryRequests.putValue({ queryParams, projectIdentifier });\n\n return this\n .queryLoading\n .pipe(\n take(1),\n );\n }\n\n /**\n * Get the current decoded query props, if any\n */\n public getCurrentQueryProps(params:{ query_props?:string|null }):string|null {\n if (params.query_props) {\n return decodeURIComponent(params.query_props);\n }\n\n return null;\n }\n\n /**\n * Load the default query.\n */\n public loadDefaultQuery(projectIdentifier?:string):Promise {\n return this.fromQueryParams({}, projectIdentifier).toPromise();\n }\n\n /**\n * Reloads the current query and set the pagination to the first page.\n */\n public reloadQuery(query:QueryResource, projectIdentifier?:string):Observable {\n const queryParams = this.extractParamsFromQuery(query, { pa: 1 });\n\n this.queryRequests.clear();\n this.queryRequests.putValue({\n queryParams: { query_id: query.id || undefined, query_props: queryParams },\n projectIdentifier,\n });\n\n return this\n .queryLoading\n .pipe(\n take(1),\n );\n }\n\n /**\n * Extract a set of query params from the current query resource\n * @param query The query to derive props from\n * @param additional Additional props to append\n */\n public extractParamsFromQuery(\n query:QueryResource,\n additional:Record = {},\n ):string {\n return this.UrlParamsHelper.encodeQueryJsonParams(\n query,\n {\n pa: this.wpTablePagination.current.page,\n pp: this.wpTablePagination.current.perPage,\n ...additional,\n },\n );\n }\n\n /**\n * Update the query from an existing (probably unsaved) query.\n *\n * Will choose the correct path:\n * - If the query is unsaved, use `/api/v3(/projects/:identifier)/queries/default`\n * - If the query is saved, use `/api/v3/queries/:id`\n *\n */\n public loadQueryFromExisting(query:QueryResource, additionalParams:Object, projectIdentifier?:string):Observable {\n const params = this.UrlParamsHelper.buildV3GetQueryFromQueryResource(query, additionalParams);\n\n let path:ApiV3QueriesPaths|ApiV3QueryPaths;\n\n if (query.id) {\n path = this.apiV3Service.queries.id(query.id);\n } else {\n path = this.apiV3Service.withOptionalProject(projectIdentifier).queries;\n }\n\n return path.parameterised(params);\n }\n\n /**\n * Load the query from the given state params\n */\n public loadCurrentQueryFromParams(projectIdentifier?:string) {\n return this\n .fromQueryParams(this.$state.params as any, projectIdentifier)\n .toPromise();\n }\n\n public loadForm(query:QueryResource):Promise {\n return this\n .apiV3Service\n .queries\n .form\n .load(query)\n .toPromise()\n .then(([form, _]) => {\n this.wpStatesInitialization.updateStatesFromForm(query, form);\n\n return form;\n });\n }\n\n /**\n * Persist the current query in the backend.\n * After the update, the new query is reloaded (e.g. for the work packages)\n */\n public create(query:QueryResource, name:string):Promise {\n const form = this.querySpace.queryForm.value!;\n\n query.name = name;\n\n const promise = this\n .createQueryAndView(query, form)\n .toPromise()\n .then((createdQuery) => {\n this.toastService.addSuccess(this.I18n.t('js.notice_successful_create'));\n\n // Reload the query, and then reload the menu\n this.reloadQuery(createdQuery).subscribe(() => {\n this.states.changes.queries.next(createdQuery.id);\n });\n\n return createdQuery;\n });\n\n return promise;\n }\n\n /**\n * Destroy the current query.\n */\n public delete() {\n const query = this.currentQuery;\n\n const promise = this\n .apiV3Service\n .queries\n .id(query)\n .delete()\n .toPromise();\n\n void promise\n .then(() => {\n this.toastService.addSuccess(this.I18n.t('js.notice_successful_delete'));\n\n let id;\n if (query.project) {\n id = query.project.href!.split('/').pop();\n }\n\n this.loadDefaultQuery(id);\n\n this.states.changes.queries.next(query.id!);\n });\n\n return promise;\n }\n\n public async save(givenQuery?:QueryResource):Promise {\n const query = givenQuery || this.currentQuery;\n\n const form = await this.querySpace.queryForm.valuesPromise();\n\n const promise = this\n .apiV3Service\n .queries\n .id(query)\n .patch(query, form)\n .toPromise();\n\n void promise\n .then(() => {\n this.toastService.addSuccess(this.I18n.t('js.notice_successful_update'));\n\n this.$state.go('.', { query_id: query!.id, query_props: null }, { reload: true });\n this.states.changes.queries.next(query!.id!);\n })\n .catch((error:ErrorResource) => {\n this.toastService.addError(error.message);\n });\n\n return promise;\n }\n\n public async createOrSave(query:QueryResource):Promise {\n if (!isPersistedResource(query)) {\n return this.create(query, 'New manually sorted query');\n }\n return this.save(query);\n }\n\n public toggleStarred(query:QueryResource):Promise {\n const promise = this\n .apiV3Service\n .queries\n .toggleStarred(query);\n\n void promise.then((query:QueryResource) => {\n this.querySpace.query.putValue(query);\n\n this.toastService.addSuccess(this.I18n.t('js.notice_successful_update'));\n\n this.states.changes.queries.next(query.id!);\n });\n\n return promise;\n }\n\n public getPaginationInfo() {\n return this.wpTablePagination.paginationObject;\n }\n\n private conditionallyLoadForm(query:QueryResource):void {\n const currentForm = this.querySpace.queryForm.value;\n\n if (!currentForm || query.$links.update.href !== currentForm.href) {\n setTimeout(() => this.loadForm(query), 0);\n }\n }\n\n public get currentQuery() {\n return this.querySpace.query.value!;\n }\n\n private handleQueryLoadingError(error:ErrorResource, queryProps:any, queryId?:string|null, projectIdentifier?:string|null):Promise {\n this.toastService.addError(this.I18n.t('js.work_packages.faulty_query.description'), error.message);\n\n return new Promise((resolve, reject) => {\n this\n .apiV3Service\n .queries\n .form\n .loadWithParams(queryProps, queryId, projectIdentifier)\n .toPromise()\n .then(([form, _]) => {\n this\n .apiV3Service\n .queries\n .find({ pageSize: 0 }, undefined, projectIdentifier)\n .toPromise()\n .then((query:QueryResource) => {\n this.wpListInvalidQueryService.restoreQuery(query, form);\n\n query.results.pageSize = queryProps.pageSize;\n query.results.total = 0;\n\n if (queryId) {\n query.id = queryId;\n }\n\n this.wpStatesInitialization.initialize(query, query.results);\n this.wpStatesInitialization.updateStatesFromForm(query, form);\n\n resolve(query);\n })\n .catch(reject);\n })\n .catch(reject);\n });\n }\n\n private async ensurePerPageKnown() {\n if (this.pagination.isPerPageKnown) {\n return true;\n }\n return this.configuration.initialized;\n }\n\n private createQueryAndView(query:QueryResource, form:QueryFormResource|undefined) {\n return this\n .apiV3Service\n .queries\n .post(query, form)\n .pipe(\n switchMap((createdQuery) => this\n .wpQueryView\n .create(createdQuery)\n .pipe(\n mapTo(createdQuery),\n )),\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { StateService } from '@uirouter/core';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { Observable } from 'rxjs';\nimport { IView } from 'core-app/core/state/views/view.model';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Injectable()\nexport class WorkPackagesQueryViewService {\n constructor(\n protected $state:StateService,\n protected apiV3Service:ApiV3Service,\n ) { }\n\n create(query:QueryResource):Observable {\n if (!query.href) {\n throw new Error('Expected only queries that are created since an href is required');\n }\n\n return this\n .apiV3Service\n .views\n .post(\n {\n _links: {\n query: {\n href: query.href,\n },\n },\n },\n this.viewType,\n );\n }\n\n private get viewType() {\n if (this.$state.includes('work-packages')) {\n return 'work_packages_table';\n }\n if (this.$state.includes('team_planner')) {\n return 'team_planner';\n }\n if (this.$state.includes('bim')) {\n return 'bim';\n }\n if (this.$state.includes('calendar')) {\n return 'work_packages_calendar';\n }\n\n throw new Error('Not on a path defined for query views');\n }\n}\n","import { States } from 'core-app/core/states/states.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable } from '@angular/core';\nimport { WorkPackageViewHighlightingService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-highlighting.service';\nimport { take } from 'rxjs/operators';\nimport { WorkPackageViewOrderService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service';\nimport { WorkPackageViewDisplayRepresentationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\nimport { WorkPackageViewIncludeSubprojectsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-include-subprojects.service';\nimport { WorkPackageViewSumService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sum.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { WorkPackageViewAdditionalElementsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-additional-elements.service';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageViewPaginationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-pagination.service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { WorkPackageViewRelationColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-relation-columns.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WorkPackageViewCollapsedGroupsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-collapsed-groups.service';\nimport { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';\nimport { QuerySchemaResource } from 'core-app/features/hal/resources/query-schema-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { WorkPackagesListChecksumService } from './wp-list-checksum.service';\n\n@Injectable()\nexport class WorkPackageStatesInitializationService {\n constructor(\n protected states:States,\n protected querySpace:IsolatedQuerySpace,\n protected wpTableColumns:WorkPackageViewColumnsService,\n protected wpTableGroupBy:WorkPackageViewGroupByService,\n protected wpTableGroupFold:WorkPackageViewCollapsedGroupsService,\n protected wpTableSortBy:WorkPackageViewSortByService,\n protected wpTableFilters:WorkPackageViewFiltersService,\n protected wpTableSum:WorkPackageViewSumService,\n protected wpTableTimeline:WorkPackageViewTimelineService,\n protected wpTableHierarchies:WorkPackageViewHierarchiesService,\n protected wpTableHighlighting:WorkPackageViewHighlightingService,\n protected wpTableRelationColumns:WorkPackageViewRelationColumnsService,\n protected wpTablePagination:WorkPackageViewPaginationService,\n protected wpTableOrder:WorkPackageViewOrderService,\n protected wpTableAdditionalElements:WorkPackageViewAdditionalElementsService,\n protected apiV3Service:ApiV3Service,\n protected wpListChecksumService:WorkPackagesListChecksumService,\n protected authorisationService:AuthorisationService,\n protected wpDisplayRepresentation:WorkPackageViewDisplayRepresentationService,\n protected wpIncludeSubprojects:WorkPackageViewIncludeSubprojectsService,\n ) { }\n\n /**\n * Initialize the query and table states from the given query and results.\n * They may or may not come from the same query source.\n *\n * @param query\n * @param results\n */\n public initialize(query:QueryResource, results:WorkPackageCollectionResource) {\n this.clearStates();\n\n // Update the (global) wp query states\n this.querySpace.query.putValue(query);\n this.initializeFromQuery(query, results);\n\n // If the form is loaded, update it with the query\n const form = this.querySpace.queryForm.value;\n if (form) {\n this.updateStatesFromForm(query, form);\n }\n\n // Update the (local) table states\n this.updateQuerySpace(query, results);\n\n // Ensure checksum for state is correct\n this.updateChecksum(query, results);\n }\n\n /**\n * Insert new information from the query from to the states.\n *\n * @param query\n * @param form\n */\n public updateStatesFromForm(query:QueryResource, form:QueryFormResource) {\n const schema:QuerySchemaResource = form.schema as any;\n\n _.each(schema.filtersSchemas.elements, (schema) => {\n this.states.schemas.get(schema.href as string).putValue(schema as any);\n });\n\n this.wpTableFilters.initializeFilters(query, schema);\n this.querySpace.queryForm.putValue(form);\n\n this.querySpace.available.columns.putValue(schema.columns.allowedValues);\n this.querySpace.available.sortBy.putValue(schema.sortBy.allowedValues);\n this.querySpace.available.groupBy.putValue(schema.groupBy.allowedValues);\n this.querySpace.available.displayRepresentation.putValue(schema.displayRepresentation.allowedValues);\n }\n\n public updateQuerySpace(query:QueryResource, results:WorkPackageCollectionResource) {\n // Clear table required data states\n this.querySpace.additionalRequiredWorkPackages.clear('Clearing additional WPs before updating rows');\n this.querySpace.tableRendered.clear('Clearing rendered data before upgrading query space');\n\n if (results.schemas) {\n _.each(results.schemas.elements, (schema:SchemaResource) => {\n this.states.schemas.get(schema.href as string).putValue(schema);\n });\n }\n\n this.querySpace.query.putValue(query);\n\n this.authorisationService.initModelAuth('work_packages', results.$links);\n\n results.elements.forEach((wp) => this.apiV3Service.work_packages.cache.updateWorkPackage(wp, true));\n\n this.querySpace.results.putValue(results);\n\n this.querySpace.groups.putValue(results.groups);\n\n this.wpTablePagination.initialize(query, results);\n\n this.wpTableRelationColumns.initialize(query, results);\n\n this.wpTableAdditionalElements.initialize(query, results);\n\n this.wpTableOrder.initialize(query, results);\n\n this.wpDisplayRepresentation.initialize(query, results);\n\n this.wpIncludeSubprojects.initialize(query, results);\n\n this.querySpace.additionalRequiredWorkPackages\n .values$()\n .pipe(take(1))\n .subscribe(() => this.querySpace.initialized.putValue(null));\n }\n\n public updateChecksum(query:QueryResource, results:WorkPackageCollectionResource) {\n this.wpListChecksumService.updateIfDifferent(this.querySpace.query.value!, this.wpTablePagination.current);\n this.authorisationService.initModelAuth('work_packages', results.$links);\n }\n\n public initializeFromQuery(query:QueryResource, results:WorkPackageCollectionResource) {\n this.querySpace.query.putValue(query);\n\n this.wpTableSum.initialize(query);\n this.wpTableColumns.initialize(query, results);\n this.wpTableSortBy.initialize(query, results);\n this.wpTableGroupBy.initialize(query, results);\n this.wpTableGroupFold.initialize(query, results);\n this.wpTableTimeline.initialize(query, results);\n this.wpTableHierarchies.initialize(query, results);\n this.wpTableHighlighting.initialize(query, results);\n this.wpDisplayRepresentation.initialize(query, results);\n this.wpIncludeSubprojects.initialize(query, results);\n\n this.authorisationService.initModelAuth('query', query.$links);\n this.authorisationService.initModelAuth('work_packages', results.$links);\n }\n\n public applyToQuery(query:QueryResource) {\n this.wpTableFilters.applyToQuery(query);\n this.wpTableSum.applyToQuery(query);\n this.wpTableColumns.applyToQuery(query);\n this.wpTableSortBy.applyToQuery(query);\n this.wpTableGroupBy.applyToQuery(query);\n this.wpTableGroupFold.applyToQuery(query);\n this.wpTableTimeline.applyToQuery(query);\n this.wpTableHighlighting.applyToQuery(query);\n this.wpTableHierarchies.applyToQuery(query);\n this.wpTableOrder.applyToQuery(query);\n this.wpDisplayRepresentation.applyToQuery(query);\n this.wpIncludeSubprojects.applyToQuery(query);\n }\n\n public clearStates() {\n const reason = 'Clearing states before re-initialization.';\n\n // Clear immediate input states\n this.querySpace.initialized.clear(reason);\n this.querySpace.query.clear(reason);\n this.querySpace.results.clear(reason);\n this.querySpace.groups.clear(reason);\n this.querySpace.additionalRequiredWorkPackages.clear(reason);\n\n this.wpTableFilters.clear(reason);\n this.wpTableColumns.clear(reason);\n this.wpTableSortBy.clear(reason);\n this.wpTableGroupBy.clear(reason);\n this.wpTableGroupFold.clear(reason);\n this.wpDisplayRepresentation.clear(reason);\n this.wpIncludeSubprojects.clear(reason);\n this.wpTableSum.clear(reason);\n\n // Clear rendered state\n this.querySpace.tableRendered.clear(reason);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectorRef,\n Directive,\n Injector,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport {\n StateService,\n Transition,\n} from '@uirouter/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { RootResource } from 'core-app/features/hal/resources/root-resource';\nimport { takeWhile } from 'rxjs/operators';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { EditFormComponent } from 'core-app/shared/components/fields/edit/edit-form/edit-form.component';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport * as URI from 'urijs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { splitViewRoute } from 'core-app/features/work-packages/routing/split-view-routes.helper';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { HalSource } from 'core-app/features/hal/resources/hal-resource';\nimport { OpTitleService } from 'core-app/core/html/op-title.service';\nimport { WorkPackageCreateService } from './wp-create.service';\nimport { HalError } from 'core-app/features/hal/services/hal-error';\n\n@Directive()\nexport class WorkPackageCreateComponent extends UntilDestroyedMixin implements OnInit {\n public successState:string = splitViewRoute(this.$state);\n\n public cancelState:string = this.$state.current.data.baseRoute;\n\n public newWorkPackage:WorkPackageResource;\n\n public parentWorkPackage:WorkPackageResource;\n\n public change:WorkPackageChangeset;\n\n /** Are we in the copying substates ? */\n public copying = false;\n\n public stateParams = this.$transition.params('to');\n\n public text = {\n button_settings: this.I18n.t('js.button_settings'),\n };\n\n @ViewChild(EditFormComponent, { static: false }) protected editForm:EditFormComponent;\n\n /** Explicitly remember destroy state in this abstract base */\n protected destroyed = false;\n\n constructor(public readonly injector:Injector,\n protected readonly $transition:Transition,\n protected readonly $state:StateService,\n protected readonly I18n:I18nService,\n protected readonly titleService:OpTitleService,\n protected readonly notificationService:WorkPackageNotificationService,\n protected readonly states:States,\n protected readonly wpCreate:WorkPackageCreateService,\n protected readonly wpViewFocus:WorkPackageViewFocusService,\n protected readonly wpTableFilters:WorkPackageViewFiltersService,\n protected readonly pathHelper:PathHelperService,\n protected readonly apiV3Service:ApiV3Service,\n protected readonly cdRef:ChangeDetectorRef) {\n super();\n }\n\n public ngOnInit() {\n this.closeEditFormWhenNewWorkPackageSaved();\n\n this.showForm();\n }\n\n public ngOnDestroy() {\n super.ngOnDestroy();\n }\n\n public switchToFullscreen() {\n this.$state.go('work-packages.new', this.$state.params);\n }\n\n public onSaved(params:{ savedResource:WorkPackageResource, isInitial:boolean }) {\n const { savedResource, isInitial } = params;\n\n this.editForm?.cancel(false);\n\n if (this.successState) {\n this.$state.go(this.successState, { workPackageId: savedResource.id })\n .then(() => {\n this.wpViewFocus.updateFocus(savedResource.id!);\n this.notificationService.showSave(savedResource, isInitial);\n });\n }\n }\n\n protected showForm() {\n this\n .createdWorkPackage()\n .then((changeset:WorkPackageChangeset) => {\n this.change = changeset;\n this.newWorkPackage = changeset.pristineResource;\n this.cdRef.detectChanges();\n\n this.setTitle();\n\n if (this.stateParams.parent_id) {\n changeset.setValue(\n 'parent',\n { href: this.apiV3Service.work_packages.id(this.stateParams.parent_id).path },\n );\n }\n\n // Load the parent simply to display the type name :-/\n if (this.stateParams.parent_id) {\n this\n .apiV3Service\n .work_packages\n .id(this.stateParams.parent_id)\n .get()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((parent) => {\n this.parentWorkPackage = parent;\n this.cdRef.detectChanges();\n });\n }\n })\n .catch((error:unknown) => {\n if (error instanceof HalError && error.errorIdentifier === 'urn:openproject-org:api:v3:errors:MissingPermission') {\n this.apiV3Service.root.get().subscribe((root:RootResource) => {\n if (!root.user) {\n // Not logged in\n const url = URI(this.pathHelper.loginPath());\n url.search({ back_url: url });\n window.location.href = url.toString();\n }\n });\n this.notificationService.handleRawError(error);\n }\n });\n }\n\n protected setTitle() {\n this.titleService.setFirstPart(this.I18n.t('js.work_packages.create.title'));\n }\n\n public cancelAndBackToList() {\n this.wpCreate.cancelCreation();\n this.$state.go(this.cancelState, this.$state.params);\n }\n\n protected createdWorkPackage() {\n const defaults:HalSource = (this.stateParams.defaults as HalSource) || {};\n defaults._links = defaults._links || {};\n\n const type = this.stateParams.type ? parseInt(this.stateParams.type) : undefined;\n const parent = this.stateParams.parent_id ? parseInt(this.stateParams.parent_id) : undefined;\n const project = this.stateParams.projectPath;\n\n if (type) {\n defaults._links.type = { href: this.apiV3Service.types.id(type).path };\n }\n if (parent) {\n defaults._links.parent = { href: this.apiV3Service.work_packages.id(parent).path };\n }\n\n return this.wpCreate.createOrContinueWorkPackage(project, type, defaults);\n }\n\n private closeEditFormWhenNewWorkPackageSaved() {\n this.wpCreate\n .onNewWorkPackage()\n .pipe(\n takeWhile(() => !this.componentDestroyed),\n )\n .subscribe((wp:WorkPackageResource) => {\n this.onSaved({ savedResource: wp, isInitial: true });\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Injectable,\n Injector,\n} from '@angular/core';\nimport {\n Observable,\n Subject,\n} from 'rxjs';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { WorkPackageFilterValues } from 'core-app/features/work-packages/components/wp-edit-form/work-package-filter-values';\nimport {\n HalResourceEditingService,\n ResourceChangesetCommit,\n} from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { filter } from 'rxjs/operators';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { FormResource } from 'core-app/features/hal/resources/form-resource';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport {\n HalResource,\n HalSource,\n HalSourceLink,\n} from 'core-app/features/hal/resources/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\nimport { AttachmentsResourceService } from 'core-app/core/state/attachments/attachments.service';\n\nexport const newWorkPackageHref = '/api/v3/work_packages/new';\n\n@Injectable()\nexport class WorkPackageCreateService extends UntilDestroyedMixin {\n protected form:Promise|undefined;\n\n // Allow callbacks to happen on newly created work packages\n protected newWorkPackageCreatedSubject = new Subject();\n\n constructor(\n protected injector:Injector,\n protected hooks:HookService,\n protected apiV3Service:ApiV3Service,\n protected halResourceService:HalResourceService,\n protected querySpace:IsolatedQuerySpace,\n protected authorisationService:AuthorisationService,\n protected halEditing:HalResourceEditingService,\n protected schemaCache:SchemaCacheService,\n protected halEvents:HalEventsService,\n protected attachmentsService:AttachmentsResourceService,\n ) {\n super();\n\n this.halEditing\n .committedChanges\n .pipe(\n this.untilDestroyed(),\n filter((commit) => commit.resource._type === 'WorkPackage' && commit.wasNew),\n )\n .subscribe((commit:ResourceChangesetCommit) => {\n this.newWorkPackageCreated(commit.resource);\n });\n\n this.halEditing\n .changes$(newWorkPackageHref)\n .pipe(\n this.untilDestroyed(),\n filter((changeset) => !changeset),\n )\n .subscribe(() => {\n this.reset();\n });\n }\n\n protected newWorkPackageCreated(wp:WorkPackageResource):void {\n this.reset();\n this.newWorkPackageCreatedSubject.next(wp);\n }\n\n public onNewWorkPackage():Observable {\n return this.newWorkPackageCreatedSubject.asObservable();\n }\n\n public createNewWorkPackage(projectIdentifier:string|undefined|null, payload:HalSource):Promise {\n return this\n .apiV3Service\n .withOptionalProject(projectIdentifier)\n .work_packages\n .form\n .forPayload(payload)\n .toPromise()\n .then((form:FormResource) => this.fromCreateForm(form));\n }\n\n public fromCreateForm(form:FormResource):WorkPackageChangeset {\n const wp = this.initializeNewResource(form);\n\n const change = this.halEditing.edit(wp, form);\n\n // Call work package initialization hook\n this.hooks.call('workPackageNewInitialization', change);\n\n return change;\n }\n\n public copyWorkPackage(copyFrom:WorkPackageChangeset):Promise {\n const request = copyFrom.pristineResource.$source;\n\n // Ideally we would make an empty request before to get the create schema (cannot use the update schema of the source changeset)\n // to get all the writable attributes and only send those.\n // But as this would require an additional request, we don't.\n return this\n .apiV3Service\n .work_packages\n .form\n .post(request)\n .toPromise()\n .then((form:FormResource) => {\n const changeset = this.fromCreateForm(form);\n\n return changeset;\n });\n }\n\n /**\n * Create a copy resource from other and the new work package form\n * @param form Work Package create form\n */\n private copyFrom(form:FormResource) {\n const wp = this.initializeNewResource(form);\n\n return this.halEditing.edit(wp, form);\n }\n\n public getEmptyForm(projectIdentifier:string|null|undefined):Promise {\n if (!this.form) {\n this.form = this\n .apiV3Service\n .withOptionalProject(projectIdentifier)\n .work_packages\n .form\n .post({})\n .toPromise();\n }\n\n return this.form;\n }\n\n public cancelCreation():void {\n this.halEditing.stopEditing({ href: newWorkPackageHref });\n this.reset();\n }\n\n public changesetUpdates$():Observable {\n return this\n .halEditing\n .state(newWorkPackageHref)\n .values$();\n }\n\n public createOrContinueWorkPackage(projectIdentifier:string|null|undefined, type?:number, defaults?:HalSource):Promise {\n let changePromise = this.continueExistingEdit(type);\n\n if (!changePromise) {\n changePromise = this.createNewWithDefaults(projectIdentifier, defaults);\n }\n\n return changePromise.then((change:WorkPackageChangeset) => {\n this.authorisationService.initModelAuth('work_package', change.pristineResource);\n this.halEditing.updateValue(newWorkPackageHref, change);\n this\n .apiV3Service\n .work_packages\n .cache\n .updateWorkPackage(change.pristineResource, true);\n\n return change;\n });\n }\n\n protected reset():void {\n this\n .apiV3Service\n .work_packages\n .cache\n .clearSome('new');\n\n this\n .attachmentsService\n .clear('new');\n\n this.form = undefined;\n }\n\n protected continueExistingEdit(type?:number):Promise|null {\n const change = this.halEditing.state(newWorkPackageHref).value as WorkPackageChangeset;\n if (change !== undefined) {\n const changeType = change.projectedResource.type;\n\n const hasChanges = !change.isEmpty();\n const typeEmpty = !changeType && !type;\n const typeMatches = type && changeType && idFromLink(changeType.href) === type.toString();\n\n if (hasChanges && (typeEmpty || typeMatches)) {\n return Promise.resolve(change);\n }\n }\n\n return null;\n }\n\n /**\n * Initializes a new work package. The work package is not yet persisted.\n * The properties of the work package are initialized from two sources:\n * * The default values provided\n * * The filter values that might exist in the query space\n *\n * The first can be employed to e.g. provide the type or the parent of the work package.\n * The later can be employed to create a work package that adheres to the filter values.\n *\n * @param projectIdentifier The project the work package is to be created in.\n * @param defaults Values the new work package should possess on creation.\n */\n protected createNewWithDefaults(projectIdentifier:string|null|undefined, defaults?:HalSource):Promise {\n return this\n .withFiltersPayload(projectIdentifier, defaults)\n .then((filterDefaults) => {\n const mergedPayload = _.merge({ _links: {} }, filterDefaults, defaults);\n\n return this.createNewWorkPackage(projectIdentifier, mergedPayload).then((change:WorkPackageChangeset) => {\n if (!change) {\n throw new Error('No new work package was created');\n }\n\n // We need to apply the defaults again (after them being applied in the form requests)\n // here as the initial form requests might have led to some default\n // values not being carried over. This can happen when custom fields not available in one type are filter values.\n this.defaultsFromFilters(change, defaults);\n\n return change;\n });\n });\n }\n\n /**\n * Fetches all values of filters applicable to work as default values (e.g. assignee = 123).\n * If defaults already contain the type, that filter is ignored.\n *\n * The ignoring functionality could be generalized.\n *\n * @param object\n * @param defaults\n */\n private defaultsFromFilters(object:HalSource|WorkPackageChangeset, defaults?:HalSource):void {\n // Not using WorkPackageViewFiltersService here as the embedded table does not load the form\n // which will result in that service having empty current filters.\n const query = this.querySpace.query.value;\n\n if (query) {\n const except:string[] = defaults?._links ? Object.keys(defaults._links) : [];\n\n new WorkPackageFilterValues(this.injector, query.filters, except)\n .applyDefaultsFromFilters(object);\n }\n }\n\n /**\n * Returns valid payload based on the filters active in the query space validated by the backend via a form\n * request. In case no filters are active, the (empty) filters payload is just passed through.\n *\n * If there are filters applied, we need the additional form request to turn the defaults of the filters into\n * a valid payload in the sense that all properties are at their correct place and are in the right format. That means\n * HalResources are in the _links section and follow the { href: some_link } format while simple properties stay on the\n * top level.\n */\n private withFiltersPayload(projectIdentifier:string|null|undefined, defaults?:HalSource):Promise {\n const fromFilter = { _links: {} };\n this.defaultsFromFilters(fromFilter, defaults);\n\n const filtersApplied = Object.keys(fromFilter).length > 1 || Object.keys(fromFilter._links).length > 0;\n\n if (filtersApplied) {\n return this\n .apiV3Service\n .withOptionalProject(projectIdentifier)\n .work_packages\n .form\n .forTypePayload(defaults || { _links: {} })\n .toPromise()\n .then((form:FormResource) => {\n this.toApiPayload(fromFilter, form.schema);\n return fromFilter;\n });\n }\n return Promise.resolve(fromFilter);\n }\n\n private toApiPayload(payload:HalSource, schema:SchemaResource) {\n const links:string[] = [];\n\n Object.keys(schema.$source).forEach((attribute) => {\n if (!['Integer',\n 'Float',\n 'Date',\n 'DateTime',\n 'Duration',\n 'Formattable',\n 'Boolean',\n 'String',\n 'Text',\n undefined].includes(schema.$source[attribute].type)) {\n links.push(attribute);\n }\n });\n\n links.forEach((attribute) => {\n const value = payload[attribute];\n if (value === undefined) {\n // nothing\n } else if (value instanceof HalResource) {\n payload._links[attribute] = { href: value.$links.self.href };\n } else if (!value) {\n payload._links[attribute] = { href: null };\n } else {\n payload._links[attribute] = value as unknown as HalSourceLink;\n }\n delete payload[attribute];\n });\n }\n\n /**\n * Assign values from the form for a newly created work package resource.\n * @param form\n */\n private initializeNewResource(form:FormResource) {\n const payload = form.payload.$plain();\n\n // maintain the reference to the schema\n payload._links.schema = { href: 'new' };\n\n const wp = this.halResourceService.createHalResourceOfType('WorkPackage', payload);\n\n wp.$source.id = 'new';\n\n // Ensure type is set to identify the resource\n wp._type = 'WorkPackage';\n\n // Since the ID will change upon saving, keep track of the WP\n // with the actual creation date\n wp.__initialized_at = Date.now();\n\n // Set update link to form\n wp.update = wp.$links.update = form.$links.self;\n // Use POST /work_packages for saving link\n wp.updateImmediately = wp.$links.updateImmediately = (payload) => this.apiV3Service.work_packages.post(payload).toPromise();\n\n // We need to provide the schema to the cache so that it is available in the html form to e.g. determine\n // the editability.\n // It would be better if the edit field could simply rely on the changeset if it exists.\n this.schemaCache.update(wp, form.schema);\n\n return wp;\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageCreateComponent } from 'core-app/features/work-packages/components/wp-new/wp-create.component';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\n\n@Component({\n selector: 'wp-new-full-view',\n host: { class: 'work-packages-page--ui-view' },\n templateUrl: './wp-new-full-view.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageNewFullViewComponent extends WorkPackageCreateComponent {\n public successState = this.$state.current.data.successState as string;\n}\n","import { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport const queryColumnTypes = {\n PROPERTY: 'QueryColumn::Property',\n RELATION_OF_TYPE: 'QueryColumn::RelationOfType',\n RELATION_TO_TYPE: 'QueryColumn::RelationToType',\n};\n\nexport function isRelationColumn(column:QueryColumn) {\n const relationTypes = [queryColumnTypes.RELATION_TO_TYPE, queryColumnTypes.RELATION_OF_TYPE];\n return relationTypes.indexOf(column._type) >= 0;\n}\n\n/**\n * A reference to a query column object as returned from the API.\n */\nexport interface QueryColumn extends HalResource {\n id:string;\n name:string;\n custom_field?:any;\n _links?:{\n self:{ href:string, title:string };\n };\n}\n\nexport interface TypeRelationQueryColumn extends QueryColumn {\n type:{ href:string, name:string },\n _links?:{\n self:{ href:string, title:string },\n type:{ href:string, title:string }\n }\n}\n\nexport interface RelationQueryColumn extends QueryColumn {\n relationType:string;\n}\n","import { Injectable } from '@angular/core';\nimport { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';\nimport {\n QueryFilterInstanceSchemaResource,\n\n} from 'core-app/features/hal/resources/query-filter-instance-schema-resource';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\n\n@Injectable()\nexport class QueryFiltersService {\n constructor(protected schemaCache:SchemaCacheService) {\n }\n\n /**\n * Get the matching schema of the filter resource\n * from the schema\n */\n private getFilterSchema(filter:QueryFilterInstanceResource, form:QueryFormResource):QueryFilterInstanceSchemaResource|undefined {\n const available = form.$embedded.schema.filtersSchemas.elements;\n return _.find(available, (schema) => schema.allowedFilterValue.href === filter.filter.href);\n }\n\n /**\n * Prepares the schemas of each filter to be readily placed to make alterations\n * to the filter based on the filter e.g. when sending an updated filter to the backend.\n * @param query\n * @param form\n */\n public mapSchemasIntoFilters(query:QueryResource, form:QueryFormResource) {\n query.filters.forEach((filter) => {\n const schema = this.getFilterSchema(filter, form)!;\n filter.$links.schema = schema.$links.self;\n this.schemaCache.update(filter, schema);\n });\n }\n\n public setSchemas(schemas:CollectionResource) {\n schemas.elements.forEach((schema) => {\n this.schemaCache.updateValue(schema.$links.self.href!, schema);\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { WorkPackagesListChecksumService } from 'core-app/features/work-packages/components/wp-list/wp-list-checksum.service';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { TransitionService } from '@uirouter/core';\nimport { Subject } from 'rxjs';\n\n@Injectable()\nexport class QueryParamListenerService {\n readonly wpListChecksumService:WorkPackagesListChecksumService = this.injector.get(WorkPackagesListChecksumService);\n\n readonly wpListService:WorkPackagesListService = this.injector.get(WorkPackagesListService);\n\n readonly $transitions:TransitionService = this.injector.get(TransitionService);\n\n public observe$ = new Subject();\n\n public queryChangeListener:Function;\n\n constructor(readonly injector:Injector) {\n this.listenForQueryParamsChanged();\n }\n\n public listenForQueryParamsChanged():any {\n // Listen for param changes\n return this.queryChangeListener = this.$transitions.onSuccess({}, (transition):any => {\n const options = transition.options();\n const params = transition.params('to');\n\n const newChecksum = this.wpListService.getCurrentQueryProps(params);\n const newId:string = params.query_id ? params.query_id.toString() : null;\n\n // Avoid performing any changes when we're going to reload\n if (options.reload || (options.custom && options.custom.notify === false)) {\n return true;\n }\n\n return this.wpListChecksumService\n .executeIfOutdated(newId,\n newChecksum,\n () => {\n this.observe$.next(newChecksum);\n });\n });\n }\n\n public removeQueryChangeListener() {\n this.queryChangeListener();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { QuerySortByResource } from 'core-app/features/hal/resources/query-sort-by-resource';\nimport { HalLink } from 'core-app/features/hal/hal-link/hal-link';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport isPersistedResource from 'core-app/features/hal/helpers/is-persisted-resource';\nimport { Injectable } from '@angular/core';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport {\n ApiV3Filter,\n ApiV3FilterBuilder,\n FilterOperator,\n} from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { PaginationService } from 'core-app/shared/components/table-pagination/pagination-service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { QueryFilterResource } from 'core-app/features/hal/resources/query-filter-resource';\n\nexport interface QueryPropsFilter {\n n:string;\n o:string\n v:unknown[];\n}\n\nexport interface QueryProps {\n // Columns\n c:string[];\n // Sums enabled?\n s?:boolean;\n // Sort by criteria\n t?:string;\n // Group by criteria\n g:string|null;\n // Filters\n f:QueryPropsFilter[];\n // Hierarchies\n hi:boolean;\n // Highlighting mode\n hl?:string;\n // Highlighted attributes\n hla?:string[];\n // Display representation\n dr?:string;\n // Include subprojects\n is?:boolean;\n // Pagination\n pa?:string|number;\n pp?:string|number;\n\n // Timeline options\n tv?:boolean;\n tzl?:string;\n tll?:string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class UrlParamsHelperService {\n public constructor(public paginationService:PaginationService) {\n }\n\n // copied more or less from angular buildUrl\n public buildQueryString(params:any) {\n if (!params) {\n return undefined;\n }\n\n const parts:string[] = [];\n _.each(params, (value, key) => {\n if (!value) {\n return;\n }\n if (!Array.isArray(value)) {\n value = [value];\n }\n\n _.each(value, (v) => {\n if (v !== null && typeof v === 'object') {\n v = JSON.stringify(v);\n }\n parts.push(`${encodeURIComponent(key)}=${\n encodeURIComponent(v)}`);\n });\n });\n\n return parts.join('&');\n }\n\n public encodeQueryJsonParams(\n query:QueryResource,\n extender?:Partial|((paramsData:QueryProps) => QueryProps),\n ):string {\n const paramsData:QueryProps = {\n c: query.columns.map((column) => column.id),\n hi: !!query.showHierarchies,\n g: _.get(query.groupBy, 'id', ''),\n dr: query.displayRepresentation,\n is: query.includeSubprojects,\n ...this.encodeSums(query),\n ...this.encodeTimelineVisible(query),\n ...this.encodeHighlightingMode(query),\n ...this.encodeHighlightedAttributes(query),\n ...this.encodeSortBy(query),\n ...this.encodeFilters(query.filters),\n };\n\n if (typeof extender === 'function') {\n return JSON.stringify(extender(paramsData));\n }\n\n if (typeof extender === 'object') {\n return JSON.stringify(_.merge(paramsData, extender));\n }\n\n return JSON.stringify(paramsData);\n }\n\n private encodeSums(query:QueryResource):Partial {\n if (query.sums) {\n return { s: query.sums };\n }\n\n return {};\n }\n\n private encodeHighlightingMode(query:QueryResource):Partial {\n if (query.highlightingMode && (isPersistedResource(query) || query.highlightingMode !== 'inline')) {\n return { hl: query.highlightingMode };\n }\n\n return {};\n }\n\n private encodeHighlightedAttributes(query:QueryResource):Partial {\n if (query.highlightingMode === 'inline') {\n if (Array.isArray(query.highlightedAttributes) && query.highlightedAttributes.length > 0) {\n return { hla: query.highlightedAttributes.map((el) => el.id as string) };\n }\n }\n\n return {};\n }\n\n private encodeSortBy(query:QueryResource):Partial {\n if (query.sortBy) {\n return {\n t: query\n .sortBy\n .map((sort:QuerySortByResource) => (sort.id as string).replace('-', ':'))\n .join(),\n };\n }\n\n return {};\n }\n\n public encodeFilters(filters:QueryFilterInstanceResource[]):Pick {\n if (filters && filters.length > 0) {\n const filterProps:QueryPropsFilter[] = filters.map((filter) => ({\n n: filter.id,\n o: filter.operator.id,\n v: filter.values.map((value:HalResource|string) => this.queryFilterValueToParam(value)),\n }));\n\n return { f: filterProps };\n }\n\n return { f: [] };\n }\n\n private encodeTimelineVisible(query:QueryResource):Partial {\n const paramsData:Partial = {};\n\n if (query.timelineVisible) {\n paramsData.tv = query.timelineVisible;\n\n if (!_.isEmpty(query.timelineLabels)) {\n paramsData.tll = JSON.stringify(query.timelineLabels);\n }\n\n paramsData.tzl = query.timelineZoomLevel;\n } else {\n paramsData.tv = false;\n }\n\n return paramsData;\n }\n\n public buildV3GetQueryFromJsonParams(updateJson:string|null) {\n const queryData:any = {\n pageSize: this.paginationService.getPerPage(),\n };\n\n if (!updateJson) {\n return queryData;\n }\n\n const properties = JSON.parse(updateJson) as QueryProps;\n\n if (properties.c) {\n queryData['columns[]'] = properties.c.map((column:any) => column);\n }\n if (properties.s) {\n queryData.showSums = properties.s;\n }\n\n queryData.timelineVisible = properties.tv;\n\n if (properties.tv) {\n if (properties.tll) {\n queryData.timelineLabels = properties.tll;\n }\n\n if (properties.tzl) {\n queryData.timelineZoomLevel = properties.tzl;\n }\n }\n\n if (properties.dr) {\n queryData.displayRepresentation = properties.dr;\n }\n\n if (properties.is !== undefined) {\n queryData.includeSubprojects = properties.is;\n }\n\n if (properties.hl) {\n queryData.highlightingMode = properties.hl;\n }\n\n if (properties.hla) {\n queryData['highlightedAttributes[]'] = properties.hla.map((column:any) => column);\n }\n\n if (properties.hi !== undefined) {\n queryData.showHierarchies = properties.hi;\n }\n\n queryData.groupBy = _.get(properties, 'g', '');\n\n // Filters\n if (properties.f) {\n const filters = properties.f.map((urlFilter:any) => {\n const attributes = {\n operator: decodeURIComponent(urlFilter.o),\n };\n if (urlFilter.v) {\n // the array check is only there for backwards compatibility reasons.\n // Nowadays, it will always be an array;\n const vs = Array.isArray(urlFilter.v) ? urlFilter.v : [urlFilter.v];\n _.extend(attributes, { values: vs });\n }\n const filterData:any = {};\n filterData[urlFilter.n] = attributes;\n\n return filterData;\n });\n\n queryData.filters = JSON.stringify(filters);\n }\n\n // Sortation\n if (properties.t) {\n queryData.sortBy = JSON.stringify(properties.t.split(',').map((sort:any) => sort.split(':')));\n }\n\n // Pagination\n if (properties.pa) {\n queryData.offset = properties.pa;\n }\n if (properties.pp) {\n queryData.pageSize = properties.pp;\n }\n\n return queryData;\n }\n\n public buildV3GetQueryFromQueryResource(query:QueryResource, additionalParams:any = {}, contextual:any = {}) {\n const queryData:any = {};\n\n queryData['columns[]'] = this.buildV3GetColumnsFromQueryResource(query);\n queryData.showSums = query.sums;\n queryData.timelineVisible = !!query.timelineVisible;\n\n if (query.timelineVisible) {\n queryData.timelineZoomLevel = query.timelineZoomLevel;\n queryData.timelineLabels = JSON.stringify(query.timelineLabels);\n }\n\n if (query.highlightingMode) {\n queryData.highlightingMode = query.highlightingMode;\n }\n\n if (query.highlightedAttributes && query.highlightingMode === 'inline') {\n queryData['highlightedAttributes[]'] = query.highlightedAttributes.map((el) => el.href);\n }\n\n if (query.displayRepresentation) {\n queryData.displayRepresentation = query.displayRepresentation;\n }\n\n queryData.includeSubprojects = !!query.includeSubprojects;\n queryData.showHierarchies = !!query.showHierarchies;\n queryData.groupBy = _.get(query.groupBy, 'id', '');\n\n // Filters\n queryData.filters = this.buildV3GetFiltersAsJson(query.filters, contextual);\n\n // Sortation\n queryData.sortBy = this.buildV3GetSortByFromQuery(query);\n\n return _.extend(additionalParams, queryData);\n }\n\n public queryFilterValueToParam(value:HalResource|string|boolean):string {\n if (typeof (value) === 'boolean') {\n return value ? 't' : 'f';\n }\n\n if (!value) {\n return '';\n }\n\n const halValue = value as HalResource;\n if (halValue.id) {\n return halValue.id.toString();\n }\n if (halValue.href) {\n return halValue.href.split('/').pop() as string;\n }\n\n return value.toString();\n }\n\n private buildV3GetColumnsFromQueryResource(query:QueryResource) {\n if (query.columns) {\n return query.columns.map((column:any) => column.id || idFromLink(column.href));\n }\n if (query._links.columns) {\n return query._links.columns.map((column:HalLink) => {\n const id = column.href!;\n\n return this.idFromHref(id);\n });\n }\n }\n\n public buildV3GetFilters(filters:QueryFilterInstanceResource[], replacements = {}):ApiV3Filter[] {\n const newFilters = filters.map((filter:QueryFilterInstanceResource) => {\n const id = this.buildV3GetFilterIdFromFilter(filter);\n const operator = this.buildV3GetOperatorIdFromFilter(filter);\n const values = this.buildV3GetValuesFromFilter(filter).map((value) => {\n _.each(replacements, (val:string, key:string) => {\n value = value.replace(`{${key}}`, val);\n });\n\n return value;\n });\n\n const filterHash:ApiV3Filter = {};\n filterHash[id] = { operator: operator as FilterOperator, values };\n\n return filterHash;\n });\n\n return newFilters;\n }\n\n public filterBuilderFrom(filters:QueryFilterInstanceResource[]) {\n const builder:ApiV3FilterBuilder = new ApiV3FilterBuilder();\n\n filters.forEach((filter:QueryFilterInstanceResource) => {\n const id = this.buildV3GetFilterIdFromFilter(filter);\n const operator = this.buildV3GetOperatorIdFromFilter(filter) as FilterOperator;\n const values = this.buildV3GetValuesFromFilter(filter)\n\n builder.add(id, operator, values);\n });\n\n return builder;\n }\n\n public buildV3GetFiltersAsJson(filter:QueryFilterInstanceResource[], contextual = {}) {\n return JSON.stringify(this.buildV3GetFilters(filter, contextual));\n }\n\n public buildV3GetFilterIdFromFilter(filter:QueryFilterInstanceResource) {\n const href = filter.filter ? filter.filter.href : filter._links.filter.href;\n\n return this.idFromHref(href);\n }\n\n public buildV3GetValuesFromFilter(filter:QueryFilterInstanceResource|QueryFilterResource) {\n if (filter.values) {\n return _.map(filter.values, (v:any) => this.queryFilterValueToParam(v));\n }\n return _.map(filter._links.values, (v:any) => this.idFromHref(v.href));\n }\n\n private buildV3GetOperatorIdFromFilter(filter:QueryFilterInstanceResource) {\n if (filter.operator) {\n return filter.operator.id || idFromLink(filter.operator.href);\n }\n const { href } = filter._links.operator;\n\n return this.idFromHref(href);\n }\n\n private buildV3GetSortByFromQuery(query:QueryResource) {\n const sortBys = query.sortBy ? query.sortBy : query._links.sortBy;\n const sortByIds = sortBys.map((sort:QuerySortByResource) => {\n if (sort.id) {\n return sort.id;\n }\n const href = sort.href!;\n\n const id = this.idFromHref(href);\n\n return id;\n });\n\n return JSON.stringify(sortByIds.map((id:string) => id.split('-')));\n }\n\n private idFromHref(href:string) {\n const id = href.substring(href.lastIndexOf('/') + 1, href.length);\n\n return decodeURIComponent(id);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageRelationsHierarchyService } from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { WpRelationInlineCreateServiceInterface } from 'core-app/features/work-packages/components/wp-relations/embedded/wp-relation-inline-create.service.interface';\nimport { WpRelationInlineAddExistingComponent } from 'core-app/features/work-packages/components/wp-relations/embedded/inline/add-existing/wp-relation-inline-add-existing.component';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport {\n Observable,\n of,\n} from 'rxjs';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Injectable()\nexport class WpChildrenInlineCreateService extends WorkPackageInlineCreateService implements WpRelationInlineCreateServiceInterface {\n constructor(readonly injector:Injector,\n protected readonly wpRelationsHierarchyService:WorkPackageRelationsHierarchyService,\n protected readonly schemaCache:SchemaCacheService) {\n super(injector);\n }\n\n /**\n * A separate reference pane for the inline create component\n */\n public readonly referenceComponentClass = WpRelationInlineAddExistingComponent;\n\n /**\n * Define the reference type\n */\n public relationType = 'children';\n\n /**\n * Add a new relation of the above type\n */\n public add(from:WorkPackageResource, toId:string):Promise {\n return this.wpRelationsHierarchyService.addExistingChildWp(from, toId);\n }\n\n /**\n * Remove a given relation\n */\n public remove(from:WorkPackageResource, to:WorkPackageResource):Promise {\n return this.wpRelationsHierarchyService.removeChild(to);\n }\n\n /**\n * A related work package for the inline create context\n */\n public referenceTarget:WorkPackageResource|null = null;\n\n public get canAdd():Observable {\n if (!(this.referenceTarget && this.canAddChild)) {\n return of(false);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return this.canCreateWorkPackages(idFromLink(this.referenceTarget.project.href));\n }\n\n public get canReference():Observable {\n return of(!!this.referenceTarget && this.canAddChild);\n }\n\n public get canAddChild():boolean {\n return !!(this.schema && !this.schema.isMilestone && this.referenceTarget?.changeParent);\n }\n\n /**\n * Reference button text\n */\n public readonly buttonTexts = {\n reference: this.I18n.t('js.relation_buttons.add_existing_child'),\n create: this.I18n.t('js.relation_buttons.add_new_child'),\n };\n\n private get schema() {\n return this.referenceTarget && this.schemaCache.of(this.referenceTarget);\n }\n}\n","\n
\n
\n

\n
\n
\n\n \n \n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, Input, OnInit } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { WorkPackageRelationsHierarchyService } from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service';\nimport { OpUnlinkTableAction } from 'core-app/features/work-packages/components/wp-table/table-actions/actions/unlink-table-action';\nimport { OpTableActionFactory } from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { WorkPackageRelationQueryBase } from 'core-app/features/work-packages/components/wp-relations/embedded/wp-relation-query.base';\nimport { WpChildrenInlineCreateService } from 'core-app/features/work-packages/components/wp-relations/embedded/children/wp-children-inline-create.service';\nimport { filter } from 'rxjs/operators';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { GroupDescriptor } from 'core-app/features/work-packages/components/wp-single-view/wp-single-view.component';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Component({\n selector: 'wp-children-query',\n templateUrl: '../wp-relation-query.html',\n providers: [\n { provide: WorkPackageInlineCreateService, useClass: WpChildrenInlineCreateService },\n ],\n})\nexport class WorkPackageChildrenQueryComponent extends WorkPackageRelationQueryBase implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public query:QueryResource;\n\n /** An optional group descriptor if we're rendering on the single view */\n @Input() public group?:GroupDescriptor;\n\n @Input() public addExistingChildEnabled = false;\n\n public idFromLink = idFromLink;\n\n public tableActions:OpTableActionFactory[] = [\n OpUnlinkTableAction.factoryFor(\n 'remove-child-action',\n this.I18n.t('js.relation_buttons.remove_child'),\n (child:WorkPackageResource) => {\n if (this.embeddedTable) {\n this.embeddedTable.loadingIndicator = this.wpRelationsHierarchyService.removeChild(child);\n }\n },\n (child:WorkPackageResource) => !!child.changeParent,\n ),\n ];\n\n constructor(protected wpRelationsHierarchyService:WorkPackageRelationsHierarchyService,\n protected PathHelper:PathHelperService,\n protected wpInlineCreate:WorkPackageInlineCreateService,\n protected halEvents:HalEventsService,\n protected apiV3Service:ApiV3Service,\n protected queryUrlParamsHelper:UrlParamsHelperService,\n readonly I18n:I18nService) {\n super(queryUrlParamsHelper);\n }\n\n ngOnInit() {\n // Set reference target and reference class\n this.wpInlineCreate.referenceTarget = this.workPackage;\n\n // Set up the query props\n this.queryProps = this.buildQueryProps();\n\n // Fire event that children were added\n this.wpInlineCreate.newInlineWorkPackageCreated\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((toId:string) => {\n this.halEvents.push(this.workPackage, {\n eventType: 'association',\n relatedWorkPackage: toId,\n relationType: 'child',\n });\n });\n\n // Refresh table when work package is refreshed\n this\n .apiV3Service\n .work_packages\n .id(this.workPackage)\n .observe()\n .pipe(\n filter(() => !!this.embeddedTable?.isInitialized),\n this.untilDestroyed(),\n )\n .subscribe(() => this.refreshTable());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, Inject } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { WorkPackageInlineCreateComponent } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.component';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { WpRelationInlineCreateServiceInterface } from 'core-app/features/work-packages/components/wp-relations/embedded/wp-relation-inline-create.service.interface';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3Filter } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\n\n@Component({\n templateUrl: './wp-relation-inline-add-existing.component.html',\n})\nexport class WpRelationInlineAddExistingComponent {\n public selectedWpId:string;\n\n public isDisabled = false;\n\n public queryFilters = this.buildQueryFilters();\n\n public text = {\n abort: this.I18n.t('js.relation_buttons.abort'),\n };\n\n constructor(protected readonly parent:WorkPackageInlineCreateComponent,\n @Inject(WorkPackageInlineCreateService) protected readonly wpInlineCreate:WpRelationInlineCreateServiceInterface,\n protected apiV3Service:ApiV3Service,\n protected wpRelations:WorkPackageRelationsService,\n protected notificationService:WorkPackageNotificationService,\n protected halEvents:HalEventsService,\n protected urlParamsHelper:UrlParamsHelperService,\n protected querySpace:IsolatedQuerySpace,\n protected readonly I18n:I18nService) {\n }\n\n public addExisting() {\n if (_.isNil(this.selectedWpId)) {\n return;\n }\n\n const newRelationId = this.selectedWpId;\n this.isDisabled = true;\n\n this.wpInlineCreate.add(this.workPackage, newRelationId)\n .then(() => {\n this\n .apiV3Service\n .work_packages\n .id(this.workPackage)\n .refresh();\n\n this.halEvents.push(this.workPackage, {\n eventType: 'association',\n relatedWorkPackage: newRelationId,\n relationType: this.relationType,\n });\n\n this.isDisabled = false;\n this.wpInlineCreate.newInlineWorkPackageReferenced.next(newRelationId);\n this.cancel();\n })\n .catch((err:any) => {\n this.notificationService.handleRawError(err, this.workPackage);\n this.isDisabled = false;\n this.cancel();\n });\n }\n\n public onSelected(workPackage?:WorkPackageResource) {\n if (workPackage) {\n this.selectedWpId = workPackage.id!;\n this.addExisting();\n }\n }\n\n public get relationType() {\n return this.wpInlineCreate.relationType;\n }\n\n public get workPackage() {\n return this.wpInlineCreate.referenceTarget!;\n }\n\n public cancel() {\n this.parent.resetRow();\n }\n\n private buildQueryFilters():ApiV3Filter[] {\n const query = this.querySpace.query.value;\n\n if (!query) {\n return [];\n }\n\n const relationTypes = RelationResource.RELATION_TYPES(true);\n const filters = query.filters.filter((filter) => {\n const id = this.urlParamsHelper.buildV3GetFilterIdFromFilter(filter);\n return relationTypes.indexOf(id) === -1;\n });\n\n return this.urlParamsHelper.buildV3GetFilters(filters);\n }\n}\n","
\n
\n
\n \n \n
\n
\n \n \n \n
\n
\n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector, OnDestroy } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { WpRelationInlineAddExistingComponent } from 'core-app/features/work-packages/components/wp-relations/embedded/inline/add-existing/wp-relation-inline-add-existing.component';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { WpRelationInlineCreateServiceInterface } from 'core-app/features/work-packages/components/wp-relations/embedded/wp-relation-inline-create.service.interface';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport {\n Observable,\n of,\n} from 'rxjs';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Injectable()\nexport class WpRelationInlineCreateService extends WorkPackageInlineCreateService implements WpRelationInlineCreateServiceInterface, OnDestroy {\n @InjectField() wpRelations:WorkPackageRelationsService;\n\n constructor(public injector:Injector) {\n super(injector);\n }\n\n /**\n * A separate reference pane for the inline create component\n */\n public readonly referenceComponentClass = WpRelationInlineAddExistingComponent;\n\n /**\n * Defines the relation type for the relations inline create\n */\n public relationType = '';\n\n /**\n * Add a new relation of the above type\n */\n public add(from:WorkPackageResource, toId:string):Promise {\n return this.wpRelations.addCommonRelation(toId, this.relationType, from.id!);\n }\n\n /**\n * Remove a given relation\n */\n public remove(from:WorkPackageResource, to:WorkPackageResource):Promise {\n // Find the relation matching relationType and from->to which are unique together\n const relation = this.wpRelations.find(to, from, this.relationType);\n\n if (relation !== undefined) {\n return this.wpRelations.removeRelation(relation);\n }\n return Promise.reject();\n }\n\n /**\n * A related work package for the inline create context\n */\n public referenceTarget:WorkPackageResource|null = null;\n\n public get canAdd():Observable {\n if (!this.referenceTarget?.addRelation) {\n return of(false);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return this.canCreateWorkPackages(idFromLink(this.referenceTarget.project.href));\n }\n\n public get canReference():Observable {\n return this.canAdd;\n }\n\n /**\n * Reference button text\n */\n public readonly buttonTexts = {\n reference: this.I18n.t('js.relation_buttons.add_existing'),\n create: this.I18n.t('js.relation_buttons.create_new'),\n };\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Directive, ViewChild } from '@angular/core';\nimport { WorkPackageEmbeddedTableComponent } from 'core-app/features/work-packages/components/wp-table/embedded/wp-embedded-table.component';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\n@Directive()\nexport abstract class WorkPackageRelationQueryBase extends UntilDestroyedMixin {\n public workPackage:WorkPackageResource;\n\n /** Input is either a query resource, or directly query props */\n public query:QueryResource|Object;\n\n /** Query props are derived from the query resource, if any */\n public queryProps:Object;\n\n /** Whether this section should be hidden completely (due to missing permissions e.g.) */\n public hidden = false;\n\n /** Reference to the embedded table instance */\n @ViewChild('embeddedTable') protected embeddedTable?:WorkPackageEmbeddedTableComponent;\n\n constructor(protected queryUrlParamsHelper:UrlParamsHelperService) {\n super();\n }\n\n /**\n * Request to refresh the results of the embedded table\n */\n public refreshTable() {\n this.embeddedTable?.isInitialized && this.embeddedTable.loadQuery(true, false);\n }\n\n /**\n * Special handling for query loading when a project filter is involved.\n *\n * Ensure that at least one project was visible to the user or otherwise,\n * hide the creation from them.\n * cf. OP#30106\n * @param query\n */\n public handleQueryLoaded(loaded:QueryResource) {\n // We only handle loaded queries\n if (!(this.query instanceof QueryResource)) {\n return;\n }\n\n const filtersLength = this.projectValuesCount(this.query);\n const loadedFiltersLength = this.projectValuesCount(loaded);\n\n // Does the default have a project filter, but the other does not?\n if (filtersLength !== null && loadedFiltersLength === null) {\n this.hidden = true;\n }\n\n // Has a project filter been reduced to zero elements?\n if (filtersLength && loadedFiltersLength && filtersLength > 0 && loadedFiltersLength === 0) {\n this.hidden = true;\n }\n }\n\n /**\n * Get the filters of the query props\n */\n protected projectValuesCount(query:QueryResource):number|null {\n const project = query.filters.find((f) => f.id === 'project');\n return project ? project.values.length : null;\n }\n\n /**\n * Set up the query props from input\n */\n protected buildQueryProps() {\n if (this.query instanceof QueryResource) {\n return this.queryUrlParamsHelper.buildV3GetQueryFromQueryResource(\n this.query,\n { valid_subset: true },\n { id: this.workPackage.id! },\n );\n }\n return this.query;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectorRef,\n Component,\n EventEmitter, HostListener,\n Input, NgZone,\n Output,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { from, Observable, of } from 'rxjs';\nimport { catchError, map, tap } from 'rxjs/operators';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { ApiV3Filter } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { OpAutocompleterComponent } from 'core-app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\n@Component({\n selector: 'wp-relations-autocomplete',\n templateUrl: './wp-relations-autocomplete.html',\n\n // Allow styling the embedded ng-select\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['./wp-relations-autocomplete.sass'],\n})\nexport class WorkPackageRelationsAutocompleteComponent {\n readonly text = {\n placeholder: this.I18n.t('js.relations_autocomplete.placeholder'),\n };\n\n @Input() inputPlaceholder:string = this.text.placeholder;\n\n @Input() workPackage:WorkPackageResource;\n\n @Input() selectedRelationType:string;\n\n @Input() filterCandidatesFor:string;\n\n /** Do we take the current query filters into account? */\n @Input() additionalFilters:ApiV3Filter[] = [];\n\n @Input() hiddenOverflowContainer = 'body';\n\n @ViewChild(OpAutocompleterComponent, { static: true }) public ngSelectComponent:OpAutocompleterComponent;\n\n @Output() onCancel = new EventEmitter();\n\n @Output() onSelected = new EventEmitter();\n\n @Output() onEmptySelected = new EventEmitter();\n\n getAutocompleterData = (query:string|null):Observable => {\n // Return when the search string is empty\n if (query === null || query.length === 0) {\n return of([]);\n }\n\n return from(\n this.workPackage.availableRelationCandidates.$link.$fetch({\n query,\n filters: JSON.stringify(this.additionalFilters),\n type: this.filterCandidatesFor || this.selectedRelationType,\n sortBy: JSON.stringify([['typeahead', 'asc']]),\n }) as Promise,\n )\n .pipe(\n map((collection) => collection.elements),\n catchError((error:unknown) => {\n this.notificationService.handleRawError(error);\n return of([]);\n }),\n );\n };\n\n public autocompleterOptions = {\n resource: 'work_packages',\n getOptionsFn: this.getAutocompleterData,\n };\n\n public appendToContainer = 'body';\n\n constructor(private readonly querySpace:IsolatedQuerySpace,\n private readonly pathHelper:PathHelperService,\n private readonly notificationService:WorkPackageNotificationService,\n private readonly CurrentProject:CurrentProjectService,\n private readonly halResourceService:HalResourceService,\n private readonly schemaCacheService:SchemaCacheService,\n private readonly cdRef:ChangeDetectorRef,\n private readonly ngZone:NgZone,\n private readonly I18n:I18nService) {\n }\n\n @HostListener('keydown.escape')\n public reset() {\n this.cancel();\n }\n\n cancel() {\n this.onCancel.emit();\n }\n\n public onWorkPackageSelected(workPackage?:WorkPackageResource) {\n if (workPackage) {\n this.schemaCacheService\n .ensureLoaded(workPackage)\n .then(() => {\n this.onSelected.emit(workPackage);\n this.ngSelectComponent.ngSelectInstance.close();\n });\n }\n }\n\n onOpen() {\n // Force reposition as a workaround for BUG\n // https://github.com/ng-select/ng-select/issues/1259\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n this.ngSelectComponent.repositionDropdown();\n jQuery(this.hiddenOverflowContainer).one('scroll', () => {\n this.ngSelectComponent.closeSelect();\n });\n }, 25);\n });\n }\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { StateService } from '@uirouter/core';\nimport { Injectable } from '@angular/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\n\n@Injectable()\nexport class WorkPackageRelationsHierarchyService {\n constructor(protected $state:StateService,\n protected states:States,\n protected halEvents:HalEventsService,\n protected notificationService:WorkPackageNotificationService,\n protected pathHelper:PathHelperService,\n protected apiV3Service:ApiV3Service) {\n\n }\n\n public changeParent(workPackage:WorkPackageResource, parentId:string|null) {\n const payload:any = {\n lockVersion: workPackage.lockVersion,\n };\n\n if (parentId) {\n payload._links = {\n parent: {\n href: this.apiV3Service.work_packages.id(parentId).path,\n },\n };\n } else {\n payload._links = {\n parent: {\n href: null,\n },\n };\n }\n\n return workPackage\n .changeParent(payload)\n .then((wp:WorkPackageResource) => {\n this\n .apiV3Service\n .work_packages\n .cache\n .updateWorkPackage(wp);\n this.notificationService.showSave(wp);\n this.halEvents.push(workPackage, {\n eventType: 'association',\n relatedWorkPackage: parentId,\n relationType: 'parent',\n });\n\n return wp;\n })\n .catch((error) => {\n this.notificationService.handleRawError(error, workPackage);\n return Promise.reject(error);\n });\n }\n\n public removeParent(workPackage:WorkPackageResource) {\n return this.changeParent(workPackage, null);\n }\n\n public addExistingChildWp(workPackage:WorkPackageResource, childWpId:string):Promise {\n return this\n .apiV3Service\n .work_packages\n .id(childWpId)\n .get()\n .toPromise()\n .then((wpToBecomeChild:WorkPackageResource|undefined) => this.changeParent(wpToBecomeChild!, workPackage.id)\n .then((wp) => {\n // Reload work package\n this\n .apiV3Service\n .work_packages\n .id(workPackage)\n .refresh();\n\n this.halEvents.push(workPackage, {\n eventType: 'association',\n relatedWorkPackage: wpToBecomeChild!.id!,\n relationType: 'child',\n });\n\n return wp;\n }));\n }\n\n public addNewChildWp(baseRoute:string, workPackage:WorkPackageResource) {\n workPackage.project.$load()\n .then(() => {\n const args = [\n `${baseRoute}.new`,\n {\n parent_id: workPackage.id,\n },\n ];\n\n if (this.$state.includes('work-packages.show')) {\n args[0] = 'work-packages.new';\n }\n\n ( this.$state).go(...args);\n });\n }\n\n public removeChild(childWorkPackage:WorkPackageResource) {\n return childWorkPackage.$load().then(() => {\n const parentWorkPackage = childWorkPackage.parent;\n return childWorkPackage.changeParent({\n _links: {\n parent: {\n href: null,\n },\n },\n lockVersion: childWorkPackage.lockVersion,\n }).then((wp) => {\n if (parentWorkPackage) {\n this\n .apiV3Service\n .work_packages\n .id(parentWorkPackage)\n .refresh()\n .then((wp) => {\n this.halEvents.push(wp, {\n eventType: 'association',\n relatedWorkPackage: null,\n relationType: 'child',\n });\n });\n }\n\n this\n .apiV3Service\n .work_packages\n .cache\n .updateWorkPackage(wp);\n })\n .catch((error) => {\n this.notificationService.handleRawError(error, childWorkPackage);\n return Promise.reject(error);\n });\n });\n }\n}\n","import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { multiInput, MultiInputState, StatesGroup } from 'reactivestates';\nimport { Injectable } from '@angular/core';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { Observable } from 'rxjs';\nimport { map, take } from 'rxjs/operators';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\n\nexport type RelationsStateValue = { [relationId:string]:RelationResource };\n\nexport class RelationStateGroup extends StatesGroup {\n name = 'WP-Relations';\n\n relations:MultiInputState = multiInput();\n\n constructor() {\n super();\n this.initializeMembers();\n }\n}\n\n@Injectable()\nexport class WorkPackageRelationsService extends StateCacheService {\n constructor(private PathHelper:PathHelperService,\n private apiV3Service:ApiV3Service,\n private halResource:HalResourceService) {\n super(new RelationStateGroup().relations);\n }\n\n /**\n * Require the value to be loaded either when forced or the value is stale\n * according to the cache interval specified for this service.\n *\n * Returns a single promise to one loaded value\n *\n * @param id The state to require\n * @param force Load the value anyway.\n */\n public require(id:string, force = false):Promise {\n return this\n .requireAndStream(id, force)\n .pipe(\n take(1),\n )\n .toPromise();\n }\n\n /**\n * Require the value to be loaded either when forced or the value is stale\n * according to the cache interval specified for this service.\n *\n * Returns an observable to the values stream of the state.\n *\n * @param id The state to require\n * @param force Load the value anyway.\n */\n public requireAndStream(id:string, force = false):Observable {\n // Refresh when stale or being forced\n if (this.stale(id) || force) {\n this.clearAndLoad(\n id,\n this.load(id),\n );\n }\n\n return this.state(id).values$();\n }\n\n /**\n * Load a set of work package ids into the states, regardless of them being loaded\n * @param workPackageIds\n */\n protected load(id:string):Observable {\n return this\n .apiV3Service\n .work_packages\n .id(id)\n .relations\n .get()\n .pipe(\n map((collection) => this.relationsStateValue(id, collection.elements)),\n );\n }\n\n public requireAll(ids:string[]):Promise {\n return new Promise((resolve, reject) => {\n this\n .apiV3Service\n .relations\n .loadInvolved(ids)\n .toPromise()\n .then((elements:RelationResource[]) => {\n this.clearSome(...ids);\n this.accumulateRelationsFromInvolved(ids, elements);\n resolve(undefined);\n })\n .catch(reject);\n });\n }\n\n /**\n * Find a given relation by from, to and relation Type\n */\n public find(from:WorkPackageResource, to:WorkPackageResource, type:string):RelationResource|undefined {\n const relations:RelationsStateValue|undefined = this.state(from.id!).value;\n\n if (!relations) {\n return;\n }\n\n return _.find(relations, (relation:RelationResource) => {\n const denormalized = relation.denormalized(from);\n // Check that\n // 1. the denormalized relation points at \"to\"\n // 2. that the denormalized relation type matches.\n return denormalized.target.id === to.id\n && denormalized.relationType === type;\n });\n }\n\n /**\n * Remove the given relation.\n */\n public removeRelation(relation:RelationResource) {\n return relation.delete().then(() => {\n this.removeFromStates(relation);\n });\n }\n\n /**\n * Update the given relation type, setting new values for from and to\n */\n public updateRelationType(from:WorkPackageResource, to:WorkPackageResource, relation:RelationResource, type:string) {\n const params = {\n _links: {\n from: { href: from.href },\n to: { href: to.href },\n },\n type,\n };\n\n return this.updateRelation(relation, params);\n }\n\n public updateRelation(relation:RelationResource, params:{ [key:string]:any }) {\n return relation.updateImmediately(params)\n .then((savedRelation:RelationResource) => {\n this.insertIntoStates(savedRelation);\n return savedRelation;\n });\n }\n\n public addCommonRelation(fromId:string,\n relationType:string,\n relatedWpId:string) {\n const params = {\n _links: {\n from: { href: this.apiV3Service.work_packages.id(fromId).toString() },\n to: { href: this.apiV3Service.work_packages.id(relatedWpId).toString() },\n },\n type: relationType,\n };\n\n const path = this.apiV3Service.work_packages.id(fromId).relations.toString();\n return this.halResource\n .post(path, params)\n .toPromise()\n .then((relation:RelationResource) => {\n this.insertIntoStates(relation);\n return relation;\n });\n }\n\n /**\n * Merges a single relation\n * @param relation\n */\n private insertIntoStates(relation:RelationResource) {\n _.values(relation.ids).forEach((wpId) => {\n this.multiState.get(wpId).doModify((value:RelationsStateValue) => {\n value[relation.id!] = relation;\n return value;\n }, () => {\n const value:RelationsStateValue = {};\n value[relation.id!] = relation;\n return value;\n });\n });\n }\n\n /**\n * Remove the given relation from the from/to states\n * @param relation\n */\n private removeFromStates(relation:RelationResource) {\n _.values(relation.ids).forEach((wpId) => {\n this.multiState.get(wpId).doModify((value:RelationsStateValue) => {\n delete value[relation.id!];\n return value;\n }, () => ({}));\n });\n }\n\n /**\n * Given a set of complete relations for this work package,\n * returns the RelationsStateValue\n *\n * @param wpId The wpId the relations belong to\n * @param relations The relation resource array.\n */\n private relationsStateValue(wpId:string, relations:RelationResource[]):RelationsStateValue {\n return _.keyBy(relations, (r) => r.id!);\n }\n\n /**\n *\n * We don't know how many values we're getting for a single work package\n * when we use the involved filter.\n *\n * We need to group relevant relations for work packages based on their to/from filter.\n */\n private accumulateRelationsFromInvolved(involved:string[], relations:RelationResource[]) {\n involved.forEach((wpId) => {\n const relevant = relations.filter((r) => r.isInvolved(wpId));\n const value = this.relationsStateValue(wpId, relevant);\n\n this.updateValue(wpId, value);\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport class ActivityEntryInfo {\n public date = this.activityDate(this.activity);\n\n public dateOfPrevious = this.index > 0 ? this.activityDate(this.activities[this.index - 1]) : undefined;\n\n public isNextDate = this.date !== this.dateOfPrevious;\n\n constructor(public timezoneService:TimezoneService,\n public isReversed:boolean,\n public activities:any[],\n public activity:HalResource,\n public index:number) {\n }\n\n public number(forceReverse = false):number {\n return this.orderedIndex(this.index, forceReverse);\n }\n\n public get href():string {\n return this.activity.href as string;\n }\n\n public get identifier():string {\n return `${this.href}-${this.version}-${this.updatedAt}`;\n }\n\n public get version():number {\n return this.activity.version as number;\n }\n\n public get updatedAt():string {\n return this.activity.updatedAt as string;\n }\n\n public isInitial(forceReverse = false) {\n let activityNo = this.number(forceReverse);\n\n if (this.activity._type.indexOf('Activity') !== 0) {\n return false;\n }\n\n if (activityNo === 1) {\n return true;\n }\n\n while (--activityNo > 0) {\n const idx = this.orderedIndex(activityNo, forceReverse) - 1;\n const activity = this.activities[idx];\n if (!_.isNil(activity) && activity._type.indexOf('Activity') === 0) {\n return false;\n }\n }\n\n return true;\n }\n\n protected activityDate(activity:any) {\n // Force long date regardless of current date settings for headers\n return moment(activity.createdAt).format('LL');\n }\n\n protected orderedIndex(activityNo:number, forceReverse = false) {\n if (forceReverse || this.isReversed) {\n return this.activities.length - activityNo;\n }\n\n return activityNo + 1;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { Injectable } from '@angular/core';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { WorkPackageLinkedResourceCache } from 'core-app/features/work-packages/components/wp-single-view-tabs/wp-linked-resource-cache.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { ActivityEntryInfo } from './activity-entry-info';\n\n@Injectable()\nexport class WorkPackagesActivityService extends WorkPackageLinkedResourceCache {\n constructor(public ConfigurationService:ConfigurationService,\n readonly timezoneService:TimezoneService) {\n super();\n }\n\n public get order() {\n return this.isReversed ? 'desc' : 'asc';\n }\n\n public get isReversed():boolean {\n return !!this.ConfigurationService.commentsSortedInDescendingOrder();\n }\n\n /**\n * Aggregate user and revision activities for the given work package resource.\n * Resolves both promises and returns a sorted list of activities\n * whose order depends on the 'commentsSortedInDescendingOrder' property.\n */\n protected load(workPackage:WorkPackageResource):Promise {\n const aggregated:any[] = []; const\n promises:Promise[] = [];\n\n const add = function (data:any) {\n aggregated.push(data.elements);\n };\n\n promises.push(workPackage.activities.$update().then(add));\n\n if (workPackage.revisions) {\n promises.push(workPackage.revisions.$update().then(add));\n }\n return Promise.all(promises).then(() => this.sortedActivityList(aggregated));\n }\n\n protected sortedActivityList(activities:HalResource[], attr = 'createdAt'):HalResource[] {\n const sorted = _.sortBy(_.flatten(activities), attr);\n\n if (this.isReversed) {\n return sorted.reverse();\n }\n return sorted;\n }\n\n public info(activities:HalResource[], activity:HalResource, index:number) {\n return new ActivityEntryInfo(this.timezoneService, this.isReversed, activities, activity, index);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n StateService, Transition, TransitionService, UIRouterGlobals,\n} from '@uirouter/core';\nimport { ReplaySubject } from 'rxjs';\nimport { Injectable } from '@angular/core';\nimport { splitViewRoute } from 'core-app/features/work-packages/routing/split-view-routes.helper';\n\n@Injectable({ providedIn: 'root' })\nexport class KeepTabService {\n protected currentTab = 'overview';\n\n protected subject = new ReplaySubject<{ [tab:string]:string; }>(1);\n\n constructor(protected $state:StateService,\n protected uiRouterGlobals:UIRouterGlobals,\n protected $transitions:TransitionService) {\n this.updateTabs();\n $transitions.onSuccess({}, (transition:Transition) => {\n this.updateTabs(transition.params('to').tabIdentifier);\n });\n }\n\n public get observable() {\n return this.subject;\n }\n\n /**\n * Return the last active tab.\n */\n public get lastActiveTab():string {\n if (this.isCurrentState('show')) {\n return this.currentShowTab;\n }\n\n return this.currentDetailsTab;\n }\n\n public goCurrentShowState(params:Record = {}):void {\n this.$state.go(\n 'work-packages.show.tabs',\n {\n ...this.uiRouterGlobals.params,\n ...params,\n tabIdentifier: this.currentShowTab,\n },\n );\n }\n\n public goCurrentDetailsState(params:Record = {}):void {\n const route = splitViewRoute(this.$state);\n\n this.$state.go(\n `${route}.tabs`,\n {\n ...this.uiRouterGlobals.params,\n ...params,\n tabIdentifier: this.currentDetailsTab,\n },\n );\n }\n\n public isDetailsState(stateName:string):boolean {\n return !!stateName && stateName.includes('.details');\n }\n\n public get currentShowTab():string {\n // Show view doesn't have overview\n // use activity instead\n if (this.currentTab === 'overview') {\n return 'activity';\n }\n\n return this.currentTab;\n }\n\n public get currentDetailsTab():string {\n return this.currentTab;\n }\n\n get currentTabIdentifier():string|undefined {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.uiRouterGlobals.params.tabIdentifier;\n }\n\n protected notify() {\n // Notify when updated\n this.subject.next({\n active: this.lastActiveTab,\n show: this.currentShowTab,\n details: this.currentDetailsTab,\n });\n }\n\n protected updateTab(stateName:string) {\n if (this.isCurrentState(stateName)) {\n this.currentTab = this.uiRouterGlobals.params.tabIdentifier;\n\n this.notify();\n }\n }\n\n protected isCurrentState(stateName:string):boolean {\n if (stateName === 'show') {\n return this.$state.includes('work-packages.show.*');\n }\n if (stateName === 'details') {\n return this.$state.includes('**.details.*');\n }\n\n return false;\n }\n\n public updateTabs(currentTab?:string) {\n // Ignore the switch from show#activity to details#activity\n // and show details#overview instead\n if (this.isCurrentState('show') && currentTab === 'activity') {\n this.currentTab = 'overview';\n return this.notify();\n }\n this.updateTab('show');\n this.updateTab('details');\n }\n}\n","
\n
\n
\n

\n
\n
\n
\n
\n\n \n \n
\n
\n
\n \n \n
\n
\n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, OnInit,\n} from '@angular/core';\nimport { Transition } from '@uirouter/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageWatchersService } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watchers.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { trackByHref } from 'core-app/shared/helpers/angular/tracking-functions';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Component({\n templateUrl: './watchers-tab.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'wp-watchers-tab',\n})\nexport class WorkPackageWatchersTabComponent extends UntilDestroyedMixin implements OnInit {\n public workPackageId:string;\n\n public workPackage:WorkPackageResource;\n\n public trackByHref = trackByHref;\n\n public error = false;\n\n public noResults = false;\n\n public allowedToView = false;\n\n public allowedToAdd = false;\n\n public allowedToRemove = false;\n\n public availableWatchersPath:string;\n\n private $element:JQuery;\n\n public watching:any[] = [];\n\n public text = {\n loading: this.I18n.t('js.watchers.label_loading'),\n loadingError: this.I18n.t('js.watchers.label_error_loading'),\n autocomplete: {\n placeholder: this.I18n.t('js.watchers.typeahead_placeholder'),\n },\n };\n\n public constructor(readonly I18n:I18nService,\n readonly elementRef:ElementRef,\n readonly wpWatchersService:WorkPackageWatchersService,\n readonly $transition:Transition,\n readonly notificationService:WorkPackageNotificationService,\n readonly loadingIndicator:LoadingIndicatorService,\n readonly cdRef:ChangeDetectorRef,\n readonly pathHelper:PathHelperService,\n readonly apiV3Service:ApiV3Service) {\n super();\n }\n\n public ngOnInit() {\n this.$element = jQuery(this.elementRef.nativeElement);\n\n this.workPackageId = this.$transition.params('to').workPackageId;\n this\n .apiV3Service\n .work_packages\n .id(this.workPackageId)\n .requireAndStream()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp:WorkPackageResource) => {\n this.workPackage = wp;\n this.loadCurrentWatchers();\n });\n\n this.availableWatchersPath = this.apiV3Service.work_packages.id(this.workPackageId).available_watchers.path;\n }\n\n public loadCurrentWatchers() {\n this.error = false;\n this.allowedToView = !!this.workPackage.watchers;\n this.allowedToAdd = !!this.workPackage.addWatcher;\n this.allowedToRemove = !!this.workPackage.removeWatcher;\n\n if (!this.allowedToView) {\n this.error = true;\n return;\n }\n\n this.wpWatchersService.require(this.workPackage)\n .then((watchers:HalResource[]) => {\n this.watching = watchers;\n this.cdRef.detectChanges();\n })\n .catch((error:any) => {\n this.notificationService.showError(error, this.workPackage);\n });\n }\n\n public set loadingPromise(promise:Promise) {\n this.loadingIndicator.wpDetails.promise = promise;\n }\n\n public addWatcher(user:any) {\n this.loadingPromise = this.workPackage.addWatcher.$link.$fetch({ user: { href: user.href } })\n .then(() => {\n // Forcefully reload the resource to update the watch/unwatch links\n // should the current user have been added\n this.wpWatchersService.require(this.workPackage, true);\n this\n .apiV3Service\n .work_packages\n .id(this.workPackage)\n .refresh();\n\n this.cdRef.detectChanges();\n })\n .catch((error:any) => this.notificationService.showError(error, this.workPackage));\n }\n\n public removeWatcher(watcher:any) {\n this.workPackage.removeWatcher.$link.$prepare({ user_id: watcher.id })()\n .then(() => {\n _.remove(this.watching, (other:HalResource) => other.href === watcher.href);\n\n // Forcefully reload the resource to update the watch/unwatch links\n // should the current user have been removed\n this.wpWatchersService.require(this.workPackage, true);\n this\n .apiV3Service\n .work_packages\n .id(this.workPackage)\n .refresh();\n this.cdRef.detectChanges();\n })\n .catch((error:any) => this.notificationService.showError(error, this.workPackage));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { WorkPackageLinkedResourceCache } from 'core-app/features/work-packages/components/wp-single-view-tabs/wp-linked-resource-cache.service';\n\n@Injectable()\nexport class WorkPackageWatchersService extends WorkPackageLinkedResourceCache {\n protected load(workPackage:WorkPackageResource) {\n return workPackage.watchers.$update()\n .then((collection:CollectionResource) => collection.elements);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { input, InputState } from 'reactivestates';\nimport { take } from 'rxjs/operators';\nimport { Observable, of } from 'rxjs';\nimport { EntityUIStore } from '@datorama/akita';\n\nEntityUIStore;\n\nexport abstract class WorkPackageLinkedResourceCache {\n protected cacheDurationInSeconds = 120;\n\n // Cache activities for the last work package\n // to allow fast switching between work packages without refreshing.\n protected cache:{ id:string|null, state:InputState } = {\n id: null,\n state: input(),\n };\n\n /**\n * Requires the linked resource for the given work package.\n * Caches a single value for subsequent requests for +cacheDurationInSeconds+ seconds.\n *\n * Whenever another work package's linked resource is requested, the cache is replaced.\n *\n * @param {WorkPackageResource} workPackage\n * @returns {Promise}\n */\n public requireAndStream(workPackage:WorkPackageResource, force = false):Observable {\n const id = workPackage.id!;\n const { state } = this.cache;\n\n // Clear cache if requesting different resource\n if (force || this.cache.id !== id) {\n state.clear();\n }\n\n // Return cached value if id matches and value is present\n if (this.isCached(id)) {\n return of(state.value!);\n }\n\n // Ensure value is loaded only once\n this.cache.id = id;\n this.cache.state.putFromPromiseIfPristine(() => this.load(workPackage));\n\n return this.cache.state.values$();\n }\n\n public require(workPackage:WorkPackageResource, force = false):Promise {\n return this\n .requireAndStream(workPackage, force)\n .pipe(\n take(1),\n )\n .toPromise();\n }\n\n public clear(workPackageId:string|null) {\n if (this.cache.id === workPackageId) {\n this.cache.state.clear();\n }\n }\n\n /**\n * Return whether the given work package is cached.\n * @param {string} workPackageId\n * @returns {boolean}\n */\n public isCached(workPackageId:string) {\n const { state } = this.cache;\n return this.cache.id === workPackageId && state.hasValue() && !state.isValueOlderThan(this.cacheDurationInSeconds * 1000);\n }\n\n /**\n * Load the linked resource and return it as a promise\n * @param {WorkPackageResource} workPackage\n */\n protected abstract load(workPackage:WorkPackageResource):Promise;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy, Component, HostListener, Input,\n} from '@angular/core';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { CustomActionResource } from 'core-app/features/hal/resources/custom-action-resource';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackagesActivityService } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/wp-activity.service';\n\n@Component({\n selector: 'wp-custom-action',\n templateUrl: './wp-custom-action.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WpCustomActionComponent {\n @Input() workPackage:WorkPackageResource;\n\n @Input() action:CustomActionResource;\n\n constructor(private halResourceService:HalResourceService,\n private apiV3Service:ApiV3Service,\n private wpSchemaCacheService:SchemaCacheService,\n private wpActivity:WorkPackagesActivityService,\n private notificationService:WorkPackageNotificationService,\n private halEditing:HalResourceEditingService,\n private halEvents:HalEventsService) {\n }\n\n private fetchAction() {\n if (this.action.href === null) return;\n\n void this.halResourceService.get(this.action.href)\n .toPromise()\n .then((action) => {\n this.action = action;\n });\n }\n\n public get change():ResourceChangeset {\n return this.halEditing.changeFor(this.workPackage);\n }\n\n public update():void {\n if (this.action.href === null) return;\n\n const payload = {\n lockVersion: this.workPackage.lockVersion,\n _links: {\n workPackage: {\n href: this.workPackage.href,\n },\n },\n };\n\n // Mark changeset as in flight\n this.change.inFlight = true;\n\n this.halResourceService\n .post(`${this.action.href}/execute`, payload)\n .subscribe(\n (savedWp:WorkPackageResource) => {\n this.notificationService.showSave(savedWp, false);\n this.workPackage = savedWp;\n this.wpActivity.clear(this.workPackage.id);\n // Loading the schema might be necessary in cases where the button switches\n // project or type.\n void this.apiV3Service.work_packages.cache.updateWorkPackage(savedWp).then(() => {\n this.halEditing.stopEditing(savedWp);\n this.halEvents.push(savedWp, { eventType: 'updated' });\n this.change.inFlight = false;\n });\n },\n (errorResource) => {\n this.notificationService.handleRawError(errorResource, this.workPackage);\n this.change.inFlight = false;\n },\n );\n }\n\n @HostListener('mouseenter') onMouseEnter():void {\n this.fetchAction();\n }\n}\n","\n\n","\n {{action.name}}\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit,\n} from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { CustomActionResource } from 'core-app/features/hal/resources/custom-action-resource';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\n@Component({\n selector: 'wp-custom-actions',\n templateUrl: './wp-custom-actions.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WpCustomActionsComponent extends UntilDestroyedMixin implements OnInit {\n @Input() workPackage:WorkPackageResource;\n\n actions:CustomActionResource[] = [];\n\n constructor(readonly apiV3Service:ApiV3Service,\n readonly cdRef:ChangeDetectorRef) {\n super();\n }\n\n ngOnInit() {\n this\n .apiV3Service\n .work_packages\n .id(this.workPackage.id!)\n .requireAndStream()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp) => {\n this.actions = wp.customActions ? [...wp.customActions] : [];\n this.cdRef.detectChanges();\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

\n
\n
\n \n {{ descriptor.label }}\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
\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\n \n \n
\n
\n\n
\n
\n
\n
\n

\n
\n
\n\n
\n \n \n \n
\n
\n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Injector,\n Input,\n OnInit,\n} from '@angular/core';\nimport { StateService } from '@uirouter/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { distinctUntilChanged, map } from 'rxjs/operators';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { DisplayFieldService } from 'core-app/shared/components/fields/display/display-field.service';\nimport { DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { Subject } from 'rxjs';\nimport { randomString } from 'core-app/shared/helpers/random-string';\nimport { BrowserDetector } from 'core-app/core/browser/browser-detector.service';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\n\nexport interface FieldDescriptor {\n name:string;\n label:string;\n field?:DisplayField;\n fields?:DisplayField[];\n spanAll:boolean;\n multiple:boolean;\n}\n\nexport interface GroupDescriptor {\n name:string;\n id:string;\n members:FieldDescriptor[];\n query?:QueryResource;\n relationType?:string;\n isolated:boolean;\n type:string;\n}\n\nexport interface ResourceContextChange {\n isNew:boolean;\n schema:string|null;\n project:string|null;\n}\n\nexport const overflowingContainerAttribute = 'overflowingIdentifier';\n\n@Component({\n templateUrl: './wp-single-view.html',\n selector: 'wp-single-view',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageSingleViewComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n /** Should we show the project field */\n @Input() public showProject = false;\n\n // Grouped fields returned from API\n public groupedFields:GroupDescriptor[] = [];\n\n // State updated when structural changes to the single view may occur.\n // (e.g., when changing the type or project context).\n public resourceContextChange = new Subject();\n\n // Project context as an indicator\n // when editing the work package in a different project\n public projectContext:{\n matches:boolean,\n href:string|null,\n field?:FieldDescriptor[]\n };\n\n public text = {\n attachments: {\n label: this.I18n.t('js.label_attachments'),\n },\n files: {\n label: this.I18n.t('js.work_packages.tabs.files'),\n migration_help: this.I18n.t('js.work_packages.tabs.files_tab_migration_help'),\n },\n project: {\n required: this.I18n.t('js.project.required_outside_context'),\n context: this.I18n.t('js.project.context'),\n switchTo: this.I18n.t('js.project.click_to_switch_context'),\n },\n\n fields: {\n description: this.I18n.t('js.work_packages.properties.description'),\n },\n infoRow: {\n createdBy: this.I18n.t('js.label_created_by'),\n lastUpdatedOn: this.I18n.t('js.label_last_updated_on'),\n },\n };\n\n public isNewResource:boolean;\n\n public uiSelfRef:string;\n\n protected firstTimeFocused = false;\n\n $element:JQuery;\n\n constructor(readonly I18n:I18nService,\n protected currentProject:CurrentProjectService,\n protected PathHelper:PathHelperService,\n protected $state:StateService,\n protected states:States,\n protected halEditing:HalResourceEditingService,\n protected halResourceService:HalResourceService,\n protected displayFieldService:DisplayFieldService,\n protected schemaCache:SchemaCacheService,\n protected hook:HookService,\n protected injector:Injector,\n protected cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef,\n readonly browserDetector:BrowserDetector) {\n super();\n }\n\n public ngOnInit():void {\n this.$element = jQuery(this.elementRef.nativeElement as HTMLElement);\n\n this.isNewResource = isNewResource(this.workPackage);\n\n this.uiSelfRef = this.$state.$current.name;\n\n const change = this.halEditing.changeFor(this.workPackage);\n this.resourceContextChange.next(this.contextFrom(change.projectedResource));\n this.refresh(change);\n\n // Whenever the resource context changes in any way,\n // update the visible fields.\n this.resourceContextChange\n .pipe(\n this.untilDestroyed(),\n distinctUntilChanged((a, b) => _.isEqual(a, b)),\n map(() => this.halEditing.changeFor(this.workPackage)),\n )\n .subscribe((changeset:WorkPackageChangeset) => this.refresh(changeset));\n\n // Update the resource context on every update to the temporary resource.\n // This allows detecting a changed type value in a new work package.\n this.halEditing\n .temporaryEditResource(this.workPackage)\n .values$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((resource) => {\n this.resourceContextChange.next(this.contextFrom(resource));\n });\n }\n\n private refresh(change:WorkPackageChangeset) {\n // Prepare the fields that are required always\n const isNew = isNewResource(this.workPackage);\n const resource = change.projectedResource;\n\n if (!resource.project) {\n this.projectContext = { matches: false, href: null };\n } else {\n this.projectContext = {\n href: this.PathHelper.projectWorkPackagePath(idFromLink(resource.project.href), this.workPackage.id!),\n matches: resource.project.href === this.currentProject.apiv3Path,\n };\n }\n\n if (isNew && !this.currentProject.inProjectContext) {\n this.projectContext.field = this.getFields(change, ['project']);\n }\n\n const attributeGroups = this.schema(resource)._attributeGroups;\n this.groupedFields = this.rebuildGroupedFields(change, attributeGroups);\n this.cdRef.detectChanges();\n }\n\n /**\n * Returns whether a group should be hidden due to being empty\n * (e.g., consists only of CFs and none of them are active in this project.\n */\n public shouldHideGroup(group:GroupDescriptor):boolean {\n // Hide if the group is empty\n const isEmpty = group.members.length === 0;\n\n // Is a query in a new screen\n const queryInNew = isNewResource(this.workPackage) && !!group.query;\n\n return isEmpty || queryInNew;\n }\n\n /**\n * angular 2 doesn't support track by property any more but requires a custom function\n * https://github.com/angular/angular/issues/12969\n * @param _index\n * @param elem\n */\n public trackByName(_index:number, elem:{ name:string }):string {\n return elem.name;\n }\n\n /**\n * Allow other modules to register groups to insert into the single view\n */\n public prependedAttributeGroupComponents() {\n return this.hook.call('prependedAttributeGroups', this.workPackage);\n }\n\n public attributeGroupComponent(group:GroupDescriptor) {\n // we take the last registered group component which means that\n // plugins will have their say if they register for it.\n return this.hook.call('attributeGroupComponent', group, this.workPackage).pop() || null;\n }\n\n public attachmentListComponent() {\n // we take the last registered group component which means that\n // plugins will have their say if they register for it.\n return this.hook.call('workPackageAttachmentListComponent', this.workPackage).pop() || null;\n }\n\n public attachmentUploadComponent() {\n // we take the last registered group component which means that\n // plugins will have their say if they register for it.\n return this.hook.call('workPackageAttachmentUploadComponent', this.workPackage).pop() || null;\n }\n\n /*\n * Returns the work package label\n */\n public get idLabel():string {\n return `#${this.workPackage.id || ''}`;\n }\n\n public get projectContextText():string {\n const id = idFromLink(this.workPackage.project.href);\n const projectPath = this.PathHelper.projectPath(id);\n const project = `${this.workPackage.project.name}`;\n return this.I18n.t('js.project.work_package_belongs_to', { projectname: project });\n }\n\n showTwoColumnLayout():boolean {\n return this.$element[0].getBoundingClientRect().width > 750;\n }\n\n private rebuildGroupedFields(change:WorkPackageChangeset, attributeGroups:any) {\n if (!attributeGroups) {\n return [];\n }\n\n return attributeGroups.map((group:any) => {\n const groupId = this.getAttributesGroupId(group);\n\n if (group._type === 'WorkPackageFormAttributeGroup') {\n return {\n name: group.name,\n id: groupId || randomString(16),\n members: this.getFields(change, group.attributes),\n type: group._type,\n isolated: false,\n };\n }\n return {\n name: group.name,\n id: groupId || randomString(16),\n query: this.halResourceService.createHalResourceOfClass(QueryResource, group._embedded.query),\n relationType: group.relationType,\n members: [group._embedded.query],\n type: group._type,\n isolated: true,\n };\n });\n }\n\n /**\n * Maps the grouped fields into their display fields.\n * May return multiple fields (for the date virtual field).\n */\n private getFields(change:WorkPackageChangeset, fieldNames:string[]):FieldDescriptor[] {\n const descriptors:FieldDescriptor[] = [];\n\n fieldNames.forEach((fieldName:string) => {\n if (fieldName === 'date') {\n descriptors.push(this.getDateField(change));\n return;\n }\n\n if (!change.schema.ofProperty(fieldName)) {\n debugLog('Unknown field for current schema', fieldName);\n return;\n }\n\n const field:DisplayField = this.displayField(change, fieldName);\n descriptors.push({\n name: fieldName,\n label: field.label,\n multiple: false,\n spanAll: field.isFormattable,\n field,\n });\n });\n\n return descriptors;\n }\n\n /**\n * We need to discern between milestones, which have a single\n * 'date' field vs. all other types which should display a\n * combined 'start' and 'due' date field.\n */\n private getDateField(change:WorkPackageChangeset):FieldDescriptor {\n const object:FieldDescriptor = {\n name: '',\n label: this.I18n.t('js.work_packages.properties.date'),\n spanAll: false,\n multiple: false,\n };\n\n if (change.schema.ofProperty('date')) {\n object.field = this.displayField(change, 'date');\n object.name = 'date';\n } else {\n object.field = this.displayField(change, 'combinedDate');\n object.name = 'combinedDate';\n }\n\n return object;\n }\n\n /**\n * Get the current resource context change from the WP resource.\n * Used to identify changes in the schema or project that may result in visual changes\n * to the single view.\n *\n * @param {WorkPackage} workPackage\n * @returns {ResourceContextChange}\n */\n private contextFrom(workPackage:WorkPackageResource):ResourceContextChange {\n const schema = this.schema(workPackage);\n\n let schemaHref:string|null;\n const projectHref:string|null = workPackage.project && workPackage.project.href;\n\n if (schema.baseSchema) {\n schemaHref = schema.baseSchema.href;\n } else {\n schemaHref = schema.href;\n }\n\n return {\n isNew: workPackage.isNew,\n schema: schemaHref,\n project: projectHref,\n };\n }\n\n private displayField(change:WorkPackageChangeset, name:string):DisplayField {\n return this.displayFieldService.getField(\n change.projectedResource,\n name,\n change.schema.ofProperty(name),\n { container: 'single-view', injector: this.injector, options: {} },\n );\n }\n\n private getAttributesGroupId(group:any):string {\n const overflowingIdentifier = this.$element\n .find(`[data-group-name=\\'${group.name}\\']`)\n .data(overflowingContainerAttribute);\n\n if (overflowingIdentifier) {\n return overflowingIdentifier.replace('.__overflowing_', '');\n }\n return '';\n }\n\n private schema(resource:WorkPackageResource) {\n if (this.halEditing.typedState(resource).hasValue()) {\n return this.halEditing.typedState(this.workPackage).value!.schema;\n }\n return this.schemaCache.of(resource);\n }\n}\n","
\n
\n \n \n
\n
\n \n \n
\n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, Input, OnInit } from '@angular/core';\nimport { UIRouterGlobals } from '@uirouter/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { randomString } from 'core-app/shared/helpers/random-string';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Component({\n selector: 'wp-subject',\n templateUrl: './wp-subject.html',\n})\nexport class WorkPackageSubjectComponent extends UntilDestroyedMixin implements OnInit {\n @Input('workPackage') workPackage:WorkPackageResource;\n\n public readonly uniqueElementIdentifier = `work-packages--subject-type-row-${randomString(16)}`;\n\n constructor(protected uiRouterGlobals:UIRouterGlobals,\n protected apiV3Service:ApiV3Service) {\n super();\n }\n\n ngOnInit() {\n if (!this.workPackage) {\n this\n .apiV3Service\n .work_packages\n .id(this.uiRouterGlobals.params.workPackageId)\n .requireAndStream()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp:WorkPackageResource) => {\n this.workPackage = wp;\n });\n }\n }\n}\n","/**\n * A PortalOutlet that lets multiple components live for the lifetime of the outlet,\n * allowing faster switching and persistent data.\n */\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n ApplicationRef,\n ComponentFactoryResolver,\n ComponentRef,\n EmbeddedViewRef,\n Injector,\n} from '@angular/core';\nimport { TabDefinition } from 'core-app/shared/components/tabs/tab.interface';\n\nexport interface TabInterface extends TabDefinition {\n componentClass:{ new(...args:any[]):TabComponent };\n}\n\nexport interface TabComponent {\n onSave:() => void;\n}\n\nexport interface ActiveTabInterface extends TabDefinition {\n portal:ComponentPortal;\n componentRef:ComponentRef;\n dispose:() => void;\n}\n\nexport class TabPortalOutlet {\n // Active tabs that have been instantiated\n public activeTabs:{ [name:string]:ActiveTabInterface } = {};\n\n // The current tab\n public currentTab:ActiveTabInterface|null = null;\n\n constructor(\n public availableTabs:TabInterface[],\n public outletElement:HTMLElement,\n private componentFactoryResolver:ComponentFactoryResolver,\n private appRef:ApplicationRef,\n private injector:Injector,\n ) {\n }\n\n public get activeComponents():TabComponent[] {\n const tabs = _.values(this.activeTabs);\n return tabs.map((tab:ActiveTabInterface) => tab.componentRef.instance);\n }\n\n public switchTo(tab:TabInterface):void {\n if (tab.disable !== undefined) {\n return;\n }\n\n // Detach any current instance\n this.detach();\n\n // Get existing or new component instance\n const instance = this.activateInstance(tab);\n\n // At this point the component has been instantiated, so we move it to the location in the DOM\n // where we want it to be rendered.\n this.outletElement.innerHTML = '';\n this.outletElement.appendChild(this._getComponentRootNode(instance.componentRef));\n this.outletElement.dataset.tabName = tab.name;\n this.currentTab = instance;\n }\n\n public detach():void {\n const current = this.currentTab;\n if (current !== null) {\n current.portal.setAttachedHost(null);\n this.currentTab = null;\n }\n }\n\n /**\n * Clears out a portal from the DOM.\n */\n dispose():void {\n // Dispose all active tabs\n _.each(this.activeTabs, (active) => active.dispose());\n\n // Remove outlet element\n if (this.outletElement.parentNode != null) {\n this.outletElement.parentNode.removeChild(this.outletElement);\n }\n }\n\n private activateInstance(tab:TabInterface):ActiveTabInterface {\n if (!this.activeTabs[tab.name]) {\n this.activeTabs[tab.name] = this.createComponent(tab);\n }\n\n return this.activeTabs[tab.name] || null;\n }\n\n private createComponent(tab:TabInterface):ActiveTabInterface {\n const componentFactory = this.componentFactoryResolver.resolveComponentFactory(tab.componentClass);\n const componentRef = componentFactory.create(this.injector);\n const portal = new ComponentPortal(tab.componentClass, null, this.injector);\n\n // Attach component view\n this.appRef.attachView(componentRef.hostView);\n\n return {\n ...tab,\n portal,\n componentRef,\n dispose: () => {\n this.appRef.detachView(componentRef.hostView);\n componentRef.destroy();\n },\n };\n }\n\n /** Gets the root HTMLElement for an instantiated component. */\n private _getComponentRootNode(componentRef:ComponentRef):HTMLElement {\n return (componentRef.hostView as EmbeddedViewRef).rootNodes[0] as HTMLElement;\n }\n}\n","\n
{{text.title}}
\n\n
\n\n
\n\n \n \n \n\n \n\n \n
\n
\n
\n
\n \n \n \n \n
\n
\n\n","import {\n ApplicationRef,\n ChangeDetectorRef,\n Component,\n ComponentFactoryResolver,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Injector,\n OnDestroy,\n OnInit,\n Optional,\n ViewChild,\n} from '@angular/core';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { WpTableConfigurationService } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.service';\nimport {\n ActiveTabInterface,\n TabComponent,\n TabInterface,\n TabPortalOutlet,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { WorkPackageStatesInitializationService } from 'core-app/features/work-packages/components/wp-list/wp-states-initialization.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\nexport const WpTableConfigurationModalPrependToken = new InjectionToken>('WpTableConfigurationModalPrependComponent');\n\n@Component({\n templateUrl: './wp-table-configuration.modal.html',\n})\nexport class WpTableConfigurationModalComponent extends OpModalComponent implements OnInit, OnDestroy {\n public text = {\n title: this.I18n.t('js.work_packages.table_configuration.modal_title'),\n closePopup: this.I18n.t('js.close_popup_title'),\n\n columnsLabel: this.I18n.t('js.label_columns'),\n selectedColumns: this.I18n.t('js.description_selected_columns'),\n multiSelectLabel: this.I18n.t('js.work_packages.label_column_multiselect'),\n applyButton: this.I18n.t('js.modals.button_apply'),\n cancelButton: this.I18n.t('js.modals.button_cancel'),\n\n upsaleRelationColumns: this.I18n.t('js.modals.upsale_relation_columns'),\n upsaleRelationColumnsLink: this.I18n.t('js.modals.upsale_relation_columns_link'),\n };\n\n public onDataUpdated = new EventEmitter();\n\n public selectedColumnMap:{ [id:string]:boolean } = {};\n\n // Get the view child we'll use as the portal host\n @ViewChild('tabContentOutlet', { static: true }) tabContentOutlet:ElementRef;\n\n // And a reference to the actual portal host interface\n public tabPortalHost:TabPortalOutlet;\n\n // Try to load an optional provided configuration service, and fall back to the default one\n private wpTableConfigurationService:WpTableConfigurationService =\n this.injector.get(WpTableConfigurationService, new WpTableConfigurationService(this.I18n));\n\n constructor(@Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n @Optional() @Inject(WpTableConfigurationModalPrependToken) public prependModalComponent:ComponentType|null,\n readonly I18n:I18nService,\n readonly injector:Injector,\n readonly appRef:ApplicationRef,\n readonly componentFactoryResolver:ComponentFactoryResolver,\n readonly loadingIndicator:LoadingIndicatorService,\n readonly querySpace:IsolatedQuerySpace,\n readonly wpStatesInitialization:WorkPackageStatesInitializationService,\n readonly apiV3Service:ApiV3Service,\n readonly notificationService:WorkPackageNotificationService,\n readonly wpTableColumns:WorkPackageViewColumnsService,\n readonly cdRef:ChangeDetectorRef,\n readonly ConfigurationService:ConfigurationService,\n readonly elementRef:ElementRef) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit() {\n this.$element = this.elementRef.nativeElement as HTMLElement;\n\n this.tabPortalHost = new TabPortalOutlet(\n this.wpTableConfigurationService.tabs,\n this.tabContentOutlet.nativeElement,\n this.componentFactoryResolver,\n this.appRef,\n this.injector,\n );\n\n this.loadingIndicator.indicator('modal').promise = this.loadForm()\n .then(() => {\n const initialTabName = this.locals.initialTab;\n const initialTab = this.availableTabs.find((el) => el.id === initialTabName);\n this.switchTo(initialTab || this.availableTabs[0]);\n this.cdRef.detectChanges();\n });\n }\n\n ngOnDestroy():void {\n this.onDataUpdated.complete();\n this.tabPortalHost.dispose();\n }\n\n public get availableTabs():TabInterface[] {\n return this.tabPortalHost.availableTabs;\n }\n\n public get currentTab():ActiveTabInterface|null {\n return this.tabPortalHost.currentTab;\n }\n\n public switchTo(tab:TabInterface):void {\n this.tabPortalHost.switchTo(tab);\n }\n\n public saveChanges():void {\n this.tabPortalHost.activeComponents.forEach((component:TabComponent) => {\n component.onSave();\n });\n\n this.onDataUpdated.emit();\n this.service.close();\n }\n\n /**\n * Called when the user attempts to close the modal window.\n * The service will close this modal if this method returns true\n * @returns {boolean}\n */\n public onClose():boolean {\n this.afterFocusOn.focus();\n return true;\n }\n\n protected get afterFocusOn():HTMLElement {\n return this.$element;\n }\n\n protected loadForm() {\n const query = this.querySpace.query.value!;\n return this\n .apiV3Service\n .queries\n .form\n .load(query)\n .toPromise()\n .then(([form, _]) => {\n this.wpStatesInitialization.updateStatesFromForm(query, form);\n\n return form;\n })\n .catch((error) => this.notificationService.handleRawError(error));\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
\n
\n","import { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageViewSumService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sum.service';\nimport { Component, Injector } from '@angular/core';\nimport { QueryGroupByResource } from 'core-app/features/hal/resources/query-group-by-resource';\n\n@Component({\n templateUrl: './display-settings-tab.component.html',\n})\nexport class WpTableConfigurationDisplaySettingsTabComponent implements TabComponent {\n // Display mode\n public displayMode:'hierarchy'|'grouped'|'default' = 'default';\n\n // Grouping\n public currentGroup:QueryGroupByResource|null;\n\n public availableGroups:QueryGroupByResource[] = [];\n\n // Sums row display\n public displaySums = false;\n\n public text = {\n choose_mode: this.I18n.t('js.work_packages.table_configuration.choose_display_mode'),\n label_group_by: this.I18n.t('js.label_group_by'),\n title: this.I18n.t('js.label_group_by'),\n placeholder: this.I18n.t('js.placeholders.default'),\n please_select: this.I18n.t('js.placeholders.selection'),\n default: `— ${this.I18n.t('js.work_packages.table_configuration.default')}`,\n display_sums: this.I18n.t('js.work_packages.query.display_sums'),\n display_sums_hint: `— ${this.I18n.t('js.work_packages.table_configuration.display_sums_hint')}`,\n display_mode: {\n default: this.I18n.t('js.work_packages.table_configuration.default_mode'),\n grouped: this.I18n.t('js.work_packages.table_configuration.grouped_mode'),\n hierarchy: this.I18n.t('js.work_packages.table_configuration.hierarchy_mode'),\n hierarchy_hint: `— ${this.I18n.t('js.work_packages.table_configuration.hierarchy_hint')}`,\n },\n };\n\n constructor(readonly injector:Injector,\n readonly I18n:I18nService,\n readonly wpTableGroupBy:WorkPackageViewGroupByService,\n readonly wpTableHierarchies:WorkPackageViewHierarchiesService,\n readonly wpTableSums:WorkPackageViewSumService) {\n }\n\n public onSave() {\n // Update hierarchy state\n this.wpTableHierarchies.setEnabled(this.displayMode === 'hierarchy');\n\n // Update grouping state\n const group = this.displayMode === 'grouped' ? this.currentGroup : null;\n this.wpTableGroupBy.update(group);\n\n // Update sums state\n this.wpTableSums.setEnabled(this.displaySums);\n }\n\n public updateGroup(href:string) {\n this.displayMode = 'grouped';\n this.currentGroup = _.find(this.availableGroups, (group) => group.href === href) || null;\n }\n\n ngOnInit() {\n if (this.wpTableHierarchies.isEnabled) {\n this.displayMode = 'hierarchy';\n } else if (this.wpTableGroupBy.current) {\n this.displayMode = 'grouped';\n }\n\n this.displaySums = this.wpTableSums.current;\n\n this.wpTableGroupBy\n .onReady()\n .then(() => {\n this.availableGroups = _.sortBy(this.wpTableGroupBy.available, 'name');\n this.currentGroup = this.wpTableGroupBy.current;\n });\n }\n}\n","
\n \n \n\n \n \n\n

\n
\n\n\n\n","import { Component, Injector, OnInit } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { TabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { DraggableOption } from 'core-app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component';\nimport { enterpriseDocsUrl } from 'core-app/core/setup/globals/constants.const';\n\n@Component({\n templateUrl: './columns-tab.component.html',\n})\nexport class WpTableConfigurationColumnsTabComponent implements TabComponent, OnInit {\n public availableColumnsOptions = this.wpTableColumns.all.map((c) => this.column2Like(c));\n\n public availableColumns = this.wpTableColumns.all;\n\n public availableColumnsMap:{ [id:string]:QueryColumn } = _.keyBy(this.availableColumns, (c) => c.id);\n\n public selectedColumns:DraggableOption[] = this.wpTableColumns.getColumns().map((c) => this.column2Like(c));\n\n public selectedColumnMap:{ [id:string]:boolean } = {};\n\n public eeShowBanners = false;\n\n public text = {\n columnsHelp: this.I18n.t('js.work_packages.table_configuration.columns_help_text'),\n columnsLabel: this.I18n.t('js.label_columns'),\n selectedColumns: this.I18n.t('js.description_selected_columns'),\n multiSelectLabel: this.I18n.t('js.work_packages.label_column_multiselect'),\n\n upsaleRelationColumns: this.I18n.t('js.work_packages.table_configuration.upsale.relation_columns'),\n upsaleCheckOutLink: this.I18n.t('js.work_packages.table_configuration.upsale.check_out_link'),\n moreInfoLink: enterpriseDocsUrl.website,\n };\n\n constructor(readonly injector:Injector,\n readonly I18n:I18nService,\n readonly wpTableColumns:WorkPackageViewColumnsService,\n readonly ConfigurationService:ConfigurationService,\n readonly bannerService:BannersService) {\n }\n\n public onSave() {\n this.wpTableColumns.setColumnsById(this.selectedColumns.map((c) => c.id));\n }\n\n ngOnInit() {\n this.eeShowBanners = this.bannerService.eeShowBanners;\n this.selectedColumns.forEach((c:DraggableOption) => {\n this.selectedColumnMap[c.id] = true;\n });\n }\n\n private column2Like(c:QueryColumn):DraggableOption {\n return { id: c.id, name: c.name };\n }\n\n updateSelected(selected:DraggableOption[]) {\n this.selectedColumns = selected;\n }\n}\n","\n","import { Component, Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { WorkPackageFiltersService } from 'core-app/features/work-packages/components/filters/wp-filters/wp-filters.service';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\n\n@Component({\n templateUrl: './filters-tab.component.html',\n selector: 'wp-table-config-filters-tab',\n})\nexport class WpTableConfigurationFiltersTab implements TabComponent {\n public filters:QueryFilterInstanceResource[] = [];\n\n public eeShowBanners = false;\n\n public text = {\n columnsLabel: this.I18n.t('js.label_columns'),\n selectedColumns: this.I18n.t('js.description_selected_columns'),\n multiSelectLabel: this.I18n.t('js.work_packages.label_column_multiselect'),\n\n upsaleRelationColumns: this.I18n.t('js.modals.upsale_relation_columns'),\n upsaleRelationColumnsLink: this.I18n.t('js.modals.upsale_relation_columns_link'),\n };\n\n constructor(readonly injector:Injector,\n readonly I18n:I18nService,\n readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly wpFiltersService:WorkPackageFiltersService,\n readonly bannerService:BannersService) {\n }\n\n ngOnInit() {\n this.eeShowBanners = this.bannerService.eeShowBanners;\n this.wpTableFilters\n .onReady()\n .then(() => this.filters = this.wpTableFilters.current);\n\n this.wpTableFilters.changes$().subscribe((filters) => {\n this.filters = this.wpTableFilters.current;\n });\n }\n\n public onSave() {\n if (this.filters) {\n this.wpTableFilters.replaceIfComplete(this.filters);\n }\n }\n}\n","
\n
\n\n

\n
\n
\n \n
\n
\n
\n \n
\n
\n {{ text.sorting_mode.warning }}\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","import { Component, Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { TabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport {\n QUERY_SORT_BY_ASC,\n QUERY_SORT_BY_DESC,\n QuerySortByResource,\n} from 'core-app/features/hal/resources/query-sort-by-resource';\n\nexport class SortModalObject {\n constructor(public column:SortColumn,\n public direction:string) {\n }\n}\n\nexport interface SortColumn {\n name:string;\n href:string | null;\n}\n\nexport type SortingMode = 'automatic'|'manual';\n\n@Component({\n templateUrl: './sort-by-tab.component.html',\n})\nexport class WpTableConfigurationSortByTabComponent implements TabComponent {\n public text = {\n title: this.I18n.t('js.label_sort_by'),\n placeholder: this.I18n.t('js.placeholders.default'),\n sort_criteria_1: this.I18n.t('js.filter.sorting.criteria.one'),\n sort_criteria_2: this.I18n.t('js.filter.sorting.criteria.two'),\n sort_criteria_3: this.I18n.t('js.filter.sorting.criteria.three'),\n sorting_mode: {\n description: this.I18n.t('js.work_packages.table_configuration.sorting_mode.description'),\n automatic: this.I18n.t('js.work_packages.table_configuration.sorting_mode.automatic'),\n manually: this.I18n.t('js.work_packages.table_configuration.sorting_mode.manually'),\n warning: this.I18n.t('js.work_packages.table_configuration.sorting_mode.warning'),\n },\n };\n\n readonly availableDirections = [\n { href: QUERY_SORT_BY_ASC, name: this.I18n.t('js.label_ascending') },\n { href: QUERY_SORT_BY_DESC, name: this.I18n.t('js.label_descending') },\n ];\n\n public availableColumns:SortColumn[] = [];\n\n public allColumns:SortColumn[] = [];\n\n public sortationObjects:SortModalObject[] = [];\n\n public emptyColumn:SortColumn = { name: this.text.placeholder, href: null };\n\n public sortingMode:SortingMode = 'automatic';\n\n public manualSortColumn:SortColumn;\n\n constructor(readonly injector:Injector,\n readonly I18n:I18nService,\n readonly wpTableSortBy:WorkPackageViewSortByService) {\n\n }\n\n public onSave() {\n let sortElements;\n if (this.sortingMode === 'automatic') {\n sortElements = this.sortationObjects.filter((object) => object.column !== null);\n } else {\n sortElements = [new SortModalObject(this.manualSortColumn, QUERY_SORT_BY_ASC)];\n }\n\n sortElements = sortElements.map((object) => this.getMatchingSort(object.column.href!, object.direction));\n this.wpTableSortBy.update(_.compact(sortElements));\n }\n\n ngOnInit() {\n this.wpTableSortBy\n .onReadyWithAvailable()\n .subscribe(() => {\n const allColumns:SortColumn[] = this.wpTableSortBy.available.filter(\n (sort:QuerySortByResource) => !sort.column.href!.endsWith('/parent'),\n ).map(\n (sort:QuerySortByResource) => ({ name: sort.column.name, href: sort.column.href }),\n );\n\n // For whatever reason, even though the UI doesn't implement it,\n // QuerySortByResources are doubled for each column (one for asc/desc direction)\n this.allColumns = _.uniqBy(allColumns, 'href');\n\n this.getManualSortingOption();\n\n _.each(this.wpTableSortBy.current, (sort) => {\n if (!sort.column.href!.endsWith('/parent')) {\n this.sortationObjects.push(\n new SortModalObject({ name: sort.column.name, href: sort.column.href },\n sort.direction.href!),\n );\n if (sort.column.href === this.manualSortColumn.href) {\n this.updateSortingMode('manual');\n }\n }\n });\n\n this.updateUsedColumns();\n this.fillUpSortElements();\n });\n }\n\n public updateSelection(sort:SortModalObject, selected:string | null) {\n sort.column = _.find(this.allColumns, (column) => column.href === selected) || this.emptyColumn;\n this.updateUsedColumns();\n }\n\n public updateUsedColumns() {\n const usedColumns = this.sortationObjects\n .filter((o) => o.column !== null)\n .map((object:SortModalObject) => object.column);\n\n this.availableColumns = _.sortBy(_.differenceBy(this.allColumns, usedColumns, 'href'), 'name');\n }\n\n public updateSortingMode(mode:SortingMode) {\n this.sortingMode = mode;\n }\n\n private getMatchingSort(column:string, direction:string) {\n return _.find(this.wpTableSortBy.available, (sort) => sort.column.href === column && sort.direction.href === direction);\n }\n\n private fillUpSortElements() {\n while (this.sortationObjects.length < 3) {\n this.sortationObjects.push(new SortModalObject(this.emptyColumn, QUERY_SORT_BY_ASC));\n }\n }\n\n private getManualSortingOption() {\n this.manualSortColumn = this.allColumns.find((e) => e.href!.endsWith('/manualSorting'))!;\n this.allColumns.splice(this.allColumns.indexOf(this.manualSortColumn), 1);\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
\n \n \n

\n
\n
\n \n {{ text.labels[key] }}\n \n
\n
\n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n","import { Component, Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { zoomLevelOrder } from 'core-app/features/work-packages/components/wp-table/timeline/wp-timeline';\nimport { TimelineLabels, TimelineZoomLevel } from 'core-app/features/hal/resources/query-resource';\n\n@Component({\n templateUrl: './timelines-tab.component.html',\n})\nexport class WpTableConfigurationTimelinesTabComponent implements TabComponent {\n public timelineVisible = false;\n\n public availableAttributes:{ id:string, name:string }[];\n\n public labels:TimelineLabels;\n\n public availableLabels:string[];\n\n public zoomLevel:TimelineZoomLevel;\n\n // Manually build available zoom levels with zoom\n // because it is not part of the order.\n public availableZoomLevels:TimelineZoomLevel[] = ['auto', ...zoomLevelOrder];\n\n public text = {\n title: this.I18n.t('js.timelines.gantt_chart'),\n display_timelines: this.I18n.t('js.timelines.button_activate'),\n display_timelines_hint: this.I18n.t('js.work_packages.table_configuration.show_timeline_hint'),\n zoom: {\n level: this.I18n.t('js.tl_toolbar.zooms'),\n description: this.I18n.t('js.timelines.zoom.description'),\n days: this.I18n.t('js.timelines.zoom.days'),\n weeks: this.I18n.t('js.timelines.zoom.weeks'),\n months: this.I18n.t('js.timelines.zoom.months'),\n quarters: this.I18n.t('js.timelines.zoom.quarters'),\n years: this.I18n.t('js.timelines.zoom.years'),\n auto: this.I18n.t('js.timelines.zoom.auto'),\n },\n labels: {\n title: this.I18n.t('js.timelines.labels.title'),\n description: this.I18n.t('js.timelines.labels.description'),\n bar: this.I18n.t('js.timelines.labels.bar'),\n none: this.I18n.t('js.timelines.filter.noneSelection'),\n left: this.I18n.t('js.timelines.labels.left'),\n right: this.I18n.t('js.timelines.labels.right'),\n farRight: this.I18n.t('js.timelines.labels.farRight'),\n },\n };\n\n constructor(readonly injector:Injector,\n readonly I18n:I18nService,\n readonly wpTableTimeline:WorkPackageViewTimelineService,\n readonly wpTableColumns:WorkPackageViewColumnsService) {\n }\n\n public onSave() {\n this.wpTableTimeline.update({\n ...this.wpTableTimeline.current,\n visible: this.timelineVisible,\n labels: this.labels,\n zoomLevel: this.zoomLevel,\n });\n }\n\n public updateLabels(key:keyof TimelineLabels, value:string|null) {\n if (value === '') {\n value = null;\n }\n\n this.labels[key] = value;\n }\n\n ngOnInit() {\n this.timelineVisible = this.wpTableTimeline.isVisible;\n\n // Current zoom level\n this.zoomLevel = this.wpTableTimeline.zoomLevel;\n\n // Current label models\n const { labels } = this.wpTableTimeline;\n this.labels = _.clone(labels);\n this.availableLabels = Object.keys(this.labels);\n\n // Available labels\n const availableColumns = this.wpTableColumns\n .allPropertyColumns\n .sort((a:QueryColumn, b:QueryColumn) => a.name.localeCompare(b.name));\n\n this.availableAttributes = [{ id: '', name: this.text.labels.none }].concat(availableColumns);\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 \n
\n
\n
\n","import {\n ChangeDetectionStrategy,\n Component,\n Injector,\n ViewChild,\n} from '@angular/core';\nimport { TabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { WorkPackageViewHighlightingService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-highlighting.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HighlightingMode } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting-mode.const';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { NgSelectComponent } from '@ng-select/ng-select';\nimport { States } from 'core-app/core/states/states.service';\nimport { enterpriseDocsUrl } from 'core-app/core/setup/globals/constants.const';\n\n@Component({\n templateUrl: './highlighting-tab.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WpTableConfigurationHighlightingTabComponent implements TabComponent {\n // Display mode\n public highlightingMode:HighlightingMode = 'inline';\n\n public entireRowMode = false;\n\n public lastEntireRowAttribute:HighlightingMode = 'status';\n\n public eeShowBanners = false;\n\n public availableInlineHighlightedAttributes:HalResource[] = [];\n\n public selectedAttributes:any[] = [];\n\n public availableRowHighlightedAttributes:{ name:string; value:HighlightingMode }[] = [];\n\n @ViewChild('highlightedAttributesNgSelect') public highlightedAttributesNgSelect:NgSelectComponent;\n\n @ViewChild('rowHighlightNgSelect') public rowHighlightNgSelect:NgSelectComponent;\n\n public text = {\n title: this.I18n.t('js.work_packages.table_configuration.highlighting'),\n highlighting_mode: {\n description: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.description'),\n none: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.none'),\n inline: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.inline'),\n inline_all_attributes: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.inline_all'),\n status: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.status'),\n type: this.I18n.t('js.work_packages.properties.type'),\n priority: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.priority'),\n entire_row_by: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.entire_row_by'),\n },\n upsaleAttributeHighlighting: this.I18n.t('js.work_packages.table_configuration.upsale.attribute_highlighting'),\n upsaleCheckOutLink: this.I18n.t('js.work_packages.table_configuration.upsale.check_out_link'),\n more_info_link: enterpriseDocsUrl.tableHighlighting,\n };\n\n constructor(readonly injector:Injector,\n readonly I18n:I18nService,\n readonly states:States,\n readonly querySpace:IsolatedQuerySpace,\n readonly Banners:BannersService,\n readonly wpTableHighlight:WorkPackageViewHighlightingService) {\n }\n\n ngOnInit() {\n this.availableInlineHighlightedAttributes = this.availableHighlightedAttributes;\n this.availableRowHighlightedAttributes = [\n { name: this.text.highlighting_mode.status, value: 'status' },\n { name: this.text.highlighting_mode.priority, value: 'priority' },\n ];\n\n this.setSelectedValues();\n\n this.eeShowBanners = this.Banners.eeShowBanners;\n this.updateMode(this.wpTableHighlight.current.mode);\n\n if (this.eeShowBanners) {\n this.updateMode('none');\n }\n }\n\n public onSave() {\n const mode = this.highlightingMode;\n this.wpTableHighlight.update({ mode, selectedAttributes: this.selectedAttributes });\n }\n\n public updateMode(mode:HighlightingMode | 'entire-row') {\n if (mode === 'entire-row') {\n this.highlightingMode = this.lastEntireRowAttribute;\n } else {\n this.highlightingMode = mode;\n }\n\n if (['status', 'priority'].indexOf(this.highlightingMode) !== -1) {\n this.lastEntireRowAttribute = this.highlightingMode;\n this.entireRowMode = true;\n } else {\n this.entireRowMode = false;\n }\n }\n\n public updateHighlightingAttributes(model:HalResource[]) {\n this.selectedAttributes = model;\n }\n\n public disabledValue(value:boolean):string | null {\n return value ? 'disabled' : null;\n }\n\n public get availableHighlightedAttributes():HalResource[] {\n const { schema } = this.querySpace.queryForm.value!;\n return schema.highlightedAttributes.allowedValues;\n }\n\n public onOpen(component:any) {\n setTimeout(() => {\n if (component.dropdownPanel) {\n component.dropdownPanel._updatePosition();\n }\n }, 25);\n }\n\n private setSelectedValues() {\n const currentValues = this.wpTableHighlight.current.selectedAttributes;\n\n if (currentValues) {\n this.selectedAttributes = currentValues;\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WpTableConfigurationDisplaySettingsTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/display-settings-tab.component';\nimport { TabInterface } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { WpTableConfigurationColumnsTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/columns-tab.component';\nimport { WpTableConfigurationFiltersTab } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/filters-tab.component';\nimport { WpTableConfigurationSortByTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/sort-by-tab.component';\nimport { WpTableConfigurationTimelinesTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/timelines-tab.component';\nimport { WpTableConfigurationHighlightingTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/highlighting-tab.component';\n\n@Injectable()\nexport class WpTableConfigurationService {\n protected _tabs:TabInterface[] = [\n {\n id: 'columns',\n name: this.I18n.t('js.label_columns'),\n componentClass: WpTableConfigurationColumnsTabComponent,\n },\n {\n id: 'filters',\n name: this.I18n.t('js.work_packages.query.filters'),\n componentClass: WpTableConfigurationFiltersTab,\n },\n {\n id: 'sort-by',\n name: this.I18n.t('js.label_sort_by'),\n componentClass: WpTableConfigurationSortByTabComponent,\n },\n {\n id: 'display-settings',\n name: this.I18n.t('js.work_packages.table_configuration.display_settings'),\n componentClass: WpTableConfigurationDisplaySettingsTabComponent,\n },\n {\n id: 'highlighting',\n name: this.I18n.t('js.work_packages.table_configuration.highlighting'),\n componentClass: WpTableConfigurationHighlightingTabComponent,\n },\n {\n id: 'timelines',\n name: this.I18n.t('js.timelines.gantt_chart'),\n componentClass: WpTableConfigurationTimelinesTabComponent,\n },\n ];\n\n constructor(readonly I18n:I18nService) {\n }\n\n public get tabs() {\n return this._tabs;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Injectable } from '@angular/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageViewHierarchyIdentationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy-indentation.service';\nimport { WorkPackageViewDisplayRepresentationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\n\nexport type WorkPackageAction = {\n text?:string;\n key:string;\n icon?:string;\n indexBy?:(actions:WorkPackageAction[]) => number,\n link?:string;\n href?:string;\n};\n\n@Injectable()\nexport class WorkPackageContextMenuHelperService {\n private BULK_ACTIONS = [\n {\n text: I18n.t('js.work_packages.bulk_actions.edit'),\n key: 'edit',\n link: 'update',\n href: `${this.PathHelper.staticBase}/work_packages/bulk/edit`,\n },\n {\n text: I18n.t('js.work_packages.bulk_actions.move'),\n key: 'move',\n link: 'move',\n href: `${this.PathHelper.staticBase}/work_packages/move/new`,\n },\n {\n text: I18n.t('js.work_packages.bulk_actions.copy'),\n key: 'copy',\n link: 'copy',\n href: `${this.PathHelper.staticBase}/work_packages/move/new?copy=true`,\n },\n {\n text: I18n.t('js.work_packages.bulk_actions.delete'),\n key: 'delete',\n link: 'delete',\n href: `${this.PathHelper.staticBase}/work_packages/bulk?_method=delete`,\n },\n ];\n\n constructor(private HookService:HookService,\n private UrlParamsHelper:UrlParamsHelperService,\n private wpViewRepresentation:WorkPackageViewDisplayRepresentationService,\n private wpViewTimeline:WorkPackageViewTimelineService,\n private wpViewIndent:WorkPackageViewHierarchyIdentationService,\n private PathHelper:PathHelperService) {\n }\n\n public getPermittedActionLinks(workPackage:WorkPackageResource, permittedActionConstants:any, allowSplitScreenActions:boolean):WorkPackageAction[] {\n const singularPermittedActions:any[] = [];\n\n let allowedActions = this.getAllowedActions(workPackage, permittedActionConstants);\n\n allowedActions = allowedActions.concat(this.getAllowedParentActions(workPackage));\n\n allowedActions = allowedActions.concat(this.getAllowedRelationActions(workPackage, allowSplitScreenActions));\n\n _.each(allowedActions, (allowedAction) => {\n singularPermittedActions.push({\n key: allowedAction.key,\n text: allowedAction.text,\n icon: allowedAction.icon,\n link: allowedAction.link ? workPackage[allowedAction.link].href : undefined,\n });\n });\n\n return singularPermittedActions;\n }\n\n public getIntersectOfPermittedActions(workPackages:any) {\n const bulkPermittedActions:any = [];\n const possibleActions = this.BULK_ACTIONS.concat(this.HookService.call('workPackageBulkContextMenu'));\n const permittedActions = _.filter(possibleActions, (action:any) => _.every(workPackages, (workPackage:WorkPackageResource) => this.isActionAllowed(workPackage, action)));\n\n _.each(permittedActions, (permittedAction:any) => {\n bulkPermittedActions.push({\n key: permittedAction.key,\n text: permittedAction.text,\n icon: permittedAction.icon,\n link: this.getBulkActionLink(permittedAction, workPackages),\n });\n });\n\n return bulkPermittedActions;\n }\n\n public getBulkActionLink(action:any, workPackages:any) {\n const workPackageIdParams = {\n 'ids[]': workPackages.map((wp:any) => wp.id),\n };\n const serializedIdParams = this.UrlParamsHelper.buildQueryString(workPackageIdParams);\n\n const linkAndQueryString = action.href.split('?');\n const link = linkAndQueryString.shift();\n const queryParts = linkAndQueryString.concat(new Array(serializedIdParams));\n\n return `${link}?${queryParts.join('&')}`;\n }\n\n private isActionAllowed(workPackage:WorkPackageResource, action:WorkPackageAction):boolean {\n return _.filter(this.getAllowedActions(workPackage, [action]), (a) => a === action).length >= 1;\n }\n\n private getAllowedActions(workPackage:WorkPackageResource, actions:WorkPackageAction[]):WorkPackageAction[] {\n const allowedActions:WorkPackageAction[] = [];\n\n _.each(actions, (action) => {\n if (action.link && workPackage.hasOwnProperty(action.link)) {\n action.text = action.text || I18n.t(`js.button_${action.key}`);\n allowedActions.push(action);\n }\n });\n\n _.each(this.HookService.call('workPackageTableContextMenu'), (action) => {\n if (workPackage.hasOwnProperty(action.link)) {\n const index = action.indexBy ? action.indexBy(allowedActions) : allowedActions.length;\n allowedActions.splice(index, 0, action);\n }\n });\n\n return allowedActions;\n }\n\n private getAllowedParentActions(workPackage:WorkPackageResource) {\n const actions:WorkPackageAction[] = [];\n\n // Do not add these actions unless we're in the table\n if (!this.wpViewRepresentation.isList) {\n return [];\n }\n\n // Can only outdent this item if it has ancestors\n if (this.wpViewIndent.canOutdent(workPackage)) {\n actions.push({\n key: 'hierarchy-outdent',\n icon: 'icon-paragraph-left',\n text: I18n.t('js.relation_buttons.hierarchy_outdent'),\n });\n }\n\n // Can only indent if not first and immediate predecessor is not the parent\n if (this.wpViewIndent.canIndent(workPackage)) {\n actions.push({\n key: 'hierarchy-indent',\n icon: 'icon-paragraph-right',\n text: I18n.t('js.relation_buttons.hierarchy_indent'),\n });\n }\n\n return actions;\n }\n\n private getAllowedRelationActions(workPackage:WorkPackageResource, allowSplitScreenActions:boolean) {\n const allowedActions:WorkPackageAction[] = [];\n\n if (!!workPackage.addRelation && this.wpViewTimeline.isVisible) {\n allowedActions.push({\n key: 'relation-precedes',\n text: I18n.t('js.relation_buttons.add_predecessor'),\n link: 'addRelation',\n });\n allowedActions.push({\n key: 'relation-follows',\n text: I18n.t('js.relation_buttons.add_follower'),\n link: 'addRelation',\n });\n }\n\n if (!!workPackage.addChild && allowSplitScreenActions) {\n allowedActions.push({\n key: 'relation-new-child',\n text: I18n.t('js.relation_buttons.add_new_child'),\n link: 'addChild',\n });\n }\n\n return allowedActions;\n }\n\n public getPermittedActions(workPackages:WorkPackageResource[], permittedActionConstants:any, allowSplitScreenActions:boolean):WorkPackageAction[] {\n if (workPackages.length === 1) {\n return this.getPermittedActionLinks(workPackages[0], permittedActionConstants, allowSplitScreenActions);\n }\n return this.getIntersectOfPermittedActions(workPackages);\n }\n}\n","import { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Injector } from '@angular/core';\n\nexport class TableDragActionService {\n /**\n * Initialize an action service in the given isolated query space\n * @param querySpace The isolated query space for this table\n * @param injector The hierarchical injector for this table\n */\n constructor(readonly querySpace:IsolatedQuerySpace,\n readonly injector:Injector) {\n }\n\n /**\n * Determine whether the service applies for the given\n * query spaces.\n */\n public get applies():boolean {\n return true;\n }\n\n /**\n * Perform a post-order update\n */\n public onNewOrder(newOrder:string[]):void {\n }\n\n /**\n * Returns whether the given work package is movable\n */\n public canPickup(workPackage:WorkPackageResource):boolean {\n return true;\n }\n\n /**\n * Perform the respective action for the drop that just happened\n *\n * @param workPackage\n * @param target\n * @param source\n * @param sibling\n */\n public handleDrop(workPackage:WorkPackageResource, el:HTMLElement):Promise {\n return Promise.resolve(undefined);\n }\n\n /**\n * Manipulate the shadow element\n * @param shadowElement\n * @param backToDefault: Shall the modifications be made undone\n */\n public changeShadowElement(shadowElement:HTMLElement, backToDefault = false) {\n if (backToDefault) {\n shadowElement.classList.remove('-dragged');\n } else {\n shadowElement.classList.add('-dragged');\n }\n return true;\n }\n}\n","import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { TableDragActionService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-action.service';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageRelationsHierarchyService } from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service';\nimport {\n hierarchyGroupClass,\n hierarchyRootClass,\n} from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-hierarchy-helpers';\nimport { relationRowClass, isInsideCollapsedGroup } from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-row-helpers';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\nexport class HierarchyDragActionService extends TableDragActionService {\n @InjectField() private wpTableHierarchies:WorkPackageViewHierarchiesService;\n\n @InjectField() private relationHierarchyService:WorkPackageRelationsHierarchyService;\n\n @InjectField() private apiV3Service:ApiV3Service;\n\n public get applies() {\n return this.wpTableHierarchies.isEnabled;\n }\n\n /**\n * Returns whether the given work package is movable\n */\n public canPickup(workPackage:WorkPackageResource):boolean {\n return !!workPackage.changeParent;\n }\n\n public handleDrop(workPackage:WorkPackageResource, el:HTMLElement):Promise {\n return this.determineParent(el).then((parentId:string|null) => this.relationHierarchyService.changeParent(workPackage, parentId));\n }\n\n /**\n * Find an applicable parent element from the hierarchy information in the table.\n * @param el\n */\n private determineParent(el:Element):Promise {\n let previous = el.previousElementSibling;\n const next = el.nextElementSibling;\n let parent = null;\n\n if (previous !== null && this.droppedIntoGroup(el, previous, next)) {\n // If the previous element is a relation row,\n // skip it until we find the real previous sibling\n const isRelationRow = previous.className.indexOf(relationRowClass()) >= 0;\n\n if (isRelationRow) {\n const relationRoot = this.findRelationRowRoot(previous);\n if (relationRoot == null) {\n return Promise.resolve(null);\n }\n previous = relationRoot;\n }\n\n const previousWpId = (previous as HTMLElement).dataset.workPackageId!;\n\n if (this.isHiearchyRoot(previous, previousWpId)) {\n const droppedIntoCollapsedGroup = isInsideCollapsedGroup(next);\n\n if (droppedIntoCollapsedGroup) {\n return this.determineParent(previous);\n }\n // If the sibling is a hierarchy root, return that sibling as new parent.\n parent = previousWpId;\n } else {\n // If the sibling is no hierarchy root, return it's parent.\n // Thus, the dropped element will get the same hierarchy level as the sibling\n parent = this.loadParentOfWP(previousWpId);\n }\n }\n\n return Promise.resolve(parent);\n }\n\n private findRelationRowRoot(el:Element):Element|null {\n let previous = el.previousElementSibling;\n while (previous !== null) {\n if (previous.className.indexOf(relationRowClass()) < 0) {\n return previous;\n }\n previous = previous.previousElementSibling;\n }\n\n return null;\n }\n\n private droppedIntoGroup(element:Element, previous:Element, next:Element | null):boolean {\n const inGroup = previous.className.indexOf(hierarchyGroupClass('')) >= 0;\n const isRoot = previous.className.indexOf(hierarchyRootClass('')) >= 0;\n let skipDroppedIntoGroup;\n\n if (inGroup || isRoot) {\n const elementGroups = Array.from(element.classList).filter((listClass) => listClass.includes('__hierarchy-group-')) || [];\n const previousGroups = Array.from(previous.classList).filter((listClass) => listClass.includes('__hierarchy-group-')) || [];\n const nextGroups = next && Array.from(next.classList).filter((listClass) => listClass.includes('__hierarchy-group-')) || [];\n const previousWpId = (previous as HTMLElement).dataset.workPackageId!;\n const isLastElementOfGroup = !nextGroups.some((nextGroup) => previousGroups.includes(nextGroup)) && !nextGroups.includes(hierarchyGroupClass(previousWpId));\n const elementAlreadyBelongsToGroup = elementGroups.some((elementGroup) => previousGroups.includes(elementGroup))\n || elementGroups.includes(hierarchyGroupClass(previousWpId));\n\n skipDroppedIntoGroup = isLastElementOfGroup && !elementAlreadyBelongsToGroup;\n }\n\n return !skipDroppedIntoGroup && inGroup || isRoot;\n }\n\n private isHiearchyRoot(previous:Element, previousWpId:string):boolean {\n return previous.classList.contains(hierarchyRootClass(previousWpId));\n }\n\n private loadParentOfWP(wpId:string):Promise {\n return this\n .apiV3Service\n .work_packages\n .id(wpId)\n .get()\n .toPromise()\n .then((wp:WorkPackageResource) => Promise.resolve(wp.parent?.id || null));\n }\n}\n","import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { TableDragActionService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-action.service';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\n\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { rowGroupClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-classes.constants';\nimport { locatePredecessorBySelector } from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-row-helpers';\nimport { groupIdentifier } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-rows-helpers';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\n\nexport class GroupByDragActionService extends TableDragActionService {\n @InjectField() wpTableGroupBy:WorkPackageViewGroupByService;\n\n @InjectField() halEditing:HalResourceEditingService;\n\n @InjectField() halEvents:HalEventsService;\n\n @InjectField() halNotification:HalResourceNotificationService;\n\n @InjectField() schemaCache:SchemaCacheService;\n\n public get applies() {\n return this.wpTableGroupBy.isEnabled;\n }\n\n /**\n * Returns whether the given work package is movable\n */\n public canPickup(workPackage:WorkPackageResource):boolean {\n const attribute = this.groupedAttribute;\n return attribute !== null && this.schemaCache.of(workPackage).isAttributeEditable(attribute);\n }\n\n public handleDrop(workPackage:WorkPackageResource, el:HTMLElement):Promise {\n const changeset = this.halEditing.changeFor(workPackage);\n const groupedValue = this.getValueForGroup(el);\n\n changeset.projectedResource[this.groupedAttribute!] = groupedValue;\n return this.halEditing\n .save(changeset)\n .then((saved) => this.halEvents.push(saved.resource, { eventType: 'updated' }))\n .catch((e) => this.halNotification.handleRawError(e, workPackage));\n }\n\n private getValueForGroup(el:HTMLElement):unknown|null {\n const groupHeader = locatePredecessorBySelector(el, `.${rowGroupClassName}`)!;\n const match = this.groups.find((group) => groupIdentifier(group) === groupHeader.dataset.groupIdentifier);\n\n if (!match) {\n return null;\n }\n\n if (match._links && match._links.valueLink) {\n const links = match._links.valueLink;\n\n // Unwrap single links to properly use them\n return links.length === 1 ? links[0] : links;\n }\n return match.value;\n }\n\n /**\n * Get the attribute we're grouping by\n */\n private get groupedAttribute():string|null {\n const { current } = this.wpTableGroupBy;\n return current ? current.id : null;\n }\n\n /**\n * Returns the reference to the last table.groups state value\n */\n public get groups() {\n return this.querySpace.groups.value || [];\n }\n}\n","import { Injectable, Injector } from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { TableDragActionService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-action.service';\nimport { HierarchyDragActionService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/hierarchy-drag-action.service';\nimport { GroupByDragActionService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/group-by-drag-action.service';\n\ninterface ITableDragActionService {\n new(querySpace:IsolatedQuerySpace, injector:Injector):TableDragActionService;\n}\n\n@Injectable()\nexport class TableDragActionsRegistryService {\n private register:ITableDragActionService[] = [\n HierarchyDragActionService,\n GroupByDragActionService,\n ];\n\n public add(service:ITableDragActionService) {\n this.register.push(service);\n }\n\n public get(injector:Injector):TableDragActionService {\n const querySpace = injector.get(IsolatedQuerySpace);\n\n const match = this.register\n .map((cls) => new cls(querySpace, injector))\n .find((instance) => instance.applies);\n\n return match || new TableDragActionService(querySpace, injector);\n }\n}\n","import {\n AfterViewInit, ChangeDetectorRef, Directive, Input, SimpleChanges,\n} from '@angular/core';\nimport {\n WorkPackageTableConfiguration,\n WorkPackageTableConfigurationObject,\n} from 'core-app/features/work-packages/components/wp-table/wp-table-configuration';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackagesViewBase } from 'core-app/features/work-packages/routing/wp-view-base/work-packages-view.base';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { WorkPackageStatesInitializationService } from '../../wp-list/wp-states-initialization.service';\n\n@Directive()\nexport abstract class WorkPackageEmbeddedBaseComponent extends WorkPackagesViewBase implements AfterViewInit {\n @Input('configuration') protected providedConfiguration:WorkPackageTableConfigurationObject;\n\n @Input() public uniqueEmbeddedTableName = `embedded-table-${Date.now()}`;\n\n @Input() public initialLoadingIndicator = true;\n\n public renderTable = false;\n\n public showTablePagination = false;\n\n public configuration:WorkPackageTableConfiguration;\n\n public error:string|null = null;\n\n protected initialized = false;\n\n @InjectField() apiV3Service:ApiV3Service;\n\n @InjectField() querySpace:IsolatedQuerySpace;\n\n @InjectField() I18n!:I18nService;\n\n @InjectField() urlParamsHelper:UrlParamsHelperService;\n\n @InjectField() loadingIndicatorService:LoadingIndicatorService;\n\n @InjectField() wpStatesInitialization:WorkPackageStatesInitializationService;\n\n @InjectField() currentProject:CurrentProjectService;\n\n @InjectField() cdRef:ChangeDetectorRef;\n\n ngOnInit() {\n this.configuration = new WorkPackageTableConfiguration(this.providedConfiguration);\n // Set embedded status in configuration\n this.configuration.isEmbedded = true;\n this.initialized = true;\n\n super.ngOnInit();\n }\n\n ngAfterViewInit():void {\n // Load initially\n this.loadQuery(true, false);\n }\n\n ngOnChanges(changes:SimpleChanges) {\n if (this.initialized && (changes.queryId || changes.queryProps)) {\n this.loadQuery(this.initialLoadingIndicator, false);\n }\n }\n\n public get projectIdentifier() {\n if (this.configuration.projectContext) {\n return this.currentProject.identifier || undefined;\n }\n return this.configuration.projectIdentifier || undefined;\n }\n\n public buildQueryProps() {\n const query = this.querySpace.query.value!;\n this.wpStatesInitialization.applyToQuery(query);\n\n return this.urlParamsHelper.buildV3GetQueryFromQueryResource(query);\n }\n\n public buildUrlParams() {\n const query = this.querySpace.query.value!;\n this.wpStatesInitialization.applyToQuery(query);\n\n return this.urlParamsHelper.encodeQueryJsonParams(query);\n }\n\n protected setLoaded() {\n this.renderTable = this.configuration.tableVisible;\n this.cdRef.detectChanges();\n }\n\n public refresh(visible = true, firstPage = false):Promise {\n const query = this.querySpace.query.value!;\n const pagination = this.wpTablePagination.paginationObject;\n\n if (firstPage) {\n pagination.offset = 1;\n }\n\n const params = this.urlParamsHelper.buildV3GetQueryFromQueryResource(query, pagination);\n const promise = this\n .wpListService\n .loadQueryFromExisting(query, params, this.queryProjectScope)\n .toPromise()\n .then((query) => this.wpStatesInitialization.updateQuerySpace(query, query.results));\n\n if (visible) {\n this.loadingIndicator = promise;\n }\n return promise;\n }\n\n public get isInitialized() {\n return !!this.configuration;\n }\n\n public set loadingIndicator(promise:Promise) {\n if (this.configuration.tableVisible) {\n this.loadingIndicatorService\n .indicator(this.uniqueEmbeddedTableName)\n .promise = promise;\n }\n }\n\n public abstract loadQuery(visible:boolean, firstPage:boolean):Promise;\n\n protected get queryProjectScope() {\n if (!this.configuration.projectContext) {\n return undefined;\n }\n return this.projectIdentifier;\n }\n\n protected initializeStates(query:QueryResource) {\n this.wpStatesInitialization.clearStates();\n this.wpStatesInitialization.initializeFromQuery(query, query.results);\n this.wpStatesInitialization.updateQuerySpace(query, query.results);\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","import {\n AfterViewInit, Component, EventEmitter, Input, OnDestroy, OnInit, Output,\n} from '@angular/core';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageViewPaginationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-pagination.service';\nimport { OpTableActionFactory } from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { OpTableActionsService } from 'core-app/features/work-packages/components/wp-table/table-actions/table-actions.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { WpTableConfigurationModalComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { WorkPackageEmbeddedBaseComponent } from 'core-app/features/work-packages/components/wp-table/embedded/wp-embedded-base.component';\nimport { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';\nimport {\n distinctUntilChanged, map, take, withLatestFrom,\n} from 'rxjs/operators';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { KeepTabService } from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Component({\n selector: 'wp-embedded-table',\n templateUrl: './wp-embedded-table.html',\n})\nexport class WorkPackageEmbeddedTableComponent extends WorkPackageEmbeddedBaseComponent implements OnInit, AfterViewInit, OnDestroy {\n @Input('queryId') public queryId?:string;\n\n @Input('queryProps') public queryProps:any = {};\n\n @Input() public tableActions:OpTableActionFactory[] = [];\n\n @Input() public externalHeight = false;\n\n /** Inform about loading errors */\n @Output() public onError = new EventEmitter();\n\n /** Inform about loaded query */\n @Output() public onQueryLoaded = new EventEmitter();\n\n @InjectField() apiv3Service:ApiV3Service;\n\n @InjectField() opModalService:OpModalService;\n\n @InjectField() tableActionsService:OpTableActionsService;\n\n @InjectField() wpTableTimeline:WorkPackageViewTimelineService;\n\n @InjectField() wpTablePagination:WorkPackageViewPaginationService;\n\n @InjectField() keepTab:KeepTabService;\n\n // Cache the form promise\n private formPromise:Promise|undefined;\n\n // If the query was provided to use via the query space,\n // use it to cache first loading\n private loadedQuery:QueryResource|undefined;\n\n ngOnInit() {\n super.ngOnInit();\n this.loadedQuery = this.querySpace.query.value;\n }\n\n ngAfterViewInit():void {\n super.ngAfterViewInit();\n\n // Provision embedded table actions\n if (this.tableActions) {\n this.tableActionsService.setActions(...this.tableActions);\n }\n\n // Reload results on changes to pagination (Regression #29845)\n this.wpTablePagination\n .updates$()\n .pipe(\n map((pagination) => [pagination.page, pagination.perPage]),\n distinctUntilChanged(),\n this.untilDestroyed(),\n withLatestFrom(this.querySpace.query.values$()),\n ).subscribe(([_, query]) => {\n const pagination = this.wpTablePagination.paginationObject;\n const params = this.urlParamsHelper.buildV3GetQueryFromQueryResource(query, pagination);\n\n this.loadingIndicator = this\n .wpListService\n .loadQueryFromExisting(query, params, this.queryProjectScope)\n .toPromise()\n .then((query) => this.initializeStates(query));\n });\n }\n\n public async openConfigurationModal(onUpdated:() => void):Promise {\n await this.querySpace.query.valuesPromise();\n\n this.opModalService\n .show(WpTableConfigurationModalComponent, this.injector)\n // Detach this component when the modal closes and pass along the query data\n .subscribe((modal) => modal.onDataUpdated.subscribe(onUpdated));\n }\n\n protected initializeStates(query:QueryResource) {\n void this.loadForm(query);\n super.initializeStates(query);\n\n this.querySpace\n .initialized\n .values$()\n .pipe(take(1))\n .subscribe(() => {\n this.showTablePagination = query.results.total > query.results.count;\n this.setLoaded();\n\n // Disable compact mode when timeline active\n if (this.wpTableTimeline.isVisible) {\n this.configuration = { ...this.configuration, compactTableStyle: false };\n }\n });\n }\n\n private loadForm(query:QueryResource):Promise {\n if (this.formPromise) {\n return this.formPromise;\n }\n\n return this.formPromise = this\n .apiv3Service\n .withOptionalProject(this.projectIdentifier)\n .queries\n .form\n .load(query)\n .toPromise()\n .then(([form, _]) => {\n this.wpStatesInitialization.updateStatesFromForm(query, form);\n return form;\n })\n .catch(() => this.formPromise = undefined);\n }\n\n public loadQuery(visible = true, firstPage = false):Promise {\n // Ensure we are loading the form.\n this.formPromise = undefined;\n\n if (this.loadedQuery) {\n const query = this.loadedQuery;\n this.loadedQuery = undefined;\n this.initializeStates(query);\n return Promise.resolve(this.loadedQuery!);\n }\n\n // HACK: Decrease loading time of queries when results are not needed.\n // We should allow the backend to disable results embedding instead.\n if (!this.configuration.tableVisible) {\n this.queryProps.pageSize = 1;\n }\n\n // Set first page\n if (firstPage) {\n this.queryProps.page = 1;\n }\n\n this.error = null;\n const promise = this\n .apiv3Service\n .queries\n .find(\n this.queryProps,\n this.queryId,\n this.queryProjectScope,\n )\n .toPromise()\n .then((query:QueryResource) => {\n this.initializeStates(query);\n this.onQueryLoaded.emit(query);\n return query;\n })\n .catch((error) => {\n this.error = this.I18n.t(\n 'js.error.embedded_table_loading',\n { message: _.get(error, 'message', error) },\n );\n this.onError.emit(error);\n });\n\n if (visible) {\n this.loadingIndicator = promise;\n }\n\n return promise;\n }\n\n handleWorkPackageClicked(event:{ workPackageId:string; double:boolean }) {\n if (event.double) {\n this.$state.go(\n 'work-packages.show',\n { workPackageId: event.workPackageId },\n );\n }\n }\n\n openStateLink(event:{ workPackageId:string; requestedState:'show'|'split' }) {\n const params = {\n workPackageId: event.workPackageId,\n focus: true,\n };\n\n if (event.requestedState === 'split') {\n this.keepTab.goCurrentDetailsState(params);\n } else {\n this.keepTab.goCurrentShowState(params);\n }\n }\n}\n","import {\n AfterViewInit, ChangeDetectorRef, Component, Inject, OnInit, ViewChild,\n} from '@angular/core';\nimport { WorkPackageEmbeddedTableComponent } from 'core-app/features/work-packages/components/wp-table/embedded/wp-embedded-table.component';\nimport { WpTableConfigurationService } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.service';\nimport { RestrictedWpTableConfigurationService } from 'core-app/features/work-packages/components/wp-table/external-configuration/restricted-wp-table-configuration.service';\nimport { OpQueryConfigurationLocalsToken } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.constants';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\n\nexport interface QueryConfigurationLocals {\n service:any;\n currentQuery:any;\n urlParams?:boolean;\n disabledTabs?:{ [key:string]:string };\n callback:(newQuery:any) => void;\n}\n\n@Component({\n templateUrl: './external-query-configuration.template.html',\n providers: [[{ provide: WpTableConfigurationService, useClass: RestrictedWpTableConfigurationService }]],\n})\nexport class ExternalQueryConfigurationComponent implements OnInit, AfterViewInit {\n @ViewChild('embeddedTableForConfiguration', { static: true }) private embeddedTable:WorkPackageEmbeddedTableComponent;\n\n queryProps:string;\n\n constructor(@Inject(OpQueryConfigurationLocalsToken) readonly locals:QueryConfigurationLocals,\n readonly urlParamsHelper:UrlParamsHelperService,\n readonly cdRef:ChangeDetectorRef) {\n }\n\n ngOnInit() {\n if (this.locals.urlParams) {\n this.queryProps = this.urlParamsHelper.buildV3GetQueryFromJsonParams(this.locals.currentQuery);\n } else {\n this.queryProps = this.locals.currentQuery;\n }\n }\n\n ngAfterViewInit() {\n // Open the configuration modal in an asynchronous step\n // to avoid nesting components in the view initialization.\n setTimeout(() => {\n this.embeddedTable.openConfigurationModal(() => {\n this.service.detach();\n if (this.locals.urlParams) {\n this.locals.callback(this.embeddedTable.buildUrlParams());\n } else {\n this.locals.callback(this.embeddedTable.buildQueryProps());\n }\n });\n this.cdRef.detectChanges();\n });\n }\n\n public get service():any {\n return this.locals.service;\n }\n}\n","\n \n \n\n","import { InjectionToken } from '@angular/core';\n\nexport const OpQueryConfigurationLocalsToken = new InjectionToken('OpQueryConfigurationLocalsToken');\n","import {\n ApplicationRef, ComponentFactoryResolver, Injectable, Injector,\n} from '@angular/core';\nimport { ComponentPortal, DomPortalOutlet, PortalInjector } from '@angular/cdk/portal';\nimport { TransitionService } from '@uirouter/core';\nimport { FocusHelperService } from 'core-app/shared/directives/focus/focus-helper';\nimport {\n ExternalQueryConfigurationComponent,\n QueryConfigurationLocals,\n} from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.component';\nimport { OpQueryConfigurationLocalsToken } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.constants';\n\nexport type Class = { new(...args:any[]):any; };\n\n@Injectable()\nexport class ExternalQueryConfigurationService {\n // Hold a reference to the DOM node we're using as a host\n private _portalHostElement:HTMLElement;\n\n // And a reference to the actual portal host interface on top of the element\n private _bodyPortalHost:DomPortalOutlet;\n\n constructor(private componentFactoryResolver:ComponentFactoryResolver,\n readonly FocusHelper:FocusHelperService,\n private appRef:ApplicationRef,\n private $transitions:TransitionService,\n private injector:Injector) {\n }\n\n /**\n * Create a portal host element to contain the table configuration components.\n */\n private get bodyPortalHost() {\n if (!this._portalHostElement) {\n const hostElement = this._portalHostElement = document.createElement('div');\n hostElement.classList.add('op-external-query-configuration--container');\n document.body.appendChild(hostElement);\n\n this._bodyPortalHost = new DomPortalOutlet(\n hostElement,\n this.componentFactoryResolver,\n this.appRef,\n this.injector,\n );\n }\n\n return this._bodyPortalHost;\n }\n\n /**\n * Open a Modal reference and append it to the portal\n */\n public show(data:Partial) {\n this.detach();\n\n // Create a portal for the given component class and render it\n const portal = new ComponentPortal(\n this.externalQueryConfigurationComponent(),\n null,\n this.injectorFor(data),\n );\n this.bodyPortalHost.attach(portal);\n this._portalHostElement.style.display = 'block';\n }\n\n /**\n * Closes currently open modal window\n */\n public detach() {\n // Detach any component currently in the portal\n if (this.bodyPortalHost.hasAttached()) {\n this.bodyPortalHost.detach();\n this._portalHostElement.style.display = 'none';\n }\n }\n\n /**\n * Create an augmented injector that is equal to this service's injector + the additional data\n * passed into +show+.\n * This allows callers to pass data into the newly created modal.\n *\n */\n private injectorFor(data:any) {\n const injectorTokens = new WeakMap();\n // Pass the service because otherwise we're getting a cyclic dependency between the portal\n // host service and the bound portal\n data.service = this;\n\n injectorTokens.set(OpQueryConfigurationLocalsToken, data);\n\n return new PortalInjector(this.injector, injectorTokens);\n }\n\n externalQueryConfigurationComponent():Class {\n return ExternalQueryConfigurationComponent;\n }\n}\n","
\n
\n \n &ngsp;\n \n
\n
\n","import {\n Component,\n Injector,\n OnInit,\n} from '@angular/core';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { QueryFilterResource } from 'core-app/features/hal/resources/query-filter-resource';\nimport { QueryOperatorResource } from 'core-app/features/hal/resources/query-operator-resource';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\n\n@Component({\n templateUrl: './wp-table-configuration-relation-selector.html',\n selector: 'wp-table-configuration-relation-selector',\n})\nexport class WpTableConfigurationRelationSelectorComponent implements OnInit {\n private relationFilterIds:string[] = [\n 'parent',\n 'precedes',\n 'follows',\n 'relates',\n 'duplicates',\n 'duplicated',\n 'blocks',\n 'blocked',\n 'partof',\n 'includes',\n 'requires',\n 'required',\n ];\n\n public availableRelationFilters:QueryFilterResource[] = [];\n\n public selectedRelationFilter:QueryFilterResource|undefined = undefined;\n\n public text = {\n filter_work_packages_by_relation_type: this.I18n.t('js.work_packages.table_configuration.relation_filters.filter_work_packages_by_relation_type'),\n please_select: this.I18n.t('js.placeholders.selection'),\n // We need to inverse the translation strings, as the filters's are named the other way around than what\n // a user knows from the relations tab:\n parent: this.I18n.t('js.relation_labels.children'),\n precedes: this.I18n.t('js.relation_labels.follows'),\n follows: this.I18n.t('js.relation_labels.precedes'),\n relates: this.I18n.t('js.relation_labels.relates'),\n duplicates: this.I18n.t('js.relation_labels.duplicated'),\n duplicated: this.I18n.t('js.relation_labels.duplicates'),\n blocks: this.I18n.t('js.relation_labels.blocked'),\n blocked: this.I18n.t('js.relation_labels.blocks'),\n requires: this.I18n.t('js.relation_labels.required'),\n required: this.I18n.t('js.relation_labels.requires'),\n partof: this.I18n.t('js.relation_labels.includes'),\n includes: this.I18n.t('js.relation_labels.partof'),\n };\n\n constructor(readonly injector:Injector,\n readonly I18n:I18nService,\n readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly ConfigurationService:ConfigurationService,\n readonly schemaCache:SchemaCacheService) {\n }\n\n ngOnInit() {\n const self:WpTableConfigurationRelationSelectorComponent = this;\n\n this.wpTableFilters\n .onReady()\n .then(() => {\n self.availableRelationFilters = self.relationFiltersOf(self.wpTableFilters.availableFilters) as QueryFilterResource[];\n self.setSelectedRelationFilter();\n });\n }\n\n private setSelectedRelationFilter():void {\n const currentRelationFilters:QueryFilterInstanceResource[] = this.relationFiltersOf(this.wpTableFilters.current) as QueryFilterInstanceResource[];\n if (currentRelationFilters.length > 0) {\n this.selectedRelationFilter = _.find(this.availableRelationFilters, { id: currentRelationFilters[0].id }) as QueryFilterResource;\n } else {\n this.selectedRelationFilter = this.availableRelationFilters[0];\n }\n this.onRelationFilterSelected();\n }\n\n public onRelationFilterSelected() {\n if (this.selectedRelationFilter) {\n this.removeRelationFiltersFromCurrentState();\n this.addFilterToCurrentState(this.selectedRelationFilter);\n }\n }\n\n private removeRelationFiltersFromCurrentState() {\n const filtersToRemove = this.relationFiltersOf(this.wpTableFilters.current) as QueryFilterInstanceResource[];\n this.wpTableFilters.remove(...filtersToRemove);\n }\n\n private relationFiltersOf(filters:QueryFilterResource[]|QueryFilterInstanceResource[]):QueryFilterResource[]|QueryFilterInstanceResource[] {\n return _.filter(filters, (filter:QueryFilterResource|QueryFilterInstanceResource) => _.includes(this.relationFilterIds, filter.id));\n }\n\n private addFilterToCurrentState(filter:QueryFilterResource):void {\n const newFilter = this.wpTableFilters.instantiate(filter);\n const operator:QueryOperatorResource = this.getOperatorForId(newFilter, '=');\n newFilter.operator = operator;\n newFilter.values = [{ href: '/api/v3/work_packages/{id}' }] as HalResource[];\n\n this.wpTableFilters.add(newFilter);\n }\n\n private getOperatorForId(filter:QueryFilterResource, id:string):QueryOperatorResource {\n return _.find(this.schemaCache.of(filter).availableOperators, { id }) as QueryOperatorResource;\n }\n\n public compareRelationFilters(f1:undefined|QueryFilterResource, f2:undefined|QueryFilterResource):boolean {\n return f1 && f2 ? f1.id === f2.id : f1 === f2;\n }\n}\n","import {\n Component,\n} from '@angular/core';\nimport { WpTableConfigurationService } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.service';\nimport { RestrictedWpTableConfigurationService } from 'core-app/features/work-packages/components/wp-table/external-configuration/restricted-wp-table-configuration.service';\nimport { WpTableConfigurationRelationSelectorComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration-relation-selector';\nimport { WpTableConfigurationModalPrependToken } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\nimport { ExternalQueryConfigurationComponent } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.component';\n\n@Component({\n templateUrl: './external-query-configuration.template.html',\n providers: [\n [\n { provide: WpTableConfigurationService, useClass: RestrictedWpTableConfigurationService },\n ],\n { provide: WpTableConfigurationModalPrependToken, useValue: WpTableConfigurationRelationSelectorComponent },\n ],\n})\nexport class ExternalRelationQueryConfigurationComponent extends ExternalQueryConfigurationComponent {\n}\n","import { Injectable } from '@angular/core';\nimport {\n Class,\n ExternalQueryConfigurationService,\n} from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.service';\nimport { ExternalRelationQueryConfigurationComponent } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.component';\n\n@Injectable()\nexport class ExternalRelationQueryConfigurationService extends ExternalQueryConfigurationService {\n externalQueryConfigurationComponent():Class {\n return ExternalRelationQueryConfigurationComponent;\n }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TabInterface } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { WpTableConfigurationService } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.service';\nimport { QueryConfigurationLocals } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.component';\nimport { OpQueryConfigurationLocalsToken } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.constants';\n\n@Injectable()\nexport class RestrictedWpTableConfigurationService extends WpTableConfigurationService {\n constructor(@Inject(OpQueryConfigurationLocalsToken) readonly locals:QueryConfigurationLocals,\n readonly I18n:I18nService) {\n super(I18n);\n }\n\n public get tabs():TabInterface[] {\n const disabledTabs = this.locals.disabledTabs || {};\n\n return this\n ._tabs\n .map((el) => {\n const reason = disabledTabs[el.id];\n if (reason != null) {\n el.disable = reason;\n }\n\n return el;\n });\n }\n}\n","import {\n contextColumnIcon,\n OpTableAction,\n OpTableActionFactory,\n} from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { opIconElement } from 'core-app/shared/helpers/op-icon-builder';\nimport { Injector } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\nexport class OpUnlinkTableAction extends OpTableAction {\n constructor(public injector:Injector,\n public workPackage:WorkPackageResource,\n public readonly identifier:string,\n private title:string,\n readonly applicable:(workPackage:WorkPackageResource) => boolean,\n readonly onClick:(workPackage:WorkPackageResource) => void) {\n super(injector, workPackage);\n }\n\n /**\n * Returns a factory for this action with the given title and identifier for reusing\n * remove actions.\n *\n * @param {string} identifier\n * @param {string} title\n */\n public static factoryFor(identifier:string,\n title:string,\n onClick:(workPackage:WorkPackageResource) => void,\n applicable:(workPackage:WorkPackageResource) => boolean = () => true):OpTableActionFactory {\n return (injector:Injector, workPackage:WorkPackageResource) => new OpUnlinkTableAction(injector,\n workPackage,\n identifier,\n title,\n applicable,\n onClick) as OpTableAction;\n }\n\n public buildElement() {\n if (!this.applicable(this.workPackage)) {\n return null;\n }\n\n const element = document.createElement('a');\n element.title = this.title;\n element.href = '#';\n element.classList.add(contextColumnIcon, 'wp-table-action--unlink');\n element.dataset.workPackageId = this.workPackage.id!;\n element.appendChild(opIconElement('icon', 'icon-close'));\n jQuery(element).click((event) => {\n event.preventDefault();\n this.onClick(this.workPackage);\n });\n\n return element;\n }\n}\n","import { Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport type OpTableActionFactory = (i:Injector, wp:WorkPackageResource) => OpTableAction;\nexport const contextMenuTdClassName = 'wp-table--context-menu-td';\nexport const contextMenuSpanClassName = 'wp-table--context-menu-span';\nexport const contextMenuLinkClassName = 'wp-table-context-menu-link';\nexport const contextColumnIcon = 'wp-table-context-menu-icon';\n\nexport abstract class OpTableAction {\n @InjectField() I18n!:I18nService;\n\n constructor(readonly injector:Injector,\n readonly workPackage:WorkPackageResource) {\n }\n\n /** Identifier to uniquely identify the action */\n public abstract readonly identifier:string;\n\n /** The actual action factory to return the action element, if it can be rendered */\n public abstract buildElement():HTMLElement|null;\n}\n","import { contextColumnIcon, OpTableAction } from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { opIconElement } from 'core-app/shared/helpers/op-icon-builder';\n\nimport { KeepTabService } from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\nimport { UiStateLinkBuilder } from 'core-app/features/work-packages/components/wp-fast-table/builders/ui-state-link-builder';\nimport { StateService } from '@uirouter/core';\n\nexport const detailsLinkClassName = 'wp-table--details-link';\n\nexport class OpDetailsTableAction extends OpTableAction {\n public readonly identifier = 'open-details-action';\n\n private uiStatebuilder = new UiStateLinkBuilder(this.injector.get(StateService), this.injector.get(KeepTabService));\n\n private text = {\n button: this.I18n.t('js.button_open_details'),\n };\n\n public buildElement() {\n // Append details button\n const detailsLink = this.uiStatebuilder.linkToDetails(\n this.workPackage.id!,\n this.text.button,\n '',\n );\n\n detailsLink.classList.add(detailsLinkClassName, contextColumnIcon, 'hidden-for-mobile');\n detailsLink.appendChild(opIconElement('icon', 'icon-info2'));\n\n return detailsLink;\n }\n}\n","import {\n contextColumnIcon,\n contextMenuLinkClassName,\n OpTableAction,\n} from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { opIconElement } from 'core-app/shared/helpers/op-icon-builder';\n\nexport class OpContextMenuTableAction extends OpTableAction {\n public readonly identifier = 'open-context-menu-action';\n\n private text = {\n linkTitle: this.I18n.t('js.label_open_context_menu'),\n };\n\n public buildElement() {\n const contextMenu = document.createElement('a');\n contextMenu.href = '#';\n contextMenu.classList.add(contextMenuLinkClassName, contextColumnIcon);\n contextMenu.title = this.text.linkTitle;\n contextMenu.appendChild(opIconElement('icon', 'icon-show-more-horizontal'));\n\n return contextMenu;\n }\n}\n","import { Injectable, Injector } from '@angular/core';\nimport {\n OpTableActionFactory,\n} from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { OpDetailsTableAction } from 'core-app/features/work-packages/components/wp-table/table-actions/actions/details-table-action';\nimport { OpContextMenuTableAction } from 'core-app/features/work-packages/components/wp-table/table-actions/actions/context-menu-table-action';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\n@Injectable()\nexport class OpTableActionsService {\n constructor(private readonly injector:Injector) {\n }\n\n /**\n * Actions currently registered\n */\n private actions:OpTableActionFactory[] = [\n (injector, workPackage) => new OpDetailsTableAction(injector, workPackage),\n (injector, workPackage) => new OpContextMenuTableAction(injector, workPackage),\n ];\n\n /**\n * Replace the actions with a different set\n */\n public setActions(...actions:OpTableActionFactory[]) {\n this.actions = actions;\n }\n\n /**\n * Render actions for the given work package.\n * @param {WorkPackageResource} workPackage\n */\n public render(workPackage:WorkPackageResource):HTMLElement[] {\n const built = this.actions.map((factory) => factory(this.injector, workPackage).buildElement());\n return _.compact(built);\n }\n}\n","
\n \n\n
\n
    \n
  • \n\n
  • \n\n \n \n \n\n {{ perPageOption }}\n
  • \n
\n
\n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { PaginationInstance } from 'core-app/shared/components/table-pagination/pagination-instance';\nimport { IPaginationOptions, PaginationService } from './pagination-service';\n\n@Component({\n selector: '[tablePagination]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './table-pagination.component.html',\n})\nexport class TablePaginationComponent extends UntilDestroyedMixin implements OnInit {\n @Input() totalEntries:string;\n\n @Input() hideForSinglePageResults = false;\n\n @Input() showPerPage = true;\n\n @Input() showPageSelections = true;\n\n @Input() infoText?:string;\n\n @Output() updateResults = new EventEmitter();\n\n public pagination:PaginationInstance;\n\n public text = {\n label_previous: this.I18n.t('js.pagination.pages.previous'),\n label_next: this.I18n.t('js.pagination.pages.next'),\n per_page: this.I18n.t('js.label_per_page'),\n no_other_page: this.I18n.t('js.pagination.no_other_page'),\n };\n\n public currentRange = '';\n\n public pageNumbers:number[] = [];\n\n public postPageNumbers:number[] = [];\n\n public prePageNumbers:number[] = [];\n\n public perPageOptions:number[] = [];\n\n constructor(protected paginationService:PaginationService,\n protected cdRef:ChangeDetectorRef,\n protected I18n:I18nService) {\n super();\n }\n\n ngOnInit():void {\n this.paginationService\n .loadPaginationOptions()\n .then((paginationOptions:IPaginationOptions) => {\n this.perPageOptions = paginationOptions.perPageOptions;\n this.pagination = new PaginationInstance(1, parseInt(this.totalEntries), paginationOptions.perPage);\n this.cdRef.detectChanges();\n });\n }\n\n public update() {\n this.updateCurrentRangeLabel();\n this.updatePageNumbers();\n this.cdRef.detectChanges();\n }\n\n public selectPerPage(perPage:number) {\n this.pagination.perPage = perPage;\n this.paginationService.setPerPage(perPage);\n this.showPage(1);\n }\n\n public showPage(page:number) {\n this.pagination.page = page;\n\n this.updateCurrentRangeLabel();\n this.updatePageNumbers();\n\n this.onUpdatedPage();\n this.cdRef.detectChanges();\n }\n\n public onUpdatedPage() {\n this.updateResults.emit(this.pagination);\n }\n\n public get isVisible() {\n return !this.hideForSinglePageResults || (this.pagination.total > this.pagination.perPage);\n }\n\n /**\n * @name updateCurrentRange\n *\n * @description Defines a string containing page bound information inside the directive scope\n */\n public updateCurrentRangeLabel() {\n if (this.pagination.total) {\n const totalItems = this.pagination.total;\n const lowerBound = this.pagination.getLowerPageBound();\n const upperBound = this.pagination.getUpperPageBound(this.pagination.total);\n\n this.currentRange = `(${lowerBound} - ${upperBound}/${totalItems})`;\n } else {\n this.currentRange = '(0 - 0/0)';\n }\n }\n\n /**\n * @name updatePageNumbers\n *\n * @description Defines a list of all pages in numerical order inside the scope\n */\n public updatePageNumbers() {\n if (!this.showPageSelections) {\n this.pageNumbers = [];\n this.postPageNumbers = [];\n return;\n }\n\n const maxVisible = this.paginationService.getMaxVisiblePageOptions();\n const truncSize = this.paginationService.getOptionsTruncationSize();\n\n const pageNumbers = [];\n\n const { perPage } = this.pagination;\n const currentPage = this.pagination.page;\n if (perPage) {\n for (let i = 1; i <= Math.ceil(this.pagination.total / perPage); i++) {\n pageNumbers.push(i);\n }\n\n // This avoids a truncation when there are not enough elements to truncate for the first elements\n const startingDiff = currentPage - 2 * truncSize;\n if (startingDiff >= 0 && startingDiff <= 1) {\n this.postPageNumbers = this.truncatePageNums(pageNumbers, pageNumbers.length >= maxVisible + (truncSize * 2), maxVisible + truncSize, pageNumbers.length, 0);\n } else {\n this.prePageNumbers = this.truncatePageNums(pageNumbers, currentPage >= maxVisible, 0, Math.min(currentPage - Math.ceil(maxVisible / 2), pageNumbers.length - maxVisible), truncSize);\n this.postPageNumbers = this.truncatePageNums(pageNumbers, pageNumbers.length >= maxVisible + (truncSize * 2), maxVisible, pageNumbers.length, 0);\n }\n }\n\n this.pageNumbers = pageNumbers;\n }\n\n public showPerPageOptions() {\n return this.showPerPage\n && this.perPageOptions.length > 0\n && this.pagination.total > this.perPageOptions[0];\n }\n\n private truncatePageNums(pageNumbers:any, perform:any, disectFrom:any, disectLength:any, truncateFrom:any) {\n if (perform) {\n const truncationSize = this.paginationService.getOptionsTruncationSize();\n const truncatedNums = pageNumbers.splice(disectFrom, disectLength);\n if (truncatedNums.length >= truncationSize * 2) {\n truncatedNums.splice(truncateFrom, truncatedNums.length - truncationSize);\n }\n return truncatedNums;\n }\n return [];\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageViewPaginationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-pagination.service';\nimport { WorkPackageViewPagination } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-pagination';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { combineLatest } from 'rxjs';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { TablePaginationComponent } from 'core-app/shared/components/table-pagination/table-pagination.component';\nimport { IPaginationOptions, PaginationService } from 'core-app/shared/components/table-pagination/pagination-service';\n\n@Component({\n templateUrl: '../../../../../shared/components/table-pagination/table-pagination.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'wp-table-pagination',\n})\nexport class WorkPackageTablePaginationComponent extends TablePaginationComponent implements OnInit, OnDestroy {\n constructor(protected paginationService:PaginationService,\n protected cdRef:ChangeDetectorRef,\n protected wpTablePagination:WorkPackageViewPaginationService,\n readonly querySpace:IsolatedQuerySpace,\n readonly wpTableSortBy:WorkPackageViewSortByService,\n readonly I18n:I18nService) {\n super(paginationService, cdRef, I18n);\n }\n\n ngOnInit() {\n this.paginationService\n .loadPaginationOptions()\n .then((paginationOptions:IPaginationOptions) => {\n this.perPageOptions = paginationOptions.perPageOptions;\n this.cdRef.detectChanges();\n });\n\n this.wpTablePagination\n .live$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wpPagination:WorkPackageViewPagination) => {\n this.pagination = wpPagination.current;\n this.update();\n });\n\n // hide/show pagination options depending on the sort mode\n combineLatest([\n this.querySpace.query.values$(),\n this.wpTableSortBy.live$(),\n ]).pipe(\n this.untilDestroyed(),\n ).subscribe(([query, sort]) => {\n this.showPerPage = this.showPageSelections = !this.isManualSortingMode;\n this.infoText = this.paginationInfoText(query.results);\n\n this.update();\n });\n }\n\n public selectPerPage(perPage:number) {\n this.paginationService.setPerPage(perPage);\n this.wpTablePagination.updateFromObject({ page: 1, perPage });\n }\n\n public showPage(pageNumber:number) {\n this.wpTablePagination.updateFromObject({ page: pageNumber });\n }\n\n private get isManualSortingMode() {\n return this.wpTableSortBy.isManualSortingMode;\n }\n\n public paginationInfoText(work_packages:WorkPackageCollectionResource) {\n if (this.isManualSortingMode && (work_packages.count < work_packages.total)) {\n return I18n.t('js.work_packages.limited_results',\n { count: work_packages.count });\n }\n return undefined;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport * as moment from 'moment';\nimport { InputState, MultiInputState } from 'reactivestates';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { TimelineZoomLevel } from 'core-app/features/hal/resources/query-resource';\nimport Moment = moment.Moment;\n\nexport const timelineElementCssClass = 'timeline-element';\nexport const timelineBackgroundElementClass = 'timeline-element--bg';\nexport const timelineGridElementCssClass = 'wp-timeline--grid-element';\nexport const timelineMarkerSelectionStartClass = 'selection-start';\nexport const timelineHeaderCSSClass = 'wp-timeline--header-element';\nexport const timelineHeaderSelector = 'wp-timeline-header';\n\n/**\n *\n */\nexport class TimelineViewParametersSettings {\n zoomLevel:TimelineZoomLevel = 'days';\n}\n\n// Can't properly map the enum to a string array\nexport const zoomLevelOrder:TimelineZoomLevel[] = [\n 'days', 'weeks', 'months', 'quarters', 'years',\n];\n\nexport function getPixelPerDayForZoomLevel(zoomLevel:TimelineZoomLevel) {\n switch (zoomLevel) {\n case 'days':\n return 30;\n case 'weeks':\n return 15;\n case 'months':\n return 6;\n case 'quarters':\n return 2;\n case 'years':\n return 0.5;\n }\n throw new Error(`invalid zoom level: ${zoomLevel}`);\n}\n\n/**\n * Number of pixels to display before the earliest workpackage in view\n */\nexport const requiredPixelMarginLeft = 120;\n\n/**\n *\n */\nexport class TimelineViewParameters {\n readonly now:Moment = moment({ hour: 0, minute: 0, seconds: 0 });\n\n dateDisplayStart:Moment = moment({ hour: 0, minute: 0, seconds: 0 });\n\n dateDisplayEnd:Moment = this.dateDisplayStart.clone().add(1, 'day');\n\n settings:TimelineViewParametersSettings = new TimelineViewParametersSettings();\n\n activeSelectionMode:null | ((wp:WorkPackageResource) => any) = null;\n\n selectionModeStart:null | string = null;\n\n /**\n * The visible viewport (at the time the view parameters were calculated last!!!)\n */\n visibleViewportAtCalculationTime:[Moment, Moment];\n\n get pixelPerDay():number {\n return getPixelPerDayForZoomLevel(this.settings.zoomLevel);\n }\n\n get maxWidthInPx() {\n return this.maxSteps * this.pixelPerDay;\n }\n\n get maxSteps():number {\n return this.dateDisplayEnd.diff(this.dateDisplayStart, 'days');\n }\n\n get dayCountForMarginLeft():number {\n return Math.ceil(requiredPixelMarginLeft / this.pixelPerDay);\n }\n}\n\n/**\n *\n */\nexport interface RenderInfo {\n viewParams:TimelineViewParameters;\n workPackage:WorkPackageResource;\n change:WorkPackageChangeset;\n isDuplicatedCell?:boolean;\n withAlternativeLabels?:boolean;\n}\n\n/**\n *\n */\nexport function calculatePositionValueForDayCountingPx(viewParams:TimelineViewParameters, days:number):number {\n const daysInPx = days * viewParams.pixelPerDay;\n return daysInPx;\n}\n\n/**\n *\n */\nexport function calculatePositionValueForDayCount(viewParams:TimelineViewParameters, days:number):string {\n const value = calculatePositionValueForDayCountingPx(viewParams, days);\n return `${value}px`;\n}\n\nexport function getTimeSlicesForHeader(vp:TimelineViewParameters,\n unit:moment.unitOfTime.DurationConstructor,\n startView:Moment,\n endView:Moment) {\n const inViewport:[Moment, Moment][] = [];\n const rest:[Moment, Moment][] = [];\n\n const time = startView.clone().startOf(unit);\n const end = endView.clone().endOf(unit);\n\n while (time.isBefore(end)) {\n const sliceStart = moment.max(time, startView).clone();\n const sliceEnd = moment.min(time.clone().endOf(unit), endView).clone();\n time.add(1, unit);\n\n const viewport = vp.visibleViewportAtCalculationTime;\n if ((sliceStart.isSameOrAfter(viewport[0]) && sliceStart.isSameOrBefore(viewport[1]))\n || (sliceEnd.isSameOrAfter(viewport[0]) && sliceEnd.isSameOrBefore(viewport[1]))) {\n inViewport.push([sliceStart, sliceEnd]);\n } else {\n rest.push([sliceStart, sliceEnd]);\n }\n }\n\n const firstRest:[Moment, Moment] = rest.splice(0, 1)[0];\n const lastRest:[Moment, Moment] = rest.pop()!;\n const inViewportAndBoundaries = _.concat(\n [firstRest].filter((e) => !_.isNil(e)),\n inViewport,\n [lastRest].filter((e) => !_.isNil(e)),\n );\n\n return {\n inViewportAndBoundaries,\n rest,\n };\n}\n\nexport function calculateDaySpan(visibleWorkPackages:RenderedWorkPackage[],\n loadedWorkPackages:MultiInputState,\n viewParameters:TimelineViewParameters):number {\n let earliest:Moment = moment();\n let latest:Moment = moment();\n\n visibleWorkPackages.forEach((renderedRow) => {\n const wpId = renderedRow.workPackageId;\n\n if (!wpId) {\n return;\n }\n const workPackageState:InputState = loadedWorkPackages.get(wpId);\n const workPackage:WorkPackageResource|undefined = workPackageState.value;\n\n if (!workPackage) {\n return;\n }\n\n const start = workPackage.startDate ? workPackage.startDate : workPackage.date;\n if (start && moment(start).isBefore(earliest)) {\n earliest = moment(start);\n }\n\n const due = workPackage.dueDate ? workPackage.dueDate : workPackage.date;\n if (due && moment(due).isAfter(latest)) {\n latest = moment(due);\n }\n });\n\n const daysSpan = latest.diff(earliest, 'days') + 1;\n return daysSpan;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport type WorkPackageTableConfigurationObject = Partial<{ [field in keyof WorkPackageTableConfiguration]:string|boolean }>;\n\nexport class WorkPackageTableConfiguration {\n /** Render the table results, set to false when only wanting the table initialization */\n public tableVisible = true;\n\n /** Render the table as compact style */\n public compactTableStyle = false;\n\n /** Render the action column (last column) with the actions defined in the TableActionsService */\n public actionsColumnEnabled = true;\n\n /** Whether the work package context menu is enabled */\n public contextMenuEnabled = true;\n\n /** Whether the column dropdown menu is enabled */\n public columnMenuEnabled = true;\n\n /** Whether the query should be resolved using the current project identifier */\n public projectContext = true;\n\n /** Whether the embedded table should live within a specific project context (e.g., given by its parent) */\n public projectIdentifier:string|null = null;\n\n /** Whether inline create is enabled */\n public inlineCreateEnabled = true;\n\n /** Whether the hierarchy toggler item in the subject column is enabled */\n public hierarchyToggleEnabled = true;\n\n /** Whether this table supports drag and drop */\n public dragAndDropEnabled = false;\n\n /** Whether this table is in an embedded context */\n public isEmbedded = false;\n\n /** Whether the work packages shall be shown in cards instead of a table */\n public isCardView = false;\n\n /** Whether this table provides a UI for filters */\n public withFilters = false;\n\n /** Whether the filters are expanded */\n public filtersExpanded = false;\n\n /** Whether the button to open filters shall be visible */\n public showFilterButton = false;\n\n /** Whether this table provides a UI for filters */\n public filterButtonText:string = I18n.t('js.button_filter');\n\n constructor(providedConfig:WorkPackageTableConfigurationObject) {\n _.each(providedConfig, (value, k) => {\n const key = (k as keyof WorkPackageTableConfiguration);\n (this as any)[key] = value;\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport const selectorTableSide = '.work-packages-tabletimeline--table-side';\nexport const selectorTimelineSide = '.work-packages-tabletimeline--timeline-side';\nconst jQueryScrollSyncEventNamespace = '.scroll-sync';\nconst scrollStep = 15;\n\nfunction getXandYScrollDeltas(ev:WheelEvent):[number, number] {\n let x = ev.deltaX;\n let y = ev.deltaY;\n\n if (ev.shiftKey) {\n x = y;\n y = 0;\n }\n\n return [x, y];\n}\n\nfunction getPlattformAgnosticScrollAmount(originalValue:number) {\n if (originalValue === 0) {\n return originalValue;\n }\n\n let delta = scrollStep;\n\n // Browser-specific logic\n // TODO\n\n if (originalValue < 0) {\n delta *= -1;\n }\n return delta;\n}\n\nfunction syncWheelEvent(jev:JQuery.TriggeredEvent, elementTable:JQuery, elementTimeline:JQuery) {\n const scrollTarget = jev.target;\n const ev:WheelEvent = jev.originalEvent as any;\n let [deltaX, deltaY] = getXandYScrollDeltas(ev);\n\n if (deltaY === 0) {\n return;\n }\n\n deltaX = getPlattformAgnosticScrollAmount(deltaX); // apply only in target div\n deltaY = getPlattformAgnosticScrollAmount(deltaY); // apply in both divs\n\n window.requestAnimationFrame(() => {\n elementTable[0].scrollTop = elementTable[0].scrollTop + deltaY;\n elementTimeline[0].scrollTop = elementTable[0].scrollTop + deltaY;\n\n scrollTarget.scrollLeft += deltaX;\n });\n}\n\n/**\n * Activate or deactivate the scroll-sync between the table and timeline view.\n *\n * @param $element true if the timeline is visible, false otherwise.\n */\nexport function createScrollSync($element:JQuery) {\n const elTable = jQuery($element).find(selectorTableSide);\n const elTimeline = jQuery($element).find(selectorTimelineSide);\n\n return (timelineVisible:boolean) => {\n // state vars\n let syncedLeft = false;\n let syncedRight = false;\n\n if (timelineVisible) {\n // setup event listener for table\n elTable.on(`wheel${jQueryScrollSyncEventNamespace}`, (jev:JQuery.TriggeredEvent) => {\n syncWheelEvent(jev, elTable, elTimeline);\n });\n elTable.on(`scroll${jQueryScrollSyncEventNamespace}`, (ev:JQuery.TriggeredEvent) => {\n syncedLeft = true;\n if (!syncedRight) {\n elTimeline[0].scrollTop = ev.target.scrollTop;\n }\n if (syncedLeft && syncedRight) {\n syncedLeft = false;\n syncedRight = false;\n }\n });\n\n // setup event listener for timeline\n elTimeline.on(`wheel${jQueryScrollSyncEventNamespace}`, (jev:JQuery.TriggeredEvent) => {\n syncWheelEvent(jev, elTable, elTimeline);\n });\n elTimeline.on(`scroll${jQueryScrollSyncEventNamespace}`, (ev:JQuery.TriggeredEvent) => {\n syncedRight = true;\n if (!syncedLeft) {\n elTable[0].scrollTop = ev.target.scrollTop;\n }\n if (syncedLeft && syncedRight) {\n syncedLeft = false;\n syncedRight = false;\n }\n });\n } else {\n elTable.off(jQueryScrollSyncEventNamespace);\n }\n };\n}\n","import { Injector } from '@angular/core';\nimport { distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageViewHighlightingService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-highlighting.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport class HighlightingTransformer {\n @InjectField() public wpTableHighlighting:WorkPackageViewHighlightingService;\n\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n constructor(public readonly injector:Injector,\n table:WorkPackageTable) {\n this.wpTableHighlighting\n .updates$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n distinctUntilChanged(),\n )\n .subscribe(() => table.redrawTable());\n }\n}\n","import { Injector } from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { TableDragActionsRegistryService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-actions-registry.service';\nimport { TableDragActionService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-action.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { tableRowClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/rows/single-row-builder';\nimport { DragAndDropService } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.service';\nimport { reinsert } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.helpers';\nimport { WorkPackageViewOrderService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service';\nimport { BrowserDetector } from 'core-app/core/browser/browser-detector.service';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { isInsideCollapsedGroup } from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-row-helpers';\nimport { collapsedGroupClass } from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-hierarchy-helpers';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport class DragAndDropTransformer {\n @InjectField() private readonly states:States;\n\n @InjectField() private readonly querySpace:IsolatedQuerySpace;\n\n @InjectField() private readonly inlineCreateService:WorkPackageInlineCreateService;\n\n @InjectField() private readonly halNotification:HalResourceNotificationService;\n\n @InjectField() private readonly wpTableSortBy:WorkPackageViewSortByService;\n\n @InjectField() private readonly wpTableOrder:WorkPackageViewOrderService;\n\n @InjectField() private readonly browserDetector:BrowserDetector;\n\n @InjectField() private readonly apiV3Service:ApiV3Service;\n\n @InjectField() private readonly wpListService:WorkPackagesListService;\n\n @InjectField() private readonly dragActionRegistry:TableDragActionsRegistryService;\n\n @InjectField(DragAndDropService, null) private readonly dragService:DragAndDropService|null;\n\n constructor(public readonly injector:Injector,\n public table:WorkPackageTable) {\n // The DragService may not have been provided\n // in which case we do not provide drag and drop\n if (this.dragService === null) {\n return;\n }\n\n this.inlineCreateService.newInlineWorkPackageCreated\n .pipe(takeUntil(this.querySpace.stopAllSubscriptions))\n .subscribe(async (wpId) => {\n const newOrder = await this.wpTableOrder.add(this.currentOrder, wpId);\n this.updateRenderedOrder(newOrder);\n });\n\n this.querySpace.stopAllSubscriptions\n .pipe(take(1))\n .subscribe(() => {\n this.dragService!.remove(this.table.tbody);\n });\n\n this.dragService.register({\n dragContainer: this.table.tbody,\n scrollContainers: [this.table.scrollContainer],\n accepts: () => true,\n moves: (el:any, source:any, handle:HTMLElement) => {\n if (!handle.classList.contains('wp-table--drag-and-drop-handle')) {\n return false;\n }\n\n const wpId:string = el.dataset.workPackageId!;\n const workPackage = this.states.workPackages.get(wpId).value;\n return !!workPackage && this.actionService.canPickup(workPackage);\n },\n onMoved: async (el:HTMLElement, target:HTMLElement, source:HTMLElement, sibling:HTMLElement|null) => {\n const wpId:string = el.dataset.workPackageId!;\n let rowIndex;\n\n try {\n const workPackage = await this.apiV3Service.work_packages.id(wpId).get().toPromise();\n\n if (isInsideCollapsedGroup(sibling)) {\n const collapsedGroupCSSClass = Array.from(sibling!.classList).find((listClass) => listClass.includes(collapsedGroupClass()))!;\n const collapsedGroupId = collapsedGroupCSSClass.replace(collapsedGroupClass(), '');\n const collapsedGroupElements = source.getElementsByClassName(collapsedGroupClass(collapsedGroupId));\n const collapsedGroupLastChild = collapsedGroupElements[collapsedGroupElements.length - 1];\n rowIndex = this.findRowIndex(collapsedGroupLastChild as HTMLElement);\n } else {\n rowIndex = this.findRowIndex(el);\n }\n\n const newOrder = await this.wpTableOrder.move(this.currentOrder, wpId, rowIndex);\n\n await this.actionService.handleDrop(workPackage, el);\n this.updateRenderedOrder(newOrder);\n this.actionService.onNewOrder(newOrder);\n\n // Save the query when switching to manual\n const query = this.querySpace.query.value;\n if (query && this.wpTableSortBy.switchToManualSorting(query)) {\n await this.wpListService.createOrSave(query);\n }\n } catch (e) {\n this.halNotification.handleRawError(e);\n\n // Restore original element's styles\n this.actionService.changeShadowElement(el, true);\n // Restore element in from container\n reinsert(el, el.dataset.sourceIndex || -1, source);\n }\n },\n onRemoved: (el:HTMLElement) => {\n const wpId:string = el.dataset.workPackageId!;\n const newOrder = this.wpTableOrder.remove(this.currentOrder, wpId);\n this.updateRenderedOrder(newOrder);\n },\n onAdded: async (el:HTMLElement) => {\n const wpId:string = el.dataset.workPackageId!;\n const workPackage = await this.apiV3Service.work_packages.id(wpId).get().toPromise();\n const rowIndex = this.findRowIndex(el);\n\n return this.actionService\n .handleDrop(workPackage, el)\n .then(async () => {\n const newOrder = await this.wpTableOrder.add(this.currentOrder, wpId, rowIndex);\n this.updateRenderedOrder(newOrder);\n this.actionService.onNewOrder(newOrder);\n\n return true;\n })\n .catch(() => false);\n },\n onCloned: async (clone:HTMLElement, original:HTMLElement) => {\n // Replace clone with one TD of the subject\n const wpId:string = original.dataset.workPackageId!;\n const workPackage = await this.apiV3Service.work_packages.id(wpId).get().toPromise();\n\n const colspan = clone.children.length;\n const td = document.createElement('td');\n td.textContent = workPackage.subjectWithId();\n td.colSpan = colspan;\n td.classList.add('wp-table--cell-td', 'subject');\n\n clone.style.maxWidth = '500px';\n clone.innerHTML = td.outerHTML;\n },\n onShadowInserted: (el:HTMLElement) => {\n if (!this.browserDetector.isEdge) {\n this.actionService.changeShadowElement(el);\n }\n },\n onCancel: (el:HTMLElement) => {\n if (!this.browserDetector.isEdge) {\n this.actionService.changeShadowElement(el, true);\n }\n },\n });\n }\n\n /**\n * Update current rendered order\n */\n private async updateRenderedOrder(order:string[]) {\n order = _.uniq(order);\n\n const mappedOrder = await Promise.all(\n order.map(\n (wpId) => this.apiV3Service.work_packages.id(wpId).get().toPromise(),\n ),\n );\n\n /** Re-render the table */\n this.table.initialSetup(mappedOrder);\n }\n\n protected get actionService():TableDragActionService {\n return this.dragActionRegistry.get(this.injector);\n }\n\n protected get currentOrder():string[] {\n return this\n .currentRenderedOrder\n .map((row) => row.workPackageId!);\n }\n\n protected get currentRenderedOrder():RenderedWorkPackage[] {\n return this\n .querySpace\n .renderedWorkPackages\n .getValueOr([]);\n }\n\n /**\n * Find the index of the row in the set of rendered work packages.\n * This will skip non-work-package rows such as group headers\n * @param el\n */\n private findRowIndex(el:HTMLElement):number {\n const rows = Array.from(this.table.tbody.getElementsByClassName(tableRowClassName));\n return rows.indexOf(el) || 0;\n }\n}\n","import { Injector } from '@angular/core';\nimport { distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageViewCollapsedGroupsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-collapsed-groups.service';\n\nexport class GroupFoldTransformer {\n @InjectField() public workPackageViewCollapsedGroupsService:WorkPackageViewCollapsedGroupsService;\n\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n constructor(public readonly injector:Injector,\n table:WorkPackageTable) {\n this.workPackageViewCollapsedGroupsService\n .updates$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n distinctUntilChanged(),\n )\n .subscribe((groupsCollapseEvent) => table.setGroupsCollapseState(groupsCollapseEvent.state));\n }\n}\n","import { Injector } from '@angular/core';\nimport { displayClassName, editableClassName, readOnlyClassName } from 'core-app/shared/components/fields/display/display-field-renderer';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { getPosition } from 'core-app/shared/helpers/set-click-position/set-click-position';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport { States } from 'core-app/core/states/states.service';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { TableEventComponent, TableEventHandler } from '../table-handler-registry';\nimport { ClickOrEnterHandler } from '../click-or-enter-handler';\nimport { WorkPackageTable } from '../../wp-fast-table';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\n\nexport class EditCellHandler extends ClickOrEnterHandler implements TableEventHandler {\n // Injections\n @InjectField() public states:States;\n\n @InjectField() public halEditing:HalResourceEditingService;\n\n // Keep a reference to all\n\n public get EVENT() {\n return 'click.table.cell, keydown.table.cell';\n }\n\n public get SELECTOR() {\n return `.${displayClassName}.${editableClassName}`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tableAndTimelineContainer);\n }\n\n constructor(public readonly injector:Injector) {\n super();\n }\n\n protected processEvent(table:WorkPackageTable, evt:JQuery.TriggeredEvent):boolean {\n debugLog('Starting editing on cell: ', evt.target);\n evt.preventDefault();\n\n // Locate the cell from event\n const target = jQuery(evt.target).closest(`.${displayClassName}`);\n // Get the target field name\n const fieldName = target.data('fieldName');\n\n if (!fieldName) {\n debugLog('Click handled by cell not a field? ', evt.target);\n return true;\n }\n\n // Locate the row\n const rowElement = target.closest(`.${tableRowClassName}`);\n // Get the work package we're editing\n const workPackageId = rowElement.data('workPackageId');\n const workPackage = this.states.workPackages.get(workPackageId).value!;\n // Get the row context\n const classIdentifier = rowElement.data('classIdentifier');\n\n // Get any existing edit state for this work package\n const form = table.editing.startEditing(workPackage, classIdentifier);\n\n // Get the position where the user clicked.\n const positionOffset = getPosition(evt);\n\n // Activate the field\n form.activate(fieldName)\n .then((handler:EditFieldHandler) => {\n handler.$onUserActivate.next();\n handler.focus(positionOffset);\n })\n .catch(() => target.addClass(readOnlyClassName));\n\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageViewRelationColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-relation-columns.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { relationCellIndicatorClassName, relationCellTdClassName } from '../../builders/relation-cell-builder';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { WorkPackageTable } from '../../wp-fast-table';\nimport { ClickOrEnterHandler } from '../click-or-enter-handler';\nimport { TableEventComponent, TableEventHandler } from '../table-handler-registry';\n\nexport class RelationsCellHandler extends ClickOrEnterHandler implements TableEventHandler {\n // Injections\n @InjectField() wpTableRelationColumns:WorkPackageViewRelationColumnsService;\n\n public get EVENT() {\n return 'click.table.relationsCell, keydown.table.relationsCell';\n }\n\n public get SELECTOR() {\n return `.${relationCellIndicatorClassName}`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tableAndTimelineContainer);\n }\n\n constructor(public readonly injector:Injector) {\n super();\n }\n\n protected processEvent(table:WorkPackageTable, evt:JQuery.TriggeredEvent):boolean {\n debugLog('Handled click on relation cell %o', evt.target);\n evt.preventDefault();\n\n // Locate the relation td\n const td = jQuery(evt.target).closest(`.${relationCellTdClassName}`);\n const columnId = td.data('columnId');\n\n // Locate the row\n const rowElement = jQuery(evt.target).closest(`.${tableRowClassName}`);\n const workPackageId = rowElement.data('workPackageId');\n\n // If currently expanded\n if (this.wpTableRelationColumns.getExpandFor(workPackageId) === columnId) {\n this.wpTableRelationColumns.collapse(workPackageId);\n } else {\n this.wpTableRelationColumns.setExpandFor(workPackageId, columnId);\n }\n\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageAction } from 'core-app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { WorkPackageViewContextMenu } from 'core-app/shared/components/op-context-menu/wp-context-menu/wp-view-context-menu.directive';\nimport { WorkPackageViewHierarchyIdentationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy-indentation.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class WorkPackageTableContextMenu extends WorkPackageViewContextMenu {\n @InjectField() wpViewIndentation:WorkPackageViewHierarchyIdentationService;\n\n constructor(public injector:Injector,\n protected workPackageId:string,\n protected $element:JQuery,\n protected additionalPositionArgs:any = {},\n protected table:WorkPackageTable) {\n super(injector, workPackageId, $element, additionalPositionArgs, true);\n }\n\n public triggerContextMenuAction(action:WorkPackageAction) {\n switch (action.key) {\n case 'relation-precedes':\n this.table.timelineController.startAddRelationPredecessor(this.workPackage);\n break;\n\n case 'relation-follows':\n this.table.timelineController.startAddRelationFollower(this.workPackage);\n break;\n\n case 'hierarchy-indent':\n this.wpViewIndentation.indent(this.workPackage);\n break;\n\n case 'hierarchy-outdent':\n this.wpViewIndentation.outdent(this.workPackage);\n break;\n\n default:\n super.triggerContextMenuAction(action);\n break;\n }\n }\n}\n","import { Injector } from '@angular/core';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { WorkPackageTableContextMenu } from 'core-app/shared/components/op-context-menu/wp-context-menu/wp-table-context-menu.directive';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { WorkPackageTable } from '../../wp-fast-table';\nimport { TableEventComponent, TableEventHandler } from '../table-handler-registry';\n\nexport abstract class ContextMenuHandler implements TableEventHandler {\n // Injections\n @InjectField() public opContextMenu:OPContextMenuService;\n\n constructor(public readonly injector:Injector) {\n }\n\n public get rowSelector() {\n return `.${tableRowClassName}`;\n }\n\n public abstract get EVENT():string;\n\n public abstract get SELECTOR():string;\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tableAndTimelineContainer);\n }\n\n public abstract handleEvent(view:TableEventComponent, evt:JQuery.TriggeredEvent):boolean;\n\n protected openContextMenu(table:WorkPackageTable, evt:JQuery.TriggeredEvent, workPackageId:string, positionArgs?:any):void {\n const handler = new WorkPackageTableContextMenu(this.injector, workPackageId, jQuery(evt.target) as JQuery, positionArgs, table);\n this.opContextMenu.show(handler, evt);\n }\n}\n","import { Injector } from '@angular/core';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { contextMenuLinkClassName } from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { TableEventComponent } from 'core-app/features/work-packages/components/wp-fast-table/handlers/table-handler-registry';\nimport { uiStateLinkClass } from '../../builders/ui-state-link-builder';\nimport { ContextMenuHandler } from './context-menu-handler';\n\nexport class ContextMenuClickHandler extends ContextMenuHandler {\n constructor(public readonly injector:Injector) {\n super(injector);\n }\n\n public get EVENT() {\n return 'click.table.contextmenu';\n }\n\n public get SELECTOR() {\n return `.${contextMenuLinkClassName}`;\n }\n\n public handleEvent(view:TableEventComponent, evt:JQuery.TriggeredEvent):boolean {\n const target = jQuery(evt.target);\n\n // We want to keep the original context menu on hrefs\n // (currently, this is only the id\n if (target.closest(`.${uiStateLinkClass}`).length) {\n debugLog('Allowing original context menu on state link');\n return true;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n\n // Locate the row from event\n const element = target.closest(this.rowSelector);\n const wpId = element.data('workPackageId');\n\n if (wpId) {\n this.openContextMenu(view.workPackageTable, evt, wpId);\n }\n\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { KeyCodes } from 'core-app/shared/helpers/keyCodes.enum';\nimport { TableEventComponent } from 'core-app/features/work-packages/components/wp-fast-table/handlers/table-handler-registry';\nimport { ContextMenuHandler } from './context-menu-handler';\n\nexport class ContextMenuKeyboardHandler extends ContextMenuHandler {\n constructor(public readonly injector:Injector) {\n super(injector);\n }\n\n public get EVENT() {\n return 'keydown.table.contextmenu';\n }\n\n public get SELECTOR() {\n return this.rowSelector;\n }\n\n public handleEvent(component:TableEventComponent, evt:JQuery.TriggeredEvent):boolean {\n if (!component.workPackageTable.configuration.contextMenuEnabled) {\n return false;\n }\n\n const target = jQuery(evt.target);\n\n if (!(evt.keyCode === KeyCodes.F10 && evt.shiftKey && evt.altKey)) {\n return true;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n\n // Locate the row from event\n const element = target.closest(this.SELECTOR);\n const wpId = element.data('workPackageId');\n\n // Set position args to open at element\n const position = { my: 'left top', at: 'left bottom', of: target };\n\n super.openContextMenu(component.workPackageTable, evt, wpId, position);\n\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { TableEventComponent } from 'core-app/features/work-packages/components/wp-fast-table/handlers/table-handler-registry';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { timelineCellClassName } from '../../builders/timeline/timeline-row-builder';\nimport { uiStateLinkClass } from '../../builders/ui-state-link-builder';\nimport { ContextMenuHandler } from './context-menu-handler';\n\nexport class ContextMenuRightClickHandler extends ContextMenuHandler {\n @InjectField() readonly wpTableSelection:WorkPackageViewSelectionService;\n\n constructor(public readonly injector:Injector) {\n super(injector);\n }\n\n public get EVENT() {\n return 'contextmenu.table.rightclick';\n }\n\n public get SELECTOR() {\n return `.${tableRowClassName},.${timelineCellClassName}`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tableAndTimelineContainer);\n }\n\n public handleEvent(view:TableEventComponent, evt:JQuery.TriggeredEvent):boolean {\n if (!view.workPackageTable.configuration.contextMenuEnabled) {\n return false;\n }\n const target = jQuery(evt.target);\n\n // We want to keep the original context menu on hrefs\n // (currently, this is only the id\n if (target.closest(`.${uiStateLinkClass}`).length) {\n debugLog('Allowing original context menu on state link');\n return true;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n\n // Locate the row from event\n const element = target.closest(this.SELECTOR);\n const wpId = element.data('workPackageId');\n\n if (wpId) {\n const [index] = view.workPackageTable.findRenderedRow(wpId);\n\n if (!this.wpTableSelection.isSelected(wpId)) {\n this.wpTableSelection.setSelection(wpId, index);\n }\n\n this.openContextMenu(view.workPackageTable, evt, wpId);\n }\n\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { StateService } from '@uirouter/core';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { displayClassName } from 'core-app/shared/components/fields/display/display-field-renderer';\nimport { activeFieldClassName } from 'core-app/shared/components/fields/edit/edit-form/edit-form';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { TableEventComponent, TableEventHandler } from '../table-handler-registry';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { KeepTabService } from '../../../wp-single-view-tabs/keep-tab/keep-tab.service';\n\nexport class RowClickHandler implements TableEventHandler {\n // Injections\n @InjectField() public $state:StateService;\n\n @InjectField() public states:States;\n\n @InjectField() public keepTab:KeepTabService;\n\n @InjectField() public wpTableSelection:WorkPackageViewSelectionService;\n\n @InjectField() public wpTableFocus:WorkPackageViewFocusService;\n\n constructor(public readonly injector:Injector) {\n }\n\n public get EVENT() {\n return 'click.table.row';\n }\n\n public get SELECTOR() {\n return `.${tableRowClassName}`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tbody);\n }\n\n public handleEvent(view:TableEventComponent, evt:JQuery.TriggeredEvent) {\n const target = jQuery(evt.target);\n\n // Ignore links\n if (target.is('a') || target.parent().is('a')) {\n return true;\n }\n\n // Shortcut to any clicks within a cell\n // We don't want to handle these.\n if (target.hasClass(`${displayClassName}`) || target.hasClass(`${activeFieldClassName}`)) {\n debugLog('Skipping click on inner cell');\n return true;\n }\n\n // Locate the row from event\n const element = target.closest(this.SELECTOR);\n const wpId = element.data('workPackageId');\n const classIdentifier = element.data('classIdentifier');\n\n if (!wpId) {\n return true;\n }\n\n const [index, row] = view.workPackageTable.findRenderedRow(classIdentifier);\n\n // Update single selection if no modifier present\n if (!(evt.ctrlKey || evt.metaKey || evt.shiftKey)) {\n this.wpTableSelection.setSelection(wpId, index);\n view.itemClicked.emit({ workPackageId: wpId, double: false });\n }\n\n // Multiple selection if shift present\n if (evt.shiftKey) {\n this.wpTableSelection.setMultiSelectionFrom(view.workPackageTable.renderedRows, wpId, index);\n }\n\n // Single selection expansion if ctrl / cmd(mac)\n if (evt.ctrlKey || evt.metaKey) {\n this.wpTableSelection.toggleRow(wpId);\n }\n\n view.selectionChanged.emit(this.wpTableSelection.getSelectedWorkPackageIds());\n\n // The current row is the last selected work package\n // not matter what other rows are (de-)selected below.\n // Thus save that row for the details view button.\n this.wpTableFocus.updateFocus(wpId);\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { StateService } from '@uirouter/core';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { States } from 'core-app/core/states/states.service';\nimport { isClickedWithModifier } from 'core-app/shared/helpers/link-handling/link-handling';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { displayClassName } from 'core-app/shared/components/fields/display/display-field-renderer';\nimport { activeFieldClassName } from 'core-app/shared/components/fields/edit/edit-form/edit-form';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { TableEventComponent, TableEventHandler } from '../table-handler-registry';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { tdClassName } from '../../builders/cell-builder';\n\nexport class RowDoubleClickHandler implements TableEventHandler {\n // Injections\n @InjectField() public $state:StateService;\n\n @InjectField() public states:States;\n\n @InjectField() public wpTableSelection:WorkPackageViewSelectionService;\n\n @InjectField() public wpTableFocus:WorkPackageViewFocusService;\n\n constructor(public readonly injector:Injector) {\n }\n\n public get EVENT() {\n return 'dblclick.table.row';\n }\n\n public get SELECTOR() {\n return `.${tdClassName}`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tbody);\n }\n\n public handleEvent(view:TableEventComponent, evt:JQuery.TriggeredEvent) {\n const target = jQuery(evt.target);\n\n // Skip clicks with modifiers\n if (isClickedWithModifier(evt)) {\n return true;\n }\n\n // Shortcut to any clicks within a cell\n // We don't want to handle these.\n if (target.hasClass(`${displayClassName}`) || target.hasClass(`${activeFieldClassName}`)) {\n debugLog('Skipping click on inner cell');\n return true;\n }\n\n // Locate the row from event\n const element = target.closest(this.SELECTOR).closest(`.${tableRowClassName}`);\n const wpId = element.data('workPackageId');\n\n // Ignore links\n if (target.is('a') || target.parent().is('a')) {\n return true;\n }\n\n // Save the currently focused work package\n this.wpTableFocus.updateFocus(wpId);\n\n view.itemClicked.emit({ workPackageId: wpId, double: true });\n\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { rowGroupClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-classes.constants';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageViewCollapsedGroupsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-collapsed-groups.service';\nimport { TableEventComponent, TableEventHandler } from '../table-handler-registry';\n\nexport class GroupRowHandler implements TableEventHandler {\n // Injections\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n @InjectField() public workPackageViewCollapsedGroupsService:WorkPackageViewCollapsedGroupsService;\n\n constructor(public readonly injector:Injector) {\n }\n\n public get EVENT() {\n return 'click.table.groupheader';\n }\n\n public get SELECTOR() {\n return `.${rowGroupClassName} .expander`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tbody);\n }\n\n public handleEvent(view:TableEventComponent, evt:JQuery.TriggeredEvent) {\n evt.preventDefault();\n evt.stopPropagation();\n\n const groupHeader = jQuery(evt.target).parents(`.${rowGroupClassName}`);\n const groupIdentifier = groupHeader.data('groupIdentifier');\n\n this.workPackageViewCollapsedGroupsService.toggleGroupCollapseState(groupIdentifier);\n }\n}\n","import { Injector } from '@angular/core';\nimport { States } from 'core-app/core/states/states.service';\nimport { TableEventComponent, TableEventHandler } from 'core-app/features/work-packages/components/wp-fast-table/handlers/table-handler-registry';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { WorkPackageTable } from '../../wp-fast-table';\nimport { ClickOrEnterHandler } from '../click-or-enter-handler';\n\nexport class HierarchyClickHandler extends ClickOrEnterHandler implements TableEventHandler {\n // Injections\n @InjectField() public states:States;\n\n @InjectField() public wpTableHierarchies:WorkPackageViewHierarchiesService;\n\n constructor(public readonly injector:Injector) {\n super();\n }\n\n public get EVENT() {\n return 'click.table.hierarchy';\n }\n\n public get SELECTOR() {\n return `.wp-table--hierarchy-indicator`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tbody);\n }\n\n public processEvent(table:WorkPackageTable, evt:JQuery.TriggeredEvent):boolean {\n const target = jQuery(evt.target);\n\n // Locate the row from event\n const element = target.closest(`.${tableRowClassName}`);\n const wpId = element.data('workPackageId');\n\n this.wpTableHierarchies.toggle(wpId);\n\n evt.stopImmediatePropagation();\n evt.preventDefault();\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { StateService } from '@uirouter/core';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { KeepTabService } from '../../../wp-single-view-tabs/keep-tab/keep-tab.service';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { uiStateLinkClass } from '../../builders/ui-state-link-builder';\nimport { TableEventComponent, TableEventHandler } from '../table-handler-registry';\n\nexport class WorkPackageStateLinksHandler implements TableEventHandler {\n // Injections\n @InjectField() public $state:StateService;\n\n @InjectField() public keepTab:KeepTabService;\n\n @InjectField() public states:States;\n\n @InjectField() public wpTableSelection:WorkPackageViewSelectionService;\n\n @InjectField() public wpTableFocus:WorkPackageViewFocusService;\n\n constructor(public readonly injector:Injector) {\n }\n\n public get EVENT() {\n return 'click.table.wpLink';\n }\n\n public get SELECTOR() {\n return `.${uiStateLinkClass}`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tableAndTimelineContainer);\n }\n\n protected workPackage:WorkPackageResource;\n\n public handleEvent(view:TableEventComponent, evt:JQuery.TriggeredEvent) {\n // Avoid the state capture when clicking with modifier\n if (evt.shiftKey || evt.ctrlKey || evt.metaKey || evt.altKey) {\n return true;\n }\n\n // Locate the details link from event\n const target = jQuery(evt.target);\n const element = target.closest(this.SELECTOR);\n const state = element.data('wpState');\n const workPackageId = element.data('workPackageId');\n\n // Blur the target to avoid focus being kept there\n target.closest('a').blur();\n\n // The current row is the last selected work package\n // not matter what other rows are (de-)selected below.\n // Thus save that row for the details view button.\n // Locate the row from event\n const row = target.closest(`.${tableRowClassName}`);\n const classIdentifier = row.data('classIdentifier');\n const [index, _] = view.workPackageTable.findRenderedRow(classIdentifier);\n\n // Update single selection if no modifier present\n this.wpTableSelection.setSelection(workPackageId, index);\n\n view.stateLinkClicked.emit({ workPackageId, requestedState: state });\n\n evt.preventDefault();\n evt.stopPropagation();\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { takeUntil } from 'rxjs/operators';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport class ColumnsTransformer {\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n @InjectField() public wpTableColumns:WorkPackageViewColumnsService;\n\n constructor(public readonly injector:Injector,\n public table:WorkPackageTable) {\n this.wpTableColumns\n .updates$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n )\n .subscribe(() => {\n if (table.originalRows.length > 0) {\n const t0 = performance.now();\n // Redraw the table section, ignore timeline\n table.redrawTable();\n\n const t1 = performance.now();\n\n debugLog(`column redraw took ${t1 - t0} milliseconds.`);\n }\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { scrollTableRowIntoView } from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-row-helpers';\nimport {\n distinctUntilChanged, filter, map, takeUntil,\n} from 'rxjs/operators';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport {\n collapsedGroupClass,\n hierarchyGroupClass,\n hierarchyRootClass,\n} from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-hierarchy-helpers';\nimport { indicatorCollapsedClass } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/hierarchy/single-hierarchy-row-builder';\nimport { tableRowClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/rows/single-row-builder';\nimport { WorkPackageViewHierarchies } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-hierarchies';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class HierarchyTransformer {\n @InjectField() public wpTableHierarchies:WorkPackageViewHierarchiesService;\n\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n constructor(public readonly injector:Injector,\n table:WorkPackageTable) {\n this.wpTableHierarchies\n .updates$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n map((state) => state.isVisible),\n distinctUntilChanged(),\n )\n .subscribe(() => {\n // We don't have to reload all results when _disabling_ the hierarchy mode.\n if (!this.wpTableHierarchies.isEnabled) {\n table.redrawTableAndTimeline();\n }\n });\n\n let lastValue = this.wpTableHierarchies.isEnabled;\n\n this.wpTableHierarchies\n .updates$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n filter(() => this.querySpace.tableRendered.hasValue()),\n )\n .subscribe((state:WorkPackageViewHierarchies) => {\n if (state.isVisible === lastValue) {\n this.renderHierarchyState(state);\n }\n\n lastValue = state.isVisible;\n });\n }\n\n /**\n * Update all currently visible rows to match the selection state.\n */\n private renderHierarchyState(state:WorkPackageViewHierarchies) {\n const rendered = this.querySpace.tableRendered.value!;\n\n // Show all hierarchies\n jQuery('[class^=\"__hierarchy-group-\"]').removeClass((i:number, classNames:string):string => (classNames.match(/__collapsed-group-\\d+/g) || []).join(' '));\n\n // Mark which rows were hidden by some other hierarchy group\n // (e.g., by a collapsed parent)\n const collapsed:{ [index:number]:boolean } = {};\n\n // Hide all collapsed hierarchies\n _.each(state.collapsed, (isCollapsed:boolean, wpId:string) => {\n // Toggle the root style\n jQuery(`.${hierarchyRootClass(wpId)} .wp-table--hierarchy-indicator`).toggleClass(indicatorCollapsedClass, isCollapsed);\n\n // Get parent row and mark/unmark it as collapsed\n const hierarchyRoot = document.querySelector(`.wp-timeline-cell.__hierarchy-root-${wpId}`);\n\n if (hierarchyRoot) {\n if (isCollapsed) {\n hierarchyRoot.classList.add('__hierarchy-root-collapsed');\n } else {\n hierarchyRoot.classList.remove('__hierarchy-root-collapsed');\n }\n }\n\n // Get all affected children rows\n const affected = jQuery(`.${hierarchyGroupClass(wpId)}`);\n\n // Hide/Show the descendants.\n affected.toggleClass(collapsedGroupClass(wpId), isCollapsed);\n\n // Update the hidden section of the rendered state\n affected.filter(`.${tableRowClassName}`).each((i, el) => {\n // Get the index of this row\n const index = jQuery(el).index();\n\n // Update the hidden state\n if (!collapsed[index]) {\n rendered[index].hidden = isCollapsed;\n collapsed[index] = isCollapsed;\n }\n });\n });\n\n // Keep focused on the last element, if any.\n // Based on https://stackoverflow.com/a/3782959\n if (state.last) {\n scrollTableRowIntoView(state.last);\n }\n\n this.querySpace.tableRendered.putValue(rendered, 'Updated hidden state of rows after hierarchy change.');\n }\n}\n","import { Injector } from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { takeUntil } from 'rxjs/operators';\nimport { WorkPackageViewRelationColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-relation-columns.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport class RelationsTransformer {\n @InjectField() public wpTableRelationColumns:WorkPackageViewRelationColumnsService;\n\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n constructor(public readonly injector:Injector,\n table:WorkPackageTable) {\n this.wpTableRelationColumns\n .updates$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n )\n .subscribe(() => {\n table.redrawTableAndTimeline();\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewOrderService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport class RowsTransformer {\n @InjectField() querySpace:IsolatedQuerySpace;\n\n @InjectField() wpTableSortBy:WorkPackageViewSortByService;\n\n @InjectField() wpTableOrder:WorkPackageViewOrderService;\n\n @InjectField() states:States;\n\n constructor(public readonly injector:Injector,\n public table:WorkPackageTable) {\n // Redraw table if the current row state changed\n this.querySpace\n .initialized\n .values$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n )\n .subscribe(() => {\n let rows:WorkPackageResource[];\n\n if (this.wpTableSortBy.isManualSortingMode) {\n rows = this.wpTableOrder.orderedWorkPackages();\n } else {\n rows = this.querySpace.results.value!.elements;\n }\n\n table.initialSetup(rows);\n });\n\n // Refresh a single row if it exists\n this.states.workPackages.observeChange()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions.asObservable()),\n filter(() => {\n const rendered = this.querySpace.tableRendered.getValueOr([]);\n return rendered && rendered.length > 0;\n }),\n )\n .subscribe(([changedId, wp]) => {\n if (wp === undefined) {\n return;\n }\n\n this.table.refreshRows(wp);\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { takeUntil } from 'rxjs/operators';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { FocusHelperService } from 'core-app/shared/directives/focus/focus-helper';\nimport {\n WorkPackageViewSelectionService,\n WorkPackageViewSelectionState,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { checkedClassName } from '../../builders/ui-state-link-builder';\nimport { locateTableRow, scrollTableRowIntoView } from '../../helpers/wp-table-row-helpers';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport class SelectionTransformer {\n @InjectField() public wpTableSelection:WorkPackageViewSelectionService;\n\n @InjectField() public wpTableFocus:WorkPackageViewFocusService;\n\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n @InjectField() public FocusHelper:FocusHelperService;\n\n constructor(public readonly injector:Injector,\n public readonly table:WorkPackageTable) {\n // Focus a single selection when active\n this.querySpace.tableRendered.values$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n )\n .subscribe(() => {\n this.wpTableFocus.ifShouldFocus((wpId:string) => {\n const element = locateTableRow(wpId);\n if (element.length) {\n scrollTableRowIntoView(wpId);\n this.FocusHelper.focus(element[0]);\n }\n });\n });\n\n // Update selection state\n this.wpTableSelection.live$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n )\n .subscribe((state:WorkPackageViewSelectionState) => {\n this.renderSelectionState(state);\n });\n\n this.wpTableSelection.registerSelectAllListener(() => table.renderedRows);\n this.wpTableSelection.registerDeselectAllListener();\n }\n\n /**\n * Update all currently visible rows to match the selection state.\n */\n private renderSelectionState(state:WorkPackageViewSelectionState) {\n const context = jQuery(this.table.tableAndTimelineContainer);\n\n context.find(`.${tableRowClassName}.${checkedClassName}`).removeClass(checkedClassName);\n\n _.each(state.selected, (selected:boolean, workPackageId:any) => {\n context.find(`.${tableRowClassName}[data-work-package-id=\"${workPackageId}\"]`).toggleClass(checkedClassName, selected);\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { takeUntil } from 'rxjs/operators';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageTimelineState } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-timeline';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport class TimelineTransformer {\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n @InjectField() public wpTableTimeline:WorkPackageViewTimelineService;\n\n constructor(readonly injector:Injector,\n readonly table:WorkPackageTable) {\n this.wpTableTimeline\n .live$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n )\n .subscribe((state:WorkPackageTimelineState) => {\n this.renderVisibility(state.visible);\n });\n }\n\n /**\n * Update all currently visible rows to match the selection state.\n */\n private renderVisibility(visible:boolean) {\n const container = jQuery(this.table.tableAndTimelineContainer).parent();\n container.find('.work-packages-tabletimeline--timeline-side').toggle(visible);\n container.find('.work-packages-tabletimeline--table-side').toggleClass('-timeline-visible', visible);\n }\n}\n","import { Injector } from '@angular/core';\nimport { HighlightingTransformer } from 'core-app/features/work-packages/components/wp-fast-table/handlers/state/highlighting-transformer';\nimport { DragAndDropTransformer } from 'core-app/features/work-packages/components/wp-fast-table/handlers/state/drag-and-drop-transformer';\nimport {\n WorkPackageViewEventHandler, WorkPackageViewOutputs,\n WorkPackageViewHandlerRegistry,\n} from 'core-app/features/work-packages/routing/wp-view-base/event-handling/event-handler-registry';\nimport { GroupFoldTransformer } from 'core-app/features/work-packages/components/wp-fast-table/handlers/state/group-fold-transformer';\nimport { WorkPackageTable } from '../wp-fast-table';\nimport { EditCellHandler } from './cell/edit-cell-handler';\nimport { RelationsCellHandler } from './cell/relations-cell-handler';\nimport { ContextMenuClickHandler } from './context-menu/context-menu-click-handler';\nimport { ContextMenuKeyboardHandler } from './context-menu/context-menu-keyboard-handler';\nimport { ContextMenuRightClickHandler } from './context-menu/context-menu-rightclick-handler';\nimport { RowClickHandler } from './row/click-handler';\nimport { RowDoubleClickHandler } from './row/double-click-handler';\nimport { GroupRowHandler } from './row/group-row-handler';\nimport { HierarchyClickHandler } from './row/hierarchy-click-handler';\nimport { WorkPackageStateLinksHandler } from './row/wp-state-links-handler';\nimport { ColumnsTransformer } from './state/columns-transformer';\nimport { HierarchyTransformer } from './state/hierarchy-transformer';\nimport { RelationsTransformer } from './state/relations-transformer';\nimport { RowsTransformer } from './state/rows-transformer';\nimport { SelectionTransformer } from './state/selection-transformer';\nimport { TimelineTransformer } from './state/timeline-transformer';\n\ntype StateTransformers = {\n // noinspection JSUnusedLocalSymbols\n new(injector:Injector, table:WorkPackageTable):any;\n};\n\nexport interface TableEventComponent extends WorkPackageViewOutputs {\n // Reference to the fast table instance\n workPackageTable:WorkPackageTable;\n}\n\nexport type TableEventHandler = WorkPackageViewEventHandler;\n\nexport class TableHandlerRegistry extends WorkPackageViewHandlerRegistry {\n protected eventHandlers:((t:TableEventComponent) => TableEventHandler)[] = [\n // Hierarchy expansion/collapsing\n () => new HierarchyClickHandler(this.injector),\n // Clicking or pressing Enter on a single cell, editable or not\n () => new EditCellHandler(this.injector),\n // Clicking on the details view\n () => new WorkPackageStateLinksHandler(this.injector),\n // Clicking on the row (not within a cell)\n () => new RowClickHandler(this.injector),\n // Double Clicking on the cell within the row\n () => new RowDoubleClickHandler(this.injector),\n // Clicking on group headers\n () => new GroupRowHandler(this.injector),\n // Right clicking on rows\n () => new ContextMenuRightClickHandler(this.injector),\n // Left clicking on the dropdown icon\n () => new ContextMenuClickHandler(this.injector),\n // SHIFT+ALT+F10 on rows\n () => new ContextMenuKeyboardHandler(this.injector),\n // Clicking on relations cells\n () => new RelationsCellHandler(this.injector),\n ];\n\n protected readonly stateTransformers:StateTransformers[] = [\n SelectionTransformer,\n RowsTransformer,\n ColumnsTransformer,\n GroupFoldTransformer,\n TimelineTransformer,\n HierarchyTransformer,\n RelationsTransformer,\n HighlightingTransformer,\n DragAndDropTransformer,\n ];\n\n attachTo(viewRef:TableEventComponent) {\n this.stateTransformers.map((cls) => new cls(this.injector, viewRef.workPackageTable));\n\n super.attachTo(viewRef);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nconst cssClassRowHovered = 'row-hovered';\n\nexport class WpTableHoverSync {\n private lastHoveredElement:Element | null = null;\n\n private eventListener = (evt:MouseEvent) => {\n const target = evt.target as Element|null;\n if (target && target !== this.lastHoveredElement) {\n this.handleHover(target);\n }\n this.lastHoveredElement = target;\n };\n\n constructor(private tableAndTimeline:JQuery) {\n }\n\n activate() {\n window.addEventListener('mousemove', this.eventListener, { passive: true });\n }\n\n deactivate() {\n window.removeEventListener('mousemove', this.eventListener);\n this.removeAllHoverClasses();\n }\n\n private locateHoveredTableRow(child:JQuery):Element | null {\n const parent = child.closest('tr');\n if (parent.length === 0) {\n return null;\n }\n return parent[0];\n }\n\n private locateHoveredTimelineRow(child:JQuery):Element | null {\n const parent = child.closest('div.wp-timeline-cell');\n if (parent.length === 0) {\n return null;\n }\n return parent[0];\n }\n\n private handleHover(element:Element) {\n const $element = jQuery(element) as JQuery;\n const parentTableRow = this.locateHoveredTableRow($element);\n const parentTimelineRow = this.locateHoveredTimelineRow($element);\n\n // remove all hover classes if cursor does not hover a row\n if (parentTableRow === null && parentTimelineRow === null) {\n this.removeAllHoverClasses();\n return;\n }\n\n this.removeOldAndAddNewHoverClass(parentTableRow, parentTimelineRow);\n }\n\n private extractWorkPackageId(row:Element):number {\n return parseInt(row.getAttribute('data-work-package-id')!);\n }\n\n private removeOldAndAddNewHoverClass(parentTableRow:Element | null, parentTimelineRow:Element | null) {\n const hovered = parentTableRow !== null ? parentTableRow : parentTimelineRow;\n const wpId = this.extractWorkPackageId(hovered!);\n\n const tableRow:JQuery = this.tableAndTimeline.find(`tr.wp-row-${wpId}`).first();\n const timelineRow:JQuery = this.tableAndTimeline.find(`div.wp-row-${wpId}`).length\n ? this.tableAndTimeline.find(`div.wp-row-${wpId}`).first()\n : this.tableAndTimeline.find(`div.wp-ancestor-row-${wpId}`).first();\n\n requestAnimationFrame(() => {\n this.removeAllHoverClasses();\n timelineRow.addClass(cssClassRowHovered);\n tableRow.addClass(cssClassRowHovered);\n });\n }\n\n private removeAllHoverClasses() {\n this.tableAndTimeline\n .find(`.${cssClassRowHovered}`)\n .removeClass(cssClassRowHovered);\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 \n \n\n \n \n
\n {{text.tableSummary}}\n \n {{text.tableSummaryHints}}\n
\n
\n \n
\n
\n \n \n \n
\n \n \n
\n
\n \n \n \n {{text.noResults.title}}\n {{text.noResults.description}}\n \n \n
\n
\n\n
\n \n
\n\n
\n \n
\n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef, EventEmitter,\n Injector,\n Input,\n NgZone,\n OnInit, Output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TableEventComponent, TableHandlerRegistry } from 'core-app/features/work-packages/components/wp-fast-table/handlers/table-handler-registry';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { combineLatest } from 'rxjs';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { trackByHref } from 'core-app/shared/helpers/angular/tracking-functions';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { createScrollSync } from 'core-app/features/work-packages/components/wp-table/wp-table-scroll-sync';\nimport { WpTableHoverSync } from 'core-app/features/work-packages/components/wp-table/wp-table-hover-sync';\nimport { WorkPackageTimelineTableController } from 'core-app/features/work-packages/components/wp-table/timeline/container/wp-timeline-container.directive';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { WorkPackageViewSumService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sum.service';\nimport {\n WorkPackageTableConfiguration,\n WorkPackageTableConfigurationObject,\n} from 'core-app/features/work-packages/components/wp-table/wp-table-configuration';\nimport { States } from 'core-app/core/states/states.service';\nimport { QueryGroupByResource } from 'core-app/features/hal/resources/query-group-by-resource';\n\nexport interface WorkPackageFocusContext {\n /** Work package that was focused */\n workPackageId:string;\n /** Through what action did the focus happen */\n through:'row-double-click'|'id-click'|'details-icon';\n}\n\n@Component({\n templateUrl: './wp-table.directive.html',\n styleUrls: ['./wp-table.styles.sass'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'wp-table',\n})\nexport class WorkPackagesTableComponent extends UntilDestroyedMixin implements OnInit, TableEventComponent {\n @Input() projectIdentifier:string;\n\n @Input('configuration') configurationObject:WorkPackageTableConfigurationObject;\n\n @Output() selectionChanged = new EventEmitter();\n\n @Output() itemClicked = new EventEmitter<{ workPackageId:string, double:boolean }>();\n\n @Output() stateLinkClicked = new EventEmitter<{ workPackageId:string, requestedState:string }>();\n\n public trackByHref = trackByHref;\n\n public configuration:WorkPackageTableConfiguration;\n\n private $element:JQuery;\n\n private scrollSyncUpdate:(timelineVisible:boolean) => any;\n\n private wpTableHoverSync:WpTableHoverSync;\n\n public tableElement:HTMLElement;\n\n public workPackageTable:WorkPackageTable;\n\n public tbody:JQuery;\n\n public query:QueryResource;\n\n public timeline:HTMLElement;\n\n public locale:string;\n\n public text:any;\n\n public results:WorkPackageCollectionResource;\n\n public groupBy:QueryGroupByResource|null;\n\n public columns:QueryColumn[];\n\n public numTableColumns:number;\n\n public timelineVisible:boolean;\n\n public manualSortEnabled:boolean;\n\n public limitedResults = false;\n\n // We need to sync certain height difference to the timeline\n // depending on whether inline create or sums rows are being shown\n public inlineCreateVisible = false;\n\n public sumVisible = false;\n\n constructor(readonly elementRef:ElementRef,\n readonly injector:Injector,\n readonly states:States,\n readonly querySpace:IsolatedQuerySpace,\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n readonly zone:NgZone,\n readonly wpTableGroupBy:WorkPackageViewGroupByService,\n readonly wpTableTimeline:WorkPackageViewTimelineService,\n readonly wpTableColumns:WorkPackageViewColumnsService,\n readonly wpTableSortBy:WorkPackageViewSortByService,\n readonly wpTableSums:WorkPackageViewSumService) {\n super();\n }\n\n ngOnInit():void {\n this.configuration = new WorkPackageTableConfiguration(this.configurationObject);\n this.$element = jQuery(this.elementRef.nativeElement);\n\n // Clear any old table subscribers\n this.querySpace.stopAllSubscriptions.next();\n\n this.locale = I18n.locale;\n\n this.text = {\n cancel: I18n.t('js.button_cancel'),\n noResults: {\n title: I18n.t('js.work_packages.no_results.title'),\n description: I18n.t('js.work_packages.no_results.description'),\n },\n limitedResults: (count:number, total:number) => I18n.t('js.work_packages.limited_results', { count, total }),\n tableSummary: I18n.t('js.work_packages.table.summary'),\n tableSummaryHints: [\n I18n.t('js.work_packages.table.text_inline_edit'),\n I18n.t('js.work_packages.table.text_select_hint'),\n I18n.t('js.work_packages.table.text_sort_hint'),\n ].join(' '),\n };\n\n const statesCombined = combineLatest([\n this.querySpace.results.values$(),\n this.wpTableGroupBy.live$(),\n this.wpTableColumns.live$(),\n this.wpTableTimeline.live$(),\n this.wpTableSortBy.live$(),\n this.wpTableSums.live$(),\n ]);\n\n statesCombined.pipe(\n this.untilDestroyed(),\n ).subscribe(([results, groupBy, columns, timelines, sort, sums]) => {\n this.query = this.querySpace.query.value!;\n\n this.results = results;\n this.sumVisible = sums;\n\n this.groupBy = groupBy;\n this.columns = columns;\n // Total columns = all available columns + id + checkbox\n this.numTableColumns = this.columns.length + 2;\n\n if (this.scrollSyncUpdate && this.timelineVisible !== timelines.visible) {\n this.scrollSyncUpdate(timelines.visible);\n }\n\n this.timelineVisible = timelines.visible;\n\n this.manualSortEnabled = this.wpTableSortBy.isManualSortingMode;\n this.limitedResults = this.manualSortEnabled && results.total > results.count;\n\n this.cdRef.detectChanges();\n });\n\n this.cdRef.detectChanges();\n }\n\n public ngOnDestroy():void {\n super.ngOnDestroy();\n this.wpTableHoverSync.deactivate();\n }\n\n public registerTimeline(controller:WorkPackageTimelineTableController, timelineBody:HTMLElement) {\n const tbody = this.$element.find('.work-package--results-tbody');\n const scrollContainer = this.$element.find('.work-package-table--container')[0];\n this.workPackageTable = new WorkPackageTable(\n this.injector,\n // Outer container for both table + Timeline\n this.$element[0],\n // Scroll container for the table/timeline\n scrollContainer,\n // Table tbody to insert into\n tbody[0],\n // Timeline body to insert into\n timelineBody,\n // Timeline controller\n controller,\n // Table configuration\n this.configuration,\n );\n this.tbody = tbody;\n controller.workPackageTable = this.workPackageTable;\n new TableHandlerRegistry(this.injector).attachTo(this);\n\n // Locate table and timeline elements\n const tableAndTimeline = this.getTableAndTimelineElement();\n this.tableElement = tableAndTimeline[0];\n this.timeline = tableAndTimeline[1];\n\n // sync hover from table to timeline\n this.wpTableHoverSync = new WpTableHoverSync(this.$element);\n this.wpTableHoverSync.activate();\n\n // sync scroll from table to timeline\n this.scrollSyncUpdate = createScrollSync(this.$element);\n this.scrollSyncUpdate(this.timelineVisible);\n\n this.cdRef.detectChanges();\n }\n\n public get isEmbedded() {\n return this.configuration.isEmbedded;\n }\n\n private getTableAndTimelineElement():[HTMLElement, HTMLElement] {\n const $tableSide = this.$element.find('.work-packages-tabletimeline--table-side');\n const $timelineSide = this.$element.find('.work-packages-tabletimeline--timeline-side');\n\n if ($timelineSide.length === 0 || $tableSide.length === 0) {\n throw new Error('invalid state');\n }\n\n return [$tableSide[0], $timelineSide[0]];\n }\n}\n","\n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n// ++\n\nimport { UIRouterGlobals } from '@uirouter/core';\nimport {\n Component,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { WpTabDefinition } from 'core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/tab';\nimport { WorkPackageTabsService } from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-tabs.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\n@Component({\n templateUrl: './wp-tab-wrapper.html',\n selector: 'op-wp-tab',\n})\nexport class WpTabWrapperComponent implements OnInit {\n workPackage:WorkPackageResource;\n\n ndcDynamicInputs$:Observable<{\n workPackage:WorkPackageResource;\n tab:WpTabDefinition | undefined;\n }>;\n\n get workPackageId():string {\n const { workPackageId } = this.uiRouterGlobals.params as unknown as { workPackageId:string };\n return workPackageId;\n }\n\n constructor(readonly I18n:I18nService,\n readonly uiRouterGlobals:UIRouterGlobals,\n readonly apiV3Service:ApiV3Service,\n readonly wpTabsService:WorkPackageTabsService) {}\n\n ngOnInit() {\n this.ndcDynamicInputs$ = this\n .apiV3Service\n .work_packages\n .id(this.workPackageId)\n .requireAndStream()\n .pipe(\n map((wp) => ({\n workPackage: wp,\n tab: this.findTab(wp),\n })),\n );\n }\n\n findTab(workPackage:WorkPackageResource):WpTabDefinition | undefined {\n const { tabIdentifier } = this.uiRouterGlobals.params as unknown as { tabIdentifier:string };\n\n return this.wpTabsService.getTab(tabIdentifier, workPackage);\n }\n}\n","\n \n
  • \n \n \n \n
  • \n
  • \n \n \n \n
  • \n
    \n\n","import {\n ChangeDetectionStrategy, Component, Injector, Input, OnInit,\n} from '@angular/core';\nimport { KeepTabService } from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\nimport { StateService, UIRouterGlobals } from '@uirouter/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TabDefinition } from 'core-app/shared/components/tabs/tab.interface';\nimport { WorkPackageTabsService } from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-tabs.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\n@Component({\n selector: 'op-wp-tabs',\n templateUrl: './wp-tabs.component.html',\n styleUrls: ['./wp-tabs.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WpTabsComponent implements OnInit {\n @Input() workPackage:WorkPackageResource;\n\n @Input() view:'full'|'split';\n\n public tabs:TabDefinition[];\n\n public uiSrefBase:string;\n\n public canViewWatchers = false;\n\n text = {\n details: {\n close: this.I18n.t('js.button_close_details'),\n goToFullScreen: this.I18n.t('js.button_show_fullscreen'),\n },\n };\n\n constructor(\n readonly wpTabsService:WorkPackageTabsService,\n readonly I18n:I18nService,\n readonly injector:Injector,\n readonly $state:StateService,\n readonly uiRouterGlobals:UIRouterGlobals,\n readonly keepTab:KeepTabService,\n ) {\n }\n\n ngOnInit():void {\n this.uiSrefBase = this.view === 'split' ? '' : 'work-packages.show';\n this.canViewWatchers = !!(this.workPackage && this.workPackage.watchers);\n this.tabs = this.getDisplayableTabs();\n }\n\n private getDisplayableTabs() {\n return this\n .wpTabsService\n .getDisplayableTabs(this.workPackage)\n .map((tab) => ({\n ...tab,\n route: `${this.uiSrefBase}.tabs`,\n routeParams: { workPackageId: this.workPackage.id, tabIdentifier: tab.id },\n }));\n }\n\n public switchToFullscreen():void {\n this.keepTab.goCurrentShowState();\n }\n\n public close():void {\n this.$state.go(\n this.uiRouterGlobals.current.data.baseRoute,\n this.uiRouterGlobals.params,\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, Input, OnInit } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { WorkPackageRelationsHierarchyService } from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service';\nimport { take } from 'rxjs/operators';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Component({\n selector: 'wp-relations-hierarchy',\n templateUrl: './wp-relations-hierarchy.template.html',\n})\nexport class WorkPackageRelationsHierarchyComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public relationType:string;\n\n public showEditForm = false;\n\n public workPackagePath:string;\n\n public canHaveChildren:boolean;\n\n public canModifyHierarchy:boolean;\n\n public canAddRelation:boolean;\n\n public childrenQueryProps:any;\n\n constructor(protected wpRelationsHierarchyService:WorkPackageRelationsHierarchyService,\n protected apiV3Service:ApiV3Service,\n protected PathHelper:PathHelperService,\n readonly I18n:I18nService) {\n super();\n }\n\n public text = {\n parentHeadline: this.I18n.t('js.relations_hierarchy.parent_headline'),\n childrenHeadline: this.I18n.t('js.relations_hierarchy.children_headline'),\n };\n\n ngOnInit() {\n this.workPackagePath = this.PathHelper.workPackagePath(this.workPackage.id!);\n this.canModifyHierarchy = !!this.workPackage.changeParent;\n this.canAddRelation = !!this.workPackage.addRelation;\n\n this.childrenQueryProps = {\n filters: JSON.stringify([{ parent: { operator: '=', values: [this.workPackage.id] } }]),\n 'columns[]': ['id', 'type', 'subject', 'status'],\n showHierarchies: false,\n };\n\n this\n .apiV3Service\n .work_packages\n .id(this.workPackage)\n .requireAndStream()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp:WorkPackageResource) => {\n this.workPackage = wp;\n\n const parentId = this.workPackage.parent?.id?.toString();\n\n if (parentId) {\n this\n .apiV3Service\n .work_packages\n .id(parentId)\n .get()\n .pipe(\n take(1),\n )\n .subscribe((parent:WorkPackageResource) => {\n this.workPackage.parent = parent;\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\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","import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport {\n ChangeDetectorRef, Component, ElementRef, Input, OnInit, ViewChild,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { WorkPackageRelationsService } from '../wp-relations.service';\nimport { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\n\n\n@Component({\n selector: 'wp-relation-row',\n templateUrl: './wp-relation-row.template.html',\n})\nexport class WorkPackageRelationRowComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public relatedWorkPackage:WorkPackageResource;\n\n @Input() public groupByWorkPackageType:boolean;\n\n @ViewChild('relationDescriptionTextarea') readonly relationDescriptionTextarea:ElementRef;\n\n public relationType:string;\n\n public showRelationInfo = false;\n\n public showEditForm = false;\n\n public availableRelationTypes:{ label:string, name:string }[];\n\n public selectedRelationType:{ name:string };\n\n public userInputs = {\n newRelationText: '',\n showDescriptionEditForm: false,\n showRelationTypesForm: false,\n showRelationInfo: false,\n };\n\n // Create a quasi-field object\n public fieldController = {\n handler: {\n active: true,\n },\n required: false,\n };\n\n public relation:RelationResource;\n\n public text = {\n cancel: this.I18n.t('js.button_cancel'),\n save: this.I18n.t('js.button_save'),\n removeButton: this.I18n.t('js.relation_buttons.remove'),\n description_label: this.I18n.t('js.relation_buttons.update_description'),\n toggleDescription: this.I18n.t('js.relation_buttons.toggle_description'),\n updateRelation: this.I18n.t('js.relation_buttons.update_relation'),\n placeholder: {\n description: this.I18n.t('js.placeholders.relation_description'),\n },\n };\n\n constructor(protected apiV3Service:ApiV3Service,\n protected notificationService:WorkPackageNotificationService,\n protected wpRelations:WorkPackageRelationsService,\n protected halEvents:HalEventsService,\n protected I18n:I18nService,\n protected cdRef:ChangeDetectorRef,\n protected PathHelper:PathHelperService) {\n super();\n }\n\n ngOnInit() {\n this.relation = this.relatedWorkPackage.relatedBy as RelationResource;\n\n this.userInputs.newRelationText = this.relation.description || '';\n this.availableRelationTypes = RelationResource.LOCALIZED_RELATION_TYPES(false);\n this.selectedRelationType = _.find(this.availableRelationTypes,\n { name: this.relation.normalizedType(this.workPackage) })!;\n\n this\n .apiV3Service\n .work_packages\n .id(this.relatedWorkPackage)\n .requireAndStream()\n .pipe(\n this.untilDestroyed(),\n ).subscribe((wp) => {\n this.relatedWorkPackage = wp;\n });\n }\n\n /**\n * Return the normalized relation type for the work package we're viewing.\n * That is, normalize `precedes` where the work package is the `to` link.\n */\n public get normalizedRelationType() {\n const type = this.relation.normalizedType(this.workPackage);\n return this.I18n.t(`js.relation_labels.${type}`);\n }\n\n public get relationReady() {\n return this.relatedWorkPackage && this.relatedWorkPackage.$loaded;\n }\n\n public startDescriptionEdit() {\n this.userInputs.showDescriptionEditForm = true;\n setTimeout(() => {\n const textarea = jQuery(this.relationDescriptionTextarea.nativeElement);\n const textlen = (textarea.val() as string).length;\n // Focus and set cursor to end\n textarea.focus();\n\n textarea.prop('selectionStart', textlen);\n textarea.prop('selectionEnd', textlen);\n });\n }\n\n public handleDescriptionKey($event:JQuery.TriggeredEvent) {\n if ($event.which === 27) {\n this.cancelDescriptionEdit();\n }\n }\n\n public cancelDescriptionEdit() {\n this.userInputs.showDescriptionEditForm = false;\n this.userInputs.newRelationText = this.relation.description || '';\n }\n\n public saveDescription() {\n this.wpRelations.updateRelation(\n this.relation,\n { description: this.userInputs.newRelationText },\n )\n .then((savedRelation:RelationResource) => {\n this.relation = savedRelation;\n this.relatedWorkPackage.relatedBy = savedRelation;\n this.userInputs.showDescriptionEditForm = false;\n this.notificationService.showSave(this.relatedWorkPackage);\n this.cdRef.detectChanges();\n });\n }\n\n public get showDescriptionInfo() {\n return this.userInputs.showRelationInfo || this.relation.description;\n }\n\n public activateRelationTypeEdit() {\n if (this.groupByWorkPackageType) {\n this.userInputs.showRelationTypesForm = true;\n }\n }\n\n public cancelRelationTypeEditOnEscape(evt:JQuery.TriggeredEvent) {\n this.userInputs.showRelationTypesForm = false;\n }\n\n public saveRelationType() {\n this.wpRelations.updateRelationType(\n this.workPackage,\n this.relatedWorkPackage,\n this.relation,\n this.selectedRelationType.name,\n )\n .then((savedRelation:RelationResource) => {\n this.notificationService.showSave(this.relatedWorkPackage);\n this.relatedWorkPackage.relatedBy = savedRelation;\n this.relation = savedRelation;\n\n this.userInputs.showRelationTypesForm = false;\n this.cdRef.detectChanges();\n })\n .catch((error:any) => this.notificationService.handleRawError(error, this.workPackage));\n }\n\n public toggleUserDescriptionForm() {\n this.userInputs.showDescriptionEditForm = !this.userInputs.showDescriptionEditForm;\n }\n\n public removeRelation() {\n this.wpRelations.removeRelation(this.relation)\n .then(() => {\n this.halEvents.push(this.workPackage, {\n eventType: 'association',\n relatedWorkPackage: null,\n relationType: this.relation.normalizedType(this.workPackage),\n });\n\n this\n .apiV3Service\n .work_packages\n .cache\n .updateWorkPackage(this.relatedWorkPackage);\n\n this.notificationService.showSave(this.relatedWorkPackage);\n })\n .catch((err:any) => this.notificationService.handleRawError(err,\n this.relatedWorkPackage));\n }\n\n public highlightingClassForWpType():string {\n return Highlighting.inlineClass('type', this.relatedWorkPackage.type.id!);\n }\n}\n","
    \n
    \n \n
    \n \n \n \n \n
    \n\n\n\n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport {\n Component, ElementRef, EventEmitter, HostBinding, Input, Output, ViewChild,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n@Component({\n selector: 'wp-relations-group',\n templateUrl: './wp-relations-group.template.html',\n})\nexport class WorkPackageRelationsGroupComponent {\n @HostBinding('class.attributes-group') className = true;\n\n @Input() public relatedWorkPackages:WorkPackageResource[];\n\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public header:string;\n\n @Input() public firstGroup:boolean;\n\n @Input() public groupByWorkPackageType:boolean;\n\n @Output() public onToggleGroupBy = new EventEmitter();\n\n @ViewChild('wpRelationGroupByToggler') readonly toggleElement:ElementRef;\n\n public text = {\n groupByType: this.I18n.t('js.relation_buttons.group_by_wp_type'),\n groupByRelation: this.I18n.t('js.relation_buttons.group_by_relation_type'),\n };\n\n constructor(\n readonly I18n:I18nService,\n ) {\n }\n\n public get togglerText() {\n if (this.groupByWorkPackageType) {\n return this.text.groupByRelation;\n }\n return this.text.groupByType;\n }\n\n public toggleButton() {\n this.onToggleGroupBy.emit();\n\n setTimeout(() => {\n this.toggleElement.nativeElement.focus();\n }, 20);\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","import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Component, Input } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { WorkPackageRelationsService } from '../wp-relations.service';\n\n@Component({\n selector: 'wp-relations-create',\n templateUrl: './wp-relation-create.template.html',\n})\nexport class WorkPackageRelationsCreateComponent {\n @Input() readonly workPackage:WorkPackageResource;\n\n public showRelationsCreateForm = false;\n\n public selectedRelationType:string = RelationResource.DEFAULT();\n\n public selectedWpId:string;\n\n public relationTypes = RelationResource.LOCALIZED_RELATION_TYPES(false);\n\n public isDisabled = false;\n\n public text = {\n abort: this.I18n.t('js.relation_buttons.abort'),\n relationType: this.I18n.t('js.relation_buttons.relation_type'),\n addNewRelation: this.I18n.t('js.relation_buttons.add_new_relation'),\n };\n\n constructor(readonly I18n:I18nService,\n protected wpRelations:WorkPackageRelationsService,\n protected notificationService:WorkPackageNotificationService,\n protected halEvents:HalEventsService) {\n }\n\n public createRelation() {\n if (!this.selectedRelationType || !this.selectedWpId) {\n return;\n }\n\n this.isDisabled = true;\n this.createCommonRelation()\n .catch(() => this.isDisabled = false)\n .then(() => this.isDisabled = false);\n }\n\n public onSelected(workPackage?:WorkPackageResource) {\n if (workPackage) {\n this.selectedWpId = workPackage.id!;\n this.createCommonRelation();\n }\n }\n\n protected createCommonRelation() {\n return this.wpRelations.addCommonRelation(this.workPackage.id!,\n this.selectedRelationType,\n this.selectedWpId)\n .then((relation) => {\n this.halEvents.push(this.workPackage, {\n eventType: 'association',\n relatedWorkPackage: relation.id!,\n relationType: this.selectedRelationType,\n });\n this.notificationService.showSave(this.workPackage);\n this.toggleRelationsCreateForm();\n })\n .catch((err) => {\n this.notificationService.handleRawError(err, this.workPackage);\n this.toggleRelationsCreateForm();\n });\n }\n\n public toggleRelationsCreateForm() {\n this.showRelationsCreateForm = !this.showRelationsCreateForm;\n // Reset value\n this.selectedWpId = '';\n }\n}\n","\n \n
    \n \n
    \n \n\n \n\n \n\n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Observable, zip } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { RelationsStateValue, WorkPackageRelationsService } from './wp-relations.service';\nimport { RelatedWorkPackagesGroup } from './wp-relations.interfaces';\n\n@Component({\n selector: 'wp-relations',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './wp-relations.template.html',\n})\nexport class WorkPackageRelationsComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n public relationGroups:RelatedWorkPackagesGroup = {};\n\n public relationGroupKeys:string[] = [];\n\n public relationsPresent = false;\n\n public canAddRelation:boolean;\n\n // By default, group by relation type\n public groupByWorkPackageType = false;\n\n public text = {\n relations_header: this.I18n.t('js.work_packages.tabs.relations'),\n };\n\n public currentRelations:WorkPackageResource[] = [];\n\n constructor(private I18n:I18nService,\n private wpRelations:WorkPackageRelationsService,\n private cdRef:ChangeDetectorRef,\n private apiV3Service:ApiV3Service) {\n super();\n }\n\n ngOnInit() {\n this.canAddRelation = !!this.workPackage.addRelation;\n\n this.wpRelations\n .state(this.workPackage.id!)\n .values$()\n .pipe(\n takeUntil(componentDestroyed(this)),\n )\n .subscribe((relations:RelationsStateValue) => {\n this.loadedRelations(relations);\n });\n\n this.wpRelations.require(this.workPackage.id!);\n\n // Listen for changes to this WP.\n this\n .apiV3Service\n .work_packages\n .id(this.workPackage)\n .requireAndStream()\n .pipe(\n takeUntil(componentDestroyed(this)),\n )\n .subscribe((wp:WorkPackageResource) => {\n this.workPackage = wp;\n });\n }\n\n private getRelatedWorkPackages(workPackageIds:string[]):Observable {\n const observablesToGetZipped:Observable[] = workPackageIds.map((wpId) => this\n .apiV3Service\n .work_packages\n .id(wpId)\n .get());\n\n return zip(...observablesToGetZipped);\n }\n\n protected getRelatedWorkPackageId(relation:RelationResource):string {\n const involved = relation.ids;\n return (relation.to.href === this.workPackage.href) ? involved.from : involved.to;\n }\n\n public toggleGroupBy() {\n this.groupByWorkPackageType = !this.groupByWorkPackageType;\n this.buildRelationGroups();\n }\n\n protected buildRelationGroups() {\n if (_.isNil(this.currentRelations)) {\n return;\n }\n\n this.relationGroups = _.groupBy(this.currentRelations,\n (wp:WorkPackageResource) => {\n if (this.groupByWorkPackageType) {\n return wp.type.name;\n }\n const normalizedType = (wp.relatedBy as RelationResource).normalizedType(this.workPackage);\n return this.I18n.t(`js.relation_labels.${normalizedType}`);\n });\n this.relationGroupKeys = _.keys(this.relationGroups);\n this.relationsPresent = _.size(this.relationGroups) > 0;\n this.cdRef.detectChanges();\n }\n\n protected loadedRelations(stateValues:RelationsStateValue):void {\n const relatedWpIds:string[] = [];\n const relations:{ [wpId:string]:any } = [];\n\n if (_.size(stateValues) === 0) {\n this.currentRelations = [];\n return this.buildRelationGroups();\n }\n\n _.each(stateValues, (relation:RelationResource) => {\n const relatedWpId = this.getRelatedWorkPackageId(relation);\n relatedWpIds.push(relatedWpId);\n relations[relatedWpId] = relation;\n });\n\n this.getRelatedWorkPackages(relatedWpIds)\n .pipe(\n take(1),\n )\n .subscribe((relatedWorkPackages:WorkPackageResource[]) => {\n this.currentRelations = relatedWorkPackages.map((wp:WorkPackageResource) => {\n wp.relatedBy = relations[wp.id!];\n return wp;\n });\n\n this.buildRelationGroups();\n });\n }\n}\n","
    \n
    \n \n
    \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Transition } from '@uirouter/core';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Component({\n templateUrl: './relations-tab.html',\n selector: 'wp-relations-tab',\n})\nexport class WorkPackageRelationsTabComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public workPackageId?:string;\n\n public workPackage:WorkPackageResource;\n\n public constructor(readonly I18n:I18nService,\n readonly $transition:Transition,\n readonly apiV3Service:ApiV3Service) {\n super();\n }\n\n ngOnInit() {\n const wpId = this.workPackageId || this.$transition.params('to').workPackageId;\n this\n .apiV3Service\n .work_packages\n .id(wpId)\n .requireAndStream()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp) => {\n this.workPackageId = wp.id!;\n this.workPackage = wp;\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectorRef,\n Directive,\n OnInit,\n} from '@angular/core';\nimport { UIRouterGlobals } from '@uirouter/core';\nimport { Observable } from 'rxjs';\nimport { map, distinctUntilChanged } from 'rxjs/operators';\nimport { take } from 'rxjs/internal/operators/take';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ActivityEntryInfo } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-entry-info';\nimport { WorkPackagesActivityService } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/wp-activity.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WpSingleViewService } from 'core-app/features/work-packages/routing/wp-view-base/state/wp-single-view.service';\nimport { BrowserDetector } from 'core-app/core/browser/browser-detector.service';\n\n@Directive()\nexport class ActivityPanelBaseController extends UntilDestroyedMixin implements OnInit {\n public workPackage:WorkPackageResource;\n\n public workPackageId:string;\n\n // All activities retrieved for the work package\n public unfilteredActivities:HalResource[] = [];\n\n // Visible activities\n public visibleActivities:ActivityEntryInfo[] = [];\n\n public reverse:boolean;\n\n public showToggler:boolean;\n\n public onlyComments = false;\n\n public togglerText:string;\n\n public text = {\n commentsOnly: this.I18n.t('js.label_activity_show_only_comments'),\n showAll: this.I18n.t('js.label_activity_show_all'),\n };\n\n private additionalScrollMargin = 200;\n\n private initialized = false;\n\n private comingFromNotifications = false;\n\n constructor(\n readonly apiV3Service:ApiV3Service,\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n readonly uiRouterGlobals:UIRouterGlobals,\n readonly wpActivity:WorkPackagesActivityService,\n readonly storeService:WpSingleViewService,\n readonly browserDetector:BrowserDetector,\n private wpSingleViewService:WpSingleViewService,\n ) {\n super();\n\n this.reverse = wpActivity.isReversed;\n this.togglerText = this.text.commentsOnly;\n\n const lastTransitionName = uiRouterGlobals.successfulTransitions.peekTail().from().name as string;\n const comingFromNotifications = /^notifications/.test(lastTransitionName);\n const firstRouteOnMobile = lastTransitionName === '' && this.browserDetector.isMobile;\n\n if (comingFromNotifications || firstRouteOnMobile) {\n this.comingFromNotifications = true;\n }\n }\n\n ngOnInit():void {\n this.initialized = false;\n this\n .apiV3Service\n .work_packages\n .id(this.workPackageId)\n .requireAndStream()\n .pipe(this.untilDestroyed())\n .subscribe((wp) => {\n this.workPackage = wp;\n this.reloadActivities();\n });\n\n this\n .wpSingleViewService\n .selectNotificationsCount$\n .pipe(\n this.untilDestroyed(),\n distinctUntilChanged(),\n )\n .subscribe(() => {\n this.reloadActivities();\n });\n }\n\n private scrollIfNotificationPresent() {\n this\n .storeService\n .hasNotifications$\n .pipe(take(1))\n .subscribe((hasNotification) => {\n if (hasNotification) {\n this.scrollToUnreadNotification();\n }\n });\n }\n\n private reloadActivities() {\n void this.wpActivity.require(this.workPackage, true).then((activities:HalResource[]) => {\n this.updateActivities(activities);\n this.cdRef.detectChanges();\n\n if (!this.initialized) {\n this.initialized = true;\n this.scrollIfNotificationPresent();\n }\n });\n }\n\n protected updateActivities(activities:HalResource[]):void {\n this.unfilteredActivities = activities;\n\n const visible = this.getVisibleActivities();\n this.visibleActivities = visible.map((el:HalResource, i:number) => this.info(el, i));\n this.showToggler = this.shouldShowToggler();\n }\n\n protected shouldShowToggler():boolean {\n const countAll = this.unfilteredActivities.length;\n const countWithComments = this.getActivitiesWithComments().length;\n\n return countAll > 1\n && countWithComments > 0\n && countWithComments < this.unfilteredActivities.length;\n }\n\n protected getVisibleActivities():HalResource[] {\n if (!this.onlyComments) {\n return this.unfilteredActivities;\n }\n return this.getActivitiesWithComments();\n }\n\n protected getActivitiesWithComments():HalResource[] {\n return this.unfilteredActivities\n .filter((activity:HalResource) => !!_.get(activity, 'comment.html'));\n }\n\n protected hasUnreadNotification(activityHref:string):Observable {\n return this\n .storeService\n .selectNotifications$\n .pipe(\n map((notifications) => (\n !!notifications.find((notification) => notification._links.activity?.href === activityHref)\n )),\n );\n }\n\n protected scrollToUnreadNotification():void {\n const unreadNotifications = document.querySelectorAll(\"[data-notification-selector='notification-activity']\");\n // scroll to the unread notification only if there is no deep link\n if (window.location.href.indexOf('activity#') > -1 || unreadNotifications.length === 0) {\n return;\n }\n\n const notificationElement = unreadNotifications[this.reverse ? unreadNotifications.length - 1 : 0] as HTMLElement;\n const scrollContainer = document.querySelectorAll(\"[data-notification-selector='notification-scroll-container']\")[0];\n\n const scrollOffset = notificationElement.offsetTop - (scrollContainer as HTMLElement).offsetTop - this.additionalScrollMargin;\n scrollContainer.scrollTop = scrollOffset;\n\n // Make sure the scrollContainer is visible on mobile\n if (this.comingFromNotifications) {\n scrollContainer.scrollIntoView(true);\n }\n }\n\n public toggleComments():void {\n this.onlyComments = !this.onlyComments;\n this.updateActivities(this.unfilteredActivities);\n\n if (this.onlyComments) {\n this.togglerText = this.text.showAll;\n } else {\n this.togglerText = this.text.commentsOnly;\n }\n }\n\n public info(activity:HalResource, index:number):ActivityEntryInfo {\n return this.wpActivity.info(this.unfilteredActivities, activity, index);\n }\n}\n","import { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport {\n ElementRef, Injector, OnInit, Directive,\n} from '@angular/core';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { Subject } from 'rxjs';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\n@Directive()\nexport abstract class WorkPackageCommentFieldHandler extends EditFieldHandler implements OnInit {\n public fieldName = 'comment';\n\n public handler = this;\n\n public active = false;\n\n public inEditMode = false;\n\n public inFlight = false;\n\n public change:WorkPackageChangeset;\n\n // Destroy events\n public onDestroy = new Subject();\n\n constructor(protected elementRef:ElementRef,\n protected injector:Injector) {\n super();\n }\n\n public ngOnInit() {\n this.change = new WorkPackageChangeset(this.workPackage);\n }\n\n /**\n * Handle saving the comment\n */\n public abstract handleUserSubmit():Promise;\n\n public abstract get workPackage():WorkPackageResource;\n\n public reset(withText = '') {\n if (withText.length > 0) {\n withText += '\\n';\n }\n\n this.change.setValue('comment', { raw: withText });\n }\n\n public get schema():IFieldSchema {\n return {\n name: I18n.t('js.label_comment'),\n writable: true,\n required: false,\n type: '_comment',\n hasDefault: false,\n };\n }\n\n public get rawComment() {\n return _.get(this.commentValue, 'raw', '');\n }\n\n public get commentValue() {\n return this.change.value<{ raw:string }>('comment');\n }\n\n public handleUserCancel() {\n this.deactivate(true);\n }\n\n public activate(withText?:string) {\n this.active = true;\n this.reset(withText);\n }\n\n deactivate(focus:boolean):void {\n this.active = false;\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n\n focus():void {\n const trigger = this.elementRef.nativeElement.querySelector('.inplace-editing--trigger-container');\n trigger && trigger.focus();\n }\n\n onFocusOut():void {\n }\n\n handleUserKeydown(event:JQuery.TriggeredEvent, onlyCancel?:boolean):void {\n }\n\n isChanged():boolean {\n return false;\n }\n\n stopPropagation(evt:JQuery.TriggeredEvent):boolean {\n return false;\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n Injector,\n Input,\n OnDestroy,\n OnInit,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WorkPackageCommentFieldHandler } from 'core-app/features/work-packages/components/work-package-comment/work-package-comment-field-handler';\nimport { CommentService } from 'core-app/features/work-packages/components/wp-activity/comment-service';\nimport { WorkPackagesActivityService } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/wp-activity.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ErrorResource } from 'core-app/features/hal/resources/error-resource';\nimport { HalError } from 'core-app/features/hal/services/hal-error';\n\n@Component({\n selector: 'work-package-comment',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './work-package-comment.component.html',\n})\nexport class WorkPackageCommentComponent extends WorkPackageCommentFieldHandler implements OnInit, OnDestroy {\n @Input() public workPackage:WorkPackageResource;\n\n @ContentChild(TemplateRef) template:TemplateRef;\n\n @ViewChild('commentContainer') public commentContainer:ElementRef;\n\n public text = {\n editTitle: this.I18n.t('js.label_add_comment_title'),\n addComment: this.I18n.t('js.label_add_comment'),\n cancelTitle: this.I18n.t('js.label_cancel_comment'),\n placeholder: this.I18n.t('js.label_add_comment_title'),\n };\n\n public fieldLabel:string = this.text.editTitle;\n\n public inFlight = false;\n\n public canAddComment:boolean;\n\n public showAbove:boolean;\n\n public htmlId = 'wp-comment-field';\n\n constructor(protected elementRef:ElementRef,\n protected injector:Injector,\n protected commentService:CommentService,\n protected wpLinkedActivities:WorkPackagesActivityService,\n protected ConfigurationService:ConfigurationService,\n protected loadingIndicator:LoadingIndicatorService,\n protected apiV3Service:ApiV3Service,\n protected workPackageNotificationService:WorkPackageNotificationService,\n protected toastService:ToastService,\n protected cdRef:ChangeDetectorRef,\n protected I18n:I18nService) {\n super(elementRef, injector);\n }\n\n public ngOnInit() {\n super.ngOnInit();\n\n this.canAddComment = !!this.workPackage.addComment;\n this.showAbove = this.ConfigurationService.commentsSortedInDescendingOrder();\n\n this.commentService.quoteEvents\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((quote:string) => {\n this.activate(quote);\n this.commentContainer.nativeElement.scrollIntoView();\n });\n }\n\n // Open the field when its closed and relay drag & drop events to it.\n public startDragOverActivation(event:JQuery.TriggeredEvent) {\n if (this.active) {\n return true;\n }\n\n this.activate();\n\n event.preventDefault();\n return false;\n }\n\n public activate(withText?:string) {\n super.activate(withText);\n\n if (!this.showAbove) {\n this.scrollToBottom();\n }\n\n this.cdRef.detectChanges();\n }\n\n public deactivate(focus:boolean) {\n focus && this.focus();\n this.active = false;\n this.cdRef.detectChanges();\n }\n\n public async handleUserSubmit() {\n if (this.inFlight || !this.rawComment) {\n return Promise.resolve();\n }\n\n this.inFlight = true;\n await this.onSubmit();\n const indicator = this.loadingIndicator.wpDetails;\n indicator.promise = this.commentService.createComment(this.workPackage, this.commentValue)\n .then(() => {\n this.active = false;\n this.toastService.addSuccess(this.I18n.t('js.work_packages.comment_added'));\n\n void this.wpLinkedActivities.require(this.workPackage, true);\n void this\n .apiV3Service\n .work_packages\n .id(this.workPackage.id!)\n .refresh();\n\n this.inFlight = false;\n this.deactivate(true);\n })\n .catch((error:any) => {\n this.inFlight = false;\n if (error instanceof HalError) {\n this.workPackageNotificationService.showError(error.resource, this.workPackage);\n } else {\n this.toastService.addError(this.I18n.t('js.work_packages.comment_send_failed'));\n }\n });\n\n return indicator.promise;\n }\n\n scrollToBottom():void {\n const scrollableContainer = jQuery(this.elementRef.nativeElement).scrollParent()[0];\n if (scrollableContainer) {\n setTimeout(() => {\n scrollableContainer.scrollTop = scrollableContainer.scrollHeight;\n }, 400);\n }\n }\n\n setErrors(newErrors:string[]):void {\n // interface\n }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\n@Component({\n selector: 'activity-link',\n template: `\n \n \n `,\n})\nexport class ActivityLinkComponent implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public activityNo:number;\n\n public activityHtmlId:string;\n\n public activityLabel:string;\n\n ngOnInit() {\n this.activityHtmlId = `activity-${this.activityNo}`;\n this.activityLabel = `#${this.activityNo}`;\n }\n}\n\nfunction activityLink() {\n return {\n restrict: 'E',\n template: `\n `,\n scope: {\n },\n link(scope:any) {\n scope.workPackageId = scope.workPackage.id!;\n scope.activityHtmlId = `activity-${scope.activityNo}`;\n },\n };\n}\n","\n
    \n \n \n
    \n\n \n\n \n\n \n \n \n  \n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Component({\n selector: 'revision-activity',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './revision-activity.component.html',\n})\nexport class RevisionActivityComponent implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public activity:any;\n\n @Input() public activityNo:number;\n\n @Input() public hasUnreadNotification:boolean;\n\n public userId:string | number;\n\n public userName:string;\n\n public userActive:boolean;\n\n public userPath:string | null;\n\n public userLabel:string;\n\n public userAvatar:string;\n\n public project:ProjectResource;\n\n public revision:string;\n\n public message:string;\n\n public revisionLink:string;\n\n constructor(readonly I18n:I18nService,\n readonly timezoneService:TimezoneService,\n readonly cdRef:ChangeDetectorRef,\n readonly apiV3Service:ApiV3Service) {\n }\n\n ngOnInit() {\n this.loadAuthor();\n\n this.project = this.workPackage.project;\n this.revision = this.activity.identifier;\n this.message = this.activity.message.html;\n\n const revisionPath = this.activity.showRevision.$link.href;\n const formattedRevision = this.activity.formattedIdentifier;\n\n const link = document.createElement('a');\n link.href = revisionPath;\n link.title = this.revision;\n link.textContent = this.I18n.t(\n 'js.label_committed_link',\n { revision_identifier: formattedRevision },\n );\n\n this.revisionLink = this.I18n.t('js.label_committed_at',\n {\n committed_revision_link: link.outerHTML,\n date: this.timezoneService.formattedDatetime(this.activity.createdAt),\n });\n }\n\n private loadAuthor() {\n if (this.activity.author === undefined) {\n this.userName = this.activity.authorName;\n } else {\n this\n .apiV3Service\n .users\n .id(idFromLink(this.activity.author.href))\n .get()\n .subscribe((user:UserResource) => {\n this.userId = user.id!;\n this.userName = user.name;\n this.userActive = user.isActive;\n this.userAvatar = user.avatar;\n this.userPath = user.showUser.href;\n this.userLabel = this.I18n.t('js.label_author', { user: this.userName });\n this.cdRef.detectChanges();\n });\n }\n }\n}\n","/**\n * Allows to dynamically render an HTML string into any HTML node, dynamically\n * bootstrapping all its Angular components and directives.\n *\n * ```\n * \">\n * \n * ```\n * @module\n * @public\n */\nimport {\n ApplicationRef, Component, ElementRef, Input,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { DynamicBootstrapper } from 'core-app/core/setup/globals/dynamic-bootstrapper';\n\n@Component({\n selector: 'op-dynamic-bootstrap',\n templateUrl: './dynamic-bootstrap.component.html',\n})\nexport class DynamicBootstrapComponent {\n /*\n * HTML string to be rendered.\n */\n @Input()\n set HTML(templateString:string) {\n this.innerHtml = this.domSanitizer.bypassSecurityTrustHtml(templateString);\n this.dynamicBootstrapper.bootstrapOptionalEmbeddable(this.appRef, this.elementRef.nativeElement);\n }\n\n innerHtml:SafeHtml;\n\n dynamicBootstrapper = DynamicBootstrapper;\n\n constructor(\n readonly domSanitizer:DomSanitizer,\n readonly elementRef:ElementRef,\n readonly appRef:ApplicationRef,\n ) { }\n}\n","\n
    \n \n\n
    \n \n \n {{ isInitial ? text.label_created_on : text.label_updated_on }}\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","","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport {\n ApplicationRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Injector,\n Input, NgZone,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WorkPackageCommentFieldHandler } from 'core-app/features/work-packages/components/work-package-comment/work-package-comment-field-handler';\nimport { WorkPackagesActivityService } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/wp-activity.service';\nimport { CommentService } from 'core-app/features/work-packages/components/wp-activity/comment-service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Component({\n selector: 'user-activity',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './user-activity.component.html',\n styleUrls: ['./user-activity.component.sass'],\n})\nexport class UserActivityComponent extends WorkPackageCommentFieldHandler implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public activity:HalResource;\n\n @Input() public activityNo:number;\n\n @Input() public isInitial:boolean;\n\n @Input() public hasUnreadNotification:boolean;\n\n public userCanEdit = false;\n\n public userCanQuote = false;\n\n public userId:string | number;\n\n public user:UserResource;\n\n public userName:string;\n\n public userAvatar:string;\n\n public details:any[] = [];\n\n public isComment:boolean;\n\n public isBcfComment:boolean;\n\n public postedComment:SafeHtml;\n\n public focused = false;\n\n public text = {\n label_created_on: this.I18n.t('js.label_created_on'),\n label_updated_on: this.I18n.t('js.label_updated_on'),\n quote_comment: this.I18n.t('js.label_quote_comment'),\n edit_comment: this.I18n.t('js.label_edit_comment'),\n };\n\n private $element:JQuery;\n\n constructor(readonly elementRef:ElementRef,\n readonly injector:Injector,\n readonly sanitization:DomSanitizer,\n readonly PathHelper:PathHelperService,\n readonly wpLinkedActivities:WorkPackagesActivityService,\n readonly commentService:CommentService,\n readonly ConfigurationService:ConfigurationService,\n readonly apiV3Service:ApiV3Service,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n readonly ngZone:NgZone,\n protected appRef:ApplicationRef) {\n super(elementRef, injector);\n }\n\n public ngOnInit() {\n super.ngOnInit();\n\n this.htmlId = `user_activity_edit_field_${this.activityNo}`;\n this.updateCommentText();\n this.isComment = this.activity._type === 'Activity::Comment';\n this.isBcfComment = this.activity._type === 'Activity::BcfComment';\n\n this.$element = jQuery(this.elementRef.nativeElement);\n this.reset();\n this.userCanEdit = !!this.activity.update;\n this.userCanQuote = !!this.workPackage.addComment;\n\n this.$element.bind('focusin', this.focus.bind(this));\n this.$element.bind('focusout', this.blur.bind(this));\n\n _.each(this.activity.details, (detail:any) => {\n this.details.push(detail.html);\n });\n\n this\n .apiV3Service\n .users\n .id(idFromLink(this.activity.user.href))\n .get()\n .subscribe((user:UserResource) => {\n this.user = user;\n this.userId = user.id!;\n this.userName = user.name;\n this.userAvatar = user.avatar;\n this.cdRef.detectChanges();\n });\n\n if (window.location.hash === `#activity-${this.activityNo}`) {\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n this.elementRef.nativeElement.scrollIntoView(true);\n });\n });\n }\n }\n\n public shouldHideIcons():boolean {\n return !((this.isComment || this.isBcfComment) && this.focussing());\n }\n\n public activate() {\n super.activate(this.activity.comment.raw);\n this.cdRef.detectChanges();\n }\n\n public handleUserSubmit() {\n if (this.inFlight || !this.rawComment) {\n return Promise.resolve();\n }\n return this.updateComment();\n }\n\n public quoteComment() {\n this.commentService.quoteEvents.next(this.quotedText(this.activity.comment.raw));\n }\n\n public get bcfSnapshotUrl() {\n if (_.get(this.activity, 'bcfViewpoints[0]')) {\n return `${_.get(this.activity, 'bcfViewpoints[0]').href}/snapshot`;\n }\n return null;\n }\n\n public async updateComment() {\n this.inFlight = true;\n\n await this.onSubmit();\n return this.commentService.updateComment(this.activity, this.rawComment || '')\n .then((newActivity:HalResource) => {\n this.activity = newActivity;\n this.updateCommentText();\n this.wpLinkedActivities.require(this.workPackage, true);\n this\n .apiV3Service\n .work_packages\n .cache\n .updateWorkPackage(this.workPackage);\n })\n .finally(() => {\n this.deactivate(true); this.inFlight = false;\n });\n }\n\n public focusEditIcon() {\n // Find the according edit icon and focus it\n jQuery(`.edit-activity--${this.activityNo} a`).focus();\n }\n\n public focus() {\n this.focused = true;\n this.cdRef.detectChanges();\n }\n\n public blur() {\n this.focused = false;\n this.cdRef.detectChanges();\n }\n\n public focussing() {\n return this.focused;\n }\n\n setErrors(newErrors:string[]):void {\n // interface\n }\n\n public quotedText(rawComment:string) {\n const quoted = rawComment.split('\\n')\n .map((line:string) => `\\n> ${line}`)\n .join('');\n return `${this.userName} wrote:\\n${quoted}`;\n }\n\n deactivate(focus:boolean):void {\n super.deactivate(focus);\n\n if (focus) {\n this.focusEditIcon();\n }\n }\n\n private updateCommentText() {\n this.postedComment = this.activity.comment.html;\n }\n}\n","\n
    \n \n \n
    \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, Input, OnInit } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Component({\n selector: 'activity-entry',\n templateUrl: './activity-entry.component.html',\n})\nexport class ActivityEntryComponent implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public activity:any;\n\n @Input() public activityNo:number;\n\n @Input() public isInitial:boolean;\n\n @Input() public hasUnreadNotification:boolean;\n\n public projectId:string;\n\n public activityType:string;\n\n constructor(readonly PathHelper:PathHelperService,\n readonly I18n:I18nService) {\n }\n\n ngOnInit() {\n this.projectId = idFromLink(this.workPackage.project.href);\n\n this.activityType = this.activity._type;\n }\n}\n","\n \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ActivityPanelBaseController } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-base.controller';\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ActivityEntryInfo } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-entry-info';\nimport { trackByProperty } from 'core-app/shared/helpers/angular/tracking-functions';\n\n@Component({\n selector: 'newest-activity-on-overview',\n templateUrl: './activity-on-overview.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NewestActivityOnOverviewComponent extends ActivityPanelBaseController {\n @Input('workPackage') public workPackage:WorkPackageResource;\n\n public latestActivityInfo:ActivityEntryInfo[] = [];\n\n public trackByIdentifier = trackByProperty('identifier');\n\n ngOnInit() {\n this.workPackageId = this.workPackage.id!;\n super.ngOnInit();\n }\n\n protected shouldShowToggler() {\n return false;\n }\n\n protected updateActivities(activities:any) {\n super.updateActivities(activities);\n this.latestActivityInfo = this.latestActivities();\n }\n\n private latestActivities(visible = 3) {\n if (this.reverse) {\n // In reverse, we already get reversed entries from API.\n // So simply take the first three\n const segment = this.unfilteredActivities.slice(0, visible);\n return segment.map((el:HalResource, i:number) => this.info(el, i));\n }\n // In ascending sort, take the last three items\n const segment = this.unfilteredActivities.slice(-visible);\n const startIndex = this.unfilteredActivities.length - segment.length;\n return segment.map((el:HalResource, i:number) => this.info(el, startIndex + i));\n }\n}\n","\n\n
    \n
    \n
    \n

    \n
    \n
    \n\n \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component } from '@angular/core';\nimport { StateService } from '@uirouter/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Component({\n templateUrl: './overview-tab.html',\n selector: 'wp-overview-tab',\n})\nexport class WorkPackageOverviewTabComponent extends UntilDestroyedMixin {\n public workPackageId:string;\n\n public workPackage:WorkPackageResource;\n\n public tabName = this.I18n.t('js.label_latest_activity');\n\n public constructor(readonly I18n:I18nService,\n readonly $state:StateService,\n readonly apiV3Service:ApiV3Service) {\n super();\n\n this.workPackageId = this.$state.params.workPackageId;\n\n this\n .apiV3Service\n .work_packages\n .id(this.workPackageId)\n .requireAndStream()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp) => this.workPackage = wp);\n }\n}\n","\n \n
    \n
    \n \n \n \n \n \n\n \n
    \n
    \n \n
    \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { trackByProperty } from 'core-app/shared/helpers/angular/tracking-functions';\nimport { ActivityPanelBaseController } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-base.controller';\n\n@Component({\n templateUrl: './activity-tab.html',\n selector: 'wp-activity-tab',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageActivityTabComponent extends ActivityPanelBaseController {\n public workPackage:WorkPackageResource;\n\n public tabName = this.I18n.t('js.work_packages.tabs.activity');\n\n public trackByIdentifier = trackByProperty('identifier');\n\n ngOnInit() {\n const { workPackageId } = this.uiRouterGlobals.params as unknown as { workPackageId:string };\n this.workPackageId = workPackageId;\n super.ngOnInit();\n }\n}\n","// Storage types\nexport const nextcloud = 'urn:openproject-org:api:v3:storages:Nextcloud';\n\n// Storage authorization state\nexport const storageConnected = 'urn:openproject-org:api:v3:storages:authorization:Connected';\nexport const storageFailedAuthorization = 'urn:openproject-org:api:v3:storages:authorization:FailedAuthorization';\nexport const storageAuthorizationError = 'urn:openproject-org:api:v3:storages:authorization:Error';\n\n// File link view permission flags\nexport const fileLinkViewAllowed = 'urn:openproject-org:api:v3:file-links:permission:View';\nexport const fileLinkViewNotAllowed = 'urn:openproject-org:api:v3:file-links:permission:NotAllowed';\nexport const fileLinkViewError = 'urn:openproject-org:api:v3:file-links:permission:Error';\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport class StorageActionButton {\n constructor(public readonly label:string, public readonly action:() => void) { }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { StorageActionButton } from 'core-app/shared/components/file-links/storage-information/storage-action-button';\n\nexport class StorageInformationBox {\n constructor(\n public readonly iconClass:string,\n public readonly header:string,\n public readonly content:string,\n public readonly buttons:StorageActionButton[],\n ) { }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport interface Breadcrumb {\n text:string;\n icon?:string;\n navigate?:() => void;\n}\n\nexport class BreadcrumbsContent {\n constructor(\n public readonly crumbs:Breadcrumb[],\n ) { }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport function isDirectory(mimeType?:string):boolean {\n return mimeType === 'application/x-op-directory';\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { IStorageFile } from 'core-app/core/state/storage-files/storage-file.model';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport {\n getIconForMimeType,\n} from 'core-app/shared/components/file-links/file-link-icons/file-link-list-item-icon.factory';\nimport { IFileIcon } from 'core-app/shared/components/file-links/file-link-icons/icon-mappings';\nimport { isDirectory } from 'core-app/shared/components/file-links/file-link-icons/file-icons.helper';\n\nexport class StorageFileListItem {\n get name():string {\n return this.storageFile.name;\n }\n\n get mimeType():string|undefined {\n return this.storageFile.mimeType;\n }\n\n get createdByName():string|undefined {\n return this.storageFile.createdByName;\n }\n\n get timestamp():string|undefined {\n return this.storageFile.lastModifiedAt\n ? this.timezoneService.parseDatetime(this.storageFile.lastModifiedAt).fromNow()\n : undefined;\n }\n\n get icon():IFileIcon {\n return getIconForMimeType(this.storageFile.mimeType);\n }\n\n get isDirectory():boolean {\n return isDirectory(this.storageFile.mimeType);\n }\n\n constructor(\n private readonly timezoneService:TimezoneService,\n private readonly storageFile:IStorageFile,\n public readonly disabled:boolean,\n public readonly isFirst:boolean,\n public readonly selected:boolean,\n public readonly changeSelection:() => void,\n public readonly enterDirectory?:() => void,\n ) {}\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { nextcloud } from 'core-app/shared/components/file-links/file-links-constants.const';\n\nexport const storageIconMappings:Record = {\n [nextcloud]: 'nextcloud-circle',\n\n default: 'ticket',\n};\n","\n \n \n \n \n \n \n\n \n \n\n 4\"\n class=\"spot-breadcrumbs--crumb spot-breadcrumbs--crumb_collapsed\"\n >\n \n \n\n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n} from '@angular/core';\n\nimport { BreadcrumbsContent } from 'core-app/spot/components/breadcrumbs/breadcrumbs-content';\n\n@Component({\n selector: 'spot-breadcrumbs',\n templateUrl: './breadcrumbs.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpotBreadcrumbsComponent {\n @HostBinding('class.spot-breadcrumbs') className = true;\n\n @Input() content:BreadcrumbsContent;\n}\n","\n {{tooltip}}

    \n\n \n \n\n \n \n\n \n \n\n \n\n \n\n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n} from '@angular/core';\n\nimport { PrincipalLike } from 'core-app/shared/components/principal/principal-types';\nimport {\n StorageFileListItem,\n} from 'core-app/shared/components/file-links/storage-file-list-item/storage-file-list-item';\nimport SpotDropAlignmentOption from 'core-app/spot/drop-alignment-options';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[op-storage-file-list-item]',\n templateUrl: './storage-file-list-item.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StorageFileListItemComponent {\n @Input() public content:StorageFileListItem;\n\n text = {\n alreadyLinkedFile: this.i18n.t('js.storages.file_links.already_linked_file'),\n alreadyLinkedDirectory: this.i18n.t('js.storages.file_links.already_linked_directory'),\n };\n\n get principal():PrincipalLike {\n return this.content.createdByName\n ? {\n name: this.content.createdByName,\n href: '/external_users/1',\n }\n : {\n name: 'Not Available',\n href: '/placeholder_users/1',\n };\n }\n\n get tooltip():string {\n return this.content.isDirectory ? this.text.alreadyLinkedDirectory : this.text.alreadyLinkedFile;\n }\n\n get getTooltipAlignment():SpotDropAlignmentOption {\n if (this.content.isFirst) {\n return SpotDropAlignmentOption.BottomLeft;\n }\n\n return SpotDropAlignmentOption.TopLeft;\n }\n\n constructor(\n private readonly i18n:I18nService,\n ) {}\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n templateUrl: './loading-file-list.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'op-loading-file-list',\n encapsulation: ViewEncapsulation.None,\n})\nexport class LoadingFileListComponent { }\n","\n \n\n \n\n \n\n \n\n \n\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { isDirectory } from 'core-app/shared/components/file-links/file-link-icons/file-icons.helper';\n\n@Pipe({\n name: 'sortFiles',\n})\nexport class SortFilesPipe implements PipeTransform {\n transform(array:T[]):T[] {\n return array.sort((a, b):number => {\n if (isDirectory(a.mimeType) && isDirectory(b.mimeType)) {\n return a.name.localeCompare(b.name);\n }\n\n if (isDirectory(a.mimeType)) {\n return -1;\n }\n\n if (isDirectory(b.mimeType)) {\n return 1;\n }\n\n return a.name.localeCompare(b.name);\n });\n }\n}\n","\n
    \n {{text.header}}\n \n {{text.buttons.openStorage()}}\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 0 }\"\n [disabled]=\"selectedFileCount === 0\"\n (click)=\"createSelectedFileLinks()\"\n >\n \n {{selectedFileCount > 0 ? text.buttons.submit() : text.buttons.submitEmptySelection}}\n \n
    \n
    \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Inject,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { map, take } from 'rxjs/operators';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { IFileLink } from 'core-app/core/state/file-links/file-link.model';\nimport { IStorageFile } from 'core-app/core/state/storage-files/storage-file.model';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { StorageFilesResourceService } from 'core-app/core/state/storage-files/storage-files.service';\nimport { Breadcrumb, BreadcrumbsContent } from 'core-app/spot/components/breadcrumbs/breadcrumbs-content';\nimport {\n StorageFileListItem,\n} from 'core-app/shared/components/file-links/storage-file-list-item/storage-file-list-item';\nimport { FileLinksResourceService } from 'core-app/core/state/file-links/file-links.service';\nimport { isDirectory } from 'core-app/shared/components/file-links/file-link-icons/file-icons.helper';\nimport getIconForStorageType from 'core-app/shared/components/file-links/storage-icons/get-icon-for-storage-type';\n\n@Component({\n templateUrl: 'file-picker-modal.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FilePickerModalComponent extends OpModalComponent implements OnInit, OnDestroy {\n public breadcrumbs:BreadcrumbsContent;\n\n public listItems$:Observable;\n\n public readonly loading$ = new BehaviorSubject(true);\n\n public readonly text = {\n header: this.i18n.t('js.storages.file_links.select'),\n buttons: {\n openStorage: ():string => this.i18n.t('js.storages.open_storage', { storageType: this.locals.storageTypeName as string }),\n submit: ():string => this.i18n.t('js.storages.file_links.selection_any', { number: this.selectedFileCount }),\n submitEmptySelection: this.i18n.t('js.storages.file_links.selection_none'),\n cancel: this.i18n.t('js.button_cancel'),\n selectAll: this.i18n.t('js.storages.file_links.select_all'),\n },\n };\n\n public get selectedFileCount():number {\n return this.selection.size;\n }\n\n private get storageLink():IHalResourceLink {\n return this.locals.storageLink as IHalResourceLink;\n }\n\n private readonly selection = new Set();\n\n private readonly fileMap:Record = {};\n\n private readonly storageFiles$ = new BehaviorSubject([]);\n\n private loadingSubscription:Subscription;\n\n constructor(\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly elementRef:ElementRef,\n readonly cdRef:ChangeDetectorRef,\n private readonly i18n:I18nService,\n private readonly timezoneService:TimezoneService,\n private readonly fileLinksResourceService:FileLinksResourceService,\n private readonly storageFilesResourceService:StorageFilesResourceService,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit():void {\n super.ngOnInit();\n\n this.breadcrumbs = new BreadcrumbsContent([{\n text: this.locals.storageName as string,\n icon: getIconForStorageType(this.locals.storageType as string),\n navigate: () => this.changeLevel(null, this.breadcrumbs.crumbs.slice(0, 1)),\n }]);\n\n this.listItems$ = this.storageFiles$\n .pipe(map((files) => files.map((file, index) => this.storageFileToListItem(file, index))));\n\n this.storageFilesResourceService.files(this.makeFilesCollectionLink(null))\n .pipe(take(1))\n .subscribe((files) => {\n this.storageFiles$.next(files);\n this.loading$.next(false);\n });\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n\n this.storageFilesResourceService.reset();\n }\n\n public openStorageLocation():void {\n window.open(this.locals.storageLocation, '_blank');\n }\n\n public createSelectedFileLinks():void {\n const files = Array.from(this.selection).map((id) => this.fileMap[id]);\n this.fileLinksResourceService.addFileLinks(\n this.locals.collectionKey as string,\n this.locals.addFileLinksHref as string,\n this.storageLink,\n files,\n );\n\n this.service.close();\n }\n\n public selectAllOfCurrentLevel():void {\n this.storageFiles$\n .pipe(take(1))\n .subscribe((files) => {\n files.forEach((file) => {\n const id = file.id as string;\n if (!this.selection.has(id) && !this.isAlreadyLinked(file)) {\n this.selection.add(id);\n this.fileMap[id] = file;\n }\n });\n\n // push the file data again to the subject\n // to trigger a rerender with new selection state\n this.storageFiles$.next(files);\n });\n }\n\n public changeSelection(file:IStorageFile):void {\n const fileId = file.id as string;\n if (this.selection.has(fileId)) {\n this.selection.delete(fileId);\n } else {\n this.selection.add(fileId);\n this.fileMap[fileId] = file;\n }\n }\n\n private changeLevel(parent:string|null, crumbs:Breadcrumb[]):void {\n this.cancelCurrentLoading();\n this.loading$.next(true);\n this.breadcrumbs = new BreadcrumbsContent(crumbs);\n\n this.loadingSubscription = this.storageFilesResourceService.files(this.makeFilesCollectionLink(parent))\n .pipe(take(1))\n .subscribe((files) => {\n this.storageFiles$.next(files);\n this.loading$.next(false);\n });\n }\n\n private cancelCurrentLoading():void {\n if (this.loadingSubscription) {\n this.loadingSubscription.unsubscribe();\n }\n }\n\n private makeFilesCollectionLink(parent:string|null):IHalResourceLink {\n let query = '';\n if (parent !== null) {\n query = `?parent=${parent}`;\n }\n\n return {\n href: `${this.storageLink.href}/files${query}`,\n title: 'Storage files',\n };\n }\n\n private storageFileToListItem(file:IStorageFile, index:number):StorageFileListItem {\n const enterDirectoryCallback = isDirectory(file.mimeType)\n ? () => {\n const crumbs = this.breadcrumbs.crumbs;\n const end = crumbs.length + 1;\n const newCrumb:Breadcrumb = {\n text: file.name,\n navigate: () => this.changeLevel(file.location, this.breadcrumbs.crumbs.slice(0, end)),\n };\n this.changeLevel(file.location, crumbs.concat(newCrumb));\n }\n : undefined;\n\n return new StorageFileListItem(\n this.timezoneService,\n file,\n this.isAlreadyLinked(file),\n index === 0,\n this.selection.has(file.id as string),\n () => { this.changeSelection(file); },\n enterDirectoryCallback,\n );\n }\n\n private isAlreadyLinked(file:IStorageFile):boolean {\n const currentFileLinks = this.locals.fileLinks as IFileLink[];\n const found = currentFileLinks.find((a) => a.originData.id === file.id);\n\n return !!found;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { storageIconMappings } from 'core-app/shared/components/file-links/storage-icons/icon-mappings';\n\nexport default function getIconForStorageType(storageType?:string):string {\n if (storageType && storageIconMappings[storageType]) {\n return storageIconMappings[storageType];\n }\n\n return storageIconMappings.default;\n}\n","\n\n\n \n \n \n \n \n \n\n\n\n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy, Component, Input,\n} from '@angular/core';\nimport {\n StorageInformationBox,\n} from 'core-app/shared/components/file-links/storage-information/storage-information-box';\n\n@Component({\n selector: 'op-storage-information',\n templateUrl: './storage-information.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StorageInformationComponent {\n @Input() viewModel:StorageInformationBox;\n}\n","\n {{text.notAllowdTooltipText}}

    \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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { IFileIcon } from 'core-app/shared/components/file-links/file-link-icons/icon-mappings';\nimport { IFileLink, IFileLinkOriginData } from 'core-app/core/state/file-links/file-link.model';\nimport { fileLinkViewAllowed } from 'core-app/shared/components/file-links/file-links-constants.const';\nimport { PrincipalRendererService } from 'core-app/shared/components/principal/principal-renderer.service';\nimport {\n getIconForMimeType,\n} from 'core-app/shared/components/file-links/file-link-icons/file-link-list-item-icon.factory';\nimport SpotDropAlignmentOption from 'core-app/spot/drop-alignment-options';\nimport { ConfirmDialogOptions } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.modal';\nimport { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';\nimport { isDirectory } from 'core-app/shared/components/file-links/file-link-icons/file-icons.helper';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[op-file-link-list-item]',\n templateUrl: './file-link-list-item.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FileLinkListItemComponent implements OnInit, AfterViewInit {\n @Input() public fileLink:IFileLink;\n\n @Input() public allowEditing = false;\n\n @Input() public disabled = true;\n\n @Output() public removeFileLink = new EventEmitter();\n\n @ViewChild('avatar') avatar:ElementRef;\n\n infoTimestampText:string;\n\n fileLinkIcon:IFileIcon;\n\n downloadAllowed:boolean;\n\n viewAllowed:boolean;\n\n tooltipAllignment:SpotDropAlignmentOption = SpotDropAlignmentOption.TopLeft;\n\n text = {\n title: {\n openFile: this.i18n.t('js.storages.file_links.open'),\n openFileLocation: this.i18n.t('js.storages.file_links.open_location'),\n removeFileLink: this.i18n.t('js.storages.file_links.remove'),\n downloadFileLink: '',\n },\n floatingText: {\n noViewPermission: this.i18n.t('js.storages.file_links.no_permission'),\n },\n removalTitle: this.i18n.t('js.storages.file_links.remove'),\n removalButtonLabel: this.i18n.t('js.storages.file_links.remove_short'),\n removalConfirmation: this.i18n.t('js.storages.file_links.remove_confirmation'),\n notAllowdTooltipText: this.i18n.t('js.storages.file_links.not_allowed_tooltip'),\n };\n\n constructor(\n private readonly i18n:I18nService,\n private readonly timezoneService:TimezoneService,\n private readonly confirmDialogService:ConfirmDialogService,\n private readonly principalRendererService:PrincipalRendererService,\n ) {}\n\n private get originData():IFileLinkOriginData {\n return this.fileLink.originData;\n }\n\n ngOnInit():void {\n if (this.originData.lastModifiedAt) {\n this.infoTimestampText = this.timezoneService.parseDatetime(this.originData.lastModifiedAt).fromNow();\n }\n\n this.fileLinkIcon = getIconForMimeType(this.originData.mimeType);\n\n this.downloadAllowed = !isDirectory(this.originData.mimeType);\n\n this.text.title.downloadFileLink = this.i18n.t(\n 'js.storages.file_links.download',\n { fileName: this.fileLink.originData.name },\n );\n\n this.viewAllowed = !this.fileLink._links.permission || this.fileLink._links.permission.href === fileLinkViewAllowed;\n }\n\n ngAfterViewInit():void {\n if (this.originData.lastModifiedByName) {\n this.principalRendererService.render(\n this.avatar.nativeElement,\n { name: this.originData.lastModifiedByName, href: '/external_users/1' },\n { hide: true, link: false },\n { hide: false, size: 'mini' },\n );\n } else {\n this.principalRendererService.render(\n this.avatar.nativeElement,\n { name: 'Not Available', href: '/placeholder_users/1' },\n { hide: true, link: false },\n { hide: false, size: 'mini' },\n );\n }\n }\n\n public confirmRemoveFileLink():void {\n const options:ConfirmDialogOptions = {\n text: {\n text: this.text.removalConfirmation,\n title: this.text.removalTitle,\n button_continue: this.text.removalButtonLabel,\n },\n icon: {\n continue: 'remove-link',\n },\n };\n void this.confirmDialogService\n .confirm(options)\n .then(() => { this.removeFileLink.emit(); })\n .catch(() => { /* confirmation rejected */ });\n }\n}\n","\n \n\n \n \n \n\n \n \n \n \n \n \n \n \n \n

    \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnInit,\n} from '@angular/core';\nimport {\n BehaviorSubject,\n Observable,\n} from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { CookieService } from 'ngx-cookie-service';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { IFileLink } from 'core-app/core/state/file-links/file-link.model';\nimport { IStorage } from 'core-app/core/state/storages/storage.model';\nimport { FileLinksResourceService } from 'core-app/core/state/file-links/file-links.service';\nimport {\n fileLinkViewError,\n nextcloud,\n storageAuthorizationError,\n storageConnected,\n storageFailedAuthorization,\n} from 'core-app/shared/components/file-links/file-links-constants.const';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { StorageActionButton } from 'core-app/shared/components/file-links/storage-information/storage-action-button';\nimport {\n StorageInformationBox,\n} from 'core-app/shared/components/file-links/storage-information/storage-information-box';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport {\n FilePickerModalComponent,\n} from 'core-app/shared/components/file-links/file-picker-modal/file-picker-modal.component';\nimport { IHalResourceLink } from 'core-app/core/state/hal-resource';\n\n@Component({\n selector: 'op-file-link-list',\n templateUrl: './file-link-list.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FileLinkListComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public resource:HalResource;\n\n @Input() public storage:IStorage;\n\n fileLinks$:Observable;\n\n allowEditing$:Observable;\n\n disabled = false;\n\n storageType:string;\n\n storageInformation = new BehaviorSubject([]);\n\n showLinkFilesAction = new BehaviorSubject(false);\n\n private isLoggedIn = false;\n\n private readonly storageTypeMap:Record = {};\n\n text = {\n infoBox: {\n emptyStorageHeader: (storageType:string):string => this.i18n.t('js.storages.link_files_in_storage', { storageType }),\n emptyStorageContent: (storageType:string):string => this.i18n.t('js.storages.information.no_file_links', { storageType }),\n emptyStorageButton: (storageType:string):string => this.i18n.t('js.storages.open_storage', { storageType }),\n fileLinkErrorHeader: this.i18n.t('js.storages.information.live_data_error'),\n fileLinkErrorContent: (storageType:string):string => this.i18n.t('js.storages.information.live_data_error_description', { storageType }),\n connectionErrorHeader: (storageType:string):string => this.i18n.t('js.storages.no_connection', { storageType }),\n connectionErrorContent: (storageType:string):string => this.i18n.t('js.storages.information.connection_error', { storageType }),\n authorizationFailureHeader: (storageType:string):string => this.i18n.t('js.storages.login_to', { storageType }),\n authorizationFailureContent: (storageType:string):string => this.i18n.t('js.storages.information.not_logged_in', { storageType }),\n loginButton: (storageType:string):string => this.i18n.t('js.storages.login', { storageType }),\n },\n actions: {\n linkFile: (storageType:string):string => this.i18n.t('js.storages.link_files_in_storage', { storageType }),\n linkExisting: this.i18n.t('js.storages.link_existing_files'),\n },\n };\n\n public get storageFileLinkingEnabled():boolean {\n return this.configurationService.activeFeatureFlags.includes('storageFileLinking');\n }\n\n private get storageFilesLocation():string {\n return this.storage._links.open.href;\n }\n\n constructor(\n private readonly i18n:I18nService,\n private readonly cookieService:CookieService,\n private readonly opModalService:OpModalService,\n private readonly currentUserService:CurrentUserService,\n private readonly configurationService:ConfigurationService,\n private readonly fileLinkResourceService:FileLinksResourceService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.initializeStorageTypes();\n\n this.storageType = this.storageTypeMap[this.storage._links.type.href];\n\n this.disabled = this.storage._links.authorizationState.href !== storageConnected;\n\n this.fileLinks$ = this.fileLinkResourceService.collection(this.collectionKey);\n\n this.currentUserService.isLoggedIn$\n .pipe(this.untilDestroyed())\n .subscribe((isLoggedIn) => { this.isLoggedIn = isLoggedIn; });\n\n this.fileLinks$\n .pipe(this.untilDestroyed())\n .subscribe((fileLinks) => {\n if (isNewResource(this.resource)) {\n this.resource.fileLinks = { elements: fileLinks.map((a) => a._links?.self) };\n }\n\n this.storageInformation.next(this.instantiateStorageInformation(fileLinks));\n this.showLinkFilesAction.next(!this.disabled && fileLinks.length > 0);\n });\n\n this.allowEditing$ = this\n .currentUserService\n .hasCapabilities$('file_links/manage', (this.resource.project as unknown&{ id:string }).id);\n }\n\n public removeFileLink(fileLink:IFileLink):void {\n this.fileLinkResourceService.remove(this.collectionKey, fileLink);\n }\n\n public openStorageLocation():void {\n window.open(this.storageFilesLocation, '_blank');\n }\n\n public openLinkFilesDialog():void {\n this.fileLinks$\n .pipe(take(1))\n .subscribe((fileLinks) => {\n const locals = {\n storageType: this.storage._links.type.href,\n storageTypeName: this.storageType,\n storageName: this.storage.name,\n storageLocation: this.storageFilesLocation,\n storageLink: this.storage._links.self,\n addFileLinksHref: (this.resource.$links as unknown&{ addFileLink:IHalResourceLink }).addFileLink.href,\n collectionKey: this.collectionKey,\n fileLinks,\n };\n this.opModalService.show(FilePickerModalComponent, 'global', locals);\n });\n }\n\n private instantiateStorageInformation(fileLinks:IFileLink[]):StorageInformationBox[] {\n if (!this.isLoggedIn) {\n return [];\n }\n\n switch (this.storage._links.authorizationState.href) {\n case storageFailedAuthorization:\n return [this.failedAuthorizationInformation];\n case storageAuthorizationError:\n return [this.authorizationErrorInformation];\n case storageConnected:\n if (fileLinks.length === 0) {\n return [this.emptyStorageInformation];\n }\n if (fileLinks.filter((fileLink) => fileLink._links.permission?.href === fileLinkViewError).length > 0) {\n this.disabled = true;\n return [this.fileLinkErrorInformation];\n }\n return [];\n default:\n return [];\n }\n }\n\n private get failedAuthorizationInformation():StorageInformationBox {\n return new StorageInformationBox(\n 'import',\n this.text.infoBox.authorizationFailureHeader(this.storageType),\n this.text.infoBox.authorizationFailureContent(this.storageType),\n [new StorageActionButton(\n this.text.infoBox.loginButton(this.storageType),\n () => {\n if (this.storage._links.authorize) {\n const nonce = uuidv4();\n this.setAuthorizationCallbackCookie(nonce);\n window.location.href = FileLinkListComponent.authorizationFailureActionUrl(\n this.storage._links.authorize.href,\n nonce,\n );\n } else {\n throw new Error('Authorize link is missing!');\n }\n },\n )],\n );\n }\n\n private get authorizationErrorInformation():StorageInformationBox {\n return new StorageInformationBox(\n 'remove-link',\n this.text.infoBox.connectionErrorHeader(this.storageType),\n this.text.infoBox.connectionErrorContent(this.storageType),\n [],\n );\n }\n\n private get emptyStorageInformation():StorageInformationBox {\n return new StorageInformationBox(\n 'add-link',\n this.text.infoBox.emptyStorageHeader(this.storageType),\n this.text.infoBox.emptyStorageContent(this.storageType),\n [new StorageActionButton(\n this.text.infoBox.emptyStorageButton(this.storageType),\n () => {\n window.open(this.storageFilesLocation, '_blank');\n },\n )],\n );\n }\n\n private get fileLinkErrorInformation():StorageInformationBox {\n return new StorageInformationBox(\n 'error',\n this.text.infoBox.fileLinkErrorHeader,\n this.text.infoBox.fileLinkErrorContent(this.storageType),\n [],\n );\n }\n\n private get collectionKey():string {\n return isNewResource(this.resource) ? 'new' : this.fileLinkSelfLink;\n }\n\n private get fileLinkSelfLink():string {\n const fileLinks = this.resource.fileLinks as unknown&{ href:string };\n return `${fileLinks.href}?filters=[{\"storage\":{\"operator\":\"=\",\"values\":[\"${this.storage.id}\"]}}]`;\n }\n\n private setAuthorizationCallbackCookie(nonce:string):void {\n this.cookieService.set(`oauth_state_${nonce}`, window.location.href, {\n path: '/',\n });\n }\n\n private static authorizationFailureActionUrl(baseUrl:string, nonce:string):string {\n return `${baseUrl}&state=${nonce}`;\n }\n\n private initializeStorageTypes() {\n this.storageTypeMap[nextcloud] = this.i18n.t('js.storages.types.nextcloud');\n }\n}\n","\n \n \n \n \n \n\n \n\n \n \n\n \n
    \n \n \n
    \n\n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n OnInit,\n} from '@angular/core';\nimport {\n combineLatest,\n Observable,\n} from 'rxjs';\nimport {\n catchError,\n map,\n} from 'rxjs/operators';\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { StoragesResourceService } from 'core-app/core/state/storages/storages.service';\nimport { IStorage } from 'core-app/core/state/storages/storage.model';\nimport { ProjectsResourceService } from 'core-app/core/state/projects/projects.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\n@Component({\n selector: 'op-files-tab',\n templateUrl: './op-files-tab.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageFilesTabComponent implements OnInit {\n workPackage:WorkPackageResource;\n\n text = {\n attachments: {\n label: this.i18n.t('js.label_attachments'),\n },\n file_links: {\n label: this.i18n.t('js.label_nextcloud'),\n },\n };\n\n showAttachmentHeader$:Observable;\n\n storages$:Observable;\n\n constructor(\n private readonly i18n:I18nService,\n private readonly hook:HookService,\n private readonly currentUserService:CurrentUserService,\n private readonly projectsResourceService:ProjectsResourceService,\n private readonly storagesResourceService:StoragesResourceService,\n private readonly apiV3:ApiV3Service,\n private readonly toast:ToastService,\n ) { }\n\n ngOnInit():void {\n const project = this.workPackage.project as HalResource;\n if (project.id === null) {\n return;\n }\n\n const canViewFileLinks = this.currentUserService.hasCapabilities$('file_links/view', project.id);\n\n this.storages$ = this\n .storagesResourceService\n .collection(project.href as string)\n .pipe(\n catchError((error) => {\n this.toast.addError(error);\n throw error;\n }),\n );\n\n this.showAttachmentHeader$ = combineLatest(\n [\n this.storages$,\n canViewFileLinks,\n ],\n ).pipe(\n map(([storages, viewPermission]) => storages.length > 0 && viewPermission),\n );\n }\n}\n","import { Injector } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { WorkPackageWatchersService } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watchers.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { map } from 'rxjs/operators';\n\nexport function workPackageWatchersCount(\n workPackage:WorkPackageResource,\n injector:Injector,\n):Observable {\n const watcherService = injector.get(WorkPackageWatchersService);\n return watcherService\n .requireAndStream(workPackage)\n .pipe(\n map((watchers:HalResource[]) => watchers.length),\n );\n}\n","import { Injector } from '@angular/core';\nimport { combineLatest, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\n\nexport function workPackageRelationsCount(\n workPackage:WorkPackageResource,\n injector:Injector,\n):Observable {\n const wpRelations = injector.get(WorkPackageRelationsService);\n const apiV3Service = injector.get(ApiV3Service);\n const wpId = workPackage.id!.toString();\n\n wpRelations.require(wpId);\n\n return combineLatest([\n wpRelations\n .state(wpId.toString())\n .values$(),\n apiV3Service\n .work_packages\n .id(wpId)\n .requireAndStream(),\n ])\n .pipe(\n map(([relations, workPackage]) => {\n const relationCount = _.size(relations);\n const childrenCount = _.size(workPackage.children);\n\n return relationCount + childrenCount;\n }),\n );\n}\n","import { Injector } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WpSingleViewService } from 'core-app/features/work-packages/routing/wp-view-base/state/wp-single-view.service';\n\nexport function workPackageNotificationsCount(\n workPackage:WorkPackageResource,\n injector:Injector,\n):Observable {\n const storeService = injector.get(WpSingleViewService);\n return storeService.nonDateAlertNotificationsCount$;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injector } from '@angular/core';\nimport { combineLatest, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { FileLinksResourceService } from 'core-app/core/state/file-links/file-links.service';\nimport { AttachmentsResourceService } from 'core-app/core/state/attachments/attachments.service';\n\nexport function workPackageFilesCount(\n workPackage:WorkPackageResource,\n injector:Injector,\n):Observable {\n const attachmentService = injector.get(AttachmentsResourceService);\n const fileLinkService = injector.get(FileLinksResourceService);\n\n return combineLatest(\n [\n attachmentService.collection(workPackage.$links.attachments.href || ''),\n fileLinkService.collection(workPackage.$links.fileLinks?.href || ''),\n ],\n ).pipe(\n map(([a, f]) => a.length + f.length),\n );\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { from } from 'rxjs';\nimport { StateService } from '@uirouter/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WpTabDefinition } from 'core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/tab';\nimport {\n WorkPackageRelationsTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/relations-tab/relations-tab.component';\nimport {\n WorkPackageOverviewTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/overview-tab/overview-tab.component';\nimport {\n WorkPackageActivityTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-tab.component';\nimport {\n WorkPackageWatchersTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/watchers-tab.component';\nimport {\n WorkPackageFilesTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/files-tab/op-files-tab.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n workPackageWatchersCount,\n} from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-watchers-count.function';\nimport {\n workPackageRelationsCount,\n} from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-relations-count.function';\nimport {\n workPackageNotificationsCount,\n} from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-notifications-count.function';\nimport {\n workPackageFilesCount,\n} from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-files-count.function';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkPackageTabsService {\n private registeredTabs:WpTabDefinition[];\n\n constructor(\n private $state:StateService,\n private I18n:I18nService,\n private injector:Injector,\n ) {\n this.registeredTabs = this.buildDefaultTabs();\n }\n\n get tabs():WpTabDefinition[] {\n return [...this.registeredTabs];\n }\n\n register(...tabs:WpTabDefinition[]):void {\n this.registeredTabs = [\n ...this.registeredTabs,\n ...tabs,\n ];\n }\n\n patchTabCondition(id:string, displayable:(workPackage:WorkPackageResource, $state:StateService) => boolean):void {\n const tabDefinition = this.registeredTabs.find((tab) => tab.id === id);\n if (tabDefinition) {\n tabDefinition.displayable = displayable;\n }\n }\n\n getDisplayableTabs(workPackage:WorkPackageResource):WpTabDefinition[] {\n return this\n .tabs\n .filter(\n (tab) => !tab.displayable || tab.displayable(workPackage, this.$state),\n )\n .map(\n (tab) => ({\n ...tab,\n counter: tab.count\n ? (injector:Injector) => tab.count!(workPackage, injector || this.injector) // eslint-disable-line @typescript-eslint/no-non-null-assertion\n : (_:Injector) => from([0]),\n }),\n );\n }\n\n getTab(tabId:string, workPackage:WorkPackageResource):WpTabDefinition|undefined {\n return this.getDisplayableTabs(workPackage).find(({ id }) => id === tabId);\n }\n\n private buildDefaultTabs():WpTabDefinition[] {\n return [\n {\n component: WorkPackageOverviewTabComponent,\n name: this.I18n.t('js.work_packages.tabs.overview'),\n id: 'overview',\n displayable: (_, $state) => $state.includes('**.details.*'),\n },\n {\n id: 'activity',\n component: WorkPackageActivityTabComponent,\n name: I18n.t('js.work_packages.tabs.activity'),\n count: workPackageNotificationsCount,\n showCountAsBubble: true,\n },\n {\n id: 'files',\n component: WorkPackageFilesTabComponent,\n name: I18n.t('js.work_packages.tabs.files'),\n count: workPackageFilesCount,\n },\n {\n id: 'relations',\n component: WorkPackageRelationsTabComponent,\n name: I18n.t('js.work_packages.tabs.relations'),\n count: workPackageRelationsCount,\n },\n {\n id: 'watchers',\n component: WorkPackageWatchersTabComponent,\n name: I18n.t('js.work_packages.tabs.watchers'),\n displayable: (workPackage) => !!workPackage.watchers,\n count: workPackageWatchersCount,\n },\n ];\n }\n}\n","
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'wp-type-status',\n templateUrl: './wp-type-status.html',\n})\nexport class WorkPackageTypeStatusComponent {\n @Input('workPackage') workPackage:WorkPackageResource;\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageWatchersService } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watchers.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Component({\n selector: 'wp-watcher-button',\n templateUrl: './wp-watcher-button.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageWatcherButtonComponent extends UntilDestroyedMixin implements OnInit {\n @Input('workPackage') public workPackage:WorkPackageResource;\n\n @Input('showText') public showText = false;\n\n @Input('disabled') public disabled = false;\n\n public buttonText:string;\n\n public buttonTitle:string;\n\n public buttonClass:string;\n\n public buttonId:string;\n\n public watchIconClass:string;\n\n constructor(readonly I18n:I18nService,\n readonly wpWatchersService:WorkPackageWatchersService,\n readonly apiV3Service:ApiV3Service,\n readonly cdRef:ChangeDetectorRef) {\n super();\n }\n\n ngOnInit() {\n this\n .apiV3Service\n .work_packages\n .id(this.workPackage)\n .requireAndStream()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp:WorkPackageResource) => {\n this.workPackage = wp;\n this.setWatchStatus();\n this.cdRef.detectChanges();\n });\n }\n\n public get isWatched() {\n return this.workPackage.hasOwnProperty('unwatch');\n }\n\n public get displayWatchButton() {\n return this.isWatched || this.workPackage.hasOwnProperty('watch');\n }\n\n public toggleWatch() {\n const toggleLink = this.nextStateLink();\n\n toggleLink(toggleLink.$link.payload).then(() => {\n this.wpWatchersService.clear(this.workPackage.id);\n this\n .apiV3Service\n .work_packages\n .id(this.workPackage)\n .refresh();\n });\n }\n\n public nextStateLink() {\n const linkName = this.isWatched ? 'unwatch' : 'watch';\n return this.workPackage[linkName];\n }\n\n private setWatchStatus() {\n if (this.isWatched) {\n this.buttonTitle = this.I18n.t('js.label_unwatch_work_package');\n this.buttonText = this.I18n.t('js.label_unwatch');\n this.buttonClass = '-active';\n this.buttonId = 'unwatch-button';\n this.watchIconClass = 'icon-watched';\n } else {\n this.buttonTitle = this.I18n.t('js.label_watch_work_package');\n this.buttonText = this.I18n.t('js.label_watch');\n this.buttonClass = '';\n this.buttonId = 'watch-button';\n this.watchIconClass = 'icon-unwatched';\n }\n }\n}\n","import {\n derive,\n input,\n InputState,\n State,\n StatesGroup,\n} from 'reactivestates';\nimport { Subject } from 'rxjs';\nimport { Injectable } from '@angular/core';\nimport { map } from 'rxjs/operators';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport {\n GroupObject,\n WorkPackageCollectionResource,\n} from 'core-app/features/hal/resources/wp-collection-resource';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { WorkPackageDisplayRepresentationValue } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\nimport { QueryFilterInstanceSchemaResource } from 'core-app/features/hal/resources/query-filter-instance-schema-resource';\nimport { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';\nimport { QuerySortByResource } from 'core-app/features/hal/resources/query-sort-by-resource';\nimport { QueryGroupByResource } from 'core-app/features/hal/resources/query-group-by-resource';\n\n@Injectable()\nexport class IsolatedQuerySpace extends StatesGroup {\n name = 'IsolatedQuerySpace';\n\n // The query that results in this table state\n query:InputState = input();\n\n // the query form associated with the table\n queryForm = input();\n\n // the results associated with the table/time-entry-changeset\n results = input();\n\n // all groups returned as results\n groups = input();\n\n // Set of columns in strict order of appearance\n columns = input();\n\n // Current state of collapsed groups (if any)\n collapsedGroups = input<{ [identifier:string]:boolean }>();\n\n // State to be updated when the table is up to date\n tableRendered = input();\n\n // Event to be raised when the timeline is up to date\n timelineRendered = new Subject();\n\n renderedWorkPackages:State = derive(this.tableRendered, ($) => $.pipe(\n map((rows) => rows.filter((row) => !!row.workPackageId)),\n ));\n\n renderedWorkPackageIds:State = derive(this.renderedWorkPackages, ($) => $.pipe(\n map((rows) => rows.map((row) => row.workPackageId!.toString())),\n ));\n\n // Subject used to unregister all listeners of states above.\n stopAllSubscriptions = new Subject();\n\n // Required work packages to be rendered by hierarchy mode + relation columns\n additionalRequiredWorkPackages = input();\n\n // Input state that emits whenever table services have initialized\n initialized = input();\n\n // Available states\n available = {\n // Available columns\n columns: input(),\n\n // Available SortBy Columns\n sortBy: input(),\n\n // Available GroupBy columns\n groupBy: input(),\n\n // Available filter schemas (derived from their schema)\n filters: input(),\n\n // Display of the WP results\n displayRepresentation: input(),\n };\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Directive, ElementRef, Injector } from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { OpTableActionsService } from 'core-app/features/work-packages/components/wp-table/table-actions/table-actions.service';\nimport { WorkPackageViewRelationColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-relation-columns.service';\nimport { WorkPackageViewPaginationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-pagination.service';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { WorkPackageViewSumService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sum.service';\nimport { WorkPackageViewAdditionalElementsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-additional-elements.service';\nimport { WorkPackageViewHighlightingService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-highlighting.service';\nimport { WorkPackageCreateService } from 'core-app/features/work-packages/components/wp-new/wp-create.service';\nimport { WorkPackageStatesInitializationService } from 'core-app/features/work-packages/components/wp-list/wp-states-initialization.service';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { WorkPackageRelationsHierarchyService } from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service';\nimport { WorkPackageFiltersService } from 'core-app/features/work-packages/components/filters/wp-filters/wp-filters.service';\nimport { WorkPackageContextMenuHelperService } from 'core-app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { WpChildrenInlineCreateService } from 'core-app/features/work-packages/components/wp-relations/embedded/children/wp-children-inline-create.service';\nimport { WpRelationInlineCreateService } from 'core-app/features/work-packages/components/wp-relations/embedded/relations/wp-relation-inline-create.service';\nimport { WorkPackagesListChecksumService } from 'core-app/features/work-packages/components/wp-list/wp-list-checksum.service';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { TableDragActionsRegistryService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-actions-registry.service';\nimport { WorkPackageViewOrderService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service';\nimport { CausedUpdatesService } from 'core-app/features/boards/board/caused-updates/caused-updates.service';\nimport { WorkPackageCardViewService } from 'core-app/features/work-packages/components/wp-card-view/services/wp-card-view.service';\nimport { WorkPackageViewDisplayRepresentationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\nimport { WorkPackageViewIncludeSubprojectsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-include-subprojects.service';\nimport { WorkPackageViewHierarchyIdentationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy-indentation.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { TimeEntryCreateService } from 'core-app/shared/components/time_entries/create/create.service';\nimport { WorkPackageViewCollapsedGroupsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-collapsed-groups.service';\nimport { WorkPackageService } from 'core-app/features/work-packages/services/work-package.service';\n\n/**\n * Directive to open a work package query 'space', an isolated injector hierarchy\n * that provides access to query-bound data and services, especially around the querySpace services.\n *\n * If you add services that depend on a table state, they should be provided here, not globally\n * in a module.\n */\n@Directive({\n selector: '[wp-isolated-query-space]',\n providers: [\n // Override the hal notification service\n { provide: HalResourceNotificationService, useExisting: WorkPackageNotificationService },\n\n // Open the isolated space first, order is important here\n IsolatedQuerySpace,\n OpTableActionsService,\n\n // Work package table services\n WorkPackagesListChecksumService,\n WorkPackagesListService,\n WorkPackageViewRelationColumnsService,\n WorkPackageViewPaginationService,\n WorkPackageViewGroupByService,\n WorkPackageViewCollapsedGroupsService,\n WorkPackageViewHierarchiesService,\n WorkPackageViewSortByService,\n WorkPackageViewColumnsService,\n WorkPackageViewFiltersService,\n WorkPackageViewTimelineService,\n WorkPackageViewSelectionService,\n WorkPackageViewSumService,\n WorkPackageViewAdditionalElementsService,\n WorkPackageViewFocusService,\n WorkPackageViewHighlightingService,\n WorkPackageViewDisplayRepresentationService,\n WorkPackageViewIncludeSubprojectsService,\n WorkPackageViewOrderService,\n WorkPackageViewHierarchyIdentationService,\n CausedUpdatesService,\n\n WorkPackageService,\n WorkPackageRelationsHierarchyService,\n WorkPackageFiltersService,\n WorkPackageContextMenuHelperService,\n\n // Provide a separate service for creation events of WP Inline create\n // This can be hierarchically injected to provide isolated events on an embedded table\n WorkPackageInlineCreateService,\n WpChildrenInlineCreateService,\n WpRelationInlineCreateService,\n\n WorkPackageCardViewService,\n\n HalResourceEditingService,\n TimeEntryCreateService,\n WorkPackageCreateService,\n\n WorkPackageStatesInitializationService,\n\n // Table Drag & Drop actions\n TableDragActionsRegistryService,\n ],\n})\nexport class WorkPackageIsolatedQuerySpaceDirective {\n constructor(private elementRef:ElementRef,\n public querySpace:IsolatedQuerySpace,\n private injector:Injector) {\n debugLog('Opening isolated query space %O in %O', injector, elementRef.nativeElement);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport class WorkPackageCellLabels {\n constructor(public readonly center:HTMLDivElement|null,\n public readonly left:HTMLDivElement,\n public readonly leftHover:HTMLDivElement|null,\n public readonly right:HTMLDivElement,\n public readonly rightHover:HTMLDivElement|null,\n public readonly farRight:HTMLDivElement,\n public readonly withAlternativeLabels?:boolean) {\n }\n}\n","import * as moment from 'moment';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { DisplayFieldRenderer } from 'core-app/shared/components/fields/display/display-field-renderer';\nimport { Injector } from '@angular/core';\nimport { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\nimport { HierarchyRenderPass } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/hierarchy/hierarchy-render-pass';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport { WorkPackageCellLabels } from './wp-timeline-cell-labels';\nimport {\n calculatePositionValueForDayCount,\n calculatePositionValueForDayCountingPx,\n RenderInfo,\n timelineBackgroundElementClass,\n timelineElementCssClass,\n timelineMarkerSelectionStartClass,\n} from '../wp-timeline';\nimport Moment = moment.Moment;\n\nexport interface CellDateMovement {\n // Target values to move work package to\n startDate?:moment.Moment;\n dueDate?:moment.Moment;\n // Target value to move milestone to\n date?:moment.Moment;\n}\n\nexport type LabelPosition = 'left'|'right'|'farRight';\nexport type MouseDirection = 'left'|'right'|'both'|'create'|'dragright';\n\nexport const classNameLeftLabel = 'labelLeft';\nexport const classNameRightContainer = 'containerRight';\nexport const classNameRightLabel = 'labelRight';\nexport const classNameLeftHoverLabel = 'labelHoverLeft';\nexport const classNameRightHoverLabel = 'labelHoverRight';\nexport const classNameHoverStyle = '-label-style';\nexport const classNameFarRightLabel = 'labelFarRight';\nexport const classNameShowOnHover = 'show-on-hover';\nexport const classNameHideOnHover = 'hide-on-hover';\nexport const classNameLeftHandle = 'leftHandle';\nexport const classNameRightHandle = 'rightHandle';\nexport const classNameBarLabel = 'bar-label';\n\nexport class TimelineCellRenderer {\n @InjectField() wpTableTimeline:WorkPackageViewTimelineService;\n\n @InjectField() weekdayService:WeekdayService;\n\n @InjectField() schemaCache:SchemaCacheService;\n\n @InjectField() I18n!:I18nService;\n\n public text = {\n label_children_derived_duration: this.I18n.t('js.label_children_derived_duration'),\n };\n\n public ganttChartRowHeight:number;\n\n public mouseDirection:MouseDirection;\n\n public fieldRenderer:DisplayFieldRenderer = new DisplayFieldRenderer(this.injector, 'timeline');\n\n protected mouseDownCursorType:string;\n\n constructor(readonly injector:Injector,\n readonly workPackageTimeline:WorkPackageTimelineTableController) {\n this.ganttChartRowHeight = +getComputedStyle(document.documentElement)\n .getPropertyValue('--table-timeline--row-height')\n .replace('px', '');\n }\n\n public get type():string {\n return 'bar';\n }\n\n public canMoveDates(wp:WorkPackageResource):boolean {\n const schema = this.schemaCache.of(wp);\n return schema.startDate.writable && schema.dueDate.writable && schema.isAttributeEditable('startDate');\n }\n\n public isEmpty(wp:WorkPackageResource) {\n const start = moment(wp.startDate as any);\n const due = moment(wp.dueDate as any);\n const noStartAndDueValues = _.isNaN(start.valueOf()) && _.isNaN(due.valueOf());\n return noStartAndDueValues;\n }\n\n public displayPlaceholderUnderCursor(ev:MouseEvent, renderInfo:RenderInfo):HTMLElement {\n const [dateUnderCursor, dayOffset] = this.cursorDateAndDayOffset(ev, renderInfo);\n const duration = this.displayDurationForDate(renderInfo, dateUnderCursor);\n const width = duration * renderInfo.viewParams.pixelPerDay || 30;\n\n const placeholder = document.createElement('div');\n placeholder.style.pointerEvents = 'none';\n placeholder.style.position = 'absolute';\n placeholder.style.height = '1em';\n placeholder.style.width = `${width}px`;\n placeholder.style.zIndex = '9999';\n placeholder.style.left = `${dayOffset * renderInfo.viewParams.pixelPerDay}px`;\n this.applyTypeColor(renderInfo, placeholder);\n\n return placeholder;\n }\n\n /**\n * Assign changed dates to the work package.\n * For generic work packages, assigns start and finish date.\n *\n */\n public assignDateValues(\n change:WorkPackageChangeset,\n labels:WorkPackageCellLabels,\n dates:CellDateMovement,\n ):void {\n this.assignDate(change, 'startDate', dates.startDate as moment.Moment);\n this.assignDate(change, 'dueDate', dates.dueDate as moment.Moment);\n\n this.updateLabels(true, labels, change);\n }\n\n /**\n * Handle movement by days of the work package to either (or both) edge(s)\n * depending on which initial date was set.\n */\n public onDaysMoved(change:WorkPackageChangeset,\n dayUnderCursor:Moment,\n delta:number,\n direction:MouseDirection):CellDateMovement {\n const initialStartDate = change.pristineResource.startDate;\n const initialDueDate = change.pristineResource.dueDate;\n\n const now = moment().format('YYYY-MM-DD');\n\n const startDate = moment(change.projectedResource.startDate);\n const dueDate = moment(change.projectedResource.dueDate);\n\n const dates:CellDateMovement = {};\n\n if (direction === 'left') {\n dates.startDate = moment(initialStartDate || initialDueDate).add(delta, 'days');\n } else if (direction === 'right') {\n // When no due date is present and the start date is in the past,\n // we assume the task hasn't finished yet, meaning the end date is not in the past.\n // To cover this case we have to choose the start date, only when it's in the future,\n // and choose now if the start date is in the past.\n const calculatedDueDate = initialDueDate || (now > initialStartDate ? now : initialStartDate);\n dates.dueDate = moment(calculatedDueDate).add(delta, 'days');\n } else if (direction === 'both') {\n if (initialStartDate) {\n dates.startDate = moment(initialStartDate).add(delta, 'days');\n }\n if (initialDueDate) {\n dates.dueDate = moment(initialDueDate).add(delta, 'days');\n }\n } else if (direction === 'dragright') {\n dates.dueDate = startDate.clone().add(delta, 'days');\n }\n\n // avoid negative \"overdrag\" if only start or due are changed\n if (direction !== 'both') {\n if (dates.startDate !== undefined && dates.startDate.isAfter(dueDate)) {\n dates.startDate = dueDate;\n } else if (dates.dueDate !== undefined && dates.dueDate.isBefore(startDate)) {\n dates.dueDate = startDate;\n }\n }\n\n return dates;\n }\n\n public onMouseDown(ev:MouseEvent,\n dateForCreate:string|null,\n renderInfo:RenderInfo,\n labels:WorkPackageCellLabels):MouseDirection {\n // check for active selection mode\n if (renderInfo.viewParams.activeSelectionMode) {\n renderInfo.viewParams.activeSelectionMode(renderInfo.workPackage);\n ev.preventDefault();\n this.mouseDirection = 'both';\n return 'both'; // irrelevant\n }\n\n const projection = renderInfo.change.projectedResource;\n let direction:Exclude;\n\n // Update the cursor and maybe set start/due values\n if (jQuery(ev.target!).hasClass(classNameLeftHandle)) {\n // only left\n direction = 'left';\n this.mouseDirection = 'left';\n this.mouseDownCursorType = 'col-resize';\n if (projection.startDate === null) {\n projection.startDate = projection.dueDate;\n }\n } else if (jQuery(ev.target!).hasClass(classNameRightHandle) || dateForCreate) {\n // only right\n direction = 'right';\n this.mouseDirection = 'right';\n this.mouseDownCursorType = 'col-resize';\n } else {\n // both\n direction = 'both';\n this.mouseDirection = 'both';\n this.mouseDownCursorType = 'ew-resize';\n }\n\n this.workPackageTimeline.forceCursor(this.mouseDownCursorType);\n\n if (dateForCreate) {\n const dateUnderCursor = this.cursorDateAndDayOffset(ev, renderInfo)[0];\n const duration = this.displayDurationForDate(renderInfo, dateUnderCursor) - 1;\n\n projection.startDate = dateForCreate;\n projection.dueDate = moment(dateForCreate).add(duration, 'days').format('YYYY-MM-DD');\n direction = 'dragright';\n this.mouseDirection = 'dragright';\n }\n\n this.updateLabels(true, labels, renderInfo.change);\n\n return direction;\n }\n\n public onMouseDownEnd(labels:WorkPackageCellLabels, change:WorkPackageChangeset) {\n // Reset the cursor set by onMouseDown\n this.mouseDownCursorType = '';\n this.workPackageTimeline.forceCursor(this.mouseDownCursorType);\n this.updateLabels(false, labels, change);\n }\n\n /**\n * @return true, if the element should still be displayed.\n * false, if the element must be removed from the timeline.\n */\n public update(element:HTMLDivElement, labels:WorkPackageCellLabels|null, renderInfo:RenderInfo):boolean {\n const { change } = renderInfo;\n const bar = element.querySelector(`.${timelineBackgroundElementClass}`) as HTMLElement;\n let start = moment(change.projectedResource.startDate);\n let due = moment(change.projectedResource.dueDate);\n\n if (_.isNaN(start.valueOf()) && _.isNaN(due.valueOf())) {\n element.style.visibility = 'hidden';\n } else {\n element.style.visibility = 'visible';\n }\n\n // only start date, fade out bar to the right\n if (_.isNaN(due.valueOf()) && !_.isNaN(start.valueOf())) {\n // Set due date to today\n due = moment();\n bar.style.backgroundImage = 'linear-gradient(90deg, rgba(255,255,255,0) 0%, #F1F1F1 100%)';\n }\n\n // only finish date, fade out bar to the left\n if (_.isNaN(start.valueOf()) && !_.isNaN(due.valueOf())) {\n start = due.clone();\n bar.style.backgroundImage = 'linear-gradient(90deg, #F1F1F1 0%, rgba(255,255,255,0) 80%)';\n }\n\n this.setElementPositionAndSize(element, renderInfo, start, due);\n\n // Update labels if any\n if (labels) {\n this.updateLabels(false, labels, change);\n }\n\n this.checkForActiveSelectionMode(renderInfo, bar);\n this.checkForSpecialDisplaySituations(renderInfo, bar);\n this.applyTypeColor(renderInfo, bar);\n\n return true;\n }\n\n public cursorDateAndDayOffset(ev:MouseEvent, renderInfo:RenderInfo):[Moment, number] {\n const dayOffset = Math.floor(ev.offsetX / renderInfo.viewParams.pixelPerDay);\n const dateUnderCursor = renderInfo.viewParams.dateDisplayStart.clone().add(dayOffset, 'days');\n return [dateUnderCursor, dayOffset];\n }\n\n protected checkForActiveSelectionMode(renderInfo:RenderInfo, element:HTMLElement) {\n if (renderInfo.viewParams.activeSelectionMode) {\n element.style.backgroundImage = ''; // required! unable to disable \"fade out bar\" with css\n\n if (renderInfo.viewParams.selectionModeStart === `${renderInfo.workPackage.id!}`) {\n jQuery(element).addClass(timelineMarkerSelectionStartClass);\n element.style.background = 'none';\n }\n }\n }\n\n /**\n * Takes the date under the cursor and the work package's duration.\n * It calculates the adjusted duration based on the number of NonWorkingDays\n * that fall in the range of the ( date .. date + duration ).\n * @param renderInfo\n * @param date where we start the duration calculation from\n * @return {number} the NonWorkingDays adjusted duration\n */\n\n protected displayDurationForDate(renderInfo:RenderInfo, date:Moment):number {\n const { workPackage } = renderInfo;\n let duration = Number(moment.duration(workPackage.duration || 'P1D').asDays().toFixed(0));\n\n if (workPackage.ignoreNonWorkingDays) {\n return duration;\n }\n\n const { dateDisplayEnd } = renderInfo.viewParams;\n let newDuration = 0;\n\n for (newDuration; newDuration < duration; newDuration++) {\n const currentDate = date.clone().add(newDuration, 'days');\n\n // Stop adding duration when we reach end of the visible table\n if (currentDate > dateDisplayEnd) {\n break;\n }\n // Extend the duration if the currentDate is non-working\n if (this.weekdayService.isNonWorkingDay(currentDate.toDate())) {\n duration += 1;\n }\n }\n return newDuration;\n }\n\n getMarginLeftOfLeftSide(renderInfo:RenderInfo):number {\n const projection = renderInfo.change.projectedResource;\n\n let start = moment(projection.startDate);\n const due = moment(projection.dueDate);\n start = _.isNaN(start.valueOf()) ? due.clone() : start;\n\n const offsetStart = start.diff(renderInfo.viewParams.dateDisplayStart, 'days');\n\n return calculatePositionValueForDayCountingPx(renderInfo.viewParams, offsetStart);\n }\n\n getMarginLeftOfRightSide(renderInfo:RenderInfo):number {\n const projection = renderInfo.change.projectedResource;\n\n let start = moment(projection.startDate);\n let due = moment(projection.dueDate);\n\n start = _.isNaN(start.valueOf()) ? due.clone() : start;\n due = _.isNaN(due.valueOf()) ? start.clone() : due;\n\n const offsetStart = start.diff(renderInfo.viewParams.dateDisplayStart, 'days');\n const duration = due.diff(start, 'days') + 1;\n\n return calculatePositionValueForDayCountingPx(renderInfo.viewParams, offsetStart + duration);\n }\n\n getPaddingLeftForIncomingRelationLines(renderInfo:RenderInfo):number {\n return renderInfo.viewParams.pixelPerDay / 8;\n }\n\n getPaddingRightForOutgoingRelationLines(renderInfo:RenderInfo):number {\n return 0;\n }\n\n /**\n * Render the generic cell element, a bar spanning from\n * start to finish date.\n */\n public render(renderInfo:RenderInfo):HTMLDivElement {\n const container = document.createElement('div');\n const bar = document.createElement('div');\n const left = document.createElement('div');\n const right = document.createElement('div');\n\n container.className = `${timelineElementCssClass} ${this.type}`;\n bar.className = timelineBackgroundElementClass;\n left.className = classNameLeftHandle;\n right.className = classNameRightHandle;\n container.appendChild(bar);\n container.appendChild(left);\n container.appendChild(right);\n\n return container;\n }\n\n createAndAddLabels(renderInfo:RenderInfo, element:HTMLElement):WorkPackageCellLabels {\n // create center label\n const labelCenter = document.createElement('div');\n labelCenter.classList.add(classNameBarLabel);\n this.applyTypeColor(renderInfo, labelCenter);\n element.appendChild(labelCenter);\n\n // create left label\n const labelLeft = document.createElement('div');\n labelLeft.classList.add(classNameLeftLabel, classNameHideOnHover);\n element.appendChild(labelLeft);\n\n // create right container\n const containerRight = document.createElement('div');\n containerRight.classList.add(classNameRightContainer);\n element.appendChild(containerRight);\n\n // create right label\n const labelRight = document.createElement('div');\n labelRight.classList.add(classNameRightLabel, classNameHideOnHover);\n containerRight.appendChild(labelRight);\n\n // create far right label\n const labelFarRight = document.createElement('div');\n labelFarRight.classList.add(classNameFarRightLabel, classNameHideOnHover);\n containerRight.appendChild(labelFarRight);\n\n // create left hover label\n const labelHoverLeft = document.createElement('div');\n labelHoverLeft.classList.add(classNameLeftHoverLabel, classNameShowOnHover, classNameHoverStyle);\n element.appendChild(labelHoverLeft);\n\n // create right hover label\n const labelHoverRight = document.createElement('div');\n labelHoverRight.classList.add(classNameRightHoverLabel, classNameShowOnHover, classNameHoverStyle);\n element.appendChild(labelHoverRight);\n\n const labels = new WorkPackageCellLabels(labelCenter, labelLeft, labelHoverLeft, labelRight, labelHoverRight, labelFarRight);\n this.updateLabels(false, labels, renderInfo.change);\n\n return labels;\n }\n\n protected applyTypeColor(renderInfo:RenderInfo, bg:HTMLElement):void {\n const wp = renderInfo.workPackage;\n const { type } = wp;\n const selectionMode = renderInfo.viewParams.activeSelectionMode;\n\n // Don't apply the class in selection mode\n const { id } = type;\n if (selectionMode) {\n bg.classList.remove(Highlighting.backgroundClass('type', id!));\n } else {\n bg.classList.add(Highlighting.backgroundClass('type', id!));\n }\n }\n\n protected assignDate(change:WorkPackageChangeset, attributeName:string, value:moment.Moment) {\n if (value) {\n change.projectedResource[attributeName] = value.format('YYYY-MM-DD');\n }\n }\n\n setElementPositionAndSize(element:HTMLElement, renderInfo:RenderInfo, start:moment.Moment, due:moment.Moment) {\n const { viewParams } = renderInfo;\n // offset left\n const offsetStart = start.diff(viewParams.dateDisplayStart, 'days');\n element.style.left = calculatePositionValueForDayCount(viewParams, offsetStart);\n\n // duration\n const duration = due.diff(start, 'days') + 1;\n element.style.width = calculatePositionValueForDayCount(viewParams, duration);\n\n // ensure minimum width\n if (!_.isNaN(start.valueOf()) || !_.isNaN(due.valueOf())) {\n const minWidth = _.max([renderInfo.viewParams.pixelPerDay, 2]);\n element.style.minWidth = `${minWidth}px`;\n }\n }\n\n cursorOrDatesAreNonWorking(evOrDates:MouseEvent|Moment[], renderInfo:RenderInfo, direction?:MouseDirection|null):boolean {\n if (renderInfo.workPackage.ignoreNonWorkingDays) {\n return false;\n }\n\n const dates = (evOrDates instanceof MouseEvent)\n ? [this.cursorDateAndDayOffset(evOrDates, renderInfo)[0]]\n : evOrDates;\n if (!renderInfo.workPackage.ignoreNonWorkingDays && direction === 'both' && this.weekdayService.isNonWorkingDay(dates[dates.length - 1].toDate())) {\n return false;\n }\n return dates.some((date) => this.weekdayService.isNonWorkingDay(date.toDate()));\n }\n\n /**\n * Changes the presentation of the work package.\n *\n * Known cases:\n * 1. Display a clamp if this work package is a parent element\n * and display a box wrapping all the visible children when the\n * parent is hovered\n */\n checkForSpecialDisplaySituations(renderInfo:RenderInfo, bar:HTMLElement) {\n const wp = renderInfo.workPackage;\n const row = bar.parentElement!.parentElement!;\n const selectionMode = renderInfo.viewParams.activeSelectionMode;\n\n // Cannot edit the work package if it has children\n // and it is not on 'Manual scheduling' mode\n if (!wp.isLeaf && !selectionMode && !wp.scheduleManually) {\n bar.classList.add('-readonly');\n } else {\n bar.classList.remove('-readonly');\n }\n\n // Display the children's duration clamp\n if (wp.derivedStartDate && wp.derivedDueDate) {\n const derivedStartDate = moment(wp.derivedStartDate);\n const derivedDueDate = moment(wp.derivedDueDate);\n const startDate = moment(renderInfo.change.projectedResource.startDate);\n const dueDate = moment(renderInfo.change.projectedResource.dueDate);\n const previousChildrenDurationBar = row.querySelector('.children-duration-bar');\n const childrenDurationBar = document.createElement('div');\n const childrenDurationHoverContainer = document.createElement('div');\n const visibleChildren = document.querySelectorAll(`.wp-timeline-cell.__hierarchy-group-${wp.id}:not([class*='__collapsed-group'])`).length || 0;\n\n childrenDurationBar.classList.add('children-duration-bar', '-clamp-style');\n childrenDurationBar.title = this.text.label_children_derived_duration;\n childrenDurationHoverContainer.classList.add('children-duration-hover-container');\n childrenDurationHoverContainer.style.height = `${this.ganttChartRowHeight * visibleChildren + 10}px`;\n\n if (derivedStartDate.isBefore(startDate) || derivedDueDate.isAfter(dueDate)) {\n childrenDurationBar.classList.add('-duration-overflow');\n }\n\n this.setElementPositionAndSize(childrenDurationBar, renderInfo, derivedStartDate, derivedDueDate);\n\n if (previousChildrenDurationBar) {\n previousChildrenDurationBar.remove();\n }\n\n childrenDurationBar.appendChild(childrenDurationHoverContainer);\n row.appendChild(childrenDurationBar);\n }\n\n // Check for non-working days and display a not-allowed cursor\n // when the startDate, dueDate are non-working days\n const { startDate, dueDate } = renderInfo.change.projectedResource;\n const invalidDates = this.cursorOrDatesAreNonWorking([moment(startDate), moment(dueDate)], renderInfo, this.mouseDirection);\n\n if (invalidDates) {\n this.workPackageTimeline.forceCursor('not-allowed');\n } else {\n // Restore the previous cursor set by onMouseDown\n this.workPackageTimeline.forceCursor(this.mouseDownCursorType);\n }\n }\n\n protected updateLabels(activeDragNDrop:boolean,\n labels:WorkPackageCellLabels,\n change:WorkPackageChangeset) {\n const labelConfiguration = this.wpTableTimeline.getNormalizedLabels(change.projectedResource);\n\n if (!activeDragNDrop) {\n // normal display\n this.renderLabel(change, labels, 'left', labelConfiguration.left);\n this.renderLabel(change, labels, 'right', labelConfiguration.right);\n this.renderLabel(change, labels, 'farRight', labelConfiguration.farRight);\n }\n\n // Update hover labels\n this.renderHoverLabels(labels, change);\n }\n\n protected renderHoverLabels(labels:WorkPackageCellLabels, change:WorkPackageChangeset) {\n this.renderLabel(change, labels, 'leftHover', 'startDate');\n this.renderLabel(change, labels, 'rightHover', 'dueDate');\n }\n\n protected renderLabel(change:WorkPackageChangeset,\n labels:WorkPackageCellLabels,\n position:LabelPosition|'leftHover'|'rightHover',\n attribute:string|null) {\n // Get the label position\n // Skip label if it does not exist (milestones)\n const label = labels[position];\n if (!label) {\n return;\n }\n\n // Reset label value\n label.innerHTML = '';\n\n if (attribute === null) {\n label.classList.remove('not-empty');\n return;\n }\n\n // Get the rendered field\n const [field, span] = this.fieldRenderer.renderFieldValue(change.projectedResource, attribute, change);\n\n if (label && field && span) {\n span.classList.add('label-content');\n label.appendChild(span);\n label.classList.add('not-empty');\n } else if (label) {\n label.classList.remove('not-empty');\n }\n }\n\n protected isParentWithVisibleChildren(wp:WorkPackageResource):boolean {\n if (!this.workPackageTimeline.inHierarchyMode) {\n return false;\n }\n\n const renderPass = this.workPackageTimeline.workPackageTable.lastRenderPass as HierarchyRenderPass|null;\n if (renderPass) {\n return !!renderPass.parentsWithVisibleChildren[wp.id!];\n }\n\n return false;\n }\n}\n","import * as moment from 'moment';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport {\n calculatePositionValueForDayCountingPx,\n RenderInfo,\n timelineElementCssClass,\n} from '../wp-timeline';\n\nimport {\n classNameFarRightLabel,\n classNameHideOnHover,\n classNameHoverStyle,\n classNameLeftHoverLabel,\n classNameLeftLabel,\n classNameRightContainer,\n classNameRightHoverLabel,\n classNameRightLabel,\n classNameShowOnHover,\n CellDateMovement,\n LabelPosition,\n TimelineCellRenderer,\n MouseDirection,\n} from './timeline-cell-renderer';\nimport { WorkPackageCellLabels } from './wp-timeline-cell-labels';\nimport Moment = moment.Moment;\n\nexport class TimelineMilestoneCellRenderer extends TimelineCellRenderer {\n public get type():string {\n return 'milestone';\n }\n\n public isEmpty(wp:WorkPackageResource) {\n const date = moment(wp.date as any);\n return _.isNaN(date.valueOf());\n }\n\n public canMoveDates(wp:WorkPackageResource) {\n const schema = this.schemaCache.of(wp);\n return schema.date.writable && schema.isAttributeEditable('date');\n }\n\n public displayPlaceholderUnderCursor(ev:MouseEvent, renderInfo:RenderInfo):HTMLElement {\n const days = Math.floor(ev.offsetX / renderInfo.viewParams.pixelPerDay);\n\n const placeholder = document.createElement('div');\n placeholder.className = 'timeline-element milestone';\n placeholder.style.pointerEvents = 'none';\n placeholder.style.height = '1em';\n placeholder.style.width = '1em';\n placeholder.style.left = `${days * renderInfo.viewParams.pixelPerDay}px`;\n\n const diamond = document.createElement('div');\n diamond.className = 'diamond';\n diamond.style.left = '0.5em';\n diamond.style.height = '1em';\n diamond.style.width = '1em';\n placeholder.appendChild(diamond);\n\n this.applyTypeColor(renderInfo, diamond);\n\n return placeholder;\n }\n\n /**\n * Assign changed dates to the work package.\n * For generic work packages, assigns start and finish date .\n *\n */\n public assignDateValues(change:WorkPackageChangeset,\n labels:WorkPackageCellLabels,\n dates:any):void {\n this.assignDate(change, 'date', dates.date);\n this.updateLabels(true, labels, change);\n }\n\n /**\n * Handle movement by days of milestone.\n */\n public onDaysMoved(change:WorkPackageChangeset,\n dayUnderCursor:Moment,\n delta:number,\n _direction:MouseDirection):CellDateMovement {\n const initialDate = change.pristineResource.date;\n const dates:CellDateMovement = {};\n\n if (initialDate) {\n dates.date = moment(initialDate).add(delta, 'days');\n }\n\n return dates;\n }\n\n public onMouseDown(ev:MouseEvent,\n dateForCreate:string | null,\n renderInfo:RenderInfo,\n labels:WorkPackageCellLabels):MouseDirection {\n // check for active selection mode\n if (renderInfo.viewParams.activeSelectionMode) {\n renderInfo.viewParams.activeSelectionMode(renderInfo.workPackage);\n ev.preventDefault();\n return 'both'; // irrelevant\n }\n\n let direction:'both' | 'create' = 'both';\n this.workPackageTimeline.forceCursor('ew-resize');\n\n if (dateForCreate) {\n renderInfo.change.projectedResource.date = dateForCreate;\n direction = 'create';\n return direction;\n }\n\n this.updateLabels(true, labels, renderInfo.change);\n\n return direction;\n }\n\n public update(element:HTMLDivElement, labels:WorkPackageCellLabels|null, renderInfo:RenderInfo):boolean {\n const { viewParams } = renderInfo;\n const date = moment(renderInfo.change.projectedResource.date);\n\n // abort if no date\n if (_.isNaN(date.valueOf())) {\n return false;\n }\n\n const diamond = jQuery('.diamond', element)[0];\n\n diamond.style.width = `${15}px`;\n diamond.style.height = `${15}px`;\n diamond.style.width = `${15}px`;\n diamond.style.height = `${15}px`;\n diamond.style.marginLeft = `${-(15 / 2) + (renderInfo.viewParams.pixelPerDay / 2)}px`;\n this.applyTypeColor(renderInfo, diamond);\n\n // offset left\n const offsetStart = date.diff(viewParams.dateDisplayStart, 'days');\n element.style.left = `${calculatePositionValueForDayCountingPx(viewParams, offsetStart)}px`;\n\n // Update labels if any\n if (labels) {\n this.updateLabels(false, labels, renderInfo.change);\n }\n\n this.checkForActiveSelectionMode(renderInfo, diamond);\n\n return true;\n }\n\n getMarginLeftOfLeftSide(renderInfo:RenderInfo):number {\n const { change } = renderInfo;\n const start = moment(change.projectedResource.date);\n const offsetStart = start.diff(renderInfo.viewParams.dateDisplayStart, 'days');\n return calculatePositionValueForDayCountingPx(renderInfo.viewParams, offsetStart);\n }\n\n getMarginLeftOfRightSide(ri:RenderInfo):number {\n return this.getMarginLeftOfLeftSide(ri) + ri.viewParams.pixelPerDay;\n }\n\n getPaddingLeftForIncomingRelationLines(renderInfo:RenderInfo):number {\n return (renderInfo.viewParams.pixelPerDay / 2) - 1;\n }\n\n getPaddingRightForOutgoingRelationLines(renderInfo:RenderInfo):number {\n return (15 / 2);\n }\n\n /**\n * Render a milestone element, a single day event with no resize, but\n * move functionality.\n */\n public render(renderInfo:RenderInfo):HTMLDivElement {\n const element = document.createElement('div');\n element.className = `${timelineElementCssClass} ${this.type}`;\n\n const diamond = document.createElement('div');\n diamond.className = 'diamond';\n element.appendChild(diamond);\n\n return element;\n }\n\n createAndAddLabels(renderInfo:RenderInfo, element:HTMLElement):WorkPackageCellLabels {\n // create left label\n const labelLeft = document.createElement('div');\n labelLeft.classList.add(classNameLeftLabel, classNameHideOnHover);\n element.appendChild(labelLeft);\n\n // create right container\n const containerRight = document.createElement('div');\n containerRight.classList.add(classNameRightContainer);\n element.appendChild(containerRight);\n\n // create right label\n const labelRight = document.createElement('div');\n labelRight.classList.add(classNameRightLabel, classNameHideOnHover);\n containerRight.appendChild(labelRight);\n\n // create far right label\n const labelFarRight = document.createElement('div');\n labelFarRight.classList.add(classNameFarRightLabel, classNameHideOnHover);\n containerRight.appendChild(labelFarRight);\n\n // Create right hover label\n const labelHoverRight = document.createElement('div');\n labelHoverRight.classList.add(classNameRightHoverLabel, classNameShowOnHover, classNameHoverStyle);\n element.appendChild(labelHoverRight);\n\n // Create left hover label\n const labelHoverLeft = document.createElement('div');\n labelHoverLeft.classList.add(classNameLeftHoverLabel, classNameShowOnHover, classNameHoverStyle);\n element.appendChild(labelHoverLeft);\n\n const labels = new WorkPackageCellLabels(null, labelLeft, labelHoverLeft, labelRight, labelHoverRight, labelFarRight, renderInfo.withAlternativeLabels);\n this.updateLabels(false, labels, renderInfo.change);\n\n return labels;\n }\n\n protected renderHoverLabels(labels:WorkPackageCellLabels, change:WorkPackageChangeset) {\n if (labels.withAlternativeLabels) {\n this.renderLabel(change, labels, 'leftHover', 'date');\n this.renderLabel(change, labels, 'rightHover', 'subject');\n } else {\n this.renderLabel(change, labels, 'rightHover', 'date');\n }\n }\n\n protected updateLabels(activeDragNDrop:boolean,\n labels:WorkPackageCellLabels,\n change:WorkPackageChangeset) {\n const labelConfiguration = this.wpTableTimeline.getNormalizedLabels(change.projectedResource);\n\n if (!activeDragNDrop) {\n // normal display\n\n if (labels.withAlternativeLabels) {\n this.renderLabel(change, labels, 'right', 'subject');\n } else {\n // Show only one date field if left=start, right=dueDate\n if (labelConfiguration.left === 'startDate' && labelConfiguration.right === 'dueDate') {\n this.renderLabel(change, labels, 'left', null);\n this.renderLabel(change, labels, 'right', 'date');\n } else {\n this.renderLabel(change, labels, 'left', labelConfiguration.left);\n this.renderLabel(change, labels, 'right', labelConfiguration.right);\n }\n }\n\n this.renderLabel(change, labels, 'farRight', labelConfiguration.farRight);\n }\n\n // Update hover labels\n this.renderHoverLabels(labels, change);\n }\n\n protected renderLabel(change:WorkPackageChangeset,\n labels:WorkPackageCellLabels,\n position:LabelPosition|'leftHover'|'rightHover',\n attribute:string|null) {\n // Normalize attribute\n if (attribute === 'startDate' || attribute === 'dueDate') {\n attribute = 'date';\n }\n\n super.renderLabel(change, labels, position, attribute);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injector } from '@angular/core';\nimport * as moment from 'moment';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { KeyCodes } from 'core-app/shared/helpers/keyCodes.enum';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\n\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { take } from 'rxjs/operators';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WorkPackageCellLabels } from './wp-timeline-cell-labels';\nimport {\n MouseDirection,\n TimelineCellRenderer,\n} from './timeline-cell-renderer';\nimport { RenderInfo } from '../wp-timeline';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport Moment = moment.Moment;\n\nexport function registerWorkPackageMouseHandler(this:void,\n injector:Injector,\n getRenderInfo:() => RenderInfo,\n workPackageTimeline:WorkPackageTimelineTableController,\n halEditing:HalResourceEditingService,\n halEvents:HalEventsService,\n notificationService:WorkPackageNotificationService,\n loadingIndicator:LoadingIndicatorService,\n cell:HTMLElement,\n bar:HTMLDivElement,\n labels:WorkPackageCellLabels,\n renderer:TimelineCellRenderer,\n renderInfo:RenderInfo):void {\n let mouseDownStartDay:number|null = null; // also flag to signal active drag'n'drop\n renderInfo.change = halEditing.changeFor(renderInfo.workPackage);\n\n let placeholderForEmptyCell:HTMLElement;\n const jBody = jQuery('body');\n\n // handles change to existing work packages\n bar.onmousedown = (ev:MouseEvent) => {\n if (ev.which === 1) {\n // Left click only\n workPackageMouseDownFn(ev);\n }\n };\n\n // handles initial creation of start/due values\n cell.onmousemove = handleMouseMoveOnEmptyCell;\n\n function applyRendererMoveChanges(dayUnderCursor:Moment, days:number, direction:MouseDirection) {\n const moved = renderer.onDaysMoved(renderInfo.change, dayUnderCursor, days, direction);\n renderer.assignDateValues(renderInfo.change, labels, moved);\n renderer.update(bar, labels, renderInfo);\n }\n\n function getCursorOffsetInDaysFromLeft(ev:MouseEvent):number {\n const leftOffset = workPackageTimeline.getAbsoluteLeftCoordinates();\n const cursorOffsetLeftInPx = ev.clientX - leftOffset;\n return Math.floor(cursorOffsetLeftInPx / renderInfo.viewParams.pixelPerDay);\n }\n\n function workPackageMouseDownFn(ev:MouseEvent) {\n ev.preventDefault();\n\n // add/remove css class while drag'n'drop is active\n const classNameActiveDrag = 'active-drag';\n bar.classList.add(classNameActiveDrag);\n jBody.on('mouseup.timelinecell', () => bar.classList.remove(classNameActiveDrag));\n\n workPackageTimeline.disableViewParamsCalculation = true;\n mouseDownStartDay = getCursorOffsetInDaysFromLeft(ev);\n\n // If this wp is a parent element, changing it is not allowed\n // if it is not on 'Manual scheduling' mode\n // But adding a relation to it is.\n if (!renderInfo.workPackage.isLeaf && !renderInfo.viewParams.activeSelectionMode && !renderInfo.workPackage.scheduleManually) {\n return;\n }\n\n // Determine what attributes of the work package should be changed\n const direction = renderer.onMouseDown(ev, null, renderInfo, labels);\n\n jBody.on('mousemove.timelinecell', createMouseMoveFn(direction));\n jBody.on('keyup.timelinecell', keyPressFn);\n jBody.on('mouseup.timelinecell', () => deactivate(direction, false));\n }\n\n function createMouseMoveFn(direction:MouseDirection) {\n return (ev:JQuery.MouseMoveEvent) => {\n const days = getCursorOffsetInDaysFromLeft(ev.originalEvent as MouseEvent) - (mouseDownStartDay as number);\n const offsetDayCurrent = Math.floor(ev.offsetX / renderInfo.viewParams.pixelPerDay);\n const dayUnderCursor = renderInfo.viewParams.dateDisplayStart.clone().add(offsetDayCurrent, 'days');\n\n applyRendererMoveChanges(dayUnderCursor, days, direction);\n };\n }\n\n function keyPressFn(ev:JQuery.TriggeredEvent) {\n const kev:KeyboardEvent = ev.originalEvent as KeyboardEvent;\n if (kev.keyCode === KeyCodes.ESCAPE) {\n deactivate(null, true);\n }\n }\n\n function handleMouseMoveOnEmptyCell(ev:MouseEvent) {\n const wp = renderInfo.workPackage;\n\n if (!renderer.isEmpty(wp)) {\n return;\n }\n\n // placeholder logic\n placeholderForEmptyCell?.remove();\n placeholderForEmptyCell = renderer.displayPlaceholderUnderCursor(ev, renderInfo);\n\n const isEditable = (wp.isLeaf || wp.scheduleManually)\n && renderer.canMoveDates(wp)\n && !renderer.cursorOrDatesAreNonWorking(ev, renderInfo);\n\n if (!isEditable) {\n cell.style.cursor = 'not-allowed';\n return;\n }\n\n // display placeholder only if the timeline is editable\n cell.style.cursor = '';\n cell.appendChild(placeholderForEmptyCell);\n\n // abort if mouse leaves cell\n cell.onmouseleave = () => {\n placeholderForEmptyCell.remove();\n };\n\n // create logic\n cell.onmousedown = (evt) => {\n placeholderForEmptyCell.remove();\n\n evt.preventDefault();\n\n if (renderer.cursorOrDatesAreNonWorking(evt, renderInfo)) {\n return;\n }\n\n bar.style.pointerEvents = 'none';\n\n const [clickStart, offsetDayStart] = renderer.cursorDateAndDayOffset(evt, renderInfo);\n const dateForCreate = clickStart.format('YYYY-MM-DD');\n const direction = renderer.onMouseDown(evt, dateForCreate, renderInfo, labels);\n renderer.update(bar, labels, renderInfo);\n\n if (direction === 'create') {\n deactivate(direction, false);\n return;\n }\n\n jBody.on('mousemove.emptytimelinecell', mouseMoveOnEmptyCellFn(offsetDayStart, direction));\n jBody.on('mouseup.emptytimelinecell', () => deactivate(direction, false));\n\n cell.onmouseup = () => {\n deactivate(direction, false);\n };\n\n jBody.on('keyup.timelinecell', keyPressFn);\n };\n }\n\n function mouseMoveOnEmptyCellFn(offsetDayStart:number, mouseDownType:MouseDirection) {\n return (ev:JQuery.MouseMoveEvent) => {\n placeholderForEmptyCell.remove();\n const relativePosition = Math.abs(cell.getBoundingClientRect().x - ev.clientX);\n const offsetDayCurrent = Math.floor(relativePosition / renderInfo.viewParams.pixelPerDay);\n const dayUnderCursor = renderInfo.viewParams.dateDisplayStart.clone().add(offsetDayCurrent, 'days');\n const widthInDays = offsetDayCurrent - offsetDayStart;\n\n applyRendererMoveChanges(dayUnderCursor, widthInDays, mouseDownType);\n };\n }\n\n function deactivate(direction:MouseDirection|null, cancelled:boolean) {\n const change = renderInfo.change;\n workPackageTimeline.disableViewParamsCalculation = false;\n\n cell.onmousemove = handleMouseMoveOnEmptyCell;\n cell.onmousedown = () => undefined;\n cell.onmouseleave = () => undefined;\n cell.onmouseup = () => undefined;\n\n bar.style.pointerEvents = 'auto';\n\n jBody.off('.timelinecell');\n jBody.off('.emptytimelinecell');\n workPackageTimeline.resetCursor();\n mouseDownStartDay = null;\n\n // Cancel changes if the startDate or dueDate are not allowed\n const { startDate, dueDate } = change.projectedResource;\n const invalidDates = renderer.cursorOrDatesAreNonWorking([moment(startDate), moment(dueDate)], renderInfo, direction);\n\n if (cancelled || change.isEmpty() || invalidDates) {\n cancelChange();\n return;\n }\n\n // Remove due date from sending if we moved the work package as is\n // and duration was set\n const duration = change.pristineResource.duration as string|null;\n if (direction === 'both' && duration) {\n change.clearValue('dueDate');\n change.setValue('duration', duration);\n }\n\n // Persist the changes\n saveWorkPackage(renderInfo.change)\n .then(() => {\n renderInfo.change.clear();\n renderer.onMouseDownEnd(labels, renderInfo.change);\n })\n .catch((error) => {\n notificationService.handleRawError(error, renderInfo.workPackage);\n cancelChange();\n });\n }\n\n function cancelChange() {\n renderInfo.change.clear();\n renderer.update(bar, labels, renderInfo);\n renderer.onMouseDownEnd(labels, renderInfo.change);\n workPackageTimeline.refreshView();\n }\n\n function saveWorkPackage(change:WorkPackageChangeset) {\n const apiv3Service:ApiV3Service = injector.get(ApiV3Service);\n const querySpace:IsolatedQuerySpace = injector.get(IsolatedQuerySpace);\n\n // Remember the time before saving the work package to know which work packages to update\n const updatedAt = moment().toISOString();\n\n return (loadingIndicator.table.promise = halEditing\n .save(change)\n .then((result) => {\n notificationService.showSave(result.resource);\n const ids = _.map(querySpace.tableRendered.value, (row) => row.workPackageId);\n return apiv3Service\n .work_packages\n .filterUpdatedSince(ids, updatedAt)\n .get()\n .toPromise()\n .then(() => {\n halEvents.push(result.resource, { eventType: 'updated' });\n return querySpace.timelineRendered.pipe(take(1)).toPromise();\n });\n }));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { Injector } from '@angular/core';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\n\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { registerWorkPackageMouseHandler } from './wp-timeline-cell-mouse-handler';\nimport { TimelineMilestoneCellRenderer } from './timeline-milestone-cell-renderer';\nimport { TimelineCellRenderer } from './timeline-cell-renderer';\nimport { WorkPackageCellLabels } from './wp-timeline-cell-labels';\nimport { RenderInfo } from '../wp-timeline';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\n\nexport class WorkPackageTimelineCell {\n @InjectField() halEditing:HalResourceEditingService;\n\n @InjectField() halEvents:HalEventsService;\n\n @InjectField() notificationService:WorkPackageNotificationService;\n\n @InjectField() states:States;\n\n @InjectField() loadingIndicator:LoadingIndicatorService;\n\n @InjectField() schemaCache:SchemaCacheService;\n\n private wpElement:HTMLDivElement|null = null;\n\n private elementShape:string;\n\n private labels:WorkPackageCellLabels;\n\n constructor(public readonly injector:Injector,\n public workPackageTimeline:WorkPackageTimelineTableController,\n public renderers:{ milestone:TimelineMilestoneCellRenderer, generic:TimelineCellRenderer },\n public latestRenderInfo:RenderInfo,\n public classIdentifier:string,\n public workPackageId:string) {\n }\n\n getMarginLeftOfLeftSide():number {\n const renderer = this.cellRenderer(this.latestRenderInfo.workPackage);\n return renderer.getMarginLeftOfLeftSide(this.latestRenderInfo);\n }\n\n getMarginLeftOfRightSide():number {\n const renderer = this.cellRenderer(this.latestRenderInfo.workPackage);\n return renderer.getMarginLeftOfRightSide(this.latestRenderInfo);\n }\n\n getPaddingLeftForIncomingRelationLines():number {\n const renderer = this.cellRenderer(this.latestRenderInfo.workPackage);\n return renderer.getPaddingLeftForIncomingRelationLines(this.latestRenderInfo);\n }\n\n getPaddingRightForOutgoingRelationLines():number {\n const renderer = this.cellRenderer(this.latestRenderInfo.workPackage);\n return renderer.getPaddingRightForOutgoingRelationLines(this.latestRenderInfo);\n }\n\n canConnectRelations():boolean {\n const wp = this.latestRenderInfo.workPackage;\n if (this.schemaCache.of(wp).isMilestone) {\n return !_.isNil(wp.date);\n }\n\n return !_.isNil(wp.startDate) || !_.isNil(wp.dueDate);\n }\n\n public clear() {\n this.cellElement.html('');\n this.wpElement = null;\n }\n\n private get cellContainer() {\n return this.workPackageTimeline.timelineBody;\n }\n\n private get cellElement():JQuery {\n return this.cellContainer.find(`.${this.classIdentifier}`);\n }\n\n private lazyInit(renderer:TimelineCellRenderer, renderInfo:RenderInfo):Promise {\n const body = this.workPackageTimeline.timelineBody[0];\n const cell = this.cellElement;\n\n if (!cell.length) {\n return Promise.reject('uninitialized');\n }\n\n const wasRendered = this.wpElement !== null && body.contains(this.wpElement);\n\n // If already rendered with correct shape, ignore\n if (wasRendered && this.elementShape === renderer.type) {\n return Promise.resolve();\n }\n\n // Remove the element first if we're redrawing\n if (!renderInfo.isDuplicatedCell) {\n this.clear();\n }\n\n // Render the given element\n this.wpElement = renderer.render(renderInfo);\n this.labels = renderer.createAndAddLabels(renderInfo, this.wpElement);\n this.elementShape = renderer.type;\n\n // Register the element\n cell.append(this.wpElement);\n\n // Allow editing if editable\n if (renderer.canMoveDates(renderInfo.workPackage)) {\n this.wpElement.classList.add('-editable');\n\n registerWorkPackageMouseHandler(\n this.injector,\n () => this.latestRenderInfo,\n this.workPackageTimeline,\n this.halEditing,\n this.halEvents,\n this.notificationService,\n this.loadingIndicator,\n cell[0],\n this.wpElement,\n this.labels,\n renderer,\n renderInfo,\n );\n }\n\n return Promise.resolve();\n }\n\n private cellRenderer(workPackage:WorkPackageResource):TimelineCellRenderer {\n if (this.schemaCache.of(workPackage).isMilestone) {\n return this.renderers.milestone;\n }\n\n return this.renderers.generic;\n }\n\n public refreshView(renderInfo:RenderInfo) {\n this.latestRenderInfo = renderInfo;\n\n const renderer = this.cellRenderer(renderInfo.workPackage);\n\n // Render initial element if necessary\n this.lazyInit(renderer, renderInfo)\n .then(() => {\n // Render the upgrade from renderInfo\n const shouldBeDisplayed = renderer.update(\n this.wpElement as HTMLDivElement,\n this.labels,\n renderInfo,\n );\n\n if (!shouldBeDisplayed) {\n this.clear();\n }\n })\n .catch(() => null);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injector } from '@angular/core';\nimport { States } from 'core-app/core/states/states.service';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport { RenderInfo } from '../wp-timeline';\nimport { TimelineCellRenderer } from './timeline-cell-renderer';\nimport { TimelineMilestoneCellRenderer } from './timeline-milestone-cell-renderer';\nimport { WorkPackageTimelineCell } from './wp-timeline-cell';\n\nexport class WorkPackageTimelineCellsRenderer {\n // Injections\n @InjectField() public states:States;\n\n @InjectField() public halEditing:HalResourceEditingService;\n\n public cells:{ [classIdentifier:string]:WorkPackageTimelineCell } = {};\n\n private cellRenderers:{ milestone:TimelineMilestoneCellRenderer, generic:TimelineCellRenderer };\n\n constructor(readonly injector:Injector,\n readonly wpTimeline:WorkPackageTimelineTableController) {\n this.cellRenderers = {\n milestone: new TimelineMilestoneCellRenderer(this.injector, wpTimeline),\n generic: new TimelineCellRenderer(this.injector, wpTimeline),\n };\n }\n\n public hasCell(wpId:string) {\n return this.getCellsFor(wpId).length > 0;\n }\n\n public getCellsFor(wpId:string):WorkPackageTimelineCell[] {\n return _.filter(this.cells, (cell) => cell.workPackageId === wpId) || [];\n }\n\n /**\n * Synchronize the currently active cells and render them all\n */\n public refreshAllCells() {\n // Create new cells and delete old ones\n this.synchronizeCells();\n\n // Update all cells\n _.each(this.cells, (cell) => this.refreshSingleCell(cell));\n }\n\n public refreshCellsFor(wpId:string) {\n _.each(this.getCellsFor(wpId), (cell) => this.refreshSingleCell(cell));\n }\n\n public refreshSingleCell(cell:WorkPackageTimelineCell, isDuplicatedCell?:boolean, withAlternativeLabels?:boolean) {\n const renderInfo = this.renderInfoFor(cell.workPackageId, isDuplicatedCell, withAlternativeLabels);\n\n if (renderInfo.workPackage) {\n cell.refreshView(renderInfo);\n }\n }\n\n /**\n * Synchronize the current cells:\n *\n * 1. Create new cells in workPackageIdOrder not yet tracked\n * 2. Remove old cells no longer contained.\n */\n private synchronizeCells() {\n const currentlyActive:string[] = Object.keys(this.cells);\n const newCells:string[] = [];\n\n _.each(this.wpTimeline.workPackageIdOrder, (renderedRow:RenderedWorkPackage) => {\n const wpId = renderedRow.workPackageId;\n\n // Ignore extra rows not tied to a work package\n if (!wpId) {\n return;\n }\n\n const state = this.states.workPackages.get(wpId);\n if (state.isPristine()) {\n return;\n }\n\n // As work packages may occur several times, get the unique identifier\n // to identify the cell\n const identifier = renderedRow.classIdentifier;\n\n // Create a cell unless we already have an active cell\n if (!this.cells[identifier]) {\n this.cells[identifier] = this.buildCell(identifier, wpId.toString());\n }\n\n newCells.push(identifier);\n });\n\n _.difference(currentlyActive, newCells).forEach((identifier:string) => {\n this.cells[identifier].clear();\n delete this.cells[identifier];\n });\n }\n\n private buildCell(classIdentifier:string, workPackageId:string) {\n return new WorkPackageTimelineCell(\n this.injector,\n this.wpTimeline,\n this.cellRenderers,\n this.renderInfoFor(workPackageId),\n classIdentifier,\n workPackageId,\n );\n }\n\n private renderInfoFor(wpId:string, isDuplicatedCell?:boolean, withAlternativeLabels?:boolean):RenderInfo {\n const wp = this.states.workPackages.get(wpId).value!;\n return {\n viewParams: this.wpTimeline.viewParameters,\n workPackage: wp,\n change: this.halEditing.changeFor(wp),\n isDuplicatedCell,\n withAlternativeLabels,\n };\n }\n\n public buildCellsAndRenderOnRow(workPackageIds:string[], rowClassIdentifier:string, isDuplicatedCell?:boolean):WorkPackageTimelineCell[] {\n const cells = workPackageIds.map((workPackageId) => this.buildCell(rowClassIdentifier, workPackageId));\n\n cells.forEach((cell:WorkPackageTimelineCell) => this.refreshSingleCell(cell, isDuplicatedCell, true));\n\n return cells;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit, Component, ElementRef, Injector,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IToast, ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport * as moment from 'moment';\nimport { Moment } from 'moment';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport { input, InputState } from 'reactivestates';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { WorkPackageTimelineCellsRenderer } from 'core-app/features/work-packages/components/wp-table/timeline/cells/wp-timeline-cells-renderer';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageTimelineCell } from 'core-app/features/work-packages/components/wp-table/timeline/cells/wp-timeline-cell';\nimport { selectorTimelineSide } from 'core-app/features/work-packages/components/wp-table/wp-table-scroll-sync';\nimport { debugLog, timeOutput } from 'core-app/shared/helpers/debug_output';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { combineLatest, Observable } from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { WorkPackagesTableComponent } from 'core-app/features/work-packages/components/wp-table/wp-table.component';\nimport {\n groupIdFromIdentifier,\n groupTypeFromIdentifier,\n} from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-rows-helpers';\nimport { WorkPackageViewCollapsedGroupsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-collapsed-groups.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport {\n calculateDaySpan,\n getPixelPerDayForZoomLevel,\n requiredPixelMarginLeft,\n timelineElementCssClass,\n timelineHeaderSelector,\n timelineMarkerSelectionStartClass,\n TimelineViewParameters,\n zoomLevelOrder,\n} from '../wp-timeline';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\n\n@Component({\n selector: 'wp-timeline-container',\n templateUrl: './wp-timeline-container.html',\n})\nexport class WorkPackageTimelineTableController extends UntilDestroyedMixin implements AfterViewInit {\n private $element:JQuery;\n\n public workPackageTable:WorkPackageTable;\n\n private _viewParameters:TimelineViewParameters = new TimelineViewParameters();\n\n public disableViewParamsCalculation = false;\n\n public workPackageIdOrder:RenderedWorkPackage[] = [];\n\n private renderers:{ [name:string]:(vp:TimelineViewParameters) => void } = {};\n\n private cellsRenderer = new WorkPackageTimelineCellsRenderer(this.injector, this);\n\n public outerContainer:JQuery;\n\n public timelineBody:JQuery;\n\n private selectionParams:{ notification:IToast|null } = {\n notification: null,\n };\n\n private text:{ selectionMode:string };\n\n private refreshRequest = input();\n\n private collapsedGroupsCellsMap:IGroupCellsMap = {};\n\n private orderedRows:RenderedWorkPackage[] = [];\n\n get commonPipes() {\n return (source:Observable) => source.pipe(\n this.untilDestroyed(),\n takeUntil(this.querySpace.stopAllSubscriptions),\n filter(() => this.initialized && this.wpTableTimeline.isVisible),\n );\n }\n\n get workPackagesWithGroupHeaderCell():RenderedWorkPackage[] {\n const tableWorkPackages = this.querySpace.results.value!.elements;\n const wpsWithGroupHeaderCell = tableWorkPackages\n .filter((tableWorkPackage) => this.shouldBeShownInCollapsedGroupHeaders(tableWorkPackage))\n .map((tableWorkPackage) => tableWorkPackage.id);\n const workPackagesWithGroupHeaderCell = this.orderedRows.filter((row) => wpsWithGroupHeaderCell.includes(row.workPackageId) && !this.workPackageIdOrder.includes(row));\n\n return workPackagesWithGroupHeaderCell;\n }\n\n constructor(\n public readonly injector:Injector,\n private elementRef:ElementRef,\n private states:States,\n public wpTableComponent:WorkPackagesTableComponent,\n private toastService:ToastService,\n private wpTableTimeline:WorkPackageViewTimelineService,\n private notificationService:WorkPackageNotificationService,\n private wpRelations:WorkPackageRelationsService,\n private wpTableHierarchies:WorkPackageViewHierarchiesService,\n private halEvents:HalEventsService,\n private querySpace:IsolatedQuerySpace,\n readonly I18n:I18nService,\n private workPackageViewCollapsedGroupsService:WorkPackageViewCollapsedGroupsService,\n private weekdaysService:WeekdayService,\n ) {\n super();\n }\n\n ngAfterViewInit() {\n this.$element = jQuery(this.elementRef.nativeElement);\n\n this.text = {\n selectionMode: this.I18n.t('js.timelines.selection_mode.notification'),\n };\n\n // Get the outer container for width computation\n this.outerContainer = this.$element.find('.wp-table-timeline--outer');\n this.timelineBody = this.$element.find('.wp-table-timeline--body');\n\n // Register this instance to the table\n this.wpTableComponent.registerTimeline(this, this.timelineBody[0]);\n\n // Refresh on window resize events\n window.addEventListener('wp-resize.timeline', () => this.refreshRequest.putValue(undefined));\n\n combineLatest([\n this.querySpace.tableRendered.values$(),\n this.refreshRequest.changes$(),\n this.wpTableTimeline.live$(),\n this.weekdaysService.loadWeekdays(),\n ]).pipe(\n this.commonPipes,\n )\n .subscribe(([orderedRows]) => {\n // Remember all visible rows in their order of appearance.\n this.workPackageIdOrder = orderedRows.filter((row:RenderedWorkPackage) => !row.hidden);\n this.orderedRows = orderedRows;\n this.refreshView();\n });\n\n this.setupManageCollapsedGroupHeaderCells();\n }\n\n workPackageCells(wpId:string):WorkPackageTimelineCell[] {\n return this.cellsRenderer.getCellsFor(wpId);\n }\n\n /**\n * Return the index of a given row by its class identifier\n */\n workPackageIndex(classIdentifier:string):number {\n return this.workPackageIdOrder.findIndex((el) => el.classIdentifier === classIdentifier);\n }\n\n onRefreshRequested(name:string, callback:(vp:TimelineViewParameters) => void) {\n this.renderers[name] = callback;\n }\n\n getAbsoluteLeftCoordinates():number {\n return this.$element.offset()!.left;\n }\n\n getParentScrollContainer() {\n return this.outerContainer.closest(selectorTimelineSide)[0];\n }\n\n get viewParameters():TimelineViewParameters {\n return this._viewParameters;\n }\n\n get inHierarchyMode():boolean {\n return this.wpTableHierarchies.isEnabled;\n }\n\n get initialized():boolean {\n return this.workPackageTable && this.querySpace.tableRendered.hasValue();\n }\n\n refreshView() {\n if (!this.wpTableTimeline.isVisible) {\n debugLog('refreshView() requested, but TL is invisible.');\n return;\n }\n\n if (this.wpTableTimeline.isAutoZoom()) {\n // Update autozoom level\n this.applyAutoZoomLevel();\n } else {\n this._viewParameters.settings.zoomLevel = this.wpTableTimeline.zoomLevel;\n this.wpTableTimeline.appliedZoomLevel = this.wpTableTimeline.zoomLevel;\n }\n\n timeOutput('refreshView() in timeline container', () => {\n // Reset the width of the outer container if its content shrinks\n this.outerContainer.css('width', 'auto');\n\n this.calculateViewParams(this._viewParameters);\n\n // Update all cells\n this.cellsRenderer.refreshAllCells();\n\n _.each(this.renderers, (cb, key) => {\n debugLog(`Refreshing timeline member ${key}`);\n cb(this._viewParameters);\n });\n\n this.refreshCollapsedGroupsHeaderCells(this.collapsedGroupsCellsMap, this.cellsRenderer);\n\n // Calculate overflowing width to set to outer container\n // required to match width in all child divs.\n // The header is the only one reliable, as it already has the final width.\n const currentWidth = this.$element.find(timelineHeaderSelector)[0].scrollWidth;\n this.outerContainer.width(currentWidth);\n\n // Mark rendering event in a timeout to give DOM some time\n setTimeout(() => {\n this.querySpace.timelineRendered.next(null);\n });\n });\n }\n\n startAddRelationPredecessor(start:WorkPackageResource) {\n this.activateSelectionMode(start.id!, (end) => {\n this.wpRelations\n .addCommonRelation(start.id!, 'follows', end.id!)\n .then(() => {\n this.halEvents.push(start, {\n eventType: 'association',\n relatedWorkPackage: end.id!,\n relationType: 'follows',\n });\n })\n .catch((error:any) => this.notificationService.handleRawError(error, end));\n });\n }\n\n startAddRelationFollower(start:WorkPackageResource) {\n this.activateSelectionMode(start.id!, (end) => {\n this.wpRelations\n .addCommonRelation(start.id!, 'precedes', end.id!)\n .then(() => {\n this.halEvents.push(start, {\n eventType: 'association',\n relatedWorkPackage: end.id!,\n relationType: 'precedes',\n });\n })\n .catch((error:any) => this.notificationService.handleRawError(error, end));\n });\n }\n\n getFirstDayInViewport() {\n const outerContainer = this.getParentScrollContainer();\n const { scrollLeft } = outerContainer;\n const nonVisibleDaysLeft = Math.floor(scrollLeft / this.viewParameters.pixelPerDay);\n return this.viewParameters.dateDisplayStart.clone().add(nonVisibleDaysLeft, 'days');\n }\n\n getLastDayInViewport() {\n const outerContainer = this.getParentScrollContainer();\n const { scrollLeft } = outerContainer;\n const width = outerContainer.offsetWidth;\n const viewPortRight = scrollLeft + width;\n const daysUntilViewPortEnds = Math.ceil(viewPortRight / this.viewParameters.pixelPerDay) + 1;\n return this.viewParameters.dateDisplayStart.clone().add(daysUntilViewPortEnds, 'days');\n }\n\n forceCursor(cursor:string) {\n jQuery(`.${timelineElementCssClass}`).css('cursor', cursor);\n jQuery('.wp-timeline-cell').css('cursor', cursor);\n jQuery('.hascontextmenu').css('cursor', cursor);\n jQuery('.leftHandle').css('cursor', cursor);\n jQuery('.rightHandle').css('cursor', cursor);\n }\n\n resetCursor() {\n jQuery(`.${timelineElementCssClass}`).css('cursor', '');\n jQuery('.wp-timeline-cell').css('cursor', '');\n jQuery('.hascontextmenu').css('cursor', '');\n jQuery('.leftHandle').css('cursor', '');\n jQuery('.rightHandle').css('cursor', '');\n }\n\n private resetSelectionMode() {\n this._viewParameters.activeSelectionMode = null;\n this._viewParameters.selectionModeStart = null;\n\n if (this.selectionParams.notification) {\n this.toastService.remove(this.selectionParams.notification);\n }\n\n Mousetrap.unbind('esc');\n\n this.$element.removeClass('active-selection-mode');\n jQuery(`.${timelineMarkerSelectionStartClass}`).removeClass(timelineMarkerSelectionStartClass);\n this.refreshView();\n }\n\n private activateSelectionMode(start:string, callback:(wp:WorkPackageResource) => any) {\n start = start.toString(); // old system bug: ID can be a 'number'\n\n this._viewParameters.activeSelectionMode = (wp:WorkPackageResource) => {\n callback(wp);\n this.resetSelectionMode();\n };\n\n this._viewParameters.selectionModeStart = start;\n Mousetrap.bind('esc', () => this.resetSelectionMode());\n this.selectionParams.notification = this.toastService.addNotice(this.text.selectionMode);\n\n this.$element.addClass('active-selection-mode');\n\n this.refreshView();\n }\n\n private calculateViewParams(currentParams:TimelineViewParameters):boolean {\n if (this.disableViewParamsCalculation) {\n return false;\n }\n\n const newParams = new TimelineViewParameters();\n let changed = false;\n const workPackagesToCalculateTimelineWidthFrom = this.getWorkPackagesToCalculateTimelineWidthFrom();\n\n workPackagesToCalculateTimelineWidthFrom.forEach((renderedRow) => {\n const wpId = renderedRow.workPackageId;\n\n if (!wpId) {\n return;\n }\n const workPackageState:InputState = this.states.workPackages.get(wpId);\n const workPackage:WorkPackageResource|undefined = workPackageState.value;\n\n if (!workPackage) {\n return;\n }\n\n // We may still have a reference to a row that, e.g., just got deleted\n const startDate = workPackage.startDate ? moment(workPackage.startDate) : currentParams.now;\n const dueDate = workPackage.dueDate ? moment(workPackage.dueDate) : currentParams.now;\n const date = workPackage.date ? moment(workPackage.date) : currentParams.now;\n\n // start date\n newParams.dateDisplayStart = moment.min(\n newParams.dateDisplayStart,\n currentParams.now,\n startDate,\n date,\n ).clone(); // clone because currentParams.now should not be changed\n\n // finish date\n newParams.dateDisplayEnd = moment.max(\n newParams.dateDisplayEnd,\n currentParams.now,\n dueDate,\n date,\n ).clone(); // clone because currentParams.now should not be changed\n });\n\n // left spacing\n newParams.dateDisplayStart.subtract(currentParams.dayCountForMarginLeft, 'days'); // .substract modifies its instance\n\n // right spacing\n // RR: kept both variants for documentation purpose.\n // A: calculate the minimal width based on the width of the timeline view\n // B: calculate the minimal width based on the window width\n const width = this.$element.children().width()!; // A\n // const width = jQuery('body').width(); // B\n\n const { pixelPerDay } = currentParams;\n const visibleDays = Math.ceil((width / pixelPerDay) * 1.5);\n newParams.dateDisplayEnd.add(visibleDays, 'days'); // .add modifies its instance\n\n // Check if view params changed:\n\n // start date\n if (!newParams.dateDisplayStart.isSame(this._viewParameters.dateDisplayStart)) {\n changed = true;\n this._viewParameters.dateDisplayStart = newParams.dateDisplayStart;\n }\n\n // end date\n if (!newParams.dateDisplayEnd.isSame(this._viewParameters.dateDisplayEnd)) {\n changed = true;\n this._viewParameters.dateDisplayEnd = newParams.dateDisplayEnd;\n }\n\n // Calculate the visible viewport\n const firstDayInViewport = this.getFirstDayInViewport();\n const lastDayInViewport = this.getLastDayInViewport();\n const viewport:[Moment, Moment] = [firstDayInViewport, lastDayInViewport];\n this._viewParameters.visibleViewportAtCalculationTime = viewport;\n\n return changed;\n }\n\n private applyAutoZoomLevel() {\n if (this.workPackageIdOrder.length === 0) {\n return;\n }\n\n const workPackagesToCalculateWidthFrom = this.getWorkPackagesToCalculateTimelineWidthFrom();\n const daysSpan = calculateDaySpan(workPackagesToCalculateWidthFrom, this.states.workPackages, this._viewParameters);\n const timelineWidthInPx = this.$element.parent().width()! - (2 * requiredPixelMarginLeft);\n\n for (const zoomLevel of zoomLevelOrder) {\n const pixelPerDay = getPixelPerDayForZoomLevel(zoomLevel);\n const visibleDays = timelineWidthInPx / pixelPerDay;\n\n if (visibleDays >= daysSpan || zoomLevel === _.last(zoomLevelOrder)) {\n // Zoom level is enough\n const previousZoomLevel = this._viewParameters.settings.zoomLevel;\n\n // did the zoom level changed?\n if (previousZoomLevel !== zoomLevel) {\n this._viewParameters.settings.zoomLevel = zoomLevel;\n this.wpTableComponent.timeline.scrollLeft = 0;\n }\n\n this.wpTableTimeline.appliedZoomLevel = zoomLevel;\n return;\n }\n }\n }\n\n setupManageCollapsedGroupHeaderCells() {\n this.workPackageViewCollapsedGroupsService.updates$()\n .pipe(\n this.commonPipes,\n )\n .subscribe((groupsCollapseEvent:IGroupsCollapseEvent) => {\n this.manageCollapsedGroupHeaderCells(\n groupsCollapseEvent,\n this.querySpace.results.value!.elements,\n this.collapsedGroupsCellsMap,\n );\n });\n }\n\n manageCollapsedGroupHeaderCells(groupsCollapseConfig:IGroupsCollapseEvent,\n tableWorkPackages:WorkPackageResource[],\n collapsedGroupsCellsMap:IGroupCellsMap) {\n const refreshAllGroupHeaderCells = groupsCollapseConfig.allGroupsChanged;\n const collapsedGroupsChange = groupsCollapseConfig.state;\n const collapsedGroupsChangeArray = Object.keys(collapsedGroupsChange);\n let groupsToUpdate:string[] = [];\n\n if (!collapsedGroupsChangeArray.length) {\n return;\n }\n\n if (refreshAllGroupHeaderCells) {\n groupsToUpdate = collapsedGroupsChangeArray.filter((groupIdentifier) => this.shouldManageCollapsedGroupHeaderCells(groupIdentifier, groupsCollapseConfig));\n } else {\n const groupIdentifier = groupsCollapseConfig.lastChangedGroup!;\n if (this.shouldManageCollapsedGroupHeaderCells(groupIdentifier, groupsCollapseConfig)) {\n groupsToUpdate = [groupIdentifier];\n }\n }\n\n groupsToUpdate.forEach((groupIdentifier) => {\n const groupIsCollapsed = collapsedGroupsChange[groupIdentifier];\n\n if (groupIsCollapsed) {\n this.createCollapsedGroupHeaderCells(groupIdentifier, tableWorkPackages, collapsedGroupsCellsMap);\n } else {\n this.removeCollapsedGroupHeaderCells(groupIdentifier, collapsedGroupsCellsMap);\n }\n });\n }\n\n shouldManageCollapsedGroupHeaderCells(groupIdentifier:string, groupsCollapseConfig:IGroupsCollapseEvent) {\n const keyGroupType = groupTypeFromIdentifier(groupIdentifier);\n\n return this.workPackageViewCollapsedGroupsService.groupTypesWithHeaderCellsWhenCollapsed.includes(keyGroupType)\n && this.workPackageViewCollapsedGroupsService.groupTypesWithHeaderCellsWhenCollapsed.includes(groupsCollapseConfig.groupedBy!);\n }\n\n createCollapsedGroupHeaderCells(groupIdentifier:string, tableWorkPackages:WorkPackageResource[], collapsedGroupsCellsMap:IGroupCellsMap) {\n this.removeCollapsedGroupHeaderCells(groupIdentifier, collapsedGroupsCellsMap);\n\n const changedGroupId = groupIdFromIdentifier(groupIdentifier);\n const changedGroupType = groupTypeFromIdentifier(groupIdentifier);\n const changedGroupTableWorkPackages = tableWorkPackages.filter((tableWorkPackage) => tableWorkPackage[changedGroupType].id === changedGroupId);\n const changedGroupWpsWithHeaderCells = changedGroupTableWorkPackages.filter((tableWorkPackage) => this.shouldBeShownInCollapsedGroupHeaders(tableWorkPackage)\n && (tableWorkPackage.date || tableWorkPackage.startDate));\n const changedGroupWpsWithHeaderCellsIds = changedGroupWpsWithHeaderCells.map((workPackage) => workPackage.id!);\n\n this.collapsedGroupsCellsMap[groupIdentifier] = this.cellsRenderer.buildCellsAndRenderOnRow(changedGroupWpsWithHeaderCellsIds, `group-${groupIdentifier}-timeline`, true);\n }\n\n removeCollapsedGroupHeaderCells(groupIdentifier:string, collapsedGroupsCellsMap:IGroupCellsMap) {\n if (collapsedGroupsCellsMap[groupIdentifier]) {\n collapsedGroupsCellsMap[groupIdentifier].forEach((cell:WorkPackageTimelineCell) => cell.clear());\n collapsedGroupsCellsMap[groupIdentifier] = [];\n }\n }\n\n refreshCollapsedGroupsHeaderCells(collapsedGroupsCellsMap:IGroupCellsMap, cellsRenderer:WorkPackageTimelineCellsRenderer) {\n Object.keys(collapsedGroupsCellsMap).forEach((collapsedGroupKey) => {\n const collapsedGroupCells = collapsedGroupsCellsMap[collapsedGroupKey];\n\n collapsedGroupCells.forEach((cell) => cellsRenderer.refreshSingleCell(cell, false, true));\n });\n }\n\n shouldBeShownInCollapsedGroupHeaders(workPackage:WorkPackageResource) {\n return this.workPackageViewCollapsedGroupsService\n .wpTypesToShowInCollapsedGroupHeaders\n .some((wpTypeFunction) => wpTypeFunction(workPackage));\n }\n\n getWorkPackagesToCalculateTimelineWidthFrom() {\n // Include work packages that are show in collapsed group\n // headers into the calculation, if not they could be rendered out\n // of the timeline (ie: milestones are shown on collapsed row groups).\n return [...this.workPackageIdOrder, ...this.workPackagesWithGroupHeaderCell];\n }\n}\n","
    \n
    \n \n \n \n \n
    \n
    \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Directive, ElementRef, Injector, Input,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\nimport { OpContextMenuTrigger } from 'core-app/shared/components/op-context-menu/handlers/op-context-menu-trigger.directive';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { WpTableConfigurationModalComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\nimport { QUERY_SORT_BY_ASC, QUERY_SORT_BY_DESC } from 'core-app/features/hal/resources/query-sort-by-resource';\nimport { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';\n\n@Directive({\n selector: '[opColumnsContextMenu]',\n})\nexport class OpColumnsContextMenu extends OpContextMenuTrigger {\n @Input('opColumnsContextMenu-column') public column:QueryColumn;\n\n @Input('opColumnsContextMenu-table') public table:WorkPackageTable;\n\n public text = {\n confirmDelete: {\n text: this.I18n.t('js.work_packages.table_configuration.sorting_mode.warning'),\n title: this.I18n.t('js.modals.form_submit.title'),\n },\n };\n\n constructor(readonly elementRef:ElementRef,\n readonly opContextMenu:OPContextMenuService,\n readonly wpTableColumns:WorkPackageViewColumnsService,\n readonly wpTableSortBy:WorkPackageViewSortByService,\n readonly wpTableGroupBy:WorkPackageViewGroupByService,\n readonly wpTableHierarchies:WorkPackageViewHierarchiesService,\n readonly opModalService:OpModalService,\n readonly injector:Injector,\n readonly I18n:I18nService,\n readonly confirmDialog:ConfirmDialogService) {\n super(elementRef, opContextMenu);\n }\n\n protected open(evt:JQuery.TriggeredEvent) {\n if (!this.table.configuration.columnMenuEnabled) {\n return;\n }\n this.buildItems();\n this.opContextMenu.show(this, evt);\n }\n\n public get locals() {\n return {\n showAnchorRight: this.column && this.column.id !== 'id',\n contextMenuId: 'column-context-menu',\n items: this.items,\n };\n }\n\n /**\n * Positioning args for jquery-ui position.\n *\n * @param {Event} openerEvent\n */\n public positionArgs(evt:JQuery.TriggeredEvent) {\n const additionalPositionArgs = {\n of: this.$element.find('.generic-table--sort-header-outer'),\n };\n\n const position = super.positionArgs(evt);\n _.assign(position, additionalPositionArgs);\n\n return position;\n }\n\n protected get afterFocusOn():JQuery {\n return this.$element.find(`#${this.column.id}`);\n }\n\n private buildItems() {\n const c = this.column;\n\n this.items = [\n {\n // Sort ascending\n hidden: !this.wpTableSortBy.isSortable(c),\n linkText: this.I18n.t('js.work_packages.query.sort_descending'),\n icon: 'icon-sort-descending',\n onClick: (evt:any) => {\n if (this.wpTableSortBy.isManualSortingMode) {\n this.confirmDialog.confirm({\n text: this.text.confirmDelete,\n }).then(() => {\n this.wpTableSortBy.setAsSingleSortCriteria(c, QUERY_SORT_BY_DESC);\n return true;\n });\n return false;\n }\n this.wpTableSortBy.addSortCriteria(c, QUERY_SORT_BY_DESC);\n return true;\n },\n },\n {\n // Sort descending\n hidden: !this.wpTableSortBy.isSortable(c),\n linkText: this.I18n.t('js.work_packages.query.sort_ascending'),\n icon: 'icon-sort-ascending',\n onClick: (evt:any) => {\n if (this.wpTableSortBy.isManualSortingMode) {\n this.confirmDialog.confirm({\n text: this.text.confirmDelete,\n }).then(() => {\n this.wpTableSortBy.setAsSingleSortCriteria(c, QUERY_SORT_BY_ASC);\n return true;\n });\n return false;\n }\n this.wpTableSortBy.addSortCriteria(c, QUERY_SORT_BY_ASC);\n return true;\n },\n },\n {\n // Group by\n hidden: !this.wpTableGroupBy.isGroupable(c) || this.wpTableGroupBy.isCurrentlyGroupedBy(c),\n linkText: this.I18n.t('js.work_packages.query.group'),\n icon: 'icon-group-by',\n onClick: () => {\n if (this.wpTableHierarchies.isEnabled) {\n this.wpTableHierarchies.setEnabled(false);\n }\n this.wpTableGroupBy.setBy(c);\n return true;\n },\n },\n {\n // Move left\n hidden: this.wpTableColumns.isFirst(c),\n linkText: this.I18n.t('js.work_packages.query.move_column_left'),\n icon: 'icon-column-left',\n onClick: () => {\n this.wpTableColumns.shift(c, -1);\n return true;\n },\n },\n {\n // Move right\n hidden: this.wpTableColumns.isLast(c),\n linkText: this.I18n.t('js.work_packages.query.move_column_right'),\n icon: 'icon-column-right',\n onClick: () => {\n this.wpTableColumns.shift(c, 1);\n return true;\n },\n },\n {\n // Hide column\n linkText: this.I18n.t('js.work_packages.query.hide_column'),\n icon: 'icon-delete',\n onClick: () => {\n const focusColumn = this.wpTableColumns.previous(c) || this.wpTableColumns.next(c);\n this.wpTableColumns.removeColumn(c);\n\n setTimeout(() => {\n if (focusColumn) {\n jQuery(`#${focusColumn.id}`).focus();\n }\n });\n return true;\n },\n },\n {\n // Insert columns\n linkText: this.I18n.t('js.work_packages.query.insert_columns'),\n icon: 'icon-columns',\n onClick: () => {\n this.opModalService.show(\n WpTableConfigurationModalComponent,\n this.injector,\n { initialTab: 'columns' },\n );\n return true;\n },\n },\n ];\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, ElementRef, OnInit } from '@angular/core';\nimport { WorkPackageTimelineTableController } from 'core-app/features/work-packages/components/wp-table/timeline/container/wp-timeline-container.directive';\nimport * as moment from 'moment';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { TimelineZoomLevel } from 'core-app/features/hal/resources/query-resource';\nimport {\n calculatePositionValueForDayCount,\n getTimeSlicesForHeader,\n timelineHeaderCSSClass,\n timelineHeaderSelector,\n TimelineViewParameters,\n} from '../wp-timeline';\nimport Moment = moment.Moment;\n\n@Component({\n selector: timelineHeaderSelector,\n templateUrl: './wp-timeline-header.html',\n})\nexport class WorkPackageTimelineHeaderController implements OnInit {\n public $element:JQuery;\n\n private activeZoomLevel:TimelineZoomLevel;\n\n private innerHeader:JQuery;\n\n constructor(elementRef:ElementRef,\n readonly I18n:I18nService,\n readonly wpTimelineService:WorkPackageViewTimelineService,\n readonly workPackageTimelineTableController:WorkPackageTimelineTableController) {\n this.$element = jQuery(elementRef.nativeElement);\n }\n\n ngOnInit() {\n this.workPackageTimelineTableController\n .onRefreshRequested('header', (vp:TimelineViewParameters) => this.refreshView(vp));\n }\n\n refreshView(vp:TimelineViewParameters) {\n this.innerHeader = this.$element.find('.wp-table-timeline--header-inner');\n this.renderLabels(vp);\n }\n\n private renderLabels(vp:TimelineViewParameters):void {\n this.innerHeader.empty();\n this.innerHeader.attr('data-current-zoom-level', this.wpTimelineService.zoomLevel);\n\n switch (vp.settings.zoomLevel) {\n case 'days':\n this.renderLabelsDays(vp);\n break;\n case 'weeks':\n this.renderLabelsWeeks(vp);\n break;\n case 'months':\n this.renderLabelsMonths(vp);\n break;\n case 'quarters':\n this.renderLabelsQuarters(vp);\n break;\n case 'years':\n this.renderLabelsYears(vp);\n break;\n default:\n return;\n }\n\n this.activeZoomLevel = vp.settings.zoomLevel;\n }\n\n private renderLabelsDays(vp:TimelineViewParameters) {\n this.renderTimeSlices(vp, 'month', 0, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('MMM YYYY');\n cell.classList.add('wp-timeline--header-top-bold-element');\n cell.style.height = '13px';\n });\n\n this.renderTimeSlices(vp, 'week', 13, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('ww');\n cell.classList.add('-top-border');\n cell.style.height = '32px';\n });\n\n this.renderTimeSlices(vp, 'day', 23, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('D');\n cell.classList.add('-top-border');\n cell.style.height = '22px';\n });\n\n this.renderTimeSlices(vp, 'day', 33, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('dd');\n cell.classList.add('wp-timeline--header-day-element');\n });\n }\n\n private renderLabelsWeeks(vp:TimelineViewParameters) {\n this.renderTimeSlices(vp, 'month', 0, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('MMM YYYY');\n cell.classList.add('wp-timeline--header-top-bold-element');\n });\n\n this.renderTimeSlices(vp, 'week', 15, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('ww');\n cell.classList.add('-top-border');\n cell.style.height = '22px';\n });\n\n this.renderTimeSlices(vp, 'day', 25, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('D');\n cell.classList.add('wp-timeline--header-middle-element');\n });\n }\n\n private renderLabelsMonths(vp:TimelineViewParameters) {\n this.renderTimeSlices(vp, 'year', 0, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('YYYY');\n cell.classList.add('wp-timeline--header-top-bold-element');\n });\n\n this.renderTimeSlices(vp, 'month', 15, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('MMM');\n cell.classList.add('-top-border');\n cell.style.height = '30px';\n });\n\n this.renderTimeSlices(vp, 'week', 25, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('ww');\n cell.classList.add('wp-timeline--header-middle-element');\n });\n }\n\n private renderLabelsQuarters(vp:TimelineViewParameters) {\n this.renderTimeSlices(vp, 'year', 0, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--header-top-bold-element');\n cell.innerHTML = start.format('YYYY');\n });\n\n this.renderTimeSlices(vp, 'quarter', 15, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = this.I18n.t('js.timelines.quarter_label',\n { quarter_number: start.format('Q') });\n cell.classList.add('-top-border');\n cell.style.height = '30px';\n });\n\n this.renderTimeSlices(vp, 'month', 25, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('MMM');\n cell.classList.add('wp-timeline--header-middle-element');\n });\n }\n\n private renderLabelsYears(vp:TimelineViewParameters) {\n this.renderTimeSlices(vp, 'year', 0, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('YYYY');\n cell.classList.add('wp-timeline--header-top-bold-element');\n });\n\n this.renderTimeSlices(vp, 'quarter', 15, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = this.I18n.t('js.timelines.quarter_label',\n { quarter_number: start.format('Q') });\n cell.classList.add('-top-border');\n cell.style.height = '30px';\n });\n\n this.renderTimeSlices(vp, 'month', 25, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('M');\n cell.classList.add('wp-timeline--header-middle-element');\n });\n }\n\n private renderTimeSlices(vp:TimelineViewParameters,\n unit:moment.unitOfTime.DurationConstructor,\n marginTop:number,\n startView:Moment,\n endView:Moment,\n cellCallback:(start:Moment, cell:HTMLElement) => void) {\n const { inViewportAndBoundaries, rest } = getTimeSlicesForHeader(vp, unit, startView, endView);\n\n for (const [start, end] of inViewportAndBoundaries) {\n const cell = this.addLabelCell();\n cell.style.top = `${marginTop}px`;\n cell.style.left = calculatePositionValueForDayCount(vp, start.diff(startView, 'days'));\n cell.style.width = calculatePositionValueForDayCount(vp, end.diff(start, 'days') + 1);\n cellCallback(start, cell);\n }\n setTimeout(() => {\n for (const [start, end] of rest) {\n const cell = this.addLabelCell();\n cell.style.top = `${marginTop}px`;\n cell.style.left = calculatePositionValueForDayCount(vp, start.diff(startView, 'days'));\n cell.style.width = calculatePositionValueForDayCount(vp, end.diff(start, 'days') + 1);\n cellCallback(start, cell);\n }\n }, 0);\n }\n\n private addLabelCell():HTMLElement {\n const label = document.createElement('div');\n label.className = timelineHeaderCSSClass;\n\n this.innerHeader.append(label);\n return label;\n }\n}\n","
    \n
    \n
    \n","import { RelationResource } from 'core-app/features/hal/resources/relation-resource';\n\nexport function workPackagePrefix(workPackageId:string) {\n return `__tl-relation-${workPackageId}`;\n}\n\nexport class TimelineRelationElement {\n constructor(public belongsToId:string, public relation:RelationResource) {\n }\n\n public get classNames():string[] {\n return [\n workPackagePrefix(this.relation.ids.from),\n workPackagePrefix(this.relation.ids.to),\n ];\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component, ElementRef, Injector, OnInit,\n} from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { State } from 'reactivestates';\nimport { combineLatest } from 'rxjs';\nimport { filter, map, take } from 'rxjs/operators';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { RelationsStateValue, WorkPackageRelationsService } from '../../../wp-relations/wp-relations.service';\nimport { WorkPackageTimelineCell } from '../cells/wp-timeline-cell';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport { timelineElementCssClass, TimelineViewParameters } from '../wp-timeline';\nimport { TimelineRelationElement, workPackagePrefix } from './timeline-relation-element';\n\nconst DEBUG_DRAW_RELATION_LINES_WITH_COLOR = false;\n\nexport const timelineGlobalElementCssClassname = 'relation-line';\n\nfunction newSegment(vp:TimelineViewParameters,\n classNames:string[],\n yPosition:number,\n top:number,\n left:number,\n width:number,\n height:number,\n color?:string):HTMLElement {\n const segment = document.createElement('div');\n segment.classList.add(\n timelineElementCssClass,\n timelineGlobalElementCssClassname,\n ...classNames,\n );\n\n // segment.style.backgroundColor = color;\n segment.style.top = `${(yPosition * 40) + top}px`;\n segment.style.left = `${left}px`;\n segment.style.width = `${width}px`;\n segment.style.height = `${height}px`;\n\n if (DEBUG_DRAW_RELATION_LINES_WITH_COLOR && color !== undefined) {\n segment.style.zIndex = '9999999';\n segment.style.backgroundColor = color;\n }\n return segment;\n}\n\n@Component({\n selector: 'wp-timeline-relations',\n template: '
    ',\n})\nexport class WorkPackageTableTimelineRelations extends UntilDestroyedMixin implements OnInit {\n @InjectField() querySpace:IsolatedQuerySpace;\n\n private container:JQuery;\n\n private workPackagesWithRelations:{ [workPackageId:string]:State } = {};\n\n constructor(public readonly injector:Injector,\n public elementRef:ElementRef,\n public states:States,\n public workPackageTimelineTableController:WorkPackageTimelineTableController,\n public wpTableTimeline:WorkPackageViewTimelineService,\n public wpRelations:WorkPackageRelationsService) {\n super();\n }\n\n ngOnInit() {\n const $element = jQuery(this.elementRef.nativeElement);\n this.container = $element.find('.wp-table-timeline--relations');\n this.workPackageTimelineTableController\n .onRefreshRequested('relations', (vp:TimelineViewParameters) => this.refreshView());\n\n this.setupRelationSubscription();\n }\n\n private refreshView() {\n this.update();\n }\n\n private get workPackageIdOrder() {\n return this.workPackageTimelineTableController.workPackageIdOrder;\n }\n\n /**\n * Refresh relations of visible rows.\n */\n private setupRelationSubscription() {\n // for all visible WorkPackage rows...\n combineLatest([\n this.querySpace.renderedWorkPackages.values$(),\n this.wpTableTimeline.live$(),\n ])\n .pipe(\n filter(([_, timeline]) => timeline.visible),\n this.untilDestroyed(),\n map(([rendered, _]) => rendered),\n )\n .subscribe((list) => {\n // ... make sure that the corresponding relations are loaded ...\n const wps = _.compact(list.map((row) => row.workPackageId) as string[]);\n this.wpRelations.requireAll(wps);\n\n wps.forEach((wpId) => {\n const relationsForWorkPackage = this.wpRelations.state(wpId);\n this.workPackagesWithRelations[wpId] = relationsForWorkPackage;\n\n // ... once they are loaded, display them.\n relationsForWorkPackage.values$()\n .pipe(\n take(1),\n )\n .subscribe(() => {\n this.renderWorkPackagesRelations([wpId]);\n });\n });\n });\n\n // When a WorkPackage changes, redraw the corresponding relations\n this.states.workPackages.observeChange()\n .pipe(\n this.untilDestroyed(),\n filter(() => this.wpTableTimeline.isVisible),\n )\n .subscribe(([workPackageId]) => {\n this.renderWorkPackagesRelations([workPackageId]);\n });\n }\n\n private renderWorkPackagesRelations(workPackageIds:string[]) {\n workPackageIds.forEach((workPackageId) => {\n const workPackageWithRelation = this.workPackagesWithRelations[workPackageId];\n if (_.isNil(workPackageWithRelation)) {\n return;\n }\n\n this.removeRelationElementsForWorkPackage(workPackageId);\n const relations = _.values(workPackageWithRelation.value);\n const relationsList = _.values(relations);\n relationsList.forEach((relation) => {\n if (!(relation.type === 'precedes'\n || relation.type === 'follows')) {\n return;\n }\n\n const elem = new TimelineRelationElement(relation.ids.from, relation);\n this.renderElement(this.workPackageTimelineTableController.viewParameters, elem);\n });\n });\n }\n\n private update() {\n this.removeAllVisibleElements();\n this.renderElements();\n }\n\n private removeRelationElementsForWorkPackage(workPackageId:string) {\n const className = workPackagePrefix(workPackageId);\n const found = this.container.find(`.${className}`);\n found.remove();\n }\n\n private removeAllVisibleElements() {\n this.container.find(`.${timelineGlobalElementCssClassname}`).remove();\n }\n\n private renderElements() {\n const wpIdsWithRelations:string[] = _.keys(this.workPackagesWithRelations);\n this.renderWorkPackagesRelations(wpIdsWithRelations);\n }\n\n /**\n * Render a single relation to all shown work packages. Since work packages may occur multiple\n * times in the timeline, iterate all potential combinations and render them.\n * @param vp\n * @param e\n */\n private renderElement(vp:TimelineViewParameters, e:TimelineRelationElement) {\n const involved = e.relation.ids;\n\n const startCells = this.workPackageTimelineTableController.workPackageCells(involved.to);\n const endCells = this.workPackageTimelineTableController.workPackageCells(involved.from);\n\n // If either sources or targets are not rendered, ignore this relation\n if (startCells.length === 0 || endCells.length === 0) {\n return;\n }\n\n // Now, render all sources to all targets\n startCells.forEach((startCell) => {\n const idxFrom = this.workPackageTimelineTableController.workPackageIndex(startCell.classIdentifier);\n endCells.forEach((endCell) => {\n const idxTo = this.workPackageTimelineTableController.workPackageIndex(endCell.classIdentifier);\n this.renderRelation(vp, e, idxFrom, idxTo, startCell, endCell);\n });\n });\n }\n\n private renderRelation(vp:TimelineViewParameters,\n e:TimelineRelationElement,\n idxFrom:number,\n idxTo:number,\n startCell:WorkPackageTimelineCell,\n endCell:WorkPackageTimelineCell) {\n const rowFrom = this.workPackageIdOrder[idxFrom];\n const rowTo = this.workPackageIdOrder[idxTo];\n\n // If any of the targets are hidden in the table, skip\n if (!(rowFrom && rowTo) || (rowFrom.hidden || rowTo.hidden)) {\n return;\n }\n\n // Skip if relations cannot be drawn between these cells\n if (!startCell.canConnectRelations() || !endCell.canConnectRelations()) {\n return;\n }\n\n // Get X values\n // const hookLength = endCell.getPaddingLeftForIncomingRelationLines();\n const startX = startCell.getMarginLeftOfRightSide() - startCell.getPaddingRightForOutgoingRelationLines();\n const targetX = endCell.getMarginLeftOfLeftSide() + endCell.getPaddingLeftForIncomingRelationLines();\n\n // Vertical direction\n const directionY:'toUp'|'toDown' = idxFrom < idxTo ? 'toDown' : 'toUp';\n\n // Horizontal direction\n const directionX:'toLeft'|'beneath'|'toRight' = targetX > startX ? 'toRight' : targetX < startX ? 'toLeft' : 'beneath';\n\n // start\n if (!startCell) {\n return;\n }\n\n // Draw the first line next to the bar/milestone element\n const paddingRight = startCell.getPaddingRightForOutgoingRelationLines();\n const startLineWith = endCell.getPaddingLeftForIncomingRelationLines()\n + (paddingRight > 0 ? paddingRight : 0);\n this.container.append(newSegment(vp, e.classNames, idxFrom, 19, startX, startLineWith, 1, 'red'));\n const lastX = startX + startLineWith;\n // lastX += hookLength;\n\n // Draw vertical line between rows\n const height = Math.abs(idxTo - idxFrom);\n if (directionY === 'toDown') {\n if (directionX === 'toRight' || directionX === 'beneath') {\n this.container.append(newSegment(vp, e.classNames, idxFrom, 19, lastX, 1, height * 40, 'black'));\n } else if (directionX === 'toLeft') {\n this.container.append(newSegment(vp, e.classNames, idxFrom, 19, lastX, 1, (height * 40) - 10, 'black'));\n }\n } else if (directionY === 'toUp') {\n this.container.append(newSegment(vp, e.classNames, idxTo, 30, lastX, 1, (height * 40) - 10, 'black'));\n }\n\n // Draw end corner to the target\n if (directionX === 'toRight') {\n if (directionY === 'toDown') {\n this.container.append(newSegment(vp, e.classNames, idxTo, 19, lastX, targetX - lastX, 1, 'red'));\n } else if (directionY === 'toUp') {\n this.container.append(newSegment(vp, e.classNames, idxTo, 20, lastX, 1, 10, 'green'));\n this.container.append(newSegment(vp, e.classNames, idxTo, 20, lastX, targetX - lastX, 1, 'lightsalmon'));\n }\n } else if (directionX === 'toLeft') {\n if (directionY === 'toDown') {\n this.container.append(newSegment(vp, e.classNames, idxTo, 0, lastX, 1, 8, 'red'));\n this.container.append(newSegment(vp, e.classNames, idxTo, 8, targetX, lastX - targetX, 1, 'green'));\n this.container.append(newSegment(vp, e.classNames, idxTo, 8, targetX, 1, 11, 'blue'));\n } else if (directionY === 'toUp') {\n this.container.append(newSegment(vp, e.classNames, idxTo, 30, targetX + 1, lastX - targetX, 1, 'red'));\n this.container.append(newSegment(vp, e.classNames, idxTo, 19, targetX + 1, 1, 11, 'blue'));\n }\n }\n }\n}\n","import { TimelineViewParameters } from '../wp-timeline';\n\nexport const timelineStaticElementCssClassname = 'wp-timeline--static-element';\n\nexport abstract class TimelineStaticElement {\n constructor() {\n }\n\n /**\n * Render the static element according to the current ViewParameters\n * @param vp Current timeline view paraemters\n * @returns {HTMLElement} The finished static element\n */\n public render(vp:TimelineViewParameters):HTMLElement {\n const elem = document.createElement('div');\n elem.id = this.identifier;\n elem.classList.add(...this.classNames);\n\n return this.finishElement(elem, vp);\n }\n\n protected abstract finishElement(elem:HTMLElement, vp:TimelineViewParameters):HTMLElement;\n\n public abstract get identifier():string;\n\n public get classNames():string[] {\n return [timelineStaticElementCssClassname];\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport * as moment from 'moment';\nimport { calculatePositionValueForDayCount, TimelineViewParameters } from '../wp-timeline';\nimport { TimelineStaticElement } from './timeline-static-element';\n\nexport class TodayLineElement extends TimelineStaticElement {\n protected finishElement(elem:HTMLElement, vp:TimelineViewParameters):HTMLElement {\n const offsetToday = vp.now.diff(vp.dateDisplayStart, 'days');\n const dayProgress = moment().hour() / 24;\n elem.style.left = calculatePositionValueForDayCount(vp, offsetToday + dayProgress);\n\n return elem;\n }\n\n public get identifier():string {\n return 'wp-timeline-static-element-today-line';\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport {\n Component,\n ElementRef,\n OnInit,\n} from '@angular/core';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport { TimelineViewParameters } from '../wp-timeline';\nimport {\n TimelineStaticElement,\n timelineStaticElementCssClassname,\n} from './timeline-static-element';\nimport { TodayLineElement } from './wp-timeline.today-line';\n\n@Component({\n selector: 'wp-timeline-static-elements',\n template: '
    '\n})\nexport class WorkPackageTableTimelineStaticElements implements OnInit {\n public $element:HTMLElement;\n\n private container:HTMLElement;\n\n private elements:TimelineStaticElement[];\n\n constructor(elementRef:ElementRef,\n public states:States,\n public workPackageTimelineTableController:WorkPackageTimelineTableController) {\n this.$element = elementRef.nativeElement;\n\n this.elements = [\n new TodayLineElement(),\n ];\n }\n\n ngOnInit() {\n this.container = this.$element.querySelector('.wp-table-timeline--static-elements') as HTMLElement;\n this.workPackageTimelineTableController\n .onRefreshRequested('static elements', (vp:TimelineViewParameters) => this.update(vp));\n }\n\n private update(vp:TimelineViewParameters) {\n this.removeAllVisibleElements();\n this.renderElements(vp);\n }\n\n private removeAllVisibleElements() {\n this\n .container\n .querySelectorAll(`.${timelineStaticElementCssClassname}`)\n .forEach((el) => el.remove());\n }\n\n private renderElements(vp:TimelineViewParameters) {\n for (const e of this.elements) {\n this.container.appendChild(e.render(vp));\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n} from '@angular/core';\nimport * as moment from 'moment';\nimport { TimelineZoomLevel } from 'core-app/features/hal/resources/query-resource';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport {\n calculatePositionValueForDayCount,\n getTimeSlicesForHeader,\n timelineElementCssClass,\n timelineGridElementCssClass,\n TimelineViewParameters,\n} from '../wp-timeline';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\nimport Moment = moment.Moment;\n\n@Component({\n selector: 'wp-timeline-grid',\n template: '
    ',\n})\nexport class WorkPackageTableTimelineGrid implements AfterViewInit {\n private activeZoomLevel:TimelineZoomLevel;\n\n private gridContainer:JQuery;\n\n constructor(\n private elementRef:ElementRef,\n public wpTimeline:WorkPackageTimelineTableController,\n private weekdaysService:WeekdayService,\n ) {}\n\n ngAfterViewInit():void {\n const $element = jQuery(this.elementRef.nativeElement);\n this.gridContainer = $element.find('.wp-table-timeline--grid');\n this.wpTimeline.onRefreshRequested('grid', (vp:TimelineViewParameters) => this.refreshView(vp));\n }\n\n refreshView(vp:TimelineViewParameters):void {\n this.renderLabels(vp);\n }\n\n private renderLabels(vp:TimelineViewParameters):void {\n this.gridContainer.empty();\n\n switch (vp.settings.zoomLevel) {\n case 'days':\n this.renderLabelsDays(vp);\n break;\n case 'weeks':\n this.renderLabelsWeeks(vp);\n break;\n case 'months':\n this.renderLabelsMonths(vp);\n break;\n case 'quarters':\n this.renderLabelsQuarters(vp);\n break;\n case 'years':\n this.renderLabelsYears(vp);\n break;\n default:\n return;\n }\n\n this.activeZoomLevel = vp.settings.zoomLevel;\n }\n\n private renderLabelsDays(vp:TimelineViewParameters):void {\n this.renderTimeSlices(vp, 'day', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.style.paddingTop = '1px';\n this.checkForNonWorkingDayHighlight(start, cell);\n });\n\n this.renderTimeSlices(vp, 'year', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n cell.style.zIndex = '2';\n });\n }\n\n private renderLabelsWeeks(vp:TimelineViewParameters):void {\n this.renderTimeSlices(vp, 'day', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n this.checkForNonWorkingDayHighlight(start, cell);\n });\n\n this.renderTimeSlices(vp, 'week', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n });\n\n this.renderTimeSlices(vp, 'year', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n cell.style.zIndex = '2';\n });\n }\n\n private renderLabelsMonths(vp:TimelineViewParameters):void {\n this.renderTimeSlices(vp, 'week', vp.dateDisplayStart, vp.dateDisplayEnd, () => {\n });\n\n this.renderTimeSlices(vp, 'month', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n });\n\n this.renderTimeSlices(vp, 'year', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n cell.style.zIndex = '2';\n });\n }\n\n private renderLabelsQuarters(vp:TimelineViewParameters):void {\n this.renderTimeSlices(vp, 'month', vp.dateDisplayStart, vp.dateDisplayEnd, () => {\n });\n\n this.renderTimeSlices(vp, 'quarter', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n });\n\n this.renderTimeSlices(vp, 'year', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n cell.style.zIndex = '2';\n });\n }\n\n private renderLabelsYears(vp:TimelineViewParameters):void {\n this.renderTimeSlices(vp, 'month', vp.dateDisplayStart, vp.dateDisplayEnd, () => {\n });\n\n this.renderTimeSlices(vp, 'year', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n });\n }\n\n renderTimeSlices(vp:TimelineViewParameters,\n unit:moment.unitOfTime.DurationConstructor,\n startView:Moment,\n endView:Moment,\n cellCallback:(start:Moment, cell:HTMLElement) => void):void {\n const { inViewportAndBoundaries, rest } = getTimeSlicesForHeader(vp, unit, startView, endView);\n\n for (const [start, end] of inViewportAndBoundaries) {\n const cell = document.createElement('div');\n cell.classList.add(timelineElementCssClass, timelineGridElementCssClass);\n cell.style.left = calculatePositionValueForDayCount(vp, start.diff(startView, 'days'));\n cell.style.width = calculatePositionValueForDayCount(vp, end.diff(start, 'days') + 1);\n this.gridContainer[0].appendChild(cell);\n cellCallback(start, cell);\n }\n setTimeout(() => {\n for (const [start, end] of rest) {\n const cell = document.createElement('div');\n cell.classList.add(timelineElementCssClass, timelineGridElementCssClass);\n cell.style.left = calculatePositionValueForDayCount(vp, start.diff(startView, 'days'));\n cell.style.width = calculatePositionValueForDayCount(vp, end.diff(start, 'days') + 1);\n this.gridContainer[0].appendChild(cell);\n cellCallback(start, cell);\n }\n }, 0);\n }\n\n private checkForNonWorkingDayHighlight(date:Moment, cell:HTMLElement) {\n const day = date.toDate();\n\n if (this.weekdaysService.isNonWorkingDay(day)) {\n cell.classList.add('wp-timeline--non-working-day');\n cell.dataset.qaSelector = `wp-timeline--non-working-day_${day.getDate()}-${day.getMonth() + 1}-${day.getFullYear()}`;\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { WorkPackageWatchersTabComponent } from './watchers-tab.component';\n\n@Component({\n templateUrl: './wp-watcher-entry.component.html',\n styleUrls: ['./wp-watcher-entry.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'op-wp-watcher-entry',\n})\nexport class WorkPackageWatcherEntryComponent implements OnInit {\n @Input() public watcher:UserResource;\n\n public text:{ remove:string };\n\n constructor(readonly I18n:I18nService,\n readonly panelCtrl:WorkPackageWatchersTabComponent) {\n }\n\n ngOnInit():void {\n this.text = {\n remove: this.I18n.t('js.label_remove_watcher', { name: this.watcher.name }),\n };\n }\n\n public remove():void {\n this.panelCtrl.removeWatcher(this.watcher);\n }\n}\n","
    \n \n \n \n \n \n \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit, Directive, ElementRef, Injector, Input,\n} from '@angular/core';\nimport { takeUntil } from 'rxjs/operators';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { WorkPackageViewSumService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sum.service';\nimport { combineLatest } from 'rxjs';\nimport { GroupSumsBuilder } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/grouped/group-sums-builder';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\n\n@Directive({\n selector: '[wpTableSumsRow]',\n host: {\n '[class.-hidden]': 'isHidden',\n },\n})\nexport class WorkPackageTableSumsRowController implements AfterViewInit {\n @Input('wpTableSumsRow-table') workPackageTable:WorkPackageTable;\n\n public isHidden = true;\n\n private text:{ sum:string };\n\n private element:HTMLTableRowElement;\n\n private groupSumsBuilder:GroupSumsBuilder;\n\n constructor(readonly injector:Injector,\n readonly elementRef:ElementRef,\n readonly querySpace:IsolatedQuerySpace,\n readonly states:States,\n readonly schemaCache:SchemaCacheService,\n readonly wpTableColumns:WorkPackageViewColumnsService,\n readonly wpTableSums:WorkPackageViewSumService,\n readonly I18n:I18nService) {\n this.text = {\n sum: I18n.t('js.label_total_sum'),\n };\n }\n\n ngAfterViewInit():void {\n this.element = this.elementRef.nativeElement;\n\n combineLatest([\n this.wpTableColumns.live$(),\n this.wpTableSums.live$(),\n this.querySpace.results.values$(),\n ])\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n )\n .subscribe(([columns, sum, resource]) => {\n this.isHidden = !sum;\n if (sum && resource.sumsSchema) {\n this.schemaCache\n .ensureLoaded(resource.sumsSchema.href!)\n .then((schema:SchemaResource) => {\n this.refresh(columns, resource, schema);\n });\n } else {\n this.clear();\n }\n });\n }\n\n private clear() {\n this.element.innerHTML = '';\n }\n\n private refresh(columns:QueryColumn[], resource:WorkPackageCollectionResource, schema:SchemaResource) {\n this.clear();\n this.render(columns, resource, schema);\n }\n\n private render(columns:QueryColumn[], resource:WorkPackageCollectionResource, schema:SchemaResource) {\n this.groupSumsBuilder = new GroupSumsBuilder(this.injector, this.workPackageTable);\n this.groupSumsBuilder.text = this.text;\n this.groupSumsBuilder.renderColumns(resource.totalSums!, this.element);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component,\n Inject,\n Input,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { OpUnlinkTableAction } from 'core-app/features/work-packages/components/wp-table/table-actions/actions/unlink-table-action';\nimport { OpTableActionFactory } from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { WorkPackageRelationQueryBase } from 'core-app/features/work-packages/components/wp-relations/embedded/wp-relation-query.base';\nimport { WpRelationInlineCreateService } from 'core-app/features/work-packages/components/wp-relations/embedded/relations/wp-relation-inline-create.service';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { filter } from 'rxjs/operators';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { GroupDescriptor } from 'core-app/features/work-packages/components/wp-single-view/wp-single-view.component';\n\n@Component({\n selector: 'wp-relation-query',\n templateUrl: '../wp-relation-query.html',\n providers: [\n { provide: WorkPackageInlineCreateService, useClass: WpRelationInlineCreateService },\n ],\n})\nexport class WorkPackageRelationQueryComponent extends WorkPackageRelationQueryBase implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public query:QueryResource;\n\n @Input() public group:GroupDescriptor;\n\n public tableActions:OpTableActionFactory[] = [\n OpUnlinkTableAction.factoryFor(\n 'remove-relation-action',\n this.I18n.t('js.relation_buttons.remove'),\n (relatedTo:WorkPackageResource) => {\n if (!this.embeddedTable) {\n return;\n }\n\n this.embeddedTable.loadingIndicator = this.wpRelations.require(relatedTo.id!)\n .then(() => this.wpInlineCreate.remove(this.workPackage, relatedTo))\n .then(() => this.refreshTable())\n .catch((error) => this.notificationService.handleRawError(error, this.workPackage));\n },\n (child:WorkPackageResource) => !!child.changeParent,\n ),\n ];\n\n public idFromLink = idFromLink;\n\n constructor(protected readonly PathHelper:PathHelperService,\n @Inject(WorkPackageInlineCreateService) protected readonly wpInlineCreate:WpRelationInlineCreateService,\n protected readonly wpRelations:WorkPackageRelationsService,\n protected readonly halEvents:HalEventsService,\n protected readonly queryUrlParamsHelper:UrlParamsHelperService,\n protected readonly notificationService:WorkPackageNotificationService,\n protected readonly I18n:I18nService) {\n super(queryUrlParamsHelper);\n }\n\n ngOnInit() {\n const relationType = this.getRelationTypeFromQuery();\n\n // Set reference target and reference class\n this.wpInlineCreate.referenceTarget = this.workPackage;\n this.wpInlineCreate.relationType = relationType;\n\n // Set up the query props\n this.queryProps = this.buildQueryProps();\n\n // Wire the successful saving of a new addition to refreshing the embedded table\n this.wpInlineCreate.newInlineWorkPackageCreated\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((toId:string) => this.addRelation(toId));\n\n // When relations have changed, refresh this table\n this.wpRelations.observe(this.workPackage.id!)\n .pipe(\n filter((val) => !_.isEmpty(val)),\n this.untilDestroyed(),\n )\n .subscribe(() => this.refreshTable());\n }\n\n private addRelation(toId:string) {\n this.wpInlineCreate\n .add(this.workPackage, toId)\n .then(() => {\n this.halEvents.push(this.workPackage, {\n eventType: 'association',\n relatedWorkPackage: toId,\n relationType: this.getRelationTypeFromQuery(),\n });\n })\n .catch((error) => this.notificationService.handleRawError(error, this.workPackage));\n }\n\n private getRelationTypeFromQuery() {\n return this.group.relationType!;\n }\n}\n","import { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { Component, Injector } from '@angular/core';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { WpTableConfigurationModalComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\n\n@Component({\n templateUrl: './config-menu.template.html',\n selector: 'wp-table-config-menu',\n})\nexport class WorkPackagesTableConfigMenuComponent {\n public text = {\n configureTable: this.I18n.t('js.toolbar.settings.configure_view'),\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly injector:Injector,\n readonly opModalService:OpModalService,\n readonly opContextMenu:OPContextMenuService,\n ) { }\n\n public openTableConfigurationModal() {\n this.opContextMenu.close();\n this.opModalService.show(WpTableConfigurationModalComponent, this.injector);\n }\n}\n","\n \n\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UIRouterModule } from '@uirouter/angular';\nimport { WpTabWrapperComponent } from 'core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/wp-tab-wrapper.component';\nimport { DynamicModule } from 'ng-dynamic-component';\nimport { OpenprojectTabsModule } from 'core-app/shared/components/tabs/openproject-tabs.module';\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\nimport { WpTabsComponent } from './components/wp-tabs/wp-tabs.component';\n\n@NgModule({\n declarations: [\n WpTabsComponent,\n WpTabWrapperComponent,\n ],\n imports: [\n CommonModule,\n UIRouterModule,\n DynamicModule,\n OpenprojectTabsModule,\n IconModule,\n ],\n exports: [\n WpTabsComponent,\n WpTabWrapperComponent,\n ],\n})\nexport class OpWpTabsModule {\n}\n","\n \n \n \n {{ descriptor.label }}\n *\n \n \n \n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component,\n HostBinding,\n Injector,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { EditFormComponent } from 'core-app/shared/components/fields/edit/edit-form/edit-form.component';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport {\n FieldDescriptor,\n GroupDescriptor,\n} from 'core-app/features/work-packages/components/wp-single-view/wp-single-view.component';\n\n@Component({\n selector: 'wp-attribute-group',\n templateUrl: './wp-attribute-group.template.html',\n styleUrls: ['./wp-attribute-group.component.sass'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class WorkPackageFormAttributeGroupComponent extends UntilDestroyedMixin {\n @HostBinding('class.wp-attribute-group') className = true;\n\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public group:GroupDescriptor;\n\n constructor(readonly I18n:I18nService,\n public wpEditForm:EditFormComponent,\n protected injector:Injector) {\n super();\n }\n\n public trackByName(_index:number, elem:{ name:string }) {\n return elem.name;\n }\n\n /**\n * Hide read-only fields, but only when in the create mode\n * @param {FieldDescriptor} field\n */\n public shouldHideField(descriptor:FieldDescriptor) {\n const field = descriptor.field || descriptor.fields![0];\n return this.wpEditForm.editMode && !field.writable;\n }\n\n public fieldName(name:string) {\n if (name === 'startDate') {\n return 'combinedDate';\n }\n return name;\n }\n}\n","import { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\n\nexport class TimeEntryChangeset extends ResourceChangeset {\n public setValue(key:string, val:any) {\n super.setValue(key, val);\n\n // Update the form for fields that may alter the form itself\n if (key === 'workPackage') {\n this.updateForm();\n }\n }\n\n protected buildPayloadFromChanges() {\n const payload = super.buildPayloadFromChanges();\n\n // we ignore the project and instead rely completely on the work package.\n delete payload._links.project;\n\n return payload;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CookieService } from 'ngx-cookie-service';\n\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\nimport { OpSpotModule } from 'core-app/spot/spot.module';\n\nimport { FileLinkListComponent } from 'core-app/shared/components/file-links/file-link-list/file-link-list.component';\nimport {\n FileLinkListItemComponent,\n} from 'core-app/shared/components/file-links/file-link-list-item/file-link-list-item.component';\nimport {\n StorageInformationComponent,\n} from 'core-app/shared/components/file-links/storage-information/storage-information.component';\nimport {\n FilePickerModalComponent,\n} from 'core-app/shared/components/file-links/file-picker-modal/file-picker-modal.component';\nimport { OPSharedModule } from 'core-app/shared/shared.module';\nimport {\n StorageFileListItemComponent,\n} from 'core-app/shared/components/file-links/storage-file-list-item/storage-file-list-item.component';\nimport { SortFilesPipe } from 'core-app/shared/components/file-links/file-picker-modal/sort-files.pipe';\nimport {\n LoadingFileListComponent,\n} from 'core-app/shared/components/file-links/loading-file-list/loading-file-list.component';\n\n@NgModule({\n imports: [\n CommonModule,\n IconModule,\n OpSpotModule,\n OPSharedModule,\n ],\n declarations: [\n FileLinkListComponent,\n FileLinkListItemComponent,\n FilePickerModalComponent,\n LoadingFileListComponent,\n StorageInformationComponent,\n StorageFileListItemComponent,\n SortFilesPipe,\n ],\n exports: [\n FileLinkListComponent,\n ],\n providers: [\n CookieService,\n ],\n})\nexport class OpenprojectFileLinksModule {}\n","
    \n\n \n \n \n \n\n \n {{headerColumn.name}}\n {{headerColumn.name}}\n\n \n \n\n \n \n \n {{columnName}}\n \n \n \n\n \n \n\n \n\n \n {{headerColumn.name}}\n\n {{headerColumn.name}}\n\n \n \n\n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit, ChangeDetectorRef, Component, ElementRef, Input,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { RelationQueryColumn, TypeRelationQueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { QUERY_SORT_BY_ASC, QUERY_SORT_BY_DESC } from 'core-app/features/hal/resources/query-sort-by-resource';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport { WorkPackageViewRelationColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-relation-columns.service';\nimport { combineLatest } from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\n@Component({\n selector: 'sortHeader',\n templateUrl: './sort-header.directive.html',\n})\nexport class SortHeaderDirective extends UntilDestroyedMixin implements AfterViewInit {\n @Input() headerColumn:any;\n\n @Input() locale:string;\n\n @Input() table:WorkPackageTable;\n\n sortable:boolean;\n\n directionClass:string;\n\n public text = {\n toggleHierarchy: this.I18n.t('js.work_packages.hierarchy.show'),\n openMenu: this.I18n.t('js.label_open_menu'),\n sortColumn: 'Sorting column', // TODO\n };\n\n isHierarchyColumn:boolean;\n\n columnType:'hierarchy'|'relation'|'sort';\n\n columnName:string;\n\n hierarchyIcon:string;\n\n isHierarchyDisabled:boolean;\n\n private element:JQuery;\n\n private currentSortDirection:any;\n\n constructor(private wpTableHierarchies:WorkPackageViewHierarchiesService,\n private wpTableSortBy:WorkPackageViewSortByService,\n private wpTableGroupBy:WorkPackageViewGroupByService,\n private wpTableRelationColumns:WorkPackageViewRelationColumnsService,\n private elementRef:ElementRef,\n private cdRef:ChangeDetectorRef,\n private I18n:I18nService) {\n super();\n }\n\n ngAfterViewInit() {\n setTimeout(() => this.initialize());\n }\n\n private initialize():void {\n this.element = jQuery(this.elementRef.nativeElement);\n\n combineLatest([\n this.wpTableSortBy.onReadyWithAvailable(),\n this.wpTableSortBy.live$(),\n ])\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n const latestSortElement = this.wpTableSortBy.current[0];\n\n if (!latestSortElement || this.headerColumn.href !== latestSortElement.column.href) {\n this.currentSortDirection = null;\n } else {\n this.currentSortDirection = latestSortElement.direction;\n }\n this.setActiveColumnClass();\n\n this.sortable = this.wpTableSortBy.isSortable(this.headerColumn);\n\n this.directionClass = this.getDirectionClass();\n\n this.cdRef.detectChanges();\n });\n\n // Place the hierarchy icon left to the subject column\n this.isHierarchyColumn = this.headerColumn.id === 'subject';\n\n if (this.headerColumn.id === 'sortHandle') {\n this.columnType = 'sort';\n }\n if (this.isHierarchyColumn) {\n this.columnType = 'hierarchy';\n } else if (this.wpTableRelationColumns.relationColumnType(this.headerColumn) === 'toType') {\n this.columnType = 'relation';\n this.columnName = (this.headerColumn as TypeRelationQueryColumn).type.name;\n } else if (this.wpTableRelationColumns.relationColumnType(this.headerColumn) === 'ofType') {\n this.columnType = 'relation';\n this.columnName = I18n.t(`js.relation_labels.${(this.headerColumn as RelationQueryColumn).relationType}`);\n }\n\n if (this.isHierarchyColumn) {\n this.hierarchyIcon = 'icon-hierarchy';\n this.isHierarchyDisabled = this.wpTableGroupBy.isEnabled;\n\n // Disable hierarchy mode when group by is active\n this.wpTableGroupBy\n .live$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n this.isHierarchyDisabled = this.wpTableGroupBy.isEnabled;\n this.cdRef.detectChanges();\n });\n\n // Update hierarchy icon when updated elsewhere\n this.wpTableHierarchies\n .live$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n this.setHierarchyIcon();\n this.cdRef.detectChanges();\n });\n\n // Set initial icon\n this.setHierarchyIcon();\n }\n\n this.cdRef.detectChanges();\n }\n\n public get displayDropdownIcon() {\n return this.table && this.table.configuration.columnMenuEnabled;\n }\n\n public get displayHierarchyIcon() {\n return this.table && this.table.configuration.hierarchyToggleEnabled;\n }\n\n toggleHierarchy(evt:JQuery.TriggeredEvent) {\n if (this.wpTableHierarchies.toggleState()) {\n this.wpTableGroupBy.disable();\n }\n\n this.setHierarchyIcon();\n\n evt.stopPropagation();\n return false;\n }\n\n setHierarchyIcon() {\n if (this.wpTableHierarchies.isEnabled) {\n this.text.toggleHierarchy = I18n.t('js.work_packages.hierarchy.hide');\n this.hierarchyIcon = 'icon-hierarchy';\n } else {\n this.text.toggleHierarchy = I18n.t('js.work_packages.hierarchy.show');\n this.hierarchyIcon = 'icon-no-hierarchy';\n }\n }\n\n private getDirectionClass():string {\n if (!this.currentSortDirection) {\n return '';\n }\n\n switch (this.currentSortDirection.href) {\n case QUERY_SORT_BY_ASC:\n return 'asc';\n case QUERY_SORT_BY_DESC:\n return 'desc';\n default:\n return '';\n }\n }\n\n setActiveColumnClass() {\n this.element.toggleClass('active-column', !!this.currentSortDirection);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Injector,\n NgModule,\n} from '@angular/core';\nimport { OPSharedModule } from 'core-app/shared/shared.module';\nimport { OpenprojectFieldsModule } from 'core-app/shared/components/fields/openproject-fields.module';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { WorkPackageEmbeddedTableComponent } from 'core-app/features/work-packages/components/wp-table/embedded/wp-embedded-table.component';\nimport { WorkPackageEmbeddedTableEntryComponent } from 'core-app/features/work-packages/components/wp-table/embedded/wp-embedded-table-entry.component';\nimport { WorkPackageTablePaginationComponent } from 'core-app/features/work-packages/components/wp-table/table-pagination/wp-table-pagination.component';\nimport { WorkPackageTimelineTableController } from 'core-app/features/work-packages/components/wp-table/timeline/container/wp-timeline-container.directive';\nimport { WorkPackageInlineCreateComponent } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.component';\nimport { OpTypesContextMenuDirective } from 'core-app/shared/components/op-context-menu/handlers/op-types-context-menu.directive';\nimport { OpColumnsContextMenu } from 'core-app/shared/components/op-context-menu/handlers/op-columns-context-menu.directive';\nimport { OpSettingsMenuDirective } from 'core-app/shared/components/op-context-menu/handlers/op-settings-dropdown-menu.directive';\nimport { WorkPackageStatusDropdownDirective } from 'core-app/shared/components/op-context-menu/handlers/wp-status-dropdown-menu.directive';\nimport { WorkPackageCreateSettingsMenuDirective } from 'core-app/shared/components/op-context-menu/handlers/wp-create-settings-menu.directive';\nimport { WorkPackageSingleContextMenuDirective } from 'core-app/shared/components/op-context-menu/wp-context-menu/wp-single-context-menu';\nimport { WorkPackageTimelineHeaderController } from 'core-app/features/work-packages/components/wp-table/timeline/header/wp-timeline-header.directive';\nimport { WorkPackageTableTimelineRelations } from 'core-app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-relations.directive';\nimport { WorkPackageTableTimelineStaticElements } from 'core-app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-static-elements.directive';\nimport { WorkPackageTableTimelineGrid } from 'core-app/features/work-packages/components/wp-table/timeline/grid/wp-timeline-grid.directive';\nimport { WorkPackageTimelineButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-timeline-toggle-button/wp-timeline-toggle-button.component';\nimport { WorkPackageOverviewTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/overview-tab/overview-tab.component';\nimport { WorkPackageStatusButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-status-button/wp-status-button.component';\nimport { WorkPackageReplacementLabelComponent } from 'core-app/features/work-packages/components/wp-edit/wp-edit-field/wp-replacement-label.component';\nimport { NewestActivityOnOverviewComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-on-overview.component';\nimport { WorkPackageActivityTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-tab.component';\nimport { OpenprojectAttachmentsModule } from 'core-app/shared/components/attachments/openproject-attachments.module';\nimport { WpCustomActionComponent } from 'core-app/features/work-packages/components/wp-custom-actions/wp-custom-actions/wp-custom-action.component';\nimport { WpCustomActionsComponent } from 'core-app/features/work-packages/components/wp-custom-actions/wp-custom-actions.component';\nimport { WorkPackageRelationsTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/relations-tab/relations-tab.component';\nimport { WorkPackageRelationsComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relations.component';\nimport { WorkPackageRelationsGroupComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relations-group/wp-relations-group.component';\nimport { WorkPackageRelationRowComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relation-row/wp-relation-row.component';\nimport { WorkPackageRelationsCreateComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-create.component';\nimport { WorkPackageRelationsHierarchyComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.directive';\nimport { WorkPackageCreateButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-create-button/wp-create-button.component';\nimport { WorkPackageFilterButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-filter-button/wp-filter-button.component';\nimport { WorkPackageDetailsViewButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-details-view-button/wp-details-view-button.component';\nimport { WorkPackageFoldToggleButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-fold-toggle-button/wp-fold-toggle-button.component';\nimport { WpTableConfigurationModalComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\nimport { WpTableConfigurationColumnsTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/columns-tab.component';\nimport { WpTableConfigurationDisplaySettingsTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/display-settings-tab.component';\nimport { WpTableConfigurationFiltersTab } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/filters-tab.component';\nimport { WpTableConfigurationSortByTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/sort-by-tab.component';\nimport { WpTableConfigurationTimelinesTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/timelines-tab.component';\nimport { WpTableConfigurationHighlightingTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/highlighting-tab.component';\nimport { WpTableConfigurationRelationSelectorComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration-relation-selector';\nimport { WorkPackageWatchersTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/watchers-tab.component';\nimport { WorkPackageWatcherEntryComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watcher-entry.component';\nimport { WorkPackageNewSplitViewComponent } from 'core-app/features/work-packages/components/wp-new/wp-new-split-view.component';\nimport { WorkPackageNewFullViewComponent } from 'core-app/features/work-packages/components/wp-new/wp-new-full-view.component';\nimport { EmbeddedTablesMacroComponent } from 'core-app/features/work-packages/components/wp-table/embedded/embedded-tables-macro.component';\nimport { OpenprojectEditorModule } from 'core-app/shared/components/editor/openproject-editor.module';\nimport { WorkPackageTableSumsRowController } from 'core-app/features/work-packages/components/wp-table/wp-table-sums-row/wp-table-sums-row.directive';\nimport { ExternalQueryConfigurationComponent } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.component';\nimport { ExternalQueryConfigurationService } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.service';\nimport { ExternalRelationQueryConfigurationComponent } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.component';\nimport { ExternalRelationQueryConfigurationService } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.service';\nimport { WorkPackagesListInvalidQueryService } from 'core-app/features/work-packages/components/wp-list/wp-list-invalid-query.service';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { WorkPackageWatchersService } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watchers.service';\nimport { WorkPackagesActivityService } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/wp-activity.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageChildrenQueryComponent } from 'core-app/features/work-packages/components/wp-relations/embedded/children/wp-children-query.component';\nimport { WpRelationInlineAddExistingComponent } from 'core-app/features/work-packages/components/wp-relations/embedded/inline/add-existing/wp-relation-inline-add-existing.component';\nimport { WorkPackageRelationQueryComponent } from 'core-app/features/work-packages/components/wp-relations/embedded/relations/wp-relation-query.component';\nimport { WorkPackagesBaseComponent } from 'core-app/features/work-packages/routing/wp-base/wp--base.component';\nimport { WorkPackageSplitViewComponent } from 'core-app/features/work-packages/routing/wp-split-view/wp-split-view.component';\nimport { WorkPackagesFullViewComponent } from 'core-app/features/work-packages/routing/wp-full-view/wp-full-view.component';\nimport { QueryFiltersService } from 'core-app/features/work-packages/components/wp-query/query-filters.service';\nimport { WorkPackageCardViewComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { OpenprojectBcfModule } from 'core-app/features/bim/bcf/openproject-bcf.module';\nimport { WorkPackageRelationsAutocompleteComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-autocomplete/wp-relations-autocomplete.component';\nimport { CustomDateActionAdminComponent } from 'core-app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.component';\nimport { WorkPackagesTableConfigMenuComponent } from 'core-app/features/work-packages/components/wp-table/config-menu/config-menu.component';\nimport { WorkPackageViewToggleButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-view-toggle-button/work-package-view-toggle-button.component';\nimport { WorkPackageViewDropdownMenuDirective } from 'core-app/shared/components/op-context-menu/handlers/wp-view-dropdown-menu.directive';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { OpenprojectProjectsModule } from 'core-app/features/projects/openproject-projects.module';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { WorkPackageEditActionsBarComponent } from 'core-app/features/work-packages/components/edit-actions-bar/wp-edit-actions-bar.component';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { WorkPackageSingleCardComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component';\nimport { WorkPackageListViewComponent } from 'core-app/features/work-packages/routing/wp-list-view/wp-list-view.component';\nimport { PartitionedQuerySpacePageComponent } from 'core-app/features/work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component';\nimport { WorkPackageViewPageComponent } from 'core-app/features/work-packages/routing/wp-view-page/wp-view-page.component';\nimport { WorkPackageSettingsButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-settings-button/wp-settings-button.component';\nimport { BackButtonComponent } from 'core-app/features/work-packages/components/back-routing/back-button.component';\nimport { WorkPackagesTableComponent } from 'core-app/features/work-packages/components/wp-table/wp-table.component';\nimport { WorkPackageGroupToggleDropdownMenuDirective } from 'core-app/shared/components/op-context-menu/handlers/wp-group-toggle-dropdown-menu.directive';\nimport { OpenprojectAutocompleterModule } from 'core-app/shared/components/autocompleter/openproject-autocompleter.module';\nimport { OpWpTabsModule } from 'core-app/features/work-packages/components/wp-tabs/wp-tabs.module';\nimport { EditFieldControlsModule } from 'core-app/shared/components/fields/edit/field-controls/edit-field-controls.module';\nimport { WpTableExportModalComponent } from 'core-app/shared/components/modals/export-modal/wp-table-export.modal';\nimport { WpButtonMacroModalComponent } from 'core-app/shared/components/modals/editor/macro-wp-button-modal/wp-button-macro.modal';\nimport { QuerySharingModalComponent } from 'core-app/shared/components/modals/share-modal/query-sharing.modal';\nimport { SaveQueryModalComponent } from 'core-app/shared/components/modals/save-modal/save-query.modal';\nimport { QuerySharingFormComponent } from 'core-app/shared/components/modals/share-modal/query-sharing-form.component';\nimport { WpDestroyModalComponent } from 'core-app/shared/components/modals/wp-destroy-modal/wp-destroy.modal';\nimport { WorkPackageTypeStatusComponent } from 'core-app/features/work-packages/components/wp-type-status/wp-type-status.component';\nimport { WorkPackageIsolatedQuerySpaceDirective } from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\nimport { WorkPackageBreadcrumbParentComponent } from 'core-app/features/work-packages/components/wp-breadcrumb/wp-breadcrumb-parent.component';\nimport { WorkPackageSubjectComponent } from 'core-app/features/work-packages/components/wp-subject/wp-subject.component';\nimport { WorkPackageBreadcrumbComponent } from 'core-app/features/work-packages/components/wp-breadcrumb/wp-breadcrumb.component';\nimport { UserLinkComponent } from 'core-app/shared/components/user-link/user-link.component';\nimport { WorkPackageCommentComponent } from 'core-app/features/work-packages/components/work-package-comment/work-package-comment.component';\nimport { WorkPackageWatcherButtonComponent } from 'core-app/features/work-packages/components/wp-watcher-button/wp-watcher-button.component';\nimport { WorkPackageCommentFieldComponent } from 'core-app/features/work-packages/components/work-package-comment/wp-comment-field.component';\nimport { WpResizerDirective } from 'core-app/shared/components/resizer/resizer/wp-resizer.component';\nimport {\n GroupDescriptor,\n WorkPackageSingleViewComponent,\n} from 'core-app/features/work-packages/components/wp-single-view/wp-single-view.component';\nimport { WorkPackageIsolatedGraphQuerySpaceDirective } from 'core-app/features/work-packages/directives/query-space/wp-isolated-graph-query-space.directive';\nimport { RevisionActivityComponent } from 'core-app/features/work-packages/components/wp-activity/revision/revision-activity.component';\nimport { WorkPackageCopySplitViewComponent } from 'core-app/features/work-packages/components/wp-copy/wp-copy-split-view.component';\nimport { WorkPackageFormAttributeGroupComponent } from 'core-app/features/work-packages/components/wp-form-group/wp-attribute-group.component';\nimport { WorkPackagesGridComponent } from 'core-app/features/work-packages/components/wp-grid/wp-grid.component';\nimport { ActivityEntryComponent } from 'core-app/features/work-packages/components/wp-activity/activity-entry.component';\nimport { ActivityLinkComponent } from 'core-app/features/work-packages/components/wp-activity/activity-link.component';\nimport { UserActivityComponent } from 'core-app/features/work-packages/components/wp-activity/user/user-activity.component';\nimport { WorkPackageSplitViewToolbarComponent } from 'core-app/features/work-packages/components/wp-details/wp-details-toolbar.component';\nimport { WorkPackageCopyFullViewComponent } from 'core-app/features/work-packages/components/wp-copy/wp-copy-full-view.component';\nimport { OpenprojectTabsModule } from 'core-app/shared/components/tabs/openproject-tabs.module';\nimport { TimeEntryChangeset } from 'core-app/features/work-packages/helpers/time-entries/time-entry-changeset';\n\nimport { AttachmentsUploadComponent } from 'core-app/shared/components/attachments/attachments-upload/attachments-upload.component';\nimport { AttachmentListComponent } from 'core-app/shared/components/attachments/attachment-list/attachment-list.component';\nimport { QueryFiltersComponent } from 'core-app/features/work-packages/components/filters/query-filters/query-filters.component';\nimport { FilterDateTimesValueComponent } from 'core-app/features/work-packages/components/filters/filter-date-times-value/filter-date-times-value.component';\nimport { FilterSearchableMultiselectValueComponent } from 'core-app/features/work-packages/components/filters/filter-searchable-multiselect-value/filter-searchable-multiselect-value.component';\nimport { QueryFilterComponent } from 'core-app/features/work-packages/components/filters/query-filter/query-filter.component';\nimport { FilterDatesValueComponent } from 'core-app/features/work-packages/components/filters/filter-dates-value/filter-dates-value.component';\nimport { FilterStringValueComponent } from 'core-app/features/work-packages/components/filters/filter-string-value/filter-string-value.component';\nimport { FilterProjectComponent } from 'core-app/features/work-packages/components/filters/filter-project/filter-project.component';\nimport { FilterDateValueComponent } from 'core-app/features/work-packages/components/filters/filter-date-value/filter-date-value.component';\nimport { FilterDateTimeValueComponent } from 'core-app/features/work-packages/components/filters/filter-date-time-value/filter-date-time-value.component';\nimport { FilterToggledMultiselectValueComponent } from 'core-app/features/work-packages/components/filters/filter-toggled-multiselect-value/filter-toggled-multiselect-value.component';\nimport { WorkPackageFilterByTextInputComponent } from 'core-app/features/work-packages/components/filters/quick-filter-by-text-input/quick-filter-by-text-input.component';\nimport { FilterIntegerValueComponent } from 'core-app/features/work-packages/components/filters/filter-integer-value/filter-integer-value.component';\nimport { WorkPackageFilterContainerComponent } from 'core-app/features/work-packages/components/filters/filter-container/filter-container.directive';\nimport { FilterBooleanValueComponent } from 'core-app/features/work-packages/components/filters/filter-boolean-value/filter-boolean-value.component';\nimport { WorkPackageMarkNotificationButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-mark-notification-button/work-package-mark-notification-button.component';\nimport { WorkPackageFilesTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/files-tab/op-files-tab.component';\nimport { WorkPackagesQueryViewService } from 'core-app/features/work-packages/components/wp-list/wp-query-view.service';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { OpenprojectFileLinksModule } from 'core-app/shared/components/file-links/openproject-file-links.module';\nimport { FileLinksResourceService } from 'core-app/core/state/file-links/file-links.service';\nimport { StoragesResourceService } from 'core-app/core/state/storages/storages.service';\nimport { DatepickerBannerComponent } from 'core-app/shared/components/datepicker/banner/datepicker-banner.component';\nimport { SingleDateModalComponent } from 'core-app/shared/components/datepicker/single-date-modal/single-date.modal';\nimport { MultiDateModalComponent } from 'core-app/shared/components/datepicker/multi-date-modal/multi-date.modal';\nimport { DatepickerWorkingDaysToggleComponent } from 'core-app/shared/components/datepicker/toggle/datepicker-working-days-toggle.component';\nimport { DatepickerSchedulingToggleComponent } from 'core-app/shared/components/datepicker/scheduling-mode/datepicker-scheduling-toggle.component';\nimport { StorageFilesResourceService } from 'core-app/core/state/storage-files/storage-files.service';\n\n@NgModule({\n imports: [\n // Commons\n OPSharedModule,\n // Display + Edit field functionality\n OpenprojectFieldsModule,\n // CKEditor\n OpenprojectEditorModule,\n\n OpenprojectAttachmentsModule,\n\n OpenprojectBcfModule,\n\n OpenprojectProjectsModule,\n\n OpenprojectModalModule,\n\n OpenprojectAutocompleterModule,\n\n OpWpTabsModule,\n\n EditFieldControlsModule,\n OpenprojectTabsModule,\n OpenprojectFileLinksModule,\n ],\n providers: [\n // Notification service\n WorkPackageNotificationService,\n\n // External query configuration\n ExternalQueryConfigurationService,\n ExternalRelationQueryConfigurationService,\n\n // Global work package states / services\n SchemaCacheService,\n\n // Global query/table state services\n // For any service that depends on the isolated query space,\n // they should be provided in wp-isolated-query-space.directive instead\n QueryFiltersService,\n WorkPackagesListInvalidQueryService,\n\n // Provide a separate service for creation events of WP Inline create\n // This can be hierarchically injected to provide isolated events on an embedded table\n WorkPackageRelationsService,\n\n WorkPackagesActivityService,\n WorkPackageRelationsService,\n WorkPackageWatchersService,\n\n WorkPackagesQueryViewService,\n\n HalEventsService,\n FileLinksResourceService,\n StorageFilesResourceService,\n\n StoragesResourceService,\n ],\n declarations: [\n // Routing\n WorkPackagesBaseComponent,\n PartitionedQuerySpacePageComponent,\n WorkPackageViewPageComponent,\n\n // WP list side\n WorkPackageListViewComponent,\n WorkPackageSettingsButtonComponent,\n\n // Query injector isolation\n WorkPackageIsolatedQuerySpaceDirective,\n WorkPackageIsolatedGraphQuerySpaceDirective,\n\n // WP New\n WorkPackageNewFullViewComponent,\n WorkPackageNewSplitViewComponent,\n WorkPackageTypeStatusComponent,\n WorkPackageEditActionsBarComponent,\n\n // WP Copy\n WorkPackageCopyFullViewComponent,\n WorkPackageCopySplitViewComponent,\n\n // Embedded table\n WorkPackageEmbeddedTableComponent,\n WorkPackageEmbeddedTableEntryComponent,\n\n // External query configuration\n ExternalQueryConfigurationComponent,\n ExternalRelationQueryConfigurationComponent,\n\n // Inline create\n WorkPackageInlineCreateComponent,\n WpRelationInlineAddExistingComponent,\n\n WorkPackagesGridComponent,\n\n WorkPackagesTableComponent,\n WorkPackagesTableConfigMenuComponent,\n WorkPackageTablePaginationComponent,\n\n WpResizerDirective,\n\n WorkPackageTableSumsRowController,\n\n // Fold/Unfold button on wp list\n WorkPackageFoldToggleButtonComponent,\n\n // Filters\n QueryFiltersComponent,\n QueryFilterComponent,\n FilterBooleanValueComponent,\n FilterDateValueComponent,\n FilterDatesValueComponent,\n FilterDateTimeValueComponent,\n FilterDateTimesValueComponent,\n FilterIntegerValueComponent,\n FilterStringValueComponent,\n FilterProjectComponent,\n FilterToggledMultiselectValueComponent,\n FilterSearchableMultiselectValueComponent,\n\n WorkPackageFilterContainerComponent,\n WorkPackageFilterButtonComponent,\n\n // Context menus\n OpTypesContextMenuDirective,\n OpColumnsContextMenu,\n OpSettingsMenuDirective,\n WorkPackageStatusDropdownDirective,\n WorkPackageCreateSettingsMenuDirective,\n WorkPackageSingleContextMenuDirective,\n WorkPackageViewDropdownMenuDirective,\n WorkPackageGroupToggleDropdownMenuDirective,\n\n // Timeline\n WorkPackageTimelineButtonComponent,\n WorkPackageTimelineHeaderController,\n WorkPackageTableTimelineRelations,\n WorkPackageTableTimelineStaticElements,\n WorkPackageTableTimelineGrid,\n WorkPackageTimelineTableController,\n\n WorkPackageCreateButtonComponent,\n WorkPackageFilterByTextInputComponent,\n\n // Single view\n WorkPackageOverviewTabComponent,\n WorkPackageSingleViewComponent,\n WorkPackageStatusButtonComponent,\n WorkPackageReplacementLabelComponent,\n UserLinkComponent,\n WorkPackageChildrenQueryComponent,\n WorkPackageRelationQueryComponent,\n WorkPackageFormAttributeGroupComponent,\n BackButtonComponent,\n\n // Activity Tab\n NewestActivityOnOverviewComponent,\n WorkPackageCommentComponent,\n WorkPackageCommentFieldComponent,\n ActivityEntryComponent,\n UserActivityComponent,\n RevisionActivityComponent,\n ActivityLinkComponent,\n WorkPackageActivityTabComponent,\n\n // Watchers wp-tab-wrapper\n WorkPackageWatchersTabComponent,\n WorkPackageWatcherEntryComponent,\n\n // Relations\n WorkPackageRelationsTabComponent,\n WorkPackageRelationsComponent,\n WorkPackageRelationsGroupComponent,\n WorkPackageRelationRowComponent,\n WorkPackageRelationsCreateComponent,\n WorkPackageRelationsHierarchyComponent,\n WorkPackageRelationsAutocompleteComponent,\n WorkPackageBreadcrumbParentComponent,\n\n // Files tab\n WorkPackageFilesTabComponent,\n\n // Split view\n WorkPackageDetailsViewButtonComponent,\n WorkPackageSplitViewComponent,\n WorkPackageBreadcrumbComponent,\n WorkPackageSplitViewToolbarComponent,\n WorkPackageWatcherButtonComponent,\n WorkPackageSubjectComponent,\n\n // Full view\n WorkPackagesFullViewComponent,\n\n // Modals\n WpTableConfigurationModalComponent,\n WpTableConfigurationColumnsTabComponent,\n WpTableConfigurationDisplaySettingsTabComponent,\n WpTableConfigurationFiltersTab,\n WpTableConfigurationSortByTabComponent,\n WpTableConfigurationTimelinesTabComponent,\n WpTableConfigurationHighlightingTabComponent,\n WpTableConfigurationRelationSelectorComponent,\n WpTableExportModalComponent,\n QuerySharingFormComponent,\n QuerySharingModalComponent,\n SaveQueryModalComponent,\n WpDestroyModalComponent,\n MultiDateModalComponent,\n SingleDateModalComponent,\n DatepickerBannerComponent,\n DatepickerWorkingDaysToggleComponent,\n DatepickerSchedulingToggleComponent,\n\n // CustomActions\n WpCustomActionComponent,\n WpCustomActionsComponent,\n CustomDateActionAdminComponent,\n\n // CKEditor macros which could not be included in the\n // editor module to avoid circular dependencies\n EmbeddedTablesMacroComponent,\n WpButtonMacroModalComponent,\n\n // Card view\n WorkPackageCardViewComponent,\n WorkPackageSingleCardComponent,\n WorkPackageViewToggleButtonComponent,\n\n // Notifications\n WorkPackageMarkNotificationButtonComponent,\n ],\n exports: [\n WorkPackagesTableComponent,\n WorkPackageTablePaginationComponent,\n WorkPackageEmbeddedTableComponent,\n WorkPackageEmbeddedTableEntryComponent,\n WorkPackageCardViewComponent,\n WorkPackageSingleCardComponent,\n WorkPackageFilterButtonComponent,\n WorkPackageFilterContainerComponent,\n WorkPackageIsolatedQuerySpaceDirective,\n WorkPackageIsolatedGraphQuerySpaceDirective,\n QueryFiltersComponent,\n\n WpResizerDirective,\n WorkPackageBreadcrumbComponent,\n WorkPackageBreadcrumbParentComponent,\n WorkPackageSplitViewToolbarComponent,\n WorkPackageSubjectComponent,\n WorkPackagesGridComponent,\n\n // Modals\n WpTableConfigurationModalComponent,\n WpTableConfigurationFiltersTab,\n\n // Needed so that e.g. IFC can access it.\n WorkPackageCreateButtonComponent,\n WorkPackageStatusButtonComponent,\n WorkPackageTypeStatusComponent,\n WorkPackageEditActionsBarComponent,\n WorkPackageSingleViewComponent,\n WorkPackageSplitViewComponent,\n BackButtonComponent,\n ],\n})\nexport class OpenprojectWorkPackagesModule {\n static bootstrapAttributeGroupsCalled = false;\n\n constructor(injector:Injector) {\n OpenprojectWorkPackagesModule.bootstrapAttributeGroups(injector);\n }\n\n // The static property prevents running the function\n // multiple times. This happens e.g. when the module is included\n // into a plugin's module.\n public static bootstrapAttributeGroups(injector:Injector):void {\n if (this.bootstrapAttributeGroupsCalled) {\n return;\n }\n\n this.bootstrapAttributeGroupsCalled = true;\n\n const hookService = injector.get(HookService);\n\n hookService.register('attributeGroupComponent', (group:GroupDescriptor, workPackage:WorkPackageResource) => {\n if (group.type === 'WorkPackageFormAttributeGroup') {\n return WorkPackageFormAttributeGroupComponent;\n }\n if (!isNewResource(workPackage) && group.type === 'WorkPackageFormChildrenQueryGroup') {\n return WorkPackageChildrenQueryComponent;\n }\n if (!isNewResource(workPackage) && group.type === 'WorkPackageFormRelationQueryGroup') {\n return WorkPackageRelationQueryComponent;\n }\n return null;\n });\n\n hookService.register('workPackageAttachmentUploadComponent', () => AttachmentsUploadComponent);\n\n hookService.register('workPackageAttachmentListComponent', () => AttachmentListComponent);\n\n /** Return specialized work package changeset for editing service */\n hookService.register('halResourceChangesetClass', (resource:HalResource) => {\n switch (resource._type) {\n case 'WorkPackage':\n return WorkPackageChangeset;\n case 'TimeEntry':\n return TimeEntryChangeset;\n default:\n return null;\n }\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { OpTitleService } from 'core-app/core/html/op-title.service';\nimport { WorkPackagesViewBase } from 'core-app/features/work-packages/routing/wp-view-base/work-packages-view.base';\nimport { take } from 'rxjs/operators';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { QueryParamListenerService } from 'core-app/features/work-packages/components/wp-query/query-param-listener.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ComponentType } from '@angular/cdk/overlay';\nimport { Ng2StateDeclaration } from '@uirouter/angular';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { InviteUserModalComponent } from 'core-app/features/invite-user-modal/invite-user.component';\nimport { WorkPackageFilterContainerComponent } from 'core-app/features/work-packages/components/filters/filter-container/filter-container.directive';\nimport isPersistedResource from 'core-app/features/hal/helpers/is-persisted-resource';\nimport { UIRouterGlobals } from '@uirouter/core';\n\nexport interface DynamicComponentDefinition {\n component:ComponentType;\n inputs?:{ [inputName:string]:any };\n outputs?:{ [outputName:string]:Function };\n}\n\nexport interface ToolbarButtonComponentDefinition extends DynamicComponentDefinition {\n containerClasses?:string;\n show?:() => boolean;\n}\n\nexport type ViewPartitionState = '-split'|'-left-only'|'-right-only';\n\n@Component({\n templateUrl: './partitioned-query-space-page.component.html',\n styleUrls: ['./partitioned-query-space-page.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n /** We need to provide the wpNotification service here to get correct save notifications for WP resources */\n { provide: HalResourceNotificationService, useClass: WorkPackageNotificationService },\n QueryParamListenerService,\n ],\n})\nexport class PartitionedQuerySpacePageComponent extends WorkPackagesViewBase implements OnInit, OnDestroy {\n @InjectField() I18n!:I18nService;\n\n @InjectField() titleService:OpTitleService;\n\n @InjectField() queryParamListener:QueryParamListenerService;\n\n @InjectField() opModalService:OpModalService;\n\n @InjectField() uiRouterGlobals:UIRouterGlobals;\n\n text:{ [key:string]:string } = {\n jump_to_pagination: this.I18n.t('js.work_packages.jump_marks.pagination'),\n text_jump_to_pagination: this.I18n.t('js.work_packages.jump_marks.label_pagination'),\n };\n\n /** Whether the title can be edited */\n titleEditingEnabled:boolean;\n\n /** Current query title to render */\n selectedTitle?:string;\n\n currentQuery:QueryResource|undefined;\n\n /** Whether we're saving the query */\n toolbarDisabled:boolean;\n\n /** Do we currently have query props ? */\n showToolbarSaveButton:boolean;\n\n /** Listener callbacks */\n // eslint-disable-next-line @typescript-eslint/ban-types\n removeTransitionSubscription:Function;\n\n /** Determine when query is initially loaded */\n showToolbar = false;\n\n /** The toolbar buttons to render */\n toolbarButtonComponents:ToolbarButtonComponentDefinition[] = [];\n\n /** Whether filtering is allowed */\n filterAllowed = true;\n\n /** We need to pass the correct partition state to the view to manage the grid */\n currentPartition:ViewPartitionState = '-split';\n\n /** What route (if any) should we go back to using the back button left of the title? */\n backButtonCallback:() => void|undefined;\n\n /** Which filter container component to mount */\n filterContainerDefinition:DynamicComponentDefinition = {\n component: WorkPackageFilterContainerComponent,\n };\n\n ngOnInit():void {\n super.ngOnInit();\n\n this.showToolbarSaveButton = !!this.$state.params.query_props;\n this.setPartition(this.$state.current);\n this.removeTransitionSubscription = this.$transitions.onSuccess({}, (transition):any => {\n const params = transition.params('to');\n const toState = transition.to();\n this.showToolbarSaveButton = !!params.query_props;\n this.setPartition(toState);\n\n const query = this.querySpace.query.value;\n if (query && this.shouldUpdateHtmlTitle()) {\n // Update the title if we're in the list state alone\n this.titleService.setFirstPart(this.queryTitle(query));\n }\n\n this.cdRef.detectChanges();\n });\n\n // Load the query. If it hasn't been loaded before, do that visibly.\n this.loadInitialQuery();\n\n // Mark tableInformationLoaded when initially loading done\n this.setupInformationLoadedListener();\n\n // Load query on URL transitions\n this.queryParamListener\n .observe$\n .pipe(this.untilDestroyed())\n .subscribe(() => {\n /** Ensure we reload the query from the changed props */\n this.currentQuery = undefined;\n void this.refresh(true, true);\n });\n\n this.querySpace.query.values$()\n .pipe(this.untilDestroyed())\n .subscribe((query) => {\n // Update the title whenever the query changes\n this.updateTitle(query);\n this.currentQuery = query;\n });\n }\n\n /**\n * We need to set the current partition to the grid to ensure\n * either side gets expanded to full width if we're not in '-split' mode.\n *\n * @param state The current or entering state\n */\n protected setPartition(state:Ng2StateDeclaration):void {\n this.currentPartition = (state.data && state.data.partition) ? state.data.partition : '-split';\n }\n\n protected setupInformationLoadedListener():void {\n this\n .querySpace\n .initialized\n .values$()\n .pipe(take(1))\n .subscribe(() => {\n this.showToolbar = true;\n this.cdRef.detectChanges();\n });\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n this.removeTransitionSubscription();\n this.queryParamListener.removeQueryChangeListener();\n }\n\n public changeChangesFromTitle(val:string):void {\n if (this.currentQuery && isPersistedResource(this.currentQuery)) {\n this.updateTitleName(val);\n } else {\n this.wpListService\n .create(this.currentQuery!, val)\n .finally(() => { this.toolbarDisabled = false; });\n }\n }\n\n updateTitleName(val:string):void {\n this.toolbarDisabled = true;\n this.currentQuery!.name = val;\n this.wpListService\n .save(this.currentQuery)\n .finally(() => { this.toolbarDisabled = false; });\n }\n\n updateTitle(query?:QueryResource):void {\n // Too early for loaded query\n if (!query) {\n return;\n }\n\n this.selectedTitle = this.queryTitle(query);\n\n this.titleEditingEnabled = this.authorisationService.can('query', 'updateImmediately');\n\n // Update the title if we're in the list state alone\n if (this.shouldUpdateHtmlTitle()) {\n this.titleService.setFirstPart(this.selectedTitle);\n }\n }\n\n refresh(visibly = false, firstPage = false):Promise {\n let promise = this.loadQuery(firstPage);\n\n if (visibly) {\n promise = promise.then((loadedQuery:QueryResource) => {\n this.wpStatesInitialization.initialize(loadedQuery, loadedQuery.results);\n return this.additionalLoadingTime()\n .then(() => loadedQuery);\n });\n\n this.loadingIndicator = promise;\n } else {\n promise = promise.then((loadedQuery:QueryResource) => {\n this.wpStatesInitialization.initialize(loadedQuery, loadedQuery.results);\n return loadedQuery;\n });\n }\n\n return promise;\n }\n\n protected inviteModal = InviteUserModalComponent;\n\n openInviteUserModal():void {\n this.opModalService.show(this.inviteModal, 'global');\n }\n\n protected loadQuery(firstPage = false):Promise {\n let promise:Promise;\n const query = this.currentQuery;\n\n if (firstPage || !query) {\n promise = this.loadFirstPage();\n } else {\n const pagination = this.wpListService.getPaginationInfo();\n promise = this.wpListService\n .loadQueryFromExisting(query, pagination, this.projectIdentifier)\n .toPromise();\n }\n\n return promise;\n }\n\n protected loadFirstPage():Promise {\n if (this.currentQuery) {\n return this.wpListService.reloadQuery(this.currentQuery, this.projectIdentifier).toPromise();\n }\n return this.wpListService.loadCurrentQueryFromParams(this.projectIdentifier);\n }\n\n protected additionalLoadingTime():Promise {\n return Promise.resolve();\n }\n\n protected set loadingIndicator(promise:Promise) {\n this.loadingIndicatorService.table.promise = promise;\n }\n\n protected shouldUpdateHtmlTitle():boolean {\n return true;\n }\n\n protected staticQueryName(query:QueryResource):string {\n return this.opStaticQueries.getStaticName(query);\n }\n\n protected loadInitialQuery():void {\n const isFirstLoad = !this.querySpace.initialized.hasValue();\n this.loadingIndicator = this.loadQuery(isFirstLoad);\n }\n\n private queryTitle(query:QueryResource):string {\n return isPersistedResource(query) ? query.name : this.staticQueryName(query);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { StateService } from '@uirouter/angular';\n\n/**\n * Returns the path to the split view based on the current route\n *\n * @param state State service\n */\nexport function splitViewRoute(state:StateService, target:'details'|'new' = 'details'):string {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment\n const baseRoute:string = state.current.data.baseRoute || '';\n return `${baseRoute}.${target}`;\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageCreateComponent } from 'core-app/features/work-packages/components/wp-new/wp-create.component';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\n\n@Component({\n selector: 'wp-new-split-view',\n templateUrl: './wp-new-split-view.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageNewSplitViewComponent extends WorkPackageCreateComponent {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { WorkPackageCopyController } from 'core-app/features/work-packages/components/wp-copy/wp-copy.controller';\n\n@Component({\n selector: 'wp-copy-split-view',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: '../wp-new/wp-new-split-view.html',\n})\nexport class WorkPackageCopySplitViewComponent extends WorkPackageCopyController {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageNewSplitViewComponent } from 'core-app/features/work-packages/components/wp-new/wp-new-split-view.component';\nimport { Ng2StateDeclaration } from '@uirouter/angular';\nimport { ComponentType } from '@angular/cdk/overlay';\nimport { WpTabWrapperComponent } from 'core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/wp-tab-wrapper.component';\nimport { WorkPackageCopySplitViewComponent } from 'core-app/features/work-packages/components/wp-copy/wp-copy-split-view.component';\n\n/**\n * Return a set of routes for a split view mounted under the given base route,\n * which must be a grandchild of a PartitionedQuerySpacePageComponent.\n *\n * Example: base route = foo.bar\n *\n * Split view will be created at\n *\n * foo.bar.details\n * foo.bar.details.activity\n * foo.bar.details.relations\n * foo.bar.details.watchers\n *\n * NOTE: All parameters here must either be `export const` or literal strings,\n * otherwise AOT will not be able to look them up. This might result in missing routes.\n *\n * @param baseRoute The base route to mount under\n * @param showComponent The split view component to mount\n */\nexport function makeSplitViewRoutes(baseRoute:string,\n menuItemClass:string|undefined,\n showComponent:ComponentType,\n newComponent:ComponentType = WorkPackageNewSplitViewComponent,\n makeFullWidth?:boolean,\n showMobileAlternative = true,\n routeName = baseRoute):Ng2StateDeclaration[] {\n // makeFullWidth configuration\n const views:{ [content:string]:{ component:ComponentType; }; } = makeFullWidth\n ? { 'content-left@^.^': { component: showComponent } }\n : { 'content-right@^.^': { component: showComponent } };\n const partition = makeFullWidth ? '-left-only' : '-split';\n\n return [\n {\n name: `${routeName}.details`,\n url: '/details/{workPackageId:[0-9]+}',\n redirectTo: (trans) => {\n const params = trans.params('to');\n return {\n state: `${routeName}.details.tabs`,\n params: { ...params, tabIdentifier: 'overview' },\n };\n },\n reloadOnSearch: false,\n data: {\n bodyClasses: 'router--work-packages-partitioned-split-view-details',\n menuItem: menuItemClass,\n // Remember the base route so we can route back to it anywhere\n baseRoute,\n newRoute: `${routeName}.new`,\n partition,\n mobileAlternative: showMobileAlternative ? 'work-packages.show' : undefined,\n },\n // Retarget and by that override the grandparent views\n // https://ui-router.github.io/guide/views#relative-parent-state\n views,\n },\n {\n name: `${routeName}.details.tabs`,\n url: '/:tabIdentifier',\n component: WpTabWrapperComponent,\n data: {\n baseRoute,\n menuItem: menuItemClass,\n parent: `${routeName}.details`,\n mobileAlternative: showMobileAlternative ? 'work-packages.show' : undefined,\n },\n },\n // Split create route\n {\n name: `${routeName}.new`,\n url: '/create_new?{type:[0-9]+}&{parent_id:[0-9]+}',\n reloadOnSearch: false,\n params: {\n defaults: {\n value: null,\n },\n },\n data: {\n partition: '-split',\n allowMovingInEditMode: true,\n bodyClasses: 'router--work-packages-partitioned-split-view-new',\n // Remember the base route so we can route back to it anywhere\n baseRoute,\n parent: baseRoute,\n mobileAlternative: showMobileAlternative ? 'work-packages.show' : undefined,\n },\n views: {\n // Retarget and by that override the grandparent views\n // https://ui-router.github.io/guide/views#relative-parent-state\n 'content-right@^.^': { component: newComponent },\n },\n },\n // Split copy route\n {\n name: `${routeName}.copy`,\n url: '/details/{copiedFromWorkPackageId:[0-9]+}/copy',\n views: {\n 'content-right@^.^': { component: WorkPackageCopySplitViewComponent },\n },\n reloadOnSearch: false,\n data: {\n baseRoute,\n parent: baseRoute,\n allowMovingInEditMode: true,\n bodyClasses: 'router--work-packages-partitioned-split-view',\n menuItem: menuItemClass,\n partition: '-split',\n mobileAlternative: showMobileAlternative ? 'work-packages.show' : undefined,\n },\n },\n ];\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Transition } from '@uirouter/core';\nimport { Injectable } from '@angular/core';\nimport { EditFormRoutingService } from 'core-app/shared/components/fields/edit/edit-form/edit-form-routing.service';\n\n@Injectable()\nexport class WorkPackageEditFormRoutingService extends EditFormRoutingService {\n /**\n * Return whether the given transition is cancelled during the editing of this form\n *\n * @param transition The transition that is underway.\n * @return A boolean marking whether the transition should be blocked.\n */\n public blockedTransition(transition:Transition):boolean {\n const toState = transition.to();\n const fromState = transition.from();\n const fromParams = transition.params('from');\n const toParams = transition.params('to');\n\n // In new/copy mode, transitions to the same controller are allowed\n if (fromState.name && (/\\.(new|copy)$/.exec(fromState.name))) {\n return !(toState.data && toState.data.allowMovingInEditMode);\n }\n\n // When editing an existing WP, transitions on the same WP id are allowed\n return toParams.workPackageId === undefined || toParams.workPackageId !== fromParams.workPackageId;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component } from '@angular/core';\nimport { EditFormRoutingService } from 'core-app/shared/components/fields/edit/edit-form/edit-form-routing.service';\nimport { WorkPackageEditFormRoutingService } from 'core-app/features/work-packages/routing/wp-edit-form/wp-edit-form-routing.service';\n\nexport const wpBaseSelector = 'work-packages-base';\n\n@Component({\n selector: wpBaseSelector,\n template: `\n
    \n \n
    \n `,\n providers: [\n { provide: EditFormRoutingService, useClass: WorkPackageEditFormRoutingService },\n ],\n})\nexport class WorkPackagesBaseComponent {\n}\n","
    \n\n\n\n\n\n\n
    \n\n\n
    \n\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Injector,\n OnInit,\n ElementRef,\n NgZone,\n} from '@angular/core';\nimport { take } from 'rxjs/operators';\nimport { CausedUpdatesService } from 'core-app/features/boards/board/caused-updates/caused-updates.service';\nimport { DragAndDropService } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.service';\nimport {\n WorkPackageViewDisplayRepresentationService,\n wpDisplayCardRepresentation,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\nimport { WorkPackageTableConfigurationObject } from 'core-app/features/work-packages/components/wp-table/wp-table-configuration';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { StateService } from '@uirouter/core';\nimport { KeepTabService } from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\n\n@Component({\n selector: 'wp-list-view',\n templateUrl: './wp-list-view.component.html',\n styleUrls: ['./wp-list-view.component.sass'],\n host: { class: 'op-wp-list-view work-packages-split-view--tabletimeline-side' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: HalResourceNotificationService, useClass: WorkPackageNotificationService },\n DragAndDropService,\n CausedUpdatesService,\n ],\n})\nexport class WorkPackageListViewComponent extends UntilDestroyedMixin implements OnInit {\n text = {\n jump_to_pagination: this.I18n.t('js.work_packages.jump_marks.pagination'),\n text_jump_to_pagination: this.I18n.t('js.work_packages.jump_marks.label_pagination'),\n button_settings: this.I18n.t('js.button_settings'),\n };\n\n /** Switch between list and card view */\n showTableView = true;\n\n /** Determine when query is initially loaded */\n tableInformationLoaded = false;\n\n /** If loaded list of work packages is empty */\n noResults = false;\n\n /** Whether we should render a blocked view */\n showResultOverlay$ = this.wpViewFilters.incomplete$;\n\n /** */\n readonly wpTableConfiguration:WorkPackageTableConfigurationObject = {\n dragAndDropEnabled: true,\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly injector:Injector,\n readonly $state:StateService,\n readonly keepTab:KeepTabService,\n readonly querySpace:IsolatedQuerySpace,\n readonly wpViewFilters:WorkPackageViewFiltersService,\n readonly deviceService:DeviceService,\n readonly CurrentProject:CurrentProjectService,\n readonly wpDisplayRepresentation:WorkPackageViewDisplayRepresentationService,\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef,\n private ngZone:NgZone,\n ) {\n super();\n }\n\n ngOnInit() {\n // Mark tableInformationLoaded when initially loading done\n this.setupInformationLoadedListener();\n\n this.querySpace.query.values$().pipe(\n this.untilDestroyed(),\n ).subscribe((query) => {\n // Update the visible representation\n this.updateViewRepresentation(query);\n this.noResults = query.results.total === 0;\n this.cdRef.detectChanges();\n });\n\n // Scroll into view the card/row that represents the last selected WorkPackage\n // so when the user opens a WP detail page on a split-view and then clicks on\n // the 'back button', the last selected card is visible on this list.\n // ngAfterViewInit doesn't find the .-checked elements on components\n // that inherit from this class (BcfListContainerComponent) so\n // opting for a timeout 'runOutsideAngular' to avoid running change\n // detection on the entire app\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n const selectedRow = this.elementRef.nativeElement.querySelector('.wp-table--row.-checked');\n const selectedCard = this.elementRef.nativeElement.querySelector('[data-qa-selector=\"op-wp-single-card\"].-checked');\n\n // The header of the table hides the scrolledIntoView element\n // so we scrollIntoView the previous element, if any\n if (selectedRow && selectedRow.previousSibling) {\n selectedRow.previousSibling.scrollIntoView({ block: 'start' });\n }\n\n if (selectedCard) {\n selectedCard.scrollIntoView({ block: 'start' });\n }\n }, 0);\n });\n }\n\n protected setupInformationLoadedListener() {\n this\n .querySpace\n .initialized\n .values$()\n .pipe(take(1))\n .subscribe(() => {\n this.tableInformationLoaded = true;\n this.cdRef.detectChanges();\n });\n }\n\n public showResizerInCardView():boolean {\n return false;\n }\n\n protected updateViewRepresentation(query:QueryResource) {\n this.showTableView = !(this.deviceService.isMobile\n || this.wpDisplayRepresentation.valueFromQuery(query) === wpDisplayCardRepresentation);\n }\n\n handleWorkPackageClicked(event:{ workPackageId:string; double:boolean }) {\n if (event.double) {\n this.openInFullView(event.workPackageId);\n }\n }\n\n openStateLink(event:{ workPackageId:string; requestedState:'show'|'split' }) {\n const params = {\n workPackageId: event.workPackageId,\n focus: true,\n };\n\n if (event.requestedState === 'split') {\n this.keepTab.goCurrentDetailsState(params);\n } else {\n this.keepTab.goCurrentShowState(params);\n }\n }\n\n /**\n * Special handling for clicking on cards.\n * If we are on mobile, a click on the card should directly open the full view\n */\n handleWorkPackageCardClicked(event:{ workPackageId:string; double:boolean }):void {\n if (this.deviceService.isMobile) {\n this.openInFullView(event.workPackageId);\n } else {\n this.handleWorkPackageClicked(event);\n }\n }\n\n private openInFullView(workPackageId:string) {\n this.$state.go(\n 'work-packages.show',\n { workPackageId },\n );\n }\n}\n","
    \n \n \n\n \n\n \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { Component, Input } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\n@Component({\n selector: 'wp-details-toolbar',\n templateUrl: './wp-details-toolbar.html',\n})\nexport class WorkPackageSplitViewToolbarComponent {\n @Input('workPackage') workPackage:WorkPackageResource;\n\n @Input() displayNotificationsButton:boolean;\n\n public text = {\n button_more: this.I18n.t('js.button_more'),\n };\n\n constructor(readonly I18n:I18nService,\n readonly halEditing:HalResourceEditingService) {}\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n Injector,\n OnInit,\n} from '@angular/core';\nimport { StateService } from '@uirouter/core';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { FirstRouteService } from 'core-app/core/routing/first-route-service';\nimport { KeepTabService } from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { WorkPackageSingleViewBase } from 'core-app/features/work-packages/routing/wp-view-base/work-package-single-view.base';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { BackRoutingService } from 'core-app/features/work-packages/components/back-routing/back-routing.service';\nimport { WpSingleViewService } from 'core-app/features/work-packages/routing/wp-view-base/state/wp-single-view.service';\n\n@Component({\n templateUrl: './wp-split-view.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'op-wp-split-view',\n providers: [\n WpSingleViewService,\n { provide: HalResourceNotificationService, useClass: WorkPackageNotificationService },\n ],\n})\nexport class WorkPackageSplitViewComponent extends WorkPackageSingleViewBase implements OnInit {\n /** Reference to the base route e.g., work-packages.partitioned.list or bim.partitioned.split */\n private baseRoute:string = this.$state.current.data.baseRoute;\n\n constructor(\n public injector:Injector,\n public states:States,\n public firstRoute:FirstRouteService,\n public keepTab:KeepTabService,\n public wpTableSelection:WorkPackageViewSelectionService,\n public wpTableFocus:WorkPackageViewFocusService,\n readonly $state:StateService,\n readonly backRouting:BackRoutingService,\n ) {\n super(injector, $state.params.workPackageId);\n }\n\n ngOnInit():void {\n this.observeWorkPackage();\n\n const wpId = this.$state.params.workPackageId;\n const focusedWP = this.wpTableFocus.focusedWorkPackage;\n\n if (!focusedWP) {\n // Focus on the work package if we're the first route\n const isFirstRoute = this.firstRoute.name === `${this.baseRoute}.details.overview`;\n const isSameID = this.firstRoute.params && wpId === this.firstRoute.params.workPackageI;\n this.wpTableFocus.updateFocus(wpId, (isFirstRoute && isSameID));\n } else {\n this.wpTableFocus.updateFocus(wpId, false);\n }\n\n if (this.wpTableSelection.isEmpty) {\n this.wpTableSelection.setRowState(wpId, true);\n }\n\n this.wpTableFocus.whenChanged()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((newId) => {\n const idSame = wpId.toString() === newId.toString();\n if (!idSame && this.$state.includes(`${this.baseRoute}.details`)) {\n this.$state.go(\n (this.$state.current.name as string),\n { workPackageId: newId, focus: false },\n );\n }\n });\n }\n\n get shouldFocus():boolean {\n return this.$state.params.focus === true;\n }\n\n showBackButton():boolean {\n return this.baseRoute.includes('bim');\n }\n\n backToList():void {\n this.backRouting.goToBaseState();\n }\n\n protected handleLoadingError(error:unknown):void {\n const message = this.notificationService.retrieveErrorMessage(error);\n\n // Go back to the base route, closing this split view\n void this.$state.go(\n this.baseRoute,\n { flash_message: { type: 'error', message } },\n );\n }\n}\n","import { EventEmitter, InjectionToken, Injector } from '@angular/core';\n\nexport interface WorkPackageViewEventHandler {\n /** Event name to register * */\n EVENT:string;\n\n /** Event context CSS selector */\n SELECTOR:string;\n\n /** Event callback handler */\n handleEvent(view:T, evt:JQuery.TriggeredEvent):void;\n\n /** Event scope method */\n eventScope(view:T):JQuery;\n}\n\nexport interface WorkPackageViewOutputs {\n // On selection updated\n selectionChanged:EventEmitter;\n // On row (double) clicked\n itemClicked:EventEmitter<{ workPackageId:string, double:boolean }>;\n // On work package link / details icon clicked\n stateLinkClicked:EventEmitter<{ workPackageId:string, requestedState:string }>;\n}\n\nexport const WorkPackageViewHandlerToken = new InjectionToken>('CardEventHandler');\n\n/**\n * Abstract view handler registry for globally handling arbitrary event on the\n * view container. Used e.g., for table to register single event callbacks for the entirety\n * of the table.\n */\nexport abstract class WorkPackageViewHandlerRegistry {\n constructor(public readonly injector:Injector) {\n }\n\n protected abstract eventHandlers:((view:T) => WorkPackageViewEventHandler)[];\n\n attachTo(viewRef:T) {\n this.eventHandlers.map((factory) => {\n const handler = factory(viewRef);\n const target = handler.eventScope(viewRef);\n\n target.on(handler.EVENT, handler.SELECTOR, (evt:JQuery.TriggeredEvent) => {\n handler.handleEvent(viewRef, evt);\n });\n\n return handler;\n });\n }\n}\n","import { Store, StoreConfig } from '@datorama/akita';\nimport { ApiV3ListFilter } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\n\nexport interface WpSingleViewState {\n notifications:{\n filters:ApiV3ListFilter[];\n }\n}\n\nexport function createInitialState():WpSingleViewState {\n return {\n notifications: {\n filters: [],\n },\n };\n}\n\n@StoreConfig({ name: 'wp-single-view' })\nexport class WpSingleViewStore extends Store {\n constructor() {\n super(createInitialState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport { WpSingleViewStore } from './wp-single-view.store';\nimport {\n filter,\n map,\n switchMap,\n take,\n} from 'rxjs/operators';\nimport { InAppNotificationsResourceService } from 'core-app/core/state/in-app-notifications/in-app-notifications.service';\nimport {\n ApiV3ListFilter,\n ApiV3ListParameters,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport {\n centerUpdatedInPlace,\n markNotificationsAsRead,\n notificationsMarkedRead,\n} from 'core-app/core/state/in-app-notifications/in-app-notifications.actions';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport {\n EffectCallback,\n EffectHandler,\n} from 'core-app/core/state/effects/effect-handler.decorator';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { collectionKey } from 'core-app/core/state/collection-store';\nimport { Query } from '@datorama/akita';\n\n@EffectHandler\n@Injectable()\nexport class WpSingleViewService {\n id = 'WorkPackage Activity Store';\n\n protected store = new WpSingleViewStore();\n\n protected query = new Query(this.store);\n\n selectNotifications$ = this\n .query\n .select((state) => state.notifications.filters)\n .pipe(\n filter((filters) => filters.length > 0),\n switchMap((filters) => this.resourceService.collection(collectionKey({ filters }))),\n );\n\n selectNotificationsCount$ = this\n .selectNotifications$\n .pipe(\n map((notifications) => notifications.length),\n );\n\n nonDateAlertNotificationsCount$ = this\n .selectNotifications$\n .pipe(\n map((notifications) => notifications.filter((notification) => notification.reason !== 'dateAlert')),\n map((notifications) => notifications.length),\n );\n\n hasNotifications$ = this\n .selectNotificationsCount$\n .pipe(\n map((count) => count > 0),\n );\n\n get params():ApiV3ListParameters {\n return { filters: this.query.getValue().notifications.filters };\n }\n\n constructor(\n readonly actions$:ActionsService,\n readonly currentUser$:CurrentUserService,\n private resourceService:InAppNotificationsResourceService,\n ) {\n }\n\n setFilters(workPackageId:string):void {\n const filters:ApiV3ListFilter[] = [\n ['readIAN', '=', false],\n ['resourceId', '=', [workPackageId]],\n ['resourceType', '=', ['WorkPackage']],\n ];\n\n this.store.update(({ notifications }) => (\n {\n notifications: {\n ...notifications,\n filters,\n },\n }\n ));\n\n this.reload();\n }\n\n markAllAsRead():void {\n const key = collectionKey({ filters: this.store.getValue().notifications.filters });\n this\n .resourceService\n .collection(key)\n .pipe(\n take(1),\n )\n .subscribe((collection) => {\n this.actions$.dispatch(\n markNotificationsAsRead({ origin: this.id, notifications: collection.map((el) => el.id) }),\n );\n });\n }\n\n private reload() {\n this\n .currentUser$\n .isLoggedIn$\n .pipe(\n take(1),\n filter((loggedIn) => loggedIn),\n switchMap(() => this.resourceService.fetchCollection(this.params)),\n )\n .subscribe();\n }\n\n /**\n * Reload after notifications were successfully marked as read\n */\n @EffectCallback(notificationsMarkedRead)\n private reloadOnNotificationRead() {\n this.reload();\n }\n\n /**\n * Reload after notifications were successfully marked as read\n */\n @EffectCallback(centerUpdatedInPlace)\n private reloadOnCenterUpdate() {\n this.reload();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable } from '@angular/core';\nimport { RelationsStateValue, WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { WorkPackageViewHierarchiesService } from './wp-view-hierarchy.service';\nimport { WorkPackageViewColumnsService } from './wp-view-columns.service';\n\n@Injectable()\nexport class WorkPackageViewAdditionalElementsService {\n constructor(readonly querySpace:IsolatedQuerySpace,\n readonly wpTableHierarchies:WorkPackageViewHierarchiesService,\n readonly wpTableColumns:WorkPackageViewColumnsService,\n readonly notificationService:WorkPackageNotificationService,\n readonly halResourceService:HalResourceService,\n readonly apiV3Service:ApiV3Service,\n readonly schemaCache:SchemaCacheService,\n readonly wpRelations:WorkPackageRelationsService) {\n }\n\n public initialize(query:QueryResource, results:WorkPackageCollectionResource):void {\n const rows = results.elements;\n\n // Add relations to the stack\n Promise.all([\n this.requireInvolvedRelations(rows.map((el) => el.id!)),\n this.requireHierarchyElements(rows),\n this.requireSumsSchema(results),\n ]).then((results:string[][]) => {\n this.loadAdditional(_.flatten(results));\n });\n }\n\n private loadAdditional(wpIds:string[]) {\n this\n .apiV3Service\n .work_packages\n .requireAll(wpIds)\n .then(() => {\n this.querySpace.additionalRequiredWorkPackages.putValue(null, 'All required work packages are loaded');\n })\n .catch((e) => {\n this.querySpace.additionalRequiredWorkPackages.putValue(null, 'Failure loading required work packages');\n this.notificationService.handleRawError(e);\n });\n }\n\n /**\n * Requires both the relation resource of the given work package ids as well\n * as the `to` work packages returned from the relations\n */\n private requireInvolvedRelations(rows:string[]):Promise {\n if (!this.wpTableColumns.hasRelationColumns()) {\n return Promise.resolve([]);\n }\n return this.wpRelations\n .requireAll(rows)\n .then(() => {\n const ids = this.getInvolvedWorkPackages(rows.map((id) => this.wpRelations.state(id).value!));\n return _.flatten(ids);\n });\n }\n\n /**\n * Return the id of all ancestors for visible rows in the table.\n * @param rows\n * @return {string[]}\n */\n private requireHierarchyElements(rows:WorkPackageResource[]):Promise {\n if (!this.wpTableHierarchies.isEnabled) {\n return Promise.resolve([]);\n }\n\n const ids = _.flatten(rows.map((el) => el.ancestorIds));\n return Promise.resolve(ids);\n }\n\n /**\n * From a set of relations state values, return all involved IDs.\n * @param states\n * @return {string[]}\n */\n private getInvolvedWorkPackages(states:RelationsStateValue[]) {\n const ids:string[] = [];\n _.each(states, (relations:RelationsStateValue) => {\n _.each(relations, (resource:RelationResource) => {\n ids.push(resource.ids.from, resource.ids.to);\n });\n });\n\n return ids;\n }\n\n private requireSumsSchema(results:WorkPackageCollectionResource):Promise {\n if (results.sumsSchema) {\n return this\n .schemaCache\n .ensureLoaded(results.sumsSchema.href!)\n .then(() => []);\n }\n\n return Promise.resolve([]);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport {\n combine, deriveRaw, input, State,\n} from 'reactivestates';\nimport { map, mapTo, take } from 'rxjs/operators';\nimport { merge, Observable } from 'rxjs';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { Injectable } from '@angular/core';\nimport { QuerySchemaResource } from 'core-app/features/hal/resources/query-schema-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\n\n@Injectable()\nexport abstract class WorkPackageViewBaseService {\n /** Internal state to push non-persisted updates */\n protected updatesState = input();\n\n /** Internal pristine state filled during +initialize+ only */\n protected pristineState = input();\n\n constructor(\n protected readonly querySpace:IsolatedQuerySpace,\n ) { }\n\n /**\n * Get the state value from the current query.\n *\n * @param {QueryResource} query\n * @returns {T} Instance of the state value for this type.\n */\n public abstract valueFromQuery(query:QueryResource, results:WorkPackageCollectionResource):T|undefined;\n\n /**\n * Initialize this table state from the given query resource,\n * and possibly the associated schema.\n *\n * @param {QueryResource} querywp-view-group-by.service\n * @param {QuerySchemaResource} schema\n */\n public initialize(query:QueryResource, results:WorkPackageCollectionResource, schema?:QuerySchemaResource) {\n const initial = this.valueFromQuery(query, results)!;\n this.pristineState.putValue(initial);\n }\n\n public update(value:T) {\n this.updatesState.putValue(value);\n }\n\n public clear(reason:string) {\n this.pristineState.clear(reason);\n this.updatesState.clear(reason);\n }\n\n /**\n * Get the combined pristine and update value changes\n * @param unsubscribe\n */\n public live$():Observable {\n return merge(\n this.pristineState.values$(),\n this.updatesState.values$(),\n );\n }\n\n /**\n * Get pristine upstream changes\n *\n * @param unsubscribe\n */\n public pristine$():Observable {\n return this\n .pristineState\n .values$();\n }\n\n /**\n * Get only the local update changes\n *\n * @param unsubscribe\n */\n public updates$():Observable {\n return this\n .updatesState\n .values$();\n }\n\n /**\n * Get only the local update changes\n *\n * @param unsubscribe\n */\n public changes$():Observable {\n return this\n .updatesState\n .changes$();\n }\n\n public onReady() {\n return this\n .pristineState\n .values$()\n .pipe(\n take(1),\n mapTo(null),\n )\n .toPromise();\n }\n\n /** Get the last updated value from either pristine or update state */\n protected get lastUpdatedState():State {\n const combinedRaw = combine(this.pristineState, this.updatesState);\n\n return deriveRaw(combinedRaw,\n ($) => $\n .pipe(\n map(([pristine, current]) => {\n if (current === undefined) {\n return pristine;\n }\n return current;\n }),\n ));\n }\n\n /**\n * Helper to set the value of the current state\n * @param val\n */\n protected set current(val:T|undefined) {\n if (val) {\n this.updatesState.putValue(val);\n } else {\n this.updatesState.clear();\n }\n }\n\n /**\n * Get the value of the current state, if any.\n */\n protected get current():T|undefined {\n return this.lastUpdatedState.value;\n }\n}\n\n@Injectable()\nexport abstract class WorkPackageQueryStateService extends WorkPackageViewBaseService {\n /**\n * Check whether the state value does not match the query resource's value.\n * @param query The current query resource\n */\n abstract hasChanged(query:QueryResource):boolean;\n\n /**\n * Apply the current state value to query\n *\n * @return Whether the query should be visibly updated.\n */\n abstract applyToQuery(query:QueryResource):boolean;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { Injectable } from '@angular/core';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { take } from 'rxjs/operators';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { QuerySchemaResource } from 'core-app/features/hal/resources/query-schema-resource';\nimport { GroupObject, WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { QueryGroupByResource } from 'core-app/features/hal/resources/query-group-by-resource';\nimport { WorkPackageViewBaseService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewCollapsedGroupsService extends WorkPackageViewBaseService {\n readonly wpTypesToShowInCollapsedGroupHeaders:((wp:WorkPackageResource) => boolean)[];\n\n readonly groupTypesWithHeaderCellsWhenCollapsed = ['project'];\n\n get config():IGroupsCollapseEvent {\n return this.updatesState.getValueOr(this.getDefaultState());\n }\n\n get currentGroups():GroupObject[] {\n return this.querySpace.groups.value!;\n }\n\n get allGroupsAreCollapsed():boolean {\n return this.config.allGroupsAreCollapsed;\n }\n\n get allGroupsAreExpanded():boolean {\n return this.config.allGroupsAreExpanded;\n }\n\n get currentGroupedBy():QueryGroupByResource|null {\n return this.workPackageViewGroupByService.current;\n }\n\n constructor(\n protected readonly querySpace:IsolatedQuerySpace,\n readonly workPackageViewGroupByService:WorkPackageViewGroupByService,\n private schemaCacheService:SchemaCacheService,\n ) {\n super(querySpace);\n this.wpTypesToShowInCollapsedGroupHeaders = [this.isMilestone];\n }\n\n // Every time the groupedBy changes, this services is initialized\n private getDefaultState():IGroupsCollapseEvent {\n return {\n state: this.querySpace.collapsedGroups.value || {},\n allGroupsChanged: false,\n lastChangedGroup: null,\n groupedBy: this.currentGroupedBy?.id || null,\n ...this.getAllGroupsCollapsedState(this.currentGroups, this.querySpace.collapsedGroups.value!),\n };\n }\n\n isMilestone = (workPackage:WorkPackageResource):boolean => this.schemaCacheService.of(workPackage)?.isMilestone;\n\n toggleGroupCollapseState(groupIdentifier:string):void {\n const newCollapsedState = !this.config.state[groupIdentifier];\n const state = {\n ...this.config.state,\n [groupIdentifier]: newCollapsedState,\n };\n const newState = {\n ...this.config,\n state,\n lastChangedGroup: groupIdentifier,\n ...this.getAllGroupsCollapsedState(this.currentGroups, state),\n };\n\n this.update(newState);\n }\n\n setAllGroupsCollapseStateTo(collapsedState:boolean):void {\n const groupUpdatedState = this.currentGroups.reduce((updatedState:{ [key:string]:boolean }, group) => ({\n ...updatedState,\n [group.identifier]: collapsedState,\n }), {});\n const newState = {\n ...this.config,\n state: {\n ...this.config.state,\n ...groupUpdatedState,\n },\n lastChangedGroup: null,\n allGroupsAreCollapsed: collapsedState,\n allGroupsAreExpanded: !collapsedState,\n allGroupsChanged: true,\n };\n\n this.update(newState);\n }\n\n getAllGroupsCollapsedState(groups:GroupObject[], currentCollapsedGroupsState:IGroupsCollapseEvent['state']) {\n let allGroupsAreCollapsed = false;\n let allGroupsAreExpanded = true;\n\n if (currentCollapsedGroupsState && groups?.length) {\n const firstGroupIdentifier = groups[0].identifier;\n const firstGroupCollapsedState = currentCollapsedGroupsState[firstGroupIdentifier];\n const allGroupsHaveTheSameCollapseState = groups.every((group) => currentCollapsedGroupsState[group.identifier] != null\n && currentCollapsedGroupsState[group.identifier] === currentCollapsedGroupsState[firstGroupIdentifier]);\n\n allGroupsAreCollapsed = allGroupsHaveTheSameCollapseState && firstGroupCollapsedState;\n allGroupsAreExpanded = allGroupsHaveTheSameCollapseState && !firstGroupCollapsedState;\n }\n\n return { allGroupsAreCollapsed, allGroupsAreExpanded };\n }\n\n initialize(query:QueryResource, results:WorkPackageCollectionResource, schema?:QuerySchemaResource) {\n // When this service is initialized (first time the table is loaded and very time the groupBy changes),\n // we need to wait until the table is ready to emit the collapseStatus. Otherwise the groups are not\n // ready in the DOM and can't be collapsed/expanded.\n this.querySpace.tableRendered.values$().pipe(take(1)).subscribe(() => this.update({ ...this.config, allGroupsChanged: true }));\n }\n\n valueFromQuery(query:QueryResource, results:WorkPackageCollectionResource) {\n return this.getDefaultState();\n }\n\n applyToQuery(query:QueryResource) {\n\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { States } from 'core-app/core/states/states.service';\nimport { Injectable } from '@angular/core';\nimport { QueryColumn, queryColumnTypes } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { combine } from 'reactivestates';\nimport { mapTo, take } from 'rxjs/operators';\nimport { cloneHalResourceCollection } from 'core-app/features/hal/helpers/hal-resource-builder';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewColumnsService extends WorkPackageQueryStateService {\n public constructor(readonly states:States, readonly querySpace:IsolatedQuerySpace) {\n super(querySpace);\n }\n\n public initialize(query:any, results:any, schema?:any) {\n super.initialize(query, results, schema);\n }\n\n public valueFromQuery(query:QueryResource):QueryColumn[] {\n return [...query.columns];\n }\n\n public hasChanged(query:QueryResource) {\n return !this.isCurrentlyEqualTo(query.columns);\n }\n\n public isCurrentlyEqualTo(a:QueryColumn[]) {\n const comparer = (columns:QueryColumn[]) => columns.map((c) => c.href);\n\n return _.isEqual(\n comparer(a),\n comparer(this.getColumns()),\n );\n }\n\n public applyToQuery(query:QueryResource) {\n const toApply = this.getColumns();\n\n const oldColumns = query.columns.map((el) => el.id);\n const newColumns = toApply.map((el) => el.id);\n query.columns = cloneHalResourceCollection(toApply);\n\n // We can avoid reloading even with relation columns if we only removed columns\n const onlyRemoved = _.difference(newColumns, oldColumns).length === 0;\n\n // Reload the table visibly if adding relation columns.\n return !onlyRemoved && this.hasRelationColumns();\n }\n\n /**\n * Returns whether the current set of columns include relations\n */\n public hasRelationColumns() {\n const relationColumns = [queryColumnTypes.RELATION_OF_TYPE, queryColumnTypes.RELATION_TO_TYPE];\n return !!_.find(this.getColumns(), (c) => relationColumns.indexOf(c._type) >= 0);\n }\n\n /**\n * Retrieve the QueryColumn objects for the selected columns.\n * Returns a shallow copy with the original column objects.\n */\n public getColumns():QueryColumn[] {\n return [...this.current];\n }\n\n /**\n * Return the index of the given column or -1 if it is not contained.\n */\n public index(id:string):number {\n return _.findIndex(this.getColumns(), (column) => column.id === id);\n }\n\n /**\n * Return the column object for the given id.\n * @param id\n */\n public findById(id:string):QueryColumn|undefined {\n return _.find(this.getColumns(), (column) => column.id === id);\n }\n\n /**\n * Return the previous column of the given column name\n * @param column\n */\n public previous(column:QueryColumn):QueryColumn|null {\n const index = this.index(column.id);\n\n if (index <= 0) {\n return null;\n }\n\n return this.getColumns()[index - 1];\n }\n\n /**\n * Return the next column of the given column name\n * @param column\n */\n public next(column:QueryColumn):QueryColumn|null {\n const index = this.index(column.id);\n\n if (index === -1 || this.isLast(column)) {\n return null;\n }\n\n return this.getColumns()[index + 1];\n }\n\n /**\n * Returns true if the column is the first selected\n */\n public isFirst(column:QueryColumn):boolean {\n return this.index(column.id) === 0;\n }\n\n /**\n * Returns true if the column is the last selected\n */\n public isLast(column:QueryColumn):boolean {\n return this.index(column.id) === this.columnCount - 1;\n }\n\n /**\n * Update the selected columns to a new set of columns.\n */\n public setColumns(columns:QueryColumn[]) {\n // Don't publish if this is the same content\n if (this.isCurrentlyEqualTo(columns)) {\n return;\n }\n\n this.update(columns);\n }\n\n public setColumnsById(columnIds:string[]) {\n const mapped = columnIds.map((id) => _.find(this.all, (c) => c.id === id));\n this.setColumns(_.compact(mapped));\n }\n\n /**\n * Move the column at index {fromIndex} to {toIndex}.\n * - If toIndex is larger than all columns, insert at the end.\n * - If toIndex is less than zero, insert at the start.\n */\n public moveColumn(fromIndex:number, toIndex:number) {\n const columns = this.getColumns();\n\n if (toIndex >= columns.length) {\n toIndex = columns.length - 1;\n }\n\n if (toIndex < 0) {\n toIndex = 0;\n }\n\n const element = columns[fromIndex];\n columns.splice(fromIndex, 1);\n columns.splice(toIndex, 0, element);\n\n this.setColumns(columns);\n }\n\n /**\n * Shift the given column name X indices,\n * where X is the offset in indices (-1 = shift one to left)\n */\n public shift(column:QueryColumn, offset:number) {\n const index = this.index(column.id);\n if (index === -1) {\n return;\n }\n\n this.moveColumn(index, index + offset);\n }\n\n /**\n * Add a new column to the selection at the given position\n */\n public addColumn(id:string, position?:number) {\n const columns = this.getColumns();\n\n if (position === undefined) {\n position = columns.length;\n }\n\n if (this.index(id) === -1) {\n const newColumn = _.find(this.all, (column) => column.id === id);\n\n if (!newColumn) {\n throw new Error('Column with provided name is not found');\n }\n\n columns.splice(position, 0, newColumn);\n this.setColumns(columns);\n }\n }\n\n /**\n * Remove a column from the active list\n */\n public removeColumn(column:QueryColumn) {\n const index = this.index(column.id);\n\n if (index !== -1) {\n const columns = this.getColumns();\n columns.splice(index, 1);\n this.setColumns(columns);\n }\n }\n\n // only exists to cast the state\n protected get current() {\n return this.lastUpdatedState.getValueOr([]);\n }\n\n // Get the available state\n protected get availableState() {\n return this.querySpace.available.columns;\n }\n\n /**\n * Return the number of selected rows.\n */\n public get columnCount():number {\n return this.getColumns().length;\n }\n\n /**\n * Get all available columns (regardless of whether they are selected already)\n */\n public get all():QueryColumn[] {\n return this.availableState.getValueOr([]);\n }\n\n public get allPropertyColumns():QueryColumn[] {\n return this\n .all\n .filter((column:QueryColumn) => column._type === queryColumnTypes.PROPERTY);\n }\n\n /**\n * Get columns not yet selected\n */\n public get unused():QueryColumn[] {\n return _.differenceBy(this.all, this.getColumns(), '$href');\n }\n\n /**\n * Columns service depends on two states\n */\n public onReady() {\n return combine(this.pristineState, this.availableState)\n .values$()\n .pipe(\n take(1),\n mapTo(null),\n )\n .toPromise();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable } from '@angular/core';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\nexport const wpDisplayListRepresentation = 'list';\nexport const wpDisplayCardRepresentation = 'card';\nexport type WorkPackageDisplayRepresentationValue = 'list'|'card';\n\n@Injectable()\nexport class WorkPackageViewDisplayRepresentationService extends WorkPackageQueryStateService {\n public constructor(\n readonly states:States,\n readonly querySpace:IsolatedQuerySpace,\n ) {\n super(querySpace);\n }\n\n public hasChanged(query:QueryResource) {\n return this.current !== query.displayRepresentation;\n }\n\n valueFromQuery(query:QueryResource) {\n return query.displayRepresentation || null;\n }\n\n public applyToQuery(query:QueryResource) {\n const { current } = this;\n query.displayRepresentation = current === null ? undefined : current;\n\n return false;\n }\n\n public get current():string|null {\n return this.lastUpdatedState.getValueOr(null);\n }\n\n public get isList():boolean {\n const { current } = this;\n return !current || current === wpDisplayListRepresentation;\n }\n\n public get isCards():boolean {\n return this.current === wpDisplayCardRepresentation;\n }\n\n public setDisplayRepresentation(representation:WorkPackageDisplayRepresentationValue) {\n this.update(representation);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { combine, input, InputState } from 'reactivestates';\nimport { States } from 'core-app/core/states/states.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { mapTo, take } from 'rxjs/operators';\nimport { QuerySchemaResource } from 'core-app/features/hal/resources/query-schema-resource';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { cloneHalResourceCollection } from 'core-app/features/hal/helpers/hal-resource-builder';\nimport { QueryFilterInstanceSchemaResource } from 'core-app/features/hal/resources/query-filter-instance-schema-resource';\nimport { QueryFilterResource } from 'core-app/features/hal/resources/query-filter-resource';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewFiltersService extends WorkPackageQueryStateService {\n public hidden:string[] = [\n 'datesInterval',\n 'precedes',\n 'follows',\n 'relates',\n 'duplicates',\n 'duplicated',\n 'blocks',\n 'blocked',\n 'partof',\n 'includes',\n 'requires',\n 'required',\n 'search',\n // The filter should be named subjectOrId but for some reason\n // it is only named subjectOr\n 'subjectOrId',\n 'subjectOr',\n 'manualSort',\n 'typeahead',\n ];\n\n /** Flag state to determine whether the filters are incomplete */\n private incomplete = input(false);\n\n constructor(\n protected readonly states:States,\n readonly querySpace:IsolatedQuerySpace,\n ) {\n super(querySpace);\n }\n\n /**\n * Load all schemas for the current filters and fill respective states\n * @param query\n * @param schema\n */\n public initializeFilters(query:QueryResource, schema:QuerySchemaResource) {\n const filters = cloneHalResourceCollection(query.filters);\n\n this.availableState.putValue(schema.filtersSchemas.elements);\n this.pristineState.putValue(filters);\n }\n\n /**\n * Return whether the filters are empty\n */\n public get isEmpty() {\n const { value } = this.lastUpdatedState;\n return !value || value.length === 0;\n }\n\n public get availableState():InputState {\n return this.querySpace.available.filters;\n }\n\n /** Return whether the filters the user is working on are incomplete */\n public get incomplete$() {\n return this.incomplete.values$();\n }\n\n /**\n * Add a filter instantiation from the set of available filter schemas\n *\n * @param filter\n */\n public add(filter:QueryFilterInstanceResource) {\n this.updatesState.putValue([...this.rawFilters, filter]);\n }\n\n /**\n * Replace a filter, or add a new one\n */\n public replace(id:string, modifier:(filter:QueryFilterInstanceResource) => void):void {\n const filter:QueryFilterInstanceResource = this.instantiate(id);\n\n const newFilters = [...this.rawFilters];\n modifier(filter);\n\n const index = this.findIndex(id);\n if (index === -1) {\n newFilters.push(filter);\n } else {\n newFilters.splice(index, 1, filter);\n }\n\n this.update(newFilters);\n }\n\n /**\n * Modify a live filter and push it to the state.\n * Avoids copying the resource.\n *\n * Returns whether the filter was found and modified\n */\n public modify(id:string, modifier:(filter:QueryFilterInstanceResource) => void):boolean {\n const index = this.findIndex(id);\n\n if (index === -1) {\n return false;\n }\n\n const filters = [...this.rawFilters];\n modifier(filters[index]!);\n this.update(filters);\n\n return true;\n }\n\n /**\n * Get an instantiated filter without adding it to the current state\n * @param filterOrId The query filter or id to instantiate\n */\n public instantiate(filterOrId:QueryFilterResource|string):QueryFilterInstanceResource {\n const id = (filterOrId instanceof QueryFilterResource) ? filterOrId.id : filterOrId;\n\n const schema = _.find(\n this.availableSchemas,\n (schema) => (schema.filter.allowedValues as HalResource)[0].id === id,\n )!;\n\n return schema.getFilter();\n }\n\n /**\n * Remove one or more filters from the live state of filters.\n * @param filters Filters to be removed\n */\n public remove(...filters:(QueryFilterInstanceResource|string)[]) {\n const mapper = (f:QueryFilterInstanceResource|string) => ((f instanceof QueryFilterInstanceResource) ? f.id : f);\n const set = new Set(filters.map(mapper));\n\n this.update(\n this.rawFilters.filter((f) => !set.has(mapper(f))),\n );\n }\n\n /**\n * Return the remaining visible filters from the given filters set.\n * @param filters Array of active filters, defaults to the current live state.\n */\n public remainingVisibleFilters(filters = this.current) {\n return this\n .remainingFilters(filters)\n .filter((filter) => this.hidden.indexOf(filter.id) === -1);\n }\n\n /**\n * Return all available filter resources.\n * They need to be instantiated before using them in this service.\n */\n public get availableFilters():QueryFilterResource[] {\n return this.availableSchemas.map((schema) => schema.allowedFilterValue);\n }\n\n private get availableSchemas():QueryFilterInstanceSchemaResource[] {\n return this.availableState.getValueOr([]);\n }\n\n /**\n * Determine whether all given filters are completely defined.\n * @param filters\n */\n public isComplete(filters:QueryFilterInstanceResource[]):boolean {\n return _.every(filters, (filter) => filter.isCompletelyDefined());\n }\n\n /**\n * Compare the current set of filters to the given query.\n * @param query\n */\n public hasChanged(query:QueryResource) {\n const comparer = (filter:HalResource[]) => filter.map((el) => el.$source);\n\n return !_.isEqual(\n comparer(query.filters),\n comparer(this.rawFilters),\n );\n }\n\n public valueFromQuery(query:QueryResource) {\n return undefined;\n }\n\n update(value:QueryFilterInstanceResource[]) {\n super.update(value);\n this.incomplete.putValue(false);\n }\n\n /**\n * Returns the live filter instance for the given ID, or undefined\n * if it does not exist.\n *\n * @param id Identifier of the filter\n */\n public find(id:string):QueryFilterInstanceResource|undefined {\n const index = this.findIndex(id);\n\n if (index === -1) {\n return;\n }\n\n return this.rawFilters[index];\n }\n\n /**\n * Returns the index of the filter, or -1 if it does not exist\n * @param id Identifier of the filter\n */\n public findIndex(id:string):number {\n return _.findIndex(this.current, (f) => f.id === id);\n }\n\n public applyToQuery(query:QueryResource):boolean {\n query.filters = this.cloneFilters();\n return true;\n }\n\n /**\n * Returns a shallow copy of the current filters.\n * Modifications to filters themselves will still\n */\n public get current():QueryFilterInstanceResource[] {\n return [...this.rawFilters];\n }\n\n /**\n * Returns a deep clone of the current filters set, may be used\n * to modify the filters without altering this state.\n */\n public cloneFilters():QueryFilterInstanceResource[] {\n return cloneHalResourceCollection(this.rawFilters);\n }\n\n /**\n * Returns the live state array, used for inspection of the filters\n * without modification.\n */\n protected get rawFilters():QueryFilterInstanceResource[] {\n return this.lastUpdatedState.value || [];\n }\n\n public get currentlyVisibleFilters():QueryFilterInstanceResource[] {\n const invisibleFilters = new Set(this.hidden);\n invisibleFilters.delete('search');\n\n return _.reject(this.current, (filter) => invisibleFilters.has(filter.id));\n }\n\n /**\n * Replace this filter state, but only if the given filters are complete\n * @param newState\n */\n public replaceIfComplete(newState:QueryFilterInstanceResource[]):void {\n if (this.isComplete(newState)) {\n this.update(newState);\n } else {\n this.incomplete.putValue(true);\n }\n }\n\n /**\n * Filters service depends on two states\n */\n public onReady():Promise {\n return combine(this.pristineState, this.availableState)\n .values$()\n .pipe(\n take(1),\n mapTo(null),\n )\n .toPromise();\n }\n\n /**\n * Get all filters that are not in the current active set\n */\n private remainingFilters(filters = this.rawFilters) {\n return _.differenceBy(this.availableFilters, filters, (filter) => filter.id);\n }\n\n isAvailable(el:QueryFilterInstanceResource):boolean {\n return !!this.availableFilters.find((available) => available.id === el.id);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Observable } from 'rxjs';\nimport { distinctUntilChanged, map } from 'rxjs/operators';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { WorkPackageViewBaseService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-base.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\n\nexport interface WPFocusState {\n workPackageId:string;\n focusAfterRender:boolean;\n}\n\n@Injectable()\nexport class WorkPackageViewFocusService extends WorkPackageViewBaseService {\n constructor(public querySpace:IsolatedQuerySpace,\n public wpTableSelection:WorkPackageViewSelectionService) {\n super(querySpace);\n }\n\n public isFocused(workPackageId:string) {\n return this.focusedWorkPackage === workPackageId;\n }\n\n public ifShouldFocus(callback:(workPackageId:string) => void) {\n const value = this.current;\n\n if (value && value.focusAfterRender) {\n callback(value.workPackageId);\n value.focusAfterRender = false;\n this.update(value);\n }\n }\n\n public get focusedWorkPackage():string|null {\n const value = this.current;\n\n if (value) {\n return value.workPackageId;\n }\n\n // Return the first result if none selected\n const results = this.querySpace.results.value;\n if (results && results.elements.length > 0) {\n return results.elements[0].id!.toString();\n }\n\n return null;\n }\n\n public whenChanged():Observable {\n return this.live$()\n .pipe(\n map((val:WPFocusState) => val.workPackageId),\n distinctUntilChanged(),\n );\n }\n\n public updateFocus(workPackageId:string, setFocusAfterRender = false) {\n // Set the selection to this row, if nothing else is selected.\n if (this.wpTableSelection.isEmpty) {\n this.wpTableSelection.setRowState(workPackageId, true);\n }\n this.update({ workPackageId, focusAfterRender: setFocusAfterRender });\n }\n\n valueFromQuery(query:QueryResource, results:WorkPackageCollectionResource):WPFocusState|undefined {\n return undefined;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable } from '@angular/core';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { QueryGroupByResource } from 'core-app/features/hal/resources/query-group-by-resource';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewGroupByService extends WorkPackageQueryStateService {\n public constructor(readonly states:States,\n readonly querySpace:IsolatedQuerySpace) {\n super(querySpace);\n }\n\n valueFromQuery(query:QueryResource) {\n return query.groupBy || null;\n }\n\n public hasChanged(query:QueryResource) {\n const comparer = (groupBy:QueryColumn|HalResource|null|undefined) => (groupBy ? groupBy.href : null);\n\n return !_.isEqual(\n comparer(query.groupBy),\n comparer(this.current),\n );\n }\n\n public applyToQuery(query:QueryResource) {\n const { current } = this;\n query.groupBy = current === null ? undefined : current;\n return true;\n }\n\n public isGroupable(column:QueryColumn):boolean {\n return !!_.find(this.available, (candidate) => candidate.id === column.id);\n }\n\n public disable() {\n this.update(null);\n }\n\n public setBy(column:QueryColumn) {\n const groupBy = _.find(this.available, (candidate) => candidate.id === column.id);\n\n if (groupBy) {\n this.update(groupBy);\n }\n }\n\n public get current():QueryGroupByResource|null {\n return this.lastUpdatedState.getValueOr(null);\n }\n\n protected get availableState() {\n return this.querySpace.available.groupBy;\n }\n\n public get isEnabled():boolean {\n return !!this.current;\n }\n\n public get available():QueryGroupByResource[] {\n return this.availableState.getValueOr([]);\n }\n\n public isCurrentlyGroupedBy(column:QueryColumn):boolean {\n const cur = this.current;\n return !!(cur && cur.id === column.id);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageRelationsHierarchyService } from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewDisplayRepresentationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Injectable()\nexport class WorkPackageViewHierarchyIdentationService {\n constructor(private wpViewHierarchies:WorkPackageViewHierarchiesService,\n private wpDisplayRepresentation:WorkPackageViewDisplayRepresentationService,\n private states:States,\n private wpRelationHierarchy:WorkPackageRelationsHierarchyService,\n private apiV3Service:ApiV3Service,\n private querySpace:IsolatedQuerySpace) {\n }\n\n /**\n * Return whether the current hierarchy mode is active\n */\n public get applicable():boolean {\n return this.wpViewHierarchies.isEnabled && this.wpDisplayRepresentation.isList;\n }\n\n /**\n * Returns whether the given work package can be indented in the current render order\n * @param workPackage\n */\n public canIndent(workPackage:WorkPackageResource):boolean {\n if (!workPackage.changeParent || !this.applicable) {\n return false;\n }\n\n const rendered = this.renderedWorkPackageIds;\n const index = rendered.indexOf(workPackage.id!);\n\n // We can never indent the first item\n if (index === 0) {\n return false;\n }\n\n // We can not indent work packages whose predecessors are already their ancestors\n const ancestors = workPackage.ancestorIds;\n const ancestorCount = ancestors.length;\n\n // We can always indent if the ancestor count is 0\n if (ancestorCount === 0) {\n return true;\n }\n\n // Otherwise, we can only indent if the predecessor is NOT the last ancestor\n const lastAncestor:string = ancestors[ancestorCount - 1];\n const predecessorId:string = rendered[index - 1];\n\n return predecessorId !== lastAncestor;\n }\n\n /**\n * Returns whether the given work package can be outdented\n * @param workPackage\n */\n public canOutdent(workPackage:WorkPackageResource):boolean {\n if (!workPackage.changeParent || !this.applicable) {\n return false;\n }\n\n // We can always outdent if the work package has a parent\n return !!workPackage.parent;\n }\n\n /**\n * Try to indent the work package.\n * @return a Promise with the change parent result\n */\n public async indent(workPackage:WorkPackageResource):Promise {\n if (!this.canIndent(workPackage)) {\n return Promise.reject();\n }\n\n const rendered = this.renderedWorkPackageIds;\n const index = rendered.indexOf(workPackage.id!);\n const predecessorId:string = rendered[index - 1];\n\n // By default, assume we're going to insert under parent\n let newParentId = predecessorId;\n\n // If the predecessor is in an ancestor chain.\n // get the first element of the ancestor chain that workPackage is not in\n const predecessor = await this.apiV3Service.work_packages.id(predecessorId).get().toPromise();\n\n const difference = _.difference(predecessor.ancestorIds, workPackage.ancestorIds);\n if (difference && difference.length > 0) {\n newParentId = difference[0];\n }\n\n return this\n .wpRelationHierarchy\n .changeParent(workPackage, newParentId);\n }\n\n /**\n * Try to outdent the work package.\n * @return a Promise with the change parent result\n */\n public outdent(workPackage:WorkPackageResource):Promise {\n if (!this.canOutdent(workPackage)) {\n return Promise.reject();\n }\n\n let newParentId:string|null = null;\n\n // If we have more than one ancestor,\n // just drop the last one\n const { ancestorIds } = workPackage;\n const ancestorCount = ancestorIds.length;\n if (ancestorCount > 1) {\n newParentId = ancestorIds[ancestorCount - 2];\n }\n\n return this\n .wpRelationHierarchy\n .changeParent(workPackage, newParentId);\n }\n\n /**\n * Get the currently rendered work packages\n */\n private get renderedWorkPackageIds():string[] {\n return this.querySpace.renderedWorkPackageIds.getValueOr([]);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport class WorkPackageViewHierarchies {\n public isVisible = false;\n\n public last:string|null = null;\n\n public collapsed:{ [workPackageId:string]:boolean } = {};\n\n constructor(visible:boolean) {\n this.isVisible = visible;\n }\n}\n","import { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { Injectable } from '@angular/core';\nimport { WorkPackageViewHierarchies } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-hierarchies';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewHierarchiesService extends WorkPackageQueryStateService {\n public valueFromQuery(query:QueryResource):WorkPackageViewHierarchies {\n const value = new WorkPackageViewHierarchies(query.showHierarchies);\n const { current } = this;\n\n // Take over current collapsed values\n // which are not yet saved\n if (current) {\n value.collapsed = current.collapsed;\n }\n\n return value;\n }\n\n public hasChanged(query:QueryResource) {\n return query.showHierarchies !== this.isEnabled;\n }\n\n public applyToQuery(query:QueryResource) {\n query.showHierarchies = this.isEnabled;\n\n // We need to visibly load the ancestors when the mode is activated.\n return this.isEnabled;\n }\n\n /**\n * Return whether the current hierarchy mode is active\n */\n public get isEnabled():boolean {\n return !!(this.current && this.current.isVisible);\n }\n\n public setEnabled(active = true) {\n const state = { ...this.current, isVisible: active, last: null };\n this.update(state);\n }\n\n /**\n * Toggle the hierarchy state\n */\n public toggleState():boolean {\n this.setEnabled(!this.isEnabled);\n return this.isEnabled;\n }\n\n /**\n * Return whether the given wp ID is collapsed.\n */\n public collapsed(wpId:string):boolean {\n return this.current.collapsed[wpId];\n }\n\n /**\n * Collapse the hierarchy for this work package\n */\n public collapse(wpId:string):void {\n this.setState(wpId, true);\n }\n\n /**\n * Expand the hierarchy for this work package\n */\n public expand(wpId:string):void {\n this.setState(wpId, false);\n }\n\n /**\n * Toggle the hierarchy state\n */\n public toggle(wpId:string):void {\n this.setState(wpId, !this.collapsed(wpId));\n }\n\n /**\n * Set the collapse/expand state of the given work package id.\n */\n private setState(wpId:string, isCollapsed:boolean):void {\n const state = { ...this.current, last: wpId };\n state.collapsed[wpId] = isCollapsed;\n this.update(state);\n }\n\n /**\n * Get current selection state.\n */\n public get current():WorkPackageViewHierarchies {\n const state = this.lastUpdatedState.value;\n\n if (state === undefined) {\n return this.initialState;\n }\n\n if (!state.collapsed) {\n state.collapsed = {};\n }\n\n return state;\n }\n\n private get initialState():WorkPackageViewHierarchies {\n return new WorkPackageViewHierarchies(false);\n }\n}\n","import { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable } from '@angular/core';\nimport { States } from 'core-app/core/states/states.service';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { QuerySchemaResource } from 'core-app/features/hal/resources/query-schema-resource';\nimport { WorkPackageViewHighlight } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-highlight';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewHighlightingService extends WorkPackageQueryStateService {\n public constructor(readonly states:States,\n readonly Banners:BannersService,\n readonly querySpace:IsolatedQuerySpace) {\n super(querySpace);\n }\n\n initialize(query:QueryResource, results:WorkPackageCollectionResource, schema?:QuerySchemaResource) {\n super.initialize(query, results, schema);\n }\n\n /**\n * Decides whether we want to inline highlight the given field name.\n *\n * @param name A display field name such as 'status', 'priority'.\n */\n public shouldHighlightInline(name:string):boolean {\n // 1. Are we in inline mode or unable to render?\n if (!this.isInline || this.Banners.eeShowBanners) {\n return false;\n }\n\n // 2. Is selected attributes === undefined or empty Array?\n if (this.current.selectedAttributes === undefined || this.current.selectedAttributes === []) {\n return true;\n }\n\n // 3. Is name in selected attributes ?\n return !!_.find(this.current.selectedAttributes, (attr:HalResource) => attr.id === name);\n }\n\n public get current():WorkPackageViewHighlight {\n const value = this.lastUpdatedState.getValueOr({ mode: 'inline' } as WorkPackageViewHighlight);\n return this.filteredValue(value);\n }\n\n public get isInline() {\n return this.current.mode === 'inline';\n }\n\n public get isDisabled() {\n return this.current.mode === 'none';\n }\n\n public update(value:WorkPackageViewHighlight) {\n super.update(this.filteredValue(value));\n }\n\n public valueFromQuery(query:QueryResource):WorkPackageViewHighlight {\n const highlight = { mode: query.highlightingMode || 'inline', selectedAttributes: query.highlightedAttributes };\n return this.filteredValue(highlight);\n }\n\n public hasChanged(query:QueryResource) {\n return query.highlightingMode !== this.current.mode\n || !_.isEqual(query.highlightedAttributes, this.current.selectedAttributes);\n }\n\n public applyToQuery(query:QueryResource):boolean {\n const { current } = this;\n query.highlightingMode = current.mode;\n\n query.highlightedAttributes = current.selectedAttributes;\n\n return false;\n }\n\n private filteredValue(value:WorkPackageViewHighlight):WorkPackageViewHighlight {\n if (_.isEmpty(value.selectedAttributes)) {\n value.selectedAttributes = undefined;\n }\n\n this.Banners.conditional(() => {\n value.mode = 'none';\n value.selectedAttributes = undefined;\n });\n\n return value;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable } from '@angular/core';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewIncludeSubprojectsService extends WorkPackageQueryStateService {\n public constructor(\n readonly states:States,\n readonly querySpace:IsolatedQuerySpace,\n ) {\n super(querySpace);\n }\n\n public hasChanged(query:QueryResource):boolean {\n return this.current !== query.includeSubprojects;\n }\n\n valueFromQuery(query:QueryResource):boolean {\n return query.includeSubprojects || false;\n }\n\n public applyToQuery(query:QueryResource):boolean {\n const { current } = this;\n query.includeSubprojects = current; // eslint-disable-line no-param-reassign\n\n return true;\n }\n\n public get current():boolean {\n return this.lastUpdatedState.getValueOr(false);\n }\n\n public setIncludeSubprojects(include:boolean):void {\n this.update(include);\n }\n}\n","import { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { QueryOrder } from 'core-app/core/apiv3/endpoints/queries/apiv3-query-order';\n\n// min allowed position\nexport const MIN_ORDER = -2147483647;\n// max postgres 4-byte integer position\nexport const MAX_ORDER = 2147483647;\n// default position to insert\nexport const DEFAULT_ORDER = 0;\n// The distance to keep between each element\nexport const ORDER_DISTANCE = 16384;\n\n/**\n * Return either the delta position or the previous persisted position,\n * in that order.\n *\n * @param wpId\n */\nfunction livePosition(\n delta:QueryOrder,\n positions:QueryOrder,\n wpId:string,\n):number|undefined {\n // Explicitly check for undefined here as the delta might be 0 which is falsey.\n return delta[wpId] === undefined ? positions[wpId] : delta[wpId];\n}\n\n/**\n * Return the position number for the given index\n */\nfunction positionFor(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n index:number,\n):number|undefined {\n const wpId = order[index];\n return livePosition(delta, positions, wpId);\n}\n\n/**\n * Ensure +order+ is already ascending with the exception of +index+,\n * or otherwise reorder the positions starting from the first element.\n */\nfunction isAscendingOrder(\n order:string[],\n positions:QueryOrder,\n index:number,\n):boolean {\n let current:number|undefined;\n\n for (let i = 0, l = order.length; i < l; i += 1) {\n const id = order[i];\n const position = positions[id];\n\n // Skip our insertion point\n if (i === index) {\n continue;\n }\n\n // If neither position is set\n if (current === undefined || position === undefined) {\n current = position;\n continue;\n }\n\n // If the next position is not larger, rebuild positions\n if (position < current) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Since from and to index or only one apart,\n * we can swap the positions.\n *\n * TODO: This should not modify in-place and then return an unrelated value\n */\nfunction positionSwap(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n index:number,\n fromIndex:number|null,\n wpId:string,\n):QueryOrder {\n if (fromIndex === null) {\n return delta;\n }\n\n const myPosition = positionFor(delta, order, positions, index);\n const neighbor = order[fromIndex];\n const neighborPosition = positionFor(delta, order, positions, fromIndex);\n\n // If either the neighbor or wpid have no position yet,\n // go through the regular update flow\n if (myPosition === undefined || neighborPosition === undefined) {\n return delta;\n }\n\n return {\n ...delta,\n [`${wpId}`]: neighborPosition,\n [`${neighbor}`]: myPosition,\n };\n}\n\n/**\n * Insert wpId as the first element\n */\nfunction insertAsFirst(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n index:number,\n wpId:string,\n) {\n // Get the actual successor position, it might vary wildly from the optimal position\n const successorPosition = positionFor(delta, order, positions, index + 1);\n\n // If the successor also has no position yet, simply assign the default\n if (successorPosition === undefined) {\n return {\n ...delta,\n [wpId]: DEFAULT_ORDER,\n };\n }\n return {\n ...delta,\n [wpId]: successorPosition - (ORDER_DISTANCE / 2),\n };\n}\n\n/**\n * Builds any previous unset position from 0 .. index\n * so we can properly insert the wpId @ index.\n */\nfunction buildUpPredecessorPosition(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n index:number,\n) {\n let predecessorPosition:number = DEFAULT_ORDER - ORDER_DISTANCE;\n const newDelta = { ...delta };\n for (let i = 0; i < index; i += 1) {\n const id = order[i];\n const position = positions[id];\n\n // If this current ID has no position yet, assign the current one\n if (position === undefined) {\n newDelta[id] = predecessorPosition + ORDER_DISTANCE;\n predecessorPosition = newDelta[id];\n } else {\n predecessorPosition = position;\n }\n }\n\n return {\n predecessorPosition,\n delta: newDelta,\n };\n}\n\n/**\n * Returns the minimal position assigned currently\n */\nfunction firstPosition(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n):number {\n const wpId = order[0] || '';\n return livePosition(delta, positions, wpId) || 0;\n}\n\n/**\n * Returns the maximum position assigned currently.\n * Note that a list can be unpositioned at the beginning, so this may return undefined\n */\nfunction lastPosition(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n):number {\n for (let i = order.length - 1; i >= 0; i -= 1) {\n const wpId = order[i];\n const position = livePosition(delta, positions, wpId);\n\n // Return the first set position.\n if (position !== undefined) {\n return position;\n }\n }\n\n return 0;\n}\n\n/**\n * Distribute the items over a given min/max\n */\nfunction redistribute(\n delta:QueryOrder,\n order:string[],\n minIndex:number,\n maxIndex:number,\n) {\n const itemsToDistribute = order.length;\n\n let min = minIndex;\n let max = maxIndex;\n\n // We can keep min and max orders if distance/(items to distribute) >= 1\n let space = Math.floor((max - min) / (itemsToDistribute - 1));\n\n // If no space is left, first try to add to the max item\n // Or subtract from the min item\n if (space < 1) {\n if ((max + itemsToDistribute) <= MAX_ORDER) {\n max += itemsToDistribute;\n } else if ((min - itemsToDistribute) >= MIN_ORDER) {\n min -= itemsToDistribute;\n } else {\n // This should not happen in a 4-byte integer with our frontend\n throw new Error('Elements cannot be moved further and no space is left. Too many elements');\n }\n\n // Rebuild space\n space = Math.floor((max - min) / (itemsToDistribute - 1));\n }\n\n // Assign positions for all values in between min/max\n const newDelta = { ...delta };\n for (let i = 0; i < itemsToDistribute; i += 1) {\n const wpId = order[i];\n newDelta[wpId] = min + (i * space);\n }\n\n return newDelta;\n}\n\n/**\n * There was no space left at the desired insert position,\n * we're going to evenly distribute all items again\n */\nfunction reorderedInsert(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n) {\n // Get the current distance between orders\n // Both must be set by now due to +buildUpPredecessorPosition+ having run.\n const min = firstPosition(delta, order, positions);\n const max = lastPosition(delta, order, positions);\n\n return redistribute(delta, order, min, max);\n}\n\n/**\n * Insert +wpId+ at +index+ in a position that is determined either\n * by its neighbors, one of them in case both do not yet have a position\n */\nfunction buildInsertPosition(\n order:string[],\n positions:QueryOrder,\n wpId:string,\n index:number,\n fromIndex:number|null,\n):QueryOrder {\n const delta = {};\n // Special case, order is empty or only contains wpId\n // Then simply insert as the default position unless it already has a position\n if (order.length <= 1 && positions[wpId] === undefined) {\n return {\n ...delta,\n [wpId]: DEFAULT_ORDER,\n };\n }\n\n // Special case, shifted movement by one\n const newDelta = positionSwap(delta, order, positions, index, fromIndex, wpId);\n if (fromIndex !== null\n && Math.abs(fromIndex - index) === 1\n && delta !== newDelta\n ) {\n return newDelta;\n }\n\n // Special case, index is 0\n if (index === 0) {\n return insertAsFirst(newDelta, order, positions, index, wpId);\n }\n\n // Ensure previous positions exist so we can insert wpId @ index\n const { delta: rebuiltDelta, predecessorPosition } = buildUpPredecessorPosition(newDelta, order, positions, index);\n\n // Ensure we reorder when predecessor is at max already\n if (predecessorPosition >= MAX_ORDER) {\n debugLog('Predecessor position is at max order, need to reorder');\n return reorderedInsert(rebuiltDelta, order, positions);\n }\n\n // Get the actual successor position, it might vary wildly from the optimal position\n const successorPosition = positionFor(rebuiltDelta, order, positions, index + 1);\n\n if (successorPosition === undefined) {\n // Successor does not have a position yet (is NULL), any position will work\n // so let's use the optimal one which is halfway to a potential successor\n return {\n ...rebuiltDelta,\n [wpId]: predecessorPosition + (ORDER_DISTANCE / 2),\n };\n }\n\n // Ensure we reorder when successor is at max already\n if (successorPosition >= MAX_ORDER) {\n debugLog('Successor position is at max order, need to reorder');\n return reorderedInsert(rebuiltDelta, order, positions);\n }\n\n // successor exists and has a position\n // We will want to insert at the half way from predecessorPosition ... successorPosition\n const distance = Math.floor((successorPosition - predecessorPosition) / 2);\n\n // If there is no space to insert, we're going to optimize the available space\n if (distance < 1) {\n debugLog('Cannot insert at optimal position, no space left. Need to reorder');\n return reorderedInsert(rebuiltDelta, order, positions);\n }\n\n return {\n ...rebuiltDelta,\n [wpId]: predecessorPosition + distance,\n };\n}\n\n/**\n * Get the absolute minimum and maximum positions\n * currently assigned in the slot.\n *\n * If there is at least two positions assigned, returns the maximum\n * between them.\n *\n * Otherwise, returns the optimum min max for the given order length.\n */\nfunction minMaxPositions(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n):[number, number] {\n let min:number = MAX_ORDER;\n let max:number = MIN_ORDER;\n let any = false;\n\n for (let i = order.length - 1; i >= 0; i -= 1) {\n const wpId = order[i];\n const position = livePosition(delta, positions, wpId);\n\n if (position !== undefined) {\n min = Math.min(position, min);\n max = Math.max(position, max);\n any = true;\n }\n }\n\n if (any && min !== max) {\n return [min, max];\n }\n return [DEFAULT_ORDER, order.length * ORDER_DISTANCE];\n}\n\n/**\n * Reassign mixed positions so that they are strictly ascending again,\n * but try to keep relative positions alive\n */\nfunction rebuildPositions(\n order:string[],\n positions:QueryOrder,\n) {\n const delta:QueryOrder = {};\n const [min, max] = minMaxPositions(delta, order, positions);\n return redistribute(delta, order, min, max);\n}\n\n/**\n * Build a delta\n * Computes the delta of positions for a given operation and order\n *\n * @param order The current order of work packages that contains the user movement\n * @param positions The current positions as loaded from backend / persisted from previous calls\n * @param wpId The work package that got moved\n * @param index The index a work package got moved into\n * @param fromIndex If moved within the order, the previous index used for movement optimzation\n */\nexport function buildDelta(\n order:string[],\n positions:QueryOrder,\n wpId:string,\n index:number,\n fromIndex:number|null,\n):QueryOrder {\n if (!isAscendingOrder(order, positions, index)) {\n return rebuildPositions(order, positions);\n }\n\n // Insert only the new element\n return buildInsertPosition(order, positions, wpId, index, fromIndex);\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { take } from 'rxjs/operators';\nimport { InputState } from 'reactivestates';\nimport { States } from 'core-app/core/states/states.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { QuerySchemaResource } from 'core-app/features/hal/resources/query-schema-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport isPersistedResource from 'core-app/features/hal/helpers/is-persisted-resource';\nimport { MAX_ORDER, buildDelta } from 'core-app/shared/helpers/drag-and-drop/reorder-delta-builder';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { CausedUpdatesService } from 'core-app/features/boards/board/caused-updates/caused-updates.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { QueryOrder } from 'core-app/core/apiv3/endpoints/queries/apiv3-query-order';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewOrderService extends WorkPackageQueryStateService {\n constructor(protected readonly querySpace:IsolatedQuerySpace,\n protected readonly apiV3Service:ApiV3Service,\n protected readonly states:States,\n protected readonly causedUpdates:CausedUpdatesService,\n protected readonly wpTableSortBy:WorkPackageViewSortByService,\n protected readonly pathHelper:PathHelperService) {\n super(querySpace);\n }\n\n public initialize(query:QueryResource, results:WorkPackageCollectionResource, schema?:QuerySchemaResource):Promise {\n // Take over our current value if the query is not saved\n if (!isPersistedResource(query) && this.positions.hasValue()) {\n this.applyToQuery(query);\n }\n\n if (this.wpTableSortBy.isManualSortingMode) {\n return this.withLoadedPositions();\n }\n\n return Promise.resolve();\n }\n\n /**\n * Move an item in the list\n */\n public async move(order:string[], wpId:string, toIndex:number):Promise {\n // Find index of the work package\n const fromIndex:number = order.findIndex((id) => id === wpId);\n\n order.splice(fromIndex, 1);\n order.splice(toIndex, 0, wpId);\n\n await this.assignPosition(order, wpId, toIndex, fromIndex);\n\n return order;\n }\n\n /**\n * Pull an item from the rendered list\n */\n public remove(order:string[], wpId:string):string[] {\n _.remove(order, (id) => id === wpId);\n this.update({ [wpId]: -1 });\n return order;\n }\n\n /**\n * Add an item to the list\n */\n public async add(order:string[], wpId:string, toIndex = -1):Promise {\n if (toIndex === -1) {\n order.push(wpId);\n toIndex = order.length - 1;\n } else {\n order.splice(toIndex, 0, wpId);\n }\n\n await this.assignPosition(order, wpId, toIndex);\n\n return order;\n }\n\n public get applicable() {\n return isPersistedResource(this.currentQuery);\n }\n\n protected get currentQuery():QueryResource {\n return this.querySpace.query.value!;\n }\n\n /**\n * Assign a position for the given work package and its index given the current order\n * @param order Current order the work package was inserted to\n * @param wpId The work package ID that was moved\n * @param toIndex The id of the work package in order\n */\n protected async assignPosition(order:string[], wpId:string, toIndex:number, fromIndex:number|null = null) {\n const positions = await this.withLoadedPositions();\n const delta = buildDelta(order, positions, wpId, toIndex, fromIndex);\n\n await this.update(delta);\n }\n\n protected get positions():InputState {\n return this.updatesState;\n }\n\n /**\n * Update the order state\n */\n public async update(delta:QueryOrder) {\n const current = this.positions.getValueOr({});\n this.positions.putValue({ ...current, ...delta });\n\n // Push the update if the query is saved\n if (isPersistedResource(this.currentQuery)) {\n const updatedAt = await this\n .apiV3Service\n .queries.id(this.currentQuery)\n .order\n .update(delta);\n\n this.currentQuery.updatedAt = updatedAt;\n\n // Remember that we caused this update\n this.causedUpdates.add(this.currentQuery);\n }\n\n // Push into the query object\n this.applyToQuery(this.currentQuery);\n\n // Update the query\n this.querySpace.query.putValue(this.currentQuery);\n }\n\n /**\n * Initialize (or load if persisted) the order for the query space\n */\n public withLoadedPositions():Promise {\n if (isPersistedResource(this.currentQuery)) {\n const { value } = this.positions;\n\n // Remove empty or stale values given we can reload them\n if ((value === {} || this.positions.isValueOlderThan(60000))) {\n this.positions.clear('Clearing old positions value');\n }\n\n // Load the current order from backend\n this.positions.putFromPromiseIfPristine(\n () => this\n .apiV3Service\n .queries.id(this.currentQuery)\n .order\n .get(),\n );\n } else if (this.positions.isPristine()) {\n // Insert an empty fallback in case we have no data yet\n this.positions.putValue({});\n }\n\n return this.positions\n .values$()\n .pipe(take(1))\n .toPromise();\n }\n\n public valueFromQuery(query:QueryResource) {\n return undefined;\n }\n\n /**\n * Return ordered work packages\n */\n orderedWorkPackages():WorkPackageResource[] {\n const upstreamOrder = this.querySpace\n .results\n .value!\n .elements\n .map((wp) => this.states.workPackages.get(wp.id!).getValueOr(wp));\n\n if (isPersistedResource(this.currentQuery) || this.positions.isPristine()) {\n return upstreamOrder;\n }\n const positions = this.positions.value!;\n return _.sortBy(upstreamOrder, (wp) => {\n const pos = positions[wp.id!];\n return pos !== undefined ? pos : MAX_ORDER;\n });\n }\n\n applyToQuery(query:QueryResource):boolean {\n query.orderedWorkPackages = this.positions.getValueOr({});\n return false;\n }\n\n hasChanged(query:QueryResource):boolean {\n return false;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { PaginationInstance } from 'core-app/shared/components/table-pagination/pagination-instance';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\n\nexport class WorkPackageViewPagination {\n public current:PaginationInstance;\n\n constructor(results:WorkPackageCollectionResource) {\n this.current = new PaginationInstance(results.offset, results.total, results.pageSize);\n }\n\n public get page() {\n return this.current.page;\n }\n\n public set page(val) {\n this.current.page = val;\n }\n\n public get perPage() {\n return this.current.perPage;\n }\n\n public set perPage(val) {\n this.current.perPage = val;\n }\n\n public get total() {\n return this.current.total;\n }\n\n public set total(val) {\n this.current.total = val;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageViewPagination } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-pagination';\nimport { WorkPackageViewBaseService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-base.service';\nimport { PaginationObject, PaginationService } from 'core-app/shared/components/table-pagination/pagination-service';\n\nexport interface PaginationUpdateObject {\n page?:number;\n perPage?:number;\n total?:number;\n count?:number;\n}\n\n@Injectable()\nexport class WorkPackageViewPaginationService extends WorkPackageViewBaseService {\n public constructor(querySpace:IsolatedQuerySpace,\n readonly paginationService:PaginationService) {\n super(querySpace);\n }\n\n public get paginationObject():PaginationObject {\n if (this.current) {\n return {\n pageSize: this.current.perPage,\n offset: this.current.page,\n };\n }\n return {\n pageSize: this.paginationService.getCachedPerPage([]),\n offset: 1,\n };\n }\n\n public valueFromQuery(query:QueryResource, results:WorkPackageCollectionResource) {\n return new WorkPackageViewPagination(results);\n }\n\n public updateFromObject(object:PaginationUpdateObject) {\n const currentState = this.current;\n\n if (object.page) {\n currentState.page = object.page;\n }\n if (object.perPage) {\n currentState.perPage = object.perPage;\n }\n if (object.total) {\n currentState.total = object.total;\n }\n\n this.updatesState.putValue(currentState);\n }\n\n public updateFromResults(results:WorkPackageCollectionResource) {\n const update = {\n page: results.offset,\n perPage: results.pageSize,\n total: results.total,\n count: results.count,\n };\n\n this.updateFromObject(update);\n }\n\n public get current():WorkPackageViewPagination {\n return this.lastUpdatedState.value!;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { WorkPackageViewRelationColumns } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-relation-columns';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { RelationsStateValue, WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { Injectable } from '@angular/core';\nimport {\n QueryColumn,\n queryColumnTypes,\n RelationQueryColumn,\n TypeRelationQueryColumn,\n} from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { WorkPackageViewBaseService } from './wp-view-base.service';\nimport { WorkPackageViewColumnsService } from './wp-view-columns.service';\n\nexport type RelationColumnType = 'toType'|'ofType';\n\n@Injectable()\nexport class WorkPackageViewRelationColumnsService extends WorkPackageViewBaseService {\n constructor(public querySpace:IsolatedQuerySpace,\n public wpTableColumns:WorkPackageViewColumnsService,\n public halResourceService:HalResourceService,\n public apiV3Service:ApiV3Service,\n public wpRelations:WorkPackageRelationsService) {\n super(querySpace);\n }\n\n public valueFromQuery(query:QueryResource):WorkPackageViewRelationColumns {\n // Take over current expanded values\n // which are not yet saved\n return this.current;\n }\n\n /**\n * Returns a subset of all relations that the user has currently expanded.\n *\n * @param workPackage\n * @param relation\n */\n public relationsToExtendFor(workPackage:WorkPackageResource,\n relations:RelationsStateValue|undefined,\n eachCallback:(relation:RelationResource, column:QueryColumn, type:RelationColumnType) => void) {\n // Only if any relation columns or stored expansion state exist\n if (!(this.wpTableColumns.hasRelationColumns() && this.lastUpdatedState.hasValue())) {\n return;\n }\n\n // Only if any relations exist for this work package\n if (_.isNil(relations)) {\n return;\n }\n\n // Only if the work package has anything expanded\n const expanded = this.getExpandFor(workPackage.id!);\n if (expanded === undefined) {\n return;\n }\n\n const column = this.wpTableColumns.findById(expanded)!;\n const type = this.relationColumnType(column);\n\n if (type !== null) {\n _.each(this.relationsForColumn(workPackage, relations, column),\n (relation) => eachCallback(relation, column, type));\n }\n }\n\n /**\n * Get the subset of relations for the work package that belong to this relation column\n *\n * @param workPackage A work package resource\n * @param relations The RelationStateValue of this work package\n * @param column The relation column to filter for\n * @return The filtered relations\n */\n public relationsForColumn(workPackage:WorkPackageResource, relations:RelationsStateValue|undefined, column:QueryColumn) {\n if (_.isNil(relations)) {\n return [];\n }\n\n // Get the type of TO work package\n const type = this.relationColumnType(column);\n if (type === 'toType') {\n const typeHref = (column as TypeRelationQueryColumn).type.href;\n\n return _.filter(relations, (relation:RelationResource) => {\n const denormalized = relation.denormalized(workPackage);\n const target = this.apiV3Service.work_packages.cache.state(denormalized.targetId).value;\n\n return _.get(target, 'type.href') === typeHref;\n });\n }\n\n // Get the relation types for OF relation columns\n if (type === 'ofType') {\n const { relationType } = column as RelationQueryColumn;\n\n return _.filter(relations, (relation:RelationResource) => relation.denormalized(workPackage).relationType === relationType);\n }\n\n return [];\n }\n\n public relationColumnType(column:QueryColumn):RelationColumnType|null {\n switch (column._type) {\n case queryColumnTypes.RELATION_TO_TYPE:\n return 'toType';\n case queryColumnTypes.RELATION_OF_TYPE:\n return 'ofType';\n default:\n return null;\n }\n }\n\n public getExpandFor(workPackageId:string):string|undefined {\n return this.current[workPackageId];\n }\n\n public setExpandFor(workPackageId:string, columnId:string) {\n const nextState = { ...this.current };\n nextState[workPackageId] = columnId;\n\n this.update(nextState);\n }\n\n public collapse(workPackageId:string) {\n const nextState = { ...this.current };\n delete nextState[workPackageId];\n\n this.update(nextState);\n }\n\n public get current():WorkPackageViewRelationColumns {\n return this.lastUpdatedState.getValueOr({});\n }\n}\n","import { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable, OnDestroy } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { WorkPackageViewBaseService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-base.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\n\nexport interface WorkPackageViewSelectionState {\n // Map of selected rows\n selected:{ [workPackageId:string]:boolean };\n // Index of current selection\n // required for shift-offsets\n activeRowIndex:number|null;\n}\n\n@Injectable()\nexport class WorkPackageViewSelectionService extends WorkPackageViewBaseService implements OnDestroy {\n public constructor(readonly querySpace:IsolatedQuerySpace,\n readonly states:States,\n readonly opContextMenu:OPContextMenuService) {\n super(querySpace);\n this.reset();\n }\n\n ngOnDestroy():void {\n Mousetrap.unbind(['command+d', 'ctrl+d']);\n Mousetrap.unbind(['command+a', 'ctrl+a']);\n }\n\n public initializeSelection(selectedWorkPackageIds:string[]) {\n const state:WorkPackageViewSelectionState = {\n selected: {},\n activeRowIndex: null,\n };\n\n selectedWorkPackageIds.forEach((id) => state.selected[id] = true);\n\n this.updatesState.clear();\n this.pristineState.putValue(state);\n }\n\n public isSelected(workPackageId:string):boolean {\n return !!this.current?.selected[workPackageId];\n }\n\n /**\n * Select all work packages\n */\n public selectAll(rows:RenderedWorkPackage[]) {\n const state:WorkPackageViewSelectionState = this._emptyState;\n\n rows.forEach((row) => {\n if (row.workPackageId) {\n state.selected[row.workPackageId] = true;\n }\n });\n\n this.update(state);\n }\n\n /**\n * Get the current work package resource form the selection state.\n */\n public getSelectedWorkPackages():WorkPackageResource[] {\n const wpState = this.states.workPackages;\n return this.getSelectedWorkPackageIds().map((id) => wpState.get(id).value!);\n }\n\n public getSelectedWorkPackageIds():string[] {\n const selected:string[] = [];\n\n _.each(this.current?.selected, (isSelected:boolean, wpId:string) => {\n if (isSelected) {\n selected.push(wpId);\n }\n });\n\n return selected;\n }\n\n /**\n * Reset the selection state to an empty selection\n */\n public reset() {\n this.update(this._emptyState);\n }\n\n public get isEmpty() {\n return this.selectionCount === 0;\n }\n\n /**\n * Return the number of selected rows.\n */\n public get selectionCount():number {\n return _.size(this.current?.selected);\n }\n\n /**\n * Toggle a single row selection state and update the state.\n * @param workPackageId\n */\n public toggleRow(workPackageId:string) {\n const isSelected = this.current?.selected[workPackageId];\n this.setRowState(workPackageId, !isSelected);\n }\n\n /**\n * Force the given work package's selection state. Does not modify other states.\n * @param workPackageId\n * @param newState\n */\n public setRowState(workPackageId:string, newState:boolean) {\n const state = this.current || this._emptyState;\n state.selected[workPackageId] = newState;\n this.update(state);\n }\n\n /**\n * Override current selection with the given work package id.\n */\n public setSelection(wpId:string, position:number) {\n const current = this._emptyState;\n current.selected[wpId] = true;\n current.activeRowIndex = position;\n\n this.update(current);\n }\n\n /**\n * Select a number of rows from the current `activeRowIndex`\n * to the selected target.\n * (aka shift click expansion)\n */\n public setMultiSelectionFrom(rows:RenderedWorkPackage[], wpId:string, position:number) {\n const state = this.current || this._emptyState;\n\n // If there are no other selections, it does not matter what the index is\n if (this.selectionCount === 0 || state.activeRowIndex === null) {\n state.selected[wpId] = true;\n state.activeRowIndex = position;\n } else {\n const start = Math.min(position, state.activeRowIndex);\n const end = Math.max(position, state.activeRowIndex);\n\n rows.forEach((row, i) => {\n if (row.workPackageId) {\n state.selected[row.workPackageId] = i >= start && i <= end;\n }\n });\n }\n\n this.update(state);\n }\n\n public registerSelectAllListener(renderedElements:() => RenderedWorkPackage[]) {\n // Bind CTRL+A to select all work packages\n Mousetrap.bind(['command+a', 'ctrl+a'], (e) => {\n this.selectAll(renderedElements());\n e.preventDefault();\n\n this.opContextMenu.close();\n return false;\n });\n }\n\n public registerDeselectAllListener() {\n // Bind CTRL+D to deselect all work packages\n Mousetrap.bind(['command+d', 'ctrl+d'], (e) => {\n this.reset();\n e.preventDefault();\n\n this.opContextMenu.close();\n return false;\n });\n }\n\n private get _emptyState():WorkPackageViewSelectionState {\n return {\n selected: {},\n activeRowIndex: null,\n };\n }\n\n valueFromQuery(query:QueryResource, results:WorkPackageCollectionResource):WorkPackageViewSelectionState|undefined {\n return undefined;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { combine } from 'reactivestates';\nimport { mapTo } from 'rxjs/operators';\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { States } from 'core-app/core/states/states.service';\nimport { QuerySortByResource } from 'core-app/features/hal/resources/query-sort-by-resource';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewSortByService extends WorkPackageQueryStateService {\n constructor(protected readonly states:States,\n protected readonly querySpace:IsolatedQuerySpace,\n protected readonly pathHelper:PathHelperService) {\n super(querySpace);\n }\n\n public valueFromQuery(query:QueryResource) {\n return [...query.sortBy];\n }\n\n public onReadyWithAvailable():Observable {\n return combine(this.pristineState, this.querySpace.available.sortBy)\n .values$()\n .pipe(\n mapTo(null),\n );\n }\n\n public hasChanged(query:QueryResource) {\n const comparer = (sortBy:QuerySortByResource[]) => sortBy.map((el) => el.href);\n\n return !_.isEqual(\n comparer(query.sortBy),\n comparer(this.current),\n );\n }\n\n public applyToQuery(query:QueryResource) {\n const wasManuallySorted = this.isManuallySorted(query.sortBy);\n\n query.sortBy = [...this.current];\n\n // Reload every time unless we stayed in manual sort mode\n return !(wasManuallySorted && this.isManualSortingMode);\n }\n\n public isSortable(column:QueryColumn):boolean {\n return !!_.find(\n this.available,\n (candidate) => candidate.column.href === column.href,\n );\n }\n\n public addSortCriteria(column:QueryColumn, criteria:string) {\n const available = this.findAvailableDirection(column, criteria);\n\n if (available) {\n this.add(available);\n }\n }\n\n public setAsSingleSortCriteria(column:QueryColumn, criteria:string) {\n const available:QuerySortByResource = this.findAvailableDirection(column, criteria)!;\n\n if (available) {\n this.update([available]);\n }\n }\n\n public findAvailableDirection(column:QueryColumn, direction:string):QuerySortByResource | undefined {\n return _.find(\n this.available,\n (candidate) => (candidate.column.href === column.href\n && candidate.direction.href === direction),\n );\n }\n\n public add(sortBy:QuerySortByResource) {\n const newValue = _\n .uniqBy([sortBy, ...this.current], (sortBy) => sortBy.column.href)\n .slice(0, 3);\n\n this.update(newValue);\n }\n\n public get isManualSortingMode():boolean {\n return this.isManuallySorted(this.current);\n }\n\n public switchToManualSorting(query:QueryResource):boolean {\n const { manualSortObject } = this;\n if (manualSortObject && !this.isManualSortingMode) {\n query.setSortBy([manualSortObject]);\n return true;\n }\n\n return false;\n }\n\n public get current():QuerySortByResource[] {\n return this.lastUpdatedState.getValueOr([]);\n }\n\n private get availableState() {\n return this.querySpace.available.sortBy;\n }\n\n public get available():QuerySortByResource[] {\n return this.availableState.getValueOr([]);\n }\n\n private isManuallySorted(sortBy:QuerySortByResource[]):boolean {\n if (sortBy && sortBy.length > 0) {\n return sortBy[0].column.href!.endsWith('/manualSorting');\n }\n\n return false;\n }\n\n private get manualSortObject() {\n return _.find(this.available, (sort) => sort.column.href!.endsWith('/manualSorting'));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable } from '@angular/core';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewSumService extends WorkPackageQueryStateService {\n public constructor(querySpace:IsolatedQuerySpace) {\n super(querySpace);\n }\n\n public valueFromQuery(query:QueryResource) {\n return !!query.sums;\n }\n\n public initialize(query:QueryResource) {\n this.pristineState.putValue(!!query.sums);\n }\n\n public hasChanged(query:QueryResource) {\n return query.sums !== this.isEnabled;\n }\n\n public applyToQuery(query:QueryResource) {\n query.sums = this.isEnabled;\n return true;\n }\n\n public toggle() {\n this.updatesState.putValue(!this.current);\n }\n\n public setEnabled(value:boolean) {\n this.updatesState.putValue(value);\n }\n\n public get isEnabled() {\n return this.current;\n }\n\n public get current():boolean {\n return this.lastUpdatedState.getValueOr(false);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { input } from 'reactivestates';\nimport { WorkPackageTimelineState } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-timeline';\nimport { zoomLevelOrder } from 'core-app/features/work-packages/components/wp-table/timeline/wp-timeline';\nimport { QueryResource, TimelineLabels, TimelineZoomLevel } from 'core-app/features/hal/resources/query-resource';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewTimelineService extends WorkPackageQueryStateService {\n /** Remember the computed zoom level to correct zooming after leaving autozoom */\n public appliedZoomLevel$ = input('auto');\n\n public constructor(protected readonly querySpace:IsolatedQuerySpace) {\n super(querySpace);\n }\n\n public valueFromQuery(query:QueryResource) {\n return {\n ...this.defaultState,\n visible: query.timelineVisible,\n zoomLevel: query.timelineZoomLevel,\n labels: query.timelineLabels,\n };\n }\n\n public set appliedZoomLevel(val:TimelineZoomLevel) {\n this.appliedZoomLevel$.putValue(val);\n }\n\n public get appliedZoomLevel() {\n return this.appliedZoomLevel$.value!;\n }\n\n public hasChanged(query:QueryResource) {\n const visibilityChanged = this.isVisible !== query.timelineVisible;\n const zoomLevelChanged = this.zoomLevel !== query.timelineZoomLevel;\n const labelsChanged = !_.isEqual(this.current.labels, query.timelineLabels);\n\n return visibilityChanged || zoomLevelChanged || labelsChanged;\n }\n\n public applyToQuery(query:QueryResource) {\n query.timelineVisible = this.isVisible;\n query.timelineZoomLevel = this.zoomLevel;\n query.timelineLabels = this.current.labels;\n\n return false;\n }\n\n public toggle() {\n const currentState = this.current;\n this.setVisible(!currentState.visible);\n }\n\n public setVisible(value:boolean) {\n this.updatesState.putValue({ ...this.current, visible: value });\n }\n\n public get isVisible() {\n return this.current.visible;\n }\n\n public get zoomLevel() {\n return this.current.zoomLevel;\n }\n\n public get labels() {\n if (_.isEmpty(this.current.labels)) {\n return this.defaultLabels;\n }\n\n return this.current.labels;\n }\n\n public updateLabels(labels:TimelineLabels) {\n this.modify({ labels });\n }\n\n public getNormalizedLabels(workPackage:WorkPackageResource) {\n const labels:TimelineLabels = this.defaultLabels;\n\n _.each(this.current.labels, (attribute:string | null, positionAsString:string) => {\n // RR: Lodash typings declare the position as string. However, it is save to cast\n // to `keyof TimelineLabels` because `this.current.labels` is of type TimelineLabels.\n const position:keyof TimelineLabels = positionAsString as keyof TimelineLabels;\n\n // Set to null to explicitly disable\n if (attribute === '') {\n labels[position] = null;\n } else {\n labels[position] = attribute;\n }\n });\n\n return labels;\n }\n\n public setZoomLevel(level:TimelineZoomLevel) {\n this.modify({ zoomLevel: level });\n }\n\n public updateZoomWithDelta(delta:number):void {\n const level = this.current.zoomLevel;\n if (level !== 'auto') {\n return this.applyZoomLevel(level, delta);\n }\n\n const applied = this.appliedZoomLevel;\n if (applied && applied !== 'auto') {\n // When we have a real zoom value, use delta on that one\n this.applyZoomLevel(applied, delta);\n } else {\n // Use the maximum zoom value\n const target = delta < 0 ? 'days' : 'years';\n this.setZoomLevel(target);\n }\n }\n\n public isAutoZoom():boolean {\n return this.current.zoomLevel === 'auto';\n }\n\n public enableAutozoom() {\n this.modify({ zoomLevel: 'auto' });\n }\n\n public get current():WorkPackageTimelineState {\n return this.lastUpdatedState.getValueOr(this.defaultState);\n }\n\n /**\n * Modify the state, updating with parts of properties\n * @param update\n */\n private modify(update:Partial) {\n this.update({ ...this.current, ...update } as WorkPackageTimelineState);\n }\n\n /**\n * Apply a zoom level\n *\n * @param level Any zoom level except auto.\n * @param delta The delta (e.g., 1, -1) to apply.\n */\n private applyZoomLevel(level:Exclude, delta:number) {\n let idx = zoomLevelOrder.indexOf(level);\n idx += delta;\n\n if (idx >= 0 && idx < zoomLevelOrder.length) {\n this.setZoomLevel(zoomLevelOrder[idx]);\n }\n }\n\n private get defaultLabels():TimelineLabels {\n return {\n left: '',\n right: '',\n farRight: 'subject',\n };\n }\n\n private get defaultState():WorkPackageTimelineState {\n return {\n zoomLevel: 'auto',\n visible: false,\n labels: this.defaultLabels,\n };\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ChangeDetectorRef, Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport {\n WorkPackageViewFocusService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { OpTitleService } from 'core-app/core/html/op-title.service';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { States } from 'core-app/core/states/states.service';\nimport {\n KeepTabService,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\nimport {\n HalResourceEditingService,\n} from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport {\n WorkPackageNotificationService,\n} from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport {\n switchMap,\n} from 'rxjs/operators';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { WpSingleViewService } from 'core-app/features/work-packages/routing/wp-view-base/state/wp-single-view.service';\nimport { Observable } from 'rxjs';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { AttachmentsResourceService } from 'core-app/core/state/attachments/attachments.service';\nimport { StoragesResourceService } from 'core-app/core/state/storages/storages.service';\nimport { FileLinksResourceService } from 'core-app/core/state/file-links/file-links.service';\nimport { ProjectsResourceService } from 'core-app/core/state/projects/projects.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\n\nexport class WorkPackageSingleViewBase extends UntilDestroyedMixin {\n @InjectField() states:States;\n\n @InjectField() I18n!:I18nService;\n\n @InjectField() keepTab:KeepTabService;\n\n @InjectField() PathHelper:PathHelperService;\n\n @InjectField() halEditing:HalResourceEditingService;\n\n @InjectField() wpTableFocus:WorkPackageViewFocusService;\n\n @InjectField() notificationService:WorkPackageNotificationService;\n\n @InjectField() authorisationService:AuthorisationService;\n\n @InjectField() private readonly attachmentsResourceService:AttachmentsResourceService;\n\n @InjectField() private readonly fileLinkResourceService:FileLinksResourceService;\n\n @InjectField() private readonly projectsResourceService:ProjectsResourceService;\n\n @InjectField() private readonly storages:StoragesResourceService;\n\n @InjectField() private readonly toastService:ToastService;\n\n @InjectField() cdRef:ChangeDetectorRef;\n\n @InjectField() readonly titleService:OpTitleService;\n\n @InjectField() readonly apiV3Service:ApiV3Service;\n\n @InjectField() readonly hooks:HookService;\n\n @InjectField() readonly actions$:ActionsService;\n\n @InjectField() readonly storeService:WpSingleViewService;\n\n public text:any = {};\n\n // Work package resource to be loaded from the cache\n public workPackage:WorkPackageResource;\n\n public projectIdentifier:string;\n\n public focusAnchorLabel:string;\n\n public showStaticPagePath:string;\n\n public displayNotificationsButton$:Observable;\n\n constructor(public injector:Injector,\n protected workPackageId:string) {\n super();\n this.initializeTexts();\n }\n\n /**\n * Observe changes of work package and re-run initialization.\n * Needs to be run explicitly by descendants.\n */\n protected observeWorkPackage():void {\n this\n .apiV3Service\n .work_packages\n .id(this.workPackageId)\n .requireAndStream()\n .pipe(this.untilDestroyed())\n .subscribe((wp:WorkPackageResource) => {\n if (!this.workPackage) {\n this.workPackage = wp;\n this.init();\n } else {\n this.workPackage = wp;\n }\n\n this.cdRef.detectChanges();\n }, (error) => {\n this.handleLoadingError(error);\n });\n }\n\n /**\n * Provide static translations\n */\n protected initializeTexts():void {\n this.text.tabs = {};\n ['overview', 'activity', 'relations', 'watchers'].forEach((tab) => {\n this.text.tabs[tab] = this.I18n.t(`js.work_packages.tabs.${tab}`);\n });\n }\n\n /**\n * Initialize controller after workPackage resource has been loaded.\n */\n protected init():void {\n // Set elements\n this\n .apiV3Service\n .projects\n .id(this.workPackage.project)\n .requireAndStream()\n .subscribe(() => {\n this.projectIdentifier = this.workPackage.project.identifier;\n this.cdRef.detectChanges();\n });\n\n // lazy load the work package's project, needed when initializing\n // the work package resource from split view.\n this.projectsResourceService\n .update((this.workPackage.$links.project as HalResource).href as string)\n .subscribe(() => {}, (error) => {\n this.toastService.addError(error);\n });\n\n this.displayNotificationsButton$ = this.storeService.hasNotifications$;\n this.storeService.setFilters(this.workPackage.id as string);\n\n // Set authorisation data\n this.authorisationService.initModelAuth('work_package', this.workPackage.$links);\n\n // Push the current title\n this.titleService.setFirstPart(this.workPackage.subjectWithType(20));\n\n // Preselect this work package for future list operations\n this.showStaticPagePath = this.PathHelper.workPackagePath(this.workPackageId);\n\n // Fetch attachments of current work package\n const attachments = this.workPackage.attachments as unknown&{ href:string };\n this.attachmentsResourceService.fetchAttachments(attachments.href).subscribe();\n\n if (this.workPackage.$links.fileLinks) {\n this.fileLinkResourceService\n .updateCollectionsForWorkPackage(this.workPackage.$links.fileLinks.href as string)\n .pipe(\n this.untilDestroyed(),\n switchMap(() => this.projectsResourceService.lookup((this.workPackage.project as unknown&{ id:string }).id)),\n )\n .subscribe(\n (project) => {\n if (project._links.storages) {\n this.storages.updateCollection(project._links.self.href, project._links.storages);\n }\n },\n (error) => {\n this.toastService.addError(error);\n throw error;\n },\n );\n }\n\n // Listen to tab changes to update the tab label\n this.keepTab.observable\n .pipe(this.untilDestroyed())\n .subscribe((tabs:{ active:string }) => {\n this.updateFocusAnchorLabel(tabs.active);\n });\n }\n\n protected handleLoadingError(error:unknown):void {\n this.notificationService.handleRawError(error);\n }\n\n /**\n * Recompute the current tab focus label\n */\n public updateFocusAnchorLabel(tabName:string):string {\n this.focusAnchorLabel = this.I18n.t('js.label_work_package_details_you_are_here', {\n tab: this.I18n.t(`js.work_packages.tabs.${tabName}`),\n type: this.workPackage.type.name,\n subject: this.workPackage.subject,\n });\n return this.focusAnchorLabel;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectorRef, Directive, Injector, OnDestroy, OnInit,\n} from '@angular/core';\nimport { StateService, TransitionService } from '@uirouter/core';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { filter, take, withLatestFrom } from 'rxjs/operators';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { StaticQueriesService } from 'core-app/shared/components/op-view-select/op-static-queries.service';\nimport { WorkPackageViewHighlightingService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-highlighting.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { WorkPackageViewSumService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sum.service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageViewPaginationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-pagination.service';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { WorkPackagesListChecksumService } from 'core-app/features/work-packages/components/wp-list/wp-list-checksum.service';\nimport { WorkPackageQueryStateService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-base.service';\nimport { WorkPackageStatesInitializationService } from 'core-app/features/work-packages/components/wp-list/wp-states-initialization.service';\nimport { WorkPackageViewOrderService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service';\nimport { WorkPackageViewDisplayRepresentationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\nimport { WorkPackageViewIncludeSubprojectsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-include-subprojects.service';\nimport { HalEvent, HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\n@Directive()\nexport abstract class WorkPackagesViewBase extends UntilDestroyedMixin implements OnInit, OnDestroy {\n @InjectField() $state:StateService;\n\n @InjectField() states:States;\n\n @InjectField() querySpace:IsolatedQuerySpace;\n\n @InjectField() authorisationService:AuthorisationService;\n\n @InjectField() wpTableColumns:WorkPackageViewColumnsService;\n\n @InjectField() wpTableHighlighting:WorkPackageViewHighlightingService;\n\n @InjectField() wpTableSortBy:WorkPackageViewSortByService;\n\n @InjectField() wpTableGroupBy:WorkPackageViewGroupByService;\n\n @InjectField() wpTableFilters:WorkPackageViewFiltersService;\n\n @InjectField() wpTableSum:WorkPackageViewSumService;\n\n @InjectField() wpTableTimeline:WorkPackageViewTimelineService;\n\n @InjectField() wpTableHierarchies:WorkPackageViewHierarchiesService;\n\n @InjectField() wpTablePagination:WorkPackageViewPaginationService;\n\n @InjectField() wpTableOrder:WorkPackageViewOrderService;\n\n @InjectField() wpListService:WorkPackagesListService;\n\n @InjectField() wpListChecksumService:WorkPackagesListChecksumService;\n\n @InjectField() loadingIndicatorService:LoadingIndicatorService;\n\n @InjectField() $transitions:TransitionService;\n\n @InjectField() I18n!:I18nService;\n\n @InjectField() opStaticQueries:StaticQueriesService;\n\n @InjectField() wpStatesInitialization:WorkPackageStatesInitializationService;\n\n @InjectField() cdRef:ChangeDetectorRef;\n\n @InjectField() wpDisplayRepresentation:WorkPackageViewDisplayRepresentationService;\n\n @InjectField() wpIncludeSubprojects:WorkPackageViewIncludeSubprojectsService;\n\n @InjectField() halEvents:HalEventsService;\n\n @InjectField() deviceService:DeviceService;\n\n @InjectField() currentProject:CurrentProjectService;\n\n /** Determine when query is initially loaded */\n queryLoaded = false;\n\n /** Remember explicitly when this component was destroyed */\n destroyed = false;\n\n constructor(public injector:Injector) {\n super();\n }\n\n ngOnInit() {\n // Listen to changes on the query state objects\n this.setupQueryObservers();\n\n // Listen for refresh changes\n this.setupRefreshObserver();\n\n // Mark tableInformationLoaded when initially loading done\n this.setupQueryLoadedListener();\n }\n\n private setupQueryObservers() {\n this.wpTablePagination\n .updates$()\n .pipe(\n this.untilDestroyed(),\n withLatestFrom(this.querySpace.query.values$()),\n ).subscribe(([pagination, query]) => {\n if (this.wpListChecksumService.isQueryOutdated(query, pagination)) {\n this.wpListChecksumService.update(query, pagination);\n this.refresh(true, false);\n }\n });\n\n this.setupChangeObserver(this.wpTableFilters, true);\n this.setupChangeObserver(this.wpTableGroupBy);\n this.setupChangeObserver(this.wpTableSortBy);\n this.setupChangeObserver(this.wpTableSum);\n this.setupChangeObserver(this.wpTableTimeline);\n this.setupChangeObserver(this.wpTableHierarchies);\n this.setupChangeObserver(this.wpTableColumns);\n this.setupChangeObserver(this.wpTableHighlighting);\n this.setupChangeObserver(this.wpTableOrder);\n this.setupChangeObserver(this.wpDisplayRepresentation);\n this.setupChangeObserver(this.wpIncludeSubprojects);\n }\n\n /**\n * Listen to changes in the given service and reload the query / results if\n * the service requests that.\n *\n * @param service Work package query state service to listento\n * @param firstPage If the service requests a change, load the first page\n */\n protected setupChangeObserver(service:WorkPackageQueryStateService, firstPage = false) {\n const queryState = this.querySpace.query;\n\n service\n .updates$()\n .pipe(\n this.untilDestroyed(),\n filter(() => queryState.hasValue() && service.hasChanged(queryState.value!)),\n )\n .subscribe(() => {\n const newQuery = queryState.value!;\n const triggerUpdate = service.applyToQuery(newQuery);\n this.querySpace.query.putValue(newQuery);\n\n // Update the current checksum\n this.wpListChecksumService\n .updateIfDifferent(newQuery, this.wpTablePagination.current)\n .then(() => {\n // Update the page, if the change requires it\n if (triggerUpdate) {\n this.refresh(true, firstPage);\n }\n });\n });\n }\n\n public get projectIdentifier() {\n return this.currentProject.identifier || undefined;\n }\n\n /**\n * Setup the listener for members of the table to request a refresh of the entire table\n * through the refresh service.\n */\n protected setupRefreshObserver() {\n this.halEvents\n .aggregated$('WorkPackage')\n .pipe(\n this.untilDestroyed(),\n filter((events:HalEvent[]) => this.filterRefreshEvents(events)),\n )\n .subscribe((events:HalEvent[]) => {\n this.refresh(false, false);\n });\n }\n\n /**\n * Refresh the set of results,\n * showing the loading indicator if visibly is set.\n *\n * @param A refresh request\n */\n public abstract refresh(visibly:boolean, firstPage:boolean):Promise;\n\n /**\n * Set the loading indicator for this set instance\n * @param promise\n */\n protected abstract set loadingIndicator(promise:Promise);\n\n /**\n * Filter the given work package events for something interesting\n * @param events HalEvent[]\n *\n * @return {boolean} whether any of these events should trigger the view reloading\n */\n protected filterRefreshEvents(events:HalEvent[]):boolean {\n const source:string[] = this.querySpace.renderedWorkPackageIds.value\n || this.querySpace.results.value?.elements.map((el) => el.id as string)\n || [];\n\n const rendered = new Set(source);\n\n for (let i = 0; i < events.length; i++) {\n const item = events[i];\n if (rendered.has(item.id) || item.eventType === 'created') {\n return true;\n }\n }\n\n return false;\n }\n\n protected setupQueryLoadedListener() {\n this\n .querySpace\n .initialized\n .values$()\n .pipe(\n take(1),\n filter(() => !this.componentDestroyed),\n )\n .subscribe(() => {\n this.queryLoaded = true;\n this.cdRef.detectChanges();\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { IToast } from 'core-app/shared/components/toaster/toast.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Injectable()\nexport class WorkPackageNotificationService extends HalResourceNotificationService {\n constructor(readonly injector:Injector,\n readonly apiV3Service:ApiV3Service) {\n super(injector);\n }\n\n public showSave(resource:WorkPackageResource, isCreate = false) {\n const message:any = {\n message: this.I18n.t(`js.notice_successful_${isCreate ? 'create' : 'update'}`),\n };\n\n this.addWorkPackageFullscreenLink(message, resource as any);\n\n this.ToastService.addSuccess(message);\n }\n\n protected showCustomError(errorResource:any, resource:WorkPackageResource):boolean {\n if (errorResource.errorIdentifier === 'urn:openproject-org:api:v3:errors:UpdateConflict') {\n this.ToastService.addError({\n message: errorResource.message,\n type: 'error',\n link: {\n text: this.I18n.t('js.hal.error.update_conflict_refresh'),\n target: () => this.apiV3Service.work_packages.id(resource).refresh(),\n },\n });\n\n return true;\n }\n\n return super.showCustomError(errorResource, resource);\n }\n\n private addWorkPackageFullscreenLink(message:IToast, resource:WorkPackageResource) {\n // Don't show the 'Show in full screen' link if we're there already\n if (!this.$state.includes('work-packages.show')) {\n message.link = {\n target: () => this.$state.go('work-packages.show.tabs', { tabIdentifier: 'activity', workPackageId: resource.id }),\n text: this.I18n.t('js.work_packages.message_successful_show_in_fullscreen'),\n };\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { StateService } from '@uirouter/core';\nimport { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalDeletedEvent, HalEventsService } from 'core-app/features/hal/services/hal-events.service';\n\n@Injectable()\nexport class WorkPackageService {\n private text = {\n successful_delete: this.I18n.t('js.work_packages.message_successful_bulk_delete'),\n };\n\n constructor(private readonly http:HttpClient,\n private readonly $state:StateService,\n private readonly PathHelper:PathHelperService,\n private readonly UrlParamsHelper:UrlParamsHelperService,\n private readonly toastService:ToastService,\n private readonly I18n:I18nService,\n private readonly halEvents:HalEventsService) {\n }\n\n public performBulkDelete(ids:string[], defaultHandling:boolean) {\n const params = {\n 'ids[]': ids,\n };\n const promise = this.http\n .delete(\n this.PathHelper.workPackagesBulkDeletePath(),\n { params, withCredentials: true },\n )\n .toPromise();\n\n if (defaultHandling) {\n promise\n .then(() => {\n this.toastService.addSuccess(this.text.successful_delete);\n\n ids.forEach((id) => this.halEvents.push({ _type: 'WorkPackage', id }, { eventType: 'deleted' } as HalDeletedEvent));\n\n if (this.$state.includes('**.list.details.**')\n && ids.indexOf(this.$state.params.workPackageId) > -1) {\n this.$state.go('work-packages.partitioned.list', this.$state.params);\n }\n })\n .catch(() => {\n const urlParams = this.UrlParamsHelper.buildQueryString(params);\n window.location.href = `${this.PathHelper.workPackagesBulkDeletePath()}?${urlParams}`;\n });\n }\n\n return promise;\n }\n}\n","
    \n \n \n \n\n \n
    \n\n \n\n \n \n \n \n \n \n \n\n\n\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { BehaviorSubject, combineLatest, Observable } from 'rxjs';\nimport { distinctUntilChanged, first } from 'rxjs/operators';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IPrincipal } from 'core-app/core/state/principals/principal.model';\nimport { IAttachment } from 'core-app/core/state/attachments/attachment.model';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { PrincipalsResourceService } from 'core-app/core/state/principals/principals.service';\nimport { PrincipalRendererService } from 'core-app/shared/components/principal/principal-renderer.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { IFileIcon } from 'core-app/shared/components/file-links/file-link-icons/icon-mappings';\nimport {\n getIconForMimeType,\n} from 'core-app/shared/components/file-links/file-link-icons/file-link-list-item-icon.factory';\nimport { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';\nimport { ConfirmDialogOptions } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.modal';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[op-attachment-list-item]',\n templateUrl: './attachment-list-item.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AttachmentListItemComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit {\n @Input() public attachment:IAttachment;\n\n @Input() public index:number;\n\n @Output() public removeAttachment = new EventEmitter();\n\n @ViewChild('avatar') avatar:ElementRef;\n\n static imageFileExtensions:string[] = ['jpeg', 'jpg', 'gif', 'bmp', 'png'];\n\n public text = {\n dragHint: this.I18n.t('js.attachments.draggable_hint'),\n deleteTitle: this.I18n.t('js.attachments.delete'),\n deleteConfirmation: this.I18n.t('js.attachments.delete_confirmation'),\n removeFile: (arg:unknown):string => this.I18n.t('js.label_remove_file', arg),\n };\n\n public get deleteIconTitle():string {\n return this.text.removeFile({ fileName: this.attachment.fileName });\n }\n\n public author$:Observable;\n\n public timestampText:string;\n\n public fileIcon:IFileIcon;\n\n private viewInitialized$ = new BehaviorSubject(false);\n\n constructor(\n private readonly I18n:I18nService,\n private readonly pathHelper:PathHelperService,\n private readonly timezoneService:TimezoneService,\n private readonly confirmDialogService:ConfirmDialogService,\n private readonly principalsResourceService:PrincipalsResourceService,\n private readonly principalRendererService:PrincipalRendererService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.fileIcon = getIconForMimeType(this.attachment.contentType);\n\n const authorId = idFromLink(this.attachment._links.author.href);\n\n if (!this.principalsResourceService.exists(authorId)) {\n this.principalsResourceService.fetchUser(authorId).subscribe();\n }\n\n this.timestampText = this.timezoneService.parseDatetime(this.attachment.createdAt).fromNow();\n\n this.author$ = this.principalsResourceService.lookup(authorId).pipe(first());\n\n combineLatest([\n this.author$,\n this.viewInitialized$.pipe(distinctUntilChanged()),\n ]).pipe(this.untilDestroyed())\n .subscribe(([user, initialized]) => {\n if (!initialized) {\n return;\n }\n\n this.principalRendererService.render(\n this.avatar.nativeElement,\n user,\n { hide: true, link: false },\n { hide: false, size: 'mini' },\n );\n });\n }\n\n ngAfterViewInit():void {\n this.viewInitialized$.next(true);\n }\n\n /**\n * Set the appropriate data for drag & drop of an attachment item.\n * @param evt DragEvent\n */\n public setDragData(evt:DragEvent):void {\n const url = this.downloadPath;\n const previewElement = this.draggableHTML(url);\n\n if (evt.dataTransfer == null) return;\n\n evt.dataTransfer.setData('text/plain', url);\n evt.dataTransfer.setData('text/html', previewElement.outerHTML);\n evt.dataTransfer.setData('text/uri-list', url);\n evt.dataTransfer.setDragImage(previewElement, 0, 0);\n }\n\n public draggableHTML(url:string):HTMLImageElement|HTMLAnchorElement {\n let el:HTMLImageElement|HTMLAnchorElement;\n\n if (this.isImage) {\n el = document.createElement('img');\n el.src = url;\n el.textContent = this.attachment.fileName;\n } else {\n el = document.createElement('a');\n el.href = url;\n el.textContent = this.attachment.fileName;\n }\n\n return el;\n }\n\n private get downloadPath():string {\n return this.pathHelper.attachmentDownloadPath(String(this.attachment.id), this.attachment.fileName);\n }\n\n private get isImage():boolean {\n const ext = this.attachment.fileName.split('.').pop() || '';\n return AttachmentListItemComponent.imageFileExtensions.indexOf(ext.toLowerCase()) > -1;\n }\n\n public confirmRemoveAttachment():void {\n const options:ConfirmDialogOptions = {\n text: {\n text: this.text.deleteConfirmation,\n title: this.text.deleteTitle,\n button_continue: this.text.deleteTitle,\n },\n icon: {\n continue: 'delete',\n },\n dangerHighlighting: true,\n };\n void this.confirmDialogService\n .confirm(options)\n .then(() => { this.removeAttachment.emit(); })\n .catch(() => { /* confirmation rejected */ });\n }\n}\n","\n 0\"\n class=\"spot-list spot-list_compact op-file-list\">\n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnInit,\n} from '@angular/core';\nimport { map, tap } from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { IAttachment } from 'core-app/core/state/attachments/attachment.model';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { AttachmentsResourceService } from 'core-app/core/state/attachments/attachments.service';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\n@Component({\n selector: 'op-attachment-list',\n templateUrl: './attachment-list.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AttachmentListComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public resource:HalResource;\n\n $attachments:Observable;\n\n private get attachmentsSelfLink():string {\n const attachments = this.resource.attachments as unknown&{ href:string };\n return attachments.href;\n }\n\n private get collectionKey():string {\n return isNewResource(this.resource) ? 'new' : this.attachmentsSelfLink;\n }\n\n constructor(\n private readonly timezoneService:TimezoneService,\n private readonly attachmentsResourceService:AttachmentsResourceService,\n ) {\n super();\n }\n\n ngOnInit():void {\n // ensure collection is loaded to the store\n if (!isNewResource(this.resource)) {\n this.attachmentsResourceService.requireCollection(this.attachmentsSelfLink);\n }\n\n const compareCreatedAtTimestamps = (a:IAttachment, b:IAttachment):number => {\n const rightCreatedAt = this.timezoneService.parseDatetime(b.createdAt);\n const leftCreatedAt = this.timezoneService.parseDatetime(a.createdAt);\n return rightCreatedAt.isBefore(leftCreatedAt) ? -1 : 1;\n };\n\n this.$attachments = this\n .attachmentsResourceService\n .collection(this.collectionKey)\n .pipe(\n this.untilDestroyed(),\n map((attachments) => attachments.sort(compareCreatedAtTimestamps)),\n // store attachments for new resources directly into the resource. This way, the POST request to create the\n // resource embeds the attachments and the backend reroutes the anonymous attachments to the resource.\n tap((attachments) => {\n if (isNewResource(this.resource)) {\n this.resource.attachments = { elements: attachments.map((a) => a._links.self) };\n }\n }),\n );\n }\n\n public removeAttachment(attachment:IAttachment):void {\n this.attachmentsResourceService.removeAttachment(this.collectionKey, attachment).subscribe();\n }\n}\n","\n \n \n \n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { UploadFile } from 'core-app/core/file-upload/op-file-upload.service';\nimport { AttachmentsResourceService } from 'core-app/core/state/attachments/attachments.service';\n\n@Component({\n selector: 'op-attachments-upload',\n templateUrl: './attachments-upload.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AttachmentsUploadComponent implements OnInit {\n @Input() public resource:HalResource;\n\n @ViewChild('hiddenFileInput') public filePicker:ElementRef;\n\n public draggingOver = false;\n\n public text = {\n uploadLabel: this.I18n.t('js.label_add_attachments'),\n dropFiles: this.I18n.t('js.label_drop_files'),\n dropFilesHint: this.I18n.t('js.label_drop_files_hint'),\n foldersWarning: this.I18n.t('js.label_drop_folders_hint'),\n };\n\n public maxFileSize:number;\n\n public $element:JQuery;\n\n constructor(readonly I18n:I18nService,\n private readonly attachmentsResourceService:AttachmentsResourceService,\n readonly configurationService:ConfigurationService,\n readonly toastService:ToastService,\n protected elementRef:ElementRef,\n protected halResourceService:HalResourceService) { }\n\n ngOnInit():void {\n this.$element = jQuery(this.elementRef.nativeElement);\n\n void this.configurationService.initialized.then(() => {\n this.maxFileSize = this.configurationService.maximumAttachmentFileSize as number;\n });\n }\n\n public triggerFileInput(event:MouseEvent):boolean {\n this.filePicker.nativeElement.click();\n\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n public onDropFiles(event:DragEvent):void {\n if (event.dataTransfer === null) return;\n\n // eslint-disable-next-line no-param-reassign\n event.dataTransfer.dropEffect = 'copy';\n event.preventDefault();\n event.stopPropagation();\n\n const dfFiles = event.dataTransfer.files;\n const length:number = dfFiles ? dfFiles.length : 0;\n\n const files:UploadFile[] = [];\n for (let i = 0; i < length; i++) {\n files.push(dfFiles[i]);\n }\n\n this.uploadFiles(files);\n this.draggingOver = false;\n }\n\n public onDragOver(event:DragEvent):void {\n if (event.dataTransfer !== null && AttachmentsUploadComponent.containsFiles(event.dataTransfer)) {\n // eslint-disable-next-line no-param-reassign\n event.dataTransfer.dropEffect = 'copy';\n this.draggingOver = true;\n }\n\n event.preventDefault();\n event.stopPropagation();\n }\n\n public onDragLeave(event:DragEvent):void {\n this.draggingOver = false;\n event.preventDefault();\n event.stopPropagation();\n }\n\n public onFilePickerChanged():void {\n const fileList = this.filePicker.nativeElement.files;\n if (fileList === null) return;\n\n const files:UploadFile[] = Array.from(fileList);\n this.uploadFiles(files);\n }\n\n private static containsFiles(dataTransfer:DataTransfer):boolean {\n return dataTransfer.types.indexOf('Files') >= 0;\n }\n\n protected uploadFiles(files:UploadFile[]):void {\n let uploadFiles = files || [];\n const countBefore = files.length;\n uploadFiles = this.filterFolders(uploadFiles);\n\n if (uploadFiles.length === 0) {\n // If we filtered all files as directories, show a notice\n if (countBefore > 0) {\n this.toastService.addNotice(this.text.foldersWarning);\n }\n\n return;\n }\n\n this\n .attachmentsResourceService\n .attachFiles(this.resource, uploadFiles)\n .subscribe();\n }\n\n /**\n * We try to detect folders by checking for either empty types\n * or empty file sizes.\n * @param files\n */\n protected filterFolders(files:UploadFile[]):UploadFile[] {\n return files.filter((file) => {\n // Folders never have a mime type\n if (file.type !== '') {\n return true;\n }\n\n // Files however MAY have no mime type as well\n // so fall back to checking zero or 4096 bytes\n if (file.size === 0 || file.size === 4096) {\n console.warn(`Skipping file because of file size (${file.size}) %O`, file);\n return false;\n }\n\n return true;\n });\n }\n}\n","
    \n \n {{ text.attachments }}\n \n
    \n \n \n \n \n
    \n
    \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component, ElementRef, Input, OnInit,\n} from '@angular/core';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { filter } from 'rxjs/operators';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\nexport const attachmentsSelector = 'attachments';\n\n@Component({\n selector: attachmentsSelector,\n templateUrl: './attachments.html',\n})\nexport class AttachmentsComponent extends UntilDestroyedMixin implements OnInit {\n @Input('resource') public resource:HalResource;\n\n public $element:JQuery;\n\n public allowUploading:boolean;\n\n public destroyImmediately:boolean;\n\n public text:any;\n\n constructor(protected elementRef:ElementRef,\n protected I18n:I18nService,\n protected states:States,\n protected halResourceService:HalResourceService) {\n super();\n\n this.text = {\n attachments: this.I18n.t('js.label_attachments'),\n };\n }\n\n ngOnInit() {\n this.$element = jQuery(this.elementRef.nativeElement);\n\n if (!this.resource) {\n // Parse the resource if any exists\n const source = this.$element.data('resource');\n this.resource = this.halResourceService.createHalResource(source, true);\n }\n\n this.allowUploading = this.$element.data('allow-uploading');\n\n if (this.$element.data('destroy-immediately') !== undefined) {\n this.destroyImmediately = this.$element.data('destroy-immediately');\n } else {\n this.destroyImmediately = true;\n }\n\n this.setupResourceUpdateListener();\n }\n\n public setupResourceUpdateListener() {\n this.states.forResource(this.resource)!.changes$()\n .pipe(\n this.untilDestroyed(),\n filter((newResource) => !!newResource),\n )\n .subscribe((newResource:HalResource) => {\n this.resource = newResource || this.resource;\n });\n }\n\n // Only show attachment list when allow uploading is set\n // or when at least one attachment exists\n public showAttachments() {\n return this.allowUploading || _.get(this.resource, 'attachments.count', 0) > 0;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\n\nimport { AttachmentsComponent } from './attachments.component';\nimport { AttachmentListComponent } from './attachment-list/attachment-list.component';\nimport { AttachmentListItemComponent } from './attachment-list/attachment-list-item.component';\nimport { AttachmentsUploadComponent } from './attachments-upload/attachments-upload.component';\nimport { AuthoringComponent } from './authoring/authoring.component';\n\n@NgModule({\n imports: [\n CommonModule,\n IconModule,\n ],\n declarations: [\n AttachmentsComponent,\n AttachmentListComponent,\n AttachmentListItemComponent,\n AttachmentsUploadComponent,\n\n AuthoringComponent,\n ],\n exports: [\n AttachmentsUploadComponent,\n AttachmentListComponent,\n AttachmentsComponent,\n\n AuthoringComponent,\n AttachmentListItemComponent,\n ],\n})\nexport class OpenprojectAttachmentsModule {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { input } from 'reactivestates';\nimport { Injectable } from '@angular/core';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { take } from 'rxjs/operators';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { HelpTextResource } from 'core-app/features/hal/resources/help-text-resource';\n\n@Injectable({ providedIn: 'root' })\nexport class AttributeHelpTextsService {\n private helpTexts = input();\n\n constructor(private apiV3Service:ApiV3Service) {\n }\n\n /**\n * Search for a given attribute help text\n *\n * @param attribute\n * @param scope\n */\n public require(attribute:string, scope:string):Promise {\n this.load();\n\n return new Promise((resolve, reject) => {\n this.helpTexts\n .valuesPromise()\n .then(() => resolve(this.find(attribute, scope)));\n });\n }\n\n /**\n * Search for a given attribute help text\n *\n */\n public requireById(id:string|number):Promise {\n this.load();\n\n return this\n .helpTexts\n .values$()\n .pipe(\n take(1),\n )\n .toPromise()\n .then(() => {\n const value = this.helpTexts.getValueOr([]);\n return _.find(value, (element) => element.id?.toString() === id.toString());\n });\n }\n\n private load():void {\n this.helpTexts.putFromPromiseIfPristine(() => this.apiV3Service\n .help_texts\n .get()\n .toPromise()\n .then((resources:CollectionResource) => resources.elements));\n }\n\n private find(attribute:string, scope:string):HelpTextResource|undefined {\n const value = this.helpTexts.getValueOr([]);\n return _.find(value, (element) => element.scope === scope && element.attribute === attribute);\n }\n}\n","\n \n \n \n \n\n
    \n
    \n\n 0\"\n [resource]=\"helpText\"\n data-allow-uploading=\"false\"\n >\n \n\n
    \n
    \n \n {{ text.close }}\n \n \n \n \n \n
    \n
    \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, OnInit,\n} from '@angular/core';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HelpTextResource } from 'core-app/features/hal/resources/help-text-resource';\n\n@Component({\n templateUrl: './help-text.modal.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AttributeHelpTextModalComponent extends OpModalComponent implements OnInit {\n readonly text = {\n edit: this.I18n.t('js.button_edit'),\n close: this.I18n.t('js.button_close'),\n };\n\n public helpText:HelpTextResource = this.locals.helpText!;\n\n constructor(\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit() {\n super.ngOnInit();\n\n // Load the attachments\n this\n .helpText\n .attachments\n .$load()\n .then(() => this.cdRef.detectChanges());\n }\n\n public get helpTextLink() {\n if (this.helpText.editText) {\n return this.helpText.editText.$link.href;\n }\n\n return '';\n }\n}\n","\n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Injector,\n Input,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\nimport { AttributeHelpTextsService } from './attribute-help-text.service';\nimport { AttributeHelpTextModalComponent } from './attribute-help-text.modal';\n\nexport const attributeHelpTextSelector = 'attribute-help-text';\n\n@Component({\n selector: attributeHelpTextSelector,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './attribute-help-text.component.html',\n})\nexport class AttributeHelpTextComponent implements OnInit {\n // Attribute to show help text for\n @Input() public attribute:string;\n\n @Input() public additionalLabel?:string;\n\n // Scope to search for\n @Input() public attributeScope:string;\n\n // Load single id entry if given\n @Input() public helpTextId?:string|number;\n\n public exists = false;\n\n readonly text = {\n open_dialog: this.I18n.t('js.help_texts.show_modal'),\n edit: this.I18n.t('js.button_edit'),\n close: this.I18n.t('js.button_close'),\n };\n\n constructor(\n readonly elementRef:ElementRef,\n protected attributeHelpTexts:AttributeHelpTextsService,\n protected opModalService:OpModalService,\n protected cdRef:ChangeDetectorRef,\n protected injector:Injector,\n protected I18n:I18nService,\n ) {\n populateInputsFromDataset(this);\n }\n\n ngOnInit() {\n if (this.helpTextId) {\n this.exists = true;\n } else {\n // Need to load the promise to find out if the attribute exists\n this.load().then((resource) => {\n this.exists = !!resource;\n this.cdRef.detectChanges();\n return resource;\n });\n }\n }\n\n public handleClick(event:Event):void {\n this.load().then((resource) => {\n this.opModalService.show(AttributeHelpTextModalComponent, this.injector, { helpText: resource });\n });\n\n event.preventDefault();\n }\n\n private load() {\n if (this.helpTextId) {\n return this.attributeHelpTexts.requireById(this.helpTextId);\n }\n return this.attributeHelpTexts.require(this.attribute, this.attributeScope);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport { OpenprojectAttachmentsModule } from 'core-app/shared/components/attachments/openproject-attachments.module';\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\n\nimport { AttributeHelpTextComponent } from './attribute-help-text.component';\nimport { AttributeHelpTextModalComponent } from './attribute-help-text.modal';\n\n@NgModule({\n imports: [\n CommonModule,\n OpenprojectModalModule,\n OpenprojectAttachmentsModule,\n IconModule,\n ],\n declarations: [\n AttributeHelpTextComponent,\n AttributeHelpTextModalComponent,\n ],\n providers: [\n ],\n exports: [\n AttributeHelpTextComponent,\n ],\n})\nexport class AttributeHelpTextModule {}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component, ElementRef, OnInit, ViewChild,\n} from '@angular/core';\nimport { NgSelectComponent } from '@ng-select/ng-select';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { IProjectAutocompleterData } from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocompleter.component';\nimport { IProjectAutocompleteItem } from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocomplete-item';\n\ntype SelectItem = { label:string, value:string, selected?:boolean };\n\nexport const autocompleteSelectDecorationSelector = 'autocomplete-select-decoration';\n\n@Component({\n template: `\n \n \n\n \n \n {{ item.label }}\n \n \n `,\n selector: autocompleteSelectDecorationSelector,\n})\nexport class AutocompleteSelectDecorationComponent implements OnInit {\n @ViewChild(NgSelectComponent) public ngSelectComponent:NgSelectComponent;\n\n public options:SelectItem[];\n\n /** Whether we're a multiselect */\n public multiselect = false;\n\n /** Get the selected options */\n public selected:SelectItem|SelectItem[];\n\n /** Get the selected options especially for the project autocompleter */\n public currentProjectSelection:{ id:string, name:string }|{ id:string, name:string }[];\n\n /** The input name we're syncing selections to */\n private syncInputFieldName:string;\n\n /** The input id used for label */\n public labelForId:string;\n\n /** The field key (e.g. status, type, or project) */\n public key:string;\n\n text = {\n placeholder: this.I18n.t('js.placeholders.selection'),\n };\n\n constructor(\n protected elementRef:ElementRef,\n readonly I18n:I18nService,\n ) {\n }\n\n ngOnInit():void {\n const element = this.elementRef.nativeElement as HTMLElement;\n\n // Set options\n this.multiselect = element.dataset.multiselect === 'true';\n this.labelForId = element.dataset.inputId!;\n this.key = element.dataset.key!;\n\n // Get the sync target\n this.syncInputFieldName = element.dataset.inputName!;\n // Add Rails multiple identifier if multiselect\n if (this.multiselect) {\n this.syncInputFieldName += '[]';\n }\n\n // Prepare and build the options\n // Expected array of objects with id, name, select\n const data:SelectItem[] = JSON.parse(element.dataset.options!);\n\n // Set initial selection\n this.setInitialSelection(data);\n if (this.isProjectField()) {\n this.setInitialProjectSelection();\n }\n\n if (!this.multiselect) {\n this.selected = (this.selected as SelectItem[])[0];\n }\n\n this.options = data;\n\n // Unhide the parent\n element.parentElement!.hidden = false;\n }\n\n setInitialSelection(data:SelectItem[]):void {\n this.updateSelection(data.filter((element) => element.selected));\n }\n\n updateSelection(items:SelectItem|SelectItem[]):void {\n this.selected = items;\n items = _.castArray(items);\n\n this.removeCurrentSyncedFields();\n items.forEach((el:SelectItem) => {\n this.createSyncedField(el.value);\n });\n }\n\n createSyncedField(value:string):void {\n const element = jQuery(this.elementRef.nativeElement);\n element\n .parent()\n .append(``);\n }\n\n removeCurrentSyncedFields():void {\n const element = jQuery(this.elementRef.nativeElement);\n element\n .parent()\n .find(`input[name=\"${this.syncInputFieldName}\"]`)\n .remove();\n }\n\n updateProjectSelection(items:IProjectAutocompleteItem|IProjectAutocompleteItem[]):void {\n items = _.castArray(items);\n const mappedItems = items.map(item => {\n const selectedItem:SelectItem = {\n label: item.name,\n value: item.id.toString(),\n selected: true,\n };\n\n return selectedItem;\n });\n\n this.updateSelection(mappedItems);\n }\n\n setInitialProjectSelection():void {\n const items = _.castArray(this.selected);\n if (items.length === 0) return;\n\n if (this.multiselect) {\n this.currentProjectSelection = items.map((item:SelectItem) => ({\n id: item.value,\n name: item.label,\n }));\n } else {\n this.currentProjectSelection = {\n id: items[0].value,\n name: items[0].label,\n };\n }\n }\n\n isProjectField():boolean {\n return this.key === 'project';\n }\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[op-autocompleter-footer-tmp]',\n})\n// A Directive to be used on the option template of\n// ng-select (what will be shown in each row of drop down)\n// it is used when you want to inject a different template\nexport class OpAutocompleterFooterTemplateDirective {\n\n}\n","\n \n : {{search}}\n \n\n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Injector,\n Input,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { NgSelectComponent } from '@ng-select/ng-select';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpInviteUserModalService } from 'core-app/features/invite-user-modal/invite-user-modal.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { AddTagFn } from '@ng-select/ng-select/lib/ng-select.component';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { Subject } from 'rxjs';\nimport { typeFromHref } from 'core-app/shared/components/principal/principal-helper';\nimport { compareByHref } from 'core-app/shared/helpers/angular/tracking-functions';\nimport { filter } from 'rxjs/operators';\n\nexport interface CreateAutocompleterValueOption {\n name:string;\n href:string|null;\n}\n\n@Component({\n templateUrl: './create-autocompleter.component.html',\n selector: 'create-autocompleter',\n styleUrls: ['./create-autocompleter.component.sass'],\n})\nexport class CreateAutocompleterComponent extends UntilDestroyedMixin implements AfterViewInit {\n @Input() public availableValues:CreateAutocompleterValueOption[];\n\n @Input() public appendTo:string;\n\n @Input() public resource:HalResource;\n\n @Input() public model:any;\n\n @Input() public required = false;\n\n @Input() public disabled = false;\n\n @Input() public finishedLoading = false;\n\n @Input() public id = '';\n\n @Input() public classes = '';\n\n @Input() public typeahead?:Subject;\n\n @Input() public hideSelected = false;\n\n @Output() public onChange = new EventEmitter();\n\n @Output() public onKeydown = new EventEmitter();\n\n @Output() public onOpen = new EventEmitter();\n\n @Output() public onClose = new EventEmitter();\n\n @Output() public onAfterViewInit = new EventEmitter();\n\n @Output() public onAddNew = new EventEmitter();\n\n @ViewChild(NgSelectComponent) public ngSelectComponent:NgSelectComponent;\n\n @InjectField() readonly I18n:I18nService;\n\n @InjectField() readonly cdRef:ChangeDetectorRef;\n\n @InjectField() readonly currentProject:CurrentProjectService;\n\n @InjectField() readonly pathHelper:PathHelperService;\n\n public compareByHref = compareByHref;\n\n public text:{ [key:string]:string } = {};\n\n public createAllowed:boolean|AddTagFn = false;\n\n private _openDirectly = false;\n\n constructor(readonly injector:Injector) {\n super();\n\n this.text.add_new_action = this.I18n.t('js.label_create');\n }\n\n ngAfterViewInit() {\n this.onAfterViewInit.emit(this);\n }\n\n public openSelect() {\n if (this.ngSelectComponent) {\n this.ngSelectComponent.open();\n } else {\n // In case the autocompleter was not loaded,\n // do not reset the variable\n return;\n }\n\n this.openDirectly = false;\n }\n\n public closeSelect() {\n this.ngSelectComponent && this.ngSelectComponent.close();\n }\n\n public changeModel(element:HalResource) {\n this.onChange.emit(element);\n }\n\n public opened() {\n // Force reposition as a workaround for BUG\n // https://github.com/ng-select/ng-select/issues/1259\n setTimeout(() => {\n const component = this.ngSelectComponent as any;\n if (this.appendTo && component && component.dropdownPanel) {\n component.dropdownPanel._updatePosition();\n }\n }, 25);\n\n this.onOpen.emit();\n }\n\n public closed() {\n this.openDirectly = false;\n this.onClose.emit();\n }\n\n public keyPressed(event:JQuery.TriggeredEvent) {\n this.onKeydown.emit(event);\n }\n\n public get openDirectly() {\n return this._openDirectly;\n }\n\n public set openDirectly(val:boolean) {\n this._openDirectly = val;\n if (val) {\n this.openSelect();\n }\n }\n\n public focusInputField() {\n this.ngSelectComponent && this.ngSelectComponent.focus();\n }\n}\n","
    \n \n
    \n \n \n
    \n
    \n\n \n\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { NgSelectComponent } from '@ng-select/ng-select';\nimport { DragulaService, Group } from 'ng2-dragula';\nimport { DomAutoscrollService } from 'core-app/shared/helpers/drag-and-drop/dom-autoscroll.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { merge } from 'rxjs';\nimport { setBodyCursor } from 'core-app/shared/helpers/dom/set-window-cursor.helper';\n\nexport interface DraggableOption {\n name:string;\n id:string;\n}\n\n@Component({\n selector: 'draggable-autocompleter',\n templateUrl: './draggable-autocomplete.component.html',\n styleUrls: ['./draggable-autocomplete.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DraggableAutocompleteComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit {\n /** Options to show in the autocompleter */\n @Input() options:DraggableOption[];\n\n /** Should we focus the autocompleter ? */\n @Input() autofocus = true;\n\n /** Order list of selected items */\n @Input('selected') _selected:DraggableOption[] = [];\n\n /** Output when autocompleter changes values or items removed */\n @Output() onChange = new EventEmitter();\n\n /** List of items still available for selection */\n availableOptions:DraggableOption[] = [];\n\n private autoscroll:any;\n\n private columnsGroup:Group;\n\n @ViewChild('ngSelectComponent') public ngSelectComponent:NgSelectComponent;\n\n text = {\n placeholder: this.I18n.t('js.label_add_columns'),\n };\n\n constructor(readonly I18n:I18nService,\n readonly dragula:DragulaService) {\n super();\n }\n\n ngOnInit():void {\n this.updateAvailableOptions();\n\n // Setup groups\n this.columnsGroup = this.dragula.createGroup('columns', {});\n\n // Set cursor when dragging\n this.dragula.drag('columns')\n .pipe(this.untilDestroyed())\n .subscribe(() => setBodyCursor('move', 'important'));\n\n // Reset cursor when cancel or dropped\n merge(\n this.dragula.drop('columns'),\n this.dragula.cancel('columns'),\n )\n .pipe(this.untilDestroyed())\n .subscribe(() => setBodyCursor('auto'));\n\n // Setup autoscroll\n const that = this;\n this.autoscroll = new DomAutoscrollService(\n [\n document.getElementById('content-wrapper')!,\n ],\n {\n margin: 25,\n maxSpeed: 10,\n scrollWhenOutside: true,\n autoScroll(this:any) {\n return this.down && that.columnsGroup.drake.dragging;\n },\n },\n );\n }\n\n ngAfterViewInit():void {\n if (this.autofocus) {\n this.ngSelectComponent.focus();\n }\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n\n this.dragula.destroy('columns');\n }\n\n select(item:DraggableOption|undefined) {\n if (!item) {\n return;\n }\n\n this.selected = [...this.selected, item];\n\n // Remove selection\n this.ngSelectComponent.clearModel();\n }\n\n remove(item:DraggableOption) {\n this.selected = this.selected.filter((selected) => selected.id !== item.id);\n }\n\n get selected() {\n return this._selected;\n }\n\n set selected(val:DraggableOption[]) {\n this._selected = val;\n this.updateAvailableOptions();\n\n this.onChange.emit(this.selected);\n }\n\n opened() {\n // Force reposition as a workaround for BUG\n // https://github.com/ng-select/ng-select/issues/1259\n setTimeout(() => {\n const component = this.ngSelectComponent as any;\n if (component && component.dropdownPanel) {\n component.dropdownPanel._updatePosition();\n }\n }, 25);\n }\n\n private updateAvailableOptions() {\n this.availableOptions = this.options\n .filter((item) => !this.selected.find((selected) => selected.id === item.id));\n }\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[op-autocompleter-header-tmp]',\n})\n// A Directive to be used on the option template of\n// ng-select (what will be shown in each row of drop down)\n// it is used when you want to inject a different template\nexport class OpAutocompleterHeaderTemplateDirective {\n\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[op-autocompleter-label-tmp]',\n})\n// A Directive to be used on the label template of\n// ng-select (what will be shown in the input box after selecting an item)\n// it is used when you want to inject a different template\nexport class OpAutocompleterLabelTemplateDirective {\n\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[op-autocompleter-option-tmp]',\n})\n// A Directive to be used on the option template of\n// ng-select (what will be shown in each row of drop down)\n// it is used when you want to inject a different template\nexport class OpAutocompleterOptionTemplateDirective {\n\n}\n","import { Injectable } from '@angular/core';\nimport { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { map } from 'rxjs/operators';\nimport { ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { ApiV3UserPaths } from 'core-app/core/apiv3/endpoints/users/apiv3-user-paths';\nimport { ApiV3WorkPackagePaths } from 'core-app/core/apiv3/endpoints/work_packages/api-v3-work-package-paths';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { Observable } from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\n@Injectable()\n\nexport class OpAutocompleterService extends UntilDestroyedMixin {\n constructor(\n private apiV3Service:ApiV3Service,\n ) {\n super();\n }\n\n // A method for fetching data with different resource type and different filter\n public loadAvailable(matching:string, resource:resource, filters?:IAPIFilter[], searchKey?:string):Observable {\n const finalFilters:ApiV3FilterBuilder = this.createFilters(filters ?? [], matching, searchKey);\n\n const filteredData = (this.apiV3Service[resource] as\n ApiV3ResourceCollection)\n .filtered(finalFilters).get()\n .pipe(map((collection) => collection.elements));\n return filteredData;\n }\n\n // A method for building filters\n protected createFilters(filters:IAPIFilter[], matching:string, searchKey?:string) {\n const finalFilters = new ApiV3FilterBuilder();\n\n for (const filter of filters) {\n finalFilters.add(filter.name, filter.operator, filter.values);\n }\n if (matching) {\n finalFilters.add(searchKey ?? '', '**', [matching]);\n }\n return finalFilters;\n }\n\n // A method for returning data based on the resource type\n // If you need to fetch our default date sources like work_packages or users,\n // you should use the default method (loadAvailable), otherwise you should implement a function for\n // your desired resource\n public loadData(matching:string, resource:resource, filters?:IAPIFilter[], searchKey?:string) {\n switch (resource) {\n // in this case we can add more functions for fetching usual resources\n default: {\n return this.loadAvailable(matching, resource, filters, searchKey);\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 \n \n\n
    \n \n\n #{{item.id}}\n\n \n\n
    \n
    \n
    \n\n \n
    \n \n {{ item.name }}\n
    \n
    \n\n \n {{ item.name }}\n \n
    \n\n\n \n \n {{item.type?.name }} #{{ item.id }} {{ item.subject || item.name }}\n \n \n\n \n ×\n {{item.name}}\n \n\n","/* We just forward the ng-select outputs without renaming */\n/* eslint-disable @angular-eslint/no-output-native */\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n EventEmitter,\n HostBinding,\n Input,\n NgZone,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport {\n DropdownPosition,\n NgSelectComponent,\n} from '@ng-select/ng-select';\nimport {\n BehaviorSubject,\n merge,\n NEVER,\n Observable,\n of,\n Subject,\n} from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport { GroupValueFn } from '@ng-select/ng-select/lib/ng-select.component';\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpAutocompleterFooterTemplateDirective } from 'core-app/shared/components/autocompleter/autocompleter-footer-template/op-autocompleter-footer-template.directive';\n\nimport { OpAutocompleterService } from './services/op-autocompleter.service';\nimport { OpAutocompleterHeaderTemplateDirective } from './directives/op-autocompleter-header-template.directive';\nimport { OpAutocompleterLabelTemplateDirective } from './directives/op-autocompleter-label-template.directive';\nimport { OpAutocompleterOptionTemplateDirective } from './directives/op-autocompleter-option-template.directive';\n\n@Component({\n selector: 'op-autocompleter',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './op-autocompleter.component.html',\n styleUrls: ['./op-autocompleter.component.sass'],\n providers: [OpAutocompleterService],\n})\n// It is component that you can use whenever you need an autocompleter\n// it has all inputs and outputs of ng-select\n// in order to use it, you only need to pass the data type and its filters\n// you also can change the value of ng-select default options by changing @inputs and @outputs\nexport class OpAutocompleterComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit, OnChanges {\n @HostBinding('class.op-autocompleter') className = true;\n\n @Input() public filters?:IAPIFilter[] = [];\n\n @Input() public resource:resource;\n\n @Input() public model?:any;\n\n @Input() public searchKey?:string = '';\n\n @Input() public defaultData?:boolean = false;\n\n @Input() public focusDirectly?:boolean = true;\n\n @Input() public fetchDataDirectly?:boolean = false;\n\n @Input() public labelRequired?:boolean = true;\n\n @Input() public name?:string;\n\n @Input() public required?:boolean = false;\n\n @Input() public disabled?:string;\n\n @Input() public searchable?:boolean = true;\n\n @Input() public clearable?:boolean = true;\n\n @Input() public addTag?:boolean = false;\n\n @Input() public id = '';\n\n @Input() public accesskey?:number;\n\n @Input() public items?:IOPAutocompleterOption[]|HalResource[];\n\n private items$ = new BehaviorSubject(null);\n\n @Input() public clearSearchOnAdd?:boolean = true;\n\n @Input() public classes?:string;\n\n @Input() public multiple?:boolean = false;\n\n @Input() public openDirectly?:boolean = false;\n\n @Input() public bindLabel?:string;\n\n @Input() public bindValue?:string;\n\n @Input() public markFirst ? = true;\n\n @Input() public placeholder:string = this.I18n.t('js.autocompleter.placeholder');\n\n @Input() public notFoundText:string = this.I18n.t('js.autocompleter.notFoundText');\n\n @Input() public typeToSearchText:string = this.I18n.t('js.autocompleter.typeToSearchText');\n\n @Input() public addTagText?:string;\n\n @Input() public loadingText:string = this.I18n.t('js.ajax.loading');\n\n @Input() public clearAllText?:string;\n\n @Input() public appearance?:string;\n\n @Input() public dropdownPosition?:DropdownPosition = 'auto';\n\n @Input() public appendTo?:string;\n\n @Input() public closeOnSelect?:boolean = true;\n\n @Input() public hideSelected?:boolean = false;\n\n @Input() public selectOnTab?:boolean = false;\n\n @Input() public openOnEnter?:boolean = true;\n\n @Input() public maxSelectedItems?:number;\n\n @Input() public groupBy?:string|(() => string);\n\n @Input() public groupValue?:GroupValueFn;\n\n @Input() public bufferAmount ? = 4;\n\n @Input() public virtualScroll?:boolean;\n\n @Input() public selectableGroup?:boolean = false;\n\n @Input() public selectableGroupAsModel?:boolean = true;\n\n @Input() public searchFn:(term:string, item:any) => boolean;\n\n @Input() public trackByFn ? = null;\n\n @Input() public compareWith ? = (a:unknown, b:unknown):boolean => a === b;\n\n @Input() public clearOnBackspace?:boolean = true;\n\n @Input() public labelForId ? = null;\n\n @Input() public inputAttrs?:{ [key:string]:string } = {};\n\n @Input() public tabIndex?:number;\n\n @Input() public readonly?:boolean = false;\n\n @Input() public searchWhileComposing?:boolean = true;\n\n @Input() public minTermLength ? = 0;\n\n @Input() public editableSearchTerm?:boolean = false;\n\n @Input() public keyDownFn ? = ():boolean => true;\n\n @Input() public typeahead:BehaviorSubject|null = null;\n\n // a function for setting the options of ng-select\n @Input() public getOptionsFn:(searchTerm:string) => Observable;\n\n @Output() public open = new EventEmitter();\n\n @Output() public close = new EventEmitter();\n\n @Output() public change = new EventEmitter();\n\n @Output() public focus = new EventEmitter();\n\n @Output() public blur = new EventEmitter();\n\n @Output() public search = new EventEmitter<{ term:string, items:unknown[] }>();\n\n @Output() public keydown = new EventEmitter();\n\n @Output() public clear = new EventEmitter();\n\n @Output() public add = new EventEmitter();\n\n @Output() public remove = new EventEmitter();\n\n @Output() public scroll = new EventEmitter<{ start:number; end:number }>();\n\n @Output() public scrollToEnd = new EventEmitter();\n\n public active:Set;\n\n public results$:Observable;\n\n public loading$ = new Subject();\n\n @ViewChild('ngSelectInstance') ngSelectInstance:NgSelectComponent;\n\n @ContentChild(OpAutocompleterOptionTemplateDirective, { read: TemplateRef })\n optionTemplate:TemplateRef;\n\n @ContentChild(OpAutocompleterLabelTemplateDirective, { read: TemplateRef })\n labelTemplate:TemplateRef;\n\n @ContentChild(OpAutocompleterHeaderTemplateDirective, { read: TemplateRef })\n headerTemplate:TemplateRef;\n\n @ContentChild(OpAutocompleterFooterTemplateDirective, { read: TemplateRef })\n footerTemplate:TemplateRef;\n\n constructor(\n readonly opAutocompleterService:OpAutocompleterService,\n readonly cdRef:ChangeDetectorRef,\n readonly ngZone:NgZone,\n private readonly I18n:I18nService,\n ) {\n super();\n }\n\n ngOnInit() {\n if (!!this.getOptionsFn || this.defaultData) {\n this.typeahead = new BehaviorSubject('');\n }\n }\n\n ngOnChanges(changes:SimpleChanges):void {\n if (changes.items) {\n this.items$.next(changes.items.currentValue);\n }\n }\n\n ngAfterViewInit():void {\n if (!this.ngSelectInstance) {\n return;\n }\n\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n this.results$ = merge(\n this.items$,\n this.autocompleteInputStream(),\n );\n\n if (this.fetchDataDirectly) {\n this.typeahead?.next('');\n }\n\n if (this.openDirectly) {\n this.ngSelectInstance.open();\n this.ngSelectInstance.focus();\n } else if (this.focusDirectly) {\n this.ngSelectInstance.focus();\n }\n }, 25);\n });\n }\n\n public repositionDropdown() {\n if (this.ngSelectInstance) {\n setTimeout(() => {\n this.cdRef.detectChanges();\n const component = this.ngSelectInstance;\n if (this.appendTo && component && component.dropdownPanel) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access,no-underscore-dangle\n (component.dropdownPanel as any)._updatePosition();\n }\n }, 25);\n }\n }\n\n public opened():void { // eslint-disable-line no-unused-vars\n // Re-search for empty value as search value gets removed\n this.typeahead?.next('');\n this.repositionDropdown();\n this.open.emit();\n }\n\n public getOptionsItems(searchKey:string):Observable {\n return of((this.items as IOPAutocompleterOption[])?.filter((element) => element.name.includes(searchKey)));\n }\n\n public closeSelect():void {\n this.ngSelectInstance?.close();\n }\n\n public openSelect():void {\n this.ngSelectInstance?.open();\n }\n\n public focusSelect():void {\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n this.ngSelectInstance.focus();\n }, 25);\n });\n }\n\n public closed():void {\n this.close.emit();\n }\n\n public changed(val:unknown):void {\n this.change.emit(val);\n }\n\n public searched(val:{ term:string, items:unknown[] }):void {\n this.search.emit(val);\n }\n\n public blured(val:unknown):void {\n this.blur.emit(val);\n }\n\n public focused(val:unknown):void {\n this.focus.emit(val);\n }\n\n public cleared(val:unknown):void {\n this.clear.emit(val);\n }\n\n public keydowned(val:unknown):void {\n this.keydown.emit(val);\n }\n\n public added(val:unknown):void {\n this.add.emit(val);\n }\n\n public removed(val:unknown):void {\n this.remove.emit(val);\n }\n\n public scrolled(val:{ start:number; end:number }):void {\n this.scroll.emit(val);\n }\n\n public scrolledToEnd(val:unknown):void {\n this.scrollToEnd.emit(val);\n }\n\n public highlighting(property:string, id:string):string {\n return Highlighting.inlineClass(property, id);\n }\n\n private autocompleteInputStream():Observable {\n if (!this.typeahead) {\n return NEVER;\n }\n\n return this.typeahead.pipe(\n filter(() => !!(this.defaultData || this.getOptionsFn)),\n distinctUntilChanged(),\n debounceTime(250),\n tap(() => this.loading$.next(true)),\n switchMap((queryString:string) => {\n if (this.defaultData) {\n return this.opAutocompleterService.loadData(queryString, this.resource, this.filters, this.searchKey);\n }\n\n if (this.getOptionsFn) {\n return this.getOptionsFn(queryString);\n }\n\n return NEVER;\n }),\n tap(\n () => this.loading$.next(false),\n () => this.loading$.next(false),\n ),\n );\n }\n}\n","import { NgModule } from '@angular/core';\nimport { NgSelectModule } from '@ng-select/ng-select';\nimport {\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { DynamicModule } from 'ng-dynamic-component';\nimport { CommonModule } from '@angular/common';\nimport { DragulaModule } from 'ng2-dragula';\n\nimport { InviteUserButtonModule } from 'core-app/features/invite-user-modal/button/invite-user-button.module';\nimport { OpenprojectPrincipalRenderingModule } from 'core-app/shared/components/principal/principal-rendering.module';\n\nimport { DraggableAutocompleteComponent } from 'core-app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component';\nimport { ColorsAutocompleterComponent } from 'core-app/shared/components/colors/colors-autocompleter.component';\nimport { WorkPackageAutocompleterComponent } from 'core-app/shared/components/autocompleter/work-package-autocompleter/wp-autocompleter.component';\nimport { TimeEntryWorkPackageAutocompleterComponent } from 'core-app/shared/components/autocompleter/te-work-package-autocompleter/te-work-package-autocompleter.component';\nimport { AutocompleteSelectDecorationComponent } from 'core-app/shared/components/autocompleter/autocomplete-select-decoration/autocomplete-select-decoration.component';\nimport { VersionAutocompleterComponent } from 'core-app/shared/components/autocompleter/version-autocompleter/version-autocompleter.component';\nimport { UserAutocompleterComponent } from 'core-app/shared/components/autocompleter/user-autocompleter/user-autocompleter.component';\nimport { ProjectAutocompleterComponent } from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocompleter.component';\nimport { OpAutocompleterComponent } from 'core-app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component';\nimport { OpAutocompleterOptionTemplateDirective } from 'core-app/shared/components/autocompleter/op-autocompleter/directives/op-autocompleter-option-template.directive';\nimport { OpAutocompleterLabelTemplateDirective } from 'core-app/shared/components/autocompleter/op-autocompleter/directives/op-autocompleter-label-template.directive';\nimport { OpAutocompleterHeaderTemplateDirective } from 'core-app/shared/components/autocompleter/op-autocompleter/directives/op-autocompleter-header-template.directive';\nimport { CreateAutocompleterComponent } from 'core-app/shared/components/autocompleter/create-autocompleter/create-autocompleter.component';\nimport { OpAutocompleterFooterTemplateDirective } from 'core-app/shared/components/autocompleter/autocompleter-footer-template/op-autocompleter-footer-template.directive';\nimport { OpSearchHighlightDirective } from 'core-app/shared/directives/search-highlight.directive';\n\nexport const OPENPROJECT_AUTOCOMPLETE_COMPONENTS = [\n CreateAutocompleterComponent,\n VersionAutocompleterComponent,\n WorkPackageAutocompleterComponent,\n TimeEntryWorkPackageAutocompleterComponent,\n DraggableAutocompleteComponent,\n UserAutocompleterComponent,\n ProjectAutocompleterComponent,\n ColorsAutocompleterComponent,\n AutocompleteSelectDecorationComponent,\n OpAutocompleterComponent,\n OpAutocompleterOptionTemplateDirective,\n OpAutocompleterLabelTemplateDirective,\n OpAutocompleterHeaderTemplateDirective,\n OpAutocompleterFooterTemplateDirective,\n OpSearchHighlightDirective,\n];\n\n@NgModule({\n imports: [\n CommonModule,\n NgSelectModule,\n DragulaModule,\n FormsModule,\n ReactiveFormsModule,\n\n DynamicModule.withComponents(OPENPROJECT_AUTOCOMPLETE_COMPONENTS),\n OpenprojectPrincipalRenderingModule,\n InviteUserButtonModule,\n ],\n exports: OPENPROJECT_AUTOCOMPLETE_COMPONENTS,\n declarations: OPENPROJECT_AUTOCOMPLETE_COMPONENTS,\n})\nexport class OpenprojectAutocompleterModule { }\n","import { IProjectAutocompleteItem, IProjectAutocompleteItemTree } from './project-autocomplete-item';\n\nexport const flattenProjectTree = (\n projectTreeItems:IProjectAutocompleteItemTree[],\n depth = 0,\n):IProjectAutocompleteItem[] => projectTreeItems.reduce(\n (fullList, projectTreeItem) => [\n ...fullList,\n {\n ...projectTreeItem,\n numberOfAncestors: depth,\n // The actual list of ancestors does not matter anymore from this point forward,\n // but to keep typing straightforward for consumers of this component that use mapResultsFn,\n // it is marked as required in the interface.\n ancestors: [],\n },\n ...flattenProjectTree(projectTreeItem.children, depth + 1),\n ],\n [],\n);\n","import { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport {\n IProjectAutocompleteItem,\n IProjectAutocompleteItemTree,\n} from './project-autocomplete-item';\n\nconst insertProjectWithAncestors = (\n tree:IProjectAutocompleteItemTree[],\n project:IProjectAutocompleteItem,\n ancestors:IHalResourceLink[],\n):IProjectAutocompleteItemTree[] => {\n // The project has no ancestors, thus it can become a part of the tree right away.\n if (!ancestors.length) {\n return [\n ...tree,\n {\n ...project,\n children: [],\n },\n ];\n }\n\n const ancestorToFind = ancestors[0];\n const ancestorInTree = tree.find((leaf) => leaf.href === ancestorToFind.href);\n\n if (ancestorInTree) {\n return tree.map((item) => (item === ancestorInTree\n ? { ...item, children: insertProjectWithAncestors(item.children, project, ancestors.slice(1)) }\n : { ...item }));\n }\n\n return [\n ...tree,\n {\n id: idFromLink(ancestorToFind.href),\n name: ancestorToFind.title,\n href: ancestorToFind.href,\n disabled: true,\n children: insertProjectWithAncestors([], project, ancestors.slice(1)),\n },\n ];\n};\n\nexport const buildTree = (\n projects:IProjectAutocompleteItem[],\n):IProjectAutocompleteItemTree[] => projects.reduce(\n // The ancestors are listed from direct parent up to root. We'll build a tree structure for these ancestors here.\n // Some might already exist from other children that added them to the tree, or because they were part of the result\n // list themselves. However, if they're not available yet we'll need to generate them.\n (tree, project) => insertProjectWithAncestors(tree, project, project.ancestors),\n [],\n);\n","import { IProjectAutocompleteItemTree } from './project-autocomplete-item';\n\n// Recursively sort project children and their children by name\nexport const recursiveSort = (projects:IProjectAutocompleteItemTree[]):IProjectAutocompleteItemTree[] => projects\n .map((project) => ({\n ...project,\n children: recursiveSort(project.children),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n","\n \n {{ item.name }}\n \n\n \n {{ item.name }}\n {{ item.disabledReason }}\n \n\n\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n Injector,\n Input,\n Output,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { ID } from '@datorama/akita';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport {\n ApiV3ListFilter,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\n\nimport { IProjectAutocompleteItem } from './project-autocomplete-item';\nimport { flattenProjectTree } from './flatten-project-tree';\nimport { getPaginatedResults } from 'core-app/core/apiv3/helpers/get-paginated-results';\nimport { IProject } from 'core-app/core/state/projects/project.model';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { buildTree } from 'core-app/shared/components/autocompleter/project-autocompleter/insert-in-list';\nimport { recursiveSort } from 'core-app/shared/components/autocompleter/project-autocompleter/recursive-sort';\n\nexport const projectsAutocompleterSelector = 'op-project-autocompleter';\n\nexport interface IProjectAutocompleterData {\n id:ID;\n href:string;\n name:string;\n}\n\n@Component({\n templateUrl: './project-autocompleter.component.html',\n styleUrls: ['./project-autocompleter.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n selector: projectsAutocompleterSelector,\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ProjectAutocompleterComponent),\n multi: true,\n }],\n})\nexport class ProjectAutocompleterComponent implements ControlValueAccessor {\n @HostBinding('class.op-project-autocompleter') public className = true;\n\n @HostBinding('class.op-project-autocompleter_inline')\n public get inlineClass():boolean {\n return this.isInlineContext;\n }\n\n projectTracker = (item:IProjectAutocompleteItem):ID => item.href || item.id;\n\n // Load all projects as default\n @Input() public url:string = this.apiV3Service.projects.path;\n\n @Input() public name = '';\n\n @Input() public focusDirectly = false;\n\n @Input() public openDirectly = false;\n\n @Input() public multiple = false;\n\n @Input() public dropdownPosition:'bottom'|'top'|'auto' = 'auto';\n\n // ID that should be set on the input HTML element. It is used with\n //