{"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,kBACAC,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,qBACAA,mBACAA,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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OAAQA,QACD,EACH,MAAO,CAAC,OAAQ,cACb,EACH,MAAO,CAAC,MAAO,iBAEf,MAAO,CAAC,WAIPppI,SAAwC,KAAoBkO,KAAK/U,aFtBrEq+K,GACFp5K,KAAK,KACJ24K,GAAO,KAEA1gL,OACFohL,gBAAgB9D,IAChBv1K,KAAK,KACJ24K,GAAO,QAAQt4J,SAAS,kDG/ClC,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,gCACA7nB,IAIA,kBACA,iDACAoJ,WAGAxJ,0BACAA,WACAD,6BC3pBAA,sBAAkCyJ,EAAQ,wBCA1C,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,gCACArJ,EAEA,YAEAH,kBACA,uBAEAA,YACAD,YACAC,4BCnSA,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,iDACAoJ,gBAGAxJ,0BACAA,WACAD,6BClSA,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,MACA,qBAEA,WACA,KACA,qBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,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,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,0BACAoJ,WAGAxJ,0BACAA,WACAD,6BClgBA,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,0BACAoJ,WAGAxJ,0BACAA,WACAD","names":["n","I","X","e","this","p","r","i","l","c","A","h","f","Array","a","m","v","C","Math","S","R","isNaN","NaN","toString","u","x","j","E","day_names","abbr_day_names","month_names","abbr_month_names","meridian","w","precision","separator","delimiter","strip_insignificant_zeros","T","unit","format","sign_first","O","M","y","defaultLocale","locale","defaultSeparator","placeholder","fallbacks","translations","missingBehaviour","missingTranslationPrefix","d","D","U","F","join","forEach","W","J","message","scope","replace","count","split","H","setTime","RegExp","G","oe","ie","ce","le","ae","re","call","constructor","addEventListener","visibilityState","activeState$","next","isActive","value","asObservable","factory","subResource","patch","V","Y","z","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","Promise","resolve","capabilities","exists","filters","toJson","_links","project","principal","roles","map","_meta","notificationMessage","raw","http","withCredentials","responseType","users","me","types","Me","update","delta","t","ue","name","apiRoot","queries","withOptionalId","queryFilters","setSchemas","$embedded","filtersSchemas","buildQueryResource","loadWithParams","projects","Se","tt","de","search","ct","createHalResourceOfType","payload","Je","Ke","De","parameterised","be","mapSchemasIntoFilters","paginated","ve","find","withOptionalProject","default","toggleStarred","starred","unstar","star","loadInvolved","_","filter","test","length","B","filtered","getPaginatedResults","L","forTypePayload","type","forPayload","schemaCacheService","updateWorkPackage","updateWorkPackageList","multiState","hasValue","isEqual","$source","Te","Ne","Q","schemas","updateSchemas","K","$","requireAll","loadCollectionsFor","uniq","each","he","filterByTypeaheadOrId","add","Object","sortBy","offset","pageSize","filterUpdatedSince","getAllPaginated","workPackages","versions","Ee","te","ge","fe","Ie","Be","nt","rt","statuses","Re","ke","$configuration","grid","updateImmediately","isAction","options","actionAttribute","isFree","attribute","highlightingMode","addQuery","isNewWidget","widgets","push","removeQuery","queryId","createdAt","sortWidgets","sort","startColumn","showStatusButton","grids","Ot","save","fetchSchema","Yt","authorisationService","initModelAuth","allInScope","boardPath","create","createGrid","PathHelper","projectBoardsPath","forType","set","mt","St","pt","markRead","markUnread","Mt","facet","unread","listPath","backupToken","attachments","At","apiV3CollectionEndpoint","apiV3CustomEndpoint","Lt","ft","ci","Wt","apiV3SingularEndpoint","Ae","st","lt","kt","Pt","Ye","wt","qt","Ct","isNil","collectionFromString","pathHelper","api","v3","apiV3Base","Ut","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","all","loadConfiguration","weekdayService","loadWeekdays","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","capabilities$","isLoggedIn$","setupLegacyDataListeners","currentUserStore","fetchCapabilities","subscribe","capabilitiesForContext$","context","endsWith","hasCapabilities$","castArray","action","hasAnyCapabilityOf$","_user","_isLoggedIn","userId","setupLocale","parseDatetime","configurationService","local","tz","parseDate","parseISODatetime","parseISODate","formattedDate","getDateFormat","inThePast","daysFromToday","startOf","diff","formattedTime","getTimeFormat","formattedDatetime","formattedDatetimeComponents","formattedRelativeDateTime","fromNow","toHours","Number","asHours","toFixed","toDays","asDays","formattedDuration","formattedISODate","formattedISODateTime","isValidISODate","isValid","isValidISODateTime","isNonWorkingDay","isoWeekday","weekdays","day","working","weekdaysService","require","_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","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","website","boards","tableHighlighting","graphWidgets","register","optionalBoostrapComponents","performBootstrap","embeddable","selector","closest","bootstrap","cls","setAttribute","data","menu","target","removeClass","slideUp","off","on","slideDown","addClass","is","withHeadingFoldOutAtBorder","setupDropdownClick","registerEventHandlers","closeOnBodyClick","accessibility","skipContentClickListener","not","trigger","attr","toggleClick","menuIsOpen","isOpen","closing","open","opening","startHover","menuContainer","stopHover","closeAllItems","hover","openDropdowns","close","getElementById","dropdowns","children","tagName","innerHeight","position","top","css","click","isClosed","dontCloseWhenUsing","closeOtherItems","slideAndFocus","removeStoppingOfEventPropagation","unbind","focusFirstInputOrLink","hide","MutationObserver","disconnect","childList","subtree","demo","scrollIntoView","which","getPluginContext","opModalService","services","classes","modals","passwordConfirmation","show","closingEvent","confirmed","password_confirmation","appendTo","text","slideToggle","ajaxComplete","ajaxSend","activeElement","setRequestHeader","ajaxStop","clearTimeout","substr","val","weekNumbers","allowInput","indexOf","console","log","pageIsSubmitted","marginBottom","originalEvent","pageWasEdited","returnValue","currentTarget","serialize","scrollY","abs","sessionStorage","getItem","setItem","key","once","toggle","change","checked","prop","siblings","settingName","newLang","textArea","editor","getData","setData","submit","Date","toISOString","removeAttr","keyup","toLowerCase","checkAll","toggleCheckboxesBySelector","pluginContext","edition","isBimEdition","localStorage","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","capabilitiesPath","upsertMany","self","days","week","query","selectHasCache","fetchWeekdays","selectAll","weekdaysPath","Symbol","prototype","serviceDestroyed","callback","ngOnDestroy","Map","updateCollectionsForWorkPackage","storage","fileLinks","notifications","fetchNotifications","markAsRead","readIAN","markNotificationsAsRead","fetchUser","fetchPrincipals","principalsPath","fetchProjects","collection","selectMany","selectEntity","lookupMany","hasEntity","updateCollection","views","fetchViews","viewsPath","additional","forResource","camelCase","ngOnInit","hidden","selectors","encoder","fromObject","_request","deserialize","resourceClass","preserveNull","deserializer","serializer","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","ye","innerHTML","bcfPathHelper","authorized$","authorizationMap","putFromPromiseIfPristine","extensions","includes","isAllowedTo","Ue","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","viewpointsService","addSuccess","gallery","preview","saveViewpoint","showIndex","selectViewpointInGallery","go","reload","shouldShowGroup","icon","onClick","titleText","galleryPreviewOpen","galleryPreviewClose","onGalleryChanged","index","galleryOptions","setThumbnailProperties","galleryImages","small","medium","big","dynamicThumbnailHeight","max","round","observeCreation","wpCreate","onNewWorkPackage","galleryViewpoints","snapshot","snapshot_data","revitMessageReceivedSource","RevitBridge","hookUpRevitListener","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","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","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","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","setValue","startStr","endStr","title","unsaved_title","component","containerClasses","inputs","hideTableOptions","setPartition","currentPartition","partition","staticQueryName","loadInitialQuery","redirectTo","dynamic","bodyClasses","baseRoute","calendar","ucCalendar","getApi","updateSize","stopAllSubscriptions","setupWorkPackagesListener","initializeCalendar","calendarEventsFunction","alreadyLoaded","updateResults","workPackagesCalendar","currentWorkPackages$","currentProject","buildHeader","events","plugins","selectable","handleDateClicked","eventResizableFromStart","eventDidMount","el","eventResize","updateEvent","eventDrop","eventClick","static","calendarOptions$","openContextMenu","refetchEvents","mapToCalendarEvents","subject","allDay","className","showSave","wasNew","projectedResource","revert","startDate","dueDate","defaults","method","templated","$fetch","requestMethod","$prepare","clone","$callable","extend","$link","$copy","isObject","isArray","$embeddableKeys","defineProperty","enumerable","configurable","$linkableKeys","createLinkedResource","lazy","pop","decodeURIComponent","intercept","handleAuthenticatedRequest","handleExternalRequest","handle","internal_error","handleError","rejection","httpError","status","captureError","errorMessages","captureException","captureMessage","without","getErrors","validationErrors","halInitializer","errorIdentifier","errors","isValidationError","attributeFromLocalizedName","availableAttributes","forValue","dependencies","allowedValues","$initialize","_dependencies","dependency","getFilter","definesAllowedValues","isValueRequired","isResourceValue","loadedAllowedValues","resultingSchema","merge","some","WorkPackage","attrTypes","ancestors","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","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","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","ut","Tt","xt","yt","bi","selectLoading","activeCollection$","dt","xe","selectNotifications$","ze","aggregatedCenterNotifications$","notifications$","notLoaded$","setLoading","sideLoadInvolvedWorkPackages","$t","params$","stateChanged$","updateSelectedNotification","setFilters","onReload","setFacet","selectedNotification","goToCenter","markAllAsRead","openSplitScreen","showNextNotification","selectedNotificationIndex","checkForNewNotifications","activeReloadToast","link","compact","ngOnChanges","highlightClass","currentValue","storeService","and_other_singular","and_other_plural","loading","updated_by_at","buildTranslatedReason","buildActors","buildTime","buildProject","loadWorkPackage","notification","workPackage$","fixedTime","relativeTime$","showDetails","projectClicked","text_for_additional_authors","aggregatedNotifications","actor","actors","uniqBy","reason","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","activeFacet$","activateFacet","mark_all_read","markAllRead","documentReferer","setInitialHtmlTitle","removeTransitionSubscription","$transitions","onSuccess","updateTitleName","changeChangesFromTitle","He","ProjectSelection","customFields","locals","markForCheck","onProjectSelectionSave","goTo","Principal","onPrincipalSave","principalData","isAlreadyMember","closeWithPrincipal","onRoleSave","role","Placeholder","Summary","Message","onMessageSave","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","jobUrl","job_statuses","hooks","_currentProjectService","apiv3Path","dynamicFieldsSettingsPipe","isFieldHidden","hiddenFields","fieldSettingsPipe","use_template","no_template_selected","advancedSettingsLabel","copySettingsLabel","copyableTemplateFilter","template","templateForm","resourcePath","fieldGroups","fieldsFilter","templateOptions","property","isMeta","required","hasDefault","payloadValue","uIRouterGlobals","parent_id","setParentAsPayload","onSubmitted","modalService","pathHelperService","onTemplateSelected","initialPayload","dynamicForm","model","sendNotifications","formUrl","isHiddenField","copy","isPrimaryAttribute","urlService","rules","when","goBack","customBackMethod","backRoutingService","goToOtherState","goBackToDetailsState","backRoute","keepTab","currentDetailsTab","goBackNotToDetailsState","goBackToPreviousState","isDetailsState","goToBaseState","sync","_backRoute","cancel","_saving","saving","editForm","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","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","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","mark_as_read","markAllBelongingNotificationsAsRead","showInMenu","visibleForOthers","showInMenuText","visibleForOthersText","isSave","queryForm","updateStarred","isStarred","changed","updatePublic","isPublic","save_as","label_name","label_visibility_settings","button_save","button_cancel","saveQuery","isBusy","queryNameField","saveQueryAs","queryName","loadingPromise","positionArgs","assign","my","at","onClose","focusAfterClose","afterFocusOn","allowQueryAction","allowAction","allowWorkPackageAction","allowFormAction","initialTab","create_new","divider","configureForm","button_settings","changeFor","getForm","updateStatus","postIcon","postIconTitle","workPackageReadOnly","workPackageStatusBlocked","temporaryEditResource","typedState","activateLabel","deactivateLabel","enabled","onchange","isFullscreen","deactivateZenMode","inZenMode","exit","activateZenMode","eventScope","container","handleEvent","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","canAdd","canReference","halEvents","eventType","wpViewOrder","orderedWorkPackages","isResultEmpty","attachTo","registerSelectAllListener","registerDeselectAllListener","inReference","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","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","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","group","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","reset","FocusHelper","focusElement","requireVisible","addColumn","focusOnFirstError","loadFieldSchema","setInterval","clearInterval","stopEditing","startEditing","hierarchyRowsBuilder","groupedRowsBuilder","plainRowsBuilder","findRenderedRow","renderedRows","builders","buildIndex","initialSetup","redrawTableAndTimeline","performRenderPass","requestAnimationFrame","tbody","result","redrawTable","refreshRows","lastRenderPass","setGroupsCollapseState","performance","now","wpTableHighlight","updates$","switchToManualSorting","wpTableSortBy","wpList","createOrSave","decls","cancelButton","buildCancelButton","buildNew","buttonTexts","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","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","observe$","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","files","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","localeCompare","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","display","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","isBefore","visibleViewportAtCalculationTime","isSameOrAfter","isSameOrBefore","inViewportAndBoundaries","rest","isAfter","deltaX","deltaY","scrollLeft","we","inlineCreateService","Ze","$e","updateRenderedOrder","scrollContainer","Ge","it","ht","It","Rt","di","Ri","wi","getElementsByClassName","pi","findRowIndex","Bt","Qt","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","li","configurationObject","limitedResults","tableSummary","tableSummaryHints","sumVisible","numTableColumns","scrollSyncUpdate","manualSortEnabled","wpTableHoverSync","registerTimeline","getTableAndTimelineElement","tableElement","ndcDynamicInputs$","tab","findTab","wpTabsService","getTab","goToFullScreen","uiSrefBase","canViewWatchers","getDisplayableTabs","route","routeParams","k","P","N","pe","parentHeadline","childrenHeadline","canModifyHierarchy","canAddRelation","childrenQueryProps","Ce","We","Qe","newRelationText","showDescriptionEditForm","showRelationTypesForm","showRelationInfo","handler","removeButton","description_label","toggleDescription","relatedBy","userInputs","availableRelationTypes","startDescriptionEdit","relationDescriptionTextarea","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","Ve","commentsOnly","showAll","togglerText","ot","successfulTransitions","peekTail","qe","et","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","onSubmit","wpLinkedActivities","scrollHeight","setErrors","activityHtmlId","activityNo","activityLabel","loadAuthor","revision","html","showRevision","formattedIdentifier","revision_identifier","revisionLink","committed_revision_link","author","userName","authorName","userActive","userAvatar","avatar","userLabel","innerHtml","domSanitizer","bypassSecurityTrustHtml","dynamicBootstrapper","bootstrapOptionalEmbeddable","Jt","label_created_on","label_updated_on","quote_comment","edit_comment","htmlId","updateCommentText","isComment","isBcfComment","userCanEdit","userCanQuote","shouldHideIcons","focussing","quoteComment","quotedText","finally","focusEditIcon","focused","postedComment","Oi","activityType","ui","latestActivityInfo","latestActivities","jt","ki","Xt","Ht","si","openFile","openFileLocation","removeFileLink","downloadFileLink","floatingText","noViewPermission","removalConfirmation","fileLink","originData","lastModifiedAt","infoTimestampText","fileLinkIcon","mimeType","downloadAllowed","permission","lastModifiedByName","principalRendererService","confirmRemoveFileLink","tn","Oe","infoBox","emptyStorageHeader","storageType","emptyStorageContent","emptyStorageButton","fileLinkErrorHeader","fileLinkErrorContent","connectionErrorHeader","connectionErrorContent","authorizationFailureHeader","authorizationFailureContent","loginButton","linkFile","initializeStorageTypes","storageTypeMap","authorizationState","fileLinks$","fileLinkResourceService","collectionKey","storageInformation","instantiateStorageInformation","showLinkFilesAction","allowEditing$","currentUserService","openStorageLocation","storageFilesLocation","failedAuthorizationInformation","authorizationErrorInformation","emptyStorageInformation","fileLinkErrorInformation","Ci","Fn","authorize","Fe","setAuthorizationCallbackCookie","Li","authorizationFailureActionUrl","fileLinkSelfLink","cookieService","file_links","storages$","storagesResourceService","toast","showAttachmentHeader$","Vt","_i","q","zo","Go","registeredTabs","buildDefaultTabs","displayable","counter","Ko","showCountAsBubble","qo","xi","pn","nn","zt","setWatchStatus","isWatched","toggleWatch","nextStateLink","buttonTitle","buttonClass","buttonId","watchIconClass","useExisting","Kt","Ft","Ei","ti","vt","Dt","ii","getAbsoluteLeftCoordinates","_t","clientX","floor","viewParams","Di","canMoveDates","cursor","displayPlaceholderUnderCursor","onmouseleave","onmousedown","pointerEvents","yi","offsetX","kn","Un","onMouseDown","Ai","onDaysMoved","assignDateValues","Or","onmouseup","vr","disableViewParamsCalculation","onmousemove","Cr","noop","resetCursor","yr","onMouseDownEnd","timelineRendered","refreshView","fr","activeSelectionMode","Ln","un","Xo","getMarginLeftOfLeftSide","cellRenderer","latestRenderInfo","getMarginLeftOfRightSide","getPaddingLeftForIncomingRelationLines","getPaddingRightForOutgoingRelationLines","canConnectRelations","cellElement","wpElement","workPackageTimeline","cellContainer","lazyInit","elementShape","isDuplicatedCell","createAndAddLabels","renderers","milestone","generic","label_children_derived_duration","ganttChartRowHeight","valueOf","zIndex","applyTypeColor","assignDate","forceCursor","backgroundImage","setElementPositionAndSize","checkForActiveSelectionMode","checkForSpecialDisplaySituations","selectionModeStart","background","minWidth","derivedStartDate","derivedDueDate","getNormalizedLabels","renderLabel","renderHoverLabels","renderFieldValue","isParentWithVisibleChildren","inHierarchyMode","marginLeft","withAlternativeLabels","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","getWorkPackagesToCalculateTimelineWidthFrom","dayCountForMarginLeft","isSame","manageCollapsedGroupHeaderCells","allGroupsChanged","shouldManageCollapsedGroupHeaderCells","lastChangedGroup","createCollapsedGroupHeaderCells","removeCollapsedGroupHeaderCells","groupTypesWithHeaderCellsWhenCollapsed","groupedBy","wpTypesToShowInCollapsedGroupHeaders","workPackagesWithGroupHeaderCell","confirmDelete","showAnchorRight","isSortable","confirmDialog","setAsSingleSortCriteria","addSortCriteria","isGroupable","isCurrentlyGroupedBy","setBy","isFirst","isLast","previous","removeColumn","workPackageTimelineTableController","innerHeader","renderLabels","wpTimelineService","renderLabelsDays","renderLabelsWeeks","renderLabelsMonths","renderLabelsQuarters","renderLabelsYears","activeZoomLevel","renderTimeSlices","quarter_number","addLabelCell","setupRelationSubscription","workPackagesWithRelations","renderWorkPackagesRelations","removeRelationElementsForWorkPackage","renderElement","removeAllVisibleElements","renderElements","renderRelation","classNames","finishElement","gridContainer","paddingTop","checkForNonWorkingDayHighlight","toDate","qaSelector","getDate","getMonth","getFullYear","watcher","panelCtrl","isHidden","groupSumsBuilder","totalSums","getRelationTypeFromQuery","configureTable","openTableConfigurationModal","Fi","Mi","fixColumns","shouldHideField","wpEditForm","editMode","ne","buildPayloadFromChanges","vi","qi","buttonClicked","datepickerService","hasRelations$","precedingWorkPackages$","followingWorkPackages$","isParent","isChild","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","getInvolvedWorkPackageIds","en","toggleHierarchy","openMenu","sortColumn","headerColumn","currentSortDirection","setActiveColumnClass","sortable","directionClass","getDirectionClass","isHierarchyColumn","columnType","relationColumnType","columnName","hierarchyIcon","isHierarchyDisabled","setHierarchyIcon","hierarchyToggleEnabled","toggleState","bootstrapAttributeGroups","bootstrapAttributeGroupsCalled","gt","Xi","Wi","Ti","dn","Ki","ln","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","Set","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","storages","observable","updateFocusAnchorLabel","focusAnchorLabel","setupQueryObservers","setupRefreshObserver","setupQueryLoadedListener","setupChangeObserver","filterRefreshEvents","queryLoaded","addWorkPackageFullscreenLink","successful_delete","performBulkDelete","dragHint","destroyConfirmation","removeFile","attachment","fileIcon","principalsResourceService","timestampText","author$","viewInitialized$","setDragData","downloadPath","draggableHTML","dataTransfer","setDragImage","isImage","src","imageFileExtensions","confirmRemoveAttachment","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","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","changeset","mappedDate","setHours","validDate","areDatesEqual","getTime","setCurrentActivatedField","currentlyActivatedDateField","toggleCurrentActivatedField","isStateOfCurrentActivatedField","setDates","currentMonth","datepickerInstance","currentYear","keepCurrentlyActiveMonth","redraw","dateChangedManually$","manualScheduling","today","singleDate","isWritable","dates","initialActivatedField","initializeDatepicker","minimalDateFromPrecedingRelationship","onDataChange","debounceDelay","updateDate","changeSchedulingMode","isSchedulable","datePickerInstance","enforceManualChangesToDatepicker","setToday","reposition","collision","showTodayLink","showFieldAsActive","showMonths","modalContainer","handleDatePickerChange","onDayCreate","dateObj","isDayDisabled","overwriteDatePickerWithNewDates","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","confirmDialogService","history","back","getFormEndPoint","noSettingsSourceErrorMessage","setupDynamicFormFromSettings","setupDynamicFormFromBackend","setupDynamicForm","dynamicFieldsService","changeDetectorRef","cssClass","ckEditorContext","attachmentLabel","onTouch","ckEditorInstance","isReadOnly","onContentChange","onCkeditorSetup","focusTracker","touched","onControlChange","onControlTouch","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","language","content","createWatchdog","toolbar","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","button_trial","upgrade","more_info_text","enterprise_edition","opReferrer","getPristine","updatePristineResource","buildRequestPayload","_pristineResource","proxyGet","setNewDefaults","humanName","valueExists","clearValue","isOverridden","getLinkedValue","minimalPayload","renderEmpty","renderValues","percentLabel","principalRenderer","renderMultiple","setSpanAttributes","attributeName","getText","getAriaLabel","fieldCache","getFieldForCurrentContext","activeChange","getDefaultPlaceholder","getLabelContent","displayName","texts","getSpecificClassFor","createDateDisplayField","showSchedulingMode","shouldHighlight","canOverdue","highlightName","colorize","viewHighlighting","roundedProgress","optionDiv","valueAbridged","take","updateFromChangeset","parseValue","thereAreFormsWithUnsavedChanges","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","withErrors","isErrorenous","inEditMode","messages","createDomOutlet","attachComponentPortal","displayFieldOptions","isDropTarget","displayPlaceholder","displayContainer","activateIfEditable","getSelection","anchorNode","changeMap","changesets","commit","newChangeset","unknownAttribute","fieldType","getClassFor","defaultFieldType","addSpecificFieldType","extendFieldType","se","_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","Pe","requests","onValueSelected","getCurrentValue","rawValue","initialContent","colorClass","currentStatusCode","availableStatuses","referenceOutputs","recentWorkPackageIds","time_entries","sortValuesByRecentIds","showDatePickerModal","currentStartDate","currentDueDate","text_no_start_date","text_no_due_date","fi","setUrl","loadFormAndSetUrl","validity","valid","toLocaleString","useGrouping","maximumFractionDigits","unescape","UNESCAPED_EXPRESSION","ESCAPED_EXPRESSION","translatedValue","wpId","charAt","toUpperCase","derivedPropertyName","derivedValue","renderActual","renderDerived","derivedValueString","derivedText","logTime","appendTimelogLink","timeEntryCreateService","showTimelogWidget","showWorkPackageField","addHighlight","renderAbridgedValues","uiStateBuilder","innerText","oi","Ii","Tn","Si","ei","wn","Gi","gi","clazz","showErrorMessage","internalID","errorsID","descriptionID","ngControl","control","showValidationErrorOn","invalid","formGroupDirective","_formGroupDirective","renameWidget","setChangesetOptions","resourceChanged","hostVars","setupListener","wrapElement","appendIframe","modalBody","modalClassName","openingEvent","portalHostElement","closeOnEscape","closeOnEscapeFunction","activeModal","button_continue","dangerHighlighting","defaultTo","passedData","closeByEscape","closeByDocument","showClose","confirmAndClose","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","workPackageLabel","singleWorkPackage","singleWorkPackageChildren","childCount","hasChildren","childUnits","deletesChildren","mustConfirmChildren","childrenDeletionConfirmed","confirmDeletion","busy","blockedDueToUnconfirmedChildren","WorkPackageService","baseUrl","menuItems","onStart","isOpening","activeMenu","linkForAction","copyLink","bulkCopyLink","isPermitted","permittedActionKeys","permittedActionsWithLinks","getPermittedPluginActions","WorkPackageContextMenuHelper","selectedWorkPackages","allowSplitScreenActions","additionalPositionArgs","deleteSelectedWorkPackages","editSelectedWorkPackages","copySelectedWorkPackages","logTimeForSelectedWorkPackage","permittedActions","random","openOnClick","relatedTarget","calendarContainer","inputElement","dateInput","datepickerElemIdentifier","reshowTimeout","visibleAndActive","datepickerTarget","hideDuringScroll","setDate","isInViewport","datepickerCont","bottom","clientHeight","clientWidth","getWeek","datepickerFormat","defaultDate","shorthand","longhand","weekAbbreviation","rangeSeparator","initialDates","initialValue","resolveDateArrayToString","resolveDateStringToArray","onKeyDown","canceled","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","color","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","buttons","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","activeItemID$","selectPreviousResult","selectNextResult","activateSelectedResult","containerId","onValueChanged","valueChanged","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","addWarning","createAttachmentUploadToast","addLoading","createLoadingToast","showUserPath","condition","minimumOffsetForNewSwitchInMs","throttleAndCheckIfAllowedFocusChangeBasedOnTimeout","lastFocusSwitch","checkIfAllowedFocusChange","lastPriority","getFocusableElement","FOCUSABLE_SELECTORS","thead","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","scrollX","scrollTo","pageXOffset","pageYOffset","insertBefore","escapeListener","containers","member","setupAutoscroll","initializeDrake","addScrollContainer","getMember","revertOnSpill","removeOnSpill","mirrorContainer","ignoreInputTextSelection","debouncer","emitter","setSelectionRange","rangeParent","createRange","setStart","rangeOffset","startOffset","caretRangeFromPoint","onStateChange","input","checkedChange","indeterminate","onEscape","_open","closeEventListener","alignment","onBodyClick","onParentClick","onInputFocus","inputFocus","onInputBlur","inputBlur","ngContentSelectors","TopLeft","onRemoveChip","alert","checkboxValueString","checkboxValue","production","b","Z","gridEndRow","gridEndColumn","storedGuid","newGuid","widget","moveRight","moveLeft","growColumn","overlaps","rowOverlaps","columnOverlaps","startColumnOverlaps","writeAreaChangeToWidget","copyDimensionsTo","ee","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","_e","je","moveSubsequentRowWidgets","addRow","columnWidgets","moveSubsequentColumnWidgets","resetAreas","gridResource","removeWidget","renamed","onRenamed","layout","area","removeItem","menuItemList","getOrderedDaysData","localeData","Le","Xe","weekDay","originalIndex","getOriginalIndex","getCheckedValuesInOriginalOrder","validDays","bt","displayedDays","daysOriginalCheckedValues","timeEntriesCurrentUserConfigurationModalService","configureItem","onConfigured","Et","ni","mr","gr","Xr","xr","hiddenDays","contentHeight","slotEventOverlap","slotLabelInterval","labelIntervalHours","slotLabelFormat","ai","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","addEvent","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","graphConfiguration","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","group_by","chart_type","currentChartType","initializeAvailableGroups","initializeAvailableChartType","availableChartTypes","project$","availableGroupBy","additionalFilter","setQueryProps","graphParams","graphConfigurationService","sortedDatasets","displayModeSingle","propsBoth","propsOpen","propsClosed","baseProps","subprojectId","displaySingle","embeddedGraphSingle","embeddedGraphMulti","Rn","initializeChangeset","valueChanged$","reinitialize","rawText","textValue","setupVariables","currentRawText","clickedElementIsLinkWithinDisplayContainer","textEmpty","memorizeRawText","memorizeCustomText","customText","sanitization","htmlText","Ji","loadAndRender","loadProjectSchema","Yi","loadSchema","activityName","editTimeEntry","timeEntryEditService","deleteIfConfirmed","rows","Nt","projectListParams","viewAll","memberships","listMembersParams","partitionEntriesByRole","sortUsersByName","totalMembers","listAvailableProjectsParams","membersAddable","entriesByRoles","moreMembersText","properties","loadChildren","OpenProjectMyAccountModule","Na","OpenProjectInAppNotificationsModule","Ha","OpenprojectProjectsModule","abstract","inherit","squash","OpenprojectApiDocsModule","OpenprojectBoardsModule","OpenprojectIFCModelsModule","OpenprojectBacklogsModule","OpenprojectReportingModule","OpenProjectJobStatusModule","TeamPlannerModule","OpenprojectCalendarModule","Mr","Ja","router","stateService","Ya","onEnter","Ir","ea","onExit","start_onboarding_tour","MiniProfiler","pageTransition","$$state","Cm","Er","Ka","Bn","useHash","strictMode","encode","decode","equals","pattern","ec","Qn","full_view","setWorkPackageScopeProperties","displayWatchButton","es","tc","Ar","wpDisplayRepresentationService","Bi","ts","Gt","card","ji","detectView","sa","transitionListener","transitions","activeState","listState","openDetailsView","openListView","ns","zoomIn","zoomOut","zoomAuto","isMaxLevel","maxZoomLevel","isMinLevel","minZoomLevel","toggleTimeline","enableAutoZoom","getAutoZoomToggleClass","os","wpViewCollapsedGroups","ss","rs","fc","ia","stateName$","Pc","vc","hn","Tc","_n","Nn","gc","Dc","Jn","Pn","Wc","_c","qa","ra","Ga","mc","hc","Yn","_searchTerm","_currentTab","_projectScope","_resultsHidden","loadGonData","available_search_types","search_term","current_tab","project_scope","global_search","submitSearch","searchPath","projectScope","searchQueryParams","isAfterSearch","$i","$n","Lc","upsale_text","Uc","eligibleWidgets","chosenWidget","trackWidgetBy","widgetsService","registered","as","moveOneDown","firstAreaToMove","sn","setupMousedOverAreaSubscription","mousedOverAreaObserver","currentlyDragging","placeholderArea","updateArea","draggedArea","moveAreasOnDragging","copyPositionButRestrict","isDropOnlyArea","isDragged","isPassive","draggedHeight","offsetHeight","unchangedSize","rn","resizedArea","targetIds","moving","isTarget","isResized","currentlyResizing","isAllowed","mn","isAddable","resize","addLine","setMaxWidth","gn","i18nNamespace","html_title","renderer","gridInitialization","gridScopePath","setHtmlTitle","xn","Zr","uiWidgets","handleKeyboardEvent","widgetComponent","widgetComponentInput","widgetComponentOutput","gridStyle","GRID_GAP_DIMENSION","GRID_AREA_HEIGHT","identifyGridArea","bypassSecurityTrustStyle","En","areas","Vn","nl","Hn","created_by","workPackageLink","cs","previewModal","modalElement","closeAfterTimeout","mouseInModal","isMouseOverPreview","zn","Kn","dl","Gn","qn","ml","Xn","fl","quickSearch","projectSearch","help","moreMenu","showHelpModal","globalAction","projectScoped","accessKey","focusPrevItem","focusNextItem","shortcuts","clickLink","MouseEvent","bubbles","cancelable","focusItemOffset","eo","Hi","loadRequiredScripts","an","On","io","spawnModal","ri","no","getClassListForItem","oo","lackingPermission","lackingPermissionInfo","noInviteRights","nextButton","xl","projectAndTypeForm","typeControl","projectControl","setPlaceholderOption","projectInviteCapabilities","typeOptions","eeHref","markAsDirty","projectFilterFn","disabledReason","ds","wr","Vi","loadPrincipalData","Zl","emailRegExp","email","alreadyAMember","inviteNewUser","createNewPlaceholder","PlaceholderUser","canInviteByEmail$","canCreateNewPlaceholder$","showAddTag","createNewFromInput","createNew","jl","nonMembers","Fr","ps","Jl","fn","viewToModelUpdate","Email","inviteUser","backButton","userDynamicFields","principalForm","principalControl","dynamicFieldsControl","isNewPrincipal","hasPrincipalSelected","so","Zt","userDynamicFieldConfig","onValidatedSubmit","isMemberOfCurrentProject","us","ua","_a","noRolesFound","roles$","hs","roleForm","roleControl","_s","messageForm","messageControl","ms","projectLabel","principalLabel","roleLabel","messageLabel","invite","createPrincipal","td","placeholder_users","gs","fs","ro","kl","yl","wl","da","bl","labelText","groupLabelText","addUserMenuItem","addLoginMenuItem","goToSettings","In","invalid_email","taken_email","taken_domain","baseUrlAugur","augur_url","tokenVersion","token_version","ee_trial_key","setMailSubmittedStatus","sendForm","vs","userData$","cancelled","trialLink","saveTrialKey","retryConfirmation","getToken","token_retrieved","saveToken","token","resendLink","resend","trial_key","enterprise_token","encoded_token","modalOpen","setStartTrialStatus","mailSubmitted","domainTaken","emailTaken","emailError","emailInvalid","errorMsg","Zi","ao","onActivate","navigationEvents$","recreateToggler","wrapMainItem","wrap","wrapInner","contents","before","vn","br","showEEOnlyHint","Cn","editedName","saveEdition","leaveEditingMode","onValueChange","co","custom_field","rename","removeFromGroup","removeAttribute","Cs","fa","drag_to_activate","label_group","new_group","label_inactive","add_group","add_table","no_filter_query","noFilterQuery","updateHiddenFields","groupsDrake","attributeDrake","activeGroups","inactives","inactiveAttributes","ga","dd","deactivateAttribute","updateInactives","addGroupAndOpenQuery","editQuery","typeBanner","timelines","externalRelationQuery","deleteGroup","resetToDefault","translation","emptyGroup","lo","edit_query","bs","po","Tr","kr","ws","Ts","inlineCreateEnabled","withFilters","showFilterButton","filterButtonText","globalSearchService","searchTerm$","projectScope$","wpFilters","resultsHidden$","resultsHidden","uo","onKey","currentKey","fieldValue","currentFieldValue","selectedOperator","operators","visibleValue","toggleValueVisibility","valueVisible","updateDbValue","updateField","ks","toggleCollapsed","cn","uiOptions","board","create_new_board","mainMenuService","focusBackArrow","showNewBoardModal","Od","Ps","xs","progressBar","progressPercentage","file","mi","updateProgress","completed","Es","removable","canBeHidden","$d","executeTarget","onUploadSuccess","uploadCount","done","Os","Ms","textareaSelector","formElement","wrappedTextArea","$attachmentsElement","markEdited","setup","setupAttachmentAddedCallback","setupAttachmentRemovalSignal","addUploadedAttachmentsToForm","setLabel","_p","Pi","downloadLocation","fire","toArray","Is","ba","$targetNotification","getTargetNotification","Ss","displayed","removeHiddenOnSubmit","section","yn","sectionName","hideSection","hideSectionService","Ds","optValue","hideSecWithName","prev","HideSection","As","option","js","Zs","clickTarget","clipboardTarget","addNotification","queryCommandSupported","execCommand","Rs","autocompleteWorkPackages","all_projects","current_project_and_all_descendants","search_dots","close_search","toggleTopMenuClass","unregister","btn","toggleMobileSearch","submitNonEmptySearch","redirectToWp","wpPath","Ta","openCloseMenu","term","selectedItem","clearSearch","onEnterBeforeResultsLoaded","followSelectedItem","searchInScope","currentScope","statusHighlighting","followItem","customSearchFn","markable","queryWithoutHash","fetchSearchResults","searchResultsToOptions","setMarkedOption","detailedSearchOptions","itemsList","markItem","selectedItems","replaceState","unregisterGlobalListener","qaSearchOpen","Fs","Br","sectionTitle","sectionBody","Ws","ho","zp","singular","plural","Pa","toggleDropModal","dropModalOpen","currentProjectName","allProjectsPath","newProjectPath","Ls","Qr","htmlMode","Nr","updater","Accept","remoteFieldKey","HTMLInputElement","Us","scope_default","scope_starred","scope_global","scope_private","search$","apiViewType","initializeAutocomplete","views$","viewCategories$","zi","matchesText","collapsible","updateMenuOnChanges","initializeViews","private","viewsService","toOpSideMenuItem","project_and_subprojects","search_for","in","projectText","searchTitle","_o","currentTabSub","currentTab$","tabsSub","tabs$","Bs","Ur","Mu","bn","loadEntry","deleteTimeEntry","Qi","not_found","Sn","cache$","Fu","Dn","getDisplayFieldInstance","displayClass","displayFieldContext","containerType","mo","invalid_attribute","resourceLoader","markError","Ns","attrs","loadResourceAttribute","Js","Ku","detailed","Pr","$s","triggerBackup","backups","An","note","lastBackup","lastBackupFrom","includeAttachments","downloadBackup","requestBackup","attachmentsDisabled","jobStatusId","lastBackupDate","lastBackupAttachmentId","mayIncludeAttachments","backupTokenInput","isDownloadReady","getDownloadUrl","includeAttachmentsDefault","includeAttachmentsTitle","opBackup","sh","eeTrialService","host","hostName","formBuilder","company","userData","first_name","last_name","domain","configuredHost","general_consent","newsletter_consent","link_terms","Ia","link_privacy","label_test_ee","label_company","label_first_name","label_last_name","label_email","label_domain","domain_mismatch","privacy_policy","receive_newsletter","terms_of_service","checkMailField","trialForm","controls","fo","label_expires_at","label_maximum_users","label_starts_at","label_subscriber","text_expired","text_reprieve_days_left","Da","subscriber","formatUserData","Gon","getUserDataFromAugur","Vs","confirmation_info","resend_success","resend_warning","session_timeout","status_confirmed","status_label","status_waiting","resendMail","vo","button_submit","heading_confirmation","heading_next_steps","heading_test_ee","quick_overview","trustedEEVideoURL","trustedURL","formComponent","addControl","startEnterpriseTrial","headerText","trialStarted","closeModal","bypassSecurityTrustResourceUrl","openWindow","Co","button_book","link_quote","email_not_received","confidence","try_another_email","openTrialModal","Hs","zs","userCount","startsAt","expiresAt","isExpired","reprieveDaysLeft","Ks","newFeatures","descriptionNewFeatures","learnAbout","isStandardEdition","translated","list_styling_class","bcf_api_link","Gs","titleData$","yo","$form","openConfirmationDialog","qs","Xs","externalQuery","er","o_","Za","activeWindow","polling$","unreadCount$","tr","p_","u_","Vr","ir","notificationsByProject","notificationsByReason","projectsFilter","Ni","projectsFilter$","nr","projectsForNotifications$","projectHasParent","ianResourceService","Fa","Jr","Yr","$r","Wa","bo","ianMenuService","notificationsByProject$","notificationsByReason$","baseMenuItems","or","create_new_team_planner","sr","create_new_calendar","rr","C_","va","wa","jr","Rr","Ea","Ma","wo","k_","field_description","confirm_button","password","passwordValuePresent","passwordConfirmationField","To","Ui","externalQueryConfiguration","ja","externalRelationQueryConfiguration","ma","Lr","Qs","y_","w_","htmlSanitizeService","ckEditorPreview","b_","La","idFromLink","dynamicContent","T_","HalResource","DisplayField","Hr","DomAutoscrollService","_knownHookNames","runInZone","zone","run","Ua","ko","listen","buildRefreshRequest","element_id","fixed_date","jn","Po","O_","Ba","E_","M_","xo","loadIfNecessary","showCosts","renderCostAsLink","renderCostAsText","costType","spentUnits","addSeparator","parseFloat","Qa","I_","workPackageSingleContextMenu","workPackageTableContextMenu","atob","Uint8Array","Blob","FileReader","getContext","drawImage","toDataURL","D_","A_","readAsDataURL","Eo","label_choose_avatar","upload_instructions","error_too_large","wrong_file_format","button_update","uploading","avatarFilePicker","j_","avatarFile","avatarPreviewUrl","fileInvalid","uploadAvatar","progress","ar","Oo","U_","L_","Mo","sanitizeBranchString","formattingInput","sanitizeShellInput","branchName","commitMessage","gitCommand","Io","J_","copyButtonHelpText","copyResult","success","textToCopy","gitActions","onCopyButtonClick","N_","lastCopyResult","copiedSnippetId","showCopyResult","cr","Y_","lr","createPrButtonLabel","createPrButtonDescription","gitMenuLabel","gitMenuDescription","label_created_by","label_last_updated_on","label_details","label_actions","pullRequest","draft","merged","checkRunStateText","outputTitle","conclusion","checkRunState","checkRunStateIcon","pr","github_pull_requests","pullRequests","changeDetector","getEmptyText","wp_id","ur","hr","im","sortList","So","Q_","github","Do","Ao","zr","cm","fetchDays","daysPath","jo","Zo","rm","am","lm","ngDoBootstrap","_injector","Ro","od","sm","sd","vd","gl","om","dm","contextHooks","hookPromises","qr","loadSentry","dsn","tracingFactor","Sentry","debug","Gr","release","environment","integrations","Integrations","BrowserTracing","tracesSampler","transactionContext","op","ignoreErrors","beforeSend","_r","filterEvent","sentryLoaded","client","configureScope","setupContext","withScope","hm","setTag","hostname","setExtra","originalException","filterHttpError","_m","loadAppsignal","sendError","pushKey","Appsignal","namespace","use","networkPlugin","url_path","url_query","setTags","handleOfflineMessage","Kr","mm","gm","enableReactiveStatesLogging","disableReactiveStatesLogging","firstWeekOfYear","dow","doy","pluralization","um","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/capability-cache.service.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/api-v3-work-package-paths.ts","./src/app/core/apiv3/endpoints/work_packages/apiv3-work-package-form.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/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/global-listeners/action-menu.ts","./src/app/core/setup/globals/global-listeners/top-menu.ts","./src/app/core/setup/globals/onboarding/helpers.ts","./src/app/core/setup/globals/tree-menu.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/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/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/is-defined-entity.ts","./src/app/core/state/resource-collection.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/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/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/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/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-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/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-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/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/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/shared/components/datepicker/datepicker.modal.service.ts","./src/app/shared/components/datepicker/datepicker.modal.html","./src/app/shared/components/datepicker/datepicker.modal.ts","./src/app/core/forms/forms.service.ts","./src/app/shared/components/dynamic-forms/services/dynamic-fields/dynamic-fields.service.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/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/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/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/forms/checkbox-field/checkbox-field.component.html","./src/app/shared/components/forms/checkbox-field/checkbox-field.component.ts","./src/app/shared/components/forms/form-field/form-field.component.html","./src/app/shared/components/forms/form-field/form-field.component.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-header.component.html","./src/app/shared/components/modal/modal-header.component.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/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/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/slide-toggle/slide-toggle.component.ts","./src/app/shared/components/slide-toggle/slide-toggle.component.html","./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/helpers/url-helpers.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/text-field/text-field.component.html","./src/app/spot/components/text-field/text-field.component.ts","./src/app/spot/components/toggle/toggle.component.html","./src/app/spot/components/toggle/toggle.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/components/filter-chip/filter-chip.component.html","./src/app/spot/components/filter-chip/filter-chip.component.ts","./src/app/spot/spot-docs.component.ts","./src/app/spot/spot-docs.component.html","./src/app/spot/spot.routes.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/principal/principal-search.component.html","./src/app/features/invite-user-modal/principal/principal-search.component.ts","./src/app/shared/components/forms/form-field/form-binding.directive.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/role/role-search.component.html","./src/app/features/invite-user-modal/role/role-search.component.ts","./src/app/features/invite-user-modal/role/role.component.html","./src/app/features/invite-user-modal/role/role.component.ts","./src/app/features/invite-user-modal/message/message.component.ts","./src/app/features/invite-user-modal/message/message.component.html","./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/enterprise-trial.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/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/shared/helpers/i18n/localized-link.ts","./src/app/features/enterprise/enterprise-modal/enterprise-trial-form/ee-trial-form.component.html","./src/app/core/setup/globals/components/admin/backup.component.html","./src/app/features/enterprise/enterprise-modal/enterprise-trial-form/ee-trial-form.component.ts","./src/app/features/enterprise/enterprise-active-trial/ee-active-trial.base.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-modal/enterprise-trial.modal.html","./src/app/features/enterprise/enterprise-modal/enterprise-trial.modal.ts","./src/app/features/enterprise/enterprise-base.component.html","./src/app/features/enterprise/enterprise-base.component.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/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.ts","./src/app/shared/components/modals/confirm-form-submit/confirm-form-submit.directive.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/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/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 { CapabilityResource } from 'core-app/features/hal/resources/capability-resource';\nimport { ApiV3Resource } from 'core-app/core/apiv3/cache/cachable-apiv3-resource';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { ApiV3CapabilitiesPaths } from 'core-app/core/apiv3/endpoints/capabilities/apiv3-capabilities-paths';\n\nexport class ApiV3CapabilityPaths extends ApiV3Resource {\n protected createCache():StateCacheService {\n return (this.parent as ApiV3CapabilitiesPaths).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 { CapabilityResource } from 'core-app/features/hal/resources/capability-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\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 CapabilityCacheService extends StateCacheService {\n @InjectField() readonly states:States;\n\n constructor(readonly injector:Injector, state:MultiInputState) {\n super(state);\n }\n\n updateValue(id:string, val:CapabilityResource):Promise {\n this.putValue(id, val);\n return Promise.resolve(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 { ApiV3CapabilityPaths } from 'core-app/core/apiv3/endpoints/capabilities/apiv3-capability-paths';\nimport { CapabilityResource } from 'core-app/features/hal/resources/capability-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 { 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 { CapabilityCacheService } from 'core-app/core/apiv3/endpoints/capabilities/capability-cache.service';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\n\nexport class ApiV3CapabilitiesPaths\n extends ApiV3Collection\n implements ApiV3ListResourceInterface {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'capabilities', ApiV3CapabilityPaths);\n }\n\n /**\n * Load a list of capabilities 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 protected createCache():StateCacheService {\n return new CapabilityCacheService(this.injector, this.states.capabilities);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\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 protected createCache():StateCacheService {\n return (this.parent as ApiV3WorkPackagesPaths).cache;\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:HalSource):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 { 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';\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]]] });\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 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';\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/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/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';\nimport { WeekdayService } from 'core-app/core/days/weekday.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 readonly weekdayService:WeekdayService,\n ) {\n this.initialized = Promise\n .all([\n this.loadConfiguration(),\n this.weekdayService.loadWeekdays().toPromise(),\n ])\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 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 {\n filterNilValue,\n Query,\n} 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 capabilities$ = this.select('capabilities').pipe(filterNilValue());\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 distinctUntilChanged,\n map,\n take,\n} from 'rxjs/operators';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { CapabilityResource } from 'core-app/features/hal/resources/capability-resource';\nimport { FilterOperator } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport {\n CurrentUser,\n CurrentUserStore,\n} from './current-user.store';\nimport { CurrentUserQuery } from './current-user.query';\nimport { getPaginatedResults } from 'core-app/core/apiv3/helpers/get-paginated-results';\n\n@Injectable({ providedIn: 'root' })\nexport class CurrentUserService {\n constructor(\n private apiV3Service:ApiV3Service,\n private currentUserStore:CurrentUserStore,\n private currentUserQuery:CurrentUserQuery,\n ) {\n this.setupLegacyDataListeners();\n }\n\n public capabilities$ = this.currentUserQuery.capabilities$;\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) {\n this.currentUserStore.update((state) => ({\n ...state,\n ...user,\n }));\n\n this.fetchCapabilities([]);\n }\n\n /**\n * Fetch all capabilities for certain contexts\n */\n public fetchCapabilities(contexts:string[] = []) {\n this.user$.pipe(take(1)).subscribe((user) => {\n if (!user.id) {\n this.currentUserStore.update((state) => ({\n ...state,\n capabilities: [],\n }));\n\n return;\n }\n\n const filters:[string, FilterOperator, string[]][] = [['principal', '=', [user.id]]];\n if (contexts.length) {\n filters.push(['context', '=', contexts.map((context) => (context === 'global' ? 'g' : `p${context}`))]);\n }\n\n getPaginatedResults(\n (params) => this.apiV3Service.capabilities.list({ ...params, filters }),\n )\n .subscribe((capabilities) => {\n this.currentUserStore.update((state) => ({\n ...state,\n capabilities: [\n ...capabilities,\n ...(state.capabilities || []).filter((cap) => !!capabilities.find((newCap) => newCap.id === cap.id)),\n ],\n }));\n });\n });\n\n return this.currentUserQuery.capabilities$;\n }\n\n /**\n * Returns the users' capabilities filtered by context\n */\n public capabilitiesForContext$(contextId:string) {\n return this.capabilities$.pipe(\n map((capabilities) => capabilities.filter((cap) => cap.context.href.endsWith(`/${contextId}`))),\n distinctUntilChanged(),\n );\n }\n\n /**\n * Returns an Observable indicating whether the user has the required capabilities in the provided context.\n */\n public hasCapabilities$(action:string|string[], contextId = 'global') {\n const actions = _.castArray(action);\n return this.capabilitiesForContext$(contextId).pipe(\n map((capabilities) => actions.reduce(\n (acc, contextAction) => acc && !!capabilities.find((cap) => cap.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 user has any of the required capabilities in the provided context.\n */\n public hasAnyCapabilityOf$(actions:string|string[], contextId = 'global') {\n const actionsToFilter = _.castArray(actions);\n return this.capabilitiesForContext$(contextId).pipe(\n map((capabilities) => capabilities.reduce(\n (acc, cap) => acc || !!actionsToFilter.find((action) => cap.action.href.endsWith(`/api/v3/actions/${action}`)),\n false,\n )),\n distinctUntilChanged(),\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() {\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() {\n return this._user.id || '';\n }\n\n /** @deprecated Use the store mechanism `currentUserQuery.user$` */\n public get name() {\n return this._user.name || '';\n }\n\n /** @deprecated Use the store mechanism `currentUserQuery.user$` */\n public get mail() {\n return this._user.mail || '';\n }\n\n /** @deprecated Use the store mechanism `currentUserQuery.user$` */\n public get href() {\n return `/api/v3/users/${this.userId}`;\n }\n\n /** @deprecated Use `I18nService.locale` instead */\n public get language() {\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 { Store, StoreConfig } from '@datorama/akita';\nimport { CapabilityResource } from 'core-app/features/hal/resources/capability-resource';\n\nexport interface CurrentUser {\n id:string|null;\n name:string|null;\n mail:string|null;\n}\n\nexport interface CurrentUserState extends CurrentUser {\n capabilities:CapabilityResource[]|null;\n}\n\nexport function createInitialState():CurrentUserState {\n return {\n id: null,\n name: null,\n mail: null,\n capabilities: 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 * Return whether the date is in the past\n * @param dateString\n */\n public inThePast(dateString:string):boolean {\n return this.daysFromToday(dateString) <= -1;\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 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 { Observable } 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 loadWeekdays():Observable {\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):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 fot 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 // That are not the current user:\n filters.add('id', '!', ['me']);\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-premium-feature',\n tableHighlighting: 'https://www.openproject.org/docs/user-guide/work-packages/work-package-table-configuration/#attribute-highlighting-premium-feature',\n graphWidgets: 'https://www.openproject.org/docs/user-guide/project-overview/#work-package-graph-widgets-premium-feature',\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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 The action menu is a menu that usually belongs to an OpenProject entity (like an Issue, WikiPage, Meeting, ..).\n Most likely it looks like this:\n \n The following code is responsible to open and close the \"more functions\" submenu.\n*/\nimport { ANIMATION_RATE_MS } from 'core-app/core/setup/globals/global-listeners/top-menu';\nimport ClickEvent = JQuery.ClickEvent;\n\nfunction closeMenu(event:any) {\n const menu = jQuery(event.data.menu);\n // do not close the menu, if the user accidentally clicked next to a menu item (but still within the menu)\n if (event.target !== menu.find(' > li.drop-down.open > ul').get(0)) {\n menu.find(' > li.drop-down.open').removeClass('open').find('> ul').slideUp(ANIMATION_RATE_MS);\n // no need to watch for clicks, when the menu is already closed\n jQuery('html').off('click', closeMenu);\n }\n}\n\nfunction openMenu(menu:JQuery) {\n const dropDown = menu.find(' > li.drop-down');\n // do not open a menu, which is already open\n if (!dropDown.hasClass('open')) {\n dropDown.find('> ul').slideDown(ANIMATION_RATE_MS, () => {\n dropDown.find('li > a:first').focus();\n // when clicking on something, which is not the menu, close the menu\n jQuery('html').on('click', { menu: menu.get(0) }, closeMenu);\n });\n dropDown.addClass('open');\n }\n}\n\n// open the given submenu when clicking on it\nexport function installMenuLogic(menu:JQuery) {\n menu.find(' > li.drop-down').on('click', (event:ClickEvent) => {\n openMenu(menu);\n // and prevent default action (href) for that element\n // but not for the menu items.\n const target = jQuery(event.target);\n if (target.is('.drop-down') || target.closest('li, ul').is('.drop-down')) {\n event.preventDefault();\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 { findAllFocusableElementsWithin } from 'core-app/shared/helpers/focus-helpers';\n\nexport const ANIMATION_RATE_MS = 100;\n\nexport class TopMenu {\n private hover = false;\n\n private menuIsOpen = false;\n\n constructor(readonly menuContainer:JQuery) {\n this.withHeadingFoldOutAtBorder();\n this.setupDropdownClick();\n this.registerEventHandlers();\n this.closeOnBodyClick();\n this.accessibility();\n this.skipContentClickListener();\n }\n\n skipContentClickListener():void {\n // Skip menu on content\n jQuery('#skip-navigation--content').on('click', () => {\n // Skip to the breadcrumb or the first link in the toolbar or the first link in the content (homescreen)\n const selectors = '.first-breadcrumb-element a, .toolbar-container a:first-of-type, #content a:first-of-type';\n const visibleLink = jQuery(selectors)\n .not(':hidden')\n .first();\n\n if (visibleLink.length) {\n visibleLink.trigger('focus');\n }\n });\n }\n\n accessibility():void {\n jQuery('.op-app-menu--dropdown').attr('aria-expanded', 'false');\n }\n\n toggleClick(dropdown:JQuery):void {\n if (this.menuIsOpen) {\n if (this.isOpen(dropdown)) {\n this.closing();\n } else {\n this.open(dropdown);\n }\n } else {\n this.opening();\n this.open(dropdown);\n }\n }\n\n // somebody opens the menu via click, hover possible afterwards\n opening():void {\n this.startHover();\n this.menuIsOpen = true;\n this.menuContainer.trigger('openedMenu', this.menuContainer);\n }\n\n // the entire menu gets closed, no hover possible afterwards\n closing():void {\n this.stopHover();\n this.closeAllItems();\n this.menuIsOpen = false;\n this.menuContainer.trigger('closedMenu', this.menuContainer);\n }\n\n stopHover():void {\n this.hover = false;\n this.menuContainer.removeClass('hover');\n }\n\n startHover():void {\n this.hover = true;\n this.menuContainer.addClass('hover');\n }\n\n closeAllItems():void {\n this.openDropdowns().each((ix, item) => {\n this.close(jQuery(item));\n });\n }\n\n closeOnBodyClick():void {\n const wrapper = document.getElementById('wrapper');\n if (!wrapper) {\n return;\n }\n\n wrapper.addEventListener('click', (evt) => {\n if (this.menuIsOpen && !this.openDropdowns()[0].contains(evt.target as HTMLElement)) {\n this.closing();\n }\n }, true);\n }\n\n openDropdowns() {\n return this.menuContainer.find('.op-app-menu--item_dropdown-open');\n }\n\n dropdowns() {\n return this.menuContainer.find('.op-app-menu--item_has-dropdown');\n }\n\n withHeadingFoldOutAtBorder():void {\n let menuStartPosition;\n const next = this.menuContainer.next();\n const wikiHeading = this.menuContainer.next().children().next().first();\n if (next.get(0)?.tagName === 'H2') {\n menuStartPosition = this.menuContainer.next().innerHeight()! + this.menuContainer.next().position().top;\n this.menuContainer.find('.op-app-menu--body').css({ top: menuStartPosition });\n } else if (this.menuContainer.next().hasClass('wiki-content')\n && wikiHeading.get(0)?.tagName === 'H1') {\n menuStartPosition = wikiHeading.innerHeight()! + wikiHeading.position().top;\n this.menuContainer.find('.op-app-menu--body').css({ top: menuStartPosition });\n }\n }\n\n setupDropdownClick():void {\n this.dropdowns().each((ix, it) => {\n jQuery(it).find('.op-app-menu--item-action').click((e) => {\n this.toggleClick(jQuery(it));\n e.preventDefault();\n });\n });\n }\n\n isOpen(dropdown:JQuery):boolean {\n return dropdown.filter('.op-app-menu--item_dropdown-open').length === 1;\n }\n\n isClosed(dropdown:JQuery):boolean {\n return !this.isOpen(dropdown);\n }\n\n open(dropdown:JQuery):void {\n this.dontCloseWhenUsing(dropdown);\n this.closeOtherItems(dropdown);\n this.slideAndFocus(dropdown, () => {\n dropdown.trigger('opened', dropdown);\n });\n }\n\n close(dropdown:JQuery, immediate?:boolean):void {\n this.slideUp(dropdown, !!immediate);\n dropdown.trigger('closed', dropdown);\n this.removeStoppingOfEventPropagation(dropdown);\n }\n\n closeOtherItems(dropdown:JQuery):void {\n this.openDropdowns().each((ix, it) => {\n if (jQuery(it) !== jQuery(dropdown)) {\n this.close(jQuery(it), true);\n }\n });\n }\n\n dontCloseWhenUsing(dropdown:JQuery):void {\n setTimeout(() => {\n jQuery(dropdown).find('li').click((event) => {\n event.stopPropagation();\n });\n\n jQuery(dropdown).bind('mousedown mouseup click', (event) => {\n event.stopPropagation();\n });\n }, 0);\n }\n\n removeStoppingOfEventPropagation(dropdown:JQuery):void {\n jQuery(dropdown).find('li').unbind('click');\n jQuery(dropdown).unbind('mousedown mouseup click');\n }\n\n slideAndFocus(dropdown:JQuery, callback:any) {\n this.slideDown(dropdown, callback);\n setTimeout(() => this.focusFirstInputOrLink(dropdown), ANIMATION_RATE_MS);\n }\n\n slideDown(dropdown:JQuery, callback:any) {\n const toDrop = dropdown.find('.op-app-menu--dropdown');\n dropdown.addClass('op-app-menu--item_dropdown-open');\n toDrop.slideDown(ANIMATION_RATE_MS, callback).attr('aria-expanded', 'true');\n }\n\n slideUp(dropdown:JQuery, immediate:boolean):void {\n const toDrop = jQuery(dropdown).find('.op-app-menu--dropdown');\n dropdown.removeClass('op-app-menu--item_dropdown-open');\n\n if (immediate) {\n toDrop.hide();\n } else {\n toDrop.slideUp(ANIMATION_RATE_MS);\n }\n\n toDrop.attr('aria-expanded', 'false');\n }\n\n // If there is ANY input, it will have precedence over links,\n // i.e. links will only get focused, if there is NO input whatsoever\n focusFirstInputOrLink(dropdown:JQuery):void {\n const focusable = findAllFocusableElementsWithin(dropdown.find('.op-app-menu--dropdown')[0]);\n const toFocus = focusable[0] as HTMLElement;\n if (!toFocus) {\n return;\n }\n // actually a simple focus should be enough.\n // The rest is only there to work around a rendering bug in webkit (as of Oct 2011),\n // occurring mostly inside the login/signup dropdown.\n toFocus.blur();\n setTimeout(() => {\n toFocus.focus();\n }, 10);\n }\n\n registerEventHandlers():void {\n const toggler = jQuery('#main-menu-toggle');\n\n this.menuContainer.on('closeDropDown', (event:Event) => {\n this.close(jQuery(event.target as HTMLElement));\n }).on('openDropDown', (event) => {\n this.open(jQuery(event.target));\n }).on('closeMenu', () => {\n this.closing();\n }).on('openMenu', () => {\n this.open(this.dropdowns().first());\n this.opening();\n });\n\n toggler.on('click', () => { // click on hamburger icon is closing other menu\n this.closing();\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\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { PasswordConfirmationModalComponent } from 'core-app/shared/components/modals/request-for-confirmation/password-confirmation.modal';\n\nfunction registerListener(\n form:JQuery,\n $event:JQuery.TriggeredEvent,\n opModalService:OpModalService,\n modal:typeof PasswordConfirmationModalComponent,\n) {\n const passwordConfirm = form.find('_password_confirmation');\n\n if (passwordConfirm.length > 0) {\n return true;\n }\n\n $event.preventDefault();\n const modalComponent = opModalService.show(modal, 'global');\n modalComponent.closingEvent.subscribe((confirmModal:any) => {\n if (confirmModal.confirmed) {\n jQuery('')\n .attr({\n type: 'hidden',\n name: '_password_confirmation',\n value: confirmModal.password_confirmation,\n })\n .appendTo(form);\n\n form.trigger('submit');\n }\n });\n\n return false;\n}\n\nexport function registerRequestForConfirmation($:JQueryStatic) {\n window.OpenProject\n .getPluginContext()\n .then((context) => {\n const { opModalService } = context.services;\n const passwordConfirmationModal = context.classes.modals.passwordConfirmation;\n\n $(document).on(\n 'submit',\n 'form[data-request-for-confirmation]',\n function (this:any, $event:JQuery.TriggeredEvent) {\n const form = jQuery(this);\n\n if (form.find('input[name=\"_password_confirmation\"]').length) {\n return true;\n }\n\n return registerListener(form, $event, opModalService, passwordConfirmationModal);\n },\n );\n })\n .catch(() => {});\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nfunction createFieldsetToggleStateLabel(legend:JQuery, text:string) {\n const labelClass = 'fieldset-toggle-state-label';\n let toggleLabel = legend.find(`a span.${labelClass}`);\n const legendLink = legend.children('a');\n\n if (toggleLabel.length === 0) {\n toggleLabel = jQuery('').addClass(labelClass)\n .addClass('hidden-for-sighted');\n\n legendLink.append(toggleLabel);\n }\n\n toggleLabel.text(` ${text}`);\n}\n\nfunction setFieldsetToggleState(fieldset:JQuery) {\n const legend = fieldset.children('legend');\n\n if (fieldset.hasClass('collapsed')) {\n createFieldsetToggleStateLabel(legend, I18n.t('js.label_collapsed'));\n } else {\n createFieldsetToggleStateLabel(legend, I18n.t('js.label_expanded'));\n }\n}\n\nfunction getFieldset(el:HTMLElement) {\n const element = jQuery(el);\n\n if (element.is('legend')) {\n return jQuery(el).parent();\n } if (element.is('fieldset')) {\n return element;\n }\n\n throw new Error('Cannot derive fieldset from element!');\n}\n\nfunction toggleFieldset(el:HTMLElement) {\n const fieldset = getFieldset(el);\n // Mark the fieldset that the user has touched it at least once\n fieldset.attr('data-touched', 'true');\n const contentArea = fieldset.find('> div').not('.form--toolbar');\n\n fieldset.toggleClass('collapsed');\n contentArea.slideToggle('fast');\n\n setFieldsetToggleState(fieldset);\n}\n\nexport function setupToggableFieldsets() {\n const fieldsets = jQuery('fieldset.form--fieldset.-collapsible');\n\n // Toggle on click\n fieldsets.on('click', '.form--fieldset-legend', function (evt) {\n toggleFieldset(this);\n evt.preventDefault();\n evt.stopPropagation();\n return false;\n });\n\n // Set initial state\n fieldsets\n .each(function () {\n const fieldset = getFieldset(this);\n\n const contentArea = fieldset.find('> div');\n if (fieldset.hasClass('collapsed')) {\n contentArea.hide();\n }\n\n setFieldsetToggleState(fieldset);\n });\n}\n","// Legacy code ported from app/assets/javascripts/application.js.erb\n// Do not add stuff here, but ideally remove into components whenver changes are necessary\nexport function setupServerResponse() {\n initMainMenuExpandStatus();\n focusFirstErroneousField();\n activateFlashNotice();\n activateFlashError();\n autoHideFlashMessage();\n flashCloseHandler();\n\n jQuery(document).ajaxComplete(activateFlashNotice);\n jQuery(document).ajaxComplete(activateFlashError);\n\n /*\n * 1 - registers a callback which copies the csrf token into the\n * X-CSRF-Token header with each ajax request. Necessary to\n * work with rails applications which have fixed\n * CVE-2011-0447\n * 2 - shows and hides ajax indicator\n */\n jQuery(document).ajaxSend((event, request) => {\n if (jQuery(event.target.activeElement!).closest('[ajax-indicated]').length\n && jQuery('ajax-indicator')) {\n jQuery('#ajax-indicator').show();\n }\n\n const csrf_meta_tag = jQuery('meta[name=csrf-token]');\n\n if (csrf_meta_tag) {\n const header = 'X-CSRF-Token';\n const token = csrf_meta_tag.attr('content');\n\n request.setRequestHeader(header, token!);\n }\n\n request.setRequestHeader('X-Authentication-Scheme', 'Session');\n });\n\n // ajaxStop gets called when ALL Requests finish, so we won't need a counter as in PT\n jQuery(document).ajaxStop(() => {\n if (jQuery('#ajax-indicator')) {\n jQuery('#ajax-indicator').hide();\n }\n addClickEventToAllErrorMessages();\n });\n\n // show/hide the files table\n jQuery('.attachments h4').click(function () {\n jQuery(this).toggleClass('closed').next().slideToggle(100);\n });\n\n let resizeTo:any = null;\n jQuery(window).on('resize', () => {\n // wait 200 milliseconds for no further resize event\n // then readjust breadcrumb\n\n if (resizeTo) {\n clearTimeout(resizeTo);\n }\n resizeTo = setTimeout(() => {\n jQuery(window).trigger('resizeEnd');\n }, 200);\n });\n\n // Do not close the login window when using it\n jQuery('#nav-login-content').click((event) => {\n event.stopPropagation();\n });\n\n // Set focus on first error message\n const error_focus = jQuery('a.afocus').first();\n const input_focus = jQuery('.autofocus').first();\n if (error_focus !== undefined) {\n error_focus.focus();\n } else if (input_focus !== undefined) {\n input_focus.focus();\n if (input_focus[0].tagName === 'INPUT') {\n input_focus.select();\n }\n }\n // Focus on field with error\n addClickEventToAllErrorMessages();\n\n // Click handler for formatting help\n jQuery(document.body).on('click', '.formatting-help-link-button', () => {\n window.open(`${window.appBasePath}/help/wiki_syntax`,\n '',\n 'resizable=yes, location=no, width=600, height=640, menubar=no, status=no, scrollbars=yes');\n return false;\n });\n}\n\nfunction flashCloseHandler() {\n jQuery('body').on('click keydown touchend', '.close-handler,.op-toast--close', function (e) {\n if (e.type === 'click' || e.which === 13) {\n jQuery(this).parent('.flash, .errorExplanation, .op-toast')\n .not('.persistent-toggle--notification')\n .remove();\n }\n });\n}\n\nfunction autoHideFlashMessage() {\n setTimeout(() => {\n jQuery('.flash.autohide-toaster').remove();\n }, 5000);\n}\n\nfunction addClickEventToAllErrorMessages() {\n jQuery('a.afocus').each(function () {\n const target = jQuery(this);\n target.click((evt) => {\n let field = jQuery(`#${target.attr('href')!.substr(1)}`);\n if (field === null) {\n // Cut off '_id' (necessary for select boxes)\n field = jQuery(`#${target.attr('href')!.substr(1).concat('_id')}`);\n }\n target.unbind(evt);\n return false;\n });\n });\n}\n\nfunction initMainMenuExpandStatus() {\n const wrapper = jQuery('#wrapper');\n const upToggle = jQuery('ul.menu_root.closed li.open a.arrow-left-to-project');\n\n if (upToggle.length === 1 && wrapper.hasClass('hidden-navigation')) {\n upToggle.trigger('click');\n }\n}\n\nfunction activateFlash(selector:any) {\n const flashMessages = jQuery(selector);\n\n flashMessages.each((ix, e) => {\n const flashMessage = jQuery(e);\n flashMessage.show();\n });\n}\n\nfunction activateFlashNotice() {\n activateFlash('.flash');\n}\n\nfunction activateFlashError() {\n activateFlash('.errorExplanation[role=\"alert\"]');\n}\n\nfunction focusFirstErroneousField() {\n const firstErrorSpan = jQuery('span.errorSpan').first();\n const erroneousInput = firstErrorSpan.find('*').filter(':input');\n\n erroneousInput.trigger('focus');\n}\n","// Dynamically loads and triggers the onboarding tour\n// when on the correct spots\nimport {\n demoProjectsLinks,\n OnboardingTourNames,\n onboardingTourStorageKey,\n ProjectName,\n waitForElement,\n} from 'core-app/core/setup/globals/onboarding/helpers';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\n\nasync function triggerTour(name:OnboardingTourNames, project?:ProjectName):Promise {\n debugLog(`Loading and triggering onboarding tour ${name}`);\n await import(/* webpackChunkName: \"onboarding-tour\" */ './onboarding_tour').then((tour) => {\n tour.start(name, project);\n });\n}\n\nexport function detectOnboardingTour():void {\n // ------------------------------- Global -------------------------------\n const url = new URL(window.location.href);\n const isMobile = document.body.classList.contains('-browser-mobile');\n const demoProjectsAvailable = jQuery('meta[name=demo_projects_available]').attr('content') === 'true';\n let currentTourPart = sessionStorage.getItem(onboardingTourStorageKey);\n let tourCancelled = false;\n\n // ------------------------------- Initial start -------------------------------\n // Do not show the tutorial on mobile or when the demo data has been deleted\n if (!isMobile && demoProjectsAvailable) {\n // Start after the intro modal (language selection)\n // This has to be changed once the project selection is implemented\n if (url.searchParams.get('first_time_user') && demoProjectsLinks().length === 2) {\n currentTourPart = '';\n sessionStorage.setItem(onboardingTourStorageKey, 'readyToStart');\n\n waitForElement('.onboarding-modal .op-modal--close-button', 'body', () => {\n // Start automatically when the language selection is closed\n jQuery('.op-modal--close-button').click(() => {\n tourCancelled = true;\n void triggerTour('homescreen');\n });\n });\n\n // Start automatically when the escape button is pressed\n document.addEventListener('keydown', (event) => {\n if (event.key === 'Escape' && !tourCancelled) {\n tourCancelled = true;\n void triggerTour('homescreen');\n }\n }, { once: true });\n }\n\n // ------------------------------- Tutorial Homescreen page -------------------------------\n if (currentTourPart === 'readyToStart') {\n void triggerTour('homescreen');\n }\n\n // ------------------------------- Tutorial WP page -------------------------------\n if (currentTourPart === 'startMainTourFromBacklogs' || url.searchParams.get('start_onboarding_tour')) {\n const projectName:ProjectName = currentTourPart === 'startMainTourFromBacklogs' ? ProjectName.scrum : ProjectName.demo;\n void triggerTour('main', projectName);\n }\n\n // ------------------------------- Prepare Backlogs page -------------------------------\n if (url.searchParams.get('start_scrum_onboarding_tour')) {\n if (jQuery('.backlogs-menu-item').length > 0) {\n void triggerTour('prepareBacklogs', ProjectName.scrum);\n } else {\n void triggerTour('taskboard', ProjectName.scrum);\n }\n }\n\n // ------------------------------- Tutorial Backlogs page -------------------------------\n if (currentTourPart === 'prepareTaskBoardTour') {\n void triggerTour('backlogs', ProjectName.scrum);\n }\n\n // ------------------------------- Tutorial Task Board page -------------------------------\n if (currentTourPart === 'startTaskBoardTour') {\n void triggerTour('taskboard', ProjectName.scrum);\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 { refreshOnFormChanges } from 'core-app/core/setup/globals/global-listeners/refresh-on-form-changes';\nimport { registerRequestForConfirmation } from 'core-app/core/setup/globals/global-listeners/request-for-confirmation';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport { scrollHeaderOnMobile } from 'core-app/core/setup/globals/global-listeners/top-menu-scroll';\nimport { setupToggableFieldsets } from 'core-app/core/setup/globals/global-listeners/toggable-fieldset';\nimport { TopMenu } from 'core-app/core/setup/globals/global-listeners/top-menu';\nimport { installMenuLogic } from 'core-app/core/setup/globals/global-listeners/action-menu';\nimport { makeColorPreviews } from 'core-app/core/setup/globals/global-listeners/color-preview';\nimport { dangerZoneValidation } from 'core-app/core/setup/globals/global-listeners/danger-zone-validation';\nimport { setupServerResponse } from 'core-app/core/setup/globals/global-listeners/setup-server-response';\nimport { listenToSettingChanges } from 'core-app/core/setup/globals/global-listeners/settings';\nimport { detectOnboardingTour } from 'core-app/core/setup/globals/onboarding/onboarding_tour_trigger';\nimport { augmentedDatePicker } from './global-listeners/augmented-date-picker';\nimport { performAnchorHijacking } from './global-listeners/link-hijacking';\n\n/**\n * A set of listeners that are relevant on every page to set sensible defaults\n */\n(function ($:JQueryStatic) {\n $(() => {\n $(document.documentElement)\n .on('click', (evt:any) => {\n const target = jQuery(evt.target) as JQuery;\n\n // Create datepickers dynamically for Rails-based views\n augmentedDatePicker(evt, target);\n\n // Prevent angular handling clicks on href=\"#...\" links from other libraries\n // (especially jquery-ui and its datepicker) from routing to /#\n performAnchorHijacking(evt, target);\n\n return true;\n });\n\n // Jump to the element given by location.hash, if present\n const { hash } = window.location;\n if (hash && hash.startsWith('#')) {\n try {\n const el = document.querySelector(hash);\n el && el.scrollIntoView();\n } catch (e) {\n // This is very likely an invalid selector such as a Google Analytics tag.\n // We can safely ignore this and just not scroll in this case.\n // Still log the error so one can confirm the reason there is no scrolling.\n console.log(`Could not scroll to given location hash: ${hash} ( ${e.message})`);\n }\n }\n\n // Global submitting hook,\n // necessary to avoid a data loss warning on beforeunload\n $(document).on('submit', 'form', () => {\n window.OpenProject.pageIsSubmitted = true;\n });\n\n // Add to content if warnings displayed\n if (document.querySelector('.warning-bar--item')) {\n const content = document.querySelector('#content') as HTMLElement;\n if (content) {\n content.style.marginBottom = '100px';\n }\n }\n\n // Global beforeunload hook\n $(window).on('beforeunload', (e:JQuery.TriggeredEvent) => {\n const event = e.originalEvent as BeforeUnloadEvent;\n if (window.OpenProject.pageWasEdited && !window.OpenProject.pageIsSubmitted) {\n // Cancel the event\n event.preventDefault();\n // Chrome requires returnValue to be set\n event.returnValue = I18n.t('js.work_packages.confirm_edit_cancel');\n }\n });\n\n // Disable global drag & drop handling, which results in the browser loading the image and losing the page\n $(document.documentElement)\n .on('dragover drop', (evt:any) => {\n evt.preventDefault();\n return false;\n });\n\n refreshOnFormChanges();\n\n // Allow forms with [request-for-confirmation]\n // to show the password confirmation dialog\n registerRequestForConfirmation($);\n\n const deviceService:DeviceService = new DeviceService();\n // Register scroll handler on mobile header\n if (deviceService.isMobile) {\n scrollHeaderOnMobile();\n }\n\n // Detect and trigger the onboarding tour\n // through a lazy loaded script\n detectOnboardingTour();\n\n //\n // Legacy scripts from app/assets that are not yet component based\n //\n\n // Toggable fieldsets\n setupToggableFieldsets();\n\n // Top menu click handling\n new TopMenu(jQuery('.op-app-header'));\n\n // Action menu logic\n jQuery('.project-actions, .toolbar-items').each((idx:number, menu:HTMLElement) => {\n installMenuLogic(jQuery(menu));\n });\n\n // Legacy settings listener\n listenToSettingChanges();\n\n // Color patches preview the color\n makeColorPreviews();\n\n // Danger zone input validation\n dangerZoneValidation();\n\n // Bootstrap legacy app code\n setupServerResponse();\n });\n}(jQuery));\n","import { DatePicker } from 'core-app/shared/components/op-date-picker/datepicker';\n\n/**\n * Our application is still a hybrid one, meaning most routes are still\n * handled by Rails. As such, we disable the default link-hijacking that\n * Angular's HTML5-mode with results in\n * @param evt\n * @param target\n */\nexport function augmentedDatePicker(evt:JQuery.TriggeredEvent, target:JQuery) {\n if (target.hasClass('-augmented-datepicker')) {\n target\n .attr('autocomplete', 'off'); // Disable autocomplete for those fields\n\n window.OpenProject.getPluginContext()\n .then((context) => {\n const datePicker = new DatePicker(\n context.injector,\n '.-augmented-datepicker',\n target.val() as string,\n {\n weekNumbers: true,\n allowInput: true,\n },\n target[0],\n );\n datePicker.show();\n })\n .catch(() => {});\n }\n}\n","/**\n * Our application is still a hybrid one, meaning most routes are still\n * handled by Rails. As such, we disable the default link-hijacking that\n * Angular's HTML5-mode with results in\n * @param evt\n * @param target\n */\nexport function performAnchorHijacking(evt:JQuery.TriggeredEvent, target:JQuery):void {\n // Avoid defaulting clicks on elements already removed from DOM\n if (!document.contains(evt.target as Element)) {\n evt.preventDefault();\n }\n\n // Avoid handling clicks on anything other than a\n const linkElement = target.closest('a');\n if (linkElement.length === 0) {\n return;\n }\n\n const link = linkElement.attr('href') || '';\n const hashPos = link.indexOf('#');\n\n // If link is neither empty nor starts with hash, ignore it\n if (link !== '' && hashPos !== 0) {\n return;\n }\n\n // Set the location to the hash if there is any\n // Since with the base tag, links like href=\"#whatever\" otherwise target to /#whatever\n if (hashPos !== -1 && link !== '#') {\n window.location.hash = link;\n }\n\n evt.preventDefault();\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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 refreshOnFormChanges() {\n const matches = document.querySelectorAll('.augment--refresh-on-form-changes');\n\n for (let i = 0; i < matches.length; i++) {\n const element = matches[i];\n const form = jQuery(element);\n const url = form.data('refreshUrl');\n const inputId = form.data('inputSelector');\n\n // TODO: Not all elements are available when we run here. The angular dynamic\n // components have to be instantiated first. This race condition should be removed\n // by changing how we refresh on form changes altogether.\n setTimeout(() => {\n form\n .find(inputId)\n .on('change', (e:Event) => {\n // The project selector also fires a change event when the\n // value is empty, but we don't want that here.\n const input = e.currentTarget as HTMLInputElement;\n if (input.name === 'new_project_id' && input.value === '') {\n return;\n }\n window.location.href = `${url}?${form.serialize()}`;\n });\n }, 100);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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// Scroll header on mobile in and out when user scrolls the container\nexport function scrollHeaderOnMobile() {\n const headerHeight = 55;\n let prevScrollPos = window.scrollY;\n\n window.addEventListener('scroll', () => {\n // Condition needed for safari browser to avoid negative positions\n const currentScrollPos = window.scrollY < 0 ? 0 : window.scrollY;\n // Only if sidebar is not opened or search bar is opened\n if (!(jQuery('#main').hasClass('hidden-navigation'))\n || jQuery('.op-app-header').hasClass('op-app-header_search-open')\n || Math.abs(currentScrollPos - prevScrollPos) <= headerHeight) { // to avoid flickering at the end of the page\n return;\n }\n\n if (prevScrollPos !== undefined && currentScrollPos !== undefined && (prevScrollPos > currentScrollPos)) {\n // Slide top menu in or out of viewport and change viewport height\n jQuery('#wrapper').removeClass('_header-scrolled');\n } else {\n jQuery('#wrapper').addClass('_header-scrolled');\n }\n prevScrollPos = currentScrollPos;\n });\n}\n","/**\n * Move from legacy app/assets/javascripts/application.js.erb\n *\n * This should not be loaded globally and ideally refactored into components\n */\nexport function listenToSettingChanges() {\n jQuery('#settings_session_ttl_enabled').on('change', function () {\n jQuery('#settings_session_ttl_container').toggle(jQuery(this).is(':checked'));\n }).trigger('change');\n\n /** Sync SCM vendor select when enabled SCMs are changed */\n jQuery('[name=\"settings[enabled_scm][]\"]').change(function (this:HTMLInputElement) {\n const wasDisabled = !this.checked;\n const vendor = this.value;\n const select = jQuery('#settings_repositories_automatic_managed_vendor');\n const option = select.find(`option[value=\"${vendor}\"]`);\n\n // Skip non-manageable SCMs\n if (option.length === 0) {\n return;\n }\n\n option.prop('disabled', wasDisabled);\n if (wasDisabled && option.prop('selected')) {\n select.val('');\n }\n });\n\n /* Javascript for Settings::TextSettingCell */\n const langSelectSwitchData = function (select:any) {\n const self = jQuery(select);\n const id:string = self.attr('id') || '';\n const settingName = id.replace('lang-for-', '');\n const newLang = self.val();\n const textArea = jQuery(`#settings-${settingName}`);\n const editor = textArea.siblings('ckeditor-augmented-textarea').data('editor');\n\n return {\n id, settingName, newLang, textArea, editor,\n };\n };\n\n // Upon focusing:\n // * store the current value of the editor in the hidden field for that lang.\n // Upon change:\n // * get the current value from the hidden field for that lang and set the editor text to that value.\n // * Set the name of the textarea to reflect the current lang so that the value stored in the hidden field\n // is overwritten.\n jQuery('.lang-select-switch')\n .focus(function () {\n const data = langSelectSwitchData(this);\n\n jQuery(`#${data.id}-${data.newLang}`).val(data.editor.getData());\n })\n .change(function () {\n const data = langSelectSwitchData(this);\n\n const storedValue = jQuery(`#${data.id}-${data.newLang}`).val();\n\n data.editor.setData(storedValue);\n data.textArea.attr('name', `settings[${data.settingName}][${data.newLang}]`);\n });\n /* end Javascript for Settings::TextSettingCell */\n\n jQuery('.admin-settings--form').submit(() => {\n /* Update consent time if consent required */\n if (jQuery('#settings_consent_required').is(':checked') && jQuery('#toggle_consent_time').is(':checked')) {\n jQuery('#settings_consent_time')\n .val(new Date().toISOString())\n .prop('disabled', false);\n }\n\n return true;\n });\n\n /** Toggle notification settings fields */\n jQuery('#email_delivery_method_switch').on('change', function () {\n const delivery_method = jQuery(this).val();\n jQuery('.email_delivery_method_settings').hide();\n jQuery(`#email_delivery_method_${delivery_method}`).show();\n }).trigger('change');\n\n jQuery('#settings_smtp_authentication').on('change', function () {\n const isNone = jQuery(this).val() === 'none';\n jQuery('#settings_smtp_user_name,#settings_smtp_password')\n .closest('.form--field')\n .toggle(!isNone);\n });\n\n /** Toggle repository checkout fieldsets required when option is disabled */\n jQuery('.settings-repositories--checkout-toggle').change(function (this:HTMLInputElement) {\n const wasChecked = this.checked;\n const fieldset = jQuery(this).closest('fieldset');\n\n fieldset\n .find('input,select')\n .filter(':not([type=checkbox])')\n .filter(':not([type=hidden])')\n .removeAttr('required') // Rails 4.0 still seems to use attribute\n .prop('required', wasChecked);\n });\n\n /** Toggle highlighted attributes visibility depending on if the highlighting mode 'inline' was selected */\n jQuery('.settings--highlighting-mode select').change(function () {\n const highlightingMode = jQuery(this).val();\n jQuery('.settings--highlighted-attributes').toggle(highlightingMode === 'inline');\n });\n\n /** Initialize highlighted attributes checkboxes. If none is selected, it means we want them all. So let's\n * show them all as selected.\n * On submitting the form, we remove all checkboxes before sending to communicate, we actually want all and not\n * only the selected. */\n if (jQuery(\".settings--highlighted-attributes input[type='checkbox']:checked\").length === 0) {\n jQuery(\".settings--highlighted-attributes input[type='checkbox']\").prop('checked', true);\n }\n jQuery('#tab-content-work_packages form').submit(() => {\n const availableAttributes = jQuery(\".settings--highlighted-attributes input[type='checkbox']\");\n const selectedAttributes = jQuery(\".settings--highlighted-attributes input[type='checkbox']:checked\");\n if (selectedAttributes.length === availableAttributes.length) {\n availableAttributes.prop('checked', 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\n/**\n * Moved from app/assets/javascripts/colors.js\n *\n * Make this a component instead of modifying it the next time\n * this needs changes\n */\nexport function makeColorPreviews() {\n jQuery('.color--preview').each(function () {\n const preview = jQuery(this);\n let input:any;\n const target = preview.data('target');\n\n if (target) {\n input = jQuery(target);\n } else {\n input = preview.next('input');\n }\n\n if (input.length === 0) {\n return;\n }\n\n const func = function () {\n let previewColor = '';\n\n if (input.val() && input.val().length > 0) {\n previewColor = input.val();\n } else if (input.attr('placeholder')\n && input.attr('placeholder').length > 0) {\n previewColor = input.attr('placeholder');\n }\n\n preview.css('background-color', previewColor);\n };\n\n input.keyup(func).change(func).focus(func);\n 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\n// Moved from app/assets/javascript/danger_zone_validation.js\n// Make the whole danger zone a component the next time this needs changes!\nexport function dangerZoneValidation() {\n // This will only work iff there is a single danger zone on the page\n const dangerZoneVerification = jQuery('.danger-zone--verification');\n const expectedValue = jQuery('.danger-zone--expected-value').text();\n\n dangerZoneVerification.find('input').on('input', () => {\n const actualValue = dangerZoneVerification.find('input').val() as string;\n if (expectedValue.toLowerCase() === actualValue.toLowerCase()) {\n dangerZoneVerification.find('button').prop('disabled', false);\n } else {\n dangerZoneVerification.find('button').prop('disabled', 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\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';\n\n@Injectable()\nexport class AttachmentsResourceService extends ResourceCollectionService {\n constructor(\n private readonly I18n:I18nService,\n private readonly http:HttpClient,\n private readonly apiV3Service:ApiV3Service,\n private readonly fileUploadService:OpenProjectFileUploadService,\n private readonly directFileUploadService:OpenProjectDirectFileUploadService,\n private readonly configurationService:ConfigurationService,\n private readonly toastService:ToastService,\n ) {\n super();\n }\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","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 tap,\n} from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\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 { 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';\n\n@Injectable()\nexport class CapabilitiesResourceService extends ResourceCollectionService {\n private get capabilitiesPath():string {\n return this\n .apiV3Service\n .capabilities\n .path;\n }\n\n constructor(\n private http:HttpClient,\n private apiV3Service:ApiV3Service,\n private toastService:ToastService,\n ) {\n super();\n }\n\n fetchCapabilities(params:ApiV3ListParameters):Observable> {\n const collectionURL = collectionKey(params);\n\n return this\n .http\n .get>(this.capabilitiesPath + 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 CapabilitiesStore();\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';\n\nexport interface CollectionResponse {\n ids:ID[];\n}\n\nexport interface CollectionState extends EntityState {\n /** Loaded notification collections */\n collections: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():{ collections:Record } {\n return {\n collections: {},\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 * 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 dervied from the self link.\n */\nexport function extendCollectionElementsWithId(\n collection:IHALCollection,\n):IHALCollection {\n const elements = collection._embedded.elements.map((element) => ({ ...element, id: idFromLink(element._links.self.href) }));\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 { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { HttpClient } from '@angular/common/http';\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 private get weekdaysPath():string {\n return this\n .apiV3Service\n .days\n .week\n .path;\n }\n\n constructor(\n private http:HttpClient,\n private apiV3Service:ApiV3Service,\n ) {\n super();\n }\n\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 private fetchWeekdays():Observable> {\n const collectionURL = 'all'; // We load all weekdays\n\n return this\n .http\n .get>(this.weekdaysPath)\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","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 { Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { from } from 'rxjs';\nimport {\n catchError,\n groupBy,\n mergeMap,\n reduce,\n switchMap,\n tap,\n} from 'rxjs/operators';\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 idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\n\n@Injectable()\nexport class FileLinksResourceService extends ResourceCollectionService {\n constructor(\n private readonly http:HttpClient,\n private readonly toastService:ToastService,\n ) {\n super();\n }\n\n updateCollectionsForWorkPackage(fileLinksSelfLink:string):void {\n 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 catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n )\n .subscribe((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 }\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 .pipe(\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n )\n .subscribe(() => removeEntityFromCollectionAndState(this.store, fileLink.id, collectionKey));\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 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}\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 { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { HttpClient } from '@angular/common/http';\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 {\n markNotificationsAsRead,\n notificationsMarkedRead,\n} from 'core-app/core/state/in-app-notifications/in-app-notifications.actions';\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 { InAppNotificationsStore } from './in-app-notifications.store';\nimport { INotification } from './in-app-notification.model';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\n\n@EffectHandler\n@Injectable()\nexport class InAppNotificationsResourceService extends ResourceCollectionService {\n private get notificationsPath():string {\n return this\n .apiV3Service\n .notifications\n .path;\n }\n\n constructor(\n readonly actions$:ActionsService,\n private http:HttpClient,\n private apiV3Service:ApiV3Service,\n private toastService:ToastService,\n ) {\n super();\n }\n\n fetchNotifications(params:ApiV3ListParameters):Observable> {\n const collectionURL = collectionKey(params);\n\n return this\n .http\n .get>(this.notificationsPath + collectionURL)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, collectionURL)),\n );\n }\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","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 { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { HttpClient } from '@angular/common/http';\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';\n\n@EffectHandler\n@Injectable()\nexport class PrincipalsResourceService extends ResourceCollectionService {\n private get principalsPath():string {\n return this\n .apiV3Service\n .principals\n .path;\n }\n\n constructor(\n readonly actions$:ActionsService,\n private http:HttpClient,\n private apiV3Service:ApiV3Service,\n private toastService:ToastService,\n ) {\n super();\n }\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.principalsPath + 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","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 {\n catchError,\n tap,\n} from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\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 { 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 private get projectsPath():string {\n return this\n .apiV3Service\n .projects\n .path;\n }\n\n constructor(\n private http:HttpClient,\n private apiV3Service:ApiV3Service,\n private toastService:ToastService,\n ) {\n super();\n }\n\n fetchProjects(params:ApiV3ListParameters):Observable> {\n const collectionURL = collectionKey(params);\n\n return this\n .http\n .get>(this.projectsPath + 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 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 filter,\n map,\n switchMap,\n} from 'rxjs/operators';\nimport { CollectionState } from 'core-app/core/state/collection-store';\nimport { omit } from 'lodash';\nimport isDefinedEntity from 'core-app/core/state/is-defined-entity';\n\nexport type CollectionStore = EntityStore>;\n\nexport abstract class ResourceCollectionService {\n protected store:CollectionStore = this.createStore();\n\n protected query = new QueryEntity(this.store);\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 .query\n .select()\n .pipe(\n map((state) => state.collections[key]?.ids),\n switchMap((fileLinkIds) => this.query.selectMany(fileLinkIds)),\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 * 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 * Create a new instance of this resource service's underyling store.\n * @protected\n */\n protected abstract createStore():CollectionStore;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { HttpClient } from '@angular/common/http';\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 constructor(private readonly http:HttpClient) {\n super();\n }\n\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","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 {\n catchError,\n tap,\n} from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport {\n applyTransaction,\n ID,\n} 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 { HttpClient } from '@angular/common/http';\nimport {\n collectionKey,\n insertCollectionIntoState,\n} from 'core-app/core/state/collection-store';\nimport {\n EffectHandler,\n} 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 { ViewsQuery } from 'core-app/core/state/views/views.query';\nimport { IView } from 'core-app/core/state/views/view.model';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { addParamToHref } from 'core-app/shared/helpers/url-helpers';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\n\n@EffectHandler\n@Injectable()\nexport class ViewsResourceService extends ResourceCollectionService {\n private get viewsPath():string {\n return this\n .apiV3Service\n .views\n .path;\n }\n\n constructor(\n readonly actions$:ActionsService,\n private http:HttpClient,\n private apiV3Service:ApiV3Service,\n private toastService:ToastService,\n ) {\n super();\n }\n\n fetchViews(params:ApiV3ListParameters):Observable> {\n const collectionURL = collectionKey(params);\n\n return this\n .http\n .get>(addParamToHref(this.viewsPath + collectionURL, { pageSize: '-1' }))\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 ViewsStore();\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 { CapabilityResource } from 'core-app/features/hal/resources/capability-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/capabilities */\n capabilities = 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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\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
","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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 };\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';\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 ) {\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):ResourceChangeset {\n const workPackage = resizeInfo.event.extendedProps.workPackage as WorkPackageResource;\n\n const changeset = this.halEditing.edit(workPackage);\n changeset.setValue('startDate', resizeInfo.event.startStr);\n const due = moment(resizeInfo.event.endStr)\n .subtract(1, 'day')\n .format('YYYY-MM-DD');\n changeset.setValue('dueDate', due);\n\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 /** Savable */\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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\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 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, { 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';\n\n@Component({\n templateUrl: './wp-calendar.template.html',\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 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 configuration:ConfigurationService,\n readonly calendar:OpCalendarService,\n readonly workPackagesCalendar:OpWorkPackagesCalendarService,\n readonly currentProject:CurrentProjectService,\n readonly halEditing:HalResourceEditingService,\n readonly halNotification:HalResourceNotificationService,\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n events: this.calendarEventsFunction.bind(this),\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 const workPackage = event.extendedProps.workPackage as WorkPackageResource;\n el.dataset.workPackageId = workPackage.id as string;\n },\n eventResize: (resizeInfo:EventResizeDoneArg) => this.updateEvent(resizeInfo),\n eventDrop: (dropInfo:EventDropArg) => this.updateEvent(dropInfo),\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 this.configuration.initialized\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):Promise {\n const changeset = this.workPackagesCalendar.updateDates(info);\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 defaults = {\n startDate: info.startStr,\n dueDate: this.workPackagesCalendar.getEndDateFromTimestamp(info.endStr),\n };\n\n void this.$state.go(\n splitViewRoute(this.$state, 'new'),\n {\n defaults,\n tabIdentifier: 'overview',\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 { 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 { HttpClientModule } from '@angular/common/http';\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 HttpClientModule,\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\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types,@typescript-eslint/no-explicit-any\nexport function isHalError(err:any):err is IHalErrorBase {\n return '_type' in err && 'message' in err && 'errorIdentifier' in err;\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|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 { InAppNotificationsResourceService } 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 { notificationsMarkedRead, notificationCountIncreased } 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.resourceService\n .fetchNotifications({ filters: IAN_FACET_FILTERS.unread, pageSize: 0 })\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 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 type InAppNotificationFacet = 'unread'|'all';\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 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 .fetchNotifications(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):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: 'activity' },\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","\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 1\"\n >\n {{ text_for_additional_authors(actors.length - 1) }}\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 {\n Observable,\n timer,\n} 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 distinctUntilChanged,\n map,\n} from 'rxjs/operators';\nimport { PrincipalLike } from 'core-app/shared/components/principal/principal-types';\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 loading$ = this.storeService.query.selectLoading();\n\n stateChanged$ = this.storeService.stateChanged$;\n\n // The actor, if any\n actors:PrincipalLike[] = [];\n\n // The translated reason, if available\n translatedReasons:{ [reason:string]:number };\n\n // Format relative elapsed time (n seconds/minutes/hours ago)\n // at an interval for auto updating\n relativeTime$:Observable;\n\n fixedTime:string;\n\n project?:{ href:string, title:string, showUrl:string };\n\n text = {\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 updated_by_at: (age:string):string => this.I18n.t('js.notifications.center.text_update_date',\n { date: age }),\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.buildActors();\n this.buildTime();\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 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 showDetails():void {\n if (!this.workPackage$) {\n return;\n }\n\n this\n .workPackage$\n .pipe(\n take(1),\n )\n .subscribe((wp) => {\n this.storeService.openSplitScreen(wp.id);\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 text_for_additional_authors(number:number):string {\n let hint:string;\n if (number === 1) {\n hint = this.text.and_other_singular;\n } else {\n hint = this.text.and_other_plural(number);\n }\n return hint;\n }\n\n isMobile():boolean {\n return this.deviceService.isMobile;\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 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.watching'),\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","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 };\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 savable */\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, @typescript-eslint/no-unused-vars\n updateTitleName(val:string):void {\n }\n\n // For shared template compliance\n // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\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 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';\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 ],\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 const modal = this.opModalService.show(\n InviteUserModalComponent,\n 'global',\n { projectId },\n );\n\n 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 Role,\n Message,\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 /* Close on outside click */\n public closeOnOutsideClick = true;\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({ principalData, isAlreadyMember }:{ principalData:PrincipalData, isAlreadyMember:boolean }):void {\n this.principalData = principalData;\n if (isAlreadyMember) {\n return this.closeWithPrincipal();\n }\n\n return this.goTo(Steps.Role);\n }\n\n onRoleSave(role:RoleResource):void {\n this.role = role;\n\n if (this.type === PrincipalType.Placeholder) {\n this.goTo(Steps.Summary);\n } else {\n this.goTo(Steps.Message);\n }\n }\n\n onMessageSave({ message }:{ message:string }):void {\n this.message = message;\n 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\n\n\n","\n {{ title }}\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 ChangeDetectorRef, Component, ElementRef, Inject, OnInit, 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 { HttpClient, HttpErrorResponse, HttpResponse } from '@angular/common/http';\nimport { Observable, timer } from 'rxjs';\nimport { switchMap, takeWhile } 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 { JobStatusEnum, JobStatusInterface } 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})\nexport class JobStatusModalComponent extends OpModalComponent implements OnInit {\n /* Close on escape? */\n public closeOnEscape = false;\n\n /* Close on outside click */\n public closeOnOutsideClick = false;\n\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 return;\n }\n\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 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 dynamicFieldsSettings.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","","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(componentDestroyed(this));\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 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 {{ 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 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(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 super(locals, cdRef, elementRef);\n }\n\n ngOnInit() {\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) {\n this.isStarred = change.isStarred;\n this.isPublic = change.isPublic;\n }\n\n public get afterFocusOn() {\n return jQuery('#work-packages-settings-button');\n }\n\n public saveQuery($event:JQuery.TriggeredEvent) {\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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(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 super(locals, cdRef, elementRef);\n }\n\n public setValues(change:QuerySharingChange) {\n this.isStarred = change.isStarred;\n this.isPublic = change.isPublic;\n }\n\n public onOpen() {\n this.queryNameField.nativeElement.focus();\n }\n\n public get afterFocusOn() {\n return jQuery('#work-packages-settings-button');\n }\n\n public saveQueryAs($event:JQuery.TriggeredEvent) {\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 \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 button_settings: this.I18n.t('js.button_settings'),\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 { filter, map, withLatestFrom } 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 { componentDestroyed } from '@w11k/ngx-componentdestroyed';\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 /** Inline create / reference properties */\n public canAdd = false;\n\n public canReference = false;\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 // Update permission on model updates\n this.authorisationService\n .observeUntil(componentDestroyed(this))\n .subscribe(() => {\n this.canAdd = this.wpInlineCreate.canAdd;\n this.canReference = this.wpInlineCreate.canReference;\n this.cdRef.detectChanges();\n });\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.focusElement(cell);\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 HostListener,\n Injector,\n Input,\n EventEmitter,\n OnInit, 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 { Subscription } 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 { componentDestroyed } from '@w11k/ngx-componentdestroyed';\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() {\n this.authorisationService\n .observeUntil(componentDestroyed(this))\n .subscribe(() => {\n this.canReference = this.hasReferenceClass && this.wpInlineCreate.canReference;\n this.canAdd = this.wpInlineCreate.canAdd;\n this.cdRef.detectChanges();\n\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 { Injectable, Injector, OnDestroy } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Subject } from 'rxjs';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Injectable()\nexport class WorkPackageInlineCreateService implements OnDestroy {\n @InjectField() I18n!:I18nService;\n\n @InjectField() protected readonly authorisationService:AuthorisationService;\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() {\n return this.canCreateWorkPackages || this.authorisationService.can('work_package', 'addChild');\n }\n\n public get canReference() {\n return false;\n }\n\n public get canCreateWorkPackages() {\n return this.authorisationService.can('work_packages', 'createWorkPackage')\n && this.authorisationService.can('work_packages', 'editWorkPackage');\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() {\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';\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() {\n return !!(this.referenceTarget && this.canCreateWorkPackages && this.canAddChild);\n }\n\n public get canReference() {\n return !!(this.referenceTarget && this.canAddChild);\n }\n\n public get canAddChild() {\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';\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() {\n return !!(this.referenceTarget && this.canCreateWorkPackages && this.referenceTarget.addRelation);\n }\n\n public get canReference() {\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 }) 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
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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","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 /* Close on escape? */\n public closeOnEscape = false;\n\n /* Close on outside click */\n public closeOnOutsideClick = false;\n\n public $element:JQuery;\n\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 = jQuery(this.elementRef.nativeElement);\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 });\n }\n\n ngOnDestroy() {\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) {\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():JQuery {\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 openConfigurationModal(onUpdated:() => void) {\n this.querySpace.query\n .valuesPromise()\n .then(() => {\n const modal = this.opModalService\n .show(WpTableConfigurationModalComponent, this.injector);\n\n // Detach this component when the modal closes and pass along the query data\n modal.onDataUpdated.subscribe(onUpdated);\n });\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.focusElement(element, true);\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.work_packages.message_successful_show_in_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('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 { 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})\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","\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 \n \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';\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 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 removalConfirmation: this.i18n.t('js.storages.file_links.remove_confirmation'),\n };\n\n constructor(\n private readonly i18n:I18nService,\n private readonly timezoneService:TimezoneService,\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 = this.originData.mimeType !== 'application/x-op-directory';\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.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 if (window.confirm(this.text.removalConfirmation)) {\n this.removeFileLink.emit();\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 { BehaviorSubject, Observable } from 'rxjs';\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';\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 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 },\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 fileLinkResourceService:FileLinksResourceService,\n private readonly currentUserService:CurrentUserService,\n private readonly cookieService:CookieService,\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.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.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 private instantiateStorageInformation(fileLinks:IFileLink[]):StorageInformationBox[] {\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 { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { combineLatest, Observable } from 'rxjs';\nimport { catchError, map } 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\n .currentUserService\n .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.selectNotificationsCount$;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { WorkPackageRelationsTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/relations-tab/relations-tab.component';\nimport { WorkPackageOverviewTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/overview-tab/overview-tab.component';\nimport { WorkPackageActivityTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-tab.component';\nimport { WorkPackageWatchersTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/watchers-tab.component';\nimport { WorkPackageFilesTabComponent } 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 { workPackageWatchersCount } from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-watchers-count.function';\nimport { workPackageRelationsCount } from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-relations-count.function';\nimport { workPackageNotificationsCount } from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-notifications-count.function';\nimport { workPackageFilesCount } 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 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]), // eslint-disable-line @typescript-eslint/no-unused-vars\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\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';\nimport { TimelineCellRenderer } from './timeline-cell-renderer';\nimport { RenderInfo } from '../wp-timeline';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport Moment = moment.Moment;\n\nexport const classNameBar = 'bar';\nexport const classNameLeftHandle = 'leftHandle';\nexport const classNameRightHandle = 'rightHandle';\nexport const classNameBarLabel = 'bar-label';\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) {\n const querySpace:IsolatedQuerySpace = injector.get(IsolatedQuerySpace);\n\n let mouseDownStartDay:number|null = null; // also flag to signal active drag'n'drop\n renderInfo.change = halEditing.changeFor(renderInfo.workPackage);\n\n let dateStates:any;\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(bar, ev);\n }\n };\n\n // handles initial creation of start/due values\n cell.onmousemove = handleMouseMoveOnEmptyCell;\n\n function applyDateValues(renderInfo:RenderInfo, dates:{ [name:string]:Moment }) {\n // Let the renderer decide which fields we change\n renderer.assignDateValues(renderInfo.change, labels, dates);\n }\n\n function getCursorOffsetInDaysFromLeft(renderInfo:RenderInfo, ev:MouseEvent) {\n const leftOffset = workPackageTimeline.getAbsoluteLeftCoordinates();\n const cursorOffsetLeftInPx = ev.clientX - leftOffset;\n const cursorOffsetLeftInDays = Math.floor(cursorOffsetLeftInPx / renderInfo.viewParams.pixelPerDay);\n return cursorOffsetLeftInDays;\n }\n\n function workPackageMouseDownFn(bar:HTMLDivElement, 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(renderInfo, 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, bar);\n\n jBody.on('mousemove.timelinecell', createMouseMoveFn(direction));\n jBody.on('keyup.timelinecell', keyPressFn);\n jBody.on('mouseup.timelinecell', () => deactivate(false));\n }\n\n function createMouseMoveFn(direction:'left'|'right'|'both'|'create'|'dragright') {\n return (ev:JQuery.MouseMoveEvent) => {\n const days = getCursorOffsetInDaysFromLeft(renderInfo, ev.originalEvent!) - mouseDownStartDay!;\n const offsetDayCurrent = Math.floor(ev.offsetX / renderInfo.viewParams.pixelPerDay);\n const dayUnderCursor = renderInfo.viewParams.dateDisplayStart.clone().add(offsetDayCurrent, 'days');\n\n dateStates = renderer.onDaysMoved(renderInfo.change, dayUnderCursor, days, direction);\n applyDateValues(renderInfo, dateStates);\n renderer.update(bar, labels, renderInfo);\n };\n }\n\n function keyPressFn(ev:JQuery.TriggeredEvent) {\n const kev:KeyboardEvent = ev as any;\n if (kev.keyCode === KeyCodes.ESCAPE) {\n deactivate(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 const isEditable = (wp.isLeaf || wp.scheduleManually) && renderer.canMoveDates(wp);\n\n if (!isEditable) {\n cell.style.cursor = 'not-allowed';\n return;\n }\n\n // placeholder logic\n cell.style.cursor = '';\n placeholderForEmptyCell && placeholderForEmptyCell.remove();\n placeholderForEmptyCell = renderer.displayPlaceholderUnderCursor(ev, renderInfo);\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 = (ev) => {\n placeholderForEmptyCell.remove();\n bar.style.pointerEvents = 'none';\n ev.preventDefault();\n\n const offsetDayStart = Math.floor(ev.offsetX / renderInfo.viewParams.pixelPerDay);\n const clickStart = renderInfo.viewParams.dateDisplayStart.clone().add(offsetDayStart, 'days');\n const dateForCreate = clickStart.format('YYYY-MM-DD');\n const mouseDownType = renderer.onMouseDown(ev, dateForCreate, renderInfo, labels, bar);\n renderer.update(bar, labels, renderInfo);\n\n if (mouseDownType === 'create') {\n deactivate(false);\n ev.preventDefault();\n return;\n }\n\n jBody.on('mousemove.emptytimelinecell', mouseMoveOnEmptyCellFn(offsetDayStart, mouseDownType));\n jBody.on('mouseup.emptytimelinecell', () => deactivate(false));\n\n cell.onmouseup = () => {\n deactivate(false);\n };\n\n jBody.on('keyup.timelinecell', keyPressFn);\n };\n }\n\n function mouseMoveOnEmptyCellFn(offsetDayStart:number, mouseDownType:any) {\n return (ev:JQuery.MouseMoveEvent) => {\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 const moved = renderer.onDaysMoved(renderInfo.change, dayUnderCursor, widthInDays, mouseDownType);\n renderer.assignDateValues(renderInfo.change, labels, moved);\n renderer.update(bar, labels, renderInfo);\n };\n }\n\n function deactivate(cancelled:boolean) {\n workPackageTimeline.disableViewParamsCalculation = false;\n\n cell.onmousemove = handleMouseMoveOnEmptyCell;\n cell.onmousedown = _.noop;\n cell.onmouseleave = _.noop;\n cell.onmouseup = _.noop;\n\n bar.style.pointerEvents = 'auto';\n\n jBody.off('.timelinecell');\n jBody.off('.emptytimelinecell');\n workPackageTimeline.resetCursor();\n mouseDownStartDay = null;\n dateStates = {};\n\n // const renderInfo = getRenderInfo();\n if (cancelled || renderInfo.change.isEmpty()) {\n cancelChange();\n } else {\n const stopAndRefresh = () => {\n renderInfo.change.clear();\n renderer.onMouseDownEnd(labels, renderInfo.change);\n };\n\n // Persist the changes\n saveWorkPackage(renderInfo.change)\n .then(stopAndRefresh)\n .catch((error) => {\n notificationService.handleRawError(error, renderInfo.workPackage);\n cancelChange();\n });\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 { RenderInfo } from '../wp-timeline';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\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';\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\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","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 { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport { classNameBarLabel, classNameLeftHandle, classNameRightHandle } from './wp-timeline-cell-mouse-handler';\nimport {\n classNameFarRightLabel,\n classNameHideOnHover,\n classNameHoverStyle,\n classNameLeftHoverLabel,\n classNameLeftLabel,\n classNameRightContainer,\n classNameRightHoverLabel,\n classNameRightLabel,\n classNameShowOnHover,\n WorkPackageCellLabels,\n} from './wp-timeline-cell';\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';\n\nclass TimezoneService {\n}\n\nexport class TimelineCellRenderer {\n @InjectField() wpTableTimeline:WorkPackageViewTimelineService;\n\n @InjectField() TimezoneService:TimezoneService;\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 fieldRenderer:DisplayFieldRenderer = new DisplayFieldRenderer(this.injector, 'timeline');\n\n protected dateDisplaysOnMouseMove:{ left?:HTMLElement; right?:HTMLElement } = {};\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) {\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 days = Math.floor(ev.offsetX / renderInfo.viewParams.pixelPerDay);\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 = '30px';\n placeholder.style.zIndex = '9999';\n placeholder.style.left = `${days * renderInfo.viewParams.pixelPerDay}px`;\n\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(change:WorkPackageChangeset,\n labels:WorkPackageCellLabels,\n dates:any):void {\n this.assignDate(change, 'startDate', dates.startDate);\n this.assignDate(change, 'dueDate', dates.dueDate);\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:'left'|'right'|'both'|'create'|'dragright'):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 dates.dueDate = moment(initialDueDate || now).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,\n elem:HTMLElement):'left'|'right'|'both'|'dragright'|'create' {\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 const projection = renderInfo.change.projectedResource;\n let direction:'left'|'right'|'both'|'dragright';\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.workPackageTimeline.forceCursor('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.workPackageTimeline.forceCursor('col-resize');\n } else {\n // both\n direction = 'both';\n this.workPackageTimeline.forceCursor('ew-resize');\n }\n\n if (dateForCreate) {\n projection.startDate = dateForCreate;\n projection.dueDate = dateForCreate;\n direction = 'dragright';\n }\n\n this.updateLabels(true, labels, renderInfo.change);\n\n return direction;\n }\n\n public onMouseDownEnd(labels:WorkPackageCellLabels, change:WorkPackageChangeset) {\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 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 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 /**\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\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';\nimport { CellDateMovement, LabelPosition, TimelineCellRenderer } from './timeline-cell-renderer';\nimport {\n classNameFarRightLabel,\n classNameHideOnHover,\n classNameHoverStyle,\n classNameLeftHoverLabel,\n classNameLeftLabel,\n classNameRightContainer,\n classNameRightHoverLabel,\n classNameRightLabel,\n classNameShowOnHover,\n WorkPackageCellLabels,\n} from './wp-timeline-cell';\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:'left' | 'right' | 'both' | 'create' | 'dragright') {\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,\n elem:HTMLElement):'left' | 'right' | 'both' | 'create' | 'dragright' {\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 { 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 );\n\n // finish date\n newParams.dateDisplayEnd = moment.max(\n newParams.dateDisplayEnd,\n currentParams.now,\n dueDate,\n date,\n );\n });\n\n // left spacing\n newParams.dateDisplayStart = newParams.dateDisplayStart.subtract(currentParams.dayCountForMarginLeft, 'days');\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 = newParams.dateDisplayEnd.add(visibleDays, 'days');\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, OnInit, 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 implements OnInit {\n public text:any;\n\n constructor(readonly I18n:I18nService,\n readonly injector:Injector,\n readonly opModalService:OpModalService,\n readonly opContextMenu:OPContextMenuService) {\n }\n\n ngOnInit():void {\n this.text = {\n configureTable: I18n.t('js.toolbar.settings.configure_view'),\n };\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 \n {{ descriptor.label }}\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, Injector, Input, AfterViewInit,\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 { fromEvent } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\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})\nexport class WorkPackageFormAttributeGroupComponent extends UntilDestroyedMixin implements AfterViewInit {\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 ngAfterViewInit() {\n setTimeout(() => this.fixColumns());\n\n // Listen to resize event and fix column start again\n fromEvent(window, 'resize', { passive: true })\n .pipe(\n this.untilDestroyed(),\n debounceTime(250),\n )\n .subscribe(() => {\n this.fixColumns();\n });\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 /**\n * Fix the top of the columns after view has been loaded\n * to prevent columns from repositioning (e.g. when editing multi-select fields)\n */\n private fixColumns() {\n let lastOffset = 0;\n // Find corresponding HTML of attribute fields for each group\n const htmlAttributes = jQuery(`div.attributes-group:contains(${this.group.name})`).find('.attributes-key-value');\n\n htmlAttributes.each(function () {\n const offset = jQuery(this).position().top;\n\n if (offset < lastOffset) {\n // Fix position of the column start\n jQuery(this).addClass('-column-start');\n }\n lastOffset = offset;\n });\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';\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';\n\n@NgModule({\n imports: [\n CommonModule,\n IconModule,\n ],\n declarations: [\n FileLinkListComponent,\n FileLinkListItemComponent,\n StorageInformationComponent,\n ],\n exports: [\n FileLinkListComponent,\n ],\n providers: [\n CookieService,\n ],\n})\nexport class OpenprojectFileLinksModule {}\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 EventEmitter,\n Input,\n Output,\n} from '@angular/core';\n\n@Component({\n selector: 'op-modal-banner',\n templateUrl: './modal-banner.component.html',\n styleUrls: ['./modal-banner.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OpModalBannerComponent {\n @Input() type:'info'|'warning' = 'info';\n\n @Input() title:string;\n\n @Input() subtitle:string;\n\n @Input() actionButton?:string;\n\n @Input() actionButtonClasses?:string;\n\n @Output() buttonClicked = new EventEmitter();\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 Input,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { DatepickerModalService } from 'core-app/shared/components/datepicker/datepicker.modal.service';\nimport {\n map,\n take,\n} from 'rxjs/operators';\nimport { StateService } from '@uirouter/core';\n\n@Component({\n selector: 'op-datepicker-banner',\n templateUrl: './datepicker-banner.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DatepickerBannerComponent {\n @Input() scheduleManually = false;\n\n hasRelations$ = this.datepickerService.hasRelations$;\n\n hasPrecedingRelations$ = this\n .datepickerService\n .precedingWorkPackages$\n .pipe(\n map((relations) => relations?.length > 0),\n );\n\n hasFollowingRelations$ = this\n .datepickerService\n .followingWorkPackages$\n .pipe(\n map((relations) => relations?.length > 0),\n );\n\n isParent = this.datepickerService.isParent;\n\n isChild = this.datepickerService.isChild;\n\n text = {\n automatically_scheduled_parent: this.I18n.t('js.work_packages.datepicker_modal.automatically_scheduled_parent'),\n manually_scheduled: this.I18n.t('js.work_packages.datepicker_modal.manually_scheduled'),\n start_date_limited_by_relations: this.I18n.t('js.work_packages.datepicker_modal.start_date_limited_by_relations'),\n changing_dates_affects_follow_relations: this.I18n.t('js.work_packages.datepicker_modal.changing_dates_affects_follow_relations'),\n click_on_show_relations_to_open_gantt: this.I18n.t(\n 'js.work_packages.datepicker_modal.click_on_show_relations_to_open_gantt',\n { button_name: this.I18n.t('js.work_packages.datepicker_modal.show_relations') },\n ),\n show_relations_button: this.I18n.t('js.work_packages.datepicker_modal.show_relations'),\n };\n\n constructor(\n readonly datepickerService:DatepickerModalService,\n readonly injector:Injector,\n readonly I18n:I18nService,\n readonly state:StateService,\n ) {}\n\n openGantt(evt:MouseEvent):void {\n evt.preventDefault();\n\n this\n .datepickerService\n .getInvolvedWorkPackageIds()\n .pipe(\n take(1),\n )\n .subscribe((ids) => {\n const props = {\n c: ['id', 'subject', 'type', 'status', 'assignee', 'project', 'createdAt'],\n t: 'id:asc',\n tv: true,\n hi: true,\n f: [{ n: 'id', o: '=', v: ids }],\n };\n\n const href = this.state.href(\n 'work-packages.partitioned.list',\n {\n query_id: null,\n projects: null,\n projectPath: null,\n query_props: JSON.stringify(props),\n },\n );\n window.open(href, '_blank');\n });\n }\n}\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 { Injector, NgModule } 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 {\n WorkPackageEmbeddedTableComponent,\n} from 'core-app/features/work-packages/components/wp-table/embedded/wp-embedded-table.component';\nimport {\n WorkPackageEmbeddedTableEntryComponent,\n} from 'core-app/features/work-packages/components/wp-table/embedded/wp-embedded-table-entry.component';\nimport {\n WorkPackageTablePaginationComponent,\n} from 'core-app/features/work-packages/components/wp-table/table-pagination/wp-table-pagination.component';\nimport {\n WorkPackageTimelineTableController,\n} from 'core-app/features/work-packages/components/wp-table/timeline/container/wp-timeline-container.directive';\nimport {\n WorkPackageInlineCreateComponent,\n} from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.component';\nimport {\n OpTypesContextMenuDirective,\n} from 'core-app/shared/components/op-context-menu/handlers/op-types-context-menu.directive';\nimport {\n OpColumnsContextMenu,\n} from 'core-app/shared/components/op-context-menu/handlers/op-columns-context-menu.directive';\nimport {\n OpSettingsMenuDirective,\n} from 'core-app/shared/components/op-context-menu/handlers/op-settings-dropdown-menu.directive';\nimport {\n WorkPackageStatusDropdownDirective,\n} from 'core-app/shared/components/op-context-menu/handlers/wp-status-dropdown-menu.directive';\nimport {\n WorkPackageCreateSettingsMenuDirective,\n} from 'core-app/shared/components/op-context-menu/handlers/wp-create-settings-menu.directive';\nimport {\n WorkPackageSingleContextMenuDirective,\n} from 'core-app/shared/components/op-context-menu/wp-context-menu/wp-single-context-menu';\nimport {\n WorkPackageTimelineHeaderController,\n} from 'core-app/features/work-packages/components/wp-table/timeline/header/wp-timeline-header.directive';\nimport {\n WorkPackageTableTimelineRelations,\n} from 'core-app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-relations.directive';\nimport {\n WorkPackageTableTimelineStaticElements,\n} from 'core-app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-static-elements.directive';\nimport {\n WorkPackageTableTimelineGrid,\n} from 'core-app/features/work-packages/components/wp-table/timeline/grid/wp-timeline-grid.directive';\nimport {\n WorkPackageTimelineButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-timeline-toggle-button/wp-timeline-toggle-button.component';\nimport {\n WorkPackageOverviewTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/overview-tab/overview-tab.component';\nimport {\n WorkPackageStatusButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-status-button/wp-status-button.component';\nimport {\n WorkPackageReplacementLabelComponent,\n} from 'core-app/features/work-packages/components/wp-edit/wp-edit-field/wp-replacement-label.component';\nimport {\n NewestActivityOnOverviewComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-on-overview.component';\nimport {\n WorkPackageActivityTabComponent,\n} 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 {\n WpCustomActionComponent,\n} from 'core-app/features/work-packages/components/wp-custom-actions/wp-custom-actions/wp-custom-action.component';\nimport {\n WpCustomActionsComponent,\n} from 'core-app/features/work-packages/components/wp-custom-actions/wp-custom-actions.component';\nimport {\n WorkPackageRelationsTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/relations-tab/relations-tab.component';\nimport {\n WorkPackageRelationsComponent,\n} from 'core-app/features/work-packages/components/wp-relations/wp-relations.component';\nimport {\n WorkPackageRelationsGroupComponent,\n} from 'core-app/features/work-packages/components/wp-relations/wp-relations-group/wp-relations-group.component';\nimport {\n WorkPackageRelationRowComponent,\n} from 'core-app/features/work-packages/components/wp-relations/wp-relation-row/wp-relation-row.component';\nimport {\n WorkPackageRelationsCreateComponent,\n} from 'core-app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-create.component';\nimport {\n WorkPackageRelationsHierarchyComponent,\n} from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.directive';\nimport {\n WorkPackageCreateButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-create-button/wp-create-button.component';\nimport {\n WorkPackageFilterButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-filter-button/wp-filter-button.component';\nimport {\n WorkPackageDetailsViewButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-details-view-button/wp-details-view-button.component';\nimport {\n WorkPackageFoldToggleButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-fold-toggle-button/wp-fold-toggle-button.component';\nimport {\n WpTableConfigurationModalComponent,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\nimport {\n WpTableConfigurationColumnsTabComponent,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/columns-tab.component';\nimport {\n WpTableConfigurationDisplaySettingsTabComponent,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/display-settings-tab.component';\nimport {\n WpTableConfigurationFiltersTab,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/filters-tab.component';\nimport {\n WpTableConfigurationSortByTabComponent,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/sort-by-tab.component';\nimport {\n WpTableConfigurationTimelinesTabComponent,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/timelines-tab.component';\nimport {\n WpTableConfigurationHighlightingTabComponent,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/highlighting-tab.component';\nimport {\n WpTableConfigurationRelationSelectorComponent,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration-relation-selector';\nimport {\n WorkPackageWatchersTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/watchers-tab.component';\nimport {\n WorkPackageWatcherEntryComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watcher-entry.component';\nimport {\n WorkPackageNewSplitViewComponent,\n} from 'core-app/features/work-packages/components/wp-new/wp-new-split-view.component';\nimport {\n WorkPackageNewFullViewComponent,\n} from 'core-app/features/work-packages/components/wp-new/wp-new-full-view.component';\nimport {\n EmbeddedTablesMacroComponent,\n} 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 {\n WorkPackageTableSumsRowController,\n} from 'core-app/features/work-packages/components/wp-table/wp-table-sums-row/wp-table-sums-row.directive';\nimport {\n ExternalQueryConfigurationComponent,\n} from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.component';\nimport {\n ExternalQueryConfigurationService,\n} from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.service';\nimport {\n ExternalRelationQueryConfigurationComponent,\n} from 'core-app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.component';\nimport {\n ExternalRelationQueryConfigurationService,\n} from 'core-app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.service';\nimport {\n WorkPackagesListInvalidQueryService,\n} 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 {\n WorkPackageWatchersService,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watchers.service';\nimport {\n WorkPackagesActivityService,\n} 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 {\n WorkPackageChildrenQueryComponent,\n} from 'core-app/features/work-packages/components/wp-relations/embedded/children/wp-children-query.component';\nimport {\n WpRelationInlineAddExistingComponent,\n} from 'core-app/features/work-packages/components/wp-relations/embedded/inline/add-existing/wp-relation-inline-add-existing.component';\nimport {\n WorkPackageRelationQueryComponent,\n} 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 {\n WorkPackageSplitViewComponent,\n} from 'core-app/features/work-packages/routing/wp-split-view/wp-split-view.component';\nimport {\n WorkPackagesFullViewComponent,\n} 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 {\n WorkPackageCardViewComponent,\n} from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport {\n WorkPackageRelationsService,\n} from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { OpenprojectBcfModule } from 'core-app/features/bim/bcf/openproject-bcf.module';\nimport {\n WorkPackageRelationsAutocompleteComponent,\n} from 'core-app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-autocomplete/wp-relations-autocomplete.component';\nimport {\n CustomDateActionAdminComponent,\n} from 'core-app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.component';\nimport {\n WorkPackagesTableConfigMenuComponent,\n} from 'core-app/features/work-packages/components/wp-table/config-menu/config-menu.component';\nimport {\n WorkPackageViewToggleButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-view-toggle-button/work-package-view-toggle-button.component';\nimport {\n WorkPackageViewDropdownMenuDirective,\n} 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 {\n WorkPackageNotificationService,\n} from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport {\n WorkPackageEditActionsBarComponent,\n} 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 {\n WorkPackageSingleCardComponent,\n} from 'core-app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component';\nimport {\n WorkPackageListViewComponent,\n} from 'core-app/features/work-packages/routing/wp-list-view/wp-list-view.component';\nimport {\n PartitionedQuerySpacePageComponent,\n} from 'core-app/features/work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component';\nimport {\n WorkPackageViewPageComponent,\n} from 'core-app/features/work-packages/routing/wp-view-page/wp-view-page.component';\nimport {\n WorkPackageSettingsButtonComponent,\n} 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 {\n WorkPackageGroupToggleDropdownMenuDirective,\n} from 'core-app/shared/components/op-context-menu/handlers/wp-group-toggle-dropdown-menu.directive';\nimport {\n OpenprojectAutocompleterModule,\n} from 'core-app/shared/components/autocompleter/openproject-autocompleter.module';\nimport { OpWpTabsModule } from 'core-app/features/work-packages/components/wp-tabs/wp-tabs.module';\nimport {\n EditFieldControlsModule,\n} from 'core-app/shared/components/fields/edit/field-controls/edit-field-controls.module';\nimport { DatePickerModalComponent } from 'core-app/shared/components/datepicker/datepicker.modal';\nimport { WpTableExportModalComponent } from 'core-app/shared/components/modals/export-modal/wp-table-export.modal';\nimport {\n WpButtonMacroModalComponent,\n} 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 {\n WorkPackageTypeStatusComponent,\n} from 'core-app/features/work-packages/components/wp-type-status/wp-type-status.component';\nimport {\n WorkPackageIsolatedQuerySpaceDirective,\n} from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\nimport {\n WorkPackageBreadcrumbParentComponent,\n} from 'core-app/features/work-packages/components/wp-breadcrumb/wp-breadcrumb-parent.component';\nimport {\n WorkPackageSubjectComponent,\n} from 'core-app/features/work-packages/components/wp-subject/wp-subject.component';\nimport {\n WorkPackageBreadcrumbComponent,\n} 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 {\n WorkPackageCommentComponent,\n} from 'core-app/features/work-packages/components/work-package-comment/work-package-comment.component';\nimport {\n WorkPackageWatcherButtonComponent,\n} from 'core-app/features/work-packages/components/wp-watcher-button/wp-watcher-button.component';\nimport {\n WorkPackageCommentFieldComponent,\n} 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 {\n WorkPackageIsolatedGraphQuerySpaceDirective,\n} from 'core-app/features/work-packages/directives/query-space/wp-isolated-graph-query-space.directive';\nimport {\n RevisionActivityComponent,\n} from 'core-app/features/work-packages/components/wp-activity/revision/revision-activity.component';\nimport {\n WorkPackageCopySplitViewComponent,\n} from 'core-app/features/work-packages/components/wp-copy/wp-copy-split-view.component';\nimport {\n WorkPackageFormAttributeGroupComponent,\n} 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 {\n ActivityEntryComponent,\n} 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 {\n UserActivityComponent,\n} from 'core-app/features/work-packages/components/wp-activity/user/user-activity.component';\nimport {\n WorkPackageSplitViewToolbarComponent,\n} from 'core-app/features/work-packages/components/wp-details/wp-details-toolbar.component';\nimport {\n WorkPackageCopyFullViewComponent,\n} 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 {\n AttachmentsUploadComponent,\n} from 'core-app/shared/components/attachments/attachments-upload/attachments-upload.component';\nimport {\n AttachmentListComponent,\n} from 'core-app/shared/components/attachments/attachment-list/attachment-list.component';\nimport {\n QueryFiltersComponent,\n} from 'core-app/features/work-packages/components/filters/query-filters/query-filters.component';\nimport {\n FilterDateTimesValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-date-times-value/filter-date-times-value.component';\nimport {\n FilterSearchableMultiselectValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-searchable-multiselect-value/filter-searchable-multiselect-value.component';\nimport {\n QueryFilterComponent,\n} from 'core-app/features/work-packages/components/filters/query-filter/query-filter.component';\nimport {\n FilterDatesValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-dates-value/filter-dates-value.component';\nimport {\n FilterStringValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-string-value/filter-string-value.component';\nimport {\n FilterProjectComponent,\n} from 'core-app/features/work-packages/components/filters/filter-project/filter-project.component';\nimport {\n FilterDateValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-date-value/filter-date-value.component';\nimport {\n FilterDateTimeValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-date-time-value/filter-date-time-value.component';\nimport {\n FilterToggledMultiselectValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-toggled-multiselect-value/filter-toggled-multiselect-value.component';\nimport {\n WorkPackageFilterByTextInputComponent,\n} from 'core-app/features/work-packages/components/filters/quick-filter-by-text-input/quick-filter-by-text-input.component';\nimport {\n FilterIntegerValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-integer-value/filter-integer-value.component';\nimport {\n WorkPackageFilterContainerComponent,\n} from 'core-app/features/work-packages/components/filters/filter-container/filter-container.directive';\nimport {\n FilterBooleanValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-boolean-value/filter-boolean-value.component';\nimport {\n WorkPackageMarkNotificationButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-mark-notification-button/work-package-mark-notification-button.component';\nimport {\n WorkPackageFilesTabComponent,\n} 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';\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\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 DatePickerModalComponent,\n DatepickerBannerComponent,\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 const inviteModal = this.opModalService.show(this.inviteModal, 'global');\n inviteModal.closingEvent.subscribe((modal:any) => {\n console.log('Modal closed!', modal);\n });\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 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.fetchNotifications(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 { 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 // Fetch file link collections for work package (only if storages module is enabled)\n if (this.workPackage.$links.fileLinks) {\n this.fileLinkResourceService.updateCollectionsForWorkPackage(this.workPackage.$links.fileLinks.href as string);\n }\n\n // Fetch storages for work package's project (only if storages module is enabled)\n this.projectsResourceService\n .lookup((this.workPackage.project as unknown&{ id:string }).id)\n .pipe(this.untilDestroyed())\n .subscribe((project) => {\n if (project._links.storages) {\n this.storages.updateCollection(project._links.self.href, project._links.storages);\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\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 destroyConfirmation: this.I18n.t('js.text_attachment_destroy_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 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($event:JQuery.TriggeredEvent):boolean {\n if (!window.confirm(this.text.destroyConfirmation)) {\n $event.stopImmediatePropagation();\n $event.preventDefault();\n return false;\n }\n\n this.removeAttachment.emit();\n return false;\n }\n}\n","\n 0\"\n class=\"spot-list spot-list_compact op-files-tab--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 \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, 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 /* Close on escape? */\n public closeOnEscape = true;\n\n /* Close on outside click */\n public closeOnOutsideClick = false;\n\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(@Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef) {\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 fot 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 resourse\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 (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 //