{"version":3,"file":"main.f0e293e61420ccb5.js","mappings":"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78E,EAAIyiB,EAAQ8hB,EAAQ2nF,GAWnC,0CArLWzxB,GAAkBtvF,MAaTlb,MAAQkb,yCAbjBsvF,EAAkBvqG,QAAlBuqG,EAAkB,2DC9BxB,MAAMs2G,EAA8B,CACzC,+BACA,kCACA,sFACA,2DACA,8CACA,gDACA,8CACA,8BACA,uCACA,uCACA,yCACA,+DAMI,SAAUpF,EAA+BroL,GAC7C,OAAOA,EAAU/W,iBAAiBwkM,EAA4Bh/M,WAChE,gCCXM,SAAU81C,EAAU/O,GACxB,MAAO,GAAGkmC,oBAAwClmC,GACpD,gDCdO,IAAK+zD,8BAAQ,KAClBA,2BACAA,iBACAA,sBACAA,sBACAA,oBACAA,kBACAA,sBACAA,8BACAA,wBACAA,sBACAA,0BACAA,8BACAA,kBACAA,oBACAA,gCACAA,4BACAA,kCACAA,gCACAA,wBACAA,wBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,sBACAA,8BACAA,gCACAA,wBACAA,4BACAA,4BACAA,4BACAA,4BACAA,6BACAA,6BACAA,6BACAA,6BACAA,6BACAA,6BACAA,6BACAA,mBACAA,6BACAA,2BACAA,yBACAA,iBACAA,iBACAA,iBACAA,iBACAA,iBACAA,iBACAA,iBACAA,iBACAA,iBACAA,mBACAA,mBACAA,mBACAA,6BACAA,mCACAA,+BACAA,yBACAA,uBACAA,qBACAA,yBACAA,uCACAA,qCACAA,qCACAA,iCACAA,uCACAA,mECvEI,SAAUj/C,EAAsBz5B,GACpC,MAAM6rI,EAAW7rI,EAAMwmE,SAAWxmE,EAAM0mE,UAAY1mE,EAAMymE,QACpDo2H,EAAgC,IAAjB78L,EAAM6vG,OAE3B,OAAOg8B,GAAYgxD,CACrB,gDC7BM,SAAUntF,KAAiBtkC,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oDACA,uCAEA,kBACA,MACA,oDACA,sDACA,6CAEA,kBACA,MACA,oDACA,6CAEA,sBACA,MACA,oDACA,gEACA,kDACA,8DACA,SACA,iDAEA,8BACA,MACA,oDACA,SACA,yDAEA,gBACA,MACA,oDACA,2CAEA,oBACA,MACA,oDACA,+CAEA,kBACA,MACA,oDACA,6CAEA,gBACA,MACA,oDACA,2CAEA,sBACA,MACA,oDACA,iDAEA,gBACA,KACA,oDACA,2CAEA,sBACA,MACA,oDACA,iDAEA,sBACA,MACA,oDACA,SACA,iDAEA,gBACA,MACA,oDACA,2CAEA,oBACA,MACA,oDACA,+CAEA,wBACA,MACA,oDACA,mDAEA,gBACA,MACA,oDACA,2CAEA,gBACA,MACA,oDACA,4DACA,SACA,2CAEA,wBACA,MACA,oDACA,mDAEA,cACA,MACA,oDACA,yCAEA,sBACA,MACA,oDACA,iDAEA,kBACA,MACA,oDACA,gEACA,kDACA,8DACA,SACA,6CAEA,8BACA,KACA,oDACA,UAEA,0CACA,MACA,oDACA,SACA,qEAEA,wBACA,MACA,oDACA,UAEA,kBACA,MACA,oDACA,6CAEA,kCACA,MACA,oDACA,gEACA,kDACA,8DACA,SACA,6DAEA,4BACA,MACA,oDACA,gEACA,kDACA,+DAEA,kBACA,MACA,oDACA,6CAEA,gBACA,MACA,oDACA,2CAEA,8BACA,MACA,oDACA,iEAEA,sBACA,MACA,oDACA,iDAEA,gBACA,MACA,oDACA,gEACA,2CAEA,oBACA,MACA,oDACA,+CAEA,8BACA,MACA,oDACA,yDAEA,gBACA,MACA,oDACA,2CAEA,0BACA,KACA,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,KACA,oDACA,+CAEA,kBACA,MACA,oDACA,SACA,6CAEA,0BACA,MACA,oDACA,qDAEA,sBACA,KACA,oDACA,iDAEA,cACA,IACA,oDACA,yCAEA,sBACA,MACA,oDACA,iDAEA,oBACA,MACA,oDACA,gEACA,+CAEA,kBACA,MACA,oDACA,6CAEA,gBACA,MACA,oDACA,gEACA,kDACA,8DACA,sDACA,2CAEA,gBACA,MACA,oDACA,2CAEA,8BACA,MACA,oDACA,yDAEA,8BACA,MACA,oDACA,yDAEA,0BACA,MACA,oDACA,qDAEA,gBACA,MACA,oDACA,gEACA,kDACA,8DACA,UAEA,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,8DACA,SACA,6CAEA,4BACA,MACA,oDACA,uDAEA,sBACA,MACA,oDACA,iDAEA,kBACA,MACA,oDACA,6CAEA,gBACA,MACA,oDACA,gEACA,kDACA,8DACA,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,8DACA,SACA,mDAEA,oBACA,MACA,oDACA,+CAEA,0BACA,MACA,oDACA,qDAEA,kBACA,MACA,oDACA,6CAEA,sBACA,MACA,oDACA,iDAEA,kBACA,KACA,oDACA,SACA,6CAEA,cACA,MACA,oDACA,yCAEA,0BACA,MACA,oDACA,qDAEA,0BACA,MACA,oDACA,qDAEA,wBACA,MACA,oDACA,mDAEA,kBACA,MACA,oDACA,6CAEA,gBACA,MACA,oDACA,gEACA,kDACA,8DACA,wDACA,SACA,2CAEA,kBACA,MACA,oDACA,SACA,6CAEA,sBACA,MACA,oDACA,iDAEA,gBACA,KACA,oDACA,2CAEA,sBACA,MACA,oDACA,iDAEA,oBACA,MACA,oDACA,+CAEA,0CACA,MACA,oDACA,SACA,qEAEA,kBACA,MACA,oDACA,UAEA,gBACA,MACA,oDACA,4CAGA,cACA,aACA,mCACA,8CACA,gCACA7H,IAIA,kBACA,iDACAumJ,UAEA,CACA2rF,0BACAA,WACAjiL,uBCnqBA,cACA,8CACA,gCACAjwD,CACA,CACAmyO,cACAA,YACAA,WACAliL,4BCRAA,sBAAkCs2F,EAAQ,wBCA1C,OACA,aACA,gBACA,WACA,eACA,kBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,cACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,YACA,eACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,gBACA,mBACA,gBACA,mBACA,eACA,kBACA,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,WACA,cACA,aACA,gBACA,aACA,gBACA,YACA,eACA,mBACA,sBACA,kBACA,qBACA,aACA,gBACA,aACA,gBACA,WACA,cACA,aACA,gBACA,aACA,gBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,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,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,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,aACA,gBACA,aACA,gBACA,aACA,gBACA,cACA,iBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,gBACA,mBACA,cACA,iBACA,aACA,gBACA,cACA,iBACA,cACA,kBACA,qBACA,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,WACA,CACA,cACA,cACA,8CACA,gCACAvmJ,EAEA,WACA,CACAoyO,kBACA,qBACA,EACAA,YACAniL,YACAmiL,4BCnSA,OACA,iBACA,MACA,EACA,0DAEA,oBACA,MACA,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,MACA,EACA,UAEA,gCACA,MACA,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,mBACA,KACA,EACA,4DAEA,sBACA,KACA,EACA,4DAEA,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,gCACApyO,IAIA,kBACA,iDACAumJ,eAEA,CACA2rF,0BACAA,WACAjiL,6BC5SA,OACA,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,WACA,MACA,qBAEA,WACA,MACA,qBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,WACA,MACA,qBAEA,WACA,KACA,qBAEA,cACA,MACA,wBAEA,WACA,MACA,qBAEA,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,cACA,MACA,wBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,eACA,MACA,yBAEA,cACA,KACA,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,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,YACA,MACA,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,IACA,qBAEA,WACA,MACA,qBAEA,WACA,KACA,qBAEA,WACA,MACA,qBAEA,YACA,MACA,sBAEA,WACA,KACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,IACA,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,KACA,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,IACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,KACA,qBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,MACA,qBAEA,WACA,KACA,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,cACA,MACA,wBAEA,cACA,MACA,wBAEA,cACA,MACA,wBAEA,eACA,MACA,0BAGA,cACA,aACA,mCACA,8CACA,gCACAjwD,IAIA,kBACA,0BACAumJ,UAEA,CACA2rF,0BACAA,WACAjiL,6BC1gBA,OACA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,YACA,MACA,2CAEA,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,cACA,MACA,6CAEA,cACA,KACA,6CAEA,WACA,KACA,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,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,KACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,KACA,0CAEA,cACA,MACA,6CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,KACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,WACA,MACA,0CAEA,gBACA,MACA,+CAEA,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,cACA,MACA,6CAEA,WACA,KACA,2CAGA,cACA,aACA,mCACA,8CACA,gCACAjwD,IAIA,kBACA,0BACAumJ,UAEA,CACA2rF,0BACAA,WACAjiL","names":["ActiveWindowService","constructor","document","this","BehaviorSubject","addEventListener","visibilityState","debugLog","activeState$","next","isActive","value","active$","asObservable","_angular_core__WEBPACK_IMPORTED_MODULE_2__","DOCUMENT","factory","ApiV3GridPaths","ApiV3GettableResource","subResource","ApiV3GridForm","patch","resource","schema","payload","form","extractPayload","halResourceService","path","delete","ApiV3GridsPaths","ApiV3ResourceCollection","apiRoot","basePath","super","list","params","get","listParamsString","post","ApiV3Resource","createCache","requireAndStream","force","id","toString","cache","stale","observable","load","pipe","take","shareReplay","clearAndLoad","concat","state","values$","observe","refresh","toPromise","switchMap","$links","schemaCache","href","mapTo","of","touch","updateFor","cacheResponse","source$","tap","__decorate","InjectField","tslib_es6","States","SchemaCacheService","ApiV3TimeEntryPaths","ApiV3FormResource","clearSome","parent","HalResource","HalPayloadHelper","ApiV3Collection","observeAll","response","CollectionResource","_a","elements","forEach","bind","TimeEntryCacheService","StateCacheService","injector","updateValue","val","ensureLoaded","then","putValue","ApiV3TimeEntriesPaths","states","timeEntries","ApiV3CapabilityPaths","ApiV3CapabilitiesPaths","ApiV3AvailableProjectsPaths","exists","projectId","filters","ApiV3Filter","toJson","map","collection","count","ApiV3MembershipsForm","static","_links","project","principal","roles","role","_meta","notificationMessage","raw","request","ApiV3MembershipsPaths","ApiV3UserPreferencesPaths","ApiV3ResourcePath","http","withCredentials","responseType","HttpClient","ApiV3UserPaths","users","ApiV3UsersPaths","ApiV3TypePaths","ApiV3TypesPaths","types","ApiV3QueryOrder","SimpleResource","result","update","delta","t","wpIds","ApiV3QueryForm","query","name","queries","withOptionalId","queryFilters","setSchemas","$embedded","filtersSchemas","buildQueryResource","loadWithParams","queryId","projectIdentifier","projects","URI","search","createHalResourceOfType","QueryFiltersService","ApiV3QueryPaths","parameterised","QueryResource","mapSchemasIntoFilters","paginated","pagination","ApiV3QueriesPaths","find","queryData","withOptionalProject","default","toggleStarred","starred","unstar","star","ApiV3RelationsPaths","loadInvolved","workPackageIds","validIds","_","filter","test","length","from","filtered","getPaginatedResults","ApiV3WorkPackageForm","forTypePayload","type","forPayload","ApiV3WorkPackagePaths","WorkPackageCache","schemaCacheService","updateWorkPackage","wp","immediate","isNewResource","updateWorkPackageList","skipOnIdentical","i","workPackageId","multiState","hasValue","isEqual","$source","core","ApiV3WorkPackageCachedSubresource","schemas","updateSchemas","ApiV3WorkPackagesPaths","requireAll","ids","Promise","resolve","reject","loadCollectionsFor","uniq","pagedResults","each","results","undefined","filterByTypeaheadOrId","term","idOnly","additionalParams","ApiV3FilterBuilder","add","Object","sortBy","offset","pageSize","filterUpdatedSince","timestamp","n","getAllPaginated","workPackages","ApiV3VersionPaths","version","versions","ApiV3VersionsPaths","ApiV3ProjectCopyPaths","ApiV3ProjectPaths","ProjectCache","ApiV3ProjectsPaths","ApiV3StatusPaths","statuses","ApiV3StatusesPaths","ApiV3RolePaths","ApiV3RolesPaths","ApiV3NewsPaths","ApiV3HelpTextsPaths","ApiV3ConfigurationPath","$configuration","Board","grid","editable","updateImmediately","isFree","isAction","options","actionAttribute","attribute","highlightingMode","addQuery","widget","isNewWidget","widgets","push","removeQuery","el","createdAt","sortWidgets","sort","a","b","startColumn","showStatusButton","ApiV3BoardPath","grids","newBoard","save","board","fetchSchema","ApiV3BoardsPaths","authorisationService","initModelAuth","allInScope","boardPath","MAGIC_PAGE_NUMBER","create","scope","createGrid","PathHelper","projectBoardsPath","forType","set","AuthorisationService","PathHelperService","ApiV3PlaceholderUserPaths","ApiV3PlaceholderUsersPaths","ApiV3GroupPaths","ApiV3GroupsPaths","ApiV3NotificationPaths","markRead","markUnread","ApiV3NotificationsPaths","facet","unread","listPath","additional","markAsReadByIds","markAsReadByFilter","f","ApiV3ViewsPaths","view","Apiv3BackupsPath","backupToken","includeAttachments","attachments","ApiV3DayPaths","ApiV3DaysPaths","Apiv3StoragesPaths","ApiV3Service","pathHelper","apiV3CollectionEndpoint","apiV3CustomEndpoint","apiV3SingularEndpoint","isNil","collectionFromString","fullPath","replace","api","v3","apiV3Base","segment","cls","holdValuesForSeconds","cacheDurationInMs","current","fallback","getValueOr","loader","share","clearAndPutFromPromise","changes$","observeChange","startWith","auditTime","mapped","clear","hasActivePromiseRequest","isPristine","isValueOlderThan","startRow","endRow","endColumn","identifier","addFiltersToPath","url","URL","window","location","origin","searchParams","has","existingFilters","JSON","parse","stringify","keys","key","getPaginatedCollections","mergeMap","resolvedSize","total","remaining","pagesRemaining","Math","ceil","calls","Array","fill","forkJoin","reduce","acc","extractCollectionElements","_embedded","queryProps","groupBy","select","join","filterParam","toParams","queryPropsString","tslib__WEBPACK_IMPORTED_MODULE_4__","HalResourceService","ApiV3GettableResourceCollection","pageParams","SimpleResourceCollection","input","toPath","resourceClass","pathname","signalled","separator","startsWith","BrowserDetector","documentElement","isMobile","hasBodyClass","isEdge","body","classList","contains","_angular_core__WEBPACK_IMPORTED_MODULE_0__","DeviceService","innerWidth","mobileWidthTreshold","ConfigurationService","I18n","apiV3Service","initialized","loadConfiguration","catch","commentsSortedInDescendingOrder","userPreference","warnOnLeavingUnsaved","autoHidePopups","isTimezoneSet","timezone","isDirectUploads","prepareAttachmentURL","configuration","maximumAttachmentFileSize","systemPreference","perPageOptions","dateFormatPresent","dateFormat","timeFormatPresent","timeFormat","startOfWeekPresent","startOfWeek","moment","locale","firstDayOfWeek","hostName","activeFeatureFlags","pref","_angular_core__WEBPACK_IMPORTED_MODULE_3__","CurrentProjectService","detect","inProjectContext","projectPath","apiv3Path","getCurrent","element","querySelector","dataset","projectName","CurrentUserModule","bootstrapModule","currentUserService","CurrentUserService","ErrorReporter","addHook","user$","user","userMeta","querySelectorAll","setUser","mail","_angular_core__WEBPACK_IMPORTED_MODULE_4__","CurrentUserStore","CurrentUserQuery","Query","store","currentUserStore","currentUserQuery","capabilitiesService","isLoggedIn$","setupLegacyDataListeners","capabilities$","actions","projectContext","principalFilter$","userFilter","require","hasCapabilities$","action","castArray","capabilities","contextAction","cap","endsWith","distinctUntilChanged","hasAnyCapabilityOf$","actionsToFilter","subscribe","_user","isLoggedIn","_isLoggedIn","userId","language","_angular_core__WEBPACK_IMPORTED_MODULE_9__","Store","tslib__WEBPACK_IMPORTED_MODULE_2__","StoreConfig","TimezoneService","configurationService","setupLocale","parseDatetime","datetime","format","d","local","tz","parseDate","date","parseISODatetime","parseISODate","formattedDate","getDateFormat","daysFromToday","dateString","today","startOf","diff","formattedTime","datetimeString","getTimeFormat","formattedDatetime","c","formattedDatetimeComponents","formattedRelativeDateTime","fromNow","toHours","durationString","Number","asHours","toFixed","toDays","asDays","toISODuration","unit","toIsoString","formattedDuration","formattedISODate","formattedISODateTime","isValidISODate","isValid","isValidISODateTime","dateTime","WeekdayService","isNonWorkingDay","isoDayOfWeek","isoWeekday","weekdays","wd","day","working","nonWorkingDays","loadWeekdays","weekdaysService","_angular_core__WEBPACK_IMPORTED_MODULE_6__","tslib__WEBPACK_IMPORTED_MODULE_7__","WeekdayResourceService","BannersService","_banners","eeShowBanners","getEnterPriseEditionUrl","referrer","hash","enterpriseEditionUrl","conditional","bannersVisible","bannersNotVisible","callMaybe","func","_angular_core__WEBPACK_IMPORTED_MODULE_1__","OpenProjectDirectFileUploadService","OpenProjectFileUploadService","uploadSingle","file","method","getDirectUploadFormFrom","uploadToExternal","append","customName","headers","EXTERNAL_REQUEST_HEADER","reportProgress","finishUpload","event","HttpResponse","_c","_b","completeUpload","fileName","contentType","getType","formData","FormData","metadata","description","fileSize","size","addAttachment","form_fields","halResource","uploadAndMapResponse","files","uploads","finished","upload","uploadUrl","staticDownloadLocation","whenFinished","promises","evt","HttpEventType","createHalResource","all","_angular_core__WEBPACK_IMPORTED_MODULE_5__","GonService","gon","titlePartsSeparator","OpTitleService","titleService","getTitle","titleParts","split","setFirstPart","parts","setTitle","prependFirstPart","unshift","I18nService","i18n","lookup","toTime","toNumber","toPercentage","toCurrency","strftime","toHumanSize","withLoadingIndicator","indicator","delayStopTime","start","delayedStop","stop","withDelayedLoadingIndicator","setTimeout","LoadingIndicator","promise","stopper","prepend","indicatorTemplate","time","remove","LoadingIndicatorService","table","wpDetails","modal","getter","getIndicatorAt","jQuery","MainMenuToggleService","deviceService","getElementsByTagName","titleData","changeData","initializeMenu","mainMenu","elementWidth","parseInt","OpenProject","guardedLocalStorage","localStorageKey","menuCollapsed","localStorageStateKey","closeMenu","setWidth","saveWidth","offsetWidth","currentProject","hasClass","defaultWidth","closeWhenOnMobile","toggleNavigation","stopPropagation","preventDefault","showNavigation","savedWidth","widthToSave","elementMinWidth","first","focus","blur","width","String","maxMenuWidth","snapBack","setToggleTitle","toggleClassHidden","global","htmlNode","style","setProperty","changeEvent","Event","toggleTitle","hideElements","toggleClass","tslib__WEBPACK_IMPORTED_MODULE_6__","modelName","modelLinks","links","doModify","observeUntil","unsubscribe","takeUntil","can","cannot","ApiV3Paths","openApiSpecPath","previewMarkup","context","base","principals","appBasePath","staticBase","attachmentDownloadPath","attachmentIdentifier","slug","attachmentContentPath","fileLinksPath","ifcModelsPath","ifcModelsNewPath","ifcModelsEditPath","modelId","ifcModelsDeletePath","bimDetailsPath","viewpoint","highlightingCssPath","forumPath","forumIdentifier","projectForumPath","keyboardShortcutsHelpPath","messagePath","messageIdentifier","myPagePath","myNotificationsSettingsPath","newsPath","newsId","notificationsPath","loginPath","projectsPath","projectsNewPath","projectActivityPath","projectCalendarPath","projectMembershipsPath","projectNewsPath","projectTimeEntriesPath","projectWikiPath","projectWorkPackagePath","wpId","projectWorkPackagesPath","projectWorkPackageNewPath","projectDashboardsPath","timeEntriesPath","suffix","workPackagePath","usersPath","groupsPath","placeholderUsersPath","userPath","placeholderUserPath","groupPath","rolesPath","rolePath","versionsPath","versionEditPath","versionShowPath","workPackagesPath","workPackageCopyPath","workPackageDetailsCopyPath","workPackagesBulkDeletePath","textFormattingHelp","FirstRouteService","isEmpty","setIfFirst","stateName","stateKey","Error","_type","WorkPackageSchemaProxy","SchemaProxy","getSchemaHref","loadAll","hrefs","_angular_core__WEBPACK_IMPORTED_MODULE_7__","contactUrl","en","de","pricingUrl","enterpriseDocsUrl","website","boards","tableHighlighting","graphWidgets","DynamicBootstrapper","defs","optionalBoostrapComponents","appRef","doc","definitions","performBootstrap","embeddable","root","embedded","selector","target","closest","bootstrap","setAttribute","demoProjectName","scrumDemoProjectName","onboardingTourStorageKey","ProjectName","matchingFilter","filterFunction","waitForElement","containerSelector","execFunction","container","initial","MutationObserver","mutations","observerInstance","matches","disconnect","childList","subtree","demoProjectsLinks","demoProjects","demoProjectsLink","scrumDemoProjectsLink","preventClickHandler","e","$","_i","tree","selectedPage","data","selected","scrollIntoView","on","toggle","which","GlobalHelpers","checkAll","checked","toggleCheckboxesBySelector","boxes","all_checked","getPluginContext","pluginContext","urlRoot","attr","environment","edition","isStandardEdition","isBimEdition","newValue","localStorage","getItem","setItem","console","error","ActionsService","Subject","ofType","actions$","dispatch","AttachmentsStore","EntityStore","createInitialCollectionState","AttachmentsResourceService","ResourceCollectionService","requireCollection","getValue","collections","fetchAttachments","attachmentsSelfLink","insertCollectionIntoState","catchError","toastService","addError","removeAttachment","collectionKey","attachment","HttpHeaders","removeEntityFromCollectionAndState","attachFiles","getAttachmentsSelfLink","HAL_NEW_RESOURCE_ID","getUploadTarget","isDirectUpload","getDirectUploadLink","addAttachments","uploadHref","uploadAttachments","applyTransaction","E","directFileUploadService","fileUploadService","message","notification","addAttachmentUpload","prepareAttachment","createStore","ToastService","CapabilitiesStore","CapabilitiesResourceService","require$","collectionExists","collectionLoading","loadedCollection","fetchCapabilities","loadedCapabilities$","contextId","selectAll","fetchCollection","mapHALCollectionToIDCollection","loadingCollections","setCollectionLoading","collectionUrl","w","removeCollectionLoading","upsertMany","x","entityId","extendCollectionElementsWithId","idFromLink","self","DayStore","DayResourceService","days","isNonWorkingDay$","requireNonWorkingYear$","findIndex","endOf","requireNonWorkingYears$","end","collectionURL","finalize","WeekdayStore","selectHasCache","hasCache","EMPTY","fetchWeekdays","week","EffectHandlers","Symbol","EffectHandler","args","handlers","prototype","item","takeWhile","serviceDestroyed","instance","callback","call","ngOnDestroy","EffectCallback","service","property","descriptor","Map","FileLinksStore","FileLinksResourceService","file_links","updateCollectionsForWorkPackage","fileLinksSelfLink","fileLink","storage","group$","seed","fileLinks","fileLinkCollections","storageId","group","updateCollection","addFileLinks","addFileLinksHref","filesToLink","originData","newFileLinks","k","link","NOTIFICATIONS_MAX_SIZE","markNotificationsAsRead","props","markNotificationsAsReadByFilters","notificationsMarkedRead","notificationCountIncreased","centerUpdatedInPlace","InAppNotificationsStore","InAppNotificationsResourceService","inAppNotification","markAsRead","notifications","readIAN","isDefinedEntity","entity","isNotNull","PrincipalsStore","PrincipalsResourceService","fetchUser","fetchPrincipals","ProjectsStore","ProjectsResourceService","QueryEntity","collectionState","selectMany","selectEntity","lookupMany","hasEntity","omit","fetchResults","handleErrors","handleCollectionLoadingError","_collectionKey","_angular_core__WEBPACK_IMPORTED_MODULE_12__","StorageFilesStore","resettable","StorageFilesResourceService","httpClient","combineLatest","storageFiles","insert","uploadLink","reset","fileIds","parentId","p","StoragesStore","StoragesResourceService","storageLinks","storages","storageCollection","ViewsStore","ViewsResourceService","views","StatesGroup","multiInput","forResource","camelCase","backlogsPageComponentSelector","BacklogsPageComponent","ngOnInit","getElementById","hidden","selectors","BcfResourcePath","BcfResourceCollectionPath","BcfApiRequestService","config","HttpParams","encoder","URLParamsEncoder","fromObject","_request","deserialize","throwError","TypedJSON","BcfProjectResource","jsonMember","jsonObject","BcfTopicAuthorizationMap","jsonArrayMember","BcfTopicResource","preserveNull","deserializer","serializer","toISOString","BcfViewpointSelectionPath","bcfViewpointsService","BcfViewpointVisibilityPaths","BcfViewpointPaths","BcfViewpointCollectionPath","bcfViewpointService","BcfTopicPaths","bcfTopicService","BcfTopicCollectionPath","BcfExtensionResource","BcfExtensionPaths","bcfExtensionService","BcfProjectPaths","bcfProjectService","BcfApiService","bcfApiVersion","bcfApiBase","pathOrId","ViewerBridgeService","tslib__WEBPACK_IMPORTED_MODULE_3__","StateService","BcfPathHelperService","projectImportIssuePath","projectExportIssuesPath","snapshotPath","ViewpointsService","getViewPointResource","workPackage","index","viewpointHref","bcfViewpoints","bcfApi","getViewPoint$","viewpointResource","selection","visibility","components","deleteViewPoint$","work_packages","saveViewpoint$","projectLink","wpProjectId","topicUUID$","setBcfTopic$","viewpoint$","viewerBridge","getViewpoint$","topicUUID","topics","viewpoints","topicHref","bcfTopic","createBcfTopic$","wpPayload","convertBCF","guid","_angular_core__WEBPACK_IMPORTED_MODULE_10__","tslib__WEBPACK_IMPORTED_MODULE_11__","BcfThumbnailDisplayField","DisplayField","render","displayText","innerHTML","bcfPathHelper","BcfDetectorService","isBcfActivated","BcfAuthorizationService","authorized$","extension","authorizationMap","putFromPromiseIfPristine","extensions","includes","isAllowedTo","i0","BcfWpAttributeGroupComponent","UntilDestroyedMixin","bcfAuthorization","wpCreate","bcfViewer","cdRef","viewpointsService","bcf","add_viewpoint","show_viewpoint","delete_viewpoint","text_are_you_sure","notice_successful_create","notice_successful_delete","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$","visible","viewerVisible","detectChanges","untilDestroyed","__awaiter","initialize","refreshViewpoints","viewAllowed","createAllowed","loadViewpointFromRoute","snapshotURL","setViewpointsOnGallery","showViewpoint","shouldShowViewer","currentViewerState","deleteViewpoint","confirm","text","addSuccess","gallery","preview","close","saveViewpoint","showIndex","selectViewpointInGallery","go","reload","shouldShowGroup","icon","onClick","titleText","galleryPreviewOpen","addClass","galleryPreviewClose","removeClass","show","onGalleryChanged","galleryOptions","setThumbnailProperties","galleryImages","small","medium","big","viewpointCount","dynamicThumbnailHeight","max","round","NgxGalleryComponent","BcfNewWpAttributeGroupComponent","observeCreation","onNewWorkPackage","observables","galleryViewpoints","viewPointItem","_workPackage","_index","newViewpoint","snapshot","snapshot_data","RevitBridgeService","revitMessageReceivedSource","RevitBridge","hookUpRevitListener","once","trackingId","newTrackingId","sendMessageToRevit","revitMessageReceived$","messageType","viewpointJson","messagePayload","hasOwnProperty","snapshot_type","sendMessageToOpenProject","messageString","trackingIdNumber","OpenprojectBcfModule","bootstrapCalled","DisplayFieldService","addFieldType","HookService","register","provide","useFactory","navigator","userAgent","IFCViewerService","deps","Injector","imports","OpSharedModule","NgxGalleryModule","XeokitServer","ifcModels","ifc_models","getProjects","done","_error","getProject","projectData","models","viewerContent","modelsLoaded","shown_models","viewerConfigs","getGeometry","attachmentId","xkt_attachment_ids","log","utils","newViewer","server","viewerUI","BIMViewer","loadProject","currentProjectService","inspectorVisible$","viewer","destroy","xeokitViewer","setKeyboardEnabled","saveBCFViewpoint","spacesVisible","reverseClippingPlanes","bitmaps","opts","updateCompositeObjects","loadBCFViewpoint","bcfCardsViewIdentifier","bcfViewerViewIdentifier","bcfSplitViewTableIdentifier","bcfSplitViewCardsIdentifier","bcfTableViewIdentifier","BcfViewService","WorkPackageQueryStateService","viewerBridgeService","querySpace","cards","splitTable","splitCards","hasChanged","displayRepresentation","applyToQuery","valueFromQuery","dr","BoardActionsRegistryService","bannersService","mapping","available","localizedName","disabled","BoardListsService","CurrentProject","filterJson","buildQueryRequest","public","writable","addFreeQuery","queryParams","freeBoardQueryFilter","source","createHalResourceOfClass","GridWidgetResource","manualSort","operator","values","_angular_core__WEBPACK_IMPORTED_MODULE_8__","BoardService","boardActions","boardsList","unnamed_board","action_board","unnamed_list","loadAllBoards","loadAllPromise","canManage","reorderWidgets","boardName","addInitialColumnsForAction","columnCount","CausedUpdatesService","causedUpdates","cacheValue","splice","updatedAt","TileViewComponent","EventEmitter","created","emit","NewBoardModalComponent","OpModalComponent","locals","elementRef","boardService","halNotification","loadingIndicatorService","boardActionRegistry","close_popup","free_board","free_board_text","free_board_title","board_type","action_board_text","select_attribute","select_board_type","placeholder","teaser_text","upgrade_to_ee_text","more_info_ee_link","cancel_button","initiateTiles","createBoard","createFree","createAction","imagePath","addIcon","addDescription","addText","addImage","inFlight","closeMe","board_id","isNew","handleRawError","tiles","OpModalLocalsToken","ctx","calendarRefreshRequest","OpCalendarService","weekdayService","dayService","resizeObserver","v","resizeObs","ResizeObserver","resize$","nativeElement","applyNonWorkingDay","utcDate","Date","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","formatted","OpWorkPackagesCalendarService","sanitizer","$state","wpTableFilters","wpListService","wpListChecksumService","urlParamsHelper","uiRouterGlobals","timezoneService","halEditing","wpTableSelection","contextMenuService","calendarService","calendarOptions","additionalOptions","defaultOptions","eventDate","isMilestone","warnOnTooManyResults","isStatic","tooManyResultsText","MAX_DISPLAYED","addNotice","requireNonWorkingDays","updateTimeframe","fetchInfo","areFiltersEmpty","startDate","endDate","urlParams","query_id","initializingWithQuery","initialQuery","generateQueryProps","initializingWithQueryProps","query_props","oldQueryProps","newQueryProps","dateFilter","defaultQueryProps","fromQueryParams","encodeQueryJsonParams","pp","pa","initialView","cview","dateEditable","schemaEditable","isAttributeEditable","isLeaf","scheduleManually","eventDurationEditable","getEndDateFromTimestamp","subtract","openSplitView","onlyWhenOpen","setSelection","splitViewRoute","tabIdentifier","openFullView","onCardClicked","isClickedWithModifier","onCardDblClicked","showEventContextMenu","uiStateLinkClass","handler","WorkPackageViewContextMenu","fixedWeekCount","firstDay","timeZone","headerToolbar","left","center","right","initialDate","datesSet","dates","updateDateParam","dayHeaderClassNames","dayCellClassNames","dayGridClassNames","slotLaneClassNames","slotLabelClassNames","o","hi","cdate","currentStart","custom","notify","updateDates","resizeInfo","dragged","extendedProps","changeset","edit","ignoreNonWorkingDays","duration","setValue","due","endStr","startStr","_angular_core__WEBPACK_IMPORTED_MODULE_28__","WorkPackagesCalendarPageComponent","PartitionedQuerySpacePageComponent","title","unsaved_title","component","WorkPackageFilterContainerComponent","OpProjectIncludeComponent","WorkPackageFilterButtonComponent","ZenModeButtonComponent","WorkPackageSettingsButtonComponent","containerClasses","inputs","hideTableOptions","setPartition","currentPartition","partition","staticQueryName","_query","loadInitialQuery","visibly","_firstPage","showLoading","WorkPackagesCalendarComponent","QueryParamListenerService","CALENDAR_ROUTES","redirectTo","WorkPackagesBaseComponent","dynamic","bodyClasses","baseRoute","makeSplitViewRoutes","WorkPackageSplitViewComponent","OpenprojectCalendarModule","UIRouterModule","OpenprojectWorkPackagesModule","OpenprojectTimeEntriesModule","OpenprojectFieldsModule","FullCalendarModule","ucCalendarElement","calendar","workPackagesCalendar","cannot_drag_to_non_working_day","debounceTime","ucCalendar","getApi","updateSize","stopAllSubscriptions","initializeCalendar","calendarEventsFunction","successCallback","alreadyLoaded","events","updateResults","currentWorkPackages$","buildHeader","eventSources","color","background","textColor","display","plugins","dayGridPlugin","interactionPlugin","selectable","handleDateClicked","eventResizableFromStart","eventDidMount","eventResize","toDate","revert","updateEvent","eventDrop","dropInfo","eventResizeStart","addBackgroundEventsForNonWorkingDays","eventResizeStop","removeBackgroundEvents","eventDragStart","dragInfo","eventDragStop","removeProperty","eventClick","calendarOptions$","openContextMenu","eventContainer","mapToCalendarEvents","exclusiveEnd","subject","allDay","className","info","showSave","wasNew","projectedResource","defaults","dueDate","reloadOnRefreshRequest","refetchEvents","addBackgroundEvents","_angular_core__WEBPACK_IMPORTED_MODULE_22__","FullCalendarComponent","ElementRef","tslib__WEBPACK_IMPORTED_MODULE_25__","WorkPackageViewFiltersService","WorkPackagesListService","IsolatedQuerySpace","DomSanitizer","HalResourceEditingService","HalResourceNotificationService","EEActiveTrialBase","label_email","label_expires_at","label_maximum_users","label_company","label_domain","label_starts_at","label_subscriber","text_expired","text_reprieve_days_left","localizeLink","EETrialFormComponent","formBuilder","eeTrialService","host","company","userData","Validators","first_name","last_name","email","domain","configuredHost","general_consent","newsletter_consent","link_terms","link_privacy","label_test_ee","label_first_name","label_last_name","domain_mismatch","privacy_policy","receive_newsletter","terms_of_service","checkMailField","trialForm","controls","errors","emailInvalid","EnterpriseTrialModalComponent","domSanitizer","button_submit","button_cancel","button_continue","heading_confirmation","heading_next_steps","heading_test_ee","quick_overview","observe$","status","cancelled","trustedEEVideoURL","trustedURL","formComponent","onSubmit","valid","addControl","UntypedFormControl","sendForm","startEnterpriseTrial","setStartTrialStatus","closeModal","confirmed","modalOpen","bypassSecurityTrustResourceUrl","EEActiveTrialComponent","Gon","subscriber","userData$","formatUserData","eeTrialKey","trialLink","baseUrlAugur","getUserDataFromAugur","retryConfirmation","getToken","userForm","EETrialWaitingComponent","confirmation_info","resend","resend_success","resend_warning","session_timeout","status_confirmed","status_label","status_waiting","ee_trial_key","savedDateStr","resendMail","resendLink","EnterpriseTrialStore","EnterpriseTrialService","invalid_email","errorResponse","taken_email","taken_domain","augur_url","tokenVersion","token_version","setMailSubmittedStatus","enterpriseTrial","saveTrialKey","addWarning","res","token_retrieved","saveToken","token","resendlink","trialKey","trial_key","enterprise_token","encoded_token","delay","retries","freeTrialButtonSelector","FreeTrialButtonComponent","opModalService","button_trial","openTrialModal","trialRequested","HalLink","requestMethod","templated","$fetch","$prepare","templateValues","clone","regexp","RegExp","$callable","linkFunc","extend","$link","OpenprojectHalModuleHelpers","cloneHalResourceCollection","$copy","cloneHalResource","initializeHalProperties","asHalResource","loaded","setupProperty","instanceName","sourceName","sourceObj","isObject","propName","setter","linkName","isArray","setSource","setupLinks","l","setupEmbedded","child","proxyProperties","$embeddableKeys","defineProperty","enumerable","configurable","setLinksAsProperties","$linkableKeys","items","createLinkedResource","ObservableArray","indexOf","setEmbeddedAsProperties","lazy","obj","idPart","pop","decodeURIComponent","isPersistedResource","OpenProjectHeaderInterceptor","intercept","req","handleAuthenticatedRequest","handleExternalRequest","clonedRequest","handle","csrf_token","newHeaders","HalAwareErrorHandler","ErrorHandler","internal_error","handleError","rejection","HalError","httpError","captureError","ErrorResource","errorMessages","captureException","HttpErrorResponse","captureMessage","WikiPageBaseResource","WikiPageResource","Attachable","MeetingContentBaseResource","MeetingContentResource","PostBaseResource","PostResource","TimeEntryResource","without","NewsResource","MembershipResource","GroupResource","RootResource","TypeResource","QueryOperatorResource","FormResource","getErrors","validationErrors","halInitializer","errorIdentifier","v3ErrorIdentifierMultipleErrors","isValidationError","HelpTextBaseResource","HelpTextResource","SchemaResource","availableAttributes","attributeFromLocalizedName","match","SchemaDependencyResource","forValue","dependencies","QueryFilterInstanceSchemaResource","availableOperators","allowedValues","allowedFilterValue","$initialize","_dependencies","dependency","getFilter","definesAllowedValues","QueryFilterInstanceResource","isValueRequired","isResourceValue","loadedAllowedValues","resultingSchema","staticSchema","dependentSchema","merge","some","WorkPackageCollectionResource","halResourceDefaultConfig","WorkPackage","WorkPackageResource","attrTypes","ancestors","children","relations","Activity","Relation","RelationResource","to","Schema","Type","Status","StatusResource","SchemaDependency","User","UserResource","Group","Collection","WorkPackageCollection","AttachmentCollection","AttachmentCollectionResource","Form","FormPayload","QueryFilterInstance","QueryFilterInstanceSchema","QueryFilter","QueryFilterResource","Root","QueryOperator","HelpText","CustomAction","CustomActionResource","WikiPage","MeetingContent","Post","Project","ProjectResource","Role","RoleResource","Grid","GridResource","GridWidget","TimeEntry","Membership","News","Version","VersionResource","OpenprojectHalModule","useClass","APP_INITIALIZER","initializeHalResourceConfig","registerResource","multi","CommonModule","updateElements","$load","isHalError","err","hasOwn","isMultiErrorMessage","getInvolvedAttributes","columns","details","flatten","extractMultiError","getMessagesPerAttribute","perAttribute","messages","GridBaseResource","widgetResource","updateAttachments","$update","$loaded","$halType","expectedResource","exec","retainFrom","other","__initialized_at","$plain","cloneDeep","$isHal","_name","previewPath","getEditorContext","fieldName","$loadResource","valuesPromise","$self","properties","tslib__WEBPACK_IMPORTED_MODULE_5__","Base","canAddAttachments","hasAttachments","lookupDownloadLocationByName","pull","attachmentsBackend","updateState","performUpload","r","ErrorEvent","directUploadURL","opDirectFileUpload","opFileUpload","macros","currentSchema","memoizedCurrentSchemas","isCompletelyDefined","findOperator","operatorSymbol","isTemplated","flag","newId","setSortBy","newSortBy","QUERY_SORT_BY_ASC","QUERY_SORT_BY_DESC","includeParentChild","includeParentchild","RELATION_TYPES","label","normalizedType","denormalized","relationType","targetId","reverseType","reverseRelationType","isInvolved","updateDescription","updateType","active_user_statuses","showUserPath","showUser","isLocked","isOpen","isClosed","WorkPackageBaseResource","ancestorIds","subjectWithType","truncateSubject","subjectWithId","truncate","disabledMentions","isParentOf","otherWorkPackage","updateLinkedResources","resourceNames","resources","linked","wpCacheService","wpActivity","tslib__WEBPACK_IMPORTED_MODULE_13__","WorkPackagesActivityService","WorkPackageNotificationService","extractPayloadFromSchema","nonLinkProperties","Proxy","receiver","proxyMethod","ofProperty","mappedName","isEditable","Reflect","propertySchema","apply","__","argumentsList","isReadonly","readonly","setPrototypeOf","HalEventsService","_events","aggregated$","resourceType","debounceTimeInMs","events$","buffer","resourceReference","isCreate","handleErrorResponse","errorBody","retrieveError","showGeneralError","retrieveErrorMessage","errorResource","showError","showApiErrorMessages","showCustomError","showEditingBlockedError","attributeName","i18nString","toLowerCase","_angular_core__WEBPACK_IMPORTED_MODULE_11__","tslib__WEBPACK_IMPORTED_MODULE_12__","HalResourceSortingService","halType","sortingProperty","hasSortingProperty","performRequest","whenDebugging","createErrorObservable","requestParams","toEprops","put","entry","defaultClass","getResourceClassOfType","fromLink","fromSelfLink","fromType","toType","getResourceClassOfAttribute","typeConfig","deflatedArray","Pako","eprops","base64","_angular_core__WEBPACK_IMPORTED_MODULE_13__","encodeKey","encodeURIComponent","encodeValue","decodeKey","decodeValue","IanBellQuery","unread$","pairwise","last","curr","IanBellStore","totalUnread","IanBellService","resourceService","unreadCountIncreased$","skip","fetchUnread","IAN_FACET_FILTERS","reloadOnNotificationRead","IanCenterStore","createInitialState","page","activeCollection","activeFacet","notLoaded","IanCenterService","hasFilters","params$","selectLoading","activeCollection$","defaultIfEmpty","selectNotifications$","aggregatedCenterNotifications$","notifications$","notLoaded$","setToLoading","setLoading","sideLoadInvolvedWorkPackages","pluck","stateChanged$","updateSelectedNotification","setFilters","onReload","setFacet","selectedNotification","goToCenter","markAllAsRead","openSplitScreen","showNextNotification","selectedNotificationIndex","checkForNewNotifications","allInOldCollection","activeReloadToast","activeID","compact","UIRouterGlobals","InAppNotificationStatusComponent","ngOnChanges","changes","highlightClass","Highlighting","currentValue","InAppNotificationActorsLineComponent","and","and_other_singular","and_other_plural","loading","mark_as_read","updated_by_at","age","buildActors","buildTime","text_for_additional_authors","number","fixedTime","relativeTime$","timer","actors","aggregatedNotifications","actor","uniqBy","InAppNotificationDateAlertComponent","work_package_is","overdue","overdue_since","difference_in_days","property_is","property_was","property_deleted","due_today","detail","deriveMostRelevantAlert","deriveDueDate","propertyText","alertText","dateValue","dateIsPast","isBefore","isOverdue","dateDiff","buildAlertText","daysDiff","daysText","reference","now","abs","dateAlerts","reason","InAppNotificationEntryComponent","storeService","activeReason$","dateAlertFiltered","buildTranslatedReason","buildProject","loadWorkPackage","workPackage$","showDetails","withLatestFrom","showDateAlert$","openDetailsTab","tab","projectClicked","reasons","translatedReason","defaultValue","translatedReasons","showUrl","InAppNotificationCenterComponent","bellService","apiV3","pathService","hasMoreThanPageSize$","hasNotifications$","loading$","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","button_close","no_results","at_all","with_current_filter","noNotificationText","hasNotifications","NotificationSettingsButtonComponent","mySettings","ActivateFacetButtonComponent","facets","facet_titles","activeFacet$","activateFacet","MarkAllAsReadButtonComponent","mark_all_read","markAllRead","InAppNotificationCenterPageComponent","$transitions","backRoutingService","documentReferer","setInitialHtmlTitle","removeTransitionSubscription","onSuccess","updateTitleName","_val","changeChangesFromTitle","currentTitleParts","InAppNotificationsDateAlertsUpsaleComponent","videoPath","video","__webpack_public_path__","IAN_ROUTES","OpenProjectInAppNotificationsModule","DynamicModule","IconModule","OpenprojectPrincipalRenderingModule","OpenprojectContentLoaderModule","ScrollingModule","InviteUserButtonModule","OpInviteUserModalService","open","InviteUserModalComponent","closingEvent","Steps","PrincipalType","ProjectSelection","customFields","markForCheck","onProjectSelectionSave","goTo","Principal","onPrincipalSave","principalData","isAlreadyMember","closeWithPrincipal","Summary","onSuccessfulSubmission","$event","createdNewPrincipal","Success","step","JobStatusModalComponent","loadingIndicator","sanitization","closePopup","redirect","redirect_errors","redirect_link","download_starts","click_to_download","jobId","listenOnJobStatus","continuedStatus","onResponse","isLoading","iconForStatus","handleRedirect","handleDownload","download","handleHTML","html","statusIcon","content","htmlContent","bypassSecurityTrustHtml","redirectionUrl","downloadHref","downloadLink","click","jobUrl","job_statuses","hooks","ProjectsComponent","_pathHelperService","_$state","_currentProjectService","dynamicFieldsSettingsPipe","dynamicFieldsSettings","formattedDynamicFieldsSettings","dynamicFormField","isFieldHidden","hide","hiddenFields","NewProjectComponent","templateControl","templateForm","uIRouterGlobals","pathHelperService","modalService","fieldSettingsPipe","use_template","no_template_selected","advancedSettingsLabel","copySettingsLabel","copyableTemplateFilter","UntypedFormGroup","template","resourcePath","fieldGroups","fieldsFilter","field","templateOptions","isMeta","required","hasDefault","payloadValue","parent_id","setParentAsPayload","onSubmitted","onTemplateSelected","initialPayload","dynamicForm","model","sendNotifications","formUrl","isHiddenField","DynamicFormComponent","CopyProjectComponent","copy","isPrimaryAttribute","sortedCopyFields","fieldA","fieldB","localeCompare","nonCopyFields","PROJECTS_ROUTES","OpenprojectProjectsModule","ReactiveFormsModule","uiRouterProjectsConfiguration","uiRouter","urlService","rules","when","DynamicFormsModule","nonWorkingDay","currentStartDate","activeStart","currentEndDate","activeEnd","getTime","addEvent","getEvents","BackButtonComponent","goBack","customBackMethod","BackRoutingService","goToOtherState","route","goBackToDetailsState","preferListOverSplit","backRoute","keepTab","currentDetailsTab","goBackNotToDetailsState","goBackToPreviousState","isDetailsState","goToBaseState","sync","transition","fromState","toState","paramsFromCopy","_backRoute","KeepTabService","WorkPackageEditActionsBarComponent","editForm","cancel","saving","active","_saving","submit","onSave","onCancel","wpFiltersService","DebouncedEventEmitter","componentDestroyed","visible$","pristine$","replaceIfComplete","isAvailable","filtersChanged","FilterBooleanValueComponent","onFilterUpdated","filterChanged","FilterDateValueComponent","valueChanged","parser","formatter","FilterDatesValueComponent","spacer","begin","AbstractDateTimeValueController","isoDateParser","isoDateFormatter","isTimeZoneDifferent","lowerBoundary","upperBoundary","hours","minutes","timeZoneText","features","FilterDateTimeValueComponent","valueString","FilterDateTimesValueComponent","parseBegin","validDate","parsed","utc","parseEnd","FilterIntegerValueComponent","FilterStringValueComponent","enter_text","FilterProjectComponent","projectID","additionalProjectApiFilters","onChange","FilterToggledMultiselectValueComponent","halSorting","currentUser","compareByHref","availableOptions","ngSelectInstance","shouldFocus","setValues","FilterSearchableMultiselectValueComponent","ngZone","me","searchTerm","autocomplete","initialRequest$","loadCollection","matching","initialLoad","matchingItems","withMeValue","lowered","createFilters","allowedValuesLink","isUserResource","logged","meValue","QueryFilterComponent","bannerService","halHref","open_filter","close_filter","label_filter_add","upsale_for_more","upsale_link","button_delete","showValuesInput","showValues","removeThisFilter","deactivateFilter","valueType","WorkPackageFilterByTextInputComponent","createWithDropdown","createButton","explanation","currentSearchFilter","upstreamTerm","timestampOfLastValue","searchTermChanged","QueryFiltersComponent","trackByName","close_form","selected_filter_list","please_select","filter_by_text","updateRemainingFilters","onFilterAdded","filterToBeAdded","newFilter","instantiate","currentFilterLength","updateFilterFocus","ngSelectComponent","clearItem","closeFilter","toggleVisibility","removedFilter","isSecondSpacerVisible","hasSearch","hasAvailableFilter","isFilterAvailable","remainingFilters","remainingVisibleFilters","activeFilterCount","focusElementIndex","filterIndex","currentFilterAt","availableFilters","availableFilter","onOpen","dropdownPanel","_updatePosition","NgSelectComponent","WorkPackageFiltersService","CommentService","workPackageNotificationService","createComment","comment","addComment","errorAndReject","updateComment","activity","WorkPackageBreadcrumbParentComponent","wpRelationsHierarchy","notificationService","edit_parent","set_or_remove_parent","remove_parent","set_parent","canModifyParent","changeParent","editing","updateParent","newParent","newParentId","isSaving","onSwitch","WorkPackageBreadcrumbComponent","hierarchy","hierarchyCount","hierarchyLabel","updateActiveInput","inputActive","AbstractWorkPackageButtonComponent","activate","deactivate","labelKey","buttonText","textKey","activationPrefix","deactivationPrefix","prefix","isToggle","OpTypesContextMenuDirective","OpContextMenuTrigger","opContextMenu","browserDetector","getEmptyForm","buildItems","contextMenuId","linkText","ariaLabel","class","WorkPackageCreateButtonComponent","allowed","allowedWhen","combined","module","permission","updateDisabledState","transitionUnregisterFn","setupObserver","filterCount","performAction","live$","currentlyVisibleFilters","WorkPackageMarkNotificationButtonComponent","markAllBelongingNotificationsAsRead","QuerySharingFormComponent","showInMenu","visibleForOthers","showInMenuText","visibleForOthersText","canStar","isSave","canPublish","queryForm","updateStarred","isStarred","changed","updatePublic","isPublic","QuerySharingModalComponent","save_as","label_name","label_visibility_settings","button_save","change","afterFocusOn","saveQuery","isBusy","SaveQueryModalComponent","queryNameField","saveQueryAs","queryName","savedQuery","OpSettingsMenuDirective","queryUpdate","loadingPromise","formUpdate","positionArgs","position","assign","my","at","onClose","allowQueryAction","allowAction","allowWorkPackageAction","allowFormAction","WpTableConfigurationModalComponent","initialTab","selectableTitleIdentifier","trigger","triggerEditingEvent","create_new","WpTableExportModalComponent","divider","configureForm","more_actions","WorkPackageStatusDropdownDirective","halEvents","changeFor","getForm","updateStatus","postIcon","postIconTitle","WorkPackageStatusButtonComponent","workPackageReadOnly","workPackageStatusBlocked","temporaryEditResource","buttonTitle","statusHighlightClass","typedState","screenfull","sfimport","zenModeComponentSelector","activateLabel","deactivateLabel","enabled","onchange","isFullscreen","deactivateZenMode","inZenMode","exit","activateZenMode","CardClickHandler","card","EVENT","SELECTOR","eventScope","handleEvent","is","handleWorkPackage","itemClicked","double","classIdentifier","wpCardView","findRenderedCard","ctrlKey","metaKey","shiftKey","setMultiSelectionFrom","renderedCards","toggleRow","selectionChanged","getSelectedWorkPackageIds","wpTableFocus","updateFocus","WorkPackageViewSelectionService","WorkPackageViewFocusService","WorkPackageCardViewService","CardDblClickHandler","CardRightClickHandler","isSelected","showInfoButton","OPContextMenuService","CardViewHandlerRegistry","WorkPackageViewHandlerRegistry","WorkPackageCardDragAndDropService","reorderService","dragService","wpInlineCreate","init","componentRef","cardView","registerDragAndDrop","dragContainer","scrollContainers","moves","canDragOutOf","accepts","dragInto","onMoved","toIndex","newOrder","move","currentOrder","updateOrder","onRemoved","onAdded","addWorkPackageToQuery","parentElement","removeChild","_workPackages","activeInlineCreateWp","existingNewWp","addNewCard","createOrContinueWorkPackage","workPackageAddedHandler","removeReferenceWorkPackageForm","removeCard","onCardSaved","newInlineWorkPackageCreated","tableRendered","updateRenderedCardsValues","WorkPackageCardViewComponent","wpViewOrder","cardDragDrop","trackByHrefAndProperty","noResults","referenceComponentClass","setReferenceMode","onReferenced","registerCreationCallback","eventType","orderedWorkPackages","isResultEmpty","registry","WorkPackageViewHandlerToken","attachTo","registerSelectAllListener","registerDeselectAllListener","mode","inReference","classes","orientation","shrinkOnMobile","_angular_core__WEBPACK_IMPORTED_MODULE_20__","WorkPackageSingleCardComponent","detailsView","Intl","DateTimeFormat","year","month","selectedWhenOpen","emitStateLinkClicked","stateToEmit","stateLinkClicked","requestedState","cardClasses","draggable","showAsInlineCard","showAsGhost","cardTitle","wpTypeAttribute","wpSubject","wpProjectName","wpDates","dateTimeFormatYear","formatRange","dateTimeFormat","wpOverDueHighlighting","fullWorkPackageLink","cardHighlightingClass","cardHighlighting","typeHighlightingClass","attributeHighlighting","onRemove","cardCoverImageShown","bcfSnapshotPath","_angular_core__WEBPACK_IMPORTED_MODULE_15__","WorkPackageCopyController","WorkPackageCreateComponent","wpRelations","addCommonRelation","copiedWorkPackageId","createdWorkPackage","stateParams","copiedFromWorkPackageId","createCopyFrom","sourceChangeset","copyWorkPackage","copyChangeset","pristineResource","WorkPackageRelationsService","WorkPackageFilterValues","excluded","applyFirstValue","setToNull","applyDefaultsFromFilters","projectFilter","filterAlreadyApplied","mapFilterToAttribute","setValueFor","findSpecialValue","WorkPackageChangeset","j","compareByHrefOrString","ResourceChangeset","updateForm","applyChanges","setNewDefaultFor","form$","WorkPackageReplacementLabelComponent","wpeditForm","$element","fields","handleUserActivate","tdClassName","editCellContainer","CellBuilder","DisplayFieldRenderer","build","column","td","createElement","editFieldContainerClass","displayElement","fieldRenderer","appendChild","backgroundClass","inlineClass","colorClass","highlightColorTextInline","overdueDate","isBright","styles","variable","getPropertyValue","internalSortColumn","internalContextMenuColumn","GroupSumsBuilder","SingleRowBuilder","sum","buildSumsRow","tr","groupedRowClassName","renderColumns","sums","augmentedColumns","div","renderContent","sumsSchema","appendFirstLabel","span","textContent","fieldSchema","displayFieldService","getField","rowGroupClassName","collapsedRowClass","groupIdentifier","groupByProperty","groupName","groupIndex","groupTypeFromIdentifier","groupIdFromIdentifier","indicatorCollapsedClass","additionalHierarchyRowClassName","SingleHierarchyRowBuilder","workPackageTable","leaf","level","expanded","collapsed","refreshRow","jRow","newRow","appendHierarchyIndicator","buildEmpty","ancestorRowData","wpTableHierarchies","rowClasses","parentsWithVisibleChildren","hierarchyRootClass","ancestor","hierarchyGroupClass","collapsedGroupClass","buildAncestorRow","ancestorGroups","hierarchyLevel","hierarchyElement","buildHierarchyIndicator","css","hierarchyIndicator","indicatorWidth","indentation","WorkPackageViewHierarchiesService","relationCellTdClassName","relationCellIndicatorClassName","RelationCellbuilder","columnId","wpTableRelationColumns","getExpandFor","relationState","relationsForColumn","renderIndicator","badge","renderBadge","WorkPackageViewRelationColumnsService","TableActionRenderer","contextMenuTdClassName","contextMenuSpanClassName","tableActionsService","OpTableActionsService","tableRowClassName","commonRowClassName","buildAugmentedColumns","wpTableColumns","getColumns","dragAndDropEnabled","buildCell","isRelationColumn","relationCellBuilder","actionsColumnEnabled","contextLinkBuilder","columnMenuEnabled","cellBuilder","row","createEmptyRow","buildEmptyRow","placeholderRow","colSpan","cells","detach","newCells","oldTd","isColumnBeingEdited","cell","forms","activeFields","oldRow","locateTableRowByIdentifier","changedAttributes","oldCell","checkedClassName","WorkPackageViewColumnsService","timelineCellClassName","TimelineRowBuilder","timelineBody","WorkPackageViewTimelineService","UiStateLinkBuilder","linkToDetails","linkToShow","tabState","currentShowTab","wpState","onClickOrEnter","KeyCodes","ClickOrEnterHandler","processEvent","ancestorId","ancestorClassIdentifier","rowId","relationRowClass","locateTableRow","isInsideCollapsedGroup","listClass","locatePredecessorBySelector","previous","previousElementSibling","scrollTableRowIntoView","scrollParent","containerTop","scrollTop","containerBottom","elemTop","offsetTop","elemBottom","warn","RowsBuilder","isApplicable","groupClassNameFor","GroupHeaderBuilder","collapse","expand","buildGroupRow","colspan","togglerIconClass","escape","HighlightingRenderPass","tablePass","highlightAttribute","wpTableHighlighting","getComputedStyle","renderedOrder","tableBody","isInline","isDisabled","WorkPackageViewHighlightingService","DragDropHandleBuilder","dragActionRegistry","TableDragActionsRegistryService","actionService","canPickup","DragDropHandleRenderPass","wpTableOrder","withLoadedPositions","positions","renderType","dragDropHandleBuilder","replaceChild","firstElementChild","WorkPackageViewOrderService","TimelineRenderPass","createDocumentFragment","timelineBuilder","secondary","additionalClasses","relationGroupClass","relationCellClassName","RelationRowBuilder","emptyRelationCell","buildEmptyRelationRow","relation","createEmptyRelationRow","relationClassIdentifier","relationIdentifier","appendRelationLabel","typeLabel","relationLabel","createTextNode","empty","RelationsRenderPass","relationRowBuilder","fromId","relationsToExtendFor","relationRow","spliceRow","belongsTo","refreshRelationRow","renderedRow","hasRelationColumns","PrimaryRenderPass","rowBuilder","timeOutput","prepare","doRender","postRender","highlighting","dragDropHandle","timeline","replacement","replaceWith","renderedInfo","after","renderPlaceholderRow","appendRow","appendNonWorkPackageRow","classIdentifer","PlainRenderPass","originalRows","originalRowIndex","object","GroupedRenderPass","groups","headerBuilder","currentGroup","nextGroup","matchingGroup","groupsChanged","renderSumsRow","groupClass","rowElement","buildSingleRow","matchesMultiValue","valueLink","joinedOrderedHrefs","objects","isEqualWith","sumsBuilder","GroupedRowsBuilder","collapsedGroups","buildRows","builder","getGroupData","refreshExpansionState","rendered","tableAndTimelineContainer","parentNode","affected","HierarchyRenderPass","hierarchies","deferInsertion","buildWithHierarchy","markRendered","renderAllDeferredChildren","ancestorChain","inTable","deferred","newElements","slice","insertUnderParent","getOrBuildRow","ancestorRow","insertAtExistingHierarchy","additionalParents","previousAncestor","isAncestor","buildRenderInfo","hierarchyRoot","hierarchyGroup","ancestorClasses","HierarchyRowsBuilder","_table","isEnabled","PlainRowsBuilder","TableEditForm","EditForm","resourceSubscription","findContainer","rowContainer","findCell","activateField","waitForContainer","editModeClassName","editingPortalService","FocusHelper","requireVisible","addColumn","focusOnFirstError","loadFieldSchema","noWarnings","interval","setInterval","clearInterval","FocusHelperService","EditingPortalService","WorkPackageTableEditingContext","stopEditing","existing","startEditing","WorkPackageTable","scrollContainer","tbody","timelineController","hierarchyRowsBuilder","groupedRowsBuilder","plainRowsBuilder","renderedRows","findRenderedRow","builders","buildIndex","rows","initialSetup","redrawTableAndTimeline","renderPass","performRenderPass","requestAnimationFrame","redrawTable","refreshRows","pass","lastRenderPass","setGroupsCollapseState","newState","t0","performance","t1","WorkPackageViewCollapsedGroupsService","WorkPackagesGridComponent","wpTableHighlight","wpTableSortBy","wpList","onReady","highlightingModeChanged","updates$","switchToManualSorting","createOrSave","DragAndDropService","decls","inlineCreateRowClassName","inlineCreateCancelClassName","InlineCreateRowBuilder","cancelButton","buildCancelButton","buildNew","WorkPackageInlineCreateComponent","buttonTexts","canAdd","canReference","hasReferenceClass","showing","refreshOnColumnChanges","registerCancelHandler","resetRow","stopImmediatePropagation","currentWorkPackage","isEmbedded","cancelCreation","removeWorkPackageRow","showRow","handleAddRowClick","addWorkPackageRow","handleReferenceClick","referenceClass","editingSubscription","changesetUpdates$","insertRow","workPackageEditForm","renderInlineCreateRow","activateMissingFields","hideRow","WorkPackageInlineCreateService","canCreateWorkPackages","complete","newInlineWorkPackageReferenced","WorkPackagesListChecksumService","UrlParamsHelper","updateIfDifferent","newQueryChecksum","getNewChecksum","routePromise","isUninitialized","isIdDifferent","maintainUrlQueryState","isChecksumDifferent","setToQuery","isQueryOutdated","isOutdated","executeIfOutdated","newChecksum","checksum","visibleChecksum","otherId","otherChecksum","hasCurrentQueryID","hasCurrentChecksum","idChanged","checksumChanged","visibleChecksumChanged","perPage","WorkPackagesListInvalidQueryService","restoreQuery","restoreFilters","restoreColumns","restoreSortBy","restoreGroupBy","restoreOtherProperties","querySchema","filterInstanceSchema","recreatedFilter","stubQuery","candidate","sortBys","wpTablePagination","wpStatesInitialization","wpListInvalidQueryService","wpQueryView","queryRequests","q","ensurePerPageKnown","streamQueryRequest","conditionallyLoadForm","decodedProps","getCurrentQueryProps","buildV3GetQueryFromJsonParams","handleQueryLoadingError","queryLoading","loadDefaultQuery","reloadQuery","extractParamsFromQuery","loadQueryFromExisting","buildV3GetQueryFromQueryResource","loadCurrentQueryFromParams","loadForm","updateStatesFromForm","createQueryAndView","createdQuery","currentQuery","givenQuery","getPaginationInfo","paginationObject","currentForm","isPerPageKnown","_angular_core__WEBPACK_IMPORTED_MODULE_25__","WorkPackagesQueryViewService","viewType","WorkPackageStatesInitializationService","wpTableGroupBy","wpTableGroupFold","wpTableSum","wpTableTimeline","wpTableAdditionalElements","wpDisplayRepresentation","wpIncludeSubprojects","clearStates","initializeFromQuery","updateQuerySpace","updateChecksum","initializeFilters","additionalRequiredWorkPackages","_angular_core__WEBPACK_IMPORTED_MODULE_21__","$transition","wpViewFocus","button_settings","closeEditFormWhenNewWorkPackageSaved","showForm","switchToFullscreen","onSaved","savedResource","isInitial","successState","newWorkPackage","parentWorkPackage","back_url","cancelAndBackToList","cancelState","_angular_core__WEBPACK_IMPORTED_MODULE_16__","viewQuery","EditFormComponent","newWorkPackageHref","WorkPackageCreateService","attachmentsService","committedChanges","commit","newWorkPackageCreated","newWorkPackageCreatedSubject","createNewWorkPackage","fromCreateForm","initializeNewResource","copyFrom","changePromise","continueExistingEdit","createNewWithDefaults","changeType","hasChanges","typeEmpty","typeMatches","withFiltersPayload","filterDefaults","mergedPayload","defaultsFromFilters","except","fromFilter","toApiPayload","WorkPackageNewFullViewComponent","queryColumnTypes","PROPERTY","RELATION_OF_TYPE","RELATION_TO_TYPE","getFilterSchema","TransitionService","listenForQueryParamsChanged","queryChangeListener","removeQueryChangeListener","UrlParamsHelperService","paginationService","buildQueryString","extender","paramsData","showHierarchies","g","includeSubprojects","encodeSums","encodeTimelineVisible","encodeHighlightingMode","encodeHighlightedAttributes","encodeSortBy","encodeFilters","s","hl","highlightedAttributes","hla","queryFilterValueToParam","timelineVisible","tv","timelineLabels","tll","tzl","timelineZoomLevel","updateJson","getPerPage","showSums","urlFilter","attributes","vs","filterData","contextual","buildV3GetColumnsFromQueryResource","buildV3GetFiltersAsJson","buildV3GetSortByFromQuery","halValue","buildV3GetFilters","replacements","buildV3GetFilterIdFromFilter","buildV3GetOperatorIdFromFilter","buildV3GetValuesFromFilter","filterHash","filterBuilderFrom","sortByIds","WpChildrenInlineCreateService","wpRelationsHierarchyService","WpRelationInlineAddExistingComponent","toId","addExistingChildWp","referenceTarget","canAddChild","WorkPackageChildrenQueryComponent","WorkPackageRelationQueryBase","queryUrlParamsHelper","OpUnlinkTableAction","embeddedTable","buildQueryProps","relatedWorkPackage","isInitialized","refreshTable","buildQueryFilters","abort","addExisting","selectedWpId","newRelationId","onSelected","relationTypes","WpRelationInlineCreateService","removeRelation","addRelation","loadQuery","handleQueryLoaded","filtersLength","projectValuesCount","loadedFiltersLength","valid_subset","WorkPackageRelationsAutocompleteComponent","availableRelationCandidates","additionalFilters","filterCandidatesFor","selectedRelationType","getOptionsFn","getAutocompleterData","onWorkPackageSelected","runOutsideAngular","repositionDropdown","hiddenOverflowContainer","one","closeSelect","OpAutocompleterComponent","WorkPackageRelationsHierarchyService","lockVersion","removeParent","childWpId","wpToBecomeChild","addNewChildWp","childWorkPackage","RelationStateGroup","initializeMembers","relationsStateValue","accumulateRelationsFromInvolved","removeFromStates","updateRelationType","updateRelation","savedRelation","insertIntoStates","relatedWpId","keyBy","involved","relevant","ActivityEntryInfo","isReversed","activities","activityDate","dateOfPrevious","forceReverse","orderedIndex","activityNo","idx","WorkPackageLinkedResourceCache","order","aggregated","revisions","sortedActivityList","sorted","reverse","ReplaySubject","updateTabs","lastActiveTab","isCurrentState","goCurrentShowState","goCurrentDetailsState","currentTab","currentTabIdentifier","updateTab","WorkPackageWatchersTabComponent","wpWatchersService","trackByHref","loadingError","loadCurrentWatchers","availableWatchersPath","available_watchers","allowedToView","watchers","allowedToAdd","addWatcher","allowedToRemove","removeWatcher","watching","watcher","user_id","WorkPackageWatchersService","isCached","isRequested","cached","cacheDurationInSeconds","WpCustomActionComponent","wpSchemaCacheService","fetchAction","savedWp","onMouseEnter","WpCustomActionsComponent","customActions","WorkPackageSingleViewComponent","hook","storagesService","projectsResourceService","switchTo","infoRow","createdBy","lastUpdatedOn","uiSelfRef","$current","contextFrom","updateWorkPackageCreationState","groupedFields","rebuildGroupedFields","_attributeGroups","getFields","storages$","manageFileLinks","shouldHideGroup","members","queryInNew","elem","prependedAttributeGroupComponents","attributeGroupComponent","attachmentListComponent","attachmentUploadComponent","idLabel","projectContextText","projectname","showTwoColumnLayout","getBoundingClientRect","attributeGroups","groupId","getAttributesGroupId","randomString","isolated","fieldNames","descriptors","getDateField","displayField","multiple","spanAll","isFormattable","schemaHref","projectHref","baseSchema","overflowingIdentifier","WorkPackageSubjectComponent","TabPortalOutlet","availableTabs","outletElement","componentFactoryResolver","activeComponents","activeTabs","disable","activateInstance","_getComponentRootNode","tabName","portal","setAttachedHost","dispose","createComponent","resolveComponentFactory","componentClass","ComponentPortal","attachView","hostView","detachView","rootNodes","WpTableConfigurationModalPrependToken","InjectionToken","prependModalComponent","columnsLabel","selectedColumns","multiSelectLabel","applyButton","upsaleRelationColumns","upsaleRelationColumnsLink","WpTableConfigurationService","tabPortalHost","wpTableConfigurationService","tabs","tabContentOutlet","initialTabName","onDataUpdated","saveChanges","WpTableConfigurationDisplaySettingsTabComponent","wpTableSums","choose_mode","label_group_by","display_sums","display_sums_hint","display_mode","grouped","hierarchy_hint","setEnabled","displayMode","displaySums","updateGroup","availableGroups","WpTableConfigurationColumnsTabComponent","column2Like","availableColumns","columnsHelp","upsaleCheckOutLink","moreInfoLink","setColumnsById","selectedColumnMap","updateSelected","WpTableConfigurationFiltersTab","SortModalObject","direction","WpTableConfigurationSortByTabComponent","sort_criteria_1","sort_criteria_2","sort_criteria_3","sorting_mode","automatic","manually","warning","sortElements","sortingMode","sortationObjects","manualSortColumn","getMatchingSort","onReadyWithAvailable","allColumns","getManualSortingOption","updateSortingMode","updateUsedColumns","fillUpSortElements","updateSelection","emptyColumn","usedColumns","differenceBy","WpTableConfigurationTimelinesTabComponent","zoomLevelOrder","display_timelines","display_timelines_hint","zoom","weeks","months","quarters","years","auto","labels","bar","none","farRight","zoomLevel","updateLabels","isVisible","availableLabels","allPropertyColumns","WpTableConfigurationHighlightingTabComponent","Banners","highlighting_mode","inline","inline_all_attributes","priority","entire_row_by","upsaleAttributeHighlighting","more_info_link","availableInlineHighlightedAttributes","availableHighlightedAttributes","availableRowHighlightedAttributes","setSelectedValues","updateMode","selectedAttributes","lastEntireRowAttribute","entireRowMode","updateHighlightingAttributes","disabledValue","currentValues","_tabs","WorkPackageContextMenuHelperService","wpViewRepresentation","wpViewTimeline","wpViewIndent","getPermittedActionLinks","permittedActionConstants","allowSplitScreenActions","singularPermittedActions","allowedActions","getAllowedActions","getAllowedParentActions","getAllowedRelationActions","allowedAction","getIntersectOfPermittedActions","bulkPermittedActions","possibleActions","BULK_ACTIONS","permittedActions","every","isActionAllowed","permittedAction","getBulkActionLink","workPackageIdParams","serializedIdParams","linkAndQueryString","shift","indexBy","isList","canOutdent","canIndent","addChild","getPermittedActions","TableDragActionService","applies","onNewOrder","handleDrop","changeShadowElement","shadowElement","backToDefault","HierarchyDragActionService","determineParent","relationHierarchyService","nextElementSibling","droppedIntoGroup","relationRoot","findRelationRowRoot","previousWpId","isHiearchyRoot","loadParentOfWP","inGroup","isRoot","skipDroppedIntoGroup","elementGroups","previousGroups","nextGroups","isLastElementOfGroup","elementAlreadyBelongsToGroup","elementGroup","GroupByDragActionService","groupedAttribute","groupedValue","getValueForGroup","saved","groupHeader","WorkPackageViewGroupByService","WorkPackageEmbeddedBaseComponent","WorkPackagesViewBase","WorkPackageTableConfiguration","providedConfiguration","initialLoadingIndicator","buildUrlParams","setLoaded","renderTable","tableVisible","firstPage","queryProjectScope","uniqueEmbeddedTableName","initializeStates","ChangeDetectorRef","WorkPackageEmbeddedTableComponent","loadedQuery","tableActions","setActions","openConfigurationModal","onUpdated","showTablePagination","compactTableStyle","formPromise","apiv3Service","onQueryLoaded","onError","handleWorkPackageClicked","openStateLink","OpModalService","WorkPackageViewPaginationService","ExternalQueryConfigurationComponent","OpQueryConfigurationLocalsToken","RestrictedWpTableConfigurationService","ExternalQueryConfigurationService","bodyPortalHost","_portalHostElement","hostElement","_bodyPortalHost","DomPortalOutlet","externalQueryConfigurationComponent","injectorFor","attach","hasAttached","injectorTokens","WeakMap","PortalInjector","WpTableConfigurationRelationSelectorComponent","filter_work_packages_by_relation_type","precedes","follows","relates","duplicates","duplicated","blocks","blocked","requires","partof","availableRelationFilters","relationFiltersOf","setSelectedRelationFilter","currentRelationFilters","selectedRelationFilter","onRelationFilterSelected","removeRelationFiltersFromCurrentState","addFilterToCurrentState","filtersToRemove","relationFilterIds","getOperatorForId","compareRelationFilters","f1","f2","ExternalRelationQueryConfigurationComponent","useValue","ExternalRelationQueryConfigurationService","disabledTabs","OpTableAction","applicable","buildElement","contextColumnIcon","opIconElement","contextMenuLinkClassName","OpDetailsTableAction","button","detailsLink","uiStatebuilder","OpContextMenuTableAction","linkTitle","contextMenu","built","TablePaginationComponent","label_previous","label_next","per_page","no_other_page","loadPaginationOptions","paginationOptions","PaginationInstance","totalEntries","updateCurrentRangeLabel","updatePageNumbers","selectPerPage","setPerPage","showPage","onUpdatedPage","hideForSinglePageResults","totalItems","lowerBound","getLowerPageBound","upperBound","getUpperPageBound","currentRange","showPageSelections","pageNumbers","postPageNumbers","maxVisible","getMaxVisiblePageOptions","truncSize","getOptionsTruncationSize","currentPage","startingDiff","truncatePageNums","prePageNumbers","min","showPerPageOptions","showPerPage","perform","disectFrom","disectLength","truncateFrom","truncationSize","truncatedNums","WorkPackageTablePaginationComponent","wpPagination","isManualSortingMode","infoText","paginationInfoText","updateFromObject","pageNumber","timelineElementCssClass","timelineBackgroundElementClass","timelineGridElementCssClass","timelineMarkerSelectionStartClass","timelineHeaderCSSClass","timelineHeaderSelector","TimelineViewParametersSettings","getPixelPerDayForZoomLevel","requiredPixelMarginLeft","TimelineViewParameters","hour","minute","seconds","dateDisplayStart","pixelPerDay","settings","maxWidthInPx","maxSteps","dateDisplayEnd","dayCountForMarginLeft","calculatePositionValueForDayCountingPx","viewParams","calculatePositionValueForDayCount","getTimeSlicesForHeader","vp","startView","endView","inViewport","rest","sliceStart","sliceEnd","viewport","visibleViewportAtCalculationTime","isSameOrAfter","isSameOrBefore","firstRest","lastRest","inViewportAndBoundaries","calculateDaySpan","visibleWorkPackages","loadedWorkPackages","viewParameters","earliest","latest","isAfter","providedConfig","selectorTableSide","selectorTimelineSide","jQueryScrollSyncEventNamespace","scrollStep","getPlattformAgnosticScrollAmount","originalValue","syncWheelEvent","jev","elementTable","elementTimeline","scrollTarget","ev","originalEvent","deltaX","deltaY","getXandYScrollDeltas","y","scrollLeft","createScrollSync","elTable","elTimeline","syncedLeft","syncedRight","off","HighlightingTransformer","DragAndDropTransformer","inlineCreateService","updateRenderedOrder","sibling","rowIndex","collapsedGroupId","collapsedGroupElements","getElementsByClassName","collapsedGroupLastChild","findRowIndex","reinsert","sourceIndex","onCloned","original","maxWidth","outerHTML","onShadowInserted","mappedOrder","currentRenderedOrder","renderedWorkPackages","WorkPackageViewSortByService","GroupFoldTransformer","workPackageViewCollapsedGroupsService","groupsCollapseEvent","EditCellHandler","displayClassName","editableClassName","positionOffset","getPosition","$onUserActivate","readOnlyClassName","RelationsCellHandler","setExpandFor","WorkPackageTableContextMenu","additionalPositionArgs","triggerContextMenuAction","startAddRelationPredecessor","startAddRelationFollower","wpViewIndentation","indent","outdent","WorkPackageViewHierarchyIdentationService","ContextMenuHandler","rowSelector","ContextMenuClickHandler","ContextMenuKeyboardHandler","contextMenuEnabled","keyCode","altKey","ContextMenuRightClickHandler","RowClickHandler","activeFieldClassName","RowDoubleClickHandler","GroupRowHandler","parents","toggleGroupCollapseState","HierarchyClickHandler","WorkPackageStateLinksHandler","ColumnsTransformer","HierarchyTransformer","lastValue","renderHierarchyState","classNames","isCollapsed","RelationsTransformer","RowsTransformer","changedId","SelectionTransformer","ifShouldFocus","renderSelectionState","TimelineTransformer","renderVisibility","TableHandlerRegistry","viewRef","stateTransformers","cssClassRowHovered","WpTableHoverSync","tableAndTimeline","lastHoveredElement","handleHover","eventListener","passive","removeEventListener","removeAllHoverClasses","locateHoveredTableRow","locateHoveredTimelineRow","parentTableRow","parentTimelineRow","removeOldAndAddNewHoverClass","extractWorkPackageId","getAttribute","hovered","tableRow","timelineRow","WorkPackagesTableComponent","zone","configurationObject","limitedResults","tableSummary","tableSummaryHints","timelines","sumVisible","numTableColumns","scrollSyncUpdate","manualSortEnabled","wpTableHoverSync","registerTimeline","controller","getTableAndTimelineElement","tableElement","$tableSide","$timelineSide","WpTabWrapperComponent","wpTabsService","ndcDynamicInputs$","findTab","getTab","WpTabsComponent","goToFullScreen","uiSrefBase","canViewWatchers","getDisplayableTabs","routeParams","WorkPackageRelationRowComponent","newRelationText","showDescriptionEditForm","showRelationTypesForm","showRelationInfo","removeButton","description_label","toggleDescription","relatedBy","userInputs","availableRelationTypes","normalizedRelationType","relationReady","startDescriptionEdit","textarea","relationDescriptionTextarea","textlen","prop","handleDescriptionKey","cancelDescriptionEdit","saveDescription","showDescriptionInfo","activateRelationTypeEdit","groupByWorkPackageType","cancelRelationTypeEditOnEscape","saveRelationType","toggleUserDescriptionForm","highlightingClassForWpType","WorkPackageRelationsGroupComponent","groupByType","groupByRelation","togglerText","toggleButton","onToggleGroupBy","toggleElement","WorkPackageRelationsCreateComponent","addNewRelation","createRelation","createCommonRelation","toggleRelationsCreateForm","showRelationsCreateForm","WorkPackageRelationsHierarchyComponent","parentHeadline","childrenHeadline","canModifyHierarchy","canAddRelation","childrenQueryProps","WorkPackageRelationsComponent","relations_header","loadedRelations","getRelatedWorkPackages","observablesToGetZipped","zip","getRelatedWorkPackageId","toggleGroupBy","buildRelationGroups","currentRelations","relationGroups","relationGroupKeys","relationsPresent","stateValues","relatedWpIds","relatedWorkPackages","WorkPackageRelationsTabComponent","ActivityPanelBaseController","wpSingleViewService","commentsOnly","showAll","lastTransitionName","successfulTransitions","peekTail","comingFromNotifications","firstRouteOnMobile","reloadActivities","selectNotificationsCount$","scrollIfNotificationPresent","hasNotification","scrollToUnreadNotification","updateActivities","unfilteredActivities","getVisibleActivities","visibleActivities","showToggler","shouldShowToggler","countAll","countWithComments","getActivitiesWithComments","onlyComments","hasUnreadNotification","activityHref","unreadNotifications","notificationElement","scrollOffset","additionalScrollMargin","toggleComments","WorkPackageCommentFieldHandler","EditFieldHandler","withText","rawComment","commentValue","handleUserCancel","onDestroy","onFocusOut","handleUserKeydown","onlyCancel","isChanged","WorkPackageCommentComponent","commentService","wpLinkedActivities","editTitle","cancelTitle","canAddComment","showAbove","draft$","draft","quoteEvents$","quote","commentContainer","startDragOverActivation","scrollToBottom","handleUserSubmit","scrollableContainer","scrollHeight","setErrors","newErrors","TemplateRef","DynamicBootstrapComponent","HTML","templateString","innerHtml","dynamicBootstrapper","bootstrapOptionalEmbeddable","ActivityLinkComponent","activityHtmlId","activityLabel","UserActivityComponent","label_created_on","label_updated_on","quote_comment","edit_comment","htmlId","updateCommentText","isComment","isBcfComment","userCanEdit","userCanQuote","userName","userAvatar","avatar","activityElement","shouldHideIcons","focussing","quoteComment","quotedText","bcfSnapshotUrl","newActivity","finally","focusEditIcon","focused","quoted","line","postedComment","RevisionActivityComponent","loadAuthor","revision","revisionPath","showRevision","formattedRevision","formattedIdentifier","revision_identifier","revisionLink","committed_revision_link","author","authorName","userActive","userLabel","ActivityEntryComponent","activityType","NewestActivityOnOverviewComponent","trackByProperty","latestActivityInfo","latestActivities","WorkPackageOverviewTabComponent","WorkPackageActivityTabComponent","WorkPackageFilesTabComponent","storagesResourceService","canViewFileLinks","allowManageFileLinks$","showAttachmentHeader$","viewPermission","workPackageWatchersCount","workPackageRelationsCount","workPackageNotificationsCount","WpSingleViewService","nonDateAlertNotificationsCount$","workPackageFilesCount","attachmentService","fileLinkService","WorkPackageTabsService","registeredTabs","buildDefaultTabs","patchTabCondition","displayable","tabDefinition","counter","tabId","showCountAsBubble","WorkPackageTypeStatusComponent","WorkPackageWatcherButtonComponent","setWatchStatus","isWatched","displayWatchButton","toggleWatch","toggleLink","nextStateLink","buttonClass","buttonId","watchIconClass","derive","WorkPackageIsolatedQuerySpaceDirective","_angular_core__WEBPACK_IMPORTED_MODULE_39__","useExisting","WorkPackageViewSumService","WorkPackageViewAdditionalElementsService","WorkPackageViewDisplayRepresentationService","WorkPackageViewIncludeSubprojectsService","WorkPackageService","TimeEntryCreateService","WorkPackageCellLabels","leftHover","rightHover","withAlternativeLabels","classNameLeftLabel","classNameRightContainer","classNameRightLabel","classNameLeftHoverLabel","classNameRightHoverLabel","classNameHoverStyle","classNameFarRightLabel","classNameShowOnHover","classNameHideOnHover","classNameLeftHandle","classNameRightHandle","TimelineCellRenderer","workPackageTimeline","label_children_derived_duration","ganttChartRowHeight","canMoveDates","isNaN","valueOf","displayPlaceholderUnderCursor","renderInfo","dateUnderCursor","dayOffset","cursorDateAndDayOffset","displayDurationForDate","pointerEvents","zIndex","applyTypeColor","assignDateValues","assignDate","onDaysMoved","dayUnderCursor","initialStartDate","initialDueDate","calculatedDueDate","onMouseDown","dateForCreate","activeSelectionMode","mouseDirection","projection","mouseDownCursorType","forceCursor","onMouseDownEnd","backgroundImage","setElementPositionAndSize","checkForActiveSelectionMode","checkForSpecialDisplaySituations","floor","offsetX","selectionModeStart","newDuration","currentDate","getMarginLeftOfLeftSide","offsetStart","getMarginLeftOfRightSide","getPaddingLeftForIncomingRelationLines","getPaddingRightForOutgoingRelationLines","createAndAddLabels","labelCenter","labelLeft","containerRight","labelRight","labelFarRight","labelHoverLeft","labelHoverRight","bg","selectionMode","minWidth","cursorOrDatesAreNonWorking","evOrDates","MouseEvent","derivedStartDate","derivedDueDate","previousChildrenDurationBar","childrenDurationBar","childrenDurationHoverContainer","visibleChildren","activeDragNDrop","labelConfiguration","getNormalizedLabels","renderLabel","renderHoverLabels","renderFieldValue","isParentWithVisibleChildren","inHierarchyMode","TimelineMilestoneCellRenderer","diamond","_direction","marginLeft","ri","registerWorkPackageMouseHandler","getRenderInfo","renderer","placeholderForEmptyCell","mouseDownStartDay","jBody","applyRendererMoveChanges","moved","getCursorOffsetInDaysFromLeft","leftOffset","getAbsoluteLeftCoordinates","cursorOffsetLeftInPx","clientX","keyPressFn","handleMouseMoveOnEmptyCell","cursor","onmouseleave","onmousedown","clickStart","offsetDayStart","mouseMoveOnEmptyCellFn","mouseDownType","relativePosition","offsetDayCurrent","onmouseup","disableViewParamsCalculation","onmousemove","resetCursor","invalidDates","cancelChange","clearValue","saveWorkPackage","timelineRendered","refreshView","workPackageMouseDownFn","classNameActiveDrag","createMouseMoveFn","WorkPackageTimelineCell","renderers","latestRenderInfo","cellRenderer","canConnectRelations","cellElement","wpElement","cellContainer","lazyInit","elementShape","isDuplicatedCell","milestone","generic","WorkPackageTimelineCellsRenderer","wpTimeline","cellRenderers","hasCell","getCellsFor","refreshAllCells","synchronizeCells","refreshSingleCell","refreshCellsFor","renderInfoFor","currentlyActive","workPackageIdOrder","difference","buildCellsAndRenderOnRow","rowClassIdentifier","WorkPackageTimelineTableController","commonPipes","workPackagesWithGroupHeaderCell","wpsWithGroupHeaderCell","tableWorkPackage","shouldBeShownInCollapsedGroupHeaders","orderedRows","wpTableComponent","daysService","scrollBar","getFirstDayInViewport","getLastDayInViewport","outerContainer","refreshRequest","setupManageCollapsedGroupHeaderCells","workPackageCells","cellsRenderer","workPackageIndex","onRefreshRequested","getParentScrollContainer","_viewParameters","isAutoZoom","applyAutoZoomLevel","appliedZoomLevel","calculateViewParams","cb","refreshCollapsedGroupsHeaderCells","collapsedGroupsCellsMap","currentWidth","scrollWidth","activateSelectionMode","nonVisibleDaysLeft","viewPortRight","daysUntilViewPortEnds","resetSelectionMode","selectionParams","Mousetrap","currentParams","newParams","getWorkPackagesToCalculateTimelineWidthFrom","visibleDays","isSame","workPackagesToCalculateWidthFrom","daysSpan","timelineWidthInPx","manageCollapsedGroupHeaderCells","groupsCollapseConfig","tableWorkPackages","refreshAllGroupHeaderCells","allGroupsChanged","collapsedGroupsChange","collapsedGroupsChangeArray","groupsToUpdate","shouldManageCollapsedGroupHeaderCells","lastChangedGroup","createCollapsedGroupHeaderCells","removeCollapsedGroupHeaderCells","keyGroupType","groupTypesWithHeaderCellsWhenCollapsed","groupedBy","changedGroupId","changedGroupType","changedGroupWpsWithHeaderCellsIds","collapsedGroupKey","wpTypesToShowInCollapsedGroupHeaders","wpTypeFunction","OpColumnsContextMenu","confirmDialog","confirmDelete","showAnchorRight","isSortable","setAsSingleSortCriteria","addSortCriteria","isGroupable","isCurrentlyGroupedBy","setBy","isFirst","isLast","focusColumn","removeColumn","WorkPackageTimelineHeaderController","wpTimelineService","workPackageTimelineTableController","innerHeader","renderLabels","renderLabelsDays","renderLabelsWeeks","renderLabelsMonths","renderLabelsQuarters","renderLabelsYears","activeZoomLevel","renderTimeSlices","quarter_number","marginTop","cellCallback","addLabelCell","top","workPackagePrefix","TimelineRelationElement","belongsToId","DEBUG_DRAW_RELATION_LINES_WITH_COLOR","timelineGlobalElementCssClassname","newSegment","yPosition","backgroundColor","WorkPackageTableTimelineRelations","setupRelationSubscription","wps","relationsForWorkPackage","workPackagesWithRelations","renderWorkPackagesRelations","workPackageWithRelation","removeRelationElementsForWorkPackage","renderElement","removeAllVisibleElements","renderElements","wpIdsWithRelations","startCells","endCells","startCell","idxFrom","endCell","idxTo","renderRelation","rowFrom","rowTo","startX","targetX","directionY","directionX","paddingRight","startLineWith","lastX","timelineStaticElementCssClassname","TimelineStaticElement","finishElement","TodayLineElement","offsetToday","dayProgress","WorkPackageTableTimelineStaticElements","WorkPackageTableTimelineGrid","gridContainer","paddingTop","checkForNonWorkingDayHighlight","qaSelector","getDate","getMonth","getFullYear","WorkPackageWatcherEntryComponent","panelCtrl","WorkPackageTableSumsRowController","isHidden","groupSumsBuilder","totalSums","WorkPackageRelationQueryComponent","relatedTo","getRelationTypeFromQuery","WorkPackagesTableConfigMenuComponent","configureTable","openTableConfigurationModal","OpWpTabsModule","OpenprojectTabsModule","WorkPackageFormAttributeGroupComponent","wpEditForm","shouldHideField","editMode","TimeEntryChangeset","buildPayloadFromChanges","OpenprojectStoragesModule","SortFilesPipe","CookieService","OpSpotModule","SortHeaderDirective","toggleHierarchy","openMenu","sortColumn","latestSortElement","headerColumn","currentSortDirection","setActiveColumnClass","sortable","directionClass","getDirectionClass","isHierarchyColumn","columnType","relationColumnType","columnName","hierarchyIcon","isHierarchyDisabled","setHierarchyIcon","displayDropdownIcon","displayHierarchyIcon","hierarchyToggleEnabled","toggleState","bootstrapAttributeGroups","bootstrapAttributeGroupsCalled","hookService","OpAttachmentsComponent","OpenprojectEditorModule","OpenprojectAttachmentsModule","OpenprojectModalModule","OpenprojectAutocompleterModule","EditFieldControlsModule","WpResizerDirective","jump_to_pagination","text_jump_to_pagination","showToolbarSaveButton","shouldUpdateHtmlTitle","queryTitle","setupInformationLoadedListener","queryParamListener","updateTitle","showToolbar","toolbarDisabled","selectedTitle","titleEditingEnabled","additionalLoadingTime","loadFirstPage","opStaticQueries","getStaticName","isFirstLoad","tslib__WEBPACK_IMPORTED_MODULE_19__","WorkPackageNewSplitViewComponent","WorkPackageCopySplitViewComponent","menuItemClass","showComponent","newComponent","makeFullWidth","showMobileAlternative","routeName","trans","reloadOnSearch","menuItem","newRoute","mobileAlternative","allowMovingInEditMode","WorkPackageEditFormRoutingService","EditFormRoutingService","blockedTransition","fromParams","WorkPackageListViewComponent","wpViewFilters","incomplete$","updateViewRepresentation","selectedRow","selectedCard","previousSibling","block","tableInformationLoaded","showResizerInCardView","showTableView","wpDisplayCardRepresentation","openInFullView","handleWorkPackageCardClicked","WorkPackageSplitViewToolbarComponent","button_more","WorkPackageSingleViewBase","firstRoute","backRouting","observeWorkPackage","focusedWorkPackage","isFirstRoute","isSameID","workPackageI","setRowState","whenChanged","showBackButton","backToList","handleLoadingError","flash_message","eventHandlers","WpSingleViewStore","currentUser$","loggedIn","reloadOnCenterUpdate","requireInvolvedRelations","requireHierarchyElements","requireSumsSchema","loadAdditional","getInvolvedWorkPackages","WorkPackageViewBaseService","pristineState","updatesState","lastUpdatedState","combinedRaw","combine","deriveRaw","pristine","getDefaultState","currentGroups","allGroupsAreCollapsed","allGroupsAreExpanded","currentGroupedBy","workPackageViewGroupByService","getAllGroupsCollapsedState","newCollapsedState","setAllGroupsCollapseStateTo","collapsedState","groupUpdatedState","updatedState","currentCollapsedGroupsState","firstGroupIdentifier","firstGroupCollapsedState","allGroupsHaveTheSameCollapseState","isCurrentlyEqualTo","comparer","toApply","oldColumns","newColumns","relationColumns","findById","setColumns","columnIds","moveColumn","fromIndex","newColumn","availableState","unused","wpDisplayListRepresentation","isCards","setDisplayRepresentation","representation","incomplete","rawFilters","modifier","newFilters","modify","filterOrId","availableSchemas","mapper","Set","isComplete","cloneFilters","invisibleFilters","isFocused","focusAfterRender","setFocusAfterRender","cur","wpViewHierarchies","wpRelationHierarchy","renderedWorkPackageIds","ancestorCount","lastAncestor","predecessorId","predecessor","WorkPackageViewHierarchies","setState","initialState","shouldHighlightInline","filteredValue","highlight","setIncludeSubprojects","include","MIN_ORDER","MAX_ORDER","DEFAULT_ORDER","ORDER_DISTANCE","livePosition","positionFor","redistribute","minIndex","maxIndex","itemsToDistribute","space","newDelta","reorderedInsert","firstPosition","lastPosition","buildInsertPosition","K","positionSwap","myPosition","neighbor","neighborPosition","insertAsFirst","successorPosition","ie","rebuiltDelta","predecessorPosition","buildUpPredecessorPosition","distance","rebuildPositions","minMaxPositions","any","assignPosition","buildDelta","isAscendingOrder","upstreamOrder","pos","WorkPackageViewPagination","getCachedPerPage","currentState","updateFromResults","eachCallback","typeHref","nextState","initializeSelection","selectedWorkPackageIds","activeRowIndex","_emptyState","getSelectedWorkPackages","selectionCount","renderedElements","wasManuallySorted","isManuallySorted","criteria","findAvailableDirection","manualSortObject","defaultState","appliedZoomLevel$","visibilityChanged","zoomLevelChanged","labelsChanged","setVisible","defaultLabels","positionAsString","setZoomLevel","updateZoomWithDelta","applyZoomLevel","applied","enableAutozoom","displayNotificationsButton$","showStaticPagePath","attachmentsResourceService","fileLinkResourceService","updateFocusAnchorLabel","focusAnchorLabel","tslib__WEBPACK_IMPORTED_MODULE_22__","setupQueryObservers","setupRefreshObserver","setupQueryLoadedListener","setupChangeObserver","queryState","newQuery","triggerUpdate","filterRefreshEvents","queryLoaded","_angular_core__WEBPACK_IMPORTED_MODULE_30__","tslib__WEBPACK_IMPORTED_MODULE_31__","StaticQueriesService","addWorkPackageFullscreenLink","successful_delete","performBulkDelete","defaultHandling","OpAttachmentListItemComponent","deleteIconTitle","removeFile","confirmDialogService","principalsResourceService","principalRendererService","dragHint","deleteTitle","deleteConfirmation","arg","fileIcon","getIconForMimeType","authorId","timestampText","author$","viewInitialized$","setDragData","downloadPath","previewElement","draggableHTML","dataTransfer","setData","setDragImage","isImage","src","ext","imageFileExtensions","confirmRemoveAttachment","continue","dangerHighlighting","OpAttachmentListComponent","attachmentsSelector","uploadLabel","dropFiles","dropClickFiles","foldersWarning","_event","dragging","populateInputsFromDataset","newResource","compareCreatedAtTimestamps","rightCreatedAt","leftCreatedAt","attachments$","onGlobalDragEnter","onGlobalDragLeave","onGlobalDragEnd","triggerFileInput","filePicker","onFilePickerChanged","fileList","uploadFiles","onDropFiles","dropEffect","dfFiles","draggingOverDropZone","onDragOver","containsFiles","onDragLeave","countBefore","filterFolders","AttributeHelpTextsService","helpTexts","requireById","help_texts","AttributeHelpTextModalComponent","helpText","helpTextLink","editText","attributeHelpTextSelector","AttributeHelpTextComponent","attributeHelpTexts","open_dialog","helpTextId","handleClick","attributeScope","AttributeHelpTextModule","autocompleteSelectDecorationSelector","AutocompleteSelectDecorationComponent","multiselect","labelForId","inputId","syncInputFieldName","inputName","setInitialSelection","isProjectField","setInitialProjectSelection","removeCurrentSyncedFields","createSyncedField","updateProjectSelection","mappedItems","currentProjectSelection","OpAutocompleterFooterTemplateDirective","CreateAutocompleterComponent","add_new_action","onAfterViewInit","openSelect","openDirectly","changeModel","opened","appendTo","closed","keyPressed","onKeydown","_openDirectly","focusInputField","DraggableAutocompleteComponent","dragula","updateAvailableOptions","columnsGroup","createGroup","drag","setBodyCursor","drop","that","autoscroll","DomAutoscrollService","margin","maxSpeed","scrollWhenOutside","autoScroll","down","drake","autofocus","clearModel","_selected","OpAutocompleterHeaderTemplateDirective","OpAutocompleterLabelTemplateDirective","OpAutocompleterOptionTemplateDirective","OpAutocompleterService","loadAvailable","searchKey","finalFilters","loadData","opAutocompleterService","defaultData","typeahead","items$","results$","autocompleteInputStream","fetchDataDirectly","focusDirectly","getOptionsItems","focusSelect","searched","blured","cleared","keydowned","keydown","added","removed","scrolled","scroll","scrolledToEnd","scrollToEnd","queryString","NEVER","OPENPROJECT_AUTOCOMPLETE_COMPONENTS","VersionAutocompleterComponent","WorkPackageAutocompleterComponent","TimeEntryWorkPackageAutocompleterComponent","UserAutocompleterComponent","ProjectAutocompleterComponent","ColorsAutocompleterComponent","OpSearchHighlightDirective","NgSelectModule","DragulaModule","FormsModule","flattenProjectTree","projectTreeItems","depth","fullList","projectTreeItem","numberOfAncestors","insertProjectWithAncestors","ancestorToFind","ancestorInTree","buildTree","recursiveSort","projectsAutocompleterSelector","isInlineContext","_value","valueChange","onTouched","hiddenInput","dispatchEvent","plainValue","disableSelectedItems","normalizedValue","arrayedValue","projectTracker","getAvailableProjects","dataLoaded","mapResultsFn","apiFilters","fullParams","writeValue","registerOnChange","fn","registerOnTouched","NG_VALUE_ACCESSOR","forwardRef","recent","setMode","modeSwitch","InviteUserButtonComponent","opInviteUserModalService","autocompleter","canInviteUsersToProject$","onAddNewClick","usersAutocompleterSelector","inputFilters","userInvited","getAvailableUsers","searchFilters","filteredURL","canCreateNewActionElements","createNewVersion","available_projects","getVersionPayload","onCreate","definingProject","colorsAutocompleterSelector","setColorOptions","updateInputField","getElementsByName","updateInput","highlightTextInline","onModelChange","colors","selectedOption","selectedColorId","selectedColor","highlightColor","highlightingClass","ColorsService","toHsl","valueHash","toHsla","opacity","charCodeAt","cstr","declaredInputsParentKey","declaredInputs","outsideName","insideName","OpDateTimeComponent","dateTimeValue","OpBasicRangeDatePickerComponent","stringValue","resolveDateArrayToString","debounce","changeValueFromInput","mobile","initializeDatePicker","newDates","resolveDateStringToArray","showDatePicker","datePickerInstance","DatePicker","allowInput","showMonths","_date","_datestr","calendarContainer","dateStr","onDayCreate","dObj","dStr","fp","dayElem","dateObj","minimalDate","trim","opBasicSingleDatePickerSelector","OpBasicSingleDatePickerComponent","setDates","picked","_dObj","_dStr","_fp","datepickerElemIdentifier","datepickerTarget","weekdaysPromise","datepickerInstance","redraw","mergedOptions","datePickerInstances","flatpickr","setDate","weekNumbers","getWeek","datepickerFormat","defaultDate","shorthand","longhand","weekAbbreviation","rangeSeparator","mappedDate","setHours","areDatesEqual","firstDate","secondDate","parsedDate1","parsedDate2","keepCurrentlyActiveMonth","datePicker","currentMonth","currentYear","comparableDate","enforceDate","selectedDates","newStart","newEnd","selectedStart","selectedEnd","enforcedMonth","enforcedYear","monthDiff","isDayDisabled","FormsService","_httpClient","submit$","resourceEndpoint","resourceId","formHttpMethod","formSchema","modelToSubmit","formatModelToSubmit","getRawValue","httpMethod","handleBackendFormValidationErrors","validateForm$","getFormattedErrors","formattedErrors","setFormValidationErrors","formModel","linksModel","mainModel","resourcesModel","formSchemaKey","ee","formattedResourcesModel","resourceKey","resourceModel","formattedResourceModel","resourceElement","formatModelToEdit","metaModel","otherElements","otherElementsModel","isValue","getFormattedResourcesModel","_d","formErrors","getAllFormValidationErrors","formControlKeys","keysToValidate","X","D","DynamicFieldsService","formsService","useForFields","editorType","noWrapLabel","selectDefaultValue","bindLabel","searchable","virtualScroll","clearOnBackspace","clearSearchOnAdd","hideSelected","expressionProperties","formState","getConfig","formPayload","formFieldGroups","fieldGroup","formlyFields","getFieldsSchemasWithKey","getFormlyFieldConfig","getFormlyFormWithFieldGroups","getModel","formFields","formField","getDynamicFormFieldGroups","fieldSchemaKey","getAttributeKey","isFieldSchema","schemaValue","minLength","maxLength","fieldTypeConfigSearch","getFieldTypeConfig","fieldTypeConfig","getFieldProperty","fieldOptions","getFieldOptions","wrappers","allowedValuesHref","fieldType","inputType","inputsCatalogue","inputConfig","configCustomizations","isMultiSelectField","rtl","optionsValues","_e","formatAllowedValues","addParamToHref","prependCurrentValue","prependDefaultValue","option","formWithFieldGroups","newFormFieldGroup","getDefaultFieldGroupSettings","fieldGroupConfig","fieldGroupClassName","isFieldGroup","collapsibleFieldGroups","collapsibleFieldGroupsCollapsed","getGroupFields","collapsibleFieldGroupsCollapsedExpressionProperty","groupField","formControl","parentForm","submitted","DynamicFormService","_dynamicFieldsService","_formsService","registerForm","getSettingsFromBackend$","formEndpoint","formPath","formConfig","getSettings","innerModel","formattedModel","dynamicFormService","patchValue","dynamicFieldsService","changeDetectorRef","load_error_message","successful_update","successful_create","job_started","setDisabledState","enable","dynamicFormGroup","fieldsSettingsPipe","initializeDynamicForm","modelChange","submitForm","handleSubmit","noPathToSubmitToError","formResponse","showNotifications","showSuccessNotification","errored","validateForm","handleCancel","dirty","history","back","formEndPoint","getFormEndPoint","noSettingsSourceErrorMessage","setupDynamicFormFromSettings","setupDynamicFormFromBackend","dynamicFormSettings","setupDynamicForm","formattedSettings","submitMessage","FormlyForm","TextInputComponent","FieldType","IntegerInputComponent","SelectInputComponent","ProjectInputComponent","SelectProjectStatusInputComponent","cssClass","projectStatusCodeCssClass","BooleanInputComponent","FormattableControlComponent","ckEditorContext","attachmentLabel","onTouch","syncCKEditorReadonlyMode","onContentChange","valueToEmit","ckEditorInstance","editor","enableReadOnlyMode","disableReadOnlyMode","onCkeditorSetup","_editor","ui","focusTracker","touched","OpCkeditorComponent","FormattableTextareaInputComponent","DynamicFieldWrapperComponent","FieldWrapper","dynamicFormComponent","DateInputComponent","DynamicFieldGroupWrapperComponent","FormattableControlModule","FormattableEditFieldModule","UserInputComponent","FormlyModule","NgOptionHighlightModule","EditableToolbarTitleComponent","editableClass","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","whenOutside","resetInputField","showSaveCondition","onEmptyError","emitSave","onEmptySubmit","focusInputOnError","tslib__WEBPACK_IMPORTED_MODULE_8__","CKEditorPreviewService","refs","matchedElements","ref","CKEditorSetupService","wrapper","initialData","editorClass","OPConstrainedEditor","OPClassicEditor","toolbarWrapper","contentWrapper","uiLocale","loadedLocale","contentLanguage","openProject","createConfig","createWatchdog","watchdog","toolbar","getData","OPEditorWatchdog","setCreator","createCustomized","setDestructor","__webpack_require__","helpURL","newVal","_content","Notifications","ckEditorSetup","errorTitle","getTransformedContent","leading","getRawData","manualMode","codeMirrorInstance","notificationOnError","initializeEditor","onInitializationFailed","editorPromise","opCkeditorReplacementContainer","setupWatchdog","debouncedEmitter","enableManualMode","disableManualMode","DragEvent","onInitialized","imported","CodeMirror","lineNumbers","smartIndent","EditorMacrosService","enterpriseBannerSelector","EnterpriseBannerComponent","enterpriseFeature","become_hero","you_contribute","upgrade","more_info_text","enterprise_edition","opReferrer","collapsible","toggleCollapse","enterprisePageSelector","EnterprisePageComponent","button_contact_us","upgrade_link","contact_link","benefits_description","premium_features_text","professional_support_text","enterprise_info_html","feature_title","upgrade_info","button_contact","button_upgrade","Changeset","pristineValue","getPristine","loadedForm","updatePristineResource","buildRequestPayload","_pristineResource","proxyGet","setNewDefaults","changeMap","isWritable","humanName","valueExists","isOverridden","minimalPayload","plainPayload","getLinkedValue","fl","isArrayType","setSpanAttributes","requestedAttribute","getText","getAriaLabel","fieldCache","getFieldForCurrentContext","activeChange","titleContent","labelContent","getLabelContent","displayName","cssClassCustomOption","Field","renderEmpty","emptyDiv","texts","MultipleLinesCustomOptionsDisplayField","ResourcesDisplayField","renderValues","MultipleLinesUserFieldModule","principalRenderer","renderMultiple","PrincipalRendererService","ProgressTextDisplayField","ProgressDisplayField","percentLabel","AbstractFieldService","getFieldForContext","isCustomMultiLinesField","isUserMultiLinesField","DateDisplayField","getSpecificClassFor","CombinedDateDisplayField","startDateElement","createDateDisplayField","dueDateElement","dateElement","dateDisplayField","HighlightableDisplayField","showSchedulingMode","schedulingIcon","shouldHighlight","canOverdue","highlightName","colorize","viewHighlighting","roundedProgress","cf","abridged","optionDiv","valueAbridged","valueForDisplay","OpEditingPortalSchemaToken","OpEditingPortalHandlerToken","OpEditingPortalChangesetToken","EditFieldComponent","updateFromChangeset","overflowingSelector","parseValue","EditFieldService","GlobalEditFormChangesTrackerService","thereAreFormsWithUnsavedChanges","activeForms","i18nService","returnValue","addToActiveForms","removeFromActiveForms","editFormRouting","globalEditFormChangesTrackerService","confirmText","requiresConfirmation","unregisterListener","onBefore","initializeEditMode","waitForField","ctrl","setActive","editContainer","onSavedEmitter","closeEditFields","hasActiveFields","registeredFields","skipField","activateOnForm","activeFieldContainerClassName","skippedFields","renderField","activateWhenNeeded","errorsPerAttribute","openFields","handleSubmissionErrors","resetChange","handleErroneousAttributes","erroneousAttributes","setErrorsForFields","erroneousFields","loadFormAndCheck","fieldHandler","errorMessageOnLabel","_onSubmitHandlers","registerOnSubmit","onBeforeSubmit","_onBeforeSubmitHandlers","registerOnBeforeSubmit","previewContext","EditFormPortalComponent","editField","editFieldHandler","schemaInput","changeInput","fieldInjector","createLocalInjector","onEditFieldReady","HalResourceEditFieldHandler","withErrors","fieldLabel","inEditMode","setClickOffset","tagName","setPosition","isErrorenous","blurActiveField","activeElement","HTMLElement","outlet","createDomOutlet","localInjector","attachComponentPortal","EditFieldControlsComponent","EditableAttributeFieldComponent","displayFieldOptions","startDragActivation","isDropTarget","displayContainer","activateIfEditable","hasSelectionWithin","getSelection","hasSelection","isWithin","anchorNode","ChangesetStates","ResourceChangesetCommit","changesets","newChangeset","unknownAttribute","attributeType","getClassFor","defaultFieldType","fieldClass","addSpecificFieldType","extendFieldType","code","ensureDefaultCode","projectStatusI18n","TextEditFieldComponent","IntegerEditFieldComponent","SelectAutocompleterRegisterService","_fields","getAutocompleterOfAttribute","assignment","SelectEditFieldComponent","newElement","onAddNew","onNewValueAdded","_autocompleterComponent","valuesLoadingPromise","_syncUrlParamsOnChangeIfNeeded","editFormComponent","requiredPlaceholder","initialValueLoading","valuesLoaded","loadValues","autocompleterComponent","selectAutocompleterRegister","availableValues","sortValues","addEmptyOption","loadValuesFromBackend","loadAllowedValues","cacheKey","fetchAllowedValueQuery","allowedValuesFilter","addValue","currentValueInvalid","emptyOption","getEmptyOption","isRequired","newType","InjectFlags","MultiSelectEditFieldComponent","nullOption","showAddNewUserButton","requestFocus","openAutocompleteSelectField","buildSelectedOption","findValueOption","_selectedOption","adjustPosition","valueOption","sortValuesByName","nameA","nameB","checkCurrentValueValidity","FloatEditFieldComponent","BooleanEditFieldComponent","DebouncedRequestSwitchmap","requestHandler","errorHandler","preFilterNull","debounceMs","output$","input$","lastRequestedValue","lastResult","hasResults","until","WorkPackageEditFieldComponent","errorNotificationHandler","requests","filterParams","DateEditFieldComponent","onModalClosed","FormattableEditFieldComponent","getCurrentValue","rawValue","initialContent","ProjectStatusEditFieldComponent","currentStatusCode","availableStatuses","PlainFormattableEditFieldComponent","TimeEntryWorkPackageEditFieldComponent","referenceOutputs","recentWorkPackageIds","time_entries","timeEntry","sortValuesByRecentIds","DatePickerEditFieldComponent","showDatePickerModal","DateModalRelationsService","setChangeset","changeset$","precedingWorkPackages$","followingWorkPackages$","isParent","isChild","getMinimalDateFromPreceeding","minimalDateFromPrecedingRelationship","relationDate","parsedRelationDate","getInvolvedWorkPackageIds","preceding","following","DateModalSchedulingService","dateModalRelations","isSchedulable","dayElement","OpModalBannerComponent","OpDatePickerBannerComponent","hasRelations$","automatically_scheduled_parent","manually_scheduled","start_date_limited_by_relations","changing_dates_affects_follow_relations","click_on_show_relations_to_open_gantt","button_name","show_relations_button","openGantt","OpDatePickerWorkingDaysToggleComponent","onToggle","OpDatePickerSchedulingToggleComponent","scheduling","OpWpSingleDateFormComponent","dateModalScheduling","initializeDatepicker","dateChangedManually$","debounceDelay","updateDate","changeSchedulingMode","changeNonWorkingDays","doSave","doCancel","enforceManualChangesToDatepicker","setToday","flatpickrTarget","updateDatesFromForm","parsedDate","OpWpMultiDateFormComponent","focusHelper","debouncedInput","startDateChanged$","endDateChanged$","startDateDebounced$","endDateDebounced$","datepickerChanged$","handleSingleDateUpdate","clearWithDuration","toggleCurrentActivatedField","durationChanges$","applyDurationChange","formUpdates$","fieldsToUpdate","ignoreNonWorkingDaysWritable","setDurationDaysFromUpstream","setCurrentActivatedField","initialActivatedField","durationField","minimalSchedulingDate","durationAsIso8601","currentlyActivatedDateField","isStateOfCurrentActivatedField","showTodayLink","showFieldAsActive","handleDurationFocusIn","durationFocused","handleDurationFocusOut","displayedDuration","modalPositioned","ensureHoveredSelection","activeField","setDatesAndDeriveDuration","latestSelectedDateObj","selectedDate","replaceDatesWithNewSelection","moveActiveDate","deriveMissingDateFromDuration","durationActiveDateSelected","selectedIsoDate","setDaysInOrder","parsedStartDate","parsedEndDate","applyNewDates","durationDays","fromEvent","CombinedDateEditFieldComponent","isMultiDate","onInputClick","resetDates","dateAttribute","WorkPackageCommentFieldComponent","ProjectEditFieldComponent","setUrl","loadFormAndSetUrl","newProject","fakeProjectHal","APIFilters","typeId","HoursDurationEditFieldComponent","inputValue","validity","parsedValue","UserEditFieldComponent","newUser","DaysDurationEditFieldComponent","formattedValue","TextDisplayField","FloatDisplayField","toLocaleString","useGrouping","maximumFractionDigits","IntegerDisplayField","ResourceDisplayField","ExpressionService","UNESCAPED_EXPRESSION","ESCAPED_EXPRESSION","FormattableDisplayField","unescape","ApplicationRef","DateTimeDisplayField","BooleanDisplayField","translatedValue","WorkPackageDisplayField","EstimatedTimeDisplayField","derivedPropertyName","charAt","toUpperCase","derivedValue","derivedValueString","renderActual","derived","renderDerived","actualPresent","derivedText","WorkPackageSpentTimeDisplayField","logTime","wpID","appendTimelogLink","timeEntryCreateService","timelogElement","showTimelogWidget","showWorkPackageField","IdDisplayField","HighlightedResourceDisplayField","addHighlight","hlClass","TypeDisplayField","UserDisplayField","MultipleUserFieldModule","names","divContainer","renderAbridgedValues","dots","WorkPackageIdDisplayField","uiStateBuilder","ProjectStatusDisplayField","bulb","pulldown","PlainFormattableDisplayField","LinkedWorkPackageDisplayField","innerText","DaysDurationDisplayField","HoursDurationDisplayField","BooleanEditFieldModule","IntegerEditFieldModule","TextEditFieldModule","FocusModule","DateEditFieldModule","SelectEditFieldModule","initializeCoreEditFields","editFieldService","selectAutocompleterRegisterService","initializeCoreDisplayFields","WidgetChangeset","AbstractWidgetComponent","widgetName","editableName","widgetIdentifier","renameWidget","setChangesetOptions","resourceChanged","hostVars","OpIconComponent","OpModalWrapperAugmentService","setupListener","wrapElement","activationSelector","activationLink","modalClassName","iframeUrl","wrappedElement","modalBody","appendIframe","DynamicContentModalComponent","iframe","iframeParent","updateAppHeight","innerHeight","openingEvent","onResize","PortalModule","A11yModule","defaultPrevented","notFullscreen","activeModalData$","activeModalInstance$","m","ConfirmDialogModalComponent","defaultTo","showListData","refreshOnCancel","listTitle","warningText","passedData","showClose","divideContent","confirmAndClose","ConfirmDialogService","augmentedConfirmDialog","augmentFormSubmit","removeAttribute","WpButtonMacroModalComponent","selected_type","button_style","button_style_hint","selectedType","buttonStyle","availableTypes","applyAndClose","typeSelect","WikiIncludePageMacroModalComponent","hint","selectedPageInput","CodeBlockMacroModalComponent","loadLanguageAsMode","language_hint","languageClass","lang","fromTextArea","codeMirrorPane","_language","debouncedLanguageLoader","updateCodeMirrorMode","newLanguage","setOption","updateLanguage","ChildPagesMacroModalComponent","include_parent","selectedIncludeParent","includeParent","updateIncludeParent","configureWorkPackageButton","typeName","configureWikiPageInclude","pageValue","editCodeBlock","configureChildPages","exportPreparing","requestExport","exportOptions","buildExportOptions","representations","addColumnsToHref","triggerByLink","json","replaceWithJobModal","job_id","removeSearch","addSearch","WpDestroyModalComponent","workPackageService","label_confirm_children_deletion","bulk_text","single_text","childCount","_wp","hasChildren","deletesChildren","workPackageLabel","singleWorkPackage","singleWorkPackageChildren","childUnits","blockedDueToUnconfirmedChildren","mustConfirmChildren","childrenDeletionConfirmed","confirmDeletion","busy","noResultsSelector","NoResultsComponent","OpContentLoaderComponent","baseUrl","ContentLoaderModule","OpContextMenuHandler","openerEvent","collision","WorkPackageCreateSettingsMenuDirective","configureFormLink","queryCustomFields","IconTriggeredContextMenuComponent","menuItems","menu","OPContextMenuComponent","OpContextMenuLocalsToken","portalHostElement","onStart","isOpening","reposition","activeMenu","WorkPackageAuthorization","linkForAction","copyLink","bulkCopyLink","isPermitted","permittedActionKeys","permittedActionsWithLinks","WorkPackageSingleContextMenuDirective","opContextMenuService","authorization","PERMITTED_CONTEXT_MENU_ACTIONS","getPermittedPluginActions","WorkPackageContextMenuHelper","selectedWorkPackages","deleteSelectedWorkPackages","editSelectedWorkPackages","copySelectedWorkPackages","logTimeForSelectedWorkPackage","tslib__WEBPACK_IMPORTED_MODULE_16__","CurrentUser","assignee","created_at","updated_at","gantt","latest_activity","created_by_me","assigned_to_me","recently_created","all_open","summary","staticQueries","buildQueries","matched","uiParams","uiSref","projectDependentQueries","userDependentQueries","getStaticQueriesForView","hrefFromPrincipal","multiLine","userElement","sep","typeFromHref","renderAvatar","renderName","userInitials","getInitials","colorCode","borderColor","renderUserAvatar","userAvatarUrl","Image","alt","onload","asLink","principalURL","characters","lastSpace","lastIndexOf","principalSelector","OpPrincipalComponent","principalResourceService","hideName","hideAvatar","insertInList","visibleAncestors","ancestorHref","projectInList","ancestorProject","calculatePositions","SpotToggleComponent","OpProjectIncludeListComponent","currentProjectHref","searchableProjectListService","does_not_match_search","include_all_selected","current_project","updateList","isChecked","changeSelected","selectedHref","getTooltipAlignment","SpotDropAlignmentOption","extendedProjectUrl","currentMenuItem","common","_displayMode","displayMode$","_includeSubprojects","includeSubprojects$","selectedProjects","_selectedProjects","selectedProjects$","toggle_title","filter_all","filter_selected","search_placeholder","clear_selection","include_subprojects","selectedProjectHrefs","queryFilter","projectsInFilter$","allProjects$","searchText$","searchText","hasSelectedAncestor","anySelected","parentChecked","setDisabledStatus","fetchingProjects$","fetching","projects$","resetActiveResult","query$","toggleIncludeSubprojects","toggleOpen","loadAllProjects","clearSelection","projectHrefs","SearchableProjectListService","ResizerComponent","startResize","buttons","oldX","pageX","touches","oldY","startY","clientY","pageY","newX","newY","resizing","setResizeCursor","bindEventListener","onMouseUp","setAutoCursor","onMouseMove","mouseMoveHandler","mouseUpHandler","cursorClass","absolute","relative","toggleService","elementClass","resizingElement","localStorageValue","parseLocalStorageValue","resizeStyle","changeData$","applyColumnLayout","resizer","resizerClass","resizeStart","actualElementWidth","resizeEnd","resizeEvent","manageErrorClass","resizeMove","deltas","checkWidth","singleView","shouldBePresent","OpLoadingProjectListComponent","_searchText","selectedItemID$","selectPreviousResult","selectNextResult","activateSelectedResult","findFirstNonDisabledID","childFound","allProjects","findLastChild","findPreviousID","idOfCurrent","foundPreviousID","findNextID","nextParent","foundNextID","findSearchableListParent","listParent","currentTarget","fileIconMappings","clazz","storageIconMappings","nextcloud","isDirectory","mimeType","getIconForStorageType","storageType","makeFilesCollectionLink","storageLink","transform","array","pure","StorageActionButton","StorageInformationBox","iconClass","header","StorageFileListItem","storageFile","createdByName","lastModifiedAt","enterDirectory","isConstrained","tooltip","checkbox","BreadcrumbsContent","crumbs","FilePickerBaseModalComponent","sortFilesPipe","storageFilesResourceService","storageName","navigate","storageFiles$","storageFileToListItem","currentDirectory","breadcrumbs","changeLevel","enterDirectoryCallback","directory","newCrumb","cancelCurrentLoading","loadingSubscription","SpotBreadcrumbsComponent","LoadingFileListComponent","StorageFileListItemComponent","enterDirectoryOnLabel","isCheckboxTarget","FilePickerModalComponent","selectedFileCount","fileLinksResourceService","alreadyLinkedFile","alreadyLinkedDirectory","toast","successFileLinksCreated","showSelectAll","createSelectedFileLinks","fileMap","selectAllOfCurrentLevel","isAlreadyLinked","changeSelection","fileId","LocationPickerModalComponent","filesAtLocation","canChooseLocation","permissions","emptyHint","submitEmptySelection","directory_not_writeable","file_not_selectable","chooseLocation","OpUploadService","UploadConflictModalComponent","keepBoth","overwrite","NextcloudUploadService","uploadFile","FileLinkListItemComponent","openFile","openFileLocation","removeFileLink","downloadFileLink","floatingText","noViewPermission","removalTitle","removalButtonLabel","removalConfirmation","notAllowdTooltipText","infoTimestampText","fileLinkIcon","downloadAllowed","fileLinkViewAllowed","lastModifiedByName","confirmRemoveFileLink","StorageInformationComponent","StorageComponent","storageFilesLocation","addFileLink","cookieService","uploadService","infoBox","fileLinkErrorHeader","fileLinkErrorContent","connectionErrorHeader","connectionErrorContent","authorizationFailureHeader","authorizationFailureContent","loginButton","linkExisting","uploadFailed","uploadFailedForbidden","uploadFailedSizeLimit","uploadFailedQuota","linkingAfterUploadFailed","draggingManyFiles","uploadingLabel","dropBox","emptyList","openStorage","initializeStorageTypes","storageTypeMap","authorizationState","storageConnected","fileLinks$","storageErrors","getStorageErrors","openLinkFilesDialog","storageFileUpload","selectUploadLocation","resolveUploadConflicts","uploadAndCreateFileLink","isUploadError","uploadResourceLink","uploadAndNotify","uploadResponse","createFileLinkData","fileLinkCreationData","fileLinkSelfLink","handleUploadError","destination","addUpload","compareId","file_id","file_name","prepareUpload","storageFailedAuthorization","failedAuthorizationInformation","storageAuthorizationError","authorizationErrorInformation","fileLinkViewError","fileLinkErrorInformation","authorize","nonce","uuidv4","setAuthorizationCallbackCookie","authorizationFailureActionUrl","limit","nextPage","previousPage","DEFAULT_PAGINATION_OPTIONS","PaginationService","initialPageOptions","localStoragePerPage","initialLength","getPaginationOptions","getPerPageOptions","setPerPageOptions","maxVisiblePageOptions","optionsTruncationSize","ScrollableTabsComponent","pane","scrollPane","updateScrollableArea","_changes","determineScrollButtonVisibility","currentTabId","scrollIntoVisibleArea","clickTab","tabSelected","startDebouncedTabActivation","dragTargetStack","debouncedTabActivationTimeout","clearDebouncedTabActivation","cancelDebouncedTabActivation","clearTimeout","onScroll","hideLeftButton","hideRightButton","clientWidth","scrollRight","tabTitle","tabRightBorderAt","outerWidth","TabCountComponent","TimeEntryCreateModalComponent","TimeEntryBaseModal","deleteAllowed","setModifiedEntry","createdEntry","reloadWorkPackageAndClose","createNewTimeEntry","spentOn","TimeEntryFormComponent","wpRequired","workPackageSelected","setCustomFields","signalModifiedEntry","modifiedEntry","entries","keySchema","isACustomField","areYouSure","showUserField","saveEntry","formInFlight","saveAllowed","stack","timeoutAfter","removeSuccessFlashMessages","nextValue","removeOnAdd","additionalErrors","createToast","createAttachmentUploadToast","addLoading","createLoadingToast","UserLinkComponent","AutofocusDirective","condition","insideOrSelf","within","focusable","findAllFocusableElementsWithin","FocusWithinDirective","focusedObservable","highlightColSelector","OpHighlightColDirective","thead","siblings","ngAfterViewChecked","highlightedElement","toLocaleLowerCase","cleanUpOldHighlighting","textNode","childNodes","nodeType","TEXT_NODE","newNode","unifiedLabelText","flags","getMetadata","propertyName","OnDestroyMixin","untilComponentDestroyed","FalseValue","TrueValue","filterValues","filterMap","only","toAdd","pickBy","toFilterObject","mergeParams","URLSearchParams","msg","point","pointCB","createPointCB","onMove","onUp","setScroll","cleanAnimation","cancelAnimationFrame","animationFrame","windowAnimationFrame","scrolling","getTarget","recurseParents","targetObject","getElementsUnderPoint","underPoint","inside","dispatched","outerScrollContainer","scrollTick","setOuterScrollContainer","scrollAutomatically","rect","getRect","scrollx","scrolly","bottom","scrollY","scrollX","amount","scrollTo","pageXOffset","pageYOffset","pointInside","previousIndex","prev","currentIndex","pointOfInsertion","insertBefore","escapeListener","containers","member","setupAutoscroll","initializeDrake","addScrollContainer","getMember","invalid","revertOnSpill","removeOnSpill","mirrorContainer","ignoreInputTextSelection","FOCUSABLE_ELEMENT_SELECTORS","middleButton","pattern","random","takeUntil$","debouncer","emitter","generatorOrNext","setSelectionRange","originalEvt","rangeParent","range","createRange","setStart","rangeOffset","startOffset","legacyDocument","caretRangeFromPoint","DynamicBootstrapModule","DragDropModule","SpotCheckboxComponent","onStateChange","checkedChange","indeterminate","SpotDropModalTeleportationService","hasRendered$","afterRenderOnce$","appearOrDissapear","hasRenderedFiltered$","templateRef$","SpotDropModalComponent","_opened","teleportationService","focus_grab","escapeCallback","resizeCallback","hasRendered","referenceEl","floatingEl","anchor","cleanupFloatingUI","autoUpdate","computePosition","placement","alignment","middleware","allowRepositioning","flip","mainAxis","crossAxis","fallbackAxisSideDirection","limiter","limitShift","onGlobalClick","onEscape","focusCatcherContainer","focusGrabber","onBodyClick","SpotFormFieldComponent","errorClassName","showErrorMessage","errorsID","internalID","descriptionID","describedByID","ngControl","control","showValidationErrorOn","_formGroupDirective","NgControl","SpotSelectorFieldComponent","formGroupDirective","spotSwitchSelector","SpotSwitchComponent","SpotTextFieldComponent","onParentClick","onInputFocus","inputFocus","onInputBlur","inputBlur","ngContentSelectors","SpotTooltipComponent","alignmentClass","production","GridArea","gridStartRow","gridEndRow","gridStartColumn","gridEndColumn","storedGuid","newGuid","s4","substring","GridWidgetArea","moveRight","moveLeft","growColumn","overlaps","otherArea","rowOverlaps","columnOverlaps","startColumnOverlaps","unchangedSize","writeAreaChangeToWidget","copyDimensionsTo","sink","GridGap","isRow","isColumn","GridAreaService","mousedOverArea","gridResource","numRows","rowCount","numColumns","buildAreas","setMousedOverArea","area","$mousedOverArea","cleanupUnusedAreas","unusedRows","widgetAreas","removeRow","unusedColumns","gridAreas","buildGridAreas","gridGaps","buildGridGaps","gridAreaIds","buildGridAreaIds","buildGridWidgetAreas","rebuildAndPersist","persist","writeAreaChangesToWidgets","saveGrid","saveWidgetChangeset","payloadWidget","isGap","isSingleCell","widgetResources","inHelpMode","helpMode","toggleHelpMode","scrollPlaceholderIntoView","scrollIntoViewIfNeeded","updatedGrid","assignAreasWidget","newGrid","takenIds","newWidget","buildGridAreasRow","buildGridGapRow","excludeRow","movedWidgets","rowWidgets","moveSubsequentRowWidgets","addRow","excludeColumn","columnWidgets","moveSubsequentColumnWidgets","resetAreas","ignoredArea","removeWidget","removedWidget","subsequentWidget","GridRemoveWidgetService","layout","WidgetAbstractMenuComponent","removeItem","menuItemList","hasMenu","WidgetMenuComponent","WidgetHeaderComponent","renamed","onRenamed","isRenameable","WidgetWpCalendarComponent","TimeEntryEditModalComponent","destroyedEntry","TimeEntryEditService","createChangeset","TIME_ENTRY_CLASS_NAME","ADD_ENTRY_CLASS_NAME","ADD_ENTRY_PROHIBITED_CLASS_NAME","TimeEntryCalendarComponent","displayedDays","setHiddenDays","timeEntryEdit","timeEntryCreate","hiddenDays","contentHeight","slotEventOverlap","slotLabelInterval","labelIntervalHours","slotLabelFormat","maxHour","scaleRatio","allDaySlot","displayEventTime","slotMinTime","minHour","slotMaxTime","eventOverlap","stillEvent","timeGrid","alterEventEntry","eventWillUnmount","beforeEventRemove","dispatchEventClick","moveEvent","failureCallback","fetchTimeEntries","buildEntries","memoizedTimeEntries","dmFilters","memoizedCreateAllowed","createTimeEntry","setRatio","buildTimeEntryEntries","buildAuxEntries","dateSums","calculateDateSums","maxHours","oldRatio","smallerSuitableRatio","hoursDistribution","calendarEntries","sumEntry","addEntry","entryName","startEditable","rendering","formatNumber","editEvent","modificationAction","updateEventSet","updated","addEventToday","foundIndex","appendAddIcon","appendSum","addTooltip","prependDuration","appendFadeout","tooltipContentString","track","removeTooltip","fadeout","hslaStart","hslaEnd","workPackageName","sanitizedValue","sanitize","SecurityContext","precision","divisor","TimeEntriesCurrentUserConfigurationModalService","getOrderedDaysData","daysCheckedValues","localeWeekDays","localeOffset","localeData","offsetToApply","offsetCheckedValues","orderedDaysCheckedValues","dayCheckedValue","weekDay","originalIndex","getOriginalIndex","arrayLength","getCheckedValuesInOriginalOrder","configuredDays","localeDayData","validDays","TimeEntriesCurrentUserConfigurationModalComponent","timeEntriesCurrentUserConfigurationModalService","localDayOptions","daysOriginalCheckedValues","checkedValuesInOriginalOrder","WidgetTimeEntriesCurrentUserMenuComponent","configureItem","onConfigured","WidgetTimeEntriesCurrentUserComponent","cdr","updateEntries","updateConfiguration","GridWidgetsService","Hook","registered","registeredWidgets","registration","WidgetDocumentsComponent","documentsUrl","entriesLoaded","documentPath","documentCreated","documentDescription","noEntries","orders","documents","project_id","WidgetNewsComponent","addedBy","news","newsAuthorName","newsCreated","authorLink","newsAuthorPath","newsDmParams","setupNews","newsProjectPath","newsProjectName","GridInitializationService","myPageForm","WpGraphConfigurationSettingsTabComponent","tabInner","WpGraphConfigurationFiltersTabComponent","WpGraphConfiguration","chartOptions","chartType","WpGraphConfigurationService","persistAndReload","persistChanges","reloadQueries","datasets","loadQueries","ensureQueryAndLoad","createInitial","queryPromises","queryParam","formFor","_configuration","_formsPromise","loadForms","_forms","queryTabs","formPromises","WorkPackageEmbeddedGraphComponent","setChartOptions","updateChartData","uniqLabels","labelCountMaps","countMap","setHeight","chartLabels","chartData","responsive","maintainAspectRatio","legend","datalabels","align","chartTypeDefaults","setChartAxesValues","scales","internalChartOptions","hasDataToDisplay","chartHeight","changeableValuesAxis","stacked","ticks","constantValuesAxis","yAxes","xAxes","WpGraphConfigurationModalComponent","graphConfiguration","WidgetWpSetMenuComponent","configurationComponent","outputs","WidgetWpGraphMenuComponent","WidgetWpGraphComponent","initializeConfiguration","loadQueriesInitially","updateGraph","repaint","WidgetWpTableMenuComponent","WidgetWpTableComponent","ensureFormAndSaveQuery","initializationProps","queryCreationParams","WidgetWpTableQuerySpaceComponent","onResourceChanged","QuerySpacedTabComponent","wpGraphConfiguration","initializeQuerySpace","WpGraphConfigurationFiltersTabInnerComponent","WpGraphConfigurationSettingsTabInnerComponent","group_by","chart_type","currentChartType","initializeAvailableGroups","initializeAvailableChartType","availableChartTypes","OpenprojectWorkPackageGraphsModule","ChartsModule","WidgetProjectDescriptionComponent","project$","WorkPackageOverviewGraphComponent","graphConfigurationService","availableGroupBy","additionalFilter","setQueryProps","graphParams","sortedDatasets","displayModeSingle","propsBoth","propsOpen","propsClosed","sortingArray","baseProps","subprojectId","displaySingle","displayMulti","currentGraph","embeddedGraphSingle","embeddedGraphMulti","WidgetWpOverviewComponent","CustomTextEditFieldService","initializeChangeset","valueChanged$","reinitialize","resetText","rawText","textValue","htmlText","resourceSource","schemaSource","WidgetCustomTextComponent","setupVariables","newText","currentRawText","clickedElementIsLinkWithinDisplayContainer","placeholderText","inplaceEditClasses","textEmpty","isTextEditable","memorizeRawText","memorizeCustomText","customText","WidgetProjectDetailsMenuComponent","capabilityPromise","projectActivityLinkItem","WidgetProjectDetailsComponent","loadAndRender","loadProjectSchema","WidgetTimeEntriesListComponent","loadSchema","anyEntries","activityName","editTimeEntry","loadedEntry","timeEntryEditService","changedEntry","oldEntryIndex","newEntries","deleteIfConfirmed","closeByEscape","closeByDocument","anEntry","sumsByDateSpent","sortedEntries","WidgetTimeEntriesProjectComponent","WidgetSubprojectsComponent","projectListParams","WidgetMembersComponent","viewAll","memberships","listMembersParams","partitionEntriesByRole","sortUsersByName","totalMembers","listAvailableProjectsParams","membersAddable","noMembers","entriesByRoles","moreMembers","moreMembersText","usersByRole","membership","WidgetProjectStatusComponent","OpenprojectGridsModule","registerWidgets","defaultColumns","assignedFilters","assignedProps","accountableFilters","accountableProps","createdFilters","createdProps","watchedFilters","watchedProps","appBaseSelector","ApplicationBaseComponent","MY_ACCOUNT_LAZY_ROUTES","loadChildren","OpenProjectMyAccountModule","IAN_LAZY_ROUTES","OPENPROJECT_ROUTES","abstract","inherit","squash","OpenprojectApiDocsModule","OpenprojectBoardsModule","OpenprojectIFCModelsModule","OpenprojectBacklogsModule","OpenprojectReportingModule","OpenProjectJobStatusModule","TeamPlannerModule","bodyClass","updateMenuItem","menuItemTitle","initializeUiRouterListeners","stateService","wpBase","mobileGuardActivated","redirectToMobileAlternative","router","alternativeRoute","onEnter","onExit","start_onboarding_tour","paramsCopy","MiniProfiler","pageTransition","hasProjectRoutes","$$state","pathWithSearch","OpenprojectRouterModule","useHash","uiRouterConfiguration","strictMode","encode","decode","equals","WorkPackagesFullViewComponent","fullView","buttonMore","setWorkPackageScopeProperties","WorkPackageViewDropdownMenuDirective","wpDisplayRepresentationService","WorkPackageViewToggleButtonComponent","statesCombined","detectView","WorkPackageDetailsViewButtonComponent","transitions","transitionListener","activeState","listState","openDetailsView","openListView","WorkPackageTimelineButtonComponent","zoomIn","zoomOut","zoomAuto","isMaxLevel","maxZoomLevel","isMinLevel","minZoomLevel","toggleTimeline","enableAutoZoom","getAutoZoomToggleClass","WorkPackageGroupToggleDropdownMenuDirective","wpViewCollapsedGroups","WorkPackageFoldToggleButtonComponent","WorkPackageViewPageComponent","stateName$","WorkPackageCopyFullViewComponent","WORK_PACKAGES_ROUTES","OpenprojectWorkPackageRoutesModule","GlobalSearchService","_searchTerm","_currentTab","_projectScope","_resultsHidden","loadGonData","available_search_types","search_term","current_tab","project_scope","global_search","submitSearch","searchPath","projectScope","searchQueryParams","resultsHidden","isAfterSearch","OpenprojectGlobalSearchModule","AddGridWidgetModalComponent","widgetsService","upsale_text","eligibleWidgets","chosenWidget","trackWidgetBy","schemaWidgetIdentifiers","GridMoveService","movedArea","ignoreArea","movedAreas","remainingAreas","moveOneDown","anchorAreas","movableAreas","moveSpecification","firstAreaToMove","toMoveArea","anchorArea","areaHeight","overlappingArea","movableArea","referenceArea","GridDragAndDropService","setupMousedOverAreaSubscription","mousedOverAreaObserver","throttleTime","currentlyDragging","placeholderArea","updateArea","draggedArea","moveAreasOnDragging","dropArea","widgetArea","copyPositionButRestrict","isDropOnlyArea","isDragged","isPassive","isDraggable","draggedHeight","offsetHeight","GridResizeService","resizedArea","resizeTargets","sameRow","higherRow","fixedArea","targetIds","moving","isTarget","areaId","isResized","currentlyResizing","isResizable","isAllowed","GridAddWidgetService","resize","isAddable","addLine","newArea","setMaxWidth","existingArea","GridPageComponent","gridInitialization","addWidget","areas","i18nNamespace","html_title","gridScopePath","setHtmlTitle","GRID_PROVIDERS","GridComponent","uiWidgets","handleKeyboardEvent","widgetComponent","reg","widgetComponentInput","widgetComponentOutput","gridColumnStyle","gridStyle","GRID_GAP_DIMENSION","gridRowStyle","GRID_AREA_HEIGHT","identifyGridArea","isHeadersDisplayed","isMobileDevice","itemStyle","bypassSecurityTrustStyle","DashboardComponent","DASHBOARDS_ROUTES","OpenprojectDashboardsModule","uiRouterDashboardsConfiguration","WpPreviewModalComponent","created_by","workPackageLink","PreviewTriggerService","previewModal","modalElement","closeAfterTimeout","mouseInModal","isMouseOverPreview","horizontalHover","verticalHover","OverviewComponent","OVERVIEW_ROUTES","OpenprojectOverviewModule","uiRouterOverviewConfiguration","MyPageComponent","MY_PAGE_ROUTES","OpenprojectMyPageModule","accessKeys","quickSearch","projectSearch","help","moreMenu","KeyboardShortcutService","showHelpModal","globalAction","projectScoped","accessKey","focusPrevItem","focusNextItem","shortcuts","keyName","clickLink","bubbles","cancelable","focusItemOffset","OpenprojectMembersModule","PathScriptAugmentService","loadRequiredScripts","OpenprojectAugmentingModule","modalWrapper","pathScript","OpInviteUserModalAugmentService","spawnModal","OpOptionListComponent","getClassListForItem","ProjectSelectionComponent","typeControl","projectAndTypeForm","projectControl","lackingPermission","lackingPermissionInfo","noInviteRights","nextButton","setPlaceholderOption","projectInviteCapabilities","typeOptions","eeHref","$e","markAsDirty","projectFilterFn","disabledReason","formControlBinding","SpotFormBindingDirective","viewToModelUpdate","PrincipalSearchComponent","loadPrincipalData","canCreateUsers","emailRegExp","hasCapability","alreadyAMember","inviteNewUser","createNewPlaceholder","PlaceholderUser","canInviteByEmail$","canCreateNewPlaceholder$","canInviteByEmail","canCreateNewPlaceholder","showAddTag","createNewFromInput","createNew","nonMemberFilter","nonMembers","memberFilter","nonMember","RoleSearchComponent","noRolesFound","roles$","ctx_r9","ctx_r11","PrincipalComponent","messageControl","principalForm","roleControl","principalControl","dynamicFieldsControl","hasPrincipalSelected","textLabel","isNewPrincipal","Email","isMemberOfCurrentProject","mem","inviteUser","backButton","userDynamicFields","roleData","messageData","formResource","userDynamicFieldConfig","extractCustomFieldsFromSchema","onValidatedSubmit","fieldsSchema","fieldKey","fieldValue","opt","S","SummaryComponent","projectLabel","principalLabel","roleLabel","messageLabel","invite","createPrincipal","placeholder_users","SuccessComponent","OpenprojectInviteUserModalModule","initializeServices","TextFieldModule","RevitAddInSettingsButtonService","labelText","groupLabelText","addUserMenuItem","addLoginMenuItem","userMenu","goToSettings","loginModal","loginMenuItem","OpenprojectEnterpriseModule","MainMenuNavigationService","onActivate","navigationEvents$","recreateToggler","toggler","targetLi","wrapMainItem","mainItems","not","wrap","elementId","wrapperElement","activeRoot","navigateUp","unbind","wrapInner","contents","parentURL","upLink","parentLink","before","TypeBannerService","showEEOnlyHint","GroupEditInPlaceComponent","editedName","saveEdition","leaveEditingMode","onValueChange","TypeFormAttributeGroupComponent","custom_field","rename","removeFromGroup","ANIMATION_RATE_MS","TopMenuService","setupDropdownClick","closeOnBodyClick","accessibility","skipContentClickListener","activeDropdown$","stopHover","closeAllItems","menuIsOpen","visibleLink","toggleClick","dropdown","openDropdown","opening","startHover","hover","menuContainer","openDropdowns","closeDropdown","dropdowns","closeOtherItems","slideAndFocus","slideUp","slideDown","focusFirstInputOrLink","toDrop","getDropdownContainer","toFocus","installMenuLogic","dropDown","emptyTypeGroup","TypeFormConfigurationComponent","externalRelationQuery","typeBanner","drag_to_activate","label_group","new_group","label_inactive","add_group","add_table","no_filter_query","noFilterQuery","updateHiddenFields","groupsDrake","attributeDrake","activeGroups","inactives","inactiveAttributes","deactivateAttribute","updateInactives","addGroupAndOpenQuery","newGroup","editQuery","deleteGroup","resetToDefault","translation","emptyGroup","hiddenField","TypeFormQueryGroupComponent","edit_query","OpenprojectAdminModule","WorkPackageEmbeddedTableEntryComponent","EmbeddedTablesMacroComponent","GlobalSearchWorkPackagesComponent","globalSearchService","wpFilters","inlineCreateEnabled","withFilters","showFilterButton","filterButtonText","searchTerm$","projectScope$","resultsHidden$","CustomDateActionAdminComponent","onKey","currentKey","currentFieldValue","selectedOperator","operators","visibleValue","toggleValueVisibility","valueVisible","updateDbValue","fieldId","updateField","OpSidemenuComponent","Banner","toggleCollapsed","BoardsMenuComponent","mainMenuService","uiOptions","create_new_board","focusBackArrow","showNewBoardModal","GlobalSearchWorkPackagesEntryComponent","UploadProgressComponent","progressBar","progressPercentage","viewInitialized","updateProgress","completed","uploadSuccess","uploadError","ToastComponent","removable","canBeHidden","timeout","executeTarget","onUploadSuccess","uploadCount","uploadText","ToastsContainerComponent","CkeditorAugmentedTextareaComponent","textareaSelector","formElement","wrappedTextArea","removeAttr","$attachmentsElement","markEdited","pageWasEdited","setup","setupAttachmentAddedCallback","setupAttachmentRemovalSignal","addUploadedAttachmentsToForm","setLabel","removedUrls","downloadLocation","fire","textareaId","ckContent","maxValue","toArray","addedAttachments","PersistentToggleComponent","$targetNotification","getTargetNotification","isNowHidden","HideSectionService","sections","displayed","removeHiddenOnSubmit","section","HideSectionLinkComponent","hideSectionService","sectionName","hideSection","ShowSectionDropdownComponent","HideSection","optValue","hideSecWithName","AddSectionDropdownComponent","ContentTabsComponent","gonTabs","CopyToClipboardDirective","clickTarget","clipboardTarget","addNotification","supported","queryCommandSupported","execCommand","GlobalSearchInputComponent","autocompleteWorkPackages","all_projects","current_project_and_all_descendants","search_dots","close_search","toggleTopMenuClass","unregister","btn","toggleMobileSearch","submitNonEmptySearch","redirectToWp","wpPath","openCloseMenu","searchedTerm","selectedItem","clearSearch","onEnterBeforeResultsLoaded","followSelectedItem","searchInScope","currentScope","statusHighlighting","statusId","followItem","customSearchFn","markable","hashFreeQuery","queryWithoutHash","fetchSearchResults","searchResultsToOptions","setMarkedOption","substr","searchOptions","detailedSearchOptions","suggestion","itemsList","markItem","selectedItems","forcePageLoad","replaceState","serviceScope","unregisterGlobalListener","qaSearchOpen","CollapsibleSectionComponent","sectionTitle","sectionBody","OpHeaderProjectSelectListComponent","selectedItemID","OpHeaderProjectSelectComponent","singular","plural","scrollToCurrent","toggleDropModal","dropModalOpen","currentProjectName","allProjectsPath","newProjectPath","parentParam","RemoteFieldUpdaterComponent","$form","htmlMode","keyCodes","updater","Accept","remoteFieldKey","HTMLInputElement","ViewSelectComponent","viewsService","scope_default","scope_starred","scope_global","scope_private","search$","apiViewType","initializeAutocomplete","views$","viewCategories$","categories","category","matchesText","filteredChildren","buttonArrowLeft","updateMenuOnChanges","initializeViews","private","cat","toOpSideMenuItem","viewCategories","GlobalSearchTitleComponent","project_and_subprojects","search_for","in","newSearchTerm","newProjectScope","projectText","searchTitle","GlobalSearchTabsComponent","currentTabSub","currentTab$","tabsSub","tabs$","MembersAutocompleterComponent","TriggerActionsEntryComponent","loadEntry","deleteTimeEntry","timeEntryId","AttributeModelLoaderService","not_found","cache$","DisplayFieldComponent","getDisplayFieldInstance","displayClass","displayFieldContext","containerType","AttributeValueMacroComponent","resourceLoader","invalid_attribute","markError","attrs","AttributeLabelMacroComponent","capitalize","loadResourceAttribute","WorkPackageQuickinfoMacroComponent","detailed","OpenProjectBackupService","triggerBackup","backups","BackupComponent","note","lastBackup","lastBackupFrom","downloadBackup","requestBackup","attachmentsDisabled","jobStatusId","lastBackupDate","lastBackupAttachmentId","mayIncludeAttachments","backupTokenInput","isDownloadReady","getDownloadUrl","includeAttachmentsDefault","includeAttachmentsTitle","opBackup","resp","EnterpriseBaseComponent","button_book","link_quote","email_not_received","confidence","try_another_email","noTrialRequested","OpModalSingleDatePickerComponent","writeWorkingValue","initializeDatepickerAfterOpen","spotDropModalTeleportationService","applyLabel","ngAfterContentInit","useDefaultTrigger","reportValidity","workingValue","workingDate","OpNonWorkingDaysListComponent","empty_state_header","empty_state_description","already_added_error","new_date","add_non_working_day","change_description","change_button","change_title","removed_title","non_working_day_name","listPlugin","_destroy","noEventsContent","listenToFormSubmit","form_submitted","removedNonWorkingDays","modifiedNonWorkingDays","nwd","addNonWorkingDay","selectedNonWorkingDayName","getEventById","EEActiveSavedTrialComponent","userCount","startsAt","expiresAt","isExpired","reprieveDaysLeft","expiredWarningText","HomescreenNewFeaturesBlockComponent","newFeatures","descriptionNewFeatures","learnAbout","teaserWebsiteUrl","translated","currentNewFeatureHtml","translatedEdition","hasBimChanges","list_styling_class","bcf_api_link","MainMenuToggleComponent","topMenu","titleData$","MainMenuResizerComponent","EditableQueryPropsComponent","externalQuery","queryProperties","InAppNotificationBellComponent","activeWindow","polling$","unreadCount$","IAN_MENU_PROJECT_FILTERS","IAN_MENU_REASON_FILTERS","IanMenuStore","notificationsByProject","notificationsByReason","projectsFilter","IanMenuService","ianResourceService","projectsFilter$","projectsForNotifications$","projectHasParent","getUiLinkForFilters","IanMenuComponent","ianMenuService","isEnterprise","eeGuardedDateAlertRoute","notificationsByProject$","notificationsByReason$","byProject","byReason","baseMenuItems","baseMenuItem","TeamPlannerSidemenuComponent","CalendarSidemenuComponent","create_new_calendar","OpModalOverlayComponent","portalOutletContainer","portalOutlet","detachPortalInstance","createAndAttachPortalInstance","includeChildClicks","attachedRef","overlay","CdkPortalOutlet","SpotDropModalPortalComponent","template$","templ","globalDynamicComponents","HTMLSanitizeService","string","PasswordConfirmationModalComponent","field_description","confirm_button","password","passwordValuePresent","passwordConfirmationField","password_confirmation","OpenProjectPluginContext","externalQueryConfiguration","externalRelationQueryConfiguration","htmlSanitizeService","ckEditorPreview","modals","passwordConfirmation","dynamicContent","hal_resource","display_field_module","_knownHookNames","services","runInZone","run","NgZone","OpenprojectPluginsModule","PlannedCostsFormAugment","CostBudgetSubformAugmentService","listen","templateEl","row_identifier","buildRefreshRequest","element_id","fixed_date","CostSubformAugmentService","BudgetBaseResource","BudgetResource","PluginModule","initializeCostsPlugin","CostsByTypeDisplayField","loadIfNecessary","showCosts","renderCostAsLink","renderCostAsText","costType","spentUnits","addSeparator","CurrencyDisplayField","parseFloat","workPackageSingleContextMenu","workPackageTableContextMenu","dataURItoBlob","dataURI","bytes","atob","mime","ia","Uint8Array","Blob","resizeFile","reader","FileReader","readerEvent","resizeImage","canvas","getContext","drawImage","dataUrl","toDataURL","readAsDataURL","AvatarUploadFormComponent","label_choose_avatar","upload_instructions","error_too_large","wrong_file_format","button_update","uploading","_evt","avatarFilePicker","dataURL","blob","avatarFile","avatarPreviewUrl","fileInvalid","uploadAvatar","progress","DocumentBaseResource","DocumentResource","initializeDocumentPlugin","GitActionsService","sanitizeBranchString","str","formattingInput","sanitizeShellInput","branchName","commitMessage","gitCommand","branch","GitActionsMenuComponent","gitActions","copyButtonHelpText","copyResult","success","textToCopy","onCopyButtonClick","snippet","lastCopyResult","copiedSnippetId","showCopyResult","GitActionsMenuDirective","TabHeaderComponent","createPrButtonLabel","createPrButtonDescription","gitMenuLabel","gitMenuDescription","PullRequestComponent","label_created_by","label_last_updated_on","label_details","label_actions","pullRequest","merged","checkRunStateText","checkRun","outputTitle","conclusion","checkRunState","checkRunStateIcon","TabPrsComponent","changeDetector","pullRequestsPath","github_pull_requests","pullRequests","getEmptyText","wp_id","GitHubTabComponent","WorkPackagesGithubPrsService","sortList","workPackageGithubPrsCount","prs","initializeGithubIntegrationPlugin","github","LinkedPluginsModule","Budgets","Costs","OpenprojectAvatars","OpenprojectDocuments","OpenprojectGithubIntegration","OpenProjectStateModule","OpenProjectModule","ngDoBootstrap","_injector","HTTP_INTERCEPTORS","PreviewTrigger","mainMenuNavigationService","topMenuService","keyboardShortcuts","BrowserModule","HttpClientModule","ErrorReporterBase","contextHooks","hookPromises","AppsignalReporter","severity","client","sendError","setupContext","loadAppsignal","pushKey","Appsignal","namespace","use","networkPlugin","tags","hostname","url_path","url_query","setTags","LocalReporter","handleOfflineMessage","registerRequestForConfirmation","passwordConfirmationModal","registerListener","passwordModal","createFieldsetToggleStateLabel","labelClass","toggleLabel","legendLink","setFieldsetToggleState","fieldset","getFieldset","setupToggableFieldsets","fieldsets","toggleFieldset","contentArea","slideToggle","setupServerResponse","initMainMenuExpandStatus","upToggle","focusFirstErroneousField","activateFlashNotice","activateFlashError","autoHideFlashMessage","flashCloseHandler","ajaxComplete","ajaxSend","csrf_meta_tag","setRequestHeader","ajaxStop","addClickEventToAllErrorMessages","resizeTo","error_focus","input_focus","activateFlash","ix","triggerTour","tour","initializeGlobalListeners","performAnchorHijacking","linkElement","hashPos","pageIsSubmitted","marginBottom","refreshOnFormChanges","serialize","scrollHeaderOnMobile","prevScrollPos","currentScrollPos","headerHeight","detectOnboardingTour","demoProjectsAvailable","currentTourPart","sessionStorage","tourCancelled","elementsByClassName","modalOverlay","listenToSettingChanges","wasDisabled","vendor","langSelectSwitchData","settingName","newLang","textArea","storedValue","delivery_method","isNone","wasChecked","makeColorPreviews","previewColor","keyup","dangerZoneValidation","dangerZoneVerification","expectedValue","expectedText","actualValue","fixFragmentAnchors","configureErrorReporter","enableProdMode","enableReactiveStatesLogging","disableReactiveStatesLogging","initializeLocale","meta","firstdayofweek","firstWeekOfYear","firstweekofyear","dow","doy","pluralization","__NgCli_bootstrap_1","define","padding","decimalAdjust","isFunction","isSet","isString","isNumber","isBoolean","exp","NaN","lazyEvaluate","dest","DATE","day_names","abbr_day_names","month_names","abbr_month_names","meridian","NUMBER_FORMAT","delimiter","strip_insignificant_zeros","CURRENCY_FORMAT","sign_first","PERCENTAGE_FORMAT","SIZE_UNITS","DEFAULT_OPTIONS","defaultLocale","defaultSeparator","fallbacks","translations","missingBehaviour","missingTranslationPrefix","initializeOptions","locales","localeParts","firstFallback","secondFallback","nullableFallbackLocale","currentLocale","scopes","fullScope","getFullScope","pluralizationLookupWithoutFallback","pluralizerKey","pluralizerKeys","pluralizer","pluralizationLookup","am","pm","prepareOptions","arguments","createTranslationOptions","translationOptions","translate","optionsWithoutDefault","translationOption","interpolate","pluralize","missingTranslation","regex","nullPlaceholder","missingPlaceholder","p1","p2","formattedNumber","negative","sign","localize","localizedValue","convertedDate","fraction","UTC","setTime","$1","$2","$3","$6","$4","$5","meridianOptions","getDay","getHours","hour12","secs","getSeconds","mins","getMinutes","getTimezoneOffset","absOffsetHours","absOffsetMinutes","timezoneoffset","kb","iterations","obj1","obj2","webpackAsyncContext","webpackEmptyContext","webpackContext"],"sourceRoot":"webpack:///","sources":["./src/app/core/active-window/active-window.service.ts","./src/app/core/apiv3/endpoints/grids/apiv3-grid-paths.ts","./src/app/core/apiv3/endpoints/grids/apiv3-grids-paths.ts","./src/app/core/apiv3/cache/cachable-apiv3-resource.ts","./src/app/core/apiv3/endpoints/time-entries/apiv3-time-entry-paths.ts","./src/app/core/apiv3/cache/cachable-apiv3-collection.ts","./src/app/core/apiv3/endpoints/time-entries/time-entry-cache.service.ts","./src/app/core/apiv3/endpoints/time-entries/apiv3-time-entries-paths.ts","./src/app/core/apiv3/endpoints/capabilities/apiv3-capability-paths.ts","./src/app/core/apiv3/endpoints/capabilities/apiv3-capabilities-paths.ts","./src/app/core/apiv3/endpoints/projects/apiv3-available-projects-paths.ts","./src/app/core/apiv3/endpoints/memberships/apiv3-memberships-form.ts","./src/app/core/apiv3/endpoints/memberships/apiv3-memberships-paths.ts","./src/app/core/apiv3/endpoints/users/apiv3-user-preferences-paths.ts","./src/app/core/apiv3/endpoints/users/apiv3-user-paths.ts","./src/app/core/apiv3/endpoints/users/apiv3-users-paths.ts","./src/app/core/apiv3/endpoints/types/apiv3-type-paths.ts","./src/app/core/apiv3/endpoints/types/apiv3-types-paths.ts","./src/app/core/apiv3/endpoints/queries/apiv3-query-order.ts","./src/app/core/apiv3/endpoints/queries/apiv3-query-form.ts","./src/app/core/apiv3/endpoints/queries/apiv3-query-paths.ts","./src/app/core/apiv3/endpoints/queries/apiv3-queries-paths.ts","./src/app/core/apiv3/endpoints/relations/apiv3-relations-paths.ts","./src/app/core/apiv3/endpoints/work_packages/apiv3-work-package-form.ts","./src/app/core/apiv3/endpoints/work_packages/api-v3-work-package-paths.ts","./src/app/core/apiv3/endpoints/work_packages/work-package.cache.ts","./src/app/core/apiv3/endpoints/work_packages/api-v3-work-package-cached-subresource.ts","./src/app/core/apiv3/endpoints/work_packages/api-v3-work-packages-paths.ts","./src/app/core/apiv3/endpoints/versions/apiv3-version-paths.ts","./src/app/core/apiv3/endpoints/versions/apiv3-versions-paths.ts","./src/app/core/apiv3/endpoints/projects/apiv3-project-copy-paths.ts","./src/app/core/apiv3/endpoints/projects/apiv3-project-paths.ts","./src/app/core/apiv3/endpoints/projects/project.cache.ts","./src/app/core/apiv3/endpoints/projects/apiv3-projects-paths.ts","./src/app/core/apiv3/endpoints/statuses/apiv3-status-paths.ts","./src/app/core/apiv3/endpoints/statuses/apiv3-statuses-paths.ts","./src/app/core/apiv3/endpoints/roles/apiv3-role-paths.ts","./src/app/core/apiv3/endpoints/roles/apiv3-roles-paths.ts","./src/app/core/apiv3/endpoints/news/apiv3-news-paths.ts","./src/app/core/apiv3/endpoints/help_texts/apiv3-help-texts-paths.ts","./src/app/core/apiv3/endpoints/configuration/apiv3-configuration-path.ts","./src/app/features/boards/board/board.ts","./src/app/core/apiv3/virtual/apiv3-board-path.ts","./src/app/core/apiv3/virtual/apiv3-boards-paths.ts","./src/app/core/apiv3/endpoints/placeholder-users/apiv3-placeholder-user-paths.ts","./src/app/core/apiv3/endpoints/placeholder-users/apiv3-placeholder-users-paths.ts","./src/app/core/apiv3/endpoints/groups/apiv3-group-paths.ts","./src/app/core/apiv3/endpoints/groups/apiv3-groups-paths.ts","./src/app/core/apiv3/endpoints/notifications/apiv3-notification-paths.ts","./src/app/core/apiv3/endpoints/notifications/apiv3-notifications-paths.ts","./src/app/core/apiv3/endpoints/views/apiv3-views-paths.ts","./src/app/core/apiv3/endpoints/backups/apiv3-backups-path.ts","./src/app/core/apiv3/endpoints/days/api-v3-day-paths.ts","./src/app/core/apiv3/endpoints/days/api-v3-days-paths.ts","./src/app/core/apiv3/endpoints/storages/apiv3-storages-paths.ts","./src/app/core/apiv3/api-v3.service.ts","./src/app/core/apiv3/cache/state-cache.service.ts","./src/app/core/apiv3/endpoints/grids/apiv3-grid-form.ts","./src/app/core/apiv3/forms/apiv3-form-resource.ts","./src/app/core/apiv3/helpers/add-filters-to-path.ts","./src/app/core/apiv3/helpers/get-paginated-results.ts","./src/app/core/apiv3/paths/apiv3-list-resource.interface.ts","./src/app/core/apiv3/paths/apiv3-resource.ts","./src/app/core/apiv3/paths/path-resources.ts","./src/app/core/browser/browser-detector.service.ts","./src/app/core/browser/device.service.ts","./src/app/core/config/configuration.service.ts","./src/app/core/current-project/current-project.service.ts","./src/app/core/current-user/current-user.module.ts","./src/app/core/current-user/current-user.query.ts","./src/app/core/current-user/current-user.service.ts","./src/app/core/current-user/current-user.store.ts","./src/app/core/datetime/timezone.service.ts","./src/app/core/days/weekday.service.ts","./src/app/core/enterprise/banners.service.ts","./src/app/core/file-upload/op-direct-file-upload.service.ts","./src/app/core/file-upload/op-file-upload.service.ts","./src/app/core/gon/gon.service.ts","./src/app/core/html/op-title.service.ts","./src/app/core/i18n/i18n.service.ts","./src/app/core/loading-indicator/loading-indicator.service.ts","./src/app/core/main-menu/main-menu-toggle.service.ts","./src/app/core/model-auth/model-auth.service.ts","./src/app/core/path-helper/apiv3-paths.ts","./src/app/core/path-helper/path-helper.service.ts","./src/app/core/routing/first-route-service.ts","./src/app/core/schemas/schema-cache.service.ts","./src/app/core/setup/globals/constants.const.ts","./src/app/core/setup/globals/dynamic-bootstrapper.ts","./src/app/core/setup/globals/onboarding/helpers.ts","./src/app/core/setup/globals/tree-menu.ts","./src/app/core/setup/globals/global-helpers.ts","./src/app/core/setup/globals/openproject.ts","./src/app/core/setup/init-vendors.ts","./src/app/core/state/actions/actions.service.ts","./src/app/core/state/attachments/attachments.store.ts","./src/app/core/state/attachments/attachments.service.ts","./src/app/core/state/capabilities/capabilities.store.ts","./src/app/core/state/capabilities/capabilities.service.ts","./src/app/core/state/collection-store.ts","./src/app/core/state/days/day.store.ts","./src/app/core/state/days/day.service.ts","./src/app/core/state/days/weekday.store.ts","./src/app/core/state/days/weekday.service.ts","./src/app/core/state/effects/effect-handler.decorator.ts","./src/app/core/state/file-links/file-links.store.ts","./src/app/core/state/file-links/file-links.service.ts","./src/app/core/state/in-app-notifications/in-app-notification.model.ts","./src/app/core/state/in-app-notifications/in-app-notifications.actions.ts","./src/app/core/state/in-app-notifications/in-app-notifications.store.ts","./src/app/core/state/in-app-notifications/in-app-notifications.service.ts","./src/app/core/state/is-defined-entity.ts","./src/app/core/state/is-not-null.ts","./src/app/core/state/principals/principals.store.ts","./src/app/core/state/principals/principals.service.ts","./src/app/core/state/projects/projects.store.ts","./src/app/core/state/projects/projects.service.ts","./src/app/core/state/resource-collection.service.ts","./src/app/core/state/storage-files/storage-files.store.ts","./src/app/core/state/storage-files/storage-files.service.ts","./src/app/core/state/storages/storages.store.ts","./src/app/core/state/storages/storages.service.ts","./src/app/core/state/views/views.store.ts","./src/app/core/state/views/views.service.ts","./src/app/core/states/states.service.ts","./src/app/features/backlogs/backlogs-page/backlogs-page.component.ts","./src/app/features/bim/bcf/api/bcf-path-resources.ts","./src/app/features/bim/bcf/api/bcf-api-request.service.ts","./src/app/features/bim/bcf/api/projects/bcf-project.resource.ts","./src/app/features/bim/bcf/api/topics/bcf-topic.resource.ts","./src/app/features/bim/bcf/api/viewpoints/bcf-viewpoint-selection.paths.ts","./src/app/features/bim/bcf/api/viewpoints/bcf-viewpoint-visibility.paths.ts","./src/app/features/bim/bcf/api/viewpoints/bcf-viewpoint.paths.ts","./src/app/features/bim/bcf/api/viewpoints/bcf-viewpoint-collection.paths.ts","./src/app/features/bim/bcf/api/topics/bcf-topic.paths.ts","./src/app/features/bim/bcf/api/topics/bcf-viewpoint-collection.paths.ts","./src/app/features/bim/bcf/api/extensions/bcf-extension.resource.ts","./src/app/features/bim/bcf/api/extensions/bcf-extension.paths.ts","./src/app/features/bim/bcf/api/projects/bcf-project.paths.ts","./src/app/features/bim/bcf/api/bcf-api.service.ts","./src/app/features/bim/bcf/bcf-viewer-bridge/viewer-bridge.service.ts","./src/app/features/bim/bcf/helper/bcf-path-helper.service.ts","./src/app/features/bim/bcf/helper/viewpoints.service.ts","./src/app/features/bim/bcf/fields/display/bcf-thumbnail-field.module.ts","./src/app/features/bim/bcf/helper/bcf-detector.service.ts","./src/app/features/bim/bcf/api/bcf-authorization.service.ts","./src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.html","./src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.ts","./src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-new-wp-attribute-group.component.ts","./src/app/features/bim/revit_add_in/revit-bridge.service.ts","./src/app/features/bim/bcf/openproject-bcf.module.ts","./src/app/features/bim/ifc_models/xeokit/xeokit-server.ts","./src/app/features/bim/ifc_models/ifc-viewer/ifc-viewer.service.ts","./src/app/features/bim/ifc_models/pages/viewer/bcf-view.service.ts","./src/app/features/boards/board/board-actions/board-actions-registry.service.ts","./src/app/features/boards/board/board-list/board-lists.service.ts","./src/app/features/boards/board/board.service.ts","./src/app/features/boards/board/caused-updates/caused-updates.service.ts","./src/app/features/boards/tile-view/tile-view.component.html","./src/app/features/boards/tile-view/tile-view.component.ts","./src/app/features/boards/new-board-modal/new-board-modal.html","./src/app/features/boards/new-board-modal/new-board-modal.component.ts","./src/app/features/calendar/calendar.actions.ts","./src/app/features/calendar/op-calendar.service.ts","./src/app/features/calendar/op-work-packages-calendar.service.ts","./src/app/features/work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component.html","./src/app/features/calendar/wp-calendar-page/wp-calendar-page.component.ts","./src/app/features/calendar/calendar.routes.ts","./src/app/features/calendar/openproject-calendar.module.ts","./src/app/features/calendar/wp-calendar/wp-calendar.template.html","./src/app/features/calendar/wp-calendar/wp-calendar.component.ts","./src/app/features/enterprise/enterprise-active-trial/ee-active-trial.base.ts","./src/app/shared/helpers/i18n/localized-link.ts","./src/app/features/enterprise/enterprise-modal/enterprise-trial-form/ee-trial-form.component.html","./src/app/features/enterprise/enterprise-modal/enterprise-trial-form/ee-trial-form.component.ts","./src/app/features/enterprise/enterprise-modal/enterprise-trial.modal.html","./src/app/features/enterprise/enterprise-modal/enterprise-trial.modal.ts","./src/app/features/enterprise/enterprise-active-trial/ee-active-trial.component.html","./src/app/features/enterprise/enterprise-active-trial/ee-active-trial.component.ts","./src/app/features/enterprise/enterprise-trial-waiting/ee-trial-waiting.component.html","./src/app/features/enterprise/enterprise-trial-waiting/ee-trial-waiting.component.ts","./src/app/features/enterprise/enterprise-trial.store.ts","./src/app/features/enterprise/enterprise-trial.service.ts","./src/app/features/enterprise/free-trial-button/free-trial-button.component.ts","./src/app/features/enterprise/free-trial-button/free-trial-button.component.html","./src/app/features/hal/hal-link/hal-link.ts","./src/app/features/hal/helpers/lazy-accessor.ts","./src/app/features/hal/helpers/hal-resource-builder.ts","./src/app/features/hal/helpers/id-from-link.ts","./src/app/features/hal/helpers/is-new-resource.ts","./src/app/features/hal/helpers/is-persisted-resource.ts","./src/app/features/hal/http/openproject-header-interceptor.ts","./src/app/features/hal/services/hal-aware-error-handler.ts","./src/app/features/hal/resources/wiki-page-resource.ts","./src/app/features/hal/resources/meeting-content-resource.ts","./src/app/features/hal/resources/post-resource.ts","./src/app/features/hal/resources/time-entry-resource.ts","./src/app/features/hal/resources/news-resource.ts","./src/app/features/hal/resources/membership-resource.ts","./src/app/features/hal/resources/group-resource.ts","./src/app/features/hal/resources/root-resource.ts","./src/app/features/hal/resources/type-resource.ts","./src/app/features/hal/resources/query-operator-resource.ts","./src/app/features/hal/resources/form-resource.ts","./src/app/features/hal/resources/help-text-resource.ts","./src/app/features/hal/resources/schema-resource.ts","./src/app/features/hal/resources/schema-dependency-resource.ts","./src/app/features/hal/resources/query-filter-instance-schema-resource.ts","./src/app/features/hal/resources/wp-collection-resource.ts","./src/app/features/hal/services/hal-resource.config.ts","./src/app/features/hal/openproject-hal.module.ts","./src/app/features/hal/resources/attachment-collection-resource.ts","./src/app/features/hal/resources/collection-resource.ts","./src/app/features/hal/resources/custom-action-resource.ts","./src/app/features/hal/resources/error-resource.ts","./src/app/features/hal/resources/grid-resource.ts","./src/app/features/hal/resources/grid-widget-resource.ts","./src/app/features/hal/resources/hal-resource.ts","./src/app/features/hal/resources/mixins/attachable-mixin.ts","./src/app/features/hal/resources/project-resource.ts","./src/app/features/hal/resources/query-filter-instance-resource.ts","./src/app/features/hal/resources/query-filter-resource.ts","./src/app/features/hal/resources/query-resource.ts","./src/app/features/hal/resources/query-sort-by-resource.ts","./src/app/features/hal/resources/relation-resource.ts","./src/app/features/hal/resources/role-resource.ts","./src/app/features/hal/resources/status-resource.ts","./src/app/features/hal/resources/user-resource.ts","./src/app/features/hal/resources/version-resource.ts","./src/app/features/hal/resources/work-package-resource.ts","./src/app/features/hal/schemas/hal-payload.helper.ts","./src/app/features/hal/schemas/schema-proxy.ts","./src/app/features/hal/schemas/work-package-schema-proxy.ts","./src/app/features/hal/services/hal-error.ts","./src/app/features/hal/services/hal-events.service.ts","./src/app/features/hal/services/hal-resource-notification.service.ts","./src/app/features/hal/services/hal-resource-sorting.service.ts","./src/app/features/hal/services/hal-resource.service.ts","./src/app/features/hal/services/url-params-encoder.ts","./src/app/features/in-app-notifications/bell/state/ian-bell.query.ts","./src/app/features/in-app-notifications/bell/state/ian-bell.store.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/actors-line/in-app-notification-actors-line.component.html","./src/app/features/in-app-notifications/entry/actors-line/in-app-notification-actors-line.component.ts","./src/app/features/in-app-notifications/entry/date-alert/in-app-notification-date-alert.component.ts","./src/app/features/in-app-notifications/entry/in-app-notification-entry.component.html","./src/app/features/in-app-notifications/entry/date-alert/in-app-notification-date-alert.component.html","./src/app/features/in-app-notifications/entry/in-app-notification-entry.component.ts","./src/app/features/in-app-notifications/center/in-app-notification-center.component.html","./src/app/features/in-app-notifications/center/in-app-notification-center.component.ts","./src/app/features/in-app-notifications/center/toolbar/settings/notification-settings-button.component.ts","./src/app/features/in-app-notifications/center/toolbar/facet/activate-facet-button.component.html","./src/app/features/in-app-notifications/center/toolbar/settings/notification-settings-button.component.html","./src/app/features/in-app-notifications/center/toolbar/facet/activate-facet-button.component.ts","./src/app/features/in-app-notifications/center/toolbar/mark-all-as-read/mark-all-as-read-button.component.ts","./src/app/features/in-app-notifications/center/toolbar/mark-all-as-read/mark-all-as-read-button.component.html","./src/app/features/in-app-notifications/center/in-app-notification-center-page.component.ts","./src/app/features/in-app-notifications/date-alerts-upsale/ian-date-alerts-upsale.component.ts","./src/app/shared/helpers/videos/path-helper.ts","./src/app/features/in-app-notifications/date-alerts-upsale/ian-date-alerts-upsale.component.html","./src/app/features/in-app-notifications/in-app-notifications.routes.ts","./src/app/features/in-app-notifications/in-app-notifications.module.ts","./src/app/features/invite-user-modal/button/invite-user-button.module.ts","./src/app/features/invite-user-modal/invite-user-modal.service.ts","./src/app/features/invite-user-modal/invite-user.component.ts","./src/app/features/invite-user-modal/invite-user.component.html","./src/app/features/job-status/job-status-modal/job-status.modal.html","./src/app/features/job-status/job-status-modal/job-status.modal.ts","./src/app/features/plugins/hook-service.ts","./src/app/features/projects/components/projects/projects.component.ts","./src/app/features/projects/components/projects/projects.component.html","./src/app/features/projects/components/new-project/new-project.component.ts","./src/app/features/projects/components/new-project/new-project.component.html","./src/app/features/projects/components/copy-project/copy-project.component.ts","./src/app/features/projects/components/copy-project/copy-project.component.html","./src/app/features/projects/projects-routes.ts","./src/app/features/projects/openproject-projects.module.ts","./src/app/features/team-planner/team-planner/planner/background-events.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/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-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-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-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/quick-filter-by-text-input/quick-filter-by-text-input.component.ts","./src/app/features/work-packages/components/filters/query-filters/query-filters.component.html","./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/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.component.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-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-hierarchy/wp-relations-hierarchy.directive.ts","./src/app/features/work-packages/components/wp-relations/wp-relations.template.html","./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-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/shared/components/dynamic-bootstrap/component/dynamic-bootstrap/dynamic-bootstrap.component.ts","./src/app/shared/components/dynamic-bootstrap/component/dynamic-bootstrap/dynamic-bootstrap.component.html","./src/app/features/work-packages/components/wp-activity/activity-link.component.ts","./src/app/features/work-packages/components/wp-activity/user/user-activity.component.html","./src/app/features/work-packages/components/wp-activity/user/user-activity.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/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/features/work-packages/components/wp-single-view-tabs/files-tab/op-files-tab.component.html","./src/app/features/work-packages/components/wp-single-view-tabs/files-tab/op-files-tab.component.ts","./src/app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-watchers-count.function.ts","./src/app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-relations-count.function.ts","./src/app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-notifications-count.function.ts","./src/app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-files-count.function.ts","./src/app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-tabs.service.ts","./src/app/features/work-packages/components/wp-type-status/wp-type-status.html","./src/app/features/work-packages/components/wp-type-status/wp-type-status.component.ts","./src/app/features/work-packages/components/wp-watcher-button/wp-watcher-button.html","./src/app/features/work-packages/components/wp-watcher-button/wp-watcher-button.component.ts","./src/app/features/work-packages/directives/query-space/isolated-query-space.ts","./src/app/features/work-packages/directives/query-space/wp-isolated-query-space.directive.ts","./src/app/features/work-packages/components/wp-table/timeline/cells/wp-timeline-cell-labels.ts","./src/app/features/work-packages/components/wp-table/timeline/cells/timeline-cell-renderer.ts","./src/app/features/work-packages/components/wp-table/timeline/cells/timeline-milestone-cell-renderer.ts","./src/app/features/work-packages/components/wp-table/timeline/cells/wp-timeline-cell-mouse-handler.ts","./src/app/features/work-packages/components/wp-table/timeline/cells/wp-timeline-cell.ts","./src/app/features/work-packages/components/wp-table/timeline/cells/wp-timeline-cells-renderer.ts","./src/app/features/work-packages/components/wp-table/timeline/container/wp-timeline-container.directive.ts","./src/app/features/work-packages/components/wp-table/timeline/container/wp-timeline-container.html","./src/app/shared/components/op-context-menu/handlers/op-columns-context-menu.directive.ts","./src/app/features/work-packages/components/wp-table/timeline/header/wp-timeline-header.directive.ts","./src/app/features/work-packages/components/wp-table/timeline/header/wp-timeline-header.html","./src/app/features/work-packages/components/wp-table/timeline/global-elements/timeline-relation-element.ts","./src/app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-relations.directive.ts","./src/app/features/work-packages/components/wp-table/timeline/global-elements/timeline-static-element.ts","./src/app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline.today-line.ts","./src/app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-static-elements.directive.ts","./src/app/features/work-packages/components/wp-table/timeline/grid/wp-timeline-grid.directive.ts","./src/app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watcher-entry.component.ts","./src/app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watcher-entry.component.html","./src/app/features/work-packages/components/wp-table/wp-table-sums-row/wp-table-sums-row.directive.ts","./src/app/features/work-packages/components/wp-relations/embedded/relations/wp-relation-query.component.ts","./src/app/features/work-packages/components/wp-table/config-menu/config-menu.component.ts","./src/app/features/work-packages/components/wp-table/config-menu/config-menu.template.html","./src/app/features/work-packages/components/wp-tabs/wp-tabs.module.ts","./src/app/features/work-packages/components/wp-form-group/wp-attribute-group.template.html","./src/app/features/work-packages/components/wp-form-group/wp-attribute-group.component.ts","./src/app/features/work-packages/helpers/time-entries/time-entry-changeset.ts","./src/app/shared/components/storages/openproject-storages.module.ts","./src/app/features/work-packages/components/wp-table/sort-header/sort-header.directive.html","./src/app/features/work-packages/components/wp-table/sort-header/sort-header.directive.ts","./src/app/features/work-packages/openproject-work-packages.module.ts","./src/app/features/work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component.ts","./src/app/features/work-packages/routing/split-view-routes.helper.ts","./src/app/features/work-packages/components/wp-new/wp-new-split-view.html","./src/app/features/work-packages/components/wp-new/wp-new-split-view.component.ts","./src/app/features/work-packages/components/wp-copy/wp-copy-split-view.component.ts","./src/app/features/work-packages/routing/split-view-routes.template.ts","./src/app/features/work-packages/routing/wp-edit-form/wp-edit-form-routing.service.ts","./src/app/features/work-packages/routing/wp-base/wp--base.component.ts","./src/app/features/work-packages/routing/wp-list-view/wp-list-view.component.html","./src/app/features/work-packages/routing/wp-list-view/wp-list-view.component.ts","./src/app/features/work-packages/components/wp-details/wp-details-toolbar.html","./src/app/features/work-packages/components/wp-details/wp-details-toolbar.component.ts","./src/app/features/work-packages/routing/wp-split-view/wp-split-view.html","./src/app/features/work-packages/routing/wp-split-view/wp-split-view.component.ts","./src/app/features/work-packages/routing/wp-view-base/event-handling/event-handler-registry.ts","./src/app/features/work-packages/routing/wp-view-base/state/wp-single-view.store.ts","./src/app/features/work-packages/routing/wp-view-base/state/wp-single-view.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-additional-elements.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-base.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-collapsed-groups.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy-indentation.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-table-hierarchies.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-highlighting.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-include-subprojects.service.ts","./src/app/shared/helpers/drag-and-drop/reorder-delta-builder.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-table-pagination.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-pagination.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-relation-columns.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-sum.service.ts","./src/app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service.ts","./src/app/features/work-packages/routing/wp-view-base/work-package-single-view.base.ts","./src/app/features/work-packages/routing/wp-view-base/work-packages-view.base.ts","./src/app/features/work-packages/services/notifications/work-package-notification.service.ts","./src/app/features/work-packages/services/work-package.service.ts","./src/app/shared/components/attachments/attachment-list/attachment-list-item.component.html","./src/app/shared/components/attachments/attachment-list/attachment-list-item.component.ts","./src/app/shared/components/attachments/attachment-list/attachment-list.component.html","./src/app/shared/components/attachments/attachment-list/attachment-list.component.ts","./src/app/shared/components/attachments/attachments.component.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/basic-range-date-picker/basic-range-date-picker.component.html","./src/app/shared/components/datepicker/basic-range-date-picker/basic-range-date-picker.component.ts","./src/app/shared/components/datepicker/basic-single-date-picker/basic-single-date-picker.component.html","./src/app/shared/components/datepicker/basic-single-date-picker/basic-single-date-picker.component.ts","./src/app/shared/components/datepicker/datepicker.ts","./src/app/shared/components/datepicker/helpers/date-modal.helpers.ts","./src/app/core/forms/forms.service.ts","./src/app/shared/components/dynamic-forms/services/dynamic-fields/dynamic-fields.service.ts","./src/app/shared/helpers/url-helpers.ts","./src/app/shared/components/dynamic-forms/services/dynamic-form/dynamic-form.service.ts","./src/app/shared/components/dynamic-forms/components/dynamic-form/dynamic-form.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-form/dynamic-form.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/text-input/text-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/text-input/text-input.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/integer-input/integer-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/select-input/select-input.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/integer-input/integer-input.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/select-input/select-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/project-input/project-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/project-input/project-input.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/select-project-status-input/select-project-status-input.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/select-project-status-input/select-project-status-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/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/date-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/date-input/date-input.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-field-group-wrapper/dynamic-field-group-wrapper.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-field-group-wrapper/dynamic-field-group-wrapper.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/formattable-textarea-input/components/formattable-control/formattable-control.module.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/user-input/user-input.component.ts","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/user-input/user-input.component.html","./src/app/shared/components/dynamic-forms/dynamic-forms.module.ts","./src/app/shared/components/editable-toolbar-title/editable-toolbar-title.html","./src/app/shared/components/editable-toolbar-title/editable-toolbar-title.component.ts","./src/app/shared/components/editor/components/ckeditor/ckeditor-preview.service.ts","./src/app/shared/components/editor/components/ckeditor/ckeditor-setup.service.ts","./src/app/shared/components/editor/components/ckeditor/op-ckeditor.html","./src/app/shared/components/editor/components/ckeditor/op-ckeditor.component.ts","./src/app/shared/components/editor/openproject-editor.module.ts","./src/app/shared/components/enterprise-banner/enterprise-banner.component.html","./src/app/shared/components/enterprise-banner/enterprise-banner.component.ts","./src/app/shared/components/enterprise-page/enterprise-page.component.html","./src/app/shared/components/enterprise-page/enterprise-page.component.ts","./src/app/shared/components/fields/changeset/changeset.ts","./src/app/shared/components/fields/changeset/resource-changeset.ts","./src/app/shared/components/fields/display/display-field-renderer.ts","./src/app/shared/components/fields/display/display-field.module.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/multiple-lines-user-display-field.module.ts","./src/app/shared/components/fields/display/field-types/progress-text-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/date-picker-edit-field.component.ts","./src/app/shared/components/datepicker/services/date-modal-relations.service.ts","./src/app/shared/components/datepicker/services/date-modal-scheduling.service.ts","./src/app/shared/components/modal/modal-banner/modal-banner.component.html","./src/app/shared/components/modal/modal-banner/modal-banner.component.ts","./src/app/shared/components/datepicker/banner/datepicker-banner.component.html","./src/app/shared/components/datepicker/banner/datepicker-banner.component.ts","./src/app/shared/components/datepicker/toggle/datepicker-working-days-toggle.component.ts","./src/app/shared/components/datepicker/toggle/datepicker-working-days-toggle.component.html","./src/app/shared/components/datepicker/scheduling-mode/datepicker-scheduling-toggle.component.ts","./src/app/shared/components/datepicker/scheduling-mode/datepicker-scheduling-toggle.component.html","./src/app/shared/components/datepicker/wp-single-date-form/wp-single-date-form.component.ts","./src/app/shared/components/datepicker/wp-single-date-form/wp-single-date-form.component.html","./src/app/shared/components/datepicker/wp-multi-date-form/wp-multi-date-form.component.ts","./src/app/shared/components/fields/edit/field-types/combined-date-edit-field.component.html","./src/app/shared/components/datepicker/wp-multi-date-form/wp-multi-date-form.component.html","./src/app/shared/components/fields/edit/field-types/combined-date-edit-field.component.ts","./src/app/features/work-packages/components/work-package-comment/wp-comment-field.component.ts","./src/app/shared/components/fields/edit/field-types/project-edit-field.component.html","./src/app/shared/components/fields/edit/field-types/project-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/hours-duration-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/user-edit-field.component.html","./src/app/shared/components/fields/edit/field-types/user-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/days-duration-edit-field.component.ts","./src/app/shared/components/fields/edit/field-types/days-duration-edit-field.component.html","./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/core/expression/expression.service.ts","./src/app/shared/components/fields/display/field-types/formattable-display-field.module.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/grids/widgets/widget-changeset.ts","./src/app/shared/components/grids/widgets/abstract-widget.component.ts","./src/app/shared/components/icon/icon.component.ts","./src/app/shared/components/icon/icon.module.ts","./src/app/shared/components/modal/modal-wrapper-augment.service.ts","./src/app/shared/components/modal/modal.component.ts","./src/app/shared/components/modal/modal.module.ts","./src/app/shared/components/modal/modal.service.ts","./src/app/shared/components/modals/confirm-dialog/confirm-dialog.modal.html","./src/app/shared/components/modals/confirm-dialog/confirm-dialog.modal.ts","./src/app/shared/components/modals/confirm-dialog/confirm-dialog.service.ts","./src/app/shared/components/modals/editor/macro-wp-button-modal/wp-button-macro.modal.html","./src/app/shared/components/modals/editor/macro-wp-button-modal/wp-button-macro.modal.ts","./src/app/shared/components/modals/editor/macro-wiki-include-page-modal/wiki-include-page-macro.modal.ts","./src/app/shared/components/modals/editor/macro-wiki-include-page-modal/wiki-include-page-macro.modal.html","./src/app/shared/components/modals/editor/macro-code-block-modal/code-block-macro.modal.ts","./src/app/shared/components/modals/editor/macro-code-block-modal/code-block-macro.modal.html","./src/app/shared/components/modals/editor/macro-child-pages-modal/child-pages-macro.modal.ts","./src/app/shared/components/modals/editor/macro-child-pages-modal/child-pages-macro.modal.html","./src/app/shared/components/modals/editor/editor-macros.service.ts","./src/app/shared/components/modals/export-modal/wp-table-export.modal.html","./src/app/shared/components/modals/export-modal/wp-table-export.modal.ts","./src/app/shared/components/modals/modal-wrapper/dynamic-content.modal.ts","./src/app/shared/components/modals/modal-wrapper/dynamic-content.modal.html","./src/app/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-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/calculate-positions.ts","./src/app/spot/components/toggle/toggle.component.html","./src/app/spot/components/toggle/toggle.component.ts","./src/app/shared/components/project-include/list/project-include-list.component.html","./src/app/shared/components/project-include/list/project-include-list.component.ts","./src/app/shared/components/project-include/project-include.component.html","./src/app/shared/components/project-include/project-include.component.ts","./src/app/shared/components/project-include/recursive-sort.ts","./src/app/shared/components/resizer/resizer.component.html","./src/app/shared/components/resizer/resizer.component.ts","./src/app/shared/components/resizer/resizer/wp-resizer.component.ts","./src/app/shared/components/searchable-project-list/loading-project-list.component.ts","./src/app/shared/components/searchable-project-list/loading-project-list.component.html","./src/app/shared/components/searchable-project-list/searchable-project-list.service.ts","./src/app/shared/components/storages/icons.mapping.ts","./src/app/shared/components/storages/functions/storages.functions.ts","./src/app/shared/components/storages/pipes/sort-files.pipe.ts","./src/app/shared/components/storages/storage-information/storage-action-button.ts","./src/app/shared/components/storages/storage-information/storage-information-box.ts","./src/app/shared/components/storages/storage-file-list-item/storage-file-list-item.ts","./src/app/spot/components/breadcrumbs/breadcrumbs-content.ts","./src/app/shared/components/storages/file-picker-base-modal.component.ts/file-picker-base-modal.component.ts","./src/app/spot/components/breadcrumbs/breadcrumbs.component.html","./src/app/spot/components/breadcrumbs/breadcrumbs.component.ts","./src/app/shared/components/storages/loading-file-list/loading-file-list.component.ts","./src/app/shared/components/storages/loading-file-list/loading-file-list.html","./src/app/shared/components/storages/storage-file-list-item/storage-file-list-item.html","./src/app/shared/components/storages/storage-file-list-item/storage-file-list-item.component.ts","./src/app/shared/components/storages/file-picker-modal/file-picker-modal.component.html","./src/app/shared/components/storages/file-picker-modal/file-picker-modal.component.ts","./src/app/shared/components/storages/location-picker-modal/location-picker-modal.component.html","./src/app/shared/components/storages/location-picker-modal/location-picker-modal.component.ts","./src/app/core/upload/upload.service.ts","./src/app/shared/components/storages/upload-conflict-modal/upload-conflict-modal.component.ts","./src/app/shared/components/storages/upload-conflict-modal/upload-conflict-modal.component.html","./src/app/shared/components/storages/upload/nextcloud-upload.service.ts","./src/app/shared/components/storages/file-link-list-item/file-link-list-item.html","./src/app/shared/components/storages/file-link-list-item/file-link-list-item.component.ts","./src/app/shared/components/storages/storage-information/storage-information.html","./src/app/shared/components/storages/storage-information/storage-information.component.ts","./src/app/shared/components/storages/storage/storage.component.html","./src/app/shared/components/storages/storage/storage.component.ts","./src/app/core/state/compare-id.ts","./src/app/shared/components/storages/storages-constants.const.ts","./src/app/shared/components/table-pagination/pagination-instance.ts","./src/app/shared/components/table-pagination/pagination-service.ts","./src/app/shared/components/tabs/openproject-tabs.module.ts","./src/app/shared/components/tabs/scrollable-tabs/scrollable-tabs.component.html","./src/app/shared/components/tabs/scrollable-tabs/scrollable-tabs.component.ts","./src/app/shared/components/tabs/tab-badges/tab-count.component.html","./src/app/shared/components/tabs/tab-badges/tab-count.component.ts","./src/app/shared/components/time_entries/shared/modal/base.modal.html","./src/app/shared/components/time_entries/create/create.modal.ts","./src/app/shared/components/time_entries/create/create.service.ts","./src/app/shared/components/time_entries/form/form.component.html","./src/app/shared/components/time_entries/form/form.component.ts","./src/app/shared/components/time_entries/openproject-time-entries.module.ts","./src/app/shared/components/time_entries/shared/modal/base.modal.ts","./src/app/shared/components/toaster/toast.service.ts","./src/app/shared/components/user-link/user-link.component.ts","./src/app/shared/directives/focus/autofocus.directive.ts","./src/app/shared/directives/focus/contain-helpers.ts","./src/app/shared/directives/focus/focus-helper.ts","./src/app/shared/directives/focus/focus-within.directive.ts","./src/app/shared/directives/focus/focus.module.ts","./src/app/shared/directives/highlight-col/highlight-col.directive.ts","./src/app/shared/directives/search-highlight.directive.ts","./src/app/shared/helpers/angular/inject-field.decorator.ts","./src/app/shared/helpers/angular/tracking-functions.ts","./src/app/shared/helpers/angular/until-destroyed.mixin.ts","./src/app/shared/helpers/api-v3/api-v3-filter-builder.ts","./src/app/shared/helpers/debug_output.ts","./src/app/shared/helpers/dom/set-window-cursor.helper.ts","./src/app/shared/helpers/drag-and-drop/dom-autoscroll.service.ts","./src/app/shared/helpers/drag-and-drop/drag-and-drop.helpers.ts","./src/app/shared/helpers/drag-and-drop/drag-and-drop.service.ts","./src/app/shared/helpers/focus-helpers.ts","./src/app/shared/helpers/images/path-helper.ts","./src/app/shared/helpers/keyCodes.enum.ts","./src/app/shared/helpers/link-handling/link-handling.ts","./src/app/shared/helpers/op-icon-builder.ts","./src/app/shared/helpers/random-string.ts","./src/app/shared/helpers/rxjs/debounced-event-emitter.ts","./src/app/shared/helpers/set-click-position/set-click-position.ts","./src/app/shared/components/dynamic-bootstrap/dynamic-bootstrap.module.ts","./src/app/shared/shared.module.ts","./src/app/spot/components/checkbox/checkbox.component.ts","./src/app/spot/components/checkbox/checkbox.component.html","./src/app/spot/components/drop-modal/drop-modal-teleportation.service.ts","./src/app/spot/components/drop-modal/drop-modal.component.html","./src/app/spot/components/drop-modal/drop-modal.component.ts","./src/app/spot/components/form-field/form-field.component.html","./src/app/spot/components/form-field/form-field.component.ts","./src/app/spot/components/selector-field/selector-field.component.html","./src/app/spot/components/selector-field/selector-field.component.ts","./src/app/spot/components/switch/switch.component.ts","./src/app/spot/components/switch/switch.component.html","./src/app/spot/components/text-field/text-field.component.html","./src/app/spot/components/text-field/text-field.component.ts","./src/app/spot/components/tooltip/tooltip.component.html","./src/app/spot/components/tooltip/tooltip.component.ts","./src/app/spot/drop-alignment-options.ts","./src/app/spot/spot.module.ts","./src/environments/environment.prod.ts","./src/app/shared/components/grids/areas/grid-area.ts","./src/app/shared/components/grids/areas/grid-widget-area.ts","./src/app/shared/components/grids/areas/grid-gap.ts","./src/app/shared/components/grids/grid/area.service.ts","./src/app/shared/components/grids/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/header/header.component.ts","./src/app/shared/components/grids/widgets/header/header.component.html","./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/time_entries/edit/edit.modal.ts","./src/app/shared/components/time_entries/edit/edit.service.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/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/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/embedded/wp-embedded-graph.html","./src/app/shared/components/work-package-graphs/embedded/wp-embedded-graph.component.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/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-menu.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/spot/components/form-field/form-binding.directive.ts","./src/app/features/invite-user-modal/principal/principal-search.component.html","./src/app/features/invite-user-modal/principal/principal-search.component.ts","./src/app/features/invite-user-modal/role/role-search.component.html","./src/app/features/invite-user-modal/role/role-search.component.ts","./src/app/features/invite-user-modal/principal/principal.component.html","./src/app/features/invite-user-modal/principal/principal.component.ts","./src/app/features/invite-user-modal/summary/summary.component.html","./src/app/features/invite-user-modal/summary/summary.component.ts","./src/app/features/invite-user-modal/success/success.component.ts","./src/app/features/invite-user-modal/success/success.component.html","./src/app/features/invite-user-modal/invite-user-modal.module.ts","./src/app/features/bim/revit_add_in/revit-add-in-settings-button.service.ts","./src/app/features/enterprise/openproject-enterprise.module.ts","./src/app/core/main-menu/main-menu-navigation.service.ts","./src/app/features/admin/types/type-banner.service.ts","./src/app/features/admin/types/group-edit-in-place.html","./src/app/features/admin/types/group-edit-in-place.component.ts","./src/app/features/admin/types/attribute-group.component.html","./src/app/features/admin/types/attribute-group.component.ts","./src/app/core/top-menu/top-menu.service.ts","./src/app/core/setup/globals/global-listeners/action-menu.ts","./src/app/features/admin/types/type-form-configuration.html","./src/app/features/admin/types/type-form-configuration.component.ts","./src/app/features/admin/types/query-group.component.ts","./src/app/features/admin/types/query-group.component.html","./src/app/features/admin/openproject-admin.module.ts","./src/app/features/work-packages/components/wp-table/embedded/wp-embedded-table-entry.component.ts","./src/app/features/work-packages/components/wp-table/embedded/embedded-tables-macro.component.ts","./src/app/core/global_search/global-search-work-packages.component.ts","./src/app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.html","./src/app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.component.ts","./src/app/shared/components/sidemenu/sidemenu.component.html","./src/app/shared/components/sidemenu/sidemenu.component.ts","./src/app/features/boards/boards-sidebar/boards-menu.component.html","./src/app/features/boards/boards-sidebar/boards-menu.component.ts","./src/app/core/global_search/global-search-work-packages-entry.component.ts","./src/app/shared/components/toaster/upload-progress.component.ts","./src/app/shared/components/toaster/toast.component.html","./src/app/shared/components/toaster/toast.component.ts","./src/app/shared/components/toaster/toasts-container.component.ts","./src/app/shared/components/editor/components/ckeditor-augmented-textarea/ckeditor-augmented-textarea.html","./src/app/shared/components/editor/components/ckeditor-augmented-textarea/ckeditor-augmented-textarea.component.ts","./src/app/shared/components/persistent-toggle/persistent-toggle.component.ts","./src/app/shared/components/hide-section/hide-section.service.ts","./src/app/shared/components/hide-section/hide-section-link/hide-section-link.component.ts","./src/app/shared/components/hide-section/hide-section-link/hide-section-link.component.html","./src/app/shared/components/hide-section/show-section-dropdown.component.ts","./src/app/shared/components/hide-section/add-section-dropdown/add-section-dropdown.component.html","./src/app/shared/components/hide-section/add-section-dropdown/add-section-dropdown.component.ts","./src/app/shared/components/tabs/content-tabs/content-tabs.component.ts","./src/app/shared/components/copy-to-clipboard/copy-to-clipboard.directive.ts","./src/app/core/global_search/input/global-search-input.component.html","./src/app/core/global_search/input/global-search-input.component.ts","./src/app/shared/components/collapsible-section/collapsible-section.component.ts","./src/app/shared/components/collapsible-section/collapsible-section.html","./src/app/shared/components/header-project-select/list/header-project-select-list.component.html","./src/app/shared/components/header-project-select/list/header-project-select-list.component.ts","./src/app/shared/components/header-project-select/header-project-select.component.html","./src/app/shared/components/header-project-select/header-project-select.component.ts","./src/app/shared/components/remote-field-updater/remote-field-updater.component.ts","./src/app/shared/components/op-view-select/op-view-select.component.ts","./src/app/shared/components/op-view-select/op-view-select.template.html","./src/app/core/global_search/title/global-search-title.component.ts","./src/app/core/global_search/title/global-search-title.component.html","./src/app/core/global_search/tabs/global-search-tabs.component.ts","./src/app/shared/components/autocompleter/members-autocompleter/members-autocompleter.component.ts","./src/app/shared/components/time_entries/edit/trigger-actions-entry.component.ts","./src/app/shared/components/fields/macros/attribute-model-loader.service.ts","./src/app/shared/components/fields/display/display-field.component.ts","./src/app/shared/components/fields/macros/attribute-value-macro.html","./src/app/shared/components/fields/macros/attribute-value-macro.component.ts","./src/app/shared/components/fields/macros/attribute-label-macro.html","./src/app/shared/components/fields/macros/attribute-label-macro.component.ts","./src/app/shared/helpers/string-helpers.ts","./src/app/shared/components/fields/macros/work-package-quickinfo-macro.html","./src/app/shared/components/fields/macros/work-package-quickinfo-macro.component.ts","./src/app/core/backup/op-backup.service.ts","./src/app/core/setup/globals/components/admin/backup.component.ts","./src/app/core/setup/globals/components/admin/backup.component.html","./src/app/features/enterprise/enterprise-base.component.html","./src/app/features/enterprise/enterprise-base.component.ts","./src/app/shared/components/datepicker/modal-single-date-picker/modal-single-date-picker.component.html","./src/app/shared/components/datepicker/modal-single-date-picker/modal-single-date-picker.component.ts","./src/app/shared/components/op-non-working-days-list/op-non-working-days-list.component.html","./src/app/shared/components/op-non-working-days-list/op-non-working-days-list.component.ts","./src/app/features/enterprise/enterprise-active-trial/ee-active-saved-trial.component.ts","./src/app/features/homescreen/blocks/new-features.component.ts","./src/app/features/bim/bcf/bcf-constants.const.ts","./src/app/core/main-menu/main-menu-toggle.component.html","./src/app/core/main-menu/main-menu-toggle.component.ts","./src/app/shared/components/resizer/resizer/main-menu-resizer.component.ts","./src/app/features/admin/editable-query-props/editable-query-props.component.ts","./src/app/features/admin/editable-query-props/editable-query-props.component.html","./src/app/features/in-app-notifications/bell/in-app-notification-bell.component.html","./src/app/features/in-app-notifications/bell/in-app-notification-bell.component.ts","./src/app/features/in-app-notifications/center/menu/state/ian-menu.store.ts","./src/app/features/in-app-notifications/center/menu/state/ian-menu.service.ts","./src/app/features/in-app-notifications/center/menu/menu.component.ts","./src/app/features/team-planner/team-planner/sidemenu/team-planner-sidemenu.component.html","./src/app/features/in-app-notifications/center/menu/menu.component.html","./src/app/features/team-planner/team-planner/sidemenu/team-planner-sidemenu.component.ts","./src/app/features/calendar/sidemenu/calendar-sidemenu.component.html","./src/app/features/calendar/sidemenu/calendar-sidemenu.component.ts","./src/app/shared/components/modal/modal-overlay.component.ts","./src/app/spot/components/drop-modal/drop-modal-portal.component.ts","./src/app/shared/components/modal/modal-overlay.component.html","./src/app/core/setup/global-dynamic-components.const.ts","./src/app/core/html-sanitize/html-sanitize.service.ts","./src/app/shared/components/modals/request-for-confirmation/password-confirmation.modal.ts","./src/app/shared/components/modals/request-for-confirmation/password-confirmation.modal.html","./src/app/features/plugins/plugin-context.ts","./src/app/features/plugins/openproject-plugins.module.ts","./src/app/features/plugins/linked/budgets/augment/planned-costs-form.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/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/openproject-state.module.ts","./src/app/app.module.ts","./src/app/core/errors/error-reporter-base.ts","./src/app/core/errors/appsignal/appsignal-reporter.ts","./src/app/core/errors/local/local-reporter.ts","./src/app/core/setup/globals/global-listeners/request-for-confirmation.ts","./src/app/core/setup/globals/global-listeners/toggable-fieldset.ts","./src/app/core/setup/globals/global-listeners/setup-server-response.ts","./src/app/core/setup/globals/onboarding/onboarding_tour_trigger.ts","./src/app/core/setup/globals/global-listeners.ts","./src/app/core/setup/globals/global-listeners/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-listeners/fix-fragment-anchors.ts","./src/main.ts","./src/app/core/errors/configure-reporter.ts","./src/app/core/setup/init-locale.ts","./src/vendor/i18n.js","./node_modules/codemirror/mode/ lazy ^\\.\\/.*\\/.*\\.js$ namespace object","./node_modules/dragula/dist/ sync","./src/vendor/i18n.js-exposed","./node_modules/moment/locale/ sync ^\\.\\/.*$","./src/app/core/augmenting/dynamic-scripts/ lazy ^\\.\\/.*$ namespace object","./src/locales/ lazy ^\\.\\/.*\\.js$ namespace object","./src/vendor/ckeditor/translations/ lazy ^\\.\\/.*\\.js$ namespace object"],"sourcesContent":["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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ICapability } from 'core-app/core/state/capabilities/capability.model';\nimport { ApiV3GettableResource } from 'core-app/core/apiv3/paths/apiv3-resource';\n\nexport class ApiV3CapabilityPaths extends ApiV3GettableResource {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3CapabilityPaths } from 'core-app/core/apiv3/endpoints/capabilities/apiv3-capability-paths';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ICapability } from 'core-app/core/state/capabilities/capability.model';\nimport { ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\n\nexport class ApiV3CapabilitiesPaths\n extends ApiV3ResourceCollection {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'capabilities', ApiV3CapabilityPaths);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ApiV3GettableResource, ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { from, Observable } from 'rxjs';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { map } from 'rxjs/operators';\nimport { ApiV3Filter } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\n\nexport class ApiV3RelationsPaths extends ApiV3ResourceCollection> {\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'relations');\n }\n\n /**\n * Get all versions\n */\n public get():Observable> {\n return this\n .halResourceService\n .get>(this.path);\n }\n\n public loadInvolved(workPackageIds:string[]):Observable {\n const validIds = _.filter(workPackageIds, (id) => /\\d+/.test(id));\n\n if (validIds.length === 0) {\n return from([]);\n }\n\n return this\n .filtered(\n ApiV3Filter('involved', '=', validIds),\n )\n .getPaginatedResults();\n }\n}\n","import { ApiV3FormResource } from 'core-app/core/apiv3/forms/apiv3-form-resource';\nimport { FormResource } from 'core-app/features/hal/resources/form-resource';\nimport { Observable } from 'rxjs';\nimport { HalSource } from 'core-app/features/hal/resources/hal-resource';\n\nexport class ApiV3WorkPackageForm extends ApiV3FormResource {\n /**\n * Returns a promise to post `/api/v3/work_packages/form` with only the type part of the\n * provided payload being sent to the backend.\n *\n * @param payload: The payload to be sent to the backend\n * @returns A work package form resource prefilled with the provided payload.\n */\n public forTypePayload(payload:HalSource):Observable {\n const typePayload = payload._links.type ? { _links: { type: payload._links.type } } : { _links: {} };\n\n return this.post(payload);\n }\n\n /**\n * Returns a promise to post `/api/v3/work_packages/form` where the\n * payload sent to the backend has been provided.\n *\n * @param payload: The payload to be sent to the backend\n * @returns A work package form resource prefilled with the provided payload.\n */\n public forPayload(payload:Partial):Observable {\n return this.post(payload);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ApiV3RelationsPaths } from 'core-app/core/apiv3/endpoints/relations/apiv3-relations-paths';\nimport { ApiV3Resource } from 'core-app/core/apiv3/cache/cachable-apiv3-resource';\nimport { ApiV3WorkPackagesPaths } from 'core-app/core/apiv3/endpoints/work_packages/api-v3-work-packages-paths';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { ApiV3WorkPackageForm } from 'core-app/core/apiv3/endpoints/work_packages/apiv3-work-package-form';\n\nexport class ApiV3WorkPackagePaths extends ApiV3Resource {\n // /api/v3/(?:projectPath)/work_packages/(:workPackageId)/relations\n public readonly relations = this.subResource('relations', ApiV3RelationsPaths);\n\n // /api/v3/(?:projectPath)/work_packages/(:workPackageId)/revisions\n public readonly revisions = this.subResource('revisions');\n\n // /api/v3/(?:projectPath)/work_packages/(:workPackageId)/activities\n public readonly activities = this.subResource('activities');\n\n // /api/v3/(?:projectPath)/work_packages/(:workPackageId)/available_watchers\n public readonly available_watchers = this.subResource('available_watchers');\n\n // /api/v3/(?:projectPath)/work_packages/(:workPackageId)/available_projects\n public readonly available_projects = this.subResource('available_projects');\n\n // /api/v3/(?:projectPath)/work_packages/(:workPackageId)/github_pull_requests\n public readonly github_pull_requests = this.subResource('github_pull_requests');\n\n // /api/v3/(projects/:projectIdentifier)/work_packages/(:workPackageId)/form\n public readonly form:ApiV3WorkPackageForm = this.subResource('form', ApiV3WorkPackageForm);\n\n protected createCache():StateCacheService {\n return (this.parent as ApiV3WorkPackagesPaths).cache;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { GridResource } from 'core-app/features/hal/resources/grid-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { Observable } from 'rxjs';\nimport { ApiV3ListParameters, listParamsString } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { Board, BoardType } from 'core-app/features/boards/board/board';\nimport { map, switchMap, tap } from 'rxjs/operators';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { ApiV3Collection } from 'core-app/core/apiv3/cache/cachable-apiv3-collection';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { ApiV3BoardPath } from 'core-app/core/apiv3/virtual/apiv3-board-path';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { MAGIC_PAGE_NUMBER } from 'core-app/core/apiv3/helpers/get-paginated-results';\n\nexport class ApiV3BoardsPaths extends ApiV3Collection {\n @InjectField() private authorisationService:AuthorisationService;\n\n @InjectField() private PathHelper:PathHelperService;\n\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'grids', ApiV3BoardPath);\n }\n\n /**\n * Load a list of grids with a given list parameter filter\n * @param params\n */\n public list(params?:ApiV3ListParameters):Observable {\n return this\n .halResourceService\n .get>(this.path + listParamsString(params))\n .pipe(\n tap((collection) => this.authorisationService.initModelAuth('boards', collection.$links)),\n map((collection) => collection.elements.map((grid) => {\n const board = new Board(grid);\n board.sortWidgets();\n this.touch(board);\n\n return board;\n })),\n );\n }\n\n /**\n * Return all boards in the current scope of the project\n *\n * @param projectIdentifier\n */\n public allInScope(projectIdentifier:string):Observable {\n const path = this.boardPath(projectIdentifier);\n return this.list({ filters: [['scope', '=', [path]]], pageSize: MAGIC_PAGE_NUMBER });\n }\n\n /**\n * Create a new board\n * @param type\n * @param name\n * @param projectIdentifier\n */\n public create(type:BoardType, name:string, projectIdentifier:string, actionAttribute?:string):Observable {\n const scope = this.boardPath(projectIdentifier);\n return this\n .createGrid(type, name, scope, actionAttribute)\n .pipe(\n map((grid) => new Board(grid)),\n );\n }\n\n /**\n * Retrieve the board path identifier for looking up grids.\n *\n * @param projectIdentifier The current project identifier\n */\n public boardPath(projectIdentifier:string) {\n return this.PathHelper.projectBoardsPath(projectIdentifier);\n }\n\n protected createCache():StateCacheService {\n const state = this.states.forType('boards');\n return new StateCacheService(state);\n }\n\n private createGrid(type:BoardType, name:string, scope:string, actionAttribute?:string):Observable {\n const payload:any = _.set({ name }, '_links.scope.href', scope);\n payload.options = {\n type,\n };\n\n if (actionAttribute) {\n payload.options.attribute = actionAttribute;\n }\n\n return this\n .apiRoot\n .grids\n .form\n .post(payload)\n .pipe(\n switchMap((form) => this\n .apiRoot\n .grids\n .post(form.payload.$source)),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { HttpClient } from '@angular/common/http';\nimport { ID } from '@datorama/akita';\n\nimport { ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport {\n ApiV3ListFilter,\n ApiV3ListParameters,\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 { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\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(\n protected apiRoot:ApiV3Service,\n protected basePath:string,\n ) {\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 markAsReadByIds(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 public markAsReadByFilter(filters:ApiV3ListFilter[]):Observable {\n return this.http.post(\n `${this.path}/read_ian${(listParamsString({ filters: filters.map((f) => [f[0], f[1], f[2]]) }))}`,\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 // /api/v3/days/nonWorkingDays\n public readonly nonWorkingDays = new ApiV3GettableResource(this.apiRoot, this.path, 'non_working', this);\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ApiV3GettableResource,\n ApiV3ResourceCollection,\n} from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { IStorage } from 'core-app/core/state/storages/storage.model';\n\nexport class Apiv3StoragesPaths\n extends ApiV3ResourceCollection> {\n // /api/v3/storages/files\n public readonly files = this.subResource('files');\n\n constructor(protected apiRoot:ApiV3Service,\n protected basePath:string) {\n super(apiRoot, basePath, 'storages');\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Injectable,\n Injector,\n} from '@angular/core';\nimport {\n ApiV3GettableResource,\n ApiV3ResourceCollection,\n} from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { Constructor } from '@angular/cdk/table';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { ApiV3GridsPaths } from 'core-app/core/apiv3/endpoints/grids/apiv3-grids-paths';\nimport { ApiV3TimeEntriesPaths } from 'core-app/core/apiv3/endpoints/time-entries/apiv3-time-entries-paths';\nimport { ApiV3CapabilitiesPaths } from 'core-app/core/apiv3/endpoints/capabilities/apiv3-capabilities-paths';\nimport { ApiV3MembershipsPaths } from 'core-app/core/apiv3/endpoints/memberships/apiv3-memberships-paths';\nimport { ApiV3UsersPaths } from 'core-app/core/apiv3/endpoints/users/apiv3-users-paths';\nimport { ApiV3TypesPaths } from 'core-app/core/apiv3/endpoints/types/apiv3-types-paths';\nimport { ApiV3QueriesPaths } from 'core-app/core/apiv3/endpoints/queries/apiv3-queries-paths';\nimport { ApiV3WorkPackagesPaths } from 'core-app/core/apiv3/endpoints/work_packages/api-v3-work-packages-paths';\nimport { ApiV3ProjectPaths } from 'core-app/core/apiv3/endpoints/projects/apiv3-project-paths';\nimport { ApiV3ProjectsPaths } from 'core-app/core/apiv3/endpoints/projects/apiv3-projects-paths';\nimport { ApiV3StatusesPaths } from 'core-app/core/apiv3/endpoints/statuses/apiv3-statuses-paths';\nimport { ApiV3RolesPaths } from 'core-app/core/apiv3/endpoints/roles/apiv3-roles-paths';\nimport { ApiV3VersionsPaths } from 'core-app/core/apiv3/endpoints/versions/apiv3-versions-paths';\nimport { ApiV3RelationsPaths } from 'core-app/core/apiv3/endpoints/relations/apiv3-relations-paths';\nimport { ApiV3NewsPaths } from 'core-app/core/apiv3/endpoints/news/apiv3-news-paths';\nimport { ApiV3HelpTextsPaths } from 'core-app/core/apiv3/endpoints/help_texts/apiv3-help-texts-paths';\nimport { ApiV3ConfigurationPath } from 'core-app/core/apiv3/endpoints/configuration/apiv3-configuration-path';\nimport { ApiV3BoardsPaths } from 'core-app/core/apiv3/virtual/apiv3-boards-paths';\nimport { RootResource } from 'core-app/features/hal/resources/root-resource';\nimport { ApiV3PlaceholderUsersPaths } from 'core-app/core/apiv3/endpoints/placeholder-users/apiv3-placeholder-users-paths';\nimport { ApiV3GroupsPaths } from 'core-app/core/apiv3/endpoints/groups/apiv3-groups-paths';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ApiV3NotificationsPaths } from 'core-app/core/apiv3/endpoints/notifications/apiv3-notifications-paths';\nimport { ApiV3ViewsPaths } from 'core-app/core/apiv3/endpoints/views/apiv3-views-paths';\nimport { Apiv3BackupsPath } from 'core-app/core/apiv3/endpoints/backups/apiv3-backups-path';\nimport { ApiV3DaysPaths } from 'core-app/core/apiv3/endpoints/days/api-v3-days-paths';\nimport { Apiv3StoragesPaths } from 'core-app/core/apiv3/endpoints/storages/apiv3-storages-paths';\n\n@Injectable({ providedIn: 'root' })\nexport class ApiV3Service {\n // /api/v3/attachments\n public readonly attachments = this.apiV3CollectionEndpoint('attachments');\n\n // /api/v3/backups\n public readonly backups = this.apiV3CustomEndpoint(Apiv3BackupsPath);\n\n // /api/v3/configuration\n public readonly configuration = this.apiV3CustomEndpoint(ApiV3ConfigurationPath);\n\n // /api/v3/days\n public readonly days = this.apiV3CustomEndpoint(ApiV3DaysPaths);\n\n // /api/v3/documents\n public readonly documents = this.apiV3CollectionEndpoint('documents');\n\n // /api/v3/file_links\n public readonly file_links = this.apiV3CollectionEndpoint('file_links');\n\n // /api/v3/notifications\n public readonly notifications = this.apiV3CustomEndpoint(ApiV3NotificationsPaths);\n\n // /api/v3/grids\n public readonly grids = this.apiV3CustomEndpoint(ApiV3GridsPaths);\n\n // /api/v3/principals\n public readonly principals = this.apiV3CollectionEndpoint('principals');\n\n // /api/v3/root\n public readonly root = this.apiV3SingularEndpoint('');\n\n // /api/v3/statuses\n public readonly statuses = this.apiV3CustomEndpoint(ApiV3StatusesPaths);\n\n // /api/v3/relations\n public readonly relations = this.apiV3CustomEndpoint(ApiV3RelationsPaths);\n\n // /api/v3/priorities\n public readonly priorities = this.apiV3CollectionEndpoint('priorities');\n\n // /api/v3/time_entries\n public readonly time_entries = this.apiV3CustomEndpoint(ApiV3TimeEntriesPaths);\n\n // /api/v3/actions\n public readonly actions = this.apiV3CollectionEndpoint('actions');\n\n // /api/v3/capabilities\n public readonly capabilities = this.apiV3CustomEndpoint(ApiV3CapabilitiesPaths);\n\n // /api/v3/memberships\n public readonly memberships = this.apiV3CustomEndpoint(ApiV3MembershipsPaths);\n\n // /api/v3/news\n public readonly news = this.apiV3CustomEndpoint(ApiV3NewsPaths);\n\n // /api/v3/storages\n public readonly storages = this.apiV3CustomEndpoint(Apiv3StoragesPaths);\n\n // /api/v3/types\n public readonly types = this.apiV3CustomEndpoint(ApiV3TypesPaths);\n\n // /api/v3/versions\n public readonly versions = this.apiV3CustomEndpoint(ApiV3VersionsPaths);\n\n // /api/v3/work_packages\n public readonly work_packages = this.apiV3CustomEndpoint(ApiV3WorkPackagesPaths);\n\n // /api/v3/queries\n public readonly queries = this.apiV3CustomEndpoint(ApiV3QueriesPaths);\n\n // /api/v3/projects\n public readonly projects = this.apiV3CustomEndpoint(ApiV3ProjectsPaths);\n\n // /api/v3/users\n public readonly users = this.apiV3CustomEndpoint(ApiV3UsersPaths);\n\n // /api/v3/placeholder_users\n public readonly placeholder_users = this.apiV3CustomEndpoint(ApiV3PlaceholderUsersPaths);\n\n // /api/v3/groups\n public readonly groups = this.apiV3CustomEndpoint(ApiV3GroupsPaths);\n\n // /api/v3/roles\n public readonly roles = this.apiV3CustomEndpoint(ApiV3RolesPaths);\n\n // /api/v3/help_texts\n public readonly help_texts = this.apiV3CustomEndpoint(ApiV3HelpTextsPaths);\n\n // /api/v3/job_statuses\n public readonly job_statuses = this.apiV3CollectionEndpoint('job_statuses');\n\n // /api/v3/views\n public readonly views = this.apiV3CustomEndpoint(ApiV3ViewsPaths);\n\n // VIRTUAL boards are /api/v3/grids + a scope filter\n public readonly boards = this.apiV3CustomEndpoint(ApiV3BoardsPaths);\n\n constructor(readonly injector:Injector,\n readonly pathHelper:PathHelperService) {\n }\n\n /**\n * Returns the part of the API that exists both\n * - WITHIN a project scope /api/v3/projects/*\n * - GLOBALLY /api/v3/*\n *\n * The available API endpoints are being restricted automatically by typescript.\n *\n * @param projectIdentifier\n */\n public withOptionalProject(projectIdentifier:string|number|null|undefined):ApiV3ProjectPaths|this {\n if (_.isNil(projectIdentifier)) {\n return this;\n }\n return this.projects.id(projectIdentifier);\n }\n\n public collectionFromString(fullPath:string) {\n const path = fullPath.replace(`${this.pathHelper.api.v3.apiV3Base}/`, '');\n\n return this.apiV3CollectionEndpoint(path);\n }\n\n private apiV3CollectionEndpoint>(segment:string, resource?:Constructor) {\n return new ApiV3ResourceCollection(this, this.pathHelper.api.v3.apiV3Base, segment, resource);\n }\n\n private apiV3CustomEndpoint(cls:Constructor):T {\n return new cls(this, this.pathHelper.api.v3.apiV3Base);\n }\n\n private apiV3SingularEndpoint(segment:string):ApiV3GettableResource {\n return new ApiV3GettableResource(this, this.pathHelper.api.v3.apiV3Base, segment);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport { Injectable } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ConfigurationResource } from 'core-app/features/hal/resources/configuration-resource';\nimport * as moment from 'moment';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Injectable({ providedIn: 'root' })\nexport class ConfigurationService {\n // fetches configuration from the ApiV3 endpoint\n // TODO: this currently saves the request between page reloads,\n // but could easily be stored in localStorage\n private configuration:ConfigurationResource;\n\n public initialized:Promise;\n\n public constructor(\n readonly I18n:I18nService,\n readonly apiV3Service:ApiV3Service,\n ) {\n this.initialized = this\n .loadConfiguration()\n .then(() => true)\n .catch(() => false);\n }\n\n public commentsSortedInDescendingOrder():boolean {\n return this.userPreference('commentSortDescending');\n }\n\n public warnOnLeavingUnsaved():boolean {\n return this.userPreference('warnOnLeavingUnsaved');\n }\n\n public autoHidePopups():boolean {\n return this.userPreference('autoHidePopups');\n }\n\n public isTimezoneSet():boolean {\n return !!this.timezone();\n }\n\n public timezone():string {\n return this.userPreference('timeZone');\n }\n\n public isDirectUploads():boolean {\n return !!this.prepareAttachmentURL;\n }\n\n public get prepareAttachmentURL():string {\n return _.get(this.configuration, ['prepareAttachment', 'href']) as string;\n }\n\n public get maximumAttachmentFileSize():number {\n return this.systemPreference('maximumAttachmentFileSize');\n }\n\n public get perPageOptions():number[] {\n return this.systemPreference('perPageOptions');\n }\n\n public dateFormatPresent():boolean {\n return !!this.systemPreference('dateFormat');\n }\n\n public dateFormat():string {\n return this.systemPreference('dateFormat');\n }\n\n public timeFormatPresent():boolean {\n return !!this.systemPreference('timeFormat');\n }\n\n public timeFormat():string {\n return this.systemPreference('timeFormat');\n }\n\n public startOfWeekPresent():boolean {\n return !!this.systemPreference('startOfWeek');\n }\n\n public startOfWeek():number {\n if (this.startOfWeekPresent()) {\n return this.systemPreference('startOfWeek');\n }\n return moment.localeData(I18n.locale).firstDayOfWeek();\n }\n\n public get hostName():string {\n return this.systemPreference('hostName');\n }\n\n public get activeFeatureFlags():string[] {\n return this.systemPreference('activeFeatureFlags');\n }\n\n private loadConfiguration() {\n return this\n .apiV3Service\n .configuration\n .get()\n .toPromise()\n .then((configuration) => {\n this.configuration = configuration;\n });\n }\n\n private userPreference(pref:string):T {\n return _.get(this.configuration, ['userPreferences', pref]) as T;\n }\n\n private systemPreference(pref:string):T {\n return _.get(this.configuration, pref) as T;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Injectable({ providedIn: 'root' })\nexport class CurrentProjectService {\n private current:{ id:string, identifier:string, name:string };\n\n constructor(\n private PathHelper:PathHelperService,\n private apiV3Service:ApiV3Service,\n ) {\n this.detect();\n }\n\n public get inProjectContext():boolean {\n return this.current !== undefined;\n }\n\n public get path():string|null {\n if (this.current) {\n return this.PathHelper.projectPath(this.current.identifier);\n }\n\n return null;\n }\n\n public get apiv3Path():string|null {\n if (this.current) {\n return this.apiV3Service.projects.id(this.current.id).toString();\n }\n\n return null;\n }\n\n public get id():string|null {\n return this.getCurrent('id');\n }\n\n public get name():string|null {\n return this.getCurrent('name');\n }\n\n public get identifier():string|null {\n return this.getCurrent('identifier');\n }\n\n private getCurrent(key:'id'|'identifier'|'name') {\n if (this.current && this.current[key]) {\n return this.current[key].toString();\n }\n\n return null;\n }\n\n /**\n * Detect the current project from its meta tag.\n */\n public detect() {\n const element:HTMLMetaElement|null = document.querySelector('meta[name=current_project]');\n if (element) {\n this.current = {\n id: element.dataset.projectId!,\n name: element.dataset.projectName!,\n identifier: element.dataset.projectIdentifier!,\n };\n }\n }\n}\n","import {\n Injector,\n NgModule,\n} from '@angular/core';\n\nimport { CurrentUserService } from './current-user.service';\nimport { CurrentUserStore } from './current-user.store';\nimport { CurrentUserQuery } from './current-user.query';\nimport { ErrorReporterBase } from 'core-app/core/errors/error-reporter-base';\nimport { take } from 'rxjs/operators';\n\nexport function bootstrapModule(injector:Injector):void {\n const currentUserService = injector.get(CurrentUserService);\n\n (window.ErrorReporter as ErrorReporterBase)\n .addHook(\n () => currentUserService\n .user$\n .pipe(\n take(1),\n )\n .toPromise()\n .then(({ id }) => ({ user: id || 'anon' })),\n );\n\n const userMeta = document.querySelectorAll('meta[name=current_user]')[0] as HTMLElement|undefined;\n currentUserService.setUser({\n id: userMeta?.dataset.id || null,\n name: userMeta?.dataset.name || null,\n mail: userMeta?.dataset.mail || null,\n });\n}\n\n@NgModule({\n providers: [\n CurrentUserService,\n CurrentUserStore,\n CurrentUserQuery,\n ],\n})\nexport class CurrentUserModule {\n constructor(injector:Injector) {\n bootstrapModule(injector);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Query } from '@datorama/akita';\nimport {\n CurrentUserState,\n CurrentUserStore,\n} from './current-user.store';\n\n@Injectable()\nexport class CurrentUserQuery extends Query {\n constructor(protected store:CurrentUserStore) {\n super(store);\n }\n\n isLoggedIn$ = this.select((state) => !!state.id);\n\n user$ = this.select(({ id, name, mail }) => ({ id, name, mail }));\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport {\n CurrentUser,\n CurrentUserStore,\n} from './current-user.store';\nimport { CurrentUserQuery } from './current-user.query';\nimport { CapabilitiesResourceService } from 'core-app/core/state/capabilities/capabilities.service';\nimport { Observable } from 'rxjs';\nimport {\n distinctUntilChanged,\n filter,\n map,\n switchMap,\n take,\n} from 'rxjs/operators';\nimport { ApiV3ListFilter } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { ICapability } from 'core-app/core/state/capabilities/capability.model';\n\n@Injectable({ providedIn: 'root' })\nexport class CurrentUserService {\n constructor(\n private apiV3Service:ApiV3Service,\n private currentUserStore:CurrentUserStore,\n private currentUserQuery:CurrentUserQuery,\n private capabilitiesService:CapabilitiesResourceService,\n ) {\n this.setupLegacyDataListeners();\n }\n\n public isLoggedIn$ = this.currentUserQuery.isLoggedIn$;\n\n public user$ = this.currentUserQuery.user$;\n\n /**\n * Set the current user object\n *\n * This refetches the global and current project capabilities\n */\n public setUser(user:CurrentUser):void {\n this.currentUserStore.update((state) => ({\n ...state,\n ...user,\n }));\n }\n\n /**\n * Returns the set of capabilities for the given context and/or actions\n */\n public capabilities$(actions:string[] = [], projectContext:string|null):Observable {\n return this\n .principalFilter$()\n .pipe(\n map((userFilter) => {\n const filters:ApiV3ListFilter[] = [userFilter];\n\n if (projectContext) {\n filters.push(['context', '=', [projectContext === 'global' ? 'g' : `p${projectContext}`]]);\n }\n\n if (actions.length > 0) {\n filters.push(['action', '=', actions]);\n }\n\n return { filters, pageSize: -1 };\n }),\n switchMap((params) => this.capabilitiesService.require(params)),\n );\n }\n\n /**\n * Returns an Observable indicating whether the current user has the required capabilities\n * in the provided context.\n */\n public hasCapabilities$(action:string|string[], projectContext:string|null):Observable {\n const actions = _.castArray(action);\n return this\n .capabilities$(actions, projectContext)\n .pipe(\n map((capabilities) => actions.reduce(\n (acc, contextAction) => acc && !!capabilities.find((cap) => cap._links.action.href.endsWith(`/api/v3/actions/${contextAction}`)),\n capabilities.length > 0,\n )),\n distinctUntilChanged(),\n );\n }\n\n /**\n * Returns an Observable indicating whether the current user\n * has any of the required capabilities in the provided context.\n */\n public hasAnyCapabilityOf$(actions:string|string[], projectContext:string|null):Observable {\n const actionsToFilter = _.castArray(actions);\n return this\n .capabilities$(actionsToFilter, projectContext)\n .pipe(\n map((capabilities) => capabilities.reduce(\n (acc, cap) => acc || !!actionsToFilter.find((action) => cap._links.action.href.endsWith(`/api/v3/actions/${action}`)),\n false,\n )),\n distinctUntilChanged(),\n );\n }\n\n /**\n * Returns a principal filter for the current user.\n */\n private principalFilter$():Observable {\n return this\n .user$\n .pipe(\n filter((user) => !!user.id),\n take(1),\n map((user) => ['principal', '=', [user.id as string]]),\n );\n }\n\n // Everything below this is deprecated legacy interfacing and should not be used\n\n private setupLegacyDataListeners() {\n this.currentUserQuery.user$.subscribe((user) => (this._user = user));\n this.currentUserQuery.isLoggedIn$.subscribe((isLoggedIn) => (this._isLoggedIn = isLoggedIn));\n }\n\n private _isLoggedIn = false;\n\n /** @deprecated Use the store mechanism `currentUserQuery.isLoggedIn$` */\n public get isLoggedIn():boolean {\n return this._isLoggedIn;\n }\n\n private _user:CurrentUser = {\n id: null,\n name: null,\n mail: null,\n };\n\n /** @deprecated Use the store mechanism `currentUserQuery.user$` */\n public get userId():string {\n return this._user.id || '';\n }\n\n /** @deprecated Use the store mechanism `currentUserQuery.user$` */\n public get name():string {\n return this._user.name || '';\n }\n\n /** @deprecated Use the store mechanism `currentUserQuery.user$` */\n public get mail():string {\n return this._user.mail || '';\n }\n\n /** @deprecated Use the store mechanism `currentUserQuery.user$` */\n public get href():string {\n return `/api/v3/users/${this.userId}`;\n }\n\n /** @deprecated Use `I18nService.locale` instead */\n public get language():string {\n return I18n.locale || 'en';\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport {\n Store,\n StoreConfig,\n} from '@datorama/akita';\n\nexport interface CurrentUser {\n id:string|null;\n name:string|null;\n mail:string|null;\n}\n\nexport interface CurrentUserState extends CurrentUser {\n}\n\nexport function createInitialState():CurrentUserState {\n return {\n id: null,\n name: null,\n mail: null,\n };\n}\n\n@Injectable()\n@StoreConfig({ name: 'current-user' })\nexport class CurrentUserStore extends Store {\n constructor() {\n super(createInitialState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport * as moment from 'moment-timezone';\nimport {\n Moment,\n} from 'moment';\n\ndeclare module 'moment' {\n interface Moment {\n tz():string|undefined;\n\n tz(timezone:string, keepLocalTime?:boolean):Moment;\n\n zoneAbbr():string;\n\n zoneName():string;\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class TimezoneService {\n constructor(\n readonly configurationService:ConfigurationService,\n readonly I18n:I18nService,\n ) {\n this.setupLocale();\n }\n\n public setupLocale():void {\n moment.locale(I18n.locale);\n }\n\n /**\n * Takes a utc date time string and turns it into\n * a local date time moment object.\n */\n public parseDatetime(datetime:string, format?:string):Moment {\n const d = moment.utc(datetime, format);\n\n if (this.configurationService.isTimezoneSet()) {\n d.local();\n d.tz(this.configurationService.timezone());\n }\n\n return d;\n }\n\n public parseDate(date:Date|string, format?:string):Moment {\n return moment(date, format);\n }\n\n /**\n * Parses the specified datetime and applies the user's configured timezone, if any.\n *\n * This will effectfully transform the [server] provided datetime object to the user's configured local timezone.\n *\n * @param {String} datetime in 'YYYY-MM-DDTHH:mm:ssZ' format\n * @returns {Moment}\n */\n public parseISODatetime(datetime:string):Moment {\n return this.parseDatetime(datetime, 'YYYY-MM-DDTHH:mm:ssZ');\n }\n\n public parseISODate(date:string):Moment {\n return this.parseDate(date, 'YYYY-MM-DD');\n }\n\n public formattedDate(date:string):string {\n const d = this.parseDate(date);\n return d.format(this.getDateFormat());\n }\n\n /**\n * Returns the number of days from today the given dateString is apart.\n * Negative means the date lies in the past.\n * @param dateString\n */\n public daysFromToday(dateString:string):number {\n const date = this.parseDate(dateString);\n const today = moment().startOf('day');\n\n return date.diff(today, 'days');\n }\n\n public formattedTime(datetimeString:string):string {\n return this.parseDatetime(datetimeString).format(this.getTimeFormat());\n }\n\n public formattedDatetime(datetimeString:string):string {\n const c = this.formattedDatetimeComponents(datetimeString);\n return `${c[0]} ${c[1]}`;\n }\n\n public formattedRelativeDateTime(datetimeString:string):string {\n const d = this.parseDatetime(datetimeString);\n return d.fromNow();\n }\n\n public formattedDatetimeComponents(datetimeString:string):string[] {\n const d = this.parseDatetime(datetimeString);\n return [\n d.format(this.getDateFormat()),\n d.format(this.getTimeFormat()),\n ];\n }\n\n public toHours(durationString:string):number {\n return Number(moment.duration(durationString).asHours().toFixed(2));\n }\n\n public toDays(durationString:string):number {\n return Number(moment.duration(durationString).asDays().toFixed(2));\n }\n\n public toISODuration(input:string|number, unit:'hours'|'days'):string {\n return moment.duration(input, unit).toIsoString();\n }\n\n public formattedDuration(durationString:string, unit:'hour'|'days' = 'hour'):string {\n switch (unit) {\n case 'hour':\n return this.I18n.t('js.units.hour', { count: this.toHours(durationString) });\n case 'days':\n return this.I18n.t('js.units.day', { count: this.toDays(durationString) });\n default:\n // Case fallthrough for eslint\n return '';\n }\n }\n\n public formattedISODate(date:any):string {\n return this.parseDate(date).format('YYYY-MM-DD');\n }\n\n public formattedISODateTime(datetime:any):string {\n return datetime.format();\n }\n\n public isValidISODate(date:any):boolean {\n return this.isValid(date, 'YYYY-MM-DD');\n }\n\n public isValidISODateTime(dateTime:string):boolean {\n return this.isValid(dateTime, 'YYYY-MM-DDTHH:mm:ssZ');\n }\n\n public isValid(date:string, dateFormat:string):boolean {\n const format = dateFormat || this.getDateFormat();\n return moment(date, [format], true).isValid();\n }\n\n public getDateFormat():string {\n return this.configurationService.dateFormatPresent() ? this.configurationService.dateFormat() : 'L';\n }\n\n public getTimeFormat():string {\n return this.configurationService.timeFormatPresent() ? this.configurationService.timeFormat() : 'LT';\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Injectable,\n Injector,\n} from '@angular/core';\nimport * as moment from 'moment';\nimport {\n take,\n tap,\n} from 'rxjs/operators';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WeekdayResourceService } from 'core-app/core/state/days/weekday.service';\nimport { IWeekday } from 'core-app/core/state/days/weekday.model';\nimport {\n Observable,\n of,\n} from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class WeekdayService {\n @InjectField() weekdaysService:WeekdayResourceService;\n\n private weekdays:IWeekday[];\n\n constructor(\n readonly injector:Injector,\n ) {}\n\n /**\n * @param date The iso day number (1-7) or a date instance\n * @return {boolean} whether the given iso day is working or not\n */\n public isNonWorkingDay(date:Date|number):boolean {\n const isoDayOfWeek = (typeof date === 'number') ? date : moment(date).isoWeekday();\n return !!(this.weekdays || []).find((wd) => wd.day === isoDayOfWeek && !wd.working);\n }\n\n public get nonWorkingDays():IWeekday[] {\n return this.weekdays.filter((day) => !day.working);\n }\n\n loadWeekdays():Observable {\n if (this.weekdays) {\n return of(this.weekdays);\n }\n\n return this\n .weekdaysService\n .require()\n .pipe(\n take(1),\n tap((weekdays) => {\n this.weekdays = weekdays;\n }),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { getType } from 'mime';\nimport { Injectable } from '@angular/core';\nimport { HttpEvent, HttpResponse } from '@angular/common/http';\nimport { from, Observable, of } from 'rxjs';\nimport { share, switchMap } from 'rxjs/operators';\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { EXTERNAL_REQUEST_HEADER } from 'core-app/features/hal/http/openproject-header-interceptor';\nimport {\n OpenProjectFileUploadService, UploadBlob, UploadFile, UploadInProgress,\n} from './op-file-upload.service';\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 */\n public uploadSingle(url:string, file:UploadFile|UploadBlob, method = 'post') {\n const observable = from(this.getDirectUploadFormFrom(url, file))\n .pipe(\n switchMap(this.uploadToExternal(file, method)),\n share(),\n );\n\n return [file, observable] as UploadInProgress;\n }\n\n private uploadToExternal(file:UploadFile|UploadBlob, method: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: 'text',\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 HttpEvent,\n HttpEventType,\n 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(\n protected readonly http:HttpClient,\n protected readonly 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 */\n public uploadAndMapResponse(url:string, files:UploadFile[]):MappedUploadResult {\n const { uploads, finished } = this.upload(url, files);\n const mapped = finished\n .then((result:HalResource[]) => result.map((element:HalResource) => ({\n response: element,\n uploadUrl: (element.staticDownloadLocation as unknown&{ href:string }).href,\n }))) 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 */\n public uploadSingle(\n url:string,\n file:UploadFile|UploadBlob,\n method = 'post',\n responseType:'json'|'text' = 'json',\n ):UploadInProgress {\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.http.request(\n method,\n url,\n {\n body: formData,\n // Observe the response, not the body\n observe: 'events',\n withCredentials: true,\n responseType,\n // Subscribe to progress events. subscribe() will fire multiple times!\n reportProgress: true,\n },\n ).pipe(share());\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Injectable({ providedIn: 'root' })\nexport class MainMenuToggleService {\n public toggleTitle:string;\n\n private elementWidth:number;\n\n private elementMinWidth = 11;\n\n private readonly defaultWidth:number = 230;\n\n private readonly localStorageKey:string = 'openProject-mainMenuWidth';\n\n private readonly localStorageStateKey:string = 'openProject-mainMenuCollapsed';\n\n @InjectField() currentProject:CurrentProjectService;\n\n private global = (window as any);\n\n private htmlNode = document.getElementsByTagName('html')[0];\n\n private mainMenu = jQuery('#main-menu')[0]; // main menu, containing sidebar and resizer\n\n private hideElements = jQuery('.can-hide-navigation');\n\n // Title needs to be sync in main-menu-toggle.component.ts and main-menu-resizer.component.ts\n private titleData = new BehaviorSubject('');\n\n public titleData$ = this.titleData.asObservable();\n\n // Notes all changes of the menu size (currently needed in wp-resizer.component.ts)\n private changeData = new BehaviorSubject({});\n\n public changeData$ = this.changeData.asObservable();\n\n constructor(protected I18n:I18nService,\n public injector:Injector,\n readonly deviceService:DeviceService) {\n }\n\n public initializeMenu():void {\n if (!this.mainMenu) {\n return;\n }\n\n this.elementWidth = parseInt(window.OpenProject.guardedLocalStorage(this.localStorageKey) as string);\n const menuCollapsed = window.OpenProject.guardedLocalStorage(this.localStorageStateKey) as string;\n\n if (!this.elementWidth) {\n this.saveWidth(this.mainMenu.offsetWidth);\n } else if (menuCollapsed && JSON.parse(menuCollapsed)) {\n this.closeMenu();\n } else {\n this.setWidth();\n }\n\n const currentProject:CurrentProjectService = this.injector.get(CurrentProjectService);\n if (jQuery(document.body).hasClass('controller-my') && this.elementWidth === 0 || currentProject.id === null) {\n this.saveWidth(this.defaultWidth);\n }\n\n // mobile version default: hide menu on initialization\n this.closeWhenOnMobile();\n }\n\n // click on arrow or hamburger icon\n public toggleNavigation(event?:JQuery.TriggeredEvent|Event):void {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n }\n\n if (!this.showNavigation) { // sidebar is hidden -> show menu\n if (this.deviceService.isMobile) { // mobile version\n this.setWidth(window.innerWidth);\n } else { // desktop version\n const savedWidth = parseInt(window.OpenProject.guardedLocalStorage(this.localStorageKey) as string);\n const widthToSave = savedWidth >= this.elementMinWidth ? savedWidth : this.defaultWidth;\n\n this.saveWidth(widthToSave);\n }\n } else { // sidebar is expanded -> close menu\n this.closeMenu();\n }\n\n // Set focus on first visible main menu item.\n // This needs to be called after AngularJS has rendered the menu, which happens some when after(!) we leave this\n // method here. So we need to set the focus after a timeout.\n setTimeout(() => {\n jQuery('#main-menu [class*=\"-menu-item\"]:visible').first().focus();\n }, 500);\n }\n\n public closeMenu():void {\n this.setWidth(0);\n window.OpenProject.guardedLocalStorage(this.localStorageStateKey, 'true');\n jQuery('.searchable-menu--search-input').blur();\n }\n\n public closeWhenOnMobile():void {\n if (this.deviceService.isMobile) {\n this.closeMenu();\n window.OpenProject.guardedLocalStorage(this.localStorageStateKey, 'false');\n }\n }\n\n public saveWidth(width?:number):void {\n this.setWidth(width);\n window.OpenProject.guardedLocalStorage(this.localStorageKey, String(this.elementWidth));\n window.OpenProject.guardedLocalStorage(this.localStorageStateKey, String(this.elementWidth === 0));\n }\n\n public setWidth(width?:any):void {\n if (width !== undefined) {\n // Leave a minimum amount of space for space for the content\n const maxMenuWidth = this.deviceService.isMobile ? window.innerWidth - 120 : window.innerWidth - 520;\n if (width > maxMenuWidth) {\n this.elementWidth = maxMenuWidth;\n } else {\n this.elementWidth = width as number;\n }\n }\n\n this.snapBack();\n this.setToggleTitle();\n this.toggleClassHidden();\n\n this.global.showNavigation = this.showNavigation;\n this.htmlNode.style.setProperty('--main-menu-width', `${this.elementWidth}px`);\n\n // Send change event when size of menu is changing (menu toggled or resized)\n const changeEvent = jQuery.Event('change');\n this.changeData.next(changeEvent);\n }\n\n public get showNavigation():boolean {\n return (this.elementWidth >= this.elementMinWidth);\n }\n\n private snapBack():void {\n if (this.elementWidth < this.elementMinWidth) {\n this.elementWidth = 0;\n }\n }\n\n private setToggleTitle():void {\n if (this.showNavigation) {\n this.toggleTitle = this.I18n.t('js.label_hide_project_menu');\n } else {\n this.toggleTitle = this.I18n.t('js.label_expand_project_menu');\n }\n this.titleData.next(this.toggleTitle);\n }\n\n private toggleClassHidden():void {\n this.hideElements.toggleClass('hidden-navigation', !this.showNavigation);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { input } from 'reactivestates';\nimport { Observable } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nexport type ModelLinks = { [action:string]:any };\nexport type ModelLinksHash = { [model:string]:ModelLinks };\n\n@Injectable({ providedIn: 'root' })\nexport class AuthorisationService {\n private links = input({});\n\n public initModelAuth(modelName:string, modelLinks:ModelLinks) {\n this.links.doModify((value:ModelLinksHash) => {\n const links = { ...value };\n links[modelName] = modelLinks;\n return links;\n });\n }\n\n public observeUntil(unsubscribe:Observable) {\n return this.links.values$().pipe(takeUntil(unsubscribe));\n }\n\n public can(modelName:string, action:string) {\n const links:ModelLinksHash = this.links.getValueOr({});\n return links[modelName] && (action in links[modelName]);\n }\n\n public cannot(modelName:string, action:string) {\n return !this.can(modelName, action);\n }\n}\n","import { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\n\nexport class ApiV3Paths {\n readonly apiV3Base:string;\n\n constructor(basePath:string) {\n this.apiV3Base = `${basePath}/api/v3`;\n }\n\n public get openApiSpecPath():string {\n return `${this.apiV3Base}/spec.json`;\n }\n\n /**\n * Preview markup path\n *\n * Primarily used from ckeditor-augmented-textarea\n * https://github.com/opf/commonmark-ckeditor-build/\n *\n * @param context\n */\n public previewMarkup(context:string) {\n const base = `${this.apiV3Base}/render/markdown`;\n\n if (context) {\n return `${base}?context=${context}`;\n }\n return base;\n }\n\n /**\n * Principals autocompleter path\n *\n * Primarily used from ckeditor-augmented-textarea\n * https://github.com/opf/commonmark-ckeditor-build/\n *\n */\n public principals(projectId:string|number, term:string|null) {\n const filters:ApiV3FilterBuilder = new ApiV3FilterBuilder();\n // Only real and activated users:\n filters.add('status', '!', ['3']);\n // that are members of that project:\n filters.add('member', '=', [projectId.toString()]);\n // That are users:\n filters.add('type', '=', ['User', 'Group']);\n\n if (term && term.length > 0) {\n // Containing the that substring:\n filters.add('name', '~', [term]);\n }\n\n return `${this.apiV3Base\n }/principals?${\n filters.toParams({ sortBy: '[[\"name\",\"asc\"]]', offset: '1', pageSize: '10' })}`;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 fileLinksPath():string {\n return `${this.api.v3.apiV3Base}/file_links`;\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport { State } from 'reactivestates';\nimport { Injectable } from '@angular/core';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { Observable } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { States } from 'core-app/core/states/states.service';\nimport { ISchemaProxy, SchemaProxy } from 'core-app/features/hal/schemas/schema-proxy';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { WorkPackageSchemaProxy } from 'core-app/features/hal/schemas/work-package-schema-proxy';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\n\n@Injectable()\nexport class SchemaCacheService extends StateCacheService {\n constructor(readonly states:States,\n readonly halResourceService:HalResourceService) {\n super(states.schemas);\n }\n\n public state(id:string|HalResource):State {\n return super.state(this.stateKey(id));\n }\n\n /**\n * Returns the schema of the provided resource.\n * This method assumes the schema is loaded and will fail if it is not.\n * @deprecated Assuming the schema to be loaded is deprecated. Rely on the states instead.\n * @param resource The HalResource for which the schema is to be returned\n * @return The schema for the HalResource\n */\n of(resource:HalResource):ISchemaProxy {\n const schema = this.state(resource).value;\n\n if (!schema) {\n throw new Error(`Schema for resource ${resource} was expected to be loaded but isn't.`);\n }\n\n if (resource._type === 'WorkPackage') {\n return WorkPackageSchemaProxy.create(schema, resource);\n }\n return SchemaProxy.create(schema, resource);\n }\n\n public getSchemaHref(resource:HalResource):string {\n const href = resource.$links.schema?.href;\n\n if (!href) {\n throw new Error(`Resource ${resource} has no schema to load.`);\n }\n\n return href;\n }\n\n /**\n * Ensure the given schema identified by its href is currently loaded.\n * @param resource The resource with a schema property or a string to the schema href.\n * @return A promise with the loaded schema.\n */\n ensureLoaded(resource:HalResource|string):Promise {\n const href = resource instanceof HalResource ? this.getSchemaHref(resource) : resource;\n\n return this\n .requireAndStream(href)\n .pipe(\n take(1),\n )\n .toPromise() as unknown as Promise;\n }\n\n /**\n * Require the value to be loaded either when forced or the value is stale\n * according to the cache interval specified for this service.\n *\n * Returns an observable to the values stream of the state.\n *\n * @param id The state to require\n * @param force Load the value anyway.\n */\n public requireAndStream(href:string, force = false):Observable {\n // Refresh when stale or being forced\n if (this.stale(href) || force) {\n this.clearAndLoad(\n href,\n this.load(href),\n );\n }\n\n return this.state(href).values$();\n }\n\n /**\n * Load the associated schema for the given work package, if needed.\n */\n protected load(href:string):Observable {\n return this\n .halResourceService\n .get(href)\n .pipe(\n take(1),\n );\n }\n\n protected loadAll(hrefs:string[]):Promise {\n return Promise.all(hrefs.map((href) => this.load(href)));\n }\n\n /**\n * Places the schema in the schema state of the resource.\n * @param resource The resource for which the schema is to be updated\n * @param schema\n */\n update(resource:HalResource, schema:SchemaResource) {\n this.multiState.get(this.stateKey(resource)).putValue(schema);\n }\n\n private stateKey(id:string|HalResource):string {\n if (id instanceof HalResource) {\n return this.getSchemaHref(id);\n }\n return id;\n }\n}\n","export const enterpriseEditionUrl = 'https://www.openproject.org/enterprise-edition/?op_edition=community-edition';\n\nexport const contactUrl:{ [locale:string]:string } = {\n en: 'https://www.openproject.org/contact/',\n de: 'https://www.openproject.org/de/kontakt/',\n};\n\nexport const pricingUrl = 'https://www.openproject.org/pricing';\n\nexport const enterpriseDocsUrl:{ [key:string]:string } = {\n website: 'https://www.openproject.org/enterprise-edition/',\n boards: 'https://www.openproject.org/docs/user-guide/agile-boards/#action-boards-enterprise-add-on',\n tableHighlighting: 'https://www.openproject.org/docs/user-guide/work-packages/work-package-table-configuration/#attribute-highlighting-enterprise-add-on',\n graphWidgets: 'https://www.openproject.org/docs/user-guide/project-overview/#work-package-graph-widgets-enterprise-add-on',\n};\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n\nimport { ComponentType } from '@angular/cdk/portal';\nimport { ApplicationRef } from '@angular/core';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\n\n/**\n * Optional bootstrap definition to allow selecting all matching\n * DOM nodes to manually bootstrap them.\n *\n * This differs from Angular's bootstrap module definition since it expects these\n * entries to be present on ALL pages. This is never the case for our optional\n * bootstrapped components.\n */\nexport interface OptionalBootstrapDefinition {\n // The DOM selector used to locate an optional node\n selector:string;\n // The component class tied to it.\n cls:ComponentType;\n // Whether the component may be embeddable in dynamically generated responses\n // e.g., previews\n embeddable?:boolean;\n}\n\n/**\n * Static lookup table for dynamically bootstrapped components within our application\n */\nexport class DynamicBootstrapper {\n private static optionalBoostrapComponents:OptionalBootstrapDefinition[] = [];\n\n /**\n * Register an optional bootstrap component to be dynamically bootstrapped\n * whenever it occurs in the initially loaded DOM.\n *\n * @param {OptionalBootstrapDefinition} definition\n */\n public static register(...defs:OptionalBootstrapDefinition[]) {\n this.optionalBoostrapComponents.push(...defs);\n }\n\n /**\n * Perform bootstrapping of matched elements within the given document.\n *\n * @param {ApplicationRef} appRef The application reference to lookup elements.\n * @param {Document} doc The document element\n * @param {OptionalBootstrapDefinition[]|undefined} definitions An optional set of components to bootstrap\n */\n public static bootstrapOptionalDocument(appRef:ApplicationRef, doc:Document, definitions = this.optionalBoostrapComponents) {\n this.performBootstrap(appRef, doc, false, definitions);\n }\n\n /**\n * Perform bootstrapping of embeddable elements within the given node.\n *\n * @param {ApplicationRef} appRef The application reference to lookup elements.\n * @param {HTMLElement} element A node to bootstrap elements within.\n * @param {OptionalBootstrapDefinition[]|undefined} definitions An optional set of components to bootstrap\n */\n public static bootstrapOptionalEmbeddable(appRef:ApplicationRef, element:HTMLElement, definitions = this.optionalBoostrapComponents) {\n // Delay the execution to avoid bootstrapping the embedded components while\n // the app is running the Change Detection. This was throwing \"ApplicationRef.tick\n // is called recursively\" error because of bootstrapOptionalEmbeddable and\n // bootstrapOptionalDocument were called too close (ie: ckEditor macros).\n Promise.resolve().then(() => this.performBootstrap(appRef, element, true, definitions));\n }\n\n /**\n * Get embeddable components\n */\n public static getEmbeddable() {\n return this.optionalBoostrapComponents.filter((el) => el.embeddable);\n }\n\n /**\n * Bootstrap within a given document (globally, all components available) or within an element (embeddable compoennts\n * only).\n *\n * @param {ApplicationRef} appRef\n * @param {Document | HTMLElement} root\n * @param {boolean} embedded\n */\n private static performBootstrap(appRef:ApplicationRef, root:Document|HTMLElement, embedded:boolean, definitions:OptionalBootstrapDefinition[]) {\n definitions\n .forEach((el) => {\n // Skip non-embeddable components in an embedded bootstrap.\n if (embedded && !el.embeddable) {\n return;\n }\n\n const elements = root.querySelectorAll(el.selector);\n for (let i = 0; i < elements.length; i++) {\n const target = elements[i];\n\n if (!embedded && target.closest('[op-dynamic-bootstrap]')) {\n debugLog(`Skipping nested bootstrap ${el.selector} in %O`, target);\n return;\n }\n\n appRef.bootstrap(el.cls, target);\n target.setAttribute('op-dynamic-bootstrap', 'true');\n }\n });\n }\n}\n","export const demoProjectName = 'Demo project';\nexport const scrumDemoProjectName = 'Scrum project';\nexport const onboardingTourStorageKey = 'openProject-onboardingTour';\nexport type OnboardingTourNames = 'prepareBacklogs'|'backlogs'|'taskboard'|'homescreen'|'main';\n\nexport enum ProjectName {\n demo = 'demo',\n scrum = 'scrum',\n}\n\nfunction matchingFilter(list:NodeListOf, filterFunction:(match:HTMLElement) => boolean):HTMLElement|null {\n for (let i = 0; i < list.length; i++) {\n if (filterFunction(list[i])) {\n return list[i];\n }\n }\n\n return null;\n}\n\nexport function waitForElement(\n selector:string,\n containerSelector:string,\n execFunction:(match:HTMLElement) => void,\n filterFunction:(match:HTMLElement) => boolean = () => true,\n):void {\n const container = document.querySelector(containerSelector) as HTMLElement;\n // If the element is ready immediately\n const initial = matchingFilter(container.querySelectorAll(selector), filterFunction);\n if (initial) {\n execFunction(initial);\n return;\n }\n\n // Wait for the element to be ready\n const observer = new MutationObserver((mutations, observerInstance) => {\n const matches = matchingFilter(container.querySelectorAll(selector), filterFunction);\n if (matches) {\n execFunction(matches);\n observerInstance.disconnect();\n }\n });\n\n observer.observe(container, {\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 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 { HalLink } from 'core-app/features/hal/hal-link/hal-link';\nimport isNewResource, { HAL_NEW_RESOURCE_ID } from 'core-app/features/hal/helpers/is-new-resource';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { insertCollectionIntoState, removeEntityFromCollectionAndState } from 'core-app/core/state/collection-store';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Injectable()\nexport class AttachmentsResourceService extends ResourceCollectionService {\n @InjectField() I18n:I18nService;\n\n @InjectField() fileUploadService:OpenProjectFileUploadService;\n\n @InjectField() directFileUploadService:OpenProjectDirectFileUploadService;\n\n @InjectField() configurationService:ConfigurationService;\n\n @InjectField() toastService:ToastService;\n\n /**\n * This method ensures that a specific collection is fetched, if not available.\n *\n * @param key The collection key, of the required collection.\n */\n requireCollection(key:string):void {\n if (this.store.getValue().collections[key]) {\n return;\n }\n\n this.fetchAttachments(key).subscribe();\n }\n\n /**\n * Fetches attachments by the attachment collection self link.\n * This link is used as key to store the result collection in the resource store.\n *\n * @param attachmentsSelfLink The self link of the attachment collection from the parent resource.\n */\n fetchAttachments(attachmentsSelfLink:string):Observable> {\n return this.http\n .get>(attachmentsSelfLink)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, attachmentsSelfLink)),\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n /**\n * Sends deletion request and updates the store collection of attachments.\n *\n * @param collectionKey The identifier of the current attachment collection.\n * @param attachment The attachment to be deleted.\n */\n removeAttachment(collectionKey:string, attachment:IAttachment):Observable {\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n return this.http\n .delete(attachment._links.delete.href, { withCredentials: true, headers })\n .pipe(\n tap(() => removeEntityFromCollectionAndState(this.store, attachment.id, collectionKey)),\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n /**\n * Sends an upload request and updates the store collection of attachments.\n *\n * @param resource The HAL resource to attach the files to\n * @param files The upload files to be attached.\n */\n attachFiles(resource:HalResource, files:UploadFile[]):Observable {\n const identifier = AttachmentsResourceService.getAttachmentsSelfLink(resource) || HAL_NEW_RESOURCE_ID;\n const href = this.getUploadTarget(resource);\n const isDirectUpload = !!this.getDirectUploadLink(resource);\n\n return this\n .addAttachments(\n identifier,\n href,\n files,\n isDirectUpload,\n );\n }\n\n /**\n * Sends an upload request and updates the store collection of attachments.\n *\n * @param collectionKey The identifier of the current attachment collection.\n * @param uploadHref The API target to perform the call against.\n * @param files The upload files to be attached.\n * @param isDirectUpload whether the provided upload target is a direct upload URL.\n */\n addAttachments(\n collectionKey:string,\n uploadHref:string,\n files:UploadFile[],\n isDirectUpload = false,\n ):Observable {\n return this\n .uploadAttachments(uploadHref, files, isDirectUpload)\n .pipe(\n tap((attachments) => {\n applyTransaction(() => {\n this.store.add(attachments);\n this.store.update(({ collections }) => (\n {\n collections: {\n ...collections,\n [collectionKey]: {\n ...collections[collectionKey],\n ids: (collections[collectionKey]?.ids || []).concat(attachments.map((a) => a.id)),\n },\n },\n }\n ));\n });\n }),\n );\n }\n\n private uploadAttachments(href:string, files:UploadFile[], isDirectUpload:boolean):Observable {\n const { uploads, finished } = isDirectUpload\n ? this.directFileUploadService.uploadAndMapResponse(href, files)\n : this.fileUploadService.uploadAndMapResponse(href, files);\n\n const message = this.I18n.t('js.label_upload_notification');\n const notification = this.toastService.addAttachmentUpload(message, uploads);\n\n return from(finished)\n .pipe(\n tap(() => {\n setTimeout(() => this.toastService.remove(notification), 700);\n }),\n map((result) => result.map(({ response }) => (response as HalResource).$source as IAttachment)),\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n /**\n * Get the upload target for a HAL resource, depending on its\n * persisted state and available links.\n *\n * This will be one of the following:\n * - The direct upload PREPARE URL endpoint for the resource (if direct upload active + resource persisted)\n * - The generic prepare URL endpoint (if direct upload active)\n * - The resource's own upload HAL link (if persisted)\n * - The generic APIv3 attachments endpoint (new resource, no direct upload)\n *\n * @param resource The resource we're uploading attachments for.\n * @returns {string} The API target URL to perform the upload against.\n * @private\n */\n private getUploadTarget(resource:HalResource):string {\n return this.getDirectUploadLink(resource)\n || AttachmentsResourceService.getAttachmentsSelfLink(resource)\n || this.apiV3Service.attachments.path;\n }\n\n private getDirectUploadLink(resource:HalResource):string|null {\n const links = resource.$links as unknown&{ prepareAttachment:HalLink };\n\n if (links.prepareAttachment) {\n return links.prepareAttachment.href as string;\n }\n\n if (isNewResource(resource)) {\n return this.configurationService.prepareAttachmentURL as string|null;\n }\n\n return null;\n }\n\n private static getAttachmentsSelfLink(resource:HalResource):string|null {\n const attachments = resource.attachments as unknown&{ href?:string };\n return attachments?.href || null;\n }\n\n protected createStore():CollectionStore {\n return new AttachmentsStore();\n }\n\n protected basePath():string {\n return this.apiV3Service.attachments.path;\n }\n}\n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\nimport { ICapability } from 'core-app/core/state/capabilities/capability.model';\n\nexport interface CapabilitiesState extends CollectionState {\n}\n\n@StoreConfig({ name: 'capabilities' })\nexport class CapabilitiesStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n catchError,\n map,\n switchMap,\n} from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { collectionKey } from 'core-app/core/state/collection-store';\nimport { ICapability } from 'core-app/core/state/capabilities/capability.model';\nimport { CapabilitiesStore } from 'core-app/core/state/capabilities/capabilities.store';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Injectable()\nexport class CapabilitiesResourceService extends ResourceCollectionService {\n @InjectField() toastService:ToastService;\n\n /**\n * Require the available capabilities for the given filter params\n * Returns a cached set if it was loaded already.\n *\n * @param params List params to require\n * @private\n */\n public require$(params:ApiV3ListParameters):Observable {\n const key = collectionKey(params);\n if (this.collectionExists(key) || this.collectionLoading(key)) {\n return this.loadedCollection(key);\n }\n\n return this\n .fetchCapabilities(params)\n .pipe(\n switchMap(() => this.loadedCollection(key)),\n );\n }\n\n /**\n * Returns the loaded capabilities for a context\n */\n public loadedCapabilities$(contextId:string):Observable {\n return this\n .query\n .selectAll()\n .pipe(\n map((capabilities) => capabilities.filter((cap) => cap._links.context.href.endsWith(`/${contextId}`))),\n );\n }\n\n public fetchCapabilities(params:ApiV3ListParameters):Observable> {\n return this\n .fetchCollection(params)\n .pipe(\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n protected createStore():CollectionStore {\n return new CapabilitiesStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .capabilities\n .path;\n }\n}\n","import {\n applyTransaction,\n EntityState,\n EntityStore,\n ID,\n} from '@datorama/akita';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport {\n ApiV3ListParameters,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { IHalResourceLinks } from 'core-app/core/state/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { filter } from 'lodash';\n\nexport interface CollectionResponse {\n ids:ID[];\n}\n\nexport interface CollectionState extends EntityState {\n /** Loaded notification collections */\n collections:Record;\n\n /** Loading collections */\n loadingCollections:Record;\n}\n\nexport interface CollectionItem {\n id:ID;\n}\n\nexport function mapHALCollectionToIDCollection(collection:IHALCollection):CollectionResponse {\n return {\n ids: collection._embedded.elements.map((el) => el.id),\n };\n}\n\n/**\n * Initialize the collection part of the entity store\n */\nexport function createInitialCollectionState():CollectionState {\n return {\n collections: {},\n loadingCollections: {},\n };\n}\n\n/**\n * Returns the collection key for the given APIv3 parameters\n *\n * @param params list params\n */\nexport function collectionKey(params:ApiV3ListParameters):string {\n return listParamsString(params);\n}\n\n/**\n * Mark a collection key as being loaded\n *\n * @param store An entity store for the collection\n * @param collectionUrl The key to insert the collection at\n * @param loading The loading state\n */\nexport function setCollectionLoading(\n store:EntityStore>,\n collectionUrl:string,\n):void {\n store.update(({ loadingCollections }) => (\n {\n loadingCollections: {\n ...loadingCollections,\n [collectionUrl]: true,\n },\n }\n ));\n}\n\n/**\n * Mark a collection key as no longer loading\n *\n * @param store An entity store for the collection\n * @param collectionUrl The key to insert the collection at\n */\nexport function removeCollectionLoading(\n store:EntityStore>,\n collectionUrl:string,\n):void {\n store.update(({ loadingCollections }) => (\n {\n loadingCollections: filter(loadingCollections, (_, key) => key !== collectionUrl),\n }\n ));\n}\n\n/**\n * Insert a collection into the given entity store\n *\n * @param store An entity store for the collection\n * @param collection A loaded collection\n * @param collectionUrl The key to insert the collection at\n */\nexport function insertCollectionIntoState(\n store:EntityStore>,\n collection:IHALCollection,\n collectionUrl:string,\n):void {\n const { elements } = collection._embedded as { elements:undefined|T[] };\n\n // Some JSON endpoints return no elements result if there are no elements\n const ids = elements?.map((el) => el.id) || [];\n\n applyTransaction(() => {\n // Avoid inserting when elements is not defined\n if (elements && elements.length > 0) {\n store.upsertMany(elements);\n }\n\n store.update(({ collections }) => (\n {\n collections: {\n ...collections,\n [collectionUrl]: {\n ids,\n },\n },\n }\n ));\n });\n}\n\nexport function removeEntityFromCollectionAndState(\n store:EntityStore>,\n entityId:ID,\n collectionUrl:string,\n):void {\n applyTransaction(() => {\n store.remove(entityId);\n store.update(({ collections }) => (\n {\n collections: {\n ...collections,\n [collectionUrl]: {\n ...collections[collectionUrl],\n ids: (collections[collectionUrl]?.ids || []).filter((id) => id !== entityId),\n },\n },\n }\n ));\n });\n}\n\nexport function collectionFrom(elements:T[]):IHALCollection {\n const count = elements.length;\n\n return {\n _type: 'Collection',\n count,\n total: count,\n pageSize: count,\n offset: 1,\n _embedded: {\n elements,\n },\n };\n}\n\n/**\n * Takes a collection of elements that do not have an ID, and extract the ID from self link.\n * @param collection a IHALCollection with elements that have a self link\n * @returns the same collection with elements extended with an ID derived from the self link.\n */\nexport function extendCollectionElementsWithId(\n collection:IHALCollection,\n):IHALCollection {\n const elements = collection._embedded.elements.map((element) => ({\n ...element,\n id: idFromLink(element._links.self.href),\n }));\n\n return {\n ...collection,\n _embedded: {\n ...collection._embedded,\n elements,\n },\n };\n}\n","import {\n EntityStore,\n StoreConfig,\n} from '@datorama/akita';\nimport {\n CollectionState,\n createInitialCollectionState,\n} from 'core-app/core/state/collection-store';\nimport { IDay } from 'core-app/core/state/days/day.model';\n\nexport interface DayState extends CollectionState {\n}\n\n@StoreConfig({ name: 'days' })\nexport class DayStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n finalize,\n map,\n take,\n tap,\n} from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport {\n ApiV3ListFilter,\n ApiV3ListParameters,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport {\n collectionKey,\n insertCollectionIntoState,\n removeCollectionLoading,\n setCollectionLoading,\n} from 'core-app/core/state/collection-store';\nimport { DayStore } from 'core-app/core/state/days/day.store';\nimport { IDay } from 'core-app/core/state/days/day.model';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\n\n@Injectable()\nexport class DayResourceService extends ResourceCollectionService {\n protected basePath():string {\n return this\n .apiV3Service\n .days\n .nonWorkingDays\n .path;\n }\n\n isNonWorkingDay$(input:Date):Promise {\n const date = moment(input).format('YYYY-MM-DD');\n\n return this\n .requireNonWorkingYear$(input)\n .pipe(\n map((days) => days.findIndex((day:IDay) => day.date === date) !== -1),\n take(1),\n )\n .toPromise();\n }\n\n requireNonWorkingYear$(date:Date|string):Observable {\n const from = moment(date).startOf('year').format('YYYY-MM-DD');\n const to = moment(date).endOf('year').format('YYYY-MM-DD');\n\n const filters:ApiV3ListFilter[] = [\n ['date', '<>d', [from, to]],\n ];\n\n return this.require({ filters });\n }\n\n requireNonWorkingYears$(start:Date|string, end:Date|string):Observable {\n const from = moment(start).startOf('year').format('YYYY-MM-DD');\n const to = moment(end).endOf('year').format('YYYY-MM-DD');\n\n const filters:ApiV3ListFilter[] = [\n ['date', '<>d', [from, to]],\n ];\n\n return this.require({ filters });\n }\n\n fetchCollection(params:ApiV3ListParameters):Observable> {\n const collectionURL = collectionKey(params);\n\n setCollectionLoading(this.store, collectionURL);\n\n return this\n .http\n .get>(this.basePath() + collectionURL)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, collectionURL)),\n finalize(() => removeCollectionLoading(this.store, collectionURL)),\n );\n }\n\n protected createStore():CollectionStore {\n return new DayStore();\n }\n}\n","import {\n EntityStore,\n StoreConfig,\n} from '@datorama/akita';\nimport {\n CollectionState,\n createInitialCollectionState,\n} from 'core-app/core/state/collection-store';\nimport { IWeekday } from 'core-app/core/state/days/weekday.model';\n\nexport interface WeekdayState extends CollectionState {\n}\n\n@StoreConfig({ name: 'weekdays' })\nexport class WeekdayStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n map,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport {\n EMPTY,\n Observable,\n} from 'rxjs';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport {\n extendCollectionElementsWithId,\n insertCollectionIntoState,\n} from 'core-app/core/state/collection-store';\nimport { WeekdayStore } from 'core-app/core/state/days/weekday.store';\nimport { IWeekday } from 'core-app/core/state/days/weekday.model';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\n\n@Injectable()\nexport class WeekdayResourceService extends ResourceCollectionService {\n require():Observable {\n return this\n .query\n .selectHasCache()\n .pipe(\n switchMap((hasCache) => (hasCache ? EMPTY : this.fetchWeekdays())),\n switchMap(() => this.query.selectAll()),\n );\n }\n\n protected fetchWeekdays():Observable> {\n const collectionURL = 'all'; // We load all weekdays\n\n return this\n .http\n .get>(this.basePath())\n .pipe(\n map((collection) => extendCollectionElementsWithId(collection)),\n tap((collection) => insertCollectionIntoState(this.store, collection, collectionURL)),\n );\n }\n\n protected createStore():CollectionStore {\n return new WeekdayStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .days\n .week\n .path;\n }\n}\n","import 'reflect-metadata';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { ActionCreator } from 'ts-action/action';\nimport { Action } from 'ts-action';\nimport { takeWhile } from 'rxjs/operators';\n\n/**\n * This interface specifies a constraint on the classes that can\n * be used as an @EffectHandler.\n *\n * As we depend on the ActionsService, we need that as a public property.\n */\nexport interface EffectClass {\n actions$:ActionsService;\n ngOnDestroy?():void;\n}\n\nconst EffectHandlers = Symbol('EffectHandlers');\n\ntype EffectHandlerItem = { callback:(action:Action) => void, action:ActionCreator };\n\n/**\n * The EffectHandler decorates a class to be used for effects callbacks\n * To use, add it to a store service like so\n *\n * ```\n * @Injectable()\n * @EffectHandler\n * export class FooStoreService {\n * @EffectCallback(someActionName)\n * private actionCallback(action:ReturnType) {\n * // Effect callback for the given action\n * }\n * }\n */\n/* The class decorator requires any[] args to it to function */\n\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\nexport function EffectHandler(constructor:T):any {\n return class extends constructor {\n private serviceDestroyed = false;\n\n /* The class decorator requires any[] args to it to function */\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n constructor(...args:any[]) {\n super(...args);\n\n // Access the handlers registered in the @EffectCallback method decorator\n // We're accessing a separate symbol on the base class that is not present\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const handlers = constructor.prototype[EffectHandlers] as Map;\n if (handlers) {\n handlers.forEach((item:EffectHandlerItem, key:string) => {\n debugLog(`[${constructor.name}] Subscribing to effect ${key}`);\n\n // Subscribe to the specified action for the duration of this service's life.\n this.actions$\n .ofType(item.action)\n .pipe(\n takeWhile(() => !this.serviceDestroyed),\n )\n .subscribe((instance) => {\n // Wrap callback in a try-catch to avoid completing the subscription.\n try {\n item.callback.call(this, instance);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n console.error(`Error thrown in effect callback ${key}: ${e}`);\n }\n });\n });\n }\n }\n\n ngOnDestroy():void {\n this.serviceDestroyed = true;\n if (super.ngOnDestroy) {\n super.ngOnDestroy();\n }\n }\n };\n}\n\n/**\n * The EffectCallback decorates a method of a `@EffectHandler` decorated class\n * to be used for effects callbacks.\n *\n * The decorator subscribes to the actionService for the given service for\n * the lifetime of the service.\n *\n * Example:\n *\n * ```\n * @Injectable()\n * @EffectHandler\n * export class FooStoreService {\n * @EffectCallback(someActionName)\n * private actionCallback(action:ReturnType) {\n * // Effect callback for the given action\n * }\n * }\n */\nexport function EffectCallback(action:ActionCreator) {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n return (service:unknown, property:string, descriptor:PropertyDescriptor):void => {\n const target = service as { [EffectHandlers]:Map };\n if (!target[EffectHandlers]) {\n // We're assigning the symbol property in the base class\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,no-param-reassign\n target[EffectHandlers] = new Map();\n }\n\n // Here we just add some information that class decorator will use\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n target[EffectHandlers].set(property, { action, callback: descriptor.value as (action:Action) => void });\n };\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { applyTransaction } from '@datorama/akita';\nimport { Injectable } from '@angular/core';\nimport { HttpHeaders } from '@angular/common/http';\nimport { from, Observable, of } from 'rxjs';\nimport {\n groupBy,\n mergeMap,\n reduce,\n switchMap,\n tap,\n} from 'rxjs/operators';\n\nimport { IFileLink, IFileLinkOriginData } from 'core-app/core/state/file-links/file-link.model';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { FileLinksStore } from 'core-app/core/state/file-links/file-links.store';\nimport { insertCollectionIntoState, removeEntityFromCollectionAndState } from 'core-app/core/state/collection-store';\nimport { CollectionStore, ResourceCollectionService } from 'core-app/core/state/resource-collection.service';\nimport { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Injectable()\nexport class FileLinksResourceService extends ResourceCollectionService {\n protected createStore():CollectionStore {\n return new FileLinksStore();\n }\n\n protected basePath():string {\n return this.apiV3Service.file_links.path;\n }\n\n updateCollectionsForWorkPackage(fileLinksSelfLink:string):Observable {\n return this.http\n .get>(fileLinksSelfLink)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, fileLinksSelfLink)),\n switchMap((collection) => from(collection._embedded.elements)),\n groupBy(\n (fileLink) => fileLink._links.storage.href,\n (fileLink) => fileLink,\n ),\n mergeMap((group$) => {\n const seed = { storage: group$.key, fileLinks: [] as IFileLink[] };\n return group$.pipe(reduce((acc, fileLink) => {\n acc.fileLinks = [...acc.fileLinks, fileLink];\n return acc;\n }, seed));\n }),\n tap((fileLinkCollections) => {\n const storageId = idFromLink(fileLinkCollections.storage);\n const collectionKey = `${fileLinksSelfLink}?filters=[{\"storage\":{\"operator\":\"=\",\"values\":[\"${storageId}\"]}}]`;\n const collection = { _embedded: { elements: fileLinkCollections.fileLinks } } as IHALCollection;\n insertCollectionIntoState(this.store, collection, collectionKey);\n }),\n reduce((acc, group) => acc.concat(group.fileLinks), [] as IFileLink[]),\n );\n }\n\n updateCollection(href:string):Observable> {\n return this.http\n .get>(href)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, href)),\n );\n }\n\n remove(collectionKey:string, fileLink:IFileLink):Observable {\n if (!fileLink._links.delete) {\n return of();\n }\n\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n return this.http\n .delete(fileLink._links.delete.href, { withCredentials: true, headers })\n .pipe(\n tap(() => removeEntityFromCollectionAndState(this.store, fileLink.id, collectionKey)),\n );\n }\n\n addFileLinks(\n collectionKey:string,\n addFileLinksHref:string,\n storage:IHalResourceLink,\n filesToLink:IFileLinkOriginData[],\n ):Observable> {\n const elements = filesToLink.map((file) => ({\n originData: { ...file },\n _links: { storage },\n }));\n\n return this.http\n .post>(addFileLinksHref, { _type: 'Collection', _embedded: { elements } })\n .pipe(\n tap((collection) => {\n applyTransaction(() => {\n const newFileLinks = collection._embedded.elements;\n this.store.add(newFileLinks);\n this.store.update(\n ({ collections }) => (\n {\n collections: {\n ...collections,\n [collectionKey]: {\n ...collections[collectionKey],\n ids: (collections[collectionKey]?.ids || []).concat(newFileLinks.map((link) => link.id)),\n },\n },\n }\n ),\n );\n });\n }),\n );\n }\n}\n","import { ID } from '@datorama/akita';\nimport {\n IHalResourceLink,\n IHalResourceLinks,\n} from 'core-app/core/state/hal-resource';\n\nexport const NOTIFICATIONS_MAX_SIZE = 100;\n\nexport interface IInAppNotificationHalResourceLinks extends IHalResourceLinks {\n actor:IHalResourceLink;\n project:IHalResourceLink;\n resource:IHalResourceLink;\n activity:IHalResourceLink;\n}\n\nexport type IInAppNotificationDetailsAttribute = 'startDate'|'dueDate'|'date';\n\nexport interface IInAppNotificationDetailsResource {\n property:IInAppNotificationDetailsAttribute;\n value:string|null;\n\n _links:{\n self:IHalResourceLink;\n schema:IHalResourceLink;\n };\n}\n\nexport interface IInAppNotificationHalResourceEmbedded {\n details:IInAppNotificationDetailsResource[];\n}\n\nexport interface INotification {\n id:ID;\n subject:string;\n createdAt:string;\n updatedAt:string;\n reason:string;\n readIAN:boolean|null;\n readEmail:boolean|null;\n\n // Mark a notification to be kept in the center even though it was saved as \"read\".\n keep?:boolean;\n // Show message of a notification?\n expanded:boolean;\n\n _links:IInAppNotificationHalResourceLinks;\n _embedded:IInAppNotificationHalResourceEmbedded;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ID } from '@datorama/akita';\nimport {\n action,\n props,\n} from 'ts-action';\n\nimport { ApiV3ListFilter } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\n\nexport const markNotificationsAsRead = action(\n '[IAN] Mark notifications as read',\n props<{ origin:string, notifications:ID[] }>(),\n);\n\nexport const markNotificationsAsReadByFilters = action(\n '[IAN] Mark notifications as read by filter',\n props<{ origin:string, filters:ApiV3ListFilter[] }>(),\n);\n\nexport const notificationsMarkedRead = action(\n '[IAN] Notifications were marked as read',\n props<{ origin:string, notifications:ID[], all:boolean }>(),\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { tap } from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { ID } from '@datorama/akita';\n\nimport {\n markNotificationsAsRead,\n markNotificationsAsReadByFilters,\n notificationsMarkedRead,\n} from 'core-app/core/state/in-app-notifications/in-app-notifications.actions';\nimport { EffectCallback, EffectHandler } from 'core-app/core/state/effects/effect-handler.decorator';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { INotification } from 'core-app/core/state/in-app-notifications/in-app-notification.model';\nimport { InAppNotificationsStore } from 'core-app/core/state/in-app-notifications/in-app-notifications.store';\nimport { CollectionStore, ResourceCollectionService } from 'core-app/core/state/resource-collection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@EffectHandler\n@Injectable()\nexport class InAppNotificationsResourceService extends ResourceCollectionService {\n @InjectField() actions$:ActionsService;\n\n update(id:ID, inAppNotification:Partial):void {\n this.store.update(id, inAppNotification);\n }\n\n markAsRead(notifications:ID[]):Observable {\n return this\n .apiV3Service\n .notifications\n .markAsReadByIds(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, all: false }))\n ));\n }\n\n @EffectCallback(markNotificationsAsReadByFilters)\n private markNotificationsAsReadByFilters(action:ReturnType) {\n return this\n .apiV3Service\n .notifications\n .markAsReadByFilter(action.filters)\n .subscribe(() => {\n this.actions$.dispatch(notificationsMarkedRead({ origin: action.origin, notifications: [], all: true }));\n });\n }\n\n protected createStore():CollectionStore {\n return new InAppNotificationsStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .notifications\n .path;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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 isNotNull(entity:T|null):entity is T {\n return entity !== null;\n}\n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { IPrincipal } from './principal.model';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\n\nexport interface PrincipalsState extends CollectionState {\n}\n\n@StoreConfig({ name: 'principals' })\nexport class PrincipalsStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n catchError,\n tap,\n} from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { applyTransaction } from '@datorama/akita';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport {\n collectionKey,\n insertCollectionIntoState,\n} from 'core-app/core/state/collection-store';\nimport { EffectHandler } from 'core-app/core/state/effects/effect-handler.decorator';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { PrincipalsStore } from './principals.store';\nimport { IPrincipal } from './principal.model';\nimport { IUser } from 'core-app/core/state/principals/user.model';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@EffectHandler\n@Injectable()\nexport class PrincipalsResourceService extends ResourceCollectionService {\n @InjectField() actions$:ActionsService;\n\n @InjectField() toastService:ToastService;\n\n fetchUser(id:string|number):Observable {\n return this.http\n .get(this.apiV3Service.users.id(id).path)\n .pipe(\n tap((data) => {\n applyTransaction(() => {\n this.store.upsertMany([data]);\n });\n }),\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n fetchPrincipals(params:ApiV3ListParameters):Observable> {\n const collectionURL = collectionKey(params);\n\n return this\n .http\n .get>(this.basePath() + collectionURL)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, collectionURL)),\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n protected createStore():CollectionStore {\n return new PrincipalsStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .principals\n .path;\n }\n}\n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\nimport { IProject } from './project.model';\n\nexport interface ProjectsState extends CollectionState {\n}\n\n@StoreConfig({ name: 'projects' })\nexport class ProjectsStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { tap } from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { IProject } from './project.model';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { ProjectsStore } from 'core-app/core/state/projects/projects.store';\n\n@Injectable()\nexport class ProjectsResourceService extends ResourceCollectionService {\n update(link:string):Observable {\n return this.http.get(link)\n .pipe(\n tap((project) => {\n this.store.upsertMany([project]);\n }),\n );\n }\n\n protected createStore():CollectionStore {\n return new ProjectsStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .projects\n .path;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n EntityStore,\n ID,\n QueryEntity,\n} from '@datorama/akita';\nimport { Observable } from 'rxjs';\nimport {\n catchError,\n filter,\n finalize,\n map,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport {\n collectionKey,\n CollectionResponse,\n CollectionState,\n insertCollectionIntoState,\n removeCollectionLoading,\n setCollectionLoading,\n} from 'core-app/core/state/collection-store';\nimport { omit } from 'lodash';\nimport isDefinedEntity from 'core-app/core/state/is-defined-entity';\nimport { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport {\n HttpClient,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport {\n Injectable,\n Injector,\n} from '@angular/core';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\n\nexport type CollectionStore = EntityStore>;\n\nexport interface ResourceCollectionLoadOptions {\n handleErrors:boolean;\n}\n\n@Injectable()\nexport abstract class ResourceCollectionService {\n protected store:CollectionStore = this.createStore();\n\n protected query = new QueryEntity(this.store);\n\n constructor(\n readonly injector:Injector,\n readonly http:HttpClient,\n readonly apiV3Service:ApiV3Service,\n readonly toastService:ToastService,\n ) {\n }\n\n /**\n * Require the results for the given filter params\n * Returns a cached set if it was loaded already.\n *\n * @param params List params to require\n * @private\n */\n public require(params:ApiV3ListParameters):Observable {\n const key = collectionKey(params);\n if (this.collectionExists(key) || this.collectionLoading(key)) {\n return this.loadedCollection(key);\n }\n\n return this\n .fetchCollection(params)\n .pipe(\n switchMap(() => this.loadedCollection(key)),\n );\n }\n\n /**\n * Retrieve a collection from the store\n *\n * @param key The collection key to fetch\n */\n collection(key:string):Observable {\n return this\n .collectionState(key)\n .pipe(\n switchMap((collection) => this.query.selectMany(collection?.ids || [])),\n );\n }\n\n /**\n * Return a collection observable that triggers only when the collection is loaded.\n * @param key\n */\n loadedCollection(key:string):Observable {\n return this\n .collectionState(key)\n .pipe(\n filter((collection) => !!collection),\n switchMap((collection:CollectionResponse) => this.query.selectMany(collection.ids)),\n );\n }\n\n /**\n * Return a collection observable that triggers only when the collection is loaded.\n * @param key\n */\n collectionState(key:string):Observable {\n return this\n .query\n .select()\n .pipe(\n map((state) => state.collections[key]),\n );\n }\n\n /**\n * Lookup a single entity from the store\n * @param id\n */\n lookup(id:ID):Observable {\n return this\n .query\n .selectEntity(id)\n .pipe(filter(isDefinedEntity));\n }\n\n /**\n * Lookup multiple entities from the store\n */\n lookupMany(ids:ID[]):Observable {\n return this\n .query\n .selectMany(ids);\n }\n\n /**\n * Checks, if the store already has a resource loaded by id.\n * @param id\n */\n exists(id:ID):boolean {\n return this.query.hasEntity(id);\n }\n\n /**\n * Checks, if the store already has a collection given the key\n */\n collectionExists(input:string|ApiV3ListParameters):boolean {\n const key = typeof input === 'string' ? input : collectionKey(input);\n return !!this\n .query\n .getValue()\n .collections[key];\n }\n\n /**\n * Checks, if the store already has a collection given the key\n */\n collectionLoading(input:string|ApiV3ListParameters):boolean {\n const key = typeof input === 'string' ? input : collectionKey(input);\n return this\n .query\n .getValue()\n .loadingCollections[key] === true;\n }\n\n /**\n * Clear a collection key\n * @param key Collection key to clear\n */\n clear(key:string):void {\n this\n .store\n .update(\n ({ collections }) => ({\n collections: omit(collections, key),\n }),\n );\n }\n\n /**\n * Update a single entity in the store\n *\n * @param id The id to update\n * @param entity A section of the entity to update\n */\n update(id:ID, entity:Partial):void {\n this.store.update(id, entity);\n }\n\n /**\n * Fetch a given collection, returning only its results\n */\n fetchResults(params:ApiV3ListParameters|string):Observable {\n return this\n .fetchCollection(params)\n .pipe(\n map((collection) => collection._embedded.elements),\n );\n }\n\n /**\n * Fetch a given collection, ensuring it is being flagged as loaded\n *\n * @param params {ApiV3ListParameters|string} collection key or list params to build collection key from\n * @param options {ResourceCollectionLoadOptions} Handle collection loading errors within the resource service\n */\n fetchCollection(\n params:ApiV3ListParameters|string,\n options:ResourceCollectionLoadOptions = { handleErrors: true },\n ):Observable> {\n const key = typeof params === 'string' ? params : collectionKey(params);\n\n setCollectionLoading(this.store, key);\n\n return this\n .http\n .get>(this.basePath() + key)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, key)),\n finalize(() => removeCollectionLoading(this.store, key)),\n catchError((error:unknown) => {\n if (options.handleErrors) {\n this.handleCollectionLoadingError(error as HttpErrorResponse, key);\n }\n\n throw error;\n }),\n );\n }\n\n /**\n * Create a new instance of this resource service's underlying store.\n * @protected\n */\n protected abstract createStore():CollectionStore;\n\n /**\n * Base path for this collection\n * @protected\n */\n protected abstract basePath():string;\n\n /**\n * By default, add a toast error in case of loading errors\n * @param error\n * @param _collectionKey\n * @protected\n */\n protected handleCollectionLoadingError(error:HttpErrorResponse, _collectionKey:string):void {\n this.toastService.addError(error);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 EntityState, EntityStore, ID, StoreConfig,\n} from '@datorama/akita';\nimport { IStorageFile } from 'core-app/core/state/storage-files/storage-file.model';\n\nexport interface IStorageFilesResponse {\n files:ID[];\n parent:ID;\n}\n\nexport interface IStorageFilesState extends EntityState {\n files:Record;\n}\n\n@StoreConfig({\n name: 'storage-files',\n resettable: true,\n})\nexport class StorageFilesStore extends EntityStore {\n constructor() {\n super({ files: {} });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { combineLatest, Observable } from 'rxjs';\nimport {\n filter, map, take, tap,\n} from 'rxjs/operators';\n\nimport { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport { StorageFilesStore } from 'core-app/core/state/storage-files/storage-files.store';\nimport { IUploadLink } from 'core-app/core/state/storage-files/upload-link.model';\nimport { IPrepareUploadLink } from 'core-app/core/state/storages/storage.model';\nimport { IStorageFiles } from 'core-app/core/state/storage-files/storage-files.model';\nimport { HttpClient } from '@angular/common/http';\nimport { ID, QueryEntity } from '@datorama/akita';\nimport { IStorageFile } from 'core-app/core/state/storage-files/storage-file.model';\nimport isDefinedEntity from 'core-app/core/state/is-defined-entity';\n\n@Injectable()\nexport class StorageFilesResourceService {\n private readonly store:StorageFilesStore = new StorageFilesStore();\n\n private readonly query = new QueryEntity(this.store);\n\n constructor(private readonly httpClient:HttpClient) {}\n\n files(link:IHalResourceLink):Observable {\n const value = this.store.getValue().files[link.href];\n if (value !== undefined) {\n return combineLatest([this.lookupMany(value.files), this.lookup(value.parent)])\n .pipe(\n map(([files, parent]):IStorageFiles => ({\n files, parent, _type: 'StorageFiles', _links: { self: link },\n })),\n take(1),\n );\n }\n\n return this.httpClient\n .get(link.href)\n .pipe(tap((storageFiles) => this.insert(storageFiles, link.href)));\n }\n\n uploadLink(link:IPrepareUploadLink):Observable {\n return this.httpClient.request(link.method, link.href, { body: link.payload });\n }\n\n reset():void {\n this.store.reset();\n }\n\n private lookup(id:ID):Observable {\n return this\n .query\n .selectEntity(id)\n .pipe(filter(isDefinedEntity));\n }\n\n private lookupMany(ids:ID[]):Observable {\n return this.query.selectMany(ids);\n }\n\n private insert(storageFiles:IStorageFiles, link:string):void {\n this.store.upsertMany([...storageFiles.files, storageFiles.parent]);\n\n const fileIds = storageFiles.files.map((file) => file.id);\n const parentId = storageFiles.parent.id;\n\n this.store.update(({ files }) => ({\n files: {\n ...files,\n [link]: {\n files: fileIds,\n parent: parentId,\n },\n },\n }));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { tap } from 'rxjs/operators';\nimport { forkJoin, Observable } from 'rxjs';\nimport { IStorage } from 'core-app/core/state/storages/storage.model';\nimport { StoragesStore } from 'core-app/core/state/storages/storages.store';\nimport { insertCollectionIntoState } from 'core-app/core/state/collection-store';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\n\n@Injectable()\nexport class StoragesResourceService extends ResourceCollectionService {\n updateCollection(key:string, storageLinks:IHalResourceLink[]):Observable {\n return forkJoin(storageLinks.map((link) => this.http.get(link.href)))\n .pipe(\n tap((storages) => {\n const storageCollection = { _embedded: { elements: storages } } as IHALCollection;\n insertCollectionIntoState(this.store, storageCollection, key);\n }),\n );\n }\n\n protected createStore():CollectionStore {\n return new StoragesStore();\n }\n\n protected basePath():string {\n return this.apiV3Service.storages.path;\n }\n}\n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\nimport { IView } from './view.model';\n\nexport interface ViewsState extends CollectionState {\n}\n\n@StoreConfig({ name: 'views' })\nexport class ViewsStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport { EffectHandler } from 'core-app/core/state/effects/effect-handler.decorator';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { ViewsStore } from 'core-app/core/state/views/views.store';\nimport { IView } from 'core-app/core/state/views/view.model';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@EffectHandler\n@Injectable()\nexport class ViewsResourceService extends ResourceCollectionService {\n @InjectField() actions$:ActionsService;\n\n protected createStore():CollectionStore {\n return new ViewsStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .views\n .path;\n }\n}\n","import { InputState, multiInput, MultiInputState, StatesGroup } from 'reactivestates';\nimport { Subject } from 'rxjs';\nimport { TypeResource } from 'core-app/features/hal/resources/type-resource';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { VersionResource } from 'core-app/features/hal/resources/version-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { StatusResource } from 'core-app/features/hal/resources/status-resource';\nimport { PlaceholderUserResource } from 'core-app/features/hal/resources/placeholder-user-resource';\nimport { RoleResource } from 'core-app/features/hal/resources/role-resource';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { PostResource } from 'core-app/features/hal/resources/post-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\n\nexport class States extends StatesGroup {\n name = 'MainStore';\n\n /* /api/v3/projects */\n projects:MultiInputState = multiInput();\n\n /* /api/v3/work_packages */\n workPackages = multiInput();\n\n /* /api/v3/wiki_pages */\n posts = multiInput();\n\n /* /api/v3/schemas */\n schemas = multiInput();\n\n /* /api/v3/types */\n types = multiInput();\n\n /* /api/v3/statuses */\n statuses = multiInput();\n\n /* /api/v3/time_entries */\n timeEntries = multiInput();\n\n /* /api/v3/versions */\n versions = multiInput();\n\n /* /api/v3/users */\n users = multiInput();\n\n /* /api/v3/placeholder_users */\n placeholderUsers = multiInput();\n\n /* /api/v3/roles */\n roles = multiInput();\n\n // Global events to isolated changes\n changes = {\n // Global subject on changes to the given query ID\n queries: new Subject(),\n };\n\n // Additional state map that can be dynamically registered.\n additional:{ [id:string]:MultiInputState } = {};\n\n forType(stateName:string):MultiInputState {\n let state = (this as any)[stateName] || this.additional[stateName];\n\n if (!state) {\n state = this.additional[stateName] = multiInput();\n }\n\n return state;\n }\n\n forResource(resource:T):InputState|undefined {\n const stateName = `${_.camelCase(resource._type)}s`;\n const state = this.forType(stateName);\n\n return state && state.get(resource.id!);\n }\n\n public add(name:string, state:MultiInputState) {\n this.additional[name] = state;\n }\n}\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\n\nexport const backlogsPageComponentSelector = 'op-backlogs-page';\n\n@Component({\n selector: backlogsPageComponentSelector,\n // Empty wrapper around legacy backlogs for CSS loading\n // that got removed in the Rails assets pipeline\n encapsulation: ViewEncapsulation.None,\n template: '',\n styleUrls: [\n './styles/backlogs.sass',\n ],\n})\nexport class BacklogsPageComponent implements OnInit {\n ngOnInit() {\n document.getElementById('projected-content')!.hidden = false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { Constructor } from '@angular/cdk/table';\nimport { SimpleResource, SimpleResourceCollection } from 'core-app/core/apiv3/paths/path-resources';\n\nexport class BcfResourcePath extends SimpleResource {\n constructor(readonly injector:Injector,\n basePath:string,\n readonly id:string|number) {\n super(basePath, id);\n }\n}\n\nexport class BcfResourceCollectionPath extends SimpleResourceCollection {\n constructor(readonly injector:Injector,\n protected basePath:string,\n segment:string,\n protected resource?:Constructor) {\n super(basePath, segment, resource);\n }\n\n public id(id:string|number):T {\n return new (this.resource || BcfResourcePath)(this.injector, this.path, id) as T;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { AfterViewInit, ChangeDetectionStrategy, Component } from '@angular/core';\nimport { BcfWpAttributeGroupComponent } from 'core-app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component';\nimport { switchMap, take } from 'rxjs/operators';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { forkJoin } from 'rxjs';\nimport { BcfViewpointItem } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint-item.interface';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\n@Component({\n templateUrl: './bcf-wp-attribute-group.component.html',\n styleUrls: ['./bcf-wp-attribute-group.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BcfNewWpAttributeGroupComponent extends BcfWpAttributeGroupComponent implements AfterViewInit {\n galleryViewpoints:BcfViewpointItem[] = [];\n\n ngAfterViewInit():void {\n if (this.viewerVisible) {\n super.ngAfterViewInit();\n\n // Save any leftover viewpoints when saving the work package\n if (isNewResource(this.workPackage)) {\n this.observeCreation();\n }\n }\n }\n\n // Because this is a new WorkPackage, in order to save the\n // viewpoints on it we need to:\n // - Wait until the WorkPackage is created\n // - Create the BCFTopic on it to save the viewpoints\n private observeCreation() {\n this.wpCreate\n .onNewWorkPackage()\n .pipe(\n this.untilDestroyed(),\n take(1),\n switchMap((wp:WorkPackageResource) => this.viewpointsService.setBcfTopic$(wp), (wp) => wp),\n switchMap((wp:WorkPackageResource) => {\n this.workPackage = wp;\n const observables = this.galleryViewpoints\n .filter((viewPointItem) => !viewPointItem.href && viewPointItem.viewpoint)\n .map((viewPointItem) => this.viewpointsService.saveViewpoint$(this.workPackage, viewPointItem.viewpoint));\n\n return forkJoin(observables);\n }),\n )\n .subscribe(() => {\n this.showIndex = this.galleryViewpoints.length - 1;\n });\n }\n\n // Disable show viewpoint functionality\n showViewpoint(_workPackage:WorkPackageResource, _index:number):void {\n\n }\n\n deleteViewpoint(workPackage:WorkPackageResource, index:number):void {\n this.galleryViewpoints = this.galleryViewpoints.filter((_, i) => i !== index);\n\n this.setViewpointsOnGallery(this.galleryViewpoints);\n }\n\n saveViewpoint():void {\n this.viewerBridge\n .getViewpoint$()\n .subscribe((viewpoint) => {\n const newViewpoint = {\n snapshotURL: viewpoint.snapshot.snapshot_data,\n viewpoint,\n };\n\n this.galleryViewpoints = [\n ...this.galleryViewpoints,\n newViewpoint,\n ];\n\n this.setViewpointsOnGallery(this.galleryViewpoints);\n\n // Select the last created viewpoint and show it\n this.showIndex = this.galleryViewpoints.length - 1;\n this.selectViewpointInGallery();\n });\n }\n\n shouldShowGroup():boolean {\n return this.createAllowed && this.viewerVisible;\n }\n\n protected actions():{ icon:string, onClick:(evt:unknown, index:number) => void, titleText:string }[] {\n // Show only delete button\n return super\n .actions()\n .filter((el) => el.icon === 'icon-delete');\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageQueryStateService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-base.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { ViewerBridgeService } from 'core-app/features/bim/bcf/bcf-viewer-bridge/viewer-bridge.service';\n\nexport const bcfCardsViewIdentifier = 'cards';\nexport const bcfViewerViewIdentifier = 'viewer';\nexport const bcfSplitViewTableIdentifier = 'splitTable';\nexport const bcfSplitViewCardsIdentifier = 'splitCards';\nexport const bcfTableViewIdentifier = 'table';\n\nexport type BcfViewState = 'cards'|'viewer'|'splitTable'|'splitCards'|'table';\n\n@Injectable()\nexport class BcfViewService extends WorkPackageQueryStateService {\n public text:{ [key:string]:string } = {\n cards: this.I18n.t('js.views.card'),\n viewer: this.I18n.t('js.ifc_models.views.viewer'),\n splitTable: this.I18n.t('js.ifc_models.views.split'),\n splitCards: this.I18n.t('js.ifc_models.views.split_cards'),\n table: this.I18n.t('js.views.list'),\n };\n\n public icon:{ [key:string]:string } = {\n cards: 'icon-view-card',\n viewer: 'icon-view-model',\n splitTable: 'icon-view-split-viewer-table',\n splitCards: 'icon-view-split2',\n table: 'icon-view-list',\n };\n\n constructor(\n private readonly I18n:I18nService,\n private readonly viewerBridgeService:ViewerBridgeService,\n protected readonly querySpace:IsolatedQuerySpace,\n ) {\n super(querySpace);\n }\n\n hasChanged(query:QueryResource):boolean {\n return this.current !== query.displayRepresentation;\n }\n\n applyToQuery(query:QueryResource):boolean {\n // eslint-disable-next-line no-param-reassign\n query.displayRepresentation = this.current;\n return true;\n }\n\n public valueFromQuery(query:QueryResource):BcfViewState|undefined {\n const dr = query.displayRepresentation;\n\n switch (dr) {\n case 'splitCards':\n case 'splitTable':\n case 'cards':\n case 'table':\n case 'viewer':\n return dr;\n default:\n return this.viewerBridgeService.shouldShowViewer ? 'splitCards' : 'cards';\n }\n }\n\n public currentViewerState():BcfViewState|undefined {\n return this.current;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BoardActionService } from 'core-app/features/boards/board/board-actions/board-action.service';\nimport { ITileViewEntry } from 'core-app/features/boards/tile-view/tile-view.component';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\n\n@Injectable({ providedIn: 'root' })\nexport class BoardActionsRegistryService {\n constructor(\n private bannersService:BannersService,\n ) {}\n\n private mapping:{ [attribute:string]:BoardActionService } = {};\n\n public add(attribute:string, service:BoardActionService):void {\n this.mapping[attribute] = service;\n }\n\n public available():ITileViewEntry[] {\n return _.map(this.mapping, (service:BoardActionService, attribute:string) => ({\n attribute,\n text: service.localizedName,\n icon: '',\n description: '',\n image: '',\n disabled: this.bannersService.eeShowBanners,\n }));\n }\n\n public get(attribute:string):BoardActionService {\n if (this.mapping[attribute]) {\n return this.mapping[attribute];\n }\n\n throw new Error(`No action service exists for ${attribute}`);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { Board } from 'core-app/features/boards/board/board';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3Filter } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\n\n@Injectable({ providedIn: 'root' })\nexport class BoardListsService {\n private v3 = this.pathHelper.api.v3;\n\n constructor(private readonly CurrentProject:CurrentProjectService,\n private readonly pathHelper:PathHelperService,\n private readonly apiV3Service:ApiV3Service,\n private readonly halResourceService:HalResourceService,\n private readonly toastService:ToastService,\n private readonly I18n:I18nService) {\n\n }\n\n private create(params:Object, filters:ApiV3Filter[]):Promise {\n const filterJson = JSON.stringify(filters);\n\n return this\n .apiV3Service\n .queries\n .form\n .loadWithParams(\n {\n pageSize: 0,\n filters: filterJson,\n },\n undefined,\n this.CurrentProject.identifier,\n this.buildQueryRequest(params),\n )\n .toPromise()\n .then(([form, query]) => {\n // When the permission to create public queries is missing, throw an error.\n // Otherwise private queries would be created.\n if (form.schema.public.writable) {\n return this\n .apiV3Service\n .queries\n .post(query, form)\n .toPromise();\n }\n throw new Error(this.I18n.t('js.boards.error_permission_missing'));\n });\n }\n\n /**\n * Add a free query to the board\n */\n public addFreeQuery(board:Board, queryParams:Object) {\n const filter = this.freeBoardQueryFilter();\n return this.addQuery(board, queryParams, [filter]);\n }\n\n /**\n * Add an empty query to the board\n * @param board\n * @param query\n */\n public async addQuery(board:Board, queryParams:Object, filters:ApiV3Filter[]):Promise {\n const count = board.queries.length;\n try {\n const query = await this.create(queryParams, filters);\n\n const source = {\n _type: 'GridWidget',\n identifier: 'work_package_query',\n startRow: 1,\n endRow: 2,\n startColumn: count + 1,\n endColumn: count + 2,\n options: {\n queryId: query.id,\n filters,\n },\n };\n\n const resource = this.halResourceService.createHalResourceOfClass(GridWidgetResource, source);\n board.addQuery(resource);\n } catch (e) {\n this.toastService.addError(e);\n console.error(e);\n }\n return board;\n }\n\n private buildQueryRequest(params:Object) {\n return {\n public: true,\n _links: {\n sortBy: [\n { href: `${this.v3.apiV3Base}/queries/sort_bys/manualSorting-asc` },\n { href: `${this.v3.apiV3Base}/queries/sort_bys/id-asc` },\n ],\n },\n ...params,\n };\n }\n\n private freeBoardQueryFilter():ApiV3Filter {\n return { manualSort: { operator: 'ow', values: [] } };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BoardListsService } from 'core-app/features/boards/board/board-list/board-lists.service';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { Board, BoardType } from 'core-app/features/boards/board/board';\nimport { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { BoardActionsRegistryService } from 'core-app/features/boards/board/board-actions/board-actions-registry.service';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\nexport interface CreateBoardParams {\n type:BoardType;\n boardName?:string;\n attribute?:string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class BoardService {\n public currentBoard$:BehaviorSubject = new BehaviorSubject(null);\n\n private loadAllPromise:Promise|undefined;\n\n private text = {\n unnamed_board: this.I18n.t('js.boards.label_unnamed_board'),\n action_board: (attr:string) => this.I18n.t('js.boards.board_type.action_by_attribute',\n { attribute: this.I18n.t(`js.boards.board_type.action_type.${attr}`) }),\n unnamed_list: this.I18n.t('js.boards.label_unnamed_list'),\n };\n\n constructor(protected apiV3Service:ApiV3Service,\n protected PathHelper:PathHelperService,\n protected CurrentProject:CurrentProjectService,\n protected halResourceService:HalResourceService,\n protected boardActions:BoardActionsRegistryService,\n protected I18n:I18nService,\n protected boardsList:BoardListsService) {\n }\n\n /**\n * Return all boards in the current scope of the project\n *\n * @param projectIdentifier\n */\n public loadAllBoards(projectIdentifier:string|null = this.CurrentProject.identifier, force = false) {\n if (!(force || this.loadAllPromise === undefined)) {\n return this.loadAllPromise;\n }\n\n return this.loadAllPromise = this\n .apiV3Service\n .boards\n .allInScope(projectIdentifier!)\n .toPromise();\n }\n\n /**\n * Check whether the current user can manage board-type grids.\n */\n public canManage(board:Board):boolean {\n return !!board.grid.$links.delete;\n }\n\n /**\n * Save the changes to the board\n */\n public save(board:Board):Observable {\n this.reorderWidgets(board);\n return this\n .apiV3Service\n .boards\n .id(board)\n .save(board);\n }\n\n /**\n * Create a new board\n * @param name\n */\n public async create(params:CreateBoardParams):Promise {\n const board = await this\n .apiV3Service\n .boards\n .create(params.type, this.boardName(params), this.CurrentProject.identifier!, params.attribute).toPromise();\n\n if (params.type === 'free') {\n await this.boardsList.addFreeQuery(board, { name: this.text.unnamed_list });\n } else {\n await this.boardActions.get(params.attribute!).addInitialColumnsForAction(board);\n }\n\n await this.save(board).toPromise();\n\n return board;\n }\n\n public delete(board:Board):Promise {\n return this\n .apiV3Service\n .boards\n .id(board)\n .delete()\n .toPromise();\n }\n\n /**\n * Build a default board name\n */\n private boardName(params:CreateBoardParams) {\n if (params.boardName) {\n return params.boardName;\n }\n\n if (params.type === 'action') {\n return this.text.action_board(params.attribute!);\n }\n\n return this.text.unnamed_board;\n }\n\n /**\n * Reorders the widgets to correspond to the available columns\n * @param board\n */\n private reorderWidgets(board:Board) {\n board.grid.columnCount = Math.max(board.grid.widgets.length, 1);\n board.grid.widgets.map((el:GridWidgetResource, index:number) => {\n el.startColumn = index + 1;\n el.endColumn = index + 2;\n return el;\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\n\n/**\n * The service is intended to store all the updates caused to a query by a user.\n * It is e.g. used to not update the board list when the current user moved a card within a list/query.\n */\n\n@Injectable()\nexport class CausedUpdatesService {\n /** contains all the updates to the query caused by modifications of the user */\n private causedUpdates:string[] = [];\n\n public includes(query:QueryResource) {\n return this.causedUpdates.includes(this.cacheValue(query));\n }\n\n public add(query:QueryResource) {\n if (this.causedUpdates.length > 100) {\n this.causedUpdates.splice(0, 90);\n }\n\n this.causedUpdates.push(this.cacheValue(query));\n }\n\n private cacheValue(query:QueryResource) {\n return query.updatedAt + query.href;\n }\n}\n","
\n \n \n
\n {{ tile.text }}\n

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

\n

\n
\n \n \n
\n
\n\n
\n
\n \n {{ text.cancel_button }}\n \n
\n
\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectorRef,\n Component,\n ElementRef,\n Inject,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { BoardType } from 'core-app/features/boards/board/board';\nimport { StateService } from '@uirouter/core';\nimport { BoardService } from 'core-app/features/boards/board/board.service';\nimport { BoardActionsRegistryService } from 'core-app/features/boards/board/board-actions/board-actions-registry.service';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { imagePath } from 'core-app/shared/helpers/images/path-helper';\nimport { ITileViewEntry } from '../tile-view/tile-view.component';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { enterpriseDocsUrl } from 'core-app/core/setup/globals/constants.const';\n\n@Component({\n templateUrl: './new-board-modal.html',\n})\nexport class NewBoardModalComponent extends OpModalComponent implements OnInit {\n @ViewChild('actionAttributeSelect', { static: true }) actionAttributeSelect:ElementRef;\n\n public showClose = true;\n\n public confirmed = false;\n\n public available = this.boardActions.available();\n\n public inFlight = false;\n\n public eeShowBanners = false;\n\n public text = {\n close_popup: this.I18n.t('js.close_popup_title'),\n\n free_board: this.I18n.t('js.boards.board_type.free'),\n free_board_text: this.I18n.t('js.boards.board_type.free_text'),\n free_board_title: this.I18n.t('js.boards.board_type.board_type_title.basic'),\n board_type: this.I18n.t('js.boards.board_type.text'),\n\n action_board: this.I18n.t('js.boards.board_type.action'),\n action_board_text: this.I18n.t('js.boards.board_type.action_text'),\n select_attribute: this.I18n.t('js.boards.board_type.select_attribute'),\n select_board_type: this.I18n.t('js.boards.board_type.select_board_type'),\n placeholder: this.I18n.t('js.placeholders.selection'),\n\n teaser_text: this.I18n.t('js.boards.upsale.teaser_text'),\n upgrade_to_ee_text: this.I18n.t('js.boards.upsale.upgrade'),\n more_info_ee_link: enterpriseDocsUrl.boards,\n cancel_button: this.I18n.t('js.button_cancel'),\n };\n\n constructor(\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly elementRef:ElementRef,\n readonly cdRef:ChangeDetectorRef,\n readonly state:StateService,\n readonly boardService:BoardService,\n readonly boardActions:BoardActionsRegistryService,\n readonly halNotification:HalResourceNotificationService,\n readonly loadingIndicatorService:LoadingIndicatorService,\n readonly I18n:I18nService,\n readonly boardActionRegistry:BoardActionsRegistryService,\n readonly bannersService:BannersService,\n readonly toastService:ToastService,\n ) {\n super(locals, cdRef, elementRef);\n this.initiateTiles();\n }\n\n ngOnInit():void {\n super.ngOnInit();\n this.eeShowBanners = this.bannersService.eeShowBanners;\n }\n\n public createBoard(attribute:string):void {\n if (attribute === 'basic') {\n this.createFree();\n } else {\n this.createAction(attribute);\n }\n }\n\n private initiateTiles() {\n this.available.unshift({\n attribute: 'basic',\n text: this.text.free_board_title,\n icon: 'icon-boards',\n description: this.text.free_board_text,\n image: imagePath('board_creation_modal/lists.svg'),\n });\n this.addIcon(this.available);\n this.addDescription(this.available);\n this.addText(this.available);\n this.addImage(this.available);\n }\n\n private createFree() {\n this.create({ type: 'free' });\n }\n\n private createAction(attribute:string):void {\n if (this.eeShowBanners) {\n this.toastService.addError(this.I18n.t('js.upsale.ee_only'));\n return;\n }\n\n this.create({ type: 'action', attribute });\n }\n\n private create(params:{ type:BoardType, attribute?:string }) {\n this.inFlight = true;\n\n this.loadingIndicatorService.modal.promise = this.boardService\n .create(params)\n .then((board) => {\n this.inFlight = false;\n this.closeMe();\n this.state.go('boards.partitioned.show', { board_id: board.id, isNew: true });\n })\n .catch((error:unknown) => {\n this.inFlight = false;\n this.halNotification.handleRawError(error);\n });\n }\n\n private addDescription(tiles:ITileViewEntry[]) {\n tiles.forEach((element) => {\n if (element.attribute !== 'basic') {\n const service = this.boardActionRegistry.get(element.attribute);\n element.description = service.description;\n }\n });\n }\n\n private addIcon(tiles:ITileViewEntry[]) {\n tiles.forEach((element) => {\n if (element.attribute !== 'basic') {\n const service = this.boardActionRegistry.get(element.attribute);\n element.icon = service.icon;\n }\n });\n }\n\n private addText(tiles:ITileViewEntry[]) {\n tiles.forEach((element) => {\n if (element.attribute !== 'basic') {\n const service = this.boardActionRegistry.get(element.attribute);\n element.text = service.text;\n }\n });\n }\n\n private addImage(tiles:ITileViewEntry[]) {\n tiles.forEach((element) => {\n if (element.attribute !== 'basic') {\n const service = this.boardActionRegistry.get(element.attribute);\n element.image = service.image;\n }\n });\n }\n}\n","import { ID } from '@datorama/akita';\nimport {\n action,\n props,\n} from 'ts-action';\n\nexport const calendarRefreshRequest = action(\n '[Calendar] Refresh calendar page due to external param changes',\n props<{ showLoading:boolean }>(),\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';\nimport { DayResourceService } from 'core-app/core/state/days/day.service';\nimport { IDay } from 'core-app/core/state/days/day.model';\n\n@Injectable()\nexport class OpCalendarService extends UntilDestroyedMixin {\n resize$ = new Subject();\n\n resizeObs:ResizeObserver;\n\n constructor(\n readonly weekdayService:WeekdayService,\n readonly dayService:DayResourceService,\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 }, nonWorkingDays:IDay[]):string[] {\n if (date) {\n // we need to find the UTC date for each date while highlighting non-wrking days on full-calendar\n const utcDate = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds());\n const formatted = moment(utcDate).format('YYYY-MM-DD');\n if (this.weekdayService.isNonWorkingDay(utcDate) || nonWorkingDays.find((el) => el.date === formatted)) {\n return ['fc-non-working-day'];\n }\n }\n return [];\n }\n}\n","import {\n Injectable,\n Injector,\n} from '@angular/core';\nimport {\n CalendarOptions,\n DatesSetArg,\n DayCellContentArg,\n DayCellMountArg,\n DayHeaderContentArg,\n EventApi,\n EventDropArg,\n SlotLabelContentArg,\n SlotLaneContentArg,\n} from '@fullcalendar/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { splitViewRoute } from 'core-app/features/work-packages/routing/split-view-routes.helper';\nimport { StateService } from '@uirouter/angular';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { Observable } from 'rxjs';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { take } from 'rxjs/operators';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport {\n QueryPropsFilter,\n UrlParamsHelperService,\n} from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { UIRouterGlobals } from '@uirouter/core';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { WorkPackagesListChecksumService } from 'core-app/features/work-packages/components/wp-list/wp-list-checksum.service';\nimport {\n EventReceiveArg,\n EventResizeDoneArg,\n} from '@fullcalendar/interaction';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\nimport * as moment from 'moment';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { isClickedWithModifier } from 'core-app/shared/helpers/link-handling/link-handling';\nimport { uiStateLinkClass } from 'core-app/features/work-packages/components/wp-fast-table/builders/ui-state-link-builder';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { WorkPackageViewContextMenu } from 'core-app/shared/components/op-context-menu/wp-context-menu/wp-view-context-menu.directive';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { OpCalendarService } from 'core-app/features/calendar/op-calendar.service';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\nimport { IDay } from 'core-app/core/state/days/day.model';\nimport { DayResourceService } from 'core-app/core/state/days/day.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 public nonWorkingDays:IDay[] = [];\n\n currentWorkPackages$:Observable = this\n .querySpace\n .results\n .values$()\n .pipe(\n take(1),\n );\n\n constructor(\n private I18n:I18nService,\n private configuration:ConfigurationService,\n private sanitizer:DomSanitizer,\n private $state:StateService,\n readonly injector:Injector,\n readonly schemaCache:SchemaCacheService,\n readonly toastService:ToastService,\n readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly wpListService:WorkPackagesListService,\n readonly wpListChecksumService:WorkPackagesListChecksumService,\n readonly urlParamsHelper:UrlParamsHelperService,\n readonly querySpace:IsolatedQuerySpace,\n readonly apiV3Service:ApiV3Service,\n readonly halResourceService:HalResourceService,\n readonly uiRouterGlobals:UIRouterGlobals,\n readonly timezoneService:TimezoneService,\n readonly halEditing:HalResourceEditingService,\n readonly wpTableSelection:WorkPackageViewSelectionService,\n readonly contextMenuService:OPContextMenuService,\n readonly calendarService:OpCalendarService,\n readonly weekdayService:WeekdayService,\n readonly dayService:DayResourceService,\n ) {\n super();\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 requireNonWorkingDays(date:Date|string) {\n this.nonWorkingDays = await this\n .dayService\n .requireNonWorkingYear$(date)\n .pipe(take(1))\n .toPromise();\n }\n\n isNonWorkingDay(date:Date|string):boolean {\n const formatted = moment(date).format('YYYY-MM-DD');\n return (this.nonWorkingDays.findIndex((el) => el.date === formatted) !== -1);\n }\n\n async updateTimeframe(\n fetchInfo:{ start:Date, end:Date, timeZone:string },\n projectIdentifier:string|undefined,\n ):Promise {\n await this.requireNonWorkingDays(fetchInfo.start);\n await this.requireNonWorkingDays(fetchInfo.end);\n\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 // 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\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 Promise.all([this\n .wpListService\n .fromQueryParams({ query_id: queryId, query_props: queryProps, }, projectIdentifier || undefined)\n .toPromise(),\n ])\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, this.nonWorkingDays),\n dayCellClassNames: (data:DayCellContentArg) => this.calendarService.applyNonWorkingDay(data, this.nonWorkingDays),\n dayGridClassNames: (data:DayCellContentArg) => this.calendarService.applyNonWorkingDay(data, this.nonWorkingDays),\n slotLaneClassNames: (data:SlotLaneContentArg) => this.calendarService.applyNonWorkingDay(data, this.nonWorkingDays),\n slotLabelClassNames: (data:SlotLabelContentArg) => this.calendarService.applyNonWorkingDay(data, this.nonWorkingDays),\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 public 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 // v6.beta3 fails to have type on the ViewAPI\n cview: (dates.view as unknown as { type:string }).type,\n },\n {\n custom: { notify: false },\n },\n );\n }\n\n updateDates(resizeInfo:EventResizeDoneArg|EventDropArg|EventReceiveArg, dragged?:boolean):ResourceChangeset {\n const workPackage = resizeInfo.event.extendedProps.workPackage as WorkPackageResource;\n const changeset = this.halEditing.edit(workPackage);\n if (!workPackage.ignoreNonWorkingDays && workPackage.duration && dragged) {\n changeset.setValue('duration', workPackage.duration);\n } else {\n const due = moment(resizeInfo.event.endStr)\n .subtract(1, 'day')\n .format('YYYY-MM-DD');\n changeset.setValue('dueDate', due);\n }\n changeset.setValue('startDate', resizeInfo.event.startStr);\n return changeset;\n }\n}\n","
\n
\n
\n \n \n\n \n \n\n
    \n \n
  • \n \n \n
  • \n
    \n
\n
\n
\n\n
\n \n \n
\n\n
\n \n
\n
\n\n \n
\n
\n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\nimport { teamPlannerPageRefresh } from 'core-app/features/team-planner/team-planner/planner/team-planner.actions';\nimport { calendarRefreshRequest } from 'core-app/features/calendar/calendar.actions';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\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 @InjectField(ActionsService) actions$:ActionsService;\n\n @ViewChild(WorkPackagesCalendarComponent, { static: true }) calendarElement:WorkPackagesCalendarComponent;\n\n text = {\n title: this.I18n.t('js.calendar.title'),\n unsaved_title: this.I18n.t('js.calendar.unsaved_title'),\n };\n\n /** Go back using back-button */\n backButtonCallback:() => void;\n\n /** Current query title to render */\n selectedTitle = this.text.unsaved_title;\n\n filterContainerDefinition:DynamicComponentDefinition = {\n component: WorkPackageFilterContainerComponent,\n };\n\n /** We need to pass the correct partition state to the view to manage the grid */\n currentPartition:ViewPartitionState = '-split';\n\n /** Show a toolbar */\n showToolbar = true;\n\n /** Toolbar is not editable */\n titleEditingEnabled = false;\n\n /** Saveable */\n showToolbarSaveButton = true;\n\n /** Toolbar is always enabled */\n toolbarDisabled = false;\n\n /** Define the buttons shown in the toolbar */\n toolbarButtonComponents:ToolbarButtonComponentDefinition[] = [\n {\n component: OpProjectIncludeComponent,\n },\n {\n component: WorkPackageFilterButtonComponent,\n },\n {\n component: ZenModeButtonComponent,\n },\n {\n component: WorkPackageSettingsButtonComponent,\n containerClasses: 'hidden-for-mobile',\n show: ():boolean => this.authorisationService.can('query', 'updateImmediately'),\n inputs: {\n hideTableOptions: true,\n },\n },\n ];\n\n /**\n * We need to set the current partition to the grid to ensure\n * either side gets expanded to full width if we're not in '-split' mode.\n *\n * @param state The current or entering state\n */\n setPartition(state:{ data:{ partition?:ViewPartitionState } }):void {\n this.currentPartition = state.data?.partition || '-split';\n }\n\n protected staticQueryName(_query:QueryResource):string {\n return this.text.unsaved_title;\n }\n\n /**\n * @protected\n */\n protected loadInitialQuery():void {\n // We never load the initial query as the calendar service does all that.\n }\n\n /**\n * Instead of refreshing the query space diretly, send an effect so fullcalendar can reload individually\n */\n refresh(visibly = false, _firstPage = false):void {\n this.actions$.dispatch(calendarRefreshRequest({ showLoading: visibly }));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport {\n CalendarOptions,\n DateSelectArg,\n EventClickArg,\n EventDropArg,\n EventInput,\n ToolbarInput,\n} from '@fullcalendar/core';\nimport { FullCalendarComponent } 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 { 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 { 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, {\n EventDragStartArg,\n EventDragStopArg,\n EventResizeDoneArg,\n} from '@fullcalendar/interaction';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { splitViewRoute } from 'core-app/features/work-packages/routing/split-view-routes.helper';\nimport {\n CalendarViewEvent,\n OpWorkPackagesCalendarService,\n} from 'core-app/features/calendar/op-work-packages-calendar.service';\nimport { OpCalendarService } from 'core-app/features/calendar/op-calendar.service';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\nimport { DayResourceService } from 'core-app/core/state/days/day.service';\nimport {\n EffectCallback,\n EffectHandler,\n} from 'core-app/core/state/effects/effect-handler.decorator';\nimport { calendarRefreshRequest } from 'core-app/features/calendar/calendar.actions';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport {\n addBackgroundEvents,\n removeBackgroundEvents,\n} from 'core-app/features/team-planner/team-planner/planner/background-events';\n\n@EffectHandler\n@Component({\n templateUrl: './wp-calendar.template.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./wp-calendar.sass'],\n selector: 'op-wp-calendar',\n providers: [\n OpWorkPackagesCalendarService,\n OpCalendarService,\n ],\n})\nexport class WorkPackagesCalendarComponent extends UntilDestroyedMixin implements OnInit {\n @ViewChild(FullCalendarComponent) ucCalendar:FullCalendarComponent;\n\n @ViewChild('ucCalendar', { read: ElementRef })\n set ucCalendarElement(v:ElementRef|undefined) {\n this.calendar.resizeObserver(v);\n }\n\n @Input() static = false;\n\n calendarOptions$ = new Subject();\n\n private alreadyLoaded = false;\n\n text = {\n cannot_drag_to_non_working_day: this.I18n.t('js.team_planner.cannot_drag_to_non_working_day'),\n };\n\n constructor(\n readonly actions$:ActionsService,\n readonly states:States,\n readonly $state:StateService,\n readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly wpListService:WorkPackagesListService,\n readonly querySpace:IsolatedQuerySpace,\n readonly schemaCache:SchemaCacheService,\n private element:ElementRef,\n readonly i18n:I18nService,\n readonly toastService:ToastService,\n private sanitizer:DomSanitizer,\n private I18n:I18nService,\n private configuration:ConfigurationService,\n readonly calendar:OpCalendarService,\n readonly workPackagesCalendar:OpWorkPackagesCalendarService,\n readonly currentProject:CurrentProjectService,\n readonly halEditing:HalResourceEditingService,\n readonly halNotification:HalResourceNotificationService,\n readonly weekdayService:WeekdayService,\n readonly dayService:DayResourceService,\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.initializeCalendar();\n }\n\n public async calendarEventsFunction(\n fetchInfo:{ start:Date, end:Date, timeZone:string },\n successCallback:(events:EventInput[]) => void,\n ):Promise {\n await this.workPackagesCalendar.updateTimeframe(fetchInfo, this.currentProject.identifier || undefined);\n\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\n // eslint-disable-next-line @angular-eslint/use-lifecycle-interface\n ngOnDestroy():void {\n super.ngOnDestroy();\n this.calendar.resizeObs?.disconnect();\n }\n\n private initializeCalendar() {\n const additionalOptions:{ [key:string]:unknown } = {\n height: '100%',\n headerToolbar: this.buildHeader(),\n eventSources: [\n {\n id: 'work_packages',\n events: this.calendarEventsFunction.bind(this) as unknown,\n },\n {\n events: [],\n id: 'background',\n color: 'red',\n background: 'red',\n textColor: 'white',\n display: 'background',\n editable: false,\n },\n ],\n plugins: [\n dayGridPlugin,\n interactionPlugin,\n ],\n // DnD configuration\n selectable: true,\n select: this.handleDateClicked.bind(this) as unknown,\n eventResizableFromStart: true,\n editable: true,\n eventDidMount: (evt:CalendarViewEvent) => {\n const { el, event } = evt;\n if (event.source?.id === 'background') {\n return;\n }\n const workPackage = event.extendedProps.workPackage as WorkPackageResource;\n el.dataset.workPackageId = workPackage.id as string;\n },\n eventResize: (resizeInfo:EventResizeDoneArg) => {\n const due = moment(resizeInfo.event.endStr).subtract(1, 'day').toDate();\n const start = moment(resizeInfo.event.startStr).toDate();\n const wp = resizeInfo.event.extendedProps.workPackage as WorkPackageResource;\n if (!wp.ignoreNonWorkingDays && (this.weekdayService.isNonWorkingDay(start) || this.weekdayService.isNonWorkingDay(due)\n || this.workPackagesCalendar.isNonWorkingDay(start) || this.workPackagesCalendar.isNonWorkingDay(due))) {\n this.toastService.addError(this.text.cannot_drag_to_non_working_day);\n resizeInfo?.revert();\n return;\n }\n void this.updateEvent(resizeInfo, false);\n },\n eventDrop: (dropInfo:EventDropArg) => {\n const start = moment(dropInfo.event.startStr).toDate();\n const wp = dropInfo.event.extendedProps.workPackage as WorkPackageResource;\n if (!wp.ignoreNonWorkingDays && (this.weekdayService.isNonWorkingDay(start) || this.workPackagesCalendar.isNonWorkingDay(start))) {\n this.toastService.addError(this.text.cannot_drag_to_non_working_day);\n dropInfo?.revert();\n return;\n }\n void this.updateEvent(dropInfo, true);\n },\n eventResizeStart: (resizeInfo:EventResizeDoneArg) => {\n const wp = resizeInfo.event.extendedProps.workPackage as WorkPackageResource;\n if (!wp.ignoreNonWorkingDays) {\n this.addBackgroundEventsForNonWorkingDays();\n }\n },\n eventResizeStop: () => removeBackgroundEvents(this.ucCalendar.getApi()),\n eventDragStart: (dragInfo:EventDragStartArg) => {\n const wp = dragInfo.event.extendedProps.workPackage as WorkPackageResource;\n if (!wp.ignoreNonWorkingDays) {\n this.addBackgroundEventsForNonWorkingDays();\n }\n },\n eventDragStop: (dragInfo:EventDragStopArg) => {\n const { el } = dragInfo;\n el.style.removeProperty('pointer-events');\n removeBackgroundEvents(this.ucCalendar.getApi());\n },\n eventClick: (evt:EventClickArg) => {\n const workPackageId = (evt.event.extendedProps.workPackage as WorkPackageResource).id as string;\n // Currently the calendar widget is shown on multiple pages,\n // but only the calendar module itself is a partitioned query space which can deal with a split screen request\n if (this.$state.includes('calendar')) {\n this.workPackagesCalendar.openSplitView(workPackageId);\n } else {\n void this.$state.go(\n 'work-packages.show',\n { workPackageId },\n );\n }\n },\n };\n\n if (this.static) {\n additionalOptions.initialView = 'dayGridWeek';\n }\n\n void Promise.all([\n this.configuration.initialized,\n this.weekdayService.loadWeekdays().toPromise(),\n ])\n .then(() => {\n this.calendarOptions$.next(\n this.workPackagesCalendar.calendarOptions(additionalOptions),\n );\n });\n }\n\n public buildHeader():false|ToolbarInput|undefined {\n if (this.static) {\n return false;\n }\n return {\n right: 'dayGridMonth,dayGridWeek',\n center: 'title',\n left: 'prev,next today',\n };\n }\n\n public openContextMenu(event:MouseEvent):void {\n const eventContainer = (event.target as HTMLElement).closest('.fc-event') as HTMLElement|undefined;\n if (!eventContainer) {\n return;\n }\n\n const workPackageId = eventContainer.dataset.workPackageId as string;\n this.workPackagesCalendar.showEventContextMenu({ workPackageId, event });\n }\n\n private updateResults(collection:WorkPackageCollectionResource) {\n this.workPackagesCalendar.warnOnTooManyResults(collection, this.static);\n return this.mapToCalendarEvents(collection.elements);\n }\n\n private mapToCalendarEvents(workPackages:WorkPackageResource[]) {\n return workPackages.map((workPackage:WorkPackageResource) => {\n const startDate = this.workPackagesCalendar.eventDate(workPackage, 'start');\n const endDate = this.workPackagesCalendar.eventDate(workPackage, 'due');\n\n const exclusiveEnd = moment(endDate).add(1, 'days').format('YYYY-MM-DD');\n\n return {\n title: workPackage.subject,\n start: startDate,\n editable: this.workPackagesCalendar.eventDurationEditable(workPackage),\n end: exclusiveEnd,\n allDay: true,\n className: `__hl_background_type_${workPackage.type.id || ''}`,\n workPackage,\n };\n });\n }\n\n private async updateEvent(info:EventResizeDoneArg|EventDropArg, dragged:boolean):Promise {\n const changeset = this.workPackagesCalendar.updateDates(info, dragged);\n\n try {\n const result = await this.halEditing.save(changeset);\n this.halNotification.showSave(result.resource, result.wasNew);\n } catch (e) {\n this.halNotification.handleRawError(e, changeset.projectedResource);\n info.revert();\n }\n }\n\n private handleDateClicked(info:DateSelectArg) {\n const due = moment(info.endStr).subtract(1, 'day').toDate();\n const nonWorkingDays = this.weekdayService.isNonWorkingDay(info.start) || this.weekdayService.isNonWorkingDay(due)\n || this.workPackagesCalendar.isNonWorkingDay(info.start) || this.workPackagesCalendar.isNonWorkingDay(due);\n\n const defaults = {\n startDate: info.startStr,\n dueDate: this.workPackagesCalendar.getEndDateFromTimestamp(info.endStr),\n ignoreNonWorkingDays: nonWorkingDays,\n };\n\n void this.$state.go(\n splitViewRoute(this.$state, 'new'),\n {\n defaults,\n tabIdentifier: 'overview',\n },\n );\n }\n\n @EffectCallback(calendarRefreshRequest)\n reloadOnRefreshRequest():void {\n this.ucCalendar.getApi().refetchEvents();\n }\n\n private addBackgroundEventsForNonWorkingDays() {\n addBackgroundEvents(\n this.ucCalendar.getApi(),\n (date) => this.weekdayService.isNonWorkingDay(date) || this.workPackagesCalendar.isNonWorkingDay(date),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\nexport class EEActiveTrialBase extends UntilDestroyedMixin {\n public text = {\n label_email: this.I18n.t('js.label_email'),\n label_expires_at: this.I18n.t('js.admin.enterprise.trial.form.label_expires_at'),\n label_maximum_users: this.I18n.t('js.admin.enterprise.trial.form.label_maximum_users'),\n label_company: this.I18n.t('js.admin.enterprise.trial.form.label_company'),\n label_domain: this.I18n.t('js.admin.enterprise.trial.form.label_domain'),\n label_starts_at: this.I18n.t('js.admin.enterprise.trial.form.label_starts_at'),\n label_subscriber: this.I18n.t('js.admin.enterprise.trial.form.label_subscriber'),\n text_expired: this.I18n.t('js.admin.enterprise.text_expired'),\n text_reprieve_days_left: (days:number) => this.I18n.t('js.admin.enterprise.text_reprieve_days_left', { days }),\n };\n\n constructor(readonly I18n:I18nService) {\n super();\n }\n}\n","export interface LocalizedLinkMap {\n [key:string]:string;\n\n en:string;\n}\n\n/**\n * Return the matching link for the current locale\n *\n * @param map A hash of locale => URL to use\n */\nexport function localizeLink(map:LocalizedLinkMap) {\n const { locale } = I18n;\n\n return map[locale] || map.en;\n}\n","
\n
\n \n
\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n \n \n
\n
\n \n
\n
\n \n \n \n \n
\n
\n \n
\n
\n
\n

\n

\n
\n \n
\n
\n \n
\n
\n
\n
\n \n
\n
\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n} from '@angular/core';\nimport {\n UntypedFormBuilder,\n Validators,\n} from '@angular/forms';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { EnterpriseTrialService } from 'core-app/features/enterprise/enterprise-trial.service';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { localizeLink } from 'core-app/shared/helpers/i18n/localized-link';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { IEnterpriseData } from 'core-app/features/enterprise/enterprise-trial.model';\n\nconst newsletterURL = 'https://www.openproject.org/newsletter/';\n\n@Component({\n selector: 'enterprise-trial-form',\n templateUrl: './ee-trial-form.component.html',\n styleUrls: ['./ee-trial-form.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EETrialFormComponent {\n // Retain used values\n userData:Partial = this.eeTrialService.current.data || {};\n\n // The current request host\n requestHost = window.location.host;\n\n // The configured host name\n configuredHost = this.configurationService.hostName;\n\n trialForm = this.formBuilder.group({\n company: [this.userData.company, Validators.required],\n first_name: [this.userData.first_name, Validators.required],\n last_name: [this.userData.last_name, Validators.required],\n email: ['', [Validators.required, Validators.email]],\n domain: [this.userData.domain || this.configuredHost, Validators.required],\n general_consent: [null, Validators.required],\n newsletter_consent: null,\n language: this.currentUserService.language,\n });\n\n public text = {\n general_consent: this.I18n.t('js.admin.enterprise.trial.form.general_consent', {\n link_terms: localizeLink({\n en: 'https://www.openproject.org/terms-of-service/',\n de: 'https://www.openproject.org/de/nutzungsbedingungen/',\n }),\n link_privacy: localizeLink({\n en: 'https://www.openproject.org/data-privacy-and-security/',\n de: 'https://www.openproject.org/de/datenschutz/',\n }),\n }),\n label_test_ee: this.I18n.t('js.admin.enterprise.trial.form.test_ee'),\n label_company: this.I18n.t('js.admin.enterprise.trial.form.label_company'),\n label_first_name: this.I18n.t('js.admin.enterprise.trial.form.label_first_name'),\n label_last_name: this.I18n.t('js.admin.enterprise.trial.form.label_last_name'),\n label_email: this.I18n.t('js.label_email'),\n label_domain: this.I18n.t('js.admin.enterprise.trial.form.label_domain'),\n domain_mismatch: this.I18n.t('js.admin.enterprise.trial.form.domain_mismatch'),\n privacy_policy: this.I18n.t('js.admin.enterprise.trial.form.privacy_policy'),\n receive_newsletter: this.I18n.t('js.admin.enterprise.trial.form.receive_newsletter', { link: newsletterURL }),\n terms_of_service: this.I18n.t('js.admin.enterprise.trial.form.terms_of_service'),\n };\n\n constructor(\n readonly elementRef:ElementRef,\n readonly I18n:I18nService,\n readonly formBuilder:UntypedFormBuilder,\n readonly currentUserService:CurrentUserService,\n readonly configurationService:ConfigurationService,\n readonly eeTrialService:EnterpriseTrialService,\n ) {\n }\n\n // checks if mail is valid after input field was edited by the user\n // displays message for user\n public checkMailField():void {\n const data = this.trialForm.value as IEnterpriseData;\n if (data.email !== '' && this.trialForm.controls.email.errors) {\n this.eeTrialService.store.update({ emailInvalid: true });\n } else {\n this.eeTrialService.store.update({ emailInvalid: false, error: undefined });\n }\n }\n}\n","
\n
\n\n
\n\n
\n \n
\n \n
\n \n
\n \n
\n \n
\n
\n
\n {{ text.quick_overview }}\n
\n
\n \n
\n
\n
\n
\n\n \n
\n
\n \n \n
\n \n
\n \n \n
\n
\n
\n
\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Inject,\n Input,\n ViewChild,\n} from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { EETrialFormComponent } from 'core-app/features/enterprise/enterprise-modal/enterprise-trial-form/ee-trial-form.component';\nimport { EnterpriseTrialService } from 'core-app/features/enterprise/enterprise-trial.service';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nexport const eeOnboardingVideoURL = 'https://www.youtube.com/embed/zLMSydhFSkw?autoplay=1';\n\n@Component({\n selector: 'enterprise-trial-modal',\n templateUrl: './enterprise-trial.modal.html',\n styleUrls: ['./enterprise-trial.modal.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EnterpriseTrialModalComponent extends OpModalComponent implements AfterViewInit {\n @ViewChild(EETrialFormComponent, { static: false }) formComponent:EETrialFormComponent;\n\n @Input() public opReferrer:string;\n\n public trialForm:UntypedFormGroup;\n\n public trustedEEVideoURL:SafeResourceUrl;\n\n public text = {\n button_submit: this.I18n.t('js.modals.button_submit'),\n button_cancel: this.I18n.t('js.modals.button_cancel'),\n button_continue: this.I18n.t('js.button_continue'),\n close_popup: this.I18n.t('js.close_popup_title'),\n heading_confirmation: this.I18n.t('js.admin.enterprise.trial.confirmation'),\n heading_next_steps: this.I18n.t('js.admin.enterprise.trial.next_steps'),\n heading_test_ee: this.I18n.t('js.admin.enterprise.trial.test_ee'),\n quick_overview: this.I18n.t('js.admin.enterprise.trial.quick_overview'),\n };\n\n headerText$:Observable = this\n .eeTrialService\n .observe$\n .pipe(\n map(({ status }) => {\n if (status === 'mailSubmitted') {\n return this.text.heading_confirmation;\n }\n\n if (status === 'startTrial') {\n return this.text.heading_next_steps;\n }\n\n return this.text.heading_test_ee;\n }),\n );\n\n showState$ = this\n .eeTrialService\n .observe$\n .pipe(\n map(({ status, cancelled }) => {\n if (!status || cancelled) {\n return 'trial-form';\n }\n if (status === 'mailSubmitted' && !cancelled) {\n return 'trial-waiting';\n }\n\n return 'overview';\n }),\n );\n\n constructor(readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n readonly domSanitizer:DomSanitizer,\n public eeTrialService:EnterpriseTrialService) {\n super(locals, cdRef, elementRef);\n this.trustedEEVideoURL = this.trustedURL(eeOnboardingVideoURL);\n }\n\n ngAfterViewInit():void {\n this.trialForm = this.formComponent.trialForm;\n }\n\n // checks if form is valid and submits it\n public onSubmit():void {\n if (this.trialForm.valid) {\n this.trialForm.addControl('_type', new UntypedFormControl('enterprise-trial'));\n void this.eeTrialService.sendForm(this.trialForm);\n }\n }\n\n public startEnterpriseTrial():void {\n // open onboarding modal screen\n this.eeTrialService.setStartTrialStatus();\n }\n\n public closeModal(event:Event):void {\n this.closeMe(event);\n\n const { status, confirmed } = this.eeTrialService.current;\n // refresh page to show enterprise trial\n if (status === 'startTrial' || confirmed) {\n window.location.reload();\n } else if (status === 'mailSubmitted') {\n window.location.reload();\n return;\n }\n\n this.eeTrialService.store.update({ modalOpen: false });\n }\n\n public trustedURL(url:string):SafeResourceUrl {\n return this.domSanitizer.bypassSecurityTrustResourceUrl(url);\n }\n}\n","
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n \n \n
\n
\n
\n
\n
","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectorRef,\n Component,\n ElementRef,\n OnInit,\n} from '@angular/core';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { EnterpriseTrialService } from 'core-app/features/enterprise/enterprise-trial.service';\nimport {\n HttpClient,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport { EEActiveTrialBase } from 'core-app/features/enterprise/enterprise-active-trial/ee-active-trial.base';\nimport { GonService } from 'core-app/core/gon/gon.service';\nimport { EXTERNAL_REQUEST_HEADER } from 'core-app/features/hal/http/openproject-header-interceptor';\nimport { IEnterpriseData } from 'core-app/features/enterprise/enterprise-trial.model';\n\n@Component({\n selector: 'enterprise-active-trial',\n templateUrl: './ee-active-trial.component.html',\n styleUrls: ['./ee-active-trial.component.sass'],\n})\nexport class EEActiveTrialComponent extends EEActiveTrialBase implements OnInit {\n public subscriber:string;\n\n public email:string;\n\n public company:string;\n\n public domain:string;\n\n public userCount:string;\n\n public startsAt:string;\n\n public expiresAt:string;\n\n constructor(readonly elementRef:ElementRef,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n readonly http:HttpClient,\n readonly Gon:GonService,\n public eeTrialService:EnterpriseTrialService) {\n super(I18n);\n }\n\n ngOnInit() {\n if (!this.subscriber) {\n void this.eeTrialService.userData$\n .pipe(\n distinctUntilChanged(),\n this.untilDestroyed(),\n )\n .subscribe((data:IEnterpriseData) => {\n this.formatUserData(data);\n this.cdRef.detectChanges();\n });\n\n this.initialize();\n }\n }\n\n private initialize():void {\n const eeTrialKey = this.Gon.get('ee_trial_key') as { value:string }|undefined;\n const { data } = this.eeTrialService.current;\n\n if (eeTrialKey && !data) {\n // after reload: get data from Augur using the trial key saved in gon\n const trialLink = `${this.eeTrialService.baseUrlAugur}/public/v1/trials/${eeTrialKey.value}`;\n this.eeTrialService.store.update({ trialLink });\n this.getUserDataFromAugur(trialLink);\n }\n }\n\n // use the trial key saved in the db\n // to get the user data from Augur\n private getUserDataFromAugur(trialLink:string) {\n this\n .http\n .get(\n `${trialLink}/details`,\n {\n headers: {\n [EXTERNAL_REQUEST_HEADER]: 'true',\n },\n },\n )\n .toPromise()\n .then((data:IEnterpriseData) => {\n this.eeTrialService.store.update({ data });\n this.eeTrialService.retryConfirmation();\n })\n .catch(() => {\n // Check whether the mail has been confirmed by now\n this.eeTrialService.getToken();\n });\n }\n\n private formatUserData(userForm:IEnterpriseData) {\n this.subscriber = `${userForm.first_name} ${userForm.last_name}`;\n this.email = userForm.email;\n this.company = userForm.company;\n this.domain = userForm.domain;\n }\n}\n","\n \n\n

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

\n

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

\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component,\n ElementRef,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { EnterpriseTrialService } from 'core-app/features/enterprise/enterprise-trial.service';\nimport { HttpClient } from '@angular/common/http';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { EXTERNAL_REQUEST_HEADER } from 'core-app/features/hal/http/openproject-header-interceptor';\nimport { IEnterpriseData } from 'core-app/features/enterprise/enterprise-trial.model';\n\n@Component({\n selector: 'enterprise-trial-waiting',\n templateUrl: './ee-trial-waiting.component.html',\n styleUrls: ['./ee-trial-waiting.component.sass'],\n})\nexport class EETrialWaitingComponent implements OnInit {\n created = this.timezoneService.formattedDate(new Date().toString());\n\n email = '';\n\n public text = {\n confirmation_info: (date:string, email:string) => this.I18n.t('js.admin.enterprise.trial.confirmation_info', {\n date,\n email,\n }),\n resend: this.I18n.t('js.admin.enterprise.trial.resend_link'),\n resend_success: this.I18n.t('js.admin.enterprise.trial.resend_success'),\n resend_warning: this.I18n.t('js.admin.enterprise.trial.resend_warning'),\n session_timeout: this.I18n.t('js.admin.enterprise.trial.session_timeout'),\n status_confirmed: this.I18n.t('js.admin.enterprise.trial.status_confirmed'),\n status_label: this.I18n.t('js.admin.enterprise.trial.status_label'),\n status_waiting: this.I18n.t('js.admin.enterprise.trial.status_waiting'),\n };\n\n constructor(readonly elementRef:ElementRef,\n readonly I18n:I18nService,\n protected http:HttpClient,\n protected toastService:ToastService,\n public eeTrialService:EnterpriseTrialService,\n readonly timezoneService:TimezoneService) {\n }\n\n ngOnInit():void {\n const eeTrialKey = window.gon.ee_trial_key as { created:string }|undefined;\n if (eeTrialKey) {\n const savedDateStr = eeTrialKey.created.split(' ')[0];\n this.created = this.timezoneService.formattedDate(savedDateStr);\n }\n\n this.eeTrialService\n .userData$\n .pipe(\n distinctUntilChanged(),\n )\n .subscribe((data:IEnterpriseData) => {\n this.email = data.email;\n });\n }\n\n // resend mail if resend link has been clicked\n public resendMail():void {\n const { resendLink } = this.eeTrialService.store.getValue();\n\n if (!resendLink) {\n return;\n }\n\n this.eeTrialService.store.update({ cancelled: false });\n this.http.post(\n resendLink,\n {},\n {\n headers: {\n [EXTERNAL_REQUEST_HEADER]: 'true',\n },\n },\n )\n .toPromise()\n .then(() => {\n this.toastService.addSuccess(this.text.resend_success);\n this.eeTrialService.retryConfirmation();\n })\n .catch(() => {\n const { trialLink } = this.eeTrialService.store.getValue();\n if (trialLink) {\n // Check whether the mail has been confirmed by now\n this.eeTrialService.getToken();\n } else {\n this.toastService.addError(this.text.resend_warning);\n }\n });\n }\n}\n","import {\n Store,\n StoreConfig,\n} from '@datorama/akita';\nimport { IEnterpriseTrial } from 'core-app/features/enterprise/enterprise-trial.model';\n\nexport function createInitialState():IEnterpriseTrial {\n return {\n modalOpen: false,\n confirmed: false,\n cancelled: false,\n emailInvalid: false,\n };\n}\n\n@StoreConfig({ name: 'enterprise-trial' })\nexport class EnterpriseTrialStore extends Store {\n constructor() {\n super(createInitialState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { UntypedFormGroup } from '@angular/forms';\nimport {\n HttpClient,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport { Query } from '@datorama/akita';\nimport {\n filter,\n map,\n shareReplay,\n} from 'rxjs/operators';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { EXTERNAL_REQUEST_HEADER } from 'core-app/features/hal/http/openproject-header-interceptor';\nimport { EnterpriseTrialStore } from 'core-app/features/enterprise/enterprise-trial.store';\nimport { GonType } from 'core-app/core/gon/gon.service';\nimport {\n EnterpriseTrialErrorHalResource,\n EnterpriseTrialHalResource,\n IEnterpriseData,\n IEnterpriseTrial,\n} from 'core-app/features/enterprise/enterprise-trial.model';\nimport isDefinedEntity from 'core-app/core/state/is-defined-entity';\n\n@Injectable()\nexport class EnterpriseTrialService {\n readonly store = new EnterpriseTrialStore();\n\n private query = new Query(this.store);\n\n confirmed$ = this.query.select('confirmed');\n\n cancelled$ = this.query.select('cancelled');\n\n status$ = this.query.select('status');\n\n observe$ = this.query.select();\n\n userData$ = this.query\n .select('data')\n .pipe(filter(isDefinedEntity));\n\n emailError$ = this\n .query\n .select()\n .pipe(\n map(({ error, emailInvalid }) => {\n if (emailInvalid) {\n return this.text.invalid_email;\n }\n\n const errorResponse = error?.error as { identifier?:string };\n if (error && errorResponse.identifier === 'user_already_created_trial') {\n return this.text.taken_email;\n }\n return null;\n }),\n shareReplay(1),\n );\n\n domainTaken$ = this\n .query\n .select()\n .pipe(\n map(({ error }) => {\n const errorResponse = error?.error as { identifier?:string };\n if (error && errorResponse.identifier === 'domain_taken') {\n return this.text.taken_domain;\n }\n return null;\n }),\n shareReplay(1),\n );\n\n public readonly baseUrlAugur:string;\n\n public readonly tokenVersion:string;\n\n public text = {\n invalid_email: this.I18n.t('js.admin.enterprise.trial.form.invalid_email'),\n taken_email: this.I18n.t('js.admin.enterprise.trial.form.taken_email'),\n taken_domain: this.I18n.t('js.admin.enterprise.trial.form.taken_domain'),\n };\n\n constructor(readonly I18n:I18nService,\n protected http:HttpClient,\n readonly pathHelper:PathHelperService,\n protected toastService:ToastService) {\n const gon = window.gon as (GonType&{ augur_url:string, token_version:string, ee_trial_key?:string });\n this.baseUrlAugur = gon.augur_url;\n this.tokenVersion = gon.token_version;\n\n if (gon.ee_trial_key) {\n this.setMailSubmittedStatus();\n }\n }\n\n // send POST request with form object\n // receive an enterprise trial link to access a token\n public sendForm(form:UntypedFormGroup):Promise {\n const request:unknown = { ...form.value, token_version: this.tokenVersion };\n return this.http\n .post(\n `${this.baseUrlAugur}/public/v1/trials`,\n request,\n {\n headers: {\n [EXTERNAL_REQUEST_HEADER]: 'true',\n },\n },\n )\n .toPromise()\n .then((enterpriseTrial:EnterpriseTrialHalResource) => {\n const trialLink = enterpriseTrial._links.self.href;\n const data = form.value as IEnterpriseData;\n\n this.store.update({\n trialLink,\n data,\n cancelled: false,\n });\n\n void this.saveTrialKey(trialLink);\n this.retryConfirmation();\n })\n .catch((error:HttpErrorResponse) => {\n // mail is invalid or user already created a trial\n if (error.status === 422 || error.status === 400) {\n this.store.update({ error });\n } else {\n const description = (error.error as { description?:string }).description;\n this.toastService.addWarning(description || I18n.t('js.error.internal'));\n }\n });\n }\n\n // get a token from the trial link if user confirmed mail\n public getToken():void {\n // 2) GET /public/v1/trials/:id\n this.http.get(\n this.store.getValue().trialLink as string,\n {\n headers: {\n [EXTERNAL_REQUEST_HEADER]: 'true',\n },\n },\n )\n .toPromise()\n .then(async (res:{ token_retrieved?:boolean, token:string }) => {\n // show confirmed status and enable continue btn\n this.store.update({ confirmed: true });\n\n // returns token if mail was confirmed\n // -> if token is new (token_retrieved: false) save token in backend\n if (!res.token_retrieved) {\n await this.saveToken(res.token);\n }\n })\n .catch((error:HttpErrorResponse) => {\n const errorResponse = error.error as EnterpriseTrialErrorHalResource;\n // returns error 422 while waiting of confirmation\n if (error.status === 422 && errorResponse.identifier === 'waiting_for_email_verification') {\n // get resend button link\n const resendLink = errorResponse._links.resend.href;\n this.store.update({ resendLink });\n\n const { status, cancelled } = this.store.getValue();\n\n // save a key for the requested trial\n if (!status || cancelled) { // only do it once\n void this.saveTrialKey(resendLink);\n }\n // open next modal window -> status waiting\n this.setMailSubmittedStatus();\n this.store.update({ confirmed: false });\n } else if (errorResponse?.message) {\n this.toastService.addError(errorResponse.message);\n } else {\n this.toastService.addError(error.error || I18n.t('js.error.internal'));\n }\n });\n }\n\n // save a part of the resend link in db\n // which allows to remember if a user has already requested a trial token\n // and to ask for the corresponding user data saved in Augur\n private saveTrialKey(resendlink:string):Promise {\n // extract token from resend link\n const trialKey = resendlink.split('/')[6];\n return this.http.post(\n `${this.pathHelper.appBasePath}/admin/enterprise/save_trial_key`,\n { trial_key: trialKey },\n { withCredentials: true },\n )\n .toPromise()\n .catch((e:HttpErrorResponse) => {\n const errorResponse = e.error as EnterpriseTrialErrorHalResource;\n this.toastService.addError(errorResponse.message || e.message || e);\n });\n }\n\n // save received token in controller\n private saveToken(token:string) {\n return this.http.post(\n `${this.pathHelper.appBasePath}/admin/enterprise`,\n { enterprise_token: { encoded_token: token } },\n { withCredentials: true },\n )\n .toPromise()\n .then(() => {\n const { modalOpen } = this.store.getValue();\n // load page if mail was confirmed and modal window is not open\n if (!modalOpen) {\n setTimeout(() => { // display confirmed status before reloading\n window.location.reload();\n }, 500);\n }\n })\n .catch((error:HttpErrorResponse) => {\n // Delete the trial key as the token could not be saved and thus something is wrong with the token.\n // Without this deletion, we run into an endless loop of an confirmed mail, but no saved token.\n void this.http\n .delete(\n `${this.pathHelper.api.v3.apiV3Base}/admin/enterprise/delete_trial_key`,\n { withCredentials: true },\n )\n .toPromise();\n\n const errorResponse = error.error as EnterpriseTrialErrorHalResource;\n this.toastService.addError(errorResponse.description || I18n.t('js.error.internal'));\n });\n }\n\n // retry request while waiting for mail confirmation\n public retryConfirmation(delay = 5000, retries = 60):void {\n const { cancelled, confirmed } = this.store.getValue();\n\n if (cancelled || confirmed) {\n // no need to retry\n return;\n }\n\n if (retries === 0) {\n this.store.update({ cancelled: true });\n } else {\n this.getToken();\n setTimeout(() => {\n this.retryConfirmation(delay, retries - 1);\n }, delay);\n }\n }\n\n public setStartTrialStatus():void {\n this.store.update({ status: 'startTrial' });\n }\n\n public setMailSubmittedStatus():void {\n this.store.update({ status: 'mailSubmitted' });\n }\n\n public get current():IEnterpriseTrial {\n return this.store.getValue();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Injector,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { EnterpriseTrialModalComponent } from 'core-app/features/enterprise/enterprise-modal/enterprise-trial.modal';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { EnterpriseTrialService } from 'core-app/features/enterprise/enterprise-trial.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { HttpClient } from '@angular/common/http';\nimport { GonService } from 'core-app/core/gon/gon.service';\nimport { IEnterpriseData } from 'core-app/features/enterprise/enterprise-trial.model';\n\nexport const freeTrialButtonSelector = 'free-trial-button';\n\nexport interface EETrialKey {\n created:string;\n value:string;\n}\n@Component({\n selector: freeTrialButtonSelector,\n templateUrl: './free-trial-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FreeTrialButtonComponent implements OnInit {\n created = this.timezoneService.formattedDate(new Date().toString());\n\n email = '';\n\n public text = {\n button_trial: this.I18n.t('js.admin.enterprise.upsale.button_start_trial'),\n confirmation_info: (date:string, email:string):string => this.I18n.t('js.admin.enterprise.trial.confirmation_info', {\n date,\n email,\n }),\n };\n\n constructor(protected I18n:I18nService,\n protected opModalService:OpModalService,\n readonly injector:Injector,\n readonly http:HttpClient,\n readonly cdRef:ChangeDetectorRef,\n readonly Gon:GonService,\n public eeTrialService:EnterpriseTrialService,\n readonly timezoneService:TimezoneService) {\n }\n\n ngOnInit():void {\n this.eeTrialService\n .userData$\n .pipe(\n distinctUntilChanged(),\n )\n .subscribe((userForm:IEnterpriseData) => {\n this.email = userForm.email;\n this.cdRef.detectChanges();\n });\n\n this.initialize();\n }\n\n private initialize():void {\n const eeTrialKey = this.Gon.get('ee_trial_key') as EETrialKey;\n if (eeTrialKey) {\n const savedDateStr = eeTrialKey.created.split(' ')[0];\n this.created = this.timezoneService.formattedDate(savedDateStr);\n\n const { data } = this.eeTrialService.store.getValue();\n if (data) {\n // after reload: get data from Augur using the trial key saved in gon\n const trialLink = `${this.eeTrialService.baseUrlAugur}/public/v1/trials/${eeTrialKey.value}`;\n this.eeTrialService.store.update({ trialLink });\n this.getUserDataFromAugur(trialLink);\n }\n }\n }\n\n private getUserDataFromAugur(trialLink:string):void {\n this.http\n .get(`${trialLink}/details`)\n .toPromise()\n .then((data:IEnterpriseData) => {\n this.eeTrialService.store.update({ data });\n this.eeTrialService.retryConfirmation();\n })\n .catch(() => {\n // Check whether the mail has been confirmed by now\n this.eeTrialService.getToken();\n });\n }\n\n public openTrialModal():void {\n // cancel request and open first modal window\n this.eeTrialService.store.update({ cancelled: true, modalOpen: true });\n this.opModalService.show(EnterpriseTrialModalComponent, this.injector);\n }\n\n public get trialRequested():boolean {\n const eeTrialKey = this.Gon.get('ee_trial_key') as EETrialKey|undefined;\n return !!eeTrialKey;\n }\n}\n","\n \n {{ text.button_trial }}\n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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()!.split('?')[0];\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 APM tool, if configured.\n *\n * The Application Performance Monitoring tool will filter according to their\n * 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n APP_INITIALIZER,\n ErrorHandler,\n NgModule,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HalAwareErrorHandler } from 'core-app/features/hal/services/hal-aware-error-handler';\nimport { initializeHalResourceConfig } from 'core-app/features/hal/services/hal-resource.config';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\n\n@NgModule({\n imports: [\n CommonModule,\n ],\n providers: [\n { provide: ErrorHandler, useClass: HalAwareErrorHandler },\n {\n provide: APP_INITIALIZER, useFactory: initializeHalResourceConfig, deps: [HalResourceService], multi: true,\n },\n HalResourceNotificationService,\n ],\n})\nexport class OpenprojectHalModule { }\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { HttpErrorResponse } from '@angular/common/http';\n\nexport const v3ErrorIdentifierQueryInvalid = 'urn:openproject-org:api:v3:errors:InvalidQuery';\nexport const v3ErrorIdentifierMultipleErrors = 'urn:openproject-org:api:v3:errors:MultipleErrors';\n\nexport interface IHalErrorBase {\n _type:string;\n message:string;\n errorIdentifier:string;\n}\n\nexport function isHalError(err:unknown):err is IHalErrorBase {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n const hasOwn = (key:string):boolean => Object.prototype.hasOwnProperty.call(err, key);\n return !!err && hasOwn('_type') && hasOwn('message') && hasOwn('errorIdentifier');\n}\n\nexport interface IHalSingleError extends IHalErrorBase {\n _embedded:{\n details:{\n attribute:string;\n }\n }\n}\n\nexport interface IHalMultipleError extends IHalErrorBase {\n _embedded:{\n errors:IHalSingleError[];\n }\n}\n\nexport class ErrorResource extends HalResource {\n public errors:any[];\n\n public message:string;\n\n public details:any;\n\n public errorIdentifier:string;\n\n /** We may get a reference to the underlying http error */\n public httpError?:HttpErrorResponse;\n\n public isValidationError = false;\n\n /**\n * Override toString to ensure the resource can\n * be printed nicely on console and in errors\n */\n public toString():string {\n return `[ErrorResource ${this.message}]`;\n }\n\n public get errorMessages():string[] {\n if (this.isMultiErrorMessage()) {\n return this.errors.map((error) => error.message);\n }\n\n return [this.message];\n }\n\n public isMultiErrorMessage():boolean {\n return this.errorIdentifier === v3ErrorIdentifierMultipleErrors;\n }\n\n public getInvolvedAttributes():string[] {\n let columns = [];\n\n if (this.details) {\n columns = [{ details: this.details }];\n } else if (this.errors) {\n columns = this.errors;\n }\n\n return _.flatten(columns.map((resource:ErrorResource) => {\n if (resource.errorIdentifier === v3ErrorIdentifierMultipleErrors) {\n return this.extractMultiError(resource)[0];\n }\n return resource.details.attribute;\n }));\n }\n\n public getMessagesPerAttribute():{ [attribute:string]:string[] } {\n const perAttribute:any = {};\n\n if (this.details) {\n perAttribute[this.details.attribute] = [this.message];\n } else {\n _.forEach(this.errors, (error:any) => {\n if (error.errorIdentifier === v3ErrorIdentifierMultipleErrors) {\n const [attribute, messages] = this.extractMultiError(error);\n const current = perAttribute[attribute] || [];\n perAttribute[attribute] = current.concat(messages);\n } else if (perAttribute[error.details.attribute]) {\n perAttribute[error.details.attribute].push(error.message);\n } else {\n perAttribute[error.details.attribute] = [error.message];\n }\n });\n }\n\n return perAttribute;\n }\n\n protected extractMultiError(resource:ErrorResource):[string, string[]] {\n const { attribute } = resource.errors[0].details;\n const messages = resource.errors.map((el:ErrorResource) => el.message);\n\n return [attribute, messages];\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { InputState } from 'reactivestates';\nimport { Injector } from '@angular/core';\nimport { States } from 'core-app/core/states/states.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { HalLinkInterface } from 'core-app/features/hal/hal-link/hal-link';\nimport { ICKEditorContext } from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\nexport interface HalResourceClass {\n new(injector:Injector,\n source:any,\n $loaded:boolean,\n halInitializer:(halResource:T) => void,\n $halType:string):T;\n}\n\nexport type HalSourceLink = { href:string|null, title?:string };\n\nexport type HalSourceLinks = {\n [key:string]:HalSourceLink\n};\n\nexport type HalSource = {\n [key:string]:string|number|boolean|null|HalSourceLinks,\n _links:HalSourceLinks\n};\n\nexport class HalResource {\n // TODO this is the source of many issues in the frontend\n // because it no longer properly type checks stuff\n // Since 2019-10-21 I'm documenting what bugs this caused:\n // https://community.openproject.com/wp/31462\n [attribute:string]:any;\n\n // The API type reported from API\n public _type:string;\n\n // Internal initialization time for objects\n // created in the frontend\n public __initialized_at:number;\n\n // The HalResource that this type maps to\n // This will almost always be equal to _type, however may be different for dynamic types\n // e.g., { _type: 'StatusFilterInstance', $halType: 'QueryFilterInstance' }.\n //\n // This is required for attributes to be correctly mapped according to their configuration.\n public $halType:string;\n\n @InjectField() states:States;\n\n @InjectField() I18n!:I18nService;\n\n /**\n * Constructs and initializes the HalResource. For this, the halResoureFactory is required.\n *\n * However, We can't inject the HalResourceFactory here because it itself depends on this class.\n * So if you need to initialize a HalResource, use +HalResourceFactory.createHalResource+ instead.\n *\n * @param {Injector} injector\n * @param $halType The HalResource type that this instance maps to\n * @param $source\n * @param {boolean} $loaded\n * @param {Function} initializer The initializer callback to HAL-transform all linked and embedded resources.\n *\n */\n public constructor(\n public injector:Injector,\n public $source:any,\n public $loaded:boolean,\n public halInitializer:(halResource:any) => void,\n $halType:string,\n ) {\n this.$halType = $halType;\n this.$initialize($source);\n }\n\n public static getEmptyResource(self:{ href:string|null } = { href: null }):any {\n return { _links: { self } };\n }\n\n public $links:any = {};\n\n public $embedded:any = {};\n\n public $self:Promise;\n\n public _name:string;\n\n public static matchFromLink(href:string, expectedResource:string):string|null {\n const match = new RegExp(`/api/v3/${expectedResource}/(\\\\d+)`).exec(href);\n return match && match[1];\n }\n\n public $initialize(source:any) {\n this.$source = source.$source || source;\n this.halInitializer(this);\n }\n\n /**\n * Override toString to ensure the resource can\n * be printed nicely on console and in errors\n */\n public toString() {\n if (this.href) {\n return `[HalResource href=${this.href}]`;\n }\n return `[HalResource id=${this.id}]`;\n }\n\n /**\n * Returns the ID and ensures it's a string, null.\n * Returns a string when:\n * - The embedded ID is actually set\n * - The self link is terminated by a number.\n */\n public get id():string|null {\n if (this.$source.id) {\n return this.$source.id.toString();\n }\n\n const id = idFromLink(this.href);\n if (/^\\d+$/.exec(id)) {\n return id;\n }\n\n return null;\n }\n\n public set id(val:string|null) {\n this.$source.id = val;\n }\n\n /**\n * Retain the internal tracking identifier from the given other work package.\n * This is due to us needing to identify a work package beyond its actual ID,\n * because that changes upon saving.\n *\n * @param other\n */\n public retainFrom(other:HalResource) {\n this.__initialized_at = other.__initialized_at;\n }\n\n /**\n * Create a HalResource from the copied source of the given, other HalResource.\n *\n * @param {HalResource} other\n * @returns A HalResource with the identitical copied source of other.\n */\n public $copy(source:Object = {}):T {\n const clone:HalResourceClass = this.constructor as any;\n\n return new clone(this.injector, _.merge(this.$plain(), source), this.$loaded, this.halInitializer, this.$halType);\n }\n\n public $plain():any {\n return _.cloneDeep(this.$source);\n }\n\n public get $isHal():boolean {\n return true;\n }\n\n public get $link():HalLinkInterface {\n return this.$links.self.$link;\n }\n\n public get name():string {\n return this._name || this.$link.title || '';\n }\n\n public set name(name:string) {\n this._name = name;\n }\n\n public get href():string|null {\n return this.$link.href;\n }\n\n /**\n * Return the associated state to this HAL resource, if any.\n */\n public get state():InputState|null {\n return null;\n }\n\n /**\n * Update the state\n */\n public push(newValue:this):Promise {\n if (this.state) {\n this.state.putValue(newValue);\n }\n\n return Promise.resolve();\n }\n\n public previewPath():string|undefined {\n if (isNewResource(this) && this.project) {\n return this.project.href;\n }\n\n return undefined;\n }\n\n public getEditorContext(fieldName:string):ICKEditorContext {\n return { type: 'constrained' };\n }\n\n public $load(force = false):Promise {\n if (!this.state) {\n return this.$loadResource(force);\n }\n\n const { state } = this;\n\n if (force) {\n state.clear();\n }\n\n // If nobody has asked yet for the resource to be $loaded, do it ourselves.\n // Otherwise, we risk returning a promise, that will never be resolved.\n state.putFromPromiseIfPristine(() => this.$loadResource(force));\n\n return >state.valuesPromise().then((source:any) => {\n this.$initialize(source);\n this.$loaded = true;\n return this;\n });\n }\n\n protected $loadResource(force = false):Promise {\n if (!force) {\n if (this.$loaded) {\n return Promise.resolve(this);\n }\n\n if (!this.$loaded && this.$self) {\n return this.$self;\n }\n }\n\n // Reset and load this resource\n this.$loaded = false;\n this.$self = this.$links.self({}).then((source:any) => {\n this.$loaded = true;\n this.$initialize(source.$source);\n return this;\n });\n\n return this.$self;\n }\n\n /**\n * Update the resource ignoring the cache.\n */\n public $update() {\n return this.$load(true);\n }\n\n /**\n * Specify this resource's embedded keys that should be transformed with resources.\n * Use this to restrict, e.g., links that should not be made properties if you have a custom get/setter.\n */\n public $embeddableKeys():string[] {\n const properties = Object.keys(this.$source);\n return _.without(properties, '_links', '_embedded', 'id');\n }\n\n /**\n * Specify this resource's keys that should not be transformed with resources.\n * Use this to restrict, e.g., links that should not be made properties if you have a custom get/setter.\n */\n public $linkableKeys():string[] {\n const properties = Object.keys(this.$links);\n return _.without(properties, 'self');\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 {\n WorkPackagesActivityService,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/wp-activity.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 { 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 = truncateSubject <= 0 ? this.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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { 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 {\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 map,\n skip,\n tap,\n} from 'rxjs/operators';\nimport { EMPTY, Observable } from 'rxjs';\n\nimport {\n InAppNotificationsResourceService,\n} from 'core-app/core/state/in-app-notifications/in-app-notifications.service';\nimport { IAN_FACET_FILTERS } from 'core-app/features/in-app-notifications/center/state/ian-center.store';\nimport { IanBellQuery } from 'core-app/features/in-app-notifications/bell/state/ian-bell.query';\nimport { EffectCallback, EffectHandler } from 'core-app/core/state/effects/effect-handler.decorator';\nimport {\n notificationCountIncreased,\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 { IanBellStore } from 'core-app/features/in-app-notifications/bell/state/ian-bell.store';\n\n/**\n * The BellService is injected into root here (and the store is thus made global),\n * because we are dependent in many places on the information about how many notifications there are in total.\n * Instead of repeating these requests, we prefer to use the global store for now.\n */\n@Injectable({ providedIn: 'root' })\n@EffectHandler\nexport class IanBellService {\n readonly id = 'ian-bell';\n\n readonly store = new IanBellStore();\n\n readonly query = new IanBellQuery(this.store);\n\n unread$ = this.query.unread$;\n\n constructor(\n readonly actions$:ActionsService,\n readonly resourceService:InAppNotificationsResourceService,\n ) {\n this.query.unreadCountIncreased$.pipe(skip(1)).subscribe((count) => {\n this.actions$.dispatch(notificationCountIncreased({ origin: this.id, count }));\n });\n }\n\n fetchUnread():Observable {\n return this\n .resourceService\n .fetchCollection(\n { filters: IAN_FACET_FILTERS.unread, pageSize: 0 },\n { handleErrors: false },\n )\n .pipe(\n map((result) => result.total),\n tap(\n (count) => {\n this.store.update({ totalUnread: count });\n },\n (error) => {\n console.error('Failed to load notifications: %O', error);\n this.store.update({ totalUnread: -1 });\n },\n ),\n catchError(() => EMPTY),\n );\n }\n\n @EffectCallback(notificationsMarkedRead)\n private reloadOnNotificationRead(action:ReturnType) {\n if (action.all) {\n this.fetchUnread().subscribe();\n } else {\n this.store.update(({ totalUnread }) => ({ totalUnread: totalUnread - action.notifications.length }));\n }\n }\n}\n","import { Store, StoreConfig } from '@datorama/akita';\nimport { CollectionResponse } from 'core-app/core/state/collection-store';\nimport { ApiV3ListFilter } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { NOTIFICATIONS_MAX_SIZE } from 'core-app/core/state/in-app-notifications/in-app-notification.model';\nimport { INotificationPageQueryParameters } from 'core-app/features/in-app-notifications/in-app-notifications.routes';\n\nexport type InAppNotificationFacet = 'unread'|'all';\n\nexport interface IanCenterState {\n params:{\n page:number;\n pageSize:number;\n };\n activeFacet:InAppNotificationFacet;\n filters:INotificationPageQueryParameters;\n\n activeCollection:CollectionResponse;\n\n /** Number of elements not showing after max values loaded */\n notLoaded:number;\n}\n\nexport const IAN_FACET_FILTERS:Record = {\n unread: [['readIAN', '=', false]],\n all: [],\n};\n\nexport function createInitialState():IanCenterState {\n return {\n params: {\n pageSize: NOTIFICATIONS_MAX_SIZE,\n page: 1,\n },\n filters: {},\n activeCollection: { ids: [] },\n activeFacet: 'unread',\n notLoaded: 0,\n };\n}\n\n@StoreConfig({ name: 'ian-center' })\nexport class IanCenterStore extends Store {\n constructor() {\n super(createInitialState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 {\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 { ID, Query } from '@datorama/akita';\nimport { UIRouterGlobals } from '@uirouter/core';\nimport { StateService } from '@uirouter/angular';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IToast, ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport {\n centerUpdatedInPlace,\n markNotificationsAsRead,\n markNotificationsAsReadByFilters,\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 { EffectCallback, EffectHandler } 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 {\n InAppNotificationsResourceService,\n} from 'core-app/core/state/in-app-notifications/in-app-notifications.service';\nimport { mapHALCollectionToIDCollection } 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 'core-app/features/in-app-notifications/center/state/ian-center.store';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport { ApiV3ListFilter, ApiV3ListParameters } 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 activeCollection$ = this.query.select('activeCollection');\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n activeReason$:Observable = this.uiRouterGlobals.params$!.pipe(\n this.untilDestroyed(),\n distinctUntilChanged(),\n map((params) => {\n if (params.filter === 'reason') {\n return params.name as string;\n }\n\n return null;\n }),\n shareReplay(1),\n );\n\n loading$:Observable = this.query.selectLoading();\n\n selectNotifications$:Observable = this\n .activeCollection$\n .pipe(\n switchMap((collection) => {\n const lookupId = (id:ID) => this.resourceService.lookup(id).pipe(take(1));\n return forkJoin(collection.ids.map(lookupId))\n .pipe(defaultIfEmpty([]));\n }),\n );\n\n aggregatedCenterNotifications$ = this\n .selectNotifications$\n .pipe(\n map((notifications) => (\n _.groupBy(notifications, (notification) => notification._links.resource?.href || 'none')\n )),\n distinctUntilChanged(),\n );\n\n notifications$ = this\n .aggregatedCenterNotifications$\n .pipe(\n map((items) => Object.values(items)),\n distinctUntilChanged(),\n );\n\n hasNotifications$ = this\n .notifications$\n .pipe(\n distinctUntilChanged(),\n map((items) => items.length > 0),\n distinctUntilChanged(),\n );\n\n hasMoreThanPageSize$ = this\n .notLoaded$\n .pipe(\n map((notLoaded) => notLoaded > 0),\n distinctUntilChanged(),\n );\n\n get params():ApiV3ListParameters {\n const state = this.store.getValue();\n const hasFilters = state.filters.name && state.filters.filter;\n return {\n ...state.params,\n filters: [\n ...IAN_FACET_FILTERS[state.activeFacet],\n ...(\n hasFilters\n ? ([[state.filters.filter, '=', [state.filters.name]]] as ApiV3ListFilter[])\n : []\n ),\n ],\n };\n }\n\n private activeReloadToast:IToast|null = null;\n\n private reload = new Subject();\n\n private onReload = this.reload.pipe(\n debounceTime(0),\n tap((setToLoading) => {\n if (setToLoading) {\n this.store.setLoading(true);\n }\n }),\n switchMap(() => this\n .resourceService\n .fetchCollection(this.params)\n .pipe(\n switchMap(\n (results) => from(this.sideLoadInvolvedWorkPackages(results._embedded.elements))\n .pipe(\n mapTo(mapHALCollectionToIDCollection(results)),\n ),\n ),\n )),\n\n // We need to be slower than the onReload subscribers set below.\n // Because they're subscribers they're called next in the callback queue.\n // We need our loading state to be set to false only after all data is in the store,\n // but we cannot guarantee that here, since the data is set _after_ this piece of code\n // gets run. The solution is to queue this piece of code back, allowing the store contents\n // update before the loading state gets reset.\n tap(() => setTimeout(() => this.store.setLoading(false))),\n );\n\n public selectedNotificationIndex = 0;\n\n public selectedNotification:INotification;\n\n stateChanged$ = this.uiRouterGlobals.params$?.pipe(\n this.untilDestroyed(),\n pluck('workPackageId'),\n distinctUntilChanged(),\n map((workPackageId:string) => (workPackageId ? this.apiV3Service.work_packages.id(workPackageId).path : undefined)),\n shareReplay(),\n );\n\n constructor(\n readonly I18n:I18nService,\n readonly injector:Injector,\n readonly resourceService:InAppNotificationsResourceService,\n readonly actions$:ActionsService,\n readonly apiV3Service:ApiV3Service,\n readonly toastService:ToastService,\n readonly uiRouterGlobals:UIRouterGlobals,\n readonly state:StateService,\n readonly deviceService:DeviceService,\n ) {\n super();\n this.reload.subscribe();\n\n if (this.stateChanged$) {\n this.stateChanged$.subscribe(() => {\n this.updateSelectedNotification();\n });\n }\n }\n\n setFilters(filters:INotificationPageQueryParameters):void {\n this.store.update({ filters });\n this.onReload.pipe(take(1)).subscribe((collection) => {\n this.store.update({ activeCollection: collection });\n });\n this.reload.next(true);\n }\n\n setFacet(facet:InAppNotificationFacet):void {\n this.store.update({ activeFacet: facet });\n this.onReload.pipe(take(1)).subscribe((collection) => {\n this.store.update({ activeCollection: collection });\n });\n\n if (facet === 'unread') {\n if (this.selectedNotification?.readIAN) {\n this.goToCenter();\n }\n }\n this.reload.next(true);\n }\n\n markAsRead(notifications:ID[]):void {\n this.actions$.dispatch(\n markNotificationsAsRead({ origin: this.id, notifications }),\n );\n }\n\n markAllAsRead():void {\n const filters = this.params.filters;\n if (filters === undefined) {\n return;\n }\n\n this.actions$.dispatch(\n markNotificationsAsReadByFilters({ origin: this.id, filters }),\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n openSplitScreen(wpId:string|null, tabIdentifier:string = 'activity'):void {\n void this.state.go(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/restrict-template-expressions\n `${this.state.current.data.baseRoute}.details.tabs`,\n { workPackageId: wpId, tabIdentifier },\n );\n }\n\n goToCenter():void {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-argument\n void this.state.go(this.state.current.data.baseRoute);\n }\n\n showNextNotification():void {\n void this\n .notifications$\n .pipe(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 if (action.all) {\n this.store.update({ activeCollection: { ids: [] } });\n return;\n }\n\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 1 && actors.length < 4\" textContent=\" {{ text.and }} \">\n \n 2) || (idx === 1 && actors.length > 3)\" [textContent]=\"', '\">\n \n 3\"> {{ text_for_additional_authors(actors.length - 3) }}\n
\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n OnInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport { INotification } from 'core-app/core/state/in-app-notifications/in-app-notification.model';\nimport { PrincipalLike } from 'core-app/shared/components/principal/principal-types';\nimport {\n Observable,\n timer,\n} from 'rxjs';\nimport {\n distinctUntilChanged,\n map,\n} from 'rxjs/operators';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { DeviceService } from 'core-app/core/browser/device.service';\n\n@Component({\n selector: 'op-in-app-notification-actors-line',\n templateUrl: './in-app-notification-actors-line.component.html',\n styleUrls: ['./in-app-notification-actors-line.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class InAppNotificationActorsLineComponent implements OnInit {\n @HostBinding('class.op-ian-actors') className = true;\n\n @Input() aggregatedNotifications:INotification[];\n\n @Input() notification:INotification;\n\n // The actor, if any\n actors:PrincipalLike[] = [];\n\n // Fixed notification time\n fixedTime:string;\n\n // Format relative elapsed time (n seconds/minutes/hours ago)\n // at an interval for auto updating\n relativeTime$:Observable;\n\n text = {\n and: this.I18n.t('js.notifications.center.label_actor_and'),\n and_other_singular: this.I18n.t('js.notifications.center.and_more_users.one'),\n and_other_plural: (count:number):string => this.I18n.t('js.notifications.center.and_more_users.other',\n { count }),\n loading: this.I18n.t('js.ajax.loading'),\n placeholder: this.I18n.t('js.placeholders.default'),\n mark_as_read: this.I18n.t('js.notifications.center.mark_as_read'),\n updated_by_at: (age:string):string => this.I18n.t('js.notifications.center.text_update_date',\n { date: age }),\n };\n\n constructor(\n readonly deviceService:DeviceService,\n private I18n:I18nService,\n private timezoneService:TimezoneService,\n ) { }\n\n ngOnInit():void {\n this.buildActors();\n this.buildTime();\n }\n\n text_for_additional_authors(number:number):string {\n if (number === 1) {\n return this.text.and_other_singular;\n }\n\n return this.text.and_other_plural(number);\n }\n\n private buildTime() {\n this.fixedTime = this.timezoneService.formattedDatetime(this.notification.createdAt);\n this.relativeTime$ = timer(0, 10000)\n .pipe(\n map(() => this.text.updated_by_at(\n this.timezoneService.formattedRelativeDateTime(this.notification.createdAt),\n )),\n distinctUntilChanged(),\n );\n }\n\n private buildActors() {\n const actors = this\n .aggregatedNotifications\n .map((notification) => {\n const { actor } = notification._links;\n\n if (!actor) {\n return null;\n }\n\n return {\n href: actor.href,\n name: actor.title,\n };\n })\n .filter((actor) => actor !== null) as PrincipalLike[];\n\n this.actors = _.uniqBy(actors, (item) => item.href);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n OnInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport { INotification } from 'core-app/core/state/in-app-notifications/in-app-notification.model';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport * as moment from 'moment';\nimport { Moment } from 'moment';\n\n@Component({\n selector: 'op-in-app-notification-date-alert',\n templateUrl: './in-app-notification-date-alert.component.html',\n styleUrls: ['./in-app-notification-date-alert.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class InAppNotificationDateAlertComponent implements OnInit {\n @Input() aggregatedNotifications:INotification[];\n\n @Input() workPackage:WorkPackageResource;\n\n @HostBinding('class.op-ian-date-alert') className = true;\n\n @HostBinding('class.op-ian-date-alert_overdue') isOverdue:boolean;\n\n alertText:string;\n\n dateIsPast:boolean;\n\n propertyText:string;\n\n text = {\n work_package_is: this.I18n.t('js.notifications.date_alerts.work_package_is'),\n overdue: this.I18n.t('js.notifications.date_alerts.overdue'),\n overdue_since: (difference_in_days:string):string =>\n this.I18n.t('js.notifications.date_alerts.overdue_since', { difference_in_days }),\n property_is: (difference_in_days:string):string =>\n this.I18n.t('js.notifications.date_alerts.property_is', { difference_in_days }),\n property_was: (difference_in_days:string):string =>\n this.I18n.t('js.notifications.date_alerts.property_was', { difference_in_days }),\n property_deleted: this.I18n.t('js.notifications.date_alerts.property_is_deleted'),\n startDate: this.I18n.t('js.work_packages.properties.startDate'),\n dueDate: this.I18n.t('js.work_packages.properties.dueDate'),\n date: this.I18n.t('js.notifications.date_alerts.milestone_date'),\n due_today: this.I18n.t('js.notifications.date_alerts.property_today'),\n };\n\n constructor(\n private I18n:I18nService,\n private timezoneService:TimezoneService,\n ) { }\n\n ngOnInit():void {\n // Find the most important date alert\n const interestingAlert = this.deriveMostRelevantAlert(this.aggregatedNotifications);\n\n const detail = interestingAlert._embedded.details[0];\n const property = detail.property;\n\n if (!detail.value) {\n this.propertyText = this.text[property];\n this.alertText = this.text.property_deleted;\n } else {\n this.deriveDueDate(detail.value, property);\n }\n }\n\n private deriveDueDate(value:string, property:'startDate'|'dueDate'|'date') {\n const dateValue = this.timezoneService.parseISODate(value).startOf('day');\n const today = moment();\n this.dateIsPast = dateValue.isBefore(today, 'day');\n this.isOverdue = this.dateIsPast && ['date', 'dueDate'].includes(property);\n const diff = this.dateDiff(dateValue);\n this.propertyText = (this.isOverdue && diff > 0) ? this.text.overdue : this.text[property];\n this.alertText = this.buildAlertText(diff);\n }\n\n private buildAlertText(daysDiff:number):string {\n if (daysDiff === 0) {\n return this.text.due_today;\n }\n\n const daysText = this.I18n.t('js.units.day', { count: daysDiff });\n if (this.isOverdue) {\n return this.text.overdue_since(daysText);\n }\n\n if (this.dateIsPast) {\n return this.text.property_was(daysText);\n }\n\n return this.text.property_is(daysText);\n }\n\n private dateDiff(reference:Moment):number {\n const now = moment().startOf('day');\n return Math.abs(now.diff(reference, 'days'));\n }\n\n private deriveMostRelevantAlert(aggregatedNotifications:INotification[]) {\n // Second case: We have one date alert + some others\n const dateAlerts = aggregatedNotifications.filter((notification) => notification.reason === 'dateAlert');\n const first = aggregatedNotifications[0];\n if (dateAlerts.length > 1) {\n const found = dateAlerts.find((notification) => notification._embedded.details[0].property === 'dueDate');\n return found || first;\n }\n\n // We only have one\n return first;\n }\n}\n","\n \n \n
\n \n
\n\n \n \n \n - -\n \n\n \n \n {{ item.key }}, \n \n \n\n \n\n
\n \n \n \n \n
\n \n\n \n \n \n \n \n \n\n \n \n \n \n \n \n
\n \n
\n \n \n \n \n \n\n \n
\n \n \n
\n
\n
\n\n","\n&ngsp;\n\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n OnInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Observable } from 'rxjs';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport {\n map,\n shareReplay,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { take } from 'rxjs/internal/operators/take';\nimport { StateService } from '@uirouter/angular';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { INotification } from 'core-app/core/state/in-app-notifications/in-app-notification.model';\nimport { IanCenterService } from 'core-app/features/in-app-notifications/center/state/ian-center.service';\nimport { DeviceService } from 'core-app/core/browser/device.service';\n\n@Component({\n selector: 'op-in-app-notification-entry',\n templateUrl: './in-app-notification-entry.component.html',\n styleUrls: ['./in-app-notification-entry.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class InAppNotificationEntryComponent implements OnInit {\n @HostBinding('class.op-ian-item') className = true;\n\n @Input() notification:INotification;\n\n @Input() aggregatedNotifications:INotification[];\n\n workPackage$:Observable|null = null;\n\n showDateAlert$:Observable = this\n .storeService\n .activeReason$\n .pipe(\n map((reason) => reason === 'date_alert'),\n map((dateAlertFiltered) => {\n const dateAlerts = this.aggregatedNotifications.filter((notification) => notification.reason === 'dateAlert');\n return dateAlertFiltered || dateAlerts.length === this.aggregatedNotifications.length;\n }),\n shareReplay(1),\n );\n\n loading$ = this.storeService.query.selectLoading();\n\n stateChanged$ = this.storeService.stateChanged$;\n\n // The translated reason, if available\n translatedReasons:{ [reason:string]:number };\n\n project?:{ href:string, title:string, showUrl:string };\n\n text = {\n loading: this.I18n.t('js.ajax.loading'),\n placeholder: this.I18n.t('js.placeholders.default'),\n mark_as_read: this.I18n.t('js.notifications.center.mark_as_read'),\n };\n\n constructor(\n readonly apiV3Service:ApiV3Service,\n readonly I18n:I18nService,\n readonly storeService:IanCenterService,\n readonly timezoneService:TimezoneService,\n readonly pathHelper:PathHelperService,\n readonly state:StateService,\n readonly deviceService:DeviceService,\n ) {\n }\n\n ngOnInit():void {\n this.buildTranslatedReason();\n this.buildProject();\n this.loadWorkPackage();\n }\n\n private loadWorkPackage() {\n const href = this.notification._links.resource?.href;\n const id = href && HalResource.matchFromLink(href, 'work_packages');\n // not a work package reference\n if (id) {\n this.workPackage$ = this\n .apiV3Service\n .work_packages\n .id(id)\n .requireAndStream();\n }\n }\n\n showDetails():void {\n if (!this.workPackage$) {\n return;\n }\n\n this\n .workPackage$\n .pipe(\n take(1),\n withLatestFrom(this.showDateAlert$),\n )\n .subscribe(([wp, openDetailsTab]) => {\n const tab = openDetailsTab ? 'overview' : 'activity';\n this.storeService.openSplitScreen(wp.id, tab);\n });\n }\n\n projectClicked(event:MouseEvent):void { // eslint-disable-line class-methods-use-this\n event.stopPropagation();\n }\n\n markAsRead(event:MouseEvent, notifications:INotification[]):void {\n event.stopPropagation();\n this.storeService.markAsRead(notifications.map((el) => el.id));\n }\n\n isMobile():boolean {\n return this.deviceService.isMobile;\n }\n\n private buildTranslatedReason() {\n const reasons:{ [reason:string]:number } = {};\n\n this\n .aggregatedNotifications\n .forEach((notification) => {\n const translatedReason = this.I18n.t(\n `js.notifications.reasons.${notification.reason}`,\n { defaultValue: notification.reason || this.text.placeholder },\n );\n\n reasons[translatedReason] = reasons[translatedReason] || 0;\n reasons[translatedReason] += 1;\n });\n\n this.translatedReasons = reasons;\n }\n\n private buildProject() {\n const { project } = this.notification._links;\n\n if (project) {\n this.project = {\n ...project,\n showUrl: this.pathHelper.projectPath(idFromLink(project.href)),\n };\n }\n }\n}\n","
\n \n \n \n \n \n \n \n \n
\n \n

\n 0)\">\n \n

\n 0\"\n [textContent]=\"text.no_results.with_current_filter\"\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 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 totalCount$ = this.bellService.unread$;\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 reasonMenuItems = [\n {\n key: 'mentioned',\n title: this.I18n.t('js.notifications.menu.mentioned'),\n },\n {\n key: 'assigned',\n title: this.I18n.t('js.label_assignee'),\n },\n {\n key: 'responsible',\n title: this.I18n.t('js.notifications.menu.accountable'),\n },\n {\n key: 'watched',\n title: this.I18n.t('js.notifications.menu.watched'),\n },\n {\n key: 'dateAlert',\n title: this.I18n.t('js.notifications.menu.date_alert'),\n },\n ];\n\n selectedFilter = this.reasonMenuItems.find((item) => item.key === this.uiRouterGlobals.params.name)?.title;\n\n image = {\n no_notification: imagePath('notification-center/empty-state-no-notification.svg'),\n no_selection: imagePath('notification-center/empty-state-no-selection.svg'),\n loading: imagePath('notification-center/notification_loading.gif'),\n };\n\n trackNotificationGroups = (i:number, item:INotification[]):string => item\n .map((el) => `${el.id}@${el.updatedAt}`)\n .join(',');\n\n text = {\n no_notification: this.I18n.t('js.notifications.center.empty_state.no_notification'),\n no_notification_with_current_filter_project: this.I18n.t('js.notifications.center.empty_state.no_notification_with_current_project_filter'),\n no_notification_with_current_filter: this.I18n.t('js.notifications.center.empty_state.no_notification_with_current_filter', { filter: this.selectedFilter }),\n no_selection: this.I18n.t('js.notifications.center.empty_state.no_selection'),\n change_notification_settings: this.I18n.t(\n 'js.notifications.settings.change_notification_settings',\n { url: this.pathService.myNotificationsSettingsPath() },\n ),\n title: this.I18n.t('js.notifications.title'),\n button_close: this.I18n.t('js.button_close'),\n no_results: {\n at_all: this.I18n.t(\n 'js.notifications.center.no_results.at_all',\n { url: this.pathService.myNotificationsSettingsPath() },\n ),\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):string {\n if (!hasNotifications) {\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 {{text.mySettings}}\n\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IanCenterService } from 'core-app/features/in-app-notifications/center/state/ian-center.service';\nimport {\n IAN_FACET_FILTERS,\n InAppNotificationFacet,\n} from 'core-app/features/in-app-notifications/center/state/ian-center.store';\n\n@Component({\n selector: 'op-activate-facet',\n templateUrl: './activate-facet-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ActivateFacetButtonComponent {\n text = {\n facets: {\n unread: this.I18n.t('js.notifications.facets.unread'),\n all: this.I18n.t('js.notifications.facets.all'),\n },\n facet_titles: {\n unread: this.I18n.t('js.notifications.facets.unread_title'),\n all: this.I18n.t('js.notifications.facets.all_title'),\n },\n };\n\n availableFacets = Object.keys(IAN_FACET_FILTERS);\n\n activeFacet$ = this.storeService.activeFacet$;\n\n constructor(\n private I18n:I18nService,\n private storeService:IanCenterService,\n ) {\n }\n\n activateFacet(facet:InAppNotificationFacet):void {\n this.storeService.setFacet(facet);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IanCenterService } from 'core-app/features/in-app-notifications/center/state/ian-center.service';\n\n@Component({\n selector: 'op-mark-all-as-read-button',\n templateUrl: './mark-all-as-read-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MarkAllAsReadButtonComponent {\n text = {\n mark_all_read: this.I18n.t('js.notifications.center.mark_all_read'),\n };\n\n constructor(\n private I18n:I18nService,\n private storeService:IanCenterService,\n ) {\n }\n\n markAllRead():void {\n this.storeService.markAllAsRead();\n }\n}\n","\n \n {{text.mark_all_read}}\n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Injector,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport {\n ToolbarButtonComponentDefinition,\n ViewPartitionState,\n} from 'core-app/features/work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component';\nimport {\n StateService,\n TransitionService,\n} from '@uirouter/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { NotificationSettingsButtonComponent } from 'core-app/features/in-app-notifications/center/toolbar/settings/notification-settings-button.component';\nimport { ActivateFacetButtonComponent } from 'core-app/features/in-app-notifications/center/toolbar/facet/activate-facet-button.component';\nimport { MarkAllAsReadButtonComponent } from 'core-app/features/in-app-notifications/center/toolbar/mark-all-as-read/mark-all-as-read-button.component';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { BackRoutingService } from 'core-app/features/work-packages/components/back-routing/back-routing.service';\nimport { IanCenterService } from 'core-app/features/in-app-notifications/center/state/ian-center.service';\nimport { OpTitleService } from 'core-app/core/html/op-title.service';\n\n@Component({\n templateUrl: '../../work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component.html',\n styleUrls: [\n '../../work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component.sass',\n ],\n providers: [\n IanCenterService,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InAppNotificationCenterPageComponent extends UntilDestroyedMixin implements OnInit, OnDestroy {\n text = {\n title: this.I18n.t('js.notifications.title'),\n };\n\n /** Disable the back button */\n backButtonCallback = undefined;\n\n /** Current query title to render */\n selectedTitle = this.text.title;\n\n /** Disable filter container for now */\n filterContainerDefinition = null;\n\n /** We need to pass the correct partition state to the view to manage the grid */\n currentPartition:ViewPartitionState = '-split';\n\n /** Show a toolbar */\n showToolbar = true;\n\n /** Toolbar is not editable */\n titleEditingEnabled = false;\n\n /** Listener callbacks */\n // eslint-disable-next-line @typescript-eslint/ban-types\n removeTransitionSubscription:Function;\n\n /** Not saveable */\n showToolbarSaveButton = false;\n\n /** Toolbar is always enabled */\n toolbarDisabled = false;\n\n /** Define the buttons shown in the toolbar */\n toolbarButtonComponents:ToolbarButtonComponentDefinition[] = [\n {\n component: ActivateFacetButtonComponent,\n containerClasses: 'form--field-inline-buttons-container',\n },\n {\n component: MarkAllAsReadButtonComponent,\n },\n {\n component: NotificationSettingsButtonComponent,\n containerClasses: 'hidden-for-mobile',\n },\n ];\n\n /** Global referrer set when coming to the notification center */\n private documentReferer:string;\n\n constructor(\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n readonly $transitions:TransitionService,\n readonly state:StateService,\n readonly injector:Injector,\n readonly apiV3Service:ApiV3Service,\n readonly backRoutingService:BackRoutingService,\n readonly titleService:OpTitleService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.documentReferer = document.referrer;\n\n this.setInitialHtmlTitle();\n\n this.removeTransitionSubscription = this.$transitions.onSuccess({}, ():any => {\n this.titleService.setFirstPart(this.text.title);\n });\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n this.removeTransitionSubscription();\n }\n\n /**\n * We need to set the current partition to the grid to ensure\n * either side gets expanded to full width if we're not in '-split' mode.\n *\n * @param state The current or entering state\n */\n setPartition(state:{ data:{ partition?:ViewPartitionState } }):void {\n this.currentPartition = state.data?.partition || '-split';\n }\n\n // For shared template compliance\n // eslint-disable-next-line class-methods-use-this\n updateTitleName(_val:string):void {\n }\n\n // For shared template compliance\n // eslint-disable-next-line class-methods-use-this\n changeChangesFromTitle(_val:string):void {\n }\n\n private setInitialHtmlTitle():void {\n const currentTitleParts = this.titleService.titleParts;\n\n // Prepend \"Notifications\" if only the application name is shown\n if (currentTitleParts.length === 1) {\n this.titleService.prependFirstPart(this.text.title);\n }\n\n // A click on the left side menu of the notification center newly triggers the center page (and thus the ngOnInit).\n // So the transition hook only works for changing the content of the split screen but not when switching for example\n // from \"watched\" to \"mentioned\".\n // So we override the first part in this case to make sure that there is not the name of a WP is shown when there is no split screen visible.\n if (currentTitleParts[0] !== this.text.title) {\n this.titleService.setFirstPart(this.text.title);\n }\n }\n}\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { videoPath } from 'core-app/shared/helpers/videos/path-helper';\n\n@Component({\n selector: 'op-ian-date-alerts-upsale',\n templateUrl: './ian-date-alerts-upsale.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InAppNotificationsDateAlertsUpsaleComponent {\n video = videoPath('notification-center/date-alert-notifications.mp4');\n\n text = {\n title: this.I18n.t('js.notifications.date_alerts.upsale.title'),\n description: this.I18n.t('js.notifications.date_alerts.upsale.description'),\n };\n\n constructor(\n readonly I18n:I18nService,\n ) { }\n}\n","/**\n * Returns an absolute asset path from the assets/videos/ folder\n *\n * e.g., to access:\n * frontend/src/assets/videos/enterprise/date-alert-notification-settings.mp4\n *\n * use\n * imagePath('enterprise/date-alert-notification-settings.mp4')\n *\n *\n * @param video Path to the video starting from frontend/src/assets/videos\n */\nexport function videoPath(video:string):string {\n return `${__webpack_public_path__}assets/videos/${video}`;\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Ng2StateDeclaration } from '@uirouter/angular';\nimport { makeSplitViewRoutes } from 'core-app/features/work-packages/routing/split-view-routes.template';\nimport { WorkPackageSplitViewComponent } from 'core-app/features/work-packages/routing/wp-split-view/wp-split-view.component';\nimport { InAppNotificationCenterComponent } from 'core-app/features/in-app-notifications/center/in-app-notification-center.component';\nimport { InAppNotificationCenterPageComponent } from 'core-app/features/in-app-notifications/center/in-app-notification-center-page.component';\nimport { WorkPackagesBaseComponent } from 'core-app/features/work-packages/routing/wp-base/wp--base.component';\nimport { InAppNotificationsDateAlertsUpsaleComponent } from 'core-app/features/in-app-notifications/date-alerts-upsale/ian-date-alerts-upsale.component';\n\nexport interface INotificationPageQueryParameters {\n filter?:string;\n name?:string;\n}\n\nexport const IAN_ROUTES:Ng2StateDeclaration[] = [\n {\n name: 'notifications',\n parent: 'root',\n url: '/notifications?{filter:string}&{name:string}',\n data: {\n bodyClasses: 'router--work-packages-base',\n },\n redirectTo: 'notifications.center.show',\n views: {\n '!$default': { component: WorkPackagesBaseComponent },\n },\n },\n {\n url: '/date_alerts',\n name: 'notifications.date_alerts_upsale',\n component: InAppNotificationsDateAlertsUpsaleComponent,\n },\n {\n name: 'notifications.center',\n component: InAppNotificationCenterPageComponent,\n redirectTo: 'notifications.center.show',\n },\n {\n name: 'notifications.center.show',\n data: {\n baseRoute: 'notifications.center.show',\n },\n views: {\n 'content-left': { component: InAppNotificationCenterComponent },\n },\n },\n ...makeSplitViewRoutes(\n 'notifications.center.show',\n undefined,\n WorkPackageSplitViewComponent,\n ),\n];\n","import { NgModule } from '@angular/core';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { CommonModule } from '@angular/common';\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\nimport { InAppNotificationBellComponent } from 'core-app/features/in-app-notifications/bell/in-app-notification-bell.component';\nimport { InAppNotificationEntryComponent } from 'core-app/features/in-app-notifications/entry/in-app-notification-entry.component';\nimport { OpenprojectPrincipalRenderingModule } from 'core-app/shared/components/principal/principal-rendering.module';\nimport { UIRouterModule } from '@uirouter/angular';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { IAN_ROUTES } from 'core-app/features/in-app-notifications/in-app-notifications.routes';\nimport { InAppNotificationCenterComponent } from 'core-app/features/in-app-notifications/center/in-app-notification-center.component';\nimport { InAppNotificationCenterPageComponent } from 'core-app/features/in-app-notifications/center/in-app-notification-center-page.component';\nimport { IanMenuComponent } from 'core-app/features/in-app-notifications/center/menu/menu.component';\nimport { OpenprojectWorkPackagesModule } from 'core-app/features/work-packages/openproject-work-packages.module';\nimport { DynamicModule } from 'ng-dynamic-component';\nimport { InAppNotificationStatusComponent } from './entry/status/in-app-notification-status.component';\nimport { NotificationSettingsButtonComponent } from './center/toolbar/settings/notification-settings-button.component';\nimport { ActivateFacetButtonComponent } from './center/toolbar/facet/activate-facet-button.component';\nimport { MarkAllAsReadButtonComponent } from './center/toolbar/mark-all-as-read/mark-all-as-read-button.component';\nimport { OpenprojectContentLoaderModule } from 'core-app/shared/components/op-content-loader/openproject-content-loader.module';\nimport { EmptyStateComponent } from './center/empty-state/empty-state.component';\nimport { IanBellService } from 'core-app/features/in-app-notifications/bell/state/ian-bell.service';\nimport { InAppNotificationActorsLineComponent } from './entry/actors-line/in-app-notification-actors-line.component';\nimport { InAppNotificationDateAlertComponent } from './entry/date-alert/in-app-notification-date-alert.component';\nimport { InAppNotificationsDateAlertsUpsaleComponent } from 'core-app/features/in-app-notifications/date-alerts-upsale/ian-date-alerts-upsale.component';\n\n@NgModule({\n declarations: [\n InAppNotificationBellComponent,\n InAppNotificationCenterComponent,\n InAppNotificationEntryComponent,\n InAppNotificationCenterPageComponent,\n InAppNotificationStatusComponent,\n NotificationSettingsButtonComponent,\n ActivateFacetButtonComponent,\n MarkAllAsReadButtonComponent,\n IanMenuComponent,\n EmptyStateComponent,\n InAppNotificationActorsLineComponent,\n InAppNotificationDateAlertComponent,\n InAppNotificationsDateAlertsUpsaleComponent,\n ],\n imports: [\n OpSharedModule,\n // Routes for /backlogs\n UIRouterModule.forChild({\n states: IAN_ROUTES,\n }),\n DynamicModule,\n CommonModule,\n IconModule,\n OpenprojectPrincipalRenderingModule,\n OpenprojectWorkPackagesModule,\n OpenprojectContentLoaderModule,\n ScrollingModule,\n ],\n providers: [\n IanBellService,\n ],\n})\nexport class OpenProjectInAppNotificationsModule {\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { InviteUserButtonComponent } from 'core-app/features/invite-user-modal/button/invite-user-button.component';\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\n\n@NgModule({\n declarations: [\n InviteUserButtonComponent,\n ],\n imports: [\n CommonModule,\n IconModule,\n ],\n exports: [\n InviteUserButtonComponent,\n ],\n})\nexport class InviteUserButtonModule { }\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, EventEmitter } from '@angular/core';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { InviteUserModalComponent } from './invite-user.component';\n\n/**\n * This service triggers user-invite modals to clicks on elements\n * with the attribute [invite-user-modal-augment] set.\n */\n@Injectable()\nexport class OpInviteUserModalService {\n public close = new EventEmitter();\n\n constructor(\n protected opModalService:OpModalService,\n protected currentProjectService:CurrentProjectService,\n ) {\n }\n\n public open(projectId:string|null = this.currentProjectService.id) {\n this.opModalService.show(\n InviteUserModalComponent,\n 'global',\n { projectId },\n ).subscribe((modal) => modal\n .closingEvent\n .subscribe((modal:InviteUserModalComponent) => {\n this.close.emit(modal.data);\n }));\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Inject,\n OnInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { PrincipalData } from 'core-app/shared/components/principal/principal-types';\nimport { RoleResource } from 'core-app/features/hal/resources/role-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\n\nenum Steps {\n ProjectSelection,\n Principal,\n Summary,\n Success,\n}\n\nexport enum PrincipalType {\n User = 'User',\n Placeholder = 'PlaceholderUser',\n Group = 'Group',\n}\n\n@Component({\n templateUrl: './invite-user.component.html',\n styleUrls: ['./invite-user.component.sass'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InviteUserModalComponent extends OpModalComponent implements OnInit {\n public Steps = Steps;\n\n public step = Steps.ProjectSelection;\n\n /* Data that is returned from the modal on close */\n public data:any = null;\n\n public type:PrincipalType|null = null;\n\n public project:ProjectResource|null = null;\n\n public principalData:PrincipalData = {\n principal: null,\n customFields: {},\n };\n\n public role:RoleResource|null = null;\n\n public message = '';\n\n public createdNewPrincipal = false;\n\n public get loading():boolean {\n return this.locals.projectId && !this.project;\n }\n\n constructor(\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef,\n readonly apiV3Service:ApiV3Service,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit():void {\n super.ngOnInit();\n\n if (this.locals.projectId) {\n this.apiV3Service.projects.id(this.locals.projectId).get().subscribe(\n (data) => {\n this.project = data;\n this.cdRef.markForCheck();\n },\n () => {\n this.locals.projectId = null;\n this.cdRef.markForCheck();\n },\n );\n }\n }\n\n onProjectSelectionSave({ type, project }:{ type:PrincipalType, project:ProjectResource|null }):void {\n this.type = type;\n this.project = project;\n this.goTo(Steps.Principal);\n }\n\n onPrincipalSave({\n principalData, isAlreadyMember, role, message,\n }:{ principalData:PrincipalData, isAlreadyMember:boolean, role:RoleResource, message:string }):void {\n this.principalData = principalData;\n this.role = role;\n this.message = message;\n if (isAlreadyMember) {\n return this.closeWithPrincipal();\n }\n\n return this.goTo(Steps.Summary);\n }\n\n onSuccessfulSubmission($event:{ principal:HalResource }):void {\n if (this.principalData.principal !== $event.principal && this.type === PrincipalType.User) {\n this.createdNewPrincipal = true;\n }\n this.principalData.principal = $event.principal;\n this.goTo(Steps.Success);\n }\n\n goTo(step:Steps):void {\n this.step = step;\n }\n\n closeWithPrincipal():void {\n this.data = this.principalData.principal;\n this.closeMe();\n }\n}\n","\n\n\n\n\n\n\n\n","\n {{ title }}\n\n
\n\n
\n
\n
\n \n
\n
\n
\n \n \n {{ text.download_starts }}\n \n \n \n
\n \n \n

\n
    \n
  • \n
\n\n

\n \n \n \n

\n
\n
\n \n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Inject,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n HttpClient,\n HttpErrorResponse,\n HttpResponse,\n} from '@angular/common/http';\nimport {\n Observable,\n timer,\n} from 'rxjs';\nimport {\n switchMap,\n takeWhile,\n} from 'rxjs/operators';\nimport {\n LoadingIndicatorService,\n withDelayedLoadingIndicator,\n} from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport {\n JobStatusEnum,\n JobStatusInterface,\n} from 'core-app/features/job-status/job-status.interface';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { EXTERNAL_REQUEST_HEADER } from 'core-app/features/hal/http/openproject-header-interceptor';\nimport {\n DomSanitizer,\n SafeHtml,\n} from '@angular/platform-browser';\n\n@Component({\n templateUrl: './job-status.modal.html',\n styleUrls: ['./job-status.modal.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class JobStatusModalComponent extends OpModalComponent implements OnInit {\n public text = {\n title: this.I18n.t('js.job_status.title'),\n closePopup: this.I18n.t('js.close_popup_title'),\n redirect: this.I18n.t('js.job_status.redirect'),\n redirect_errors: `${this.I18n.t('js.job_status.redirect_errors')} `,\n redirect_link: this.I18n.t('js.job_status.redirect_link'),\n errors: this.I18n.t('js.job_status.errors'),\n download_starts: this.I18n.t('js.job_status.download_starts'),\n click_to_download: this.I18n.t('js.job_status.click_to_download'),\n };\n\n /** The job ID reference */\n public jobId:string;\n\n /** Whether to show the loading indicator */\n public isLoading = false;\n\n /** The current status */\n public status:JobStatusEnum;\n\n /** An associated icon to render, if any */\n public statusIcon:string|null;\n\n /** Public message to show */\n public message:string;\n\n /** Payload object of the response */\n public payload:any;\n\n /** Title to show */\n public title:string = this.text.title;\n\n /** Additional html to render */\n public htmlContent:SafeHtml|null = null;\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 sanitization:DomSanitizer,\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 this.handleHTML(body.payload?.html);\n }\n\n this.statusIcon = this.iconForStatus();\n this.cdRef.detectChanges();\n }\n\n private handleHTML(content?:string) {\n if (content) {\n this.htmlContent = this.sanitization.bypassSecurityTrustHtml(content);\n }\n }\n\n private handleRedirect(payload:JobStatusInterface['payload']) {\n if (payload?.redirect && !payload?.errors) {\n setTimeout(() => { window.location.href = payload.redirect as string; }, 2000);\n this.message += `. ${this.text.redirect}`;\n }\n }\n\n private handleDownload(redirectionUrl?:string) {\n if (redirectionUrl !== undefined) {\n // Get the file url from the redirectionUrl\n this.httpClient\n .get(redirectionUrl, {\n observe: 'response',\n responseType: 'text',\n // This might or might not be an external request (depending on the configuration of an S3 storage)\n // But not having headers like X-CSRF-TOKEN set works in both cases.\n headers: {\n [EXTERNAL_REQUEST_HEADER]: 'true',\n },\n })\n .subscribe((response) => {\n this.downloadHref = response.url;\n\n this.cdRef.detectChanges();\n this.downloadLink.nativeElement.click();\n }, (error:HttpErrorResponse) => {\n // In this case, most typically, there is a CORS error.\n // Instead of failing completely, we show a manual link for the user to click themselves.\n if (error.status === 0) {\n this.downloadHref = redirectionUrl;\n\n this.cdRef.detectChanges();\n }\n });\n }\n }\n\n private performRequest():Observable> {\n return this\n .httpClient\n .get(\n this.jobUrl,\n { observe: 'response', responseType: 'json' },\n );\n }\n\n private handleError(error:HttpErrorResponse) {\n if (error?.status === 404) {\n this.statusIcon = 'icon-help';\n this.message = this.I18n.t('js.job_status.generic_messages.not_found');\n } else {\n this.statusIcon = 'icon-error';\n this.message = error?.message || this.I18n.t('js.error.internal');\n this.toastService.addError(this.message);\n }\n\n this.cdRef.detectChanges();\n }\n\n private get jobUrl():string {\n return this.apiV3Service.job_statuses.id(this.jobId).toString();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { UntypedFormControl, UntypedFormGroup } 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 UntypedFormGroup({\n template: new UntypedFormControl(),\n });\n\n get templateControl() {\n return this.templateForm.get('template');\n }\n\n @ViewChild(DynamicFormComponent) dynamicForm:DynamicFormComponent;\n\n constructor(\n private apiV3Service:ApiV3Service,\n private uIRouterGlobals:UIRouterGlobals,\n private pathHelperService:PathHelperService,\n private modalService:OpModalService,\n private $state:StateService,\n private I18n:I18nService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.resourcePath = this.apiV3Service.projects.path;\n this.fieldGroups = [{\n name: this.text.advancedSettingsLabel,\n fieldsFilter: (field) => !['name', 'parent'].includes(field.templateOptions?.property as string)\n && !this.isMeta(field.templateOptions?.property)\n && !(field.templateOptions?.required\n && !field.templateOptions.hasDefault\n && field.templateOptions.payloadValue == null),\n },\n {\n name: this.text.copySettingsLabel,\n fieldsFilter: (field:IOPFormlyFieldSettings) => this.isMeta(field.templateOptions?.property),\n }];\n\n if (this.uIRouterGlobals.params.parent_id) {\n this.setParentAsPayload(this.uIRouterGlobals.params.parent_id);\n }\n }\n\n onSubmitted(response:HalSource) {\n if (response._type === 'JobStatus') {\n this.modalService.show(JobStatusModalComponent, 'global', { jobId: response.jobId });\n } else {\n window.location.href = this.pathHelperService.projectPath(response.identifier as string);\n }\n }\n\n onTemplateSelected(selected:{ href:string|null }) {\n this.initialPayload = {\n ...this.initialPayload,\n name: this.dynamicForm.model.name,\n _meta: {\n ...(this.initialPayload?._meta as Record),\n sendNotifications: false,\n },\n };\n this.formUrl = selected?.href ? `${selected.href}/copy` : null;\n }\n\n private isHiddenField(key:string|undefined):boolean {\n // We explicitly want to show the sendNotifications param\n if (key === '_meta.sendNotifications') {\n return false;\n }\n\n return !!key && (this.hiddenFields.includes(key) || this.isMeta(key));\n }\n\n private isMeta(property:string|undefined):boolean {\n return !!property && (property.startsWith('copy') || property === 'sendNotifications');\n }\n\n private setParentAsPayload(parentId:string) {\n const href = this.apiV3Service.projects.id(parentId).path;\n\n this.initialPayload = {\n _links: {\n parent: {\n href,\n },\n },\n };\n }\n\n private fieldSettingsPipe(dynamicFieldsSettings:IOPFormlyFieldSettings[]):IOPFormlyFieldSettings[] {\n return dynamicFieldsSettings.map((field) => ({ ...field, hide: this.isHiddenField(field.key) }));\n }\n}\n","\n
\n \n \n \n \n
\n\n\n","import {\n IDynamicFieldGroupConfig,\n IOPFormlyFieldSettings,\n IOPFormlyTemplateOptions,\n} from 'core-app/shared/components/dynamic-forms/typings';\nimport { JobStatusModalComponent } from 'core-app/features/job-status/job-status-modal/job-status.modal';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { Component, OnInit } from '@angular/core';\nimport { StateService } from '@uirouter/core';\n\n@Component({\n selector: 'op-copy-project',\n templateUrl: './copy-project.component.html',\n})\nexport class CopyProjectComponent extends UntilDestroyedMixin implements OnInit {\n dynamicFieldsSettingsPipe = this.fieldSettingsPipe.bind(this);\n\n fieldGroups:IDynamicFieldGroupConfig[];\n\n formUrl:string;\n\n hiddenFields:string[] = [\n 'identifier',\n 'active',\n ];\n\n text = {\n advancedSettingsLabel: this.I18n.t('js.forms.advanced_settings'),\n copySettingsLabel: this.I18n.t('js.project.copy.copy_options'),\n };\n\n constructor(\n private apiV3Service:ApiV3Service,\n private currentProjectService:CurrentProjectService,\n private pathHelperService:PathHelperService,\n private modalService:OpModalService,\n private $state:StateService,\n private I18n:I18nService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.formUrl = this.apiV3Service.projects.id(this.currentProjectService.id!).copy.form.path;\n this.fieldGroups = [\n {\n name: this.text.advancedSettingsLabel,\n fieldsFilter: (field:IOPFormlyFieldSettings) => !this.isMeta(field.templateOptions?.property) && !this.isPrimaryAttribute(field.templateOptions),\n },\n {\n name: this.text.copySettingsLabel,\n fieldsFilter: (field:IOPFormlyFieldSettings) => this.isMeta(field.templateOptions?.property),\n },\n ];\n }\n\n onSubmitted(response:HalSource) {\n this.modalService.show(JobStatusModalComponent, 'global', { jobId: response.jobId });\n }\n\n private isHiddenField(key:string|undefined):boolean {\n return !!key && this.hiddenFields.includes(key);\n }\n\n private fieldSettingsPipe(dynamicFieldsSettings:IOPFormlyFieldSettings[]):IOPFormlyFieldSettings[] {\n return this.sortedCopyFields(dynamicFieldsSettings)\n .map((field) => ({ ...field, hide: this.isHiddenField(field.key) }));\n }\n\n private isPrimaryAttribute(to?:IOPFormlyTemplateOptions):boolean {\n if (!to) {\n return false;\n }\n\n return (to.required\n && !to.hasDefault\n && to.payloadValue == null)\n || to.property === 'name'\n || to.property === 'parent';\n }\n\n private isMeta(property:string|undefined):boolean {\n return !!property && (property.startsWith('copy') || property === 'sendNotifications');\n }\n\n // Sorts the copy options by their label.\n // The order of the rest of the fields is left unchanged but all copy options are returned first.\n private sortedCopyFields(dynamicFieldsSettings:IOPFormlyFieldSettings[]):IOPFormlyFieldSettings[] {\n const sortedCopyFields = dynamicFieldsSettings\n .filter((field) => field.key && field.key.startsWith('_meta.copy'))\n .sort((fieldA, fieldB) => {\n if (!fieldA.templateOptions\n || !fieldA.templateOptions.label\n || !fieldB.templateOptions\n || !fieldB.templateOptions.label) {\n return 0;\n }\n\n return fieldA.templateOptions.label.localeCompare(fieldB.templateOptions.label);\n });\n\n const nonCopyFields = dynamicFieldsSettings\n .filter((field) => !field.key || !field.key.startsWith('_meta.copy'));\n\n // Now all copy fields are before the non Copy fields.\n // That way, the \"Sent notifications\" is after the copy fields.\n // For the rest, it does not make a difference since the _meta\n // fields are rendered in a separate group.\n return sortedCopyFields.concat(nonCopyFields);\n }\n}\n","","import { Ng2StateDeclaration, UIRouter } from '@uirouter/angular';\nimport { ProjectsComponent } from 'core-app/features/projects/components/projects/projects.component';\nimport { NewProjectComponent } from 'core-app/features/projects/components/new-project/new-project.component';\nimport { CopyProjectComponent } from 'core-app/features/projects/components/copy-project/copy-project.component';\n\nexport const PROJECTS_ROUTES:Ng2StateDeclaration[] = [\n {\n name: 'project_settings',\n parent: 'optional_project',\n url: '/settings/general/',\n component: ProjectsComponent,\n },\n {\n name: 'project_copy',\n parent: 'optional_project',\n url: '/copy',\n component: CopyProjectComponent,\n },\n {\n name: 'new_project',\n url: '/projects/new?parent_id',\n component: NewProjectComponent,\n },\n];\n\nexport function uiRouterProjectsConfiguration(uiRouter:UIRouter) {\n // Ensure projects/ are being redirected correctly\n // cf., https://community.openproject.com/wp/29754\n uiRouter.urlService.rules\n .when(\n new RegExp('^/projects/(.*)/settings/general$'),\n (match:string[]) => `/projects/${match[1]}/settings/general/`,\n );\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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","import { Calendar } from '@fullcalendar/core';\nimport * as moment from 'moment/moment';\n\nexport const backgroundEvents = {\n events: [],\n id: 'background',\n color: 'red',\n textColor: 'white',\n display: 'background',\n editable: false,\n};\n\nexport function addBackgroundEvents(\n calendar:Calendar,\n nonWorkingDay:(date:Date) => boolean,\n) {\n let currentStartDate = calendar.view.activeStart;\n const currentEndDate = calendar.view.activeEnd.getTime();\n const nonWorkingDays = new Array<{ start:Date|string, end:Date|string }>();\n\n while (currentStartDate.getTime() < currentEndDate) {\n if (nonWorkingDay(currentStartDate)) {\n nonWorkingDays.push({\n start: moment(currentStartDate).format('YYYY-MM-DD'),\n end: moment(currentStartDate).add('1', 'day').format('YYYY-MM-DD'),\n });\n }\n currentStartDate = moment(currentStartDate).add('1', 'day').toDate();\n }\n nonWorkingDays.forEach((day) => {\n calendar.addEvent({ ...day }, 'background');\n });\n}\n\nexport function removeBackgroundEvents(calendar:Calendar) {\n calendar\n .getEvents()\n .filter((el) => el.source?.id === 'background')\n .forEach((el) => el.remove());\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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, HostBinding, 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 @HostBinding('id') get id() {\n return `div-values-${this.filter.id}`;\n }\n\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():string {\n return this.filter.values[0] as string;\n }\n\n public set value(val) {\n this.filter.values = [val];\n this.filterChanged.emit(this.filter);\n }\n\n valueChanged(val:string) {\n const parsed = this.parser(val);\n if (parsed) {\n this.value = val;\n }\n }\n\n public parser(data:string) {\n if (moment(data, 'YYYY-MM-DD', true).isValid()) {\n return data;\n }\n return null;\n }\n\n public formatter(data:string) {\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component,\n HostBinding,\n Input,\n 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 * 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 @HostBinding('id') get id() {\n return `div-values-${this.filter.id}`;\n }\n\n @HostBinding('class.inline-label') className = true;\n\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(\n readonly timezoneService:TimezoneService,\n readonly I18n:I18nService,\n ) {\n super();\n }\n\n public get value():string[] {\n return (this.filter.values || []) as string[];\n }\n\n public set value(val:string[]) {\n this.filter.values = val;\n this.filterChanged.emit(this.filter);\n }\n\n public get begin():string {\n return (this.filter.values[0] || '') as string;\n }\n\n public get end():string {\n return (this.filter.values[1] || '') as string;\n }\n\n public parser(data:string):string|null {\n if (moment(data, 'YYYY-MM-DD', true).isValid()) {\n return data;\n }\n return null;\n }\n\n public formatter(data:string):string|null {\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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(\n protected I18n:I18nService,\n protected timezoneService:TimezoneService,\n ) {\n super();\n }\n\n ngOnInit() {\n _.remove(this.filter.values as string[], (value) => !(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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 Input,\n HostBinding,\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 { 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 @HostBinding('id') get id() {\n return `div-values-${this.filter.id}`;\n }\n\n @HostBinding('class.inline-label') className = true;\n\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 {\n Component,\n HostBinding,\n Input,\n OnInit,\n 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';\nimport { validDate } from 'core-app/shared/components/datepicker/helpers/date-modal.helpers';\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 @HostBinding('id') get id() {\n return `div-values-${this.filter.id}`;\n }\n\n @HostBinding('class.inline-label') className = true;\n\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(\n readonly I18n:I18nService,\n readonly timezoneService:TimezoneService,\n ) {\n super(I18n, timezoneService);\n }\n\n public get begin():string {\n return (this.filter.values[0] || '') as string;\n }\n\n public set begin(val:string) {\n this.filter.values[0] = val || '';\n this.filterChanged.emit(this.filter);\n }\n\n public get end():string {\n return (this.filter.values[1] || '') as string;\n }\n\n public set end(val:string) {\n this.filter.values = [this.begin, val || ''] as string[];\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 public parseBegin(date:string|null) {\n if (date === null || !validDate(date)) {\n return;\n }\n\n if (date === '') {\n this.begin = date;\n } else {\n const parsed = this\n .timezoneService\n .parseISODatetime(date)\n .startOf('day')\n .utc();\n\n this.begin = this.timezoneService.formattedISODateTime(parsed);\n }\n }\n\n public parseEnd(date:string|null) {\n if (date === null || !validDate(date)) {\n return;\n }\n\n if (date === '') {\n this.end = date;\n } else {\n const parsed = this\n .timezoneService\n .parseISODatetime(date)\n .endOf('day')\n .utc();\n\n this.end = this.timezoneService.formattedISODateTime(parsed);\n }\n }\n\n public formatter(data:string[]):string[] {\n return data.map((date) => this.isoDateFormatter(date));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 || (val && val.length === 0)) {\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\nimport { compareByHref } from 'core-app/shared/helpers/angular/tracking-functions';\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 itemTracker = (item:HalResource):string => item.href || item.id || item.name;\n\n compareByHref = compareByHref;\n\n readonly text = {\n placeholder: this.I18n.t('js.placeholders.selection'),\n };\n\n constructor(\n 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\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 \n\n \n \n\n
    \n
  • \n \n\n
    \n \n \n
    \n
  • \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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 OnChanges,\n Output,\n 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 { 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';\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 OnChanges {\n @ViewChild(NgSelectComponent) public ngSelectComponent:NgSelectComponent;\n\n @Input() public filters:QueryFilterInstanceResource[];\n\n @Input() public showCloseFilter = false;\n\n @Output() public filtersChanged = new DebouncedEventEmitter(\n componentDestroyed(this),\n 500,\n );\n\n public remainingFilters:any[] = [];\n\n public 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 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(\n readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly wpFiltersService:WorkPackageFiltersService,\n readonly I18n:I18nService,\n ) {\n super();\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 {\n BehaviorSubject,\n Subject,\n} 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 public quoteEvents$ = new Subject();\n\n public draft$ = new BehaviorSubject(null);\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { StateService, TransitionService } from '@uirouter/core';\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { Observable } from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\n\n@Component({\n selector: 'wp-create-button',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './wp-create-button.html',\n})\nexport class WorkPackageCreateButtonComponent extends UntilDestroyedMixin implements OnInit, OnDestroy {\n @Input('allowed') allowedWhen:string[];\n\n @Input('stateName$') stateName$:Observable;\n\n allowed:boolean;\n\n disabled:boolean;\n\n projectIdentifier:string|null;\n\n types:any;\n\n transitionUnregisterFn:Function;\n\n text = {\n title: this.I18n.t('js.work_packages.create.title'),\n createWithDropdown: this.I18n.t('js.work_packages.create.button'),\n createButton: this.I18n.t('js.label_work_package'),\n explanation: this.I18n.t('js.label_create_work_package'),\n };\n\n constructor(readonly $state:StateService,\n readonly currentProject:CurrentProjectService,\n readonly authorisationService:AuthorisationService,\n readonly transition:TransitionService,\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef) {\n super();\n }\n\n ngOnInit() {\n this.projectIdentifier = this.currentProject.identifier;\n\n // Find the first permission that is allowed\n this.authorisationService\n .observeUntil(componentDestroyed(this))\n .subscribe(() => {\n this.allowed = !!this\n .allowedWhen\n .find((combined) => {\n const [module, permission] = combined.split('.');\n return this.authorisationService.can(module, permission);\n });\n\n this.updateDisabledState();\n });\n\n this.transitionUnregisterFn = this.transition.onSuccess({}, this.updateDisabledState.bind(this));\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n this.transitionUnregisterFn();\n }\n\n private updateDisabledState() {\n this.disabled = !this.allowed || this.$state.includes('**.new');\n this.cdRef.detectChanges();\n }\n}\n","
\n \n \n \n \n \n
\n","\n \n \n {{ buttonText }}\n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { AbstractWorkPackageButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-buttons.module';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit,\n} from '@angular/core';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { WorkPackageFiltersService } from 'core-app/features/work-packages/components/filters/wp-filters/wp-filters.service';\n\n@Component({\n selector: 'wp-filter-button',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './wp-filter-button.html',\n})\nexport class WorkPackageFilterButtonComponent extends AbstractWorkPackageButtonComponent implements OnInit {\n public count:number;\n\n public initialized = false;\n\n public buttonId = 'work-packages-filter-toggle-button';\n\n public iconClass = 'icon-filter';\n\n public title = this.I18n.t('js.work_packages.filters.title');\n\n constructor(\n readonly I18n:I18nService,\n protected cdRef:ChangeDetectorRef,\n protected wpFiltersService:WorkPackageFiltersService,\n protected wpTableFilters:WorkPackageViewFiltersService,\n ) {\n super(I18n);\n }\n\n ngOnInit():void {\n this.setupObserver();\n }\n\n public get labelKey():string {\n return 'js.button_filter';\n }\n\n public get textKey():string {\n return 'js.toolbar.filter';\n }\n\n public get label():string {\n return this.prefix + this.text.label;\n }\n\n public get filterCount():number {\n return this.count;\n }\n\n public performAction(event:Event) {\n this.toggleVisibility();\n }\n\n public toggleVisibility() {\n this.wpFiltersService.toggleVisibility();\n }\n\n private setupObserver() {\n this.wpTableFilters\n .live$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n this.count = this.wpTableFilters.currentlyVisibleFilters.length;\n this.initialized = true;\n this.cdRef.detectChanges();\n });\n\n this.wpFiltersService\n .observeUntil(componentDestroyed(this))\n .subscribe(() => {\n this.isActive = this.wpFiltersService.visible;\n this.cdRef.detectChanges();\n });\n }\n}\n","\n\n \n \n \n\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WpSingleViewService } from 'core-app/features/work-packages/routing/wp-view-base/state/wp-single-view.service';\n\n@Component({\n selector: 'op-work-package-mark-notification-button',\n templateUrl: './work-package-mark-notification-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageMarkNotificationButtonComponent {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public showWithText:boolean;\n\n text = {\n mark_as_read: this.I18n.t('js.notifications.center.mark_as_read'),\n };\n\n constructor(\n private I18n:I18nService,\n private storeService:WpSingleViewService,\n ) {\n }\n\n markAllBelongingNotificationsAsRead():void {\n this.storeService.markAllAsRead();\n }\n}\n","import { States } from 'core-app/core/states/states.service';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport {\n Component, EventEmitter, Input, Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\n\nexport interface QuerySharingChange {\n isStarred:boolean;\n isPublic:boolean;\n}\n\n@Component({\n selector: 'query-sharing-form',\n templateUrl: './query-sharing-form.html',\n})\nexport class QuerySharingFormComponent {\n @Input() public isSave:boolean;\n\n @Input() public isStarred:boolean;\n\n @Input() public isPublic:boolean;\n\n @Output() public onChange = new EventEmitter();\n\n public text = {\n showInMenu: this.I18n.t('js.label_star_query'),\n visibleForOthers: this.I18n.t('js.label_public_query'),\n\n showInMenuText: this.I18n.t('js.work_packages.query.star_text'),\n visibleForOthersText: this.I18n.t('js.work_packages.query.public_text'),\n };\n\n constructor(readonly states:States,\n readonly querySpace:IsolatedQuerySpace,\n readonly authorisationService:AuthorisationService,\n readonly I18n:I18nService) {\n }\n\n public get canStar() {\n return this.isSave\n || this.authorisationService.can('query', 'star')\n || this.authorisationService.can('query', 'unstar');\n }\n\n public get canPublish() {\n const form = this.querySpace.queryForm.value!;\n\n return this.authorisationService.can('query', 'updateImmediately')\n && form.schema.public.writable;\n }\n\n public updateStarred(val:boolean) {\n this.isStarred = val;\n this.changed();\n }\n\n public updatePublic(val:boolean) {\n this.isPublic = val;\n this.changed();\n }\n\n public changed() {\n this.onChange.emit({ isStarred: !!this.isStarred, isPublic: !!this.isPublic });\n }\n}\n","
\n
\n \n
\n
\n
\n\n
\n
\n \n
\n
\n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport {\n ChangeDetectorRef, Component, ElementRef, Inject, OnInit,\n} from '@angular/core';\nimport { QuerySharingChange } from 'core-app/shared/components/modals/share-modal/query-sharing-form.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\n\n@Component({\n templateUrl: './query-sharing.modal.html',\n})\nexport class QuerySharingModalComponent extends OpModalComponent implements OnInit {\n public query:QueryResource;\n\n public isStarred = false;\n\n public isPublic = false;\n\n public isBusy = false;\n\n public text = {\n title: this.I18n.t('js.modals.form_submit.title'),\n text: this.I18n.t('js.modals.form_submit.text'),\n save_as: this.I18n.t('js.label_save_as'),\n label_name: this.I18n.t('js.modals.label_name'),\n label_visibility_settings: this.I18n.t('js.label_visibility_settings'),\n button_save: this.I18n.t('js.modals.button_save'),\n button_cancel: this.I18n.t('js.button_cancel'),\n close_popup: this.I18n.t('js.close_popup_title'),\n };\n\n constructor(\n readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly I18n:I18nService,\n readonly states:States,\n readonly querySpace:IsolatedQuerySpace,\n readonly cdRef:ChangeDetectorRef,\n readonly wpListService:WorkPackagesListService,\n readonly halNotification:HalResourceNotificationService,\n readonly toastService:ToastService,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit():void {\n super.ngOnInit();\n\n this.query = this.querySpace.query.value!;\n\n this.isStarred = this.query.starred;\n this.isPublic = this.query.public;\n }\n\n public setValues(change:QuerySharingChange):void {\n this.isStarred = change.isStarred;\n this.isPublic = change.isPublic;\n }\n\n public get afterFocusOn():HTMLElement {\n return document.getElementById('work-packages-settings-button') as HTMLElement;\n }\n\n public saveQuery($event:Event):void {\n if (this.isBusy) {\n return;\n }\n\n this.isBusy = true;\n const promises = [];\n\n if (this.query.public !== this.isPublic) {\n this.query.public = this.isPublic;\n\n promises.push(this.wpListService.save(this.query));\n }\n\n if (this.query.starred !== this.isStarred) {\n promises.push(this.wpListService.toggleStarred(this.query));\n }\n\n Promise\n .all(promises)\n .then(() => {\n this.closeMe($event);\n this.isBusy = false;\n })\n .catch(() => {\n this.toastService.addError(this.I18n.t('js.error.query_saving'));\n this.isBusy = false;\n });\n }\n}\n","\n
{{text.label_visibility_settings}}
\n\n
\n\n \n \n\n
\n
\n \n \n
\n
\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectorRef, Component, ElementRef, Inject, ViewChild,\n} from '@angular/core';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { QuerySharingChange } from 'core-app/shared/components/modals/share-modal/query-sharing-form.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { States } from 'core-app/core/states/states.service';\n\n@Component({\n templateUrl: './save-query.modal.html',\n})\nexport class SaveQueryModalComponent extends OpModalComponent {\n public queryName = '';\n\n public isStarred = false;\n\n public isPublic = false;\n\n public isBusy = false;\n\n @ViewChild('queryNameField', { static: true }) queryNameField:ElementRef;\n\n public text = {\n title: this.I18n.t('js.modals.form_submit.title'),\n text: this.I18n.t('js.modals.form_submit.text'),\n save_as: this.I18n.t('js.label_save_as'),\n label_name: this.I18n.t('js.modals.label_name'),\n label_visibility_settings: this.I18n.t('js.label_visibility_settings'),\n button_save: this.I18n.t('js.modals.button_save'),\n button_cancel: this.I18n.t('js.button_cancel'),\n close_popup: this.I18n.t('js.close_popup_title'),\n };\n\n constructor(\n readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly I18n:I18nService,\n readonly states:States,\n readonly querySpace:IsolatedQuerySpace,\n readonly wpListService:WorkPackagesListService,\n readonly halNotification:HalResourceNotificationService,\n readonly cdRef:ChangeDetectorRef,\n readonly toastService:ToastService,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n public setValues(change:QuerySharingChange):void {\n this.isStarred = change.isStarred;\n this.isPublic = change.isPublic;\n }\n\n public onOpen():void {\n this.queryNameField.nativeElement.focus();\n }\n\n public get afterFocusOn():HTMLElement {\n return document.getElementById('work-packages-settings-button') as HTMLElement;\n }\n\n public saveQueryAs($event:Event):void {\n $event.preventDefault();\n\n if (this.isBusy || !this.queryName) {\n return;\n }\n\n this.isBusy = true;\n const query = this.querySpace.query.value!;\n query.public = this.isPublic;\n\n this.wpListService\n .create(query, this.queryName)\n .then((savedQuery:QueryResource):Promise => {\n if (this.isStarred && !savedQuery.starred) {\n return this.wpListService.toggleStarred(savedQuery).then(() => this.closeMe($event));\n }\n\n this.closeMe($event);\n return Promise.resolve(true);\n })\n .catch((error:any) => this.halNotification.handleRawError(error))\n .then(() => this.isBusy = false); // Same as .finally()\n }\n}\n","\n

{{text.save_as}}

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

{{ text.label_visibility_settings }}

\n \n \n \n \n\n
\n
\n \n \n
\n
\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 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(focus:boolean) {\n if (focus) {\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 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n@Component({\n templateUrl: './wp-settings-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageSettingsButtonComponent {\n @Input() hideTableOptions = false;\n\n public text = {\n more_actions: this.I18n.t('js.button_more_actions'),\n };\n\n constructor(readonly I18n:I18nService) {\n }\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\nimport * as sfimport from 'screenfull';\nimport { Screenfull } from 'screenfull';\nimport { AbstractWorkPackageButtonComponent } from '../wp-buttons.module';\n\nconst screenfull:Screenfull = sfimport as any;\nexport const zenModeComponentSelector = 'zen-mode-toggle-button';\n\n@Component({\n templateUrl: '../wp-button.template.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: zenModeComponentSelector,\n})\nexport class ZenModeButtonComponent extends AbstractWorkPackageButtonComponent {\n public buttonId = 'work-packages-zen-mode-toggle-button';\n\n public buttonClass = 'toolbar-icon';\n\n public iconClass = 'icon-zen-mode';\n\n static inZenMode = false;\n\n private activateLabel:string;\n\n private deactivateLabel:string;\n\n constructor(readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef) {\n super(I18n);\n\n this.activateLabel = I18n.t('js.zen_mode.button_activate');\n this.deactivateLabel = I18n.t('js.zen_mode.button_deactivate');\n const self = this;\n\n if (screenfull.enabled) {\n screenfull.onchange(() => {\n // This event might get triggered several times for once leaving\n // fullscreen mode.\n if (!screenfull.isFullscreen) {\n self.deactivateZenMode();\n }\n });\n }\n }\n\n public get label():string {\n if (this.isActive) {\n return this.deactivateLabel;\n }\n return this.activateLabel;\n }\n\n public isToggle():boolean {\n return true;\n }\n\n private deactivateZenMode():void {\n this.isActive = ZenModeButtonComponent.inZenMode = false;\n jQuery('body').removeClass('zen-mode');\n this.disabled = false;\n if (screenfull.enabled && screenfull.isFullscreen) {\n screenfull.exit();\n }\n this.cdRef.detectChanges();\n }\n\n private activateZenMode() {\n this.isActive = ZenModeButtonComponent.inZenMode = true;\n jQuery('body').addClass('zen-mode');\n if (screenfull.enabled) {\n screenfull.request();\n }\n this.cdRef.detectChanges();\n }\n\n public performAction(evt:Event):false {\n if (ZenModeButtonComponent.inZenMode) {\n this.deactivateZenMode();\n } else {\n this.activateZenMode();\n }\n\n evt.preventDefault();\n return false;\n }\n}\n","\n","import { Injector } from '@angular/core';\nimport { CardEventHandler } from 'core-app/features/work-packages/components/wp-card-view/event-handler/card-view-handler-registry';\nimport { WorkPackageCardViewComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { WorkPackageCardViewService } from 'core-app/features/work-packages/components/wp-card-view/services/wp-card-view.service';\nimport { StateService } from '@uirouter/core';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class CardClickHandler implements CardEventHandler {\n // Injections\n @InjectField() deviceService:DeviceService;\n\n @InjectField() $state:StateService;\n\n @InjectField() wpTableSelection:WorkPackageViewSelectionService;\n\n @InjectField() wpTableFocus:WorkPackageViewFocusService;\n\n @InjectField() wpCardView:WorkPackageCardViewService;\n\n constructor(public readonly injector:Injector,\n card:WorkPackageCardViewComponent) {\n }\n\n public get EVENT() {\n return 'click.cardView.card';\n }\n\n public get SELECTOR() {\n return `[data-qa-selector=\"op-wp-single-card\"]`;\n }\n\n public eventScope(card:WorkPackageCardViewComponent) {\n return jQuery(card.container.nativeElement);\n }\n\n public handleEvent(card:WorkPackageCardViewComponent, evt:JQuery.TriggeredEvent) {\n const target = jQuery(evt.target);\n\n // Ignore links\n if (target.is('a') || target.parent().is('a')) {\n return true;\n }\n\n // Locate the card from event\n const element = target.closest('wp-single-card');\n const wpId = element.data('workPackageId');\n\n if (!wpId) {\n return true;\n }\n\n this.handleWorkPackage(card, wpId, element, evt);\n\n return false;\n }\n\n protected handleWorkPackage(card:WorkPackageCardViewComponent, wpId:any, element:JQuery, evt:JQuery.TriggeredEvent) {\n this.setSelection(card, wpId, element, evt);\n\n card.itemClicked.emit({ workPackageId: wpId, double: false });\n }\n\n protected setSelection(card:WorkPackageCardViewComponent, wpId:string, element:JQuery, evt:JQuery.TriggeredEvent) {\n const classIdentifier = element.data('classIdentifier');\n const index = this.wpCardView.findRenderedCard(classIdentifier);\n\n // Update single selection if no modifier present\n if (!(evt.ctrlKey || evt.metaKey || evt.shiftKey)) {\n this.wpTableSelection.setSelection(wpId, index);\n }\n\n // Multiple selection if shift present\n if (evt.shiftKey) {\n this.wpTableSelection.setMultiSelectionFrom(this.wpCardView.renderedCards, wpId, index);\n }\n\n // Single selection expansion if ctrl / cmd(mac)\n if (evt.ctrlKey || evt.metaKey) {\n this.wpTableSelection.toggleRow(wpId);\n }\n\n card.selectionChanged.emit(this.wpTableSelection.getSelectedWorkPackageIds());\n\n // The current card is the last selected work package\n // not matter what other card are (de-)selected below.\n // Thus save that card for the details view button.\n this.wpTableFocus.updateFocus(wpId);\n }\n}\n","import { Injector } from '@angular/core';\nimport { CardEventHandler } from 'core-app/features/work-packages/components/wp-card-view/event-handler/card-view-handler-registry';\nimport { WorkPackageCardViewComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { StateService } from '@uirouter/core';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class CardDblClickHandler implements CardEventHandler {\n @InjectField() $state:StateService;\n\n @InjectField() wpTableSelection:WorkPackageViewSelectionService;\n\n constructor(public readonly injector:Injector,\n card:WorkPackageCardViewComponent) {\n }\n\n public get EVENT() {\n return 'dblclick.cardView.card';\n }\n\n public get SELECTOR() {\n return `[data-qa-selector=\"op-wp-single-card\"]`;\n }\n\n public eventScope(card:WorkPackageCardViewComponent) {\n return jQuery(card.container.nativeElement);\n }\n\n public handleEvent(card:WorkPackageCardViewComponent, evt:JQuery.TriggeredEvent) {\n const target = jQuery(evt.target);\n\n // Ignore links\n if (target.is('a') || target.parent().is('a')) {\n return true;\n }\n\n // Locate the row from event\n const element = target.closest('wp-single-card');\n const wpId = element.data('workPackageId');\n\n if (!wpId) {\n return true;\n }\n\n card.itemClicked.emit({ workPackageId: wpId, double: true });\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { CardEventHandler } from 'core-app/features/work-packages/components/wp-card-view/event-handler/card-view-handler-registry';\nimport { WorkPackageCardViewComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { uiStateLinkClass } from 'core-app/features/work-packages/components/wp-fast-table/builders/ui-state-link-builder';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { WorkPackageCardViewService } from 'core-app/features/work-packages/components/wp-card-view/services/wp-card-view.service';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { WorkPackageViewContextMenu } from 'core-app/shared/components/op-context-menu/wp-context-menu/wp-view-context-menu.directive';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class CardRightClickHandler implements CardEventHandler {\n // Injections\n @InjectField() wpTableSelection:WorkPackageViewSelectionService;\n\n @InjectField() wpCardView:WorkPackageCardViewService;\n\n @InjectField() opContextMenu:OPContextMenuService;\n\n constructor(public readonly injector:Injector,\n card:WorkPackageCardViewComponent) {\n }\n\n public get EVENT() {\n return 'contextmenu.cardView.rightclick';\n }\n\n public get SELECTOR() {\n return `[data-qa-selector=\"op-wp-single-card\"]`;\n }\n\n public eventScope(card:WorkPackageCardViewComponent) {\n return jQuery(card.container.nativeElement);\n }\n\n public handleEvent(card:WorkPackageCardViewComponent, evt:JQuery.TriggeredEvent) {\n const target = jQuery(evt.target);\n\n // We want to keep the original context menu on hrefs\n // (currently, this is only the id)\n if (target.closest(`.${uiStateLinkClass}`).length) {\n debugLog('Allowing original context menu on state link');\n return true;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n\n // Locate the card from event\n const element = target.closest('wp-single-card');\n const wpId = element.data('workPackageId');\n\n if (!wpId) {\n return true;\n }\n const classIdentifier = element.data('classIdentifier');\n const index = this.wpCardView.findRenderedCard(classIdentifier);\n\n if (!this.wpTableSelection.isSelected(wpId)) {\n this.wpTableSelection.setSelection(wpId, index);\n }\n\n const handler = new WorkPackageViewContextMenu(this.injector, wpId, jQuery(evt.target) as JQuery, {}, card.showInfoButton);\n this.opContextMenu.show(handler, evt);\n\n return false;\n }\n}\n","import { WorkPackageCardViewComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { CardClickHandler } from 'core-app/features/work-packages/components/wp-card-view/event-handler/click-handler';\nimport { CardDblClickHandler } from 'core-app/features/work-packages/components/wp-card-view/event-handler/double-click-handler';\nimport { CardRightClickHandler } from 'core-app/features/work-packages/components/wp-card-view/event-handler/right-click-handler';\nimport {\n WorkPackageViewEventHandler,\n WorkPackageViewHandlerRegistry,\n} from 'core-app/features/work-packages/routing/wp-view-base/event-handling/event-handler-registry';\n\nexport type CardEventHandler = WorkPackageViewEventHandler;\n\nexport class CardViewHandlerRegistry extends WorkPackageViewHandlerRegistry {\n protected eventHandlers:((c:WorkPackageCardViewComponent) => CardEventHandler)[] = [\n // Clicking on the card (not within a cell)\n (c) => new CardClickHandler(this.injector, c),\n // Double Clicking on the row (not within a cell)\n (c) => new CardDblClickHandler(this.injector, c),\n // Right clicking on cards\n (t) => new CardRightClickHandler(this.injector, t),\n ];\n}\n","import { Injectable, Injector, Optional } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageViewOrderService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageCreateService } from 'core-app/features/work-packages/components/wp-new/wp-create.service';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { DragAndDropService } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.service';\nimport { findIndex } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.helpers';\nimport { WorkPackageCardViewComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\n@Injectable()\nexport class WorkPackageCardDragAndDropService {\n private _workPackages:WorkPackageResource[];\n\n /** Whether the card view has an active inline created wp */\n public activeInlineCreateWp?:WorkPackageResource;\n\n /** A reference to the component in use, to have access to the current input variables */\n public cardView:WorkPackageCardViewComponent;\n\n public constructor(readonly states:States,\n readonly injector:Injector,\n readonly reorderService:WorkPackageViewOrderService,\n readonly wpCreate:WorkPackageCreateService,\n readonly notificationService:WorkPackageNotificationService,\n readonly apiV3Service:ApiV3Service,\n readonly currentProject:CurrentProjectService,\n @Optional() readonly dragService:DragAndDropService,\n readonly wpInlineCreate:WorkPackageInlineCreateService) {\n\n }\n\n public init(componentRef:WorkPackageCardViewComponent) {\n this.cardView = componentRef;\n }\n\n public destroy() {\n if (this.dragService !== null) {\n this.dragService.remove(this.cardView.container.nativeElement);\n }\n }\n\n public registerDragAndDrop() {\n // The DragService may not have been provided\n // in which case we do not provide drag and drop\n if (this.dragService === null) {\n return;\n }\n\n this.dragService.register({\n dragContainer: this.cardView.container.nativeElement,\n scrollContainers: [this.cardView.container.nativeElement],\n moves: (card:HTMLElement) => {\n const wpId:string = card.dataset.workPackageId!;\n const workPackage = this.states.workPackages.get(wpId).value;\n\n return !!workPackage && this.cardView.canDragOutOf(workPackage) && !card.dataset.isNew;\n },\n accepts: () => this.cardView.dragInto,\n onMoved: async (card:HTMLElement) => {\n const wpId:string = card.dataset.workPackageId!;\n const toIndex = findIndex(card);\n\n const newOrder = await this.reorderService.move(this.currentOrder, wpId, toIndex);\n this.updateOrder(newOrder);\n\n this.cardView.onMoved.emit();\n },\n onRemoved: (card:HTMLElement) => {\n const wpId:string = card.dataset.workPackageId!;\n\n const newOrder = this.reorderService.remove(this.currentOrder, wpId);\n this.updateOrder(newOrder);\n },\n onAdded: async (card:HTMLElement) => {\n const wpId:string = card.dataset.workPackageId!;\n const toIndex = findIndex(card);\n\n const workPackage = await this\n .apiV3Service\n .work_packages\n .id(wpId)\n .get()\n .toPromise();\n const result = await this.addWorkPackageToQuery(workPackage, toIndex);\n\n if (card.parentElement) {\n card.parentElement.removeChild(card);\n }\n\n return result;\n },\n });\n }\n\n /**\n * Get the current work packages\n */\n public get workPackages():WorkPackageResource[] {\n return this._workPackages;\n }\n\n /**\n * Set work packages array,\n * remembering to keep the active inline-create\n */\n public set workPackages(workPackages:WorkPackageResource[]) {\n if (this.activeInlineCreateWp) {\n const existingNewWp = this._workPackages.find((o) => isNewResource(o));\n\n // If there is already a card for a new WP,\n // we have to replace this one by the new activeInlineCreateWp\n if (existingNewWp) {\n const index = this._workPackages.indexOf(existingNewWp);\n this._workPackages[index] = this.activeInlineCreateWp;\n } else {\n this._workPackages = [this.activeInlineCreateWp, ...workPackages];\n }\n } else {\n this._workPackages = [...workPackages];\n }\n }\n\n /**\n * Get current order\n */\n private get currentOrder():string[] {\n return this.workPackages\n .filter((wp) => wp && !isNewResource(wp))\n .map((el) => el.id!);\n }\n\n /**\n * Update current order\n */\n private updateOrder(newOrder:string[]) {\n newOrder = _.uniq(newOrder);\n\n Promise\n .all(newOrder.map((id) => this\n .apiV3Service\n .work_packages\n .id(id)\n .get()\n .toPromise()))\n .then((workPackages:WorkPackageResource[]) => {\n this.workPackages = workPackages;\n this.cardView.cdRef.detectChanges();\n });\n }\n\n /**\n * Inline create a new card\n */\n public addNewCard() {\n this.wpCreate\n .createOrContinueWorkPackage(this.currentProject.identifier)\n .then((changeset:WorkPackageChangeset) => {\n this.activeInlineCreateWp = changeset.projectedResource;\n this.workPackages = this.workPackages;\n this.cardView.cdRef.detectChanges();\n });\n }\n\n /**\n * Add the given work package to the query\n */\n async addWorkPackageToQuery(workPackage:WorkPackageResource, toIndex = -1):Promise {\n try {\n await this.cardView.workPackageAddedHandler(workPackage);\n const newOrder = await this.reorderService.add(this.currentOrder, workPackage.id!, toIndex);\n this.updateOrder(newOrder);\n return true;\n } catch (e) {\n this.notificationService.handleRawError(e, workPackage);\n }\n\n return false;\n }\n\n /**\n * Remove the new card\n */\n public removeReferenceWorkPackageForm() {\n if (this.activeInlineCreateWp) {\n this.removeCard(this.activeInlineCreateWp);\n }\n }\n\n removeCard(wp:WorkPackageResource) {\n const index = this.workPackages.indexOf(wp);\n this.workPackages.splice(index, 1);\n this.activeInlineCreateWp = undefined;\n\n if (!isNewResource(wp)) {\n const newOrder = this.reorderService.remove(this.currentOrder, wp.id!);\n this.updateOrder(newOrder);\n }\n }\n\n /**\n * On new card saved\n */\n async onCardSaved(wp:WorkPackageResource) {\n const index = this.workPackages.findIndex((el) => el.id === 'new');\n\n if (index !== -1) {\n this.activeInlineCreateWp = undefined;\n\n // Add this item to the results\n const newOrder = await this.reorderService.add(this.currentOrder, wp.id!, index);\n this.updateOrder(newOrder);\n\n // Notify inline create service\n this.wpInlineCreate.newInlineWorkPackageCreated.next(wp.id!);\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\n\n@Injectable()\nexport class WorkPackageCardViewService {\n public constructor(readonly querySpace:IsolatedQuerySpace) {\n }\n\n public classIdentifier(wp:WorkPackageResource) {\n // The same class names are used for the proximity to the table representation.\n return `wp-row-${wp.id}`;\n }\n\n public get renderedCards() {\n return this.querySpace.tableRendered.getValueOr([]);\n }\n\n public findRenderedCard(classIdentifier:string):number {\n const index = _.findIndex(this.renderedCards, (card) => card.classIdentifier === classIdentifier);\n\n return index;\n }\n\n public updateRenderedCardsValues(workPackages:WorkPackageResource[]) {\n this.querySpace.tableRendered.putValue(\n workPackages.map((wp) => ({\n classIdentifier: this.classIdentifier(wp),\n workPackageId: wp.id,\n hidden: false,\n })),\n );\n }\n}\n","
\n
\n \n \n
\n\n \n \n \n\n
\n
\n
\n\n
\n \n
\n\n\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Injector,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { WorkPackageCreateService } from 'core-app/features/work-packages/components/wp-new/wp-create.service';\nimport { trackByHrefAndProperty } from 'core-app/shared/helpers/angular/tracking-functions';\nimport { CardHighlightingMode } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting-mode.const';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { StateService } from '@uirouter/core';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewOrderService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport {\n filter,\n map,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { CausedUpdatesService } from 'core-app/features/boards/board/caused-updates/caused-updates.service';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { CardViewHandlerRegistry } from 'core-app/features/work-packages/components/wp-card-view/event-handler/card-view-handler-registry';\nimport { WorkPackageCardViewService } from 'core-app/features/work-packages/components/wp-card-view/services/wp-card-view.service';\nimport { WorkPackageCardDragAndDropService } from 'core-app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport {\n WorkPackageViewHandlerToken,\n WorkPackageViewOutputs,\n} from 'core-app/features/work-packages/routing/wp-view-base/event-handling/event-handler-registry';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\nexport type CardViewOrientation = 'horizontal'|'vertical';\n\n@Component({\n selector: 'wp-card-view',\n styleUrls: ['./styles/wp-card-view.component.sass', './styles/wp-card-view-horizontal.sass', './styles/wp-card-view-vertical.sass'],\n templateUrl: './wp-card-view.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageCardViewComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit, WorkPackageViewOutputs {\n @Input('dragOutOfHandler') public canDragOutOf:(wp:WorkPackageResource) => boolean;\n\n @Input() public dragInto:boolean;\n\n @Input() public highlightingMode:CardHighlightingMode;\n\n @Input() public workPackageAddedHandler:(wp:WorkPackageResource) => Promise;\n\n @Input() public showStatusButton = true;\n\n @Input() public showInfoButton = false;\n\n @Input() public orientation:CardViewOrientation = 'vertical';\n\n /** Whether cards are removable */\n @Input() public cardsRemovable = false;\n\n /** Whether a notification box shall be shown when there are no WP to display */\n @Input() public showEmptyResultsBox = false;\n\n /** Whether on special mobile version of the cards shall be shown */\n @Input() public shrinkOnMobile = false;\n\n /** Container reference */\n @ViewChild('container', { static: true }) public container:ElementRef;\n\n @Output() public onMoved = new EventEmitter();\n\n @Output() selectionChanged = new EventEmitter();\n\n @Output() itemClicked = new EventEmitter<{ workPackageId:string, double:boolean }>();\n\n @Output() stateLinkClicked = new EventEmitter<{ workPackageId:string, requestedState:string }>();\n\n public trackByHref = trackByHrefAndProperty('lockVersion');\n\n public query:QueryResource;\n\n public isResultEmpty = false;\n\n public columns:QueryColumn[];\n\n public text = {\n removeCard: this.I18n.t('js.card.remove_from_list'),\n addNewCard: this.I18n.t('js.card.add_new'),\n noResults: {\n title: this.I18n.t('js.work_packages.no_results.title'),\n description: this.I18n.t('js.work_packages.no_results.description'),\n },\n };\n\n public inReference = false;\n\n public referenceClass = this.wpInlineCreate.referenceComponentClass;\n\n // We need to mount a dynamic component into the view\n // but map the following output\n public referenceOutputs = {\n onCancel: () => this.setReferenceMode(false),\n onReferenced: (wp:WorkPackageResource) => this.cardDragDrop.addWorkPackageToQuery(wp, 0),\n };\n\n isNewResource = isNewResource;\n\n constructor(readonly querySpace:IsolatedQuerySpace,\n readonly states:States,\n readonly injector:Injector,\n readonly $state:StateService,\n readonly I18n:I18nService,\n readonly wpCreate:WorkPackageCreateService,\n readonly wpInlineCreate:WorkPackageInlineCreateService,\n readonly notificationService:WorkPackageNotificationService,\n readonly halEvents:HalEventsService,\n readonly authorisationService:AuthorisationService,\n readonly causedUpdates:CausedUpdatesService,\n readonly cdRef:ChangeDetectorRef,\n readonly pathHelper:PathHelperService,\n readonly wpTableSelection:WorkPackageViewSelectionService,\n readonly wpViewOrder:WorkPackageViewOrderService,\n readonly cardView:WorkPackageCardViewService,\n readonly cardDragDrop:WorkPackageCardDragAndDropService,\n readonly deviceService:DeviceService) {\n super();\n }\n\n ngOnInit() {\n this.registerCreationCallback();\n\n // Observe changes to the work packages in this view\n this.halEvents\n .aggregated$('WorkPackage')\n .pipe(\n map((events) => events.filter((event) => event.eventType === 'updated')),\n filter((events) => {\n const wpIds:string[] = this.workPackages.map((el) => el.id!.toString());\n return !!events.find((event) => wpIds.indexOf(event.id) !== -1);\n }),\n ).subscribe(() => {\n this.workPackages = this.workPackages.map((wp) => this.states.workPackages.get(wp.id!).getValueOr(wp));\n this.cdRef.detectChanges();\n });\n\n this.querySpace.results\n .values$()\n .pipe(\n withLatestFrom(this.querySpace.query.values$()),\n this.untilDestroyed(),\n ).subscribe(([results, query]) => {\n this.query = query;\n this.workPackages = this.wpViewOrder.orderedWorkPackages();\n this.cardView.updateRenderedCardsValues(this.workPackages);\n this.isResultEmpty = this.workPackages.length === 0;\n this.cdRef.detectChanges();\n });\n }\n\n ngAfterViewInit() {\n this.cardDragDrop.init(this);\n\n // Register Drag & Drop only on desktop\n if (!this.deviceService.isMobile) {\n this.cardDragDrop.registerDragAndDrop();\n }\n\n // Register event handlers for the cards\n const registry = this.injector.get(WorkPackageViewHandlerToken, CardViewHandlerRegistry);\n if (registry instanceof CardViewHandlerRegistry) {\n registry.attachTo(this);\n } else {\n new registry(this.injector).attachTo(this);\n }\n this.wpTableSelection.registerSelectAllListener(() => this.cardView.renderedCards);\n this.wpTableSelection.registerDeselectAllListener();\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n this.cardDragDrop.destroy();\n }\n\n public get workPackages():WorkPackageResource[] {\n return this.cardDragDrop.workPackages;\n }\n\n public set workPackages(workPackages:WorkPackageResource[]) {\n this.cardDragDrop.workPackages = workPackages;\n }\n\n public setReferenceMode(mode:boolean) {\n this.inReference = mode;\n this.cdRef.detectChanges();\n }\n\n public addNewCard() {\n this.cardDragDrop.addNewCard();\n }\n\n public removeCard(wp:WorkPackageResource) {\n this.cardDragDrop.removeCard(wp);\n }\n\n async onCardSaved(wp:WorkPackageResource) {\n await this.cardDragDrop.onCardSaved(wp);\n }\n\n public classes() {\n let classes = 'wp-cards-container ';\n classes += `-${this.orientation}`;\n classes += this.shrinkOnMobile ? ' -shrink' : '';\n\n return classes;\n }\n\n /**\n * Listen to newly created work packages to detect whether the WP is the one we created,\n * and properly reset inline create in this case\n */\n private registerCreationCallback() {\n this.wpCreate\n .onNewWorkPackage()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(async (wp:WorkPackageResource) => {\n this.onCardSaved(wp);\n });\n }\n}\n","\n\n
\n
\n\n
\n
\n \n \n \n\n \n \n \n\n 0\"\n [attr.data-tooltip]=\"disabledInfo.text\"\n class=\"-multiline op-wp-single-card--card-action op-wp-single-card--card-action_closed\"\n [ngClass]=\"'tooltip--' + disabledInfo.orientation\"\n icon-classes=\"icon-context icon-not-supported\">\n \n
\n
\n\n \n
\n \n \n \n \n
\n
\n\n
\n \n - {{wpProjectName(workPackage)}}\n \n \n #{{workPackage.id}}\n \n\n \n \n {{startDate(workPackage)}} -\n \n\n \n\n \n\n \n - {{endDate(workPackage)}}\n \n \n\n \n \n \n \n
\n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { uiStateLinkClass } from 'core-app/features/work-packages/components/wp-fast-table/builders/ui-state-link-builder';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\nimport {\n StateService,\n UIRouterGlobals,\n} from '@uirouter/core';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { WorkPackageCardViewService } from 'core-app/features/work-packages/components/wp-card-view/services/wp-card-view.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CardHighlightingMode } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting-mode.const';\nimport { CardViewOrientation } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { isClickedWithModifier } from 'core-app/shared/helpers/link-handling/link-handling';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { StatusResource } from 'core-app/features/hal/resources/status-resource';\nimport { combineLatest } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n@Component({\n selector: 'wp-single-card',\n styleUrls: ['./wp-single-card.component.sass'],\n templateUrl: './wp-single-card.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageSingleCardComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public selectedWhenOpen = false;\n\n @Input() public showInfoButton = false;\n\n @Input() public showStatusButton = true;\n\n @Input() public showRemoveButton = false;\n\n @Input() public highlightingMode:CardHighlightingMode = 'inline';\n\n @Input() public draggable = false;\n\n @Input() public orientation:CardViewOrientation = 'vertical';\n\n @Input() public shrinkOnMobile = false;\n\n @Input() public disabledInfo?:{ text:string, orientation:'left'|'right' };\n\n @Input() public showAsInlineCard = false;\n\n @Input() public showStartDate = true;\n\n @Input() public showEndDate = true;\n\n @Input() public isClosed = false;\n\n @Input() public showAsGhost = false;\n\n @Output() onRemove = new EventEmitter();\n\n @Output() stateLinkClicked = new EventEmitter<{ workPackageId:string, requestedState:string }>();\n\n @Output() cardClicked = new EventEmitter<{ workPackageId:string, event:MouseEvent }>();\n\n @Output() cardDblClicked = new EventEmitter<{ workPackageId:string, event:MouseEvent }>();\n\n @Output() cardContextMenu = new EventEmitter<{ workPackageId:string, event:MouseEvent }>();\n\n public uiStateLinkClass:string = uiStateLinkClass;\n\n public selected = false;\n\n public text = {\n removeCard: this.I18n.t('js.card.remove_from_list'),\n detailsView: this.I18n.t('js.button_open_details'),\n };\n\n public isNewResource = isNewResource;\n\n private dateTimeFormatYear = new Intl.DateTimeFormat(this.I18n.locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n\n private dateTimeFormat = new Intl.DateTimeFormat(this.I18n.locale, {\n month: 'short',\n day: 'numeric',\n });\n\n constructor(\n readonly pathHelper:PathHelperService,\n readonly I18n:I18nService,\n readonly $state:StateService,\n readonly uiRouterGlobals:UIRouterGlobals,\n readonly wpTableSelection:WorkPackageViewSelectionService,\n readonly wpTableFocus:WorkPackageViewFocusService,\n readonly cardView:WorkPackageCardViewService,\n readonly cdRef:ChangeDetectorRef,\n readonly timezoneService:TimezoneService,\n ) {\n super();\n }\n\n ngOnInit():void {\n // Update selection state\n combineLatest([\n this.wpTableSelection.live$(),\n this.uiRouterGlobals.params$,\n ])\n .pipe(\n this.untilDestroyed(),\n map(() => {\n if (this.selectedWhenOpen) {\n return this.uiRouterGlobals.params.workPackageId === this.workPackage.id;\n }\n\n return this.wpTableSelection.isSelected(this.workPackage.id as string);\n }),\n )\n .subscribe((selected) => {\n this.selected = selected;\n this.cdRef.detectChanges();\n });\n }\n\n public classIdentifier(wp:WorkPackageResource):string {\n return this.cardView.classIdentifier(wp);\n }\n\n public emitStateLinkClicked(event:MouseEvent, wp:WorkPackageResource, detail?:boolean):void {\n if (isClickedWithModifier(event)) {\n return;\n }\n\n const classIdentifier = this.classIdentifier(wp);\n const stateToEmit = detail ? 'split' : 'show';\n\n this.wpTableSelection.setSelection(wp.id!, this.cardView.findRenderedCard(classIdentifier));\n this.wpTableFocus.updateFocus(wp.id!);\n this.stateLinkClicked.emit({ workPackageId: wp.id!, requestedState: stateToEmit });\n event.preventDefault();\n }\n\n public cardClasses():{ [className:string]:boolean } {\n const base = 'op-wp-single-card';\n\n return {\n [`${base}_selected`]: this.selected,\n [`${base}_draggable`]: this.draggable,\n [`${base}_new`]: isNewResource(this.workPackage),\n [`${base}_shrink`]: this.shrinkOnMobile,\n [`${base}_inline`]: this.showAsInlineCard,\n [`${base}_closed`]: this.isClosed,\n [`${base}_ghosted`]: this.showAsGhost,\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n [`${base}-${this.workPackage.id}`]: !!this.workPackage.id,\n [`${base}_${this.orientation}`]: true,\n };\n }\n\n cardTitle():string {\n return `${this.workPackage.subject} (${(this.workPackage.status as StatusResource).name})`;\n }\n\n // eslint-disable-next-line class-methods-use-this\n public wpTypeAttribute(wp:WorkPackageResource):string {\n return wp.type.name;\n }\n\n // eslint-disable-next-line class-methods-use-this\n public wpSubject(wp:WorkPackageResource):string {\n return wp.subject;\n }\n\n // eslint-disable-next-line class-methods-use-this\n public wpProjectName(wp:WorkPackageResource):string {\n return wp.project?.name;\n }\n\n public wpDates(wp:WorkPackageResource):string {\n const { startDate, dueDate } = wp;\n\n if (startDate && dueDate) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore see https://github.com/microsoft/TypeScript/issues/46905\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n return String(this.dateTimeFormatYear.formatRange(new Date(startDate), new Date(dueDate)));\n }\n\n if (!startDate && dueDate) {\n return `– ${this.dateTimeFormatYear.format(new Date(dueDate))}`;\n }\n\n if (startDate && !dueDate) {\n return `${this.dateTimeFormatYear.format(new Date(startDate))} –`;\n }\n\n return '';\n }\n\n startDate(wp:WorkPackageResource):string {\n const { startDate } = wp;\n if (!startDate) {\n return '';\n }\n\n return this.dateTimeFormat.format(new Date(startDate));\n }\n\n endDate(wp:WorkPackageResource):string {\n const { dueDate } = wp;\n if (!dueDate) {\n return '';\n }\n\n return this.dateTimeFormat.format(new Date(dueDate));\n }\n\n wpOverDueHighlighting(wp:WorkPackageResource):string {\n const diff = this.timezoneService.daysFromToday(wp.dueDate);\n return Highlighting.overdueDate(diff);\n }\n\n public fullWorkPackageLink(wp:WorkPackageResource):string {\n return this.$state.href('work-packages.show', { workPackageId: wp.id });\n }\n\n public cardHighlightingClass(wp:WorkPackageResource):string {\n return this.cardHighlighting(wp);\n }\n\n public typeHighlightingClass(wp:WorkPackageResource):string {\n return this.attributeHighlighting('type', wp);\n }\n\n public onRemoved(wp:WorkPackageResource):void {\n this.onRemove.emit(wp);\n }\n\n public cardCoverImageShown(wp:WorkPackageResource):boolean {\n return this.bcfSnapshotPath(wp) !== null;\n }\n\n // eslint-disable-next-line class-methods-use-this\n public bcfSnapshotPath(wp:WorkPackageResource):string|null {\n return wp.bcfViewpoints && wp.bcfViewpoints.length > 0 ? `${wp.bcfViewpoints[0].href}/snapshot` : null;\n }\n\n private cardHighlighting(wp:WorkPackageResource):string {\n if (['status', 'priority', 'type'].includes(this.highlightingMode)) {\n return Highlighting.backgroundClass(this.highlightingMode, wp[this.highlightingMode].id);\n }\n return '';\n }\n\n // eslint-disable-next-line class-methods-use-this\n private attributeHighlighting(type:string, wp:WorkPackageResource):string {\n return Highlighting.inlineClass(type, wp.type.id!);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 if ([ 'startDate', 'dueDate', 'duration' ].indexOf(attribute) !== -1) {\n td.classList.add('-no-ellipsis');\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injector } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { States } from 'core-app/core/states/states.service';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\n\nimport { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { FocusHelperService } from 'core-app/shared/directives/focus/focus-helper';\nimport { EditingPortalService } from 'core-app/shared/components/fields/edit/editing-portal/editing-portal-service';\nimport { CellBuilder, editCellContainer, tdClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/cell-builder';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { EditForm } from 'core-app/shared/components/fields/edit/edit-form/edit-form';\nimport { editModeClassName } from 'core-app/shared/components/fields/edit/edit-field.component';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\nexport const activeFieldContainerClassName = 'inline-edit--active-field';\nexport const activeFieldClassName = 'inline-edit--field';\n\nexport class TableEditForm extends EditForm {\n @InjectField() public wpTableColumns:WorkPackageViewColumnsService;\n\n @InjectField() public apiV3Service!:ApiV3Service;\n\n @InjectField() public states:States;\n\n @InjectField() public FocusHelper:FocusHelperService;\n\n @InjectField() public editingPortalService:EditingPortalService;\n\n // Use cell builder to reset edit fields\n private cellBuilder = new CellBuilder(this.injector);\n\n // Subscription\n private resourceSubscription:Subscription = this\n .apiV3Service\n .work_packages\n .id(this.workPackageId)\n .requireAndStream()\n .subscribe((wp) => this.resource = wp);\n\n constructor(public injector:Injector,\n public table:WorkPackageTable,\n public workPackageId:string,\n public classIdentifier:string) {\n super(injector);\n }\n\n destroy() {\n this.resourceSubscription.unsubscribe();\n }\n\n public findContainer(fieldName:string):JQuery {\n return this.rowContainer.find(`.${tdClassName}.${fieldName} .${editCellContainer}`).first();\n }\n\n public findCell(fieldName:string) {\n return this.rowContainer.find(`.${tdClassName}.${fieldName}`).first();\n }\n\n public activateField(form:EditForm, schema:IFieldSchema, fieldName:string, errors:string[]):Promise {\n return this.waitForContainer(fieldName)\n .then((cell) => {\n // Forcibly set the width since the edit field may otherwise\n // be given more width. Thereby preserve a minimum width of 150.\n // To avoid flickering content, the padding is removed, too.\n const td = this.findCell(fieldName);\n td.addClass(editModeClassName);\n let width = parseInt(td.css('width'));\n width = width > 150 ? width - 10 : 150;\n td.css('max-width', `${width}px`);\n td.css('width', `${width}px`);\n\n return this.editingPortalService.create(\n cell,\n this.injector,\n form,\n schema,\n fieldName,\n errors,\n );\n });\n }\n\n public reset(fieldName:string, focus?:boolean) {\n const cell = this.findContainer(fieldName);\n const td = this.findCell(fieldName);\n\n if (cell.length) {\n this.findCell(fieldName).css('width', '');\n this.findCell(fieldName).css('max-width', '');\n this.cellBuilder.refresh(cell[0], this.resource, fieldName);\n td.removeClass(editModeClassName);\n\n if (focus) {\n this.FocusHelper.focus(cell[0]);\n }\n }\n }\n\n public requireVisible(fieldName:string):Promise {\n this.wpTableColumns.addColumn(fieldName);\n return this.waitForContainer(fieldName);\n }\n\n protected focusOnFirstError():void {\n // Focus the first field that is erroneous\n jQuery(this.table.tableAndTimelineContainer)\n .find(`.${activeFieldContainerClassName}.-error .${activeFieldClassName}`)\n .first()\n .trigger('focus');\n }\n\n /**\n * Load the resource form to get the current field schema with all\n * values loaded.\n * @param fieldName\n */\n protected loadFieldSchema(fieldName:string, noWarnings = false):Promise {\n // We need to handle start/due date cases like they were combined dates\n if (['startDate', 'dueDate', 'date'].includes(fieldName)) {\n fieldName = 'combinedDate';\n }\n\n return super.loadFieldSchema(fieldName, noWarnings);\n }\n\n // Ensure the given field is visible.\n // We may want to look into MutationObserver if we need this in several places.\n private waitForContainer(fieldName:string):Promise {\n return new Promise((resolve, reject) => {\n const interval = setInterval(() => {\n const container = this.findContainer(fieldName);\n\n if (container.length > 0) {\n clearInterval(interval);\n resolve(container[0]);\n }\n }, 100);\n });\n }\n\n private get rowContainer() {\n return jQuery(this.table.tableAndTimelineContainer).find(`.${this.classIdentifier}-table`);\n }\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { EditForm } from 'core-app/shared/components/fields/edit/edit-form/edit-form';\nimport { TableEditForm } from 'core-app/features/work-packages/components/wp-edit-form/table-edit-form';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class WorkPackageTableEditingContext {\n @InjectField() public halEditing:HalResourceEditingService;\n\n constructor(readonly table:WorkPackageTable,\n readonly injector:Injector) {\n }\n\n public forms:{ [wpId:string]:TableEditForm } = {};\n\n public reset() {\n _.each(this.forms, (form) => form.destroy());\n this.forms = {};\n }\n\n public change(workPackage:WorkPackageResource):WorkPackageChangeset|undefined {\n return this.halEditing.typedState(workPackage).value;\n }\n\n // TODO\n public stopEditing(workPackage:WorkPackageResource) {\n this.halEditing.stopEditing(workPackage);\n\n const existing = this.forms[workPackage.id!];\n if (existing) {\n existing.destroy();\n delete this.forms[workPackage.id!];\n }\n }\n\n public startEditing(workPackage:WorkPackageResource, classIdentifier:string):EditForm {\n const wpId = workPackage.id!;\n const existing = this.forms[wpId];\n if (existing) {\n return existing;\n }\n\n // Get any existing edit state for this work package\n return this.forms[wpId] = new TableEditForm(this.injector, this.table, wpId, classIdentifier);\n }\n}\n","import { Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WorkPackageViewCollapsedGroupsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-collapsed-groups.service';\nimport { WorkPackageTableConfiguration } from 'core-app/features/work-packages/components/wp-table/wp-table-configuration';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { WorkPackageTimelineTableController } from '../wp-table/timeline/container/wp-timeline-container.directive';\nimport { GroupedRowsBuilder } from './builders/modes/grouped/grouped-rows-builder';\nimport { HierarchyRowsBuilder } from './builders/modes/hierarchy/hierarchy-rows-builder';\nimport { PlainRowsBuilder } from './builders/modes/plain/plain-rows-builder';\nimport { RowsBuilder } from './builders/modes/rows-builder';\nimport { PrimaryRenderPass } from './builders/primary-render-pass';\nimport { WorkPackageTableEditingContext } from './wp-table-editing';\nimport { WorkPackageTableRow } from './wp-table.interfaces';\n\nexport class WorkPackageTable {\n @InjectField() querySpace:IsolatedQuerySpace;\n\n @InjectField() apiV3Service:ApiV3Service;\n\n @InjectField() states:States;\n\n @InjectField() I18n!:I18nService;\n\n @InjectField() workPackageViewCollapsedGroupsService:WorkPackageViewCollapsedGroupsService;\n\n public originalRows:string[] = [];\n\n public originalRowIndex:{ [id:string]:WorkPackageTableRow } = {};\n\n private hierarchyRowsBuilder = new HierarchyRowsBuilder(this.injector, this);\n\n private groupedRowsBuilder = new GroupedRowsBuilder(this.injector, this);\n\n private plainRowsBuilder = new PlainRowsBuilder(this.injector, this);\n\n // WP rows builder\n // Ordered by priority\n private builders = [this.hierarchyRowsBuilder, this.groupedRowsBuilder, this.plainRowsBuilder];\n\n // Last render pass used for refreshing single rows\n public lastRenderPass:PrimaryRenderPass|null = null;\n\n // Work package editing context handler in the table, which handles open forms\n // and their contexts\n public editing:WorkPackageTableEditingContext = new WorkPackageTableEditingContext(this, this.injector);\n\n constructor(public readonly injector:Injector,\n public tableAndTimelineContainer:HTMLElement,\n public scrollContainer:HTMLElement,\n public tbody:HTMLElement,\n public timelineBody:HTMLElement,\n public timelineController:WorkPackageTimelineTableController,\n public configuration:WorkPackageTableConfiguration) {\n }\n\n public get renderedRows() {\n return this.querySpace.tableRendered.getValueOr([]);\n }\n\n public findRenderedRow(classIdentifier:string):[number, RenderedWorkPackage] {\n const index = _.findIndex(this.renderedRows, (row) => row.classIdentifier === classIdentifier);\n\n return [index, this.renderedRows[index]];\n }\n\n public get rowBuilder():RowsBuilder {\n return _.find(this.builders, (builder:RowsBuilder) => builder.isApplicable(this))!;\n }\n\n /**\n * Build the row index and positions from the given set of ordered work packages.\n * @param rows\n */\n private buildIndex(rows:WorkPackageResource[]) {\n this.originalRowIndex = {};\n this.originalRows = rows.map((wp:WorkPackageResource, i:number) => {\n const wpId = wp.id!;\n\n // Ensure we get the latest version\n wp = this.apiV3Service.work_packages.cache.current(wpId, wp)!;\n\n this.originalRowIndex[wpId] = { object: wp, workPackageId: wpId, position: i };\n return wpId;\n });\n }\n\n /**\n *\n * @param rows\n */\n public initialSetup(rows:WorkPackageResource[]) {\n // Build the row representation\n this.buildIndex(rows);\n\n // Draw work packages\n this.redrawTableAndTimeline();\n }\n\n /**\n * Removes the contents of this table's tbody and redraws\n * all elements.\n */\n public redrawTableAndTimeline() {\n const renderPass = this.performRenderPass(false);\n\n // Insert timeline body\n requestAnimationFrame(() => {\n this.tbody.innerHTML = '';\n this.timelineBody.innerHTML = '';\n this.tbody.appendChild(renderPass.tableBody);\n this.timelineBody.appendChild(renderPass.timeline.timelineBody);\n\n // Mark rendering event in a timeout to let DOM process\n setTimeout(() => this.querySpace.tableRendered.putValue(renderPass.result));\n });\n }\n\n /**\n * Redraw all elements in the table section only\n */\n public redrawTable() {\n const renderPass = this.performRenderPass();\n this.querySpace.tableRendered.putValue(renderPass.result);\n }\n\n /**\n * Redraw single rows for a given work package being updated.\n */\n public refreshRows(workPackage:WorkPackageResource) {\n const pass = this.lastRenderPass;\n if (!pass) {\n debugLog('Trying to refresh a singular row without a previous render pass.');\n return;\n }\n\n _.each(pass.renderedOrder, (row) => {\n if (row.workPackage && row.workPackage.id === workPackage.id!) {\n debugLog(`Refreshing rendered row ${row.classIdentifier}`);\n row.workPackage = workPackage;\n pass.refresh(row, workPackage, this.tbody);\n }\n });\n }\n\n /**\n * Determine whether we need an empty placeholder row.\n * When D&D is enabled, the table requires a drag target that is non-empty,\n * and the tbody cannot be resized appropriately.\n */\n public get renderPlaceholderRow() {\n return this.configuration.dragAndDropEnabled;\n }\n\n /**\n * Perform the render pass\n * @param insert whether to insert the result (set to false for timeline)\n */\n private performRenderPass(insert = true) {\n this.editing.reset();\n const renderPass = this.lastRenderPass = this.rowBuilder.buildRows();\n\n // Insert table body\n if (insert) {\n requestAnimationFrame(() => {\n this.tbody.innerHTML = '';\n this.tbody.appendChild(renderPass.tableBody);\n });\n }\n\n return renderPass;\n }\n\n setGroupsCollapseState(newState:{ [key:string]:boolean }) {\n this.querySpace.collapsedGroups.putValue(newState);\n\n const t0 = performance.now();\n this.groupedRowsBuilder.refreshExpansionState();\n const t1 = performance.now();\n\n debugLog(`Group redraw took ${t1 - t0} milliseconds.`);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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.onReady().then(() => this.highlightingModeChanged());\n\n this.wpTableHighlight\n .updates$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n distinctUntilChanged(),\n )\n .subscribe(() => this.highlightingModeChanged());\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 private highlightingModeChanged():void {\n this.highlightingMode = this.wpTableHighlight.current.mode;\n this.cdRef.detectChanges();\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Injector,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { filter } from 'rxjs/operators';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport {\n combineLatest,\n Subscription,\n} from 'rxjs';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { EditForm } from 'core-app/shared/components/fields/edit/edit-form/edit-form';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport {\n inlineCreateCancelClassName,\n InlineCreateRowBuilder,\n inlineCreateRowClassName,\n} from './inline-create-row-builder';\nimport { WorkPackageCreateService } from '../wp-new/wp-create.service';\nimport { WorkPackageTable } from '../wp-fast-table/wp-fast-table';\nimport { onClickOrEnter } from '../wp-fast-table/handlers/click-or-enter-handler';\n\n@Component({\n selector: '[wpInlineCreate]',\n templateUrl: './wp-inline-create.component.html',\n})\nexport class WorkPackageInlineCreateComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit {\n @Input('wp-inline-create--table') table:WorkPackageTable;\n\n @Input('wp-inline-create--project-identifier') projectIdentifier:string;\n\n @Output('wp-inline-create--showing') showing = new EventEmitter();\n\n // inner state\n public canAdd = false;\n\n public canReference = false;\n\n // Inline create / reference row is active\n public mode:'inactive'|'create'|'reference' = 'inactive';\n\n public focus = false;\n\n public text = this.wpInlineCreate.buttonTexts;\n\n private currentWorkPackage:WorkPackageResource|null;\n\n private workPackageEditForm:EditForm|undefined;\n\n private editingSubscription:Subscription|undefined;\n\n private $element:JQuery;\n\n get isActive():boolean {\n return this.mode !== 'inactive';\n }\n\n constructor(public readonly injector:Injector,\n protected readonly elementRef:ElementRef,\n protected readonly schemaCache:SchemaCacheService,\n protected readonly I18n:I18nService,\n protected readonly querySpace:IsolatedQuerySpace,\n protected readonly cdRef:ChangeDetectorRef,\n protected readonly wpCreate:WorkPackageCreateService,\n protected readonly wpInlineCreate:WorkPackageInlineCreateService,\n protected readonly wpTableColumns:WorkPackageViewColumnsService,\n protected readonly wpTableFocus:WorkPackageViewFocusService,\n protected readonly authorisationService:AuthorisationService) {\n super();\n }\n\n ngOnInit() {\n this.$element = jQuery(this.elementRef.nativeElement);\n }\n\n ngAfterViewInit():void {\n combineLatest([\n this.wpInlineCreate.canAdd,\n this.wpInlineCreate.canReference,\n ])\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(([canAdd, canReference]) => {\n this.canAdd = canAdd;\n this.canReference = this.hasReferenceClass && canReference;\n this.cdRef.detectChanges();\n this.showing.emit(this.canAdd || this.canReference);\n });\n\n // Register callback on newly created work packages\n this.registerCreationCallback();\n\n // Watch on this scope when the columns change and refresh this row\n this.refreshOnColumnChanges();\n\n // Cancel edition of current new row\n this.registerCancelHandler();\n }\n\n /**\n * Reset the inline creation row on the cancel button,\n * which is dynamically inserted into the action row by the inline create renderer.\n */\n private registerCancelHandler() {\n this.$element.on('click keydown', `.${inlineCreateCancelClassName}`, (evt:JQuery.TriggeredEvent) => {\n onClickOrEnter(evt, () => {\n this.resetRow();\n });\n\n evt.stopImmediatePropagation();\n return false;\n });\n }\n\n /**\n * Since the table is refreshed imperatively whenever columns are changed,\n * we need to manually ensure the inline create row gets refreshed as well.\n */\n private refreshOnColumnChanges() {\n this.wpTableColumns\n .updates$()\n .pipe(\n filter(() => this.isActive), // Take only when row is inserted\n this.untilDestroyed(),\n )\n .subscribe(() => this.refreshRow());\n }\n\n /**\n * Listen to newly created work packages to detect whether the WP is the one we created,\n * and properly reset inline create in this case\n */\n private registerCreationCallback() {\n this.wpCreate\n .onNewWorkPackage()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp:WorkPackageResource) => {\n if (this.currentWorkPackage && this.currentWorkPackage.__initialized_at === wp.__initialized_at) {\n // Remove row and focus\n this.resetRow();\n\n // Split view on the last inserted id if any\n if (!this.table.configuration.isEmbedded) {\n this.wpTableFocus.updateFocus(wp.id!);\n }\n\n // Notify inline create service\n this.wpInlineCreate.newInlineWorkPackageCreated.next(wp.id!);\n } else {\n // Remove current row\n this.wpCreate.cancelCreation();\n this.removeWorkPackageRow();\n this.showRow();\n }\n\n this.cdRef.detectChanges();\n });\n }\n\n public handleAddRowClick() {\n this.addWorkPackageRow();\n return false;\n }\n\n public handleReferenceClick() {\n this.mode = 'reference';\n return false;\n }\n\n public get referenceClass() {\n return this.wpInlineCreate.referenceComponentClass;\n }\n\n public get hasReferenceClass() {\n return !!this.referenceClass;\n }\n\n public addWorkPackageRow() {\n this.wpCreate\n .createOrContinueWorkPackage(this.projectIdentifier)\n .then((change:WorkPackageChangeset) => {\n const wp = this.currentWorkPackage = change.projectedResource;\n\n this.editingSubscription = this\n .wpCreate\n .changesetUpdates$()\n .pipe(\n filter(() => !!this.currentWorkPackage),\n ).subscribe((form) => {\n if (!this.isActive) {\n this.insertRow(wp);\n } else {\n this.schemaCache.update(this.currentWorkPackage!, form.schema);\n this.refreshRow();\n }\n });\n });\n }\n\n private insertRow(wp:WorkPackageResource) {\n // Actually render the row\n const form = this.workPackageEditForm = this.renderInlineCreateRow(wp);\n\n setTimeout(() => {\n // Activate any required fields\n form.activateMissingFields();\n\n // Hide the button row\n this.hideRow();\n });\n }\n\n private refreshRow() {\n const builder = new InlineCreateRowBuilder(this.injector, this.table);\n const rowElement = this.$element.find(`.${inlineCreateRowClassName}`);\n\n if (rowElement.length && this.currentWorkPackage) {\n builder.refreshRow(this.currentWorkPackage, rowElement);\n }\n }\n\n /**\n * Actually render the row manually\n * in the same fashion as all rows in the table are rendered.\n *\n * @param wp Work package to be rendered\n * @returns The work package form of the row\n */\n private renderInlineCreateRow(wp:WorkPackageResource):EditForm {\n const builder = new InlineCreateRowBuilder(this.injector, this.table);\n const form = this.table.editing.startEditing(wp, builder.classIdentifier(wp));\n\n const [row] = builder.buildNew(wp, form);\n this.$element.append(row);\n\n return form;\n }\n\n /**\n * Reset the new work package row and refocus on the button\n */\n @HostListener('keydown.escape')\n public resetRow() {\n this.focus = true;\n this.removeWorkPackageRow();\n // Manually cancelled, show the row again\n setTimeout(() => {\n this.showRow();\n this.cdRef.detectChanges();\n }, 50);\n }\n\n public removeWorkPackageRow() {\n this.wpCreate.cancelCreation();\n this.currentWorkPackage = null;\n this.$element.find('.wp-row-new').remove();\n if (this.editingSubscription) {\n this.editingSubscription.unsubscribe();\n }\n }\n\n public showRow() {\n this.mode = 'inactive';\n this.cdRef.detectChanges();\n }\n\n public hideRow() {\n this.mode = 'create';\n this.cdRef.detectChanges();\n }\n\n public get colspan():number {\n return this.wpTableColumns.columnCount + 1;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Injectable,\n Injector,\n OnDestroy,\n} from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport {\n Observable,\n of,\n Subject,\n} from 'rxjs';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\n\n@Injectable()\nexport class WorkPackageInlineCreateService implements OnDestroy {\n @InjectField() I18n!:I18nService;\n\n @InjectField() protected readonly currentUser:CurrentUserService;\n\n @InjectField() protected readonly currentProject:CurrentProjectService;\n\n constructor(readonly injector:Injector) {\n }\n\n /**\n * A separate reference pane for the inline create component\n */\n public readonly referenceComponentClass:ComponentType|null = null;\n\n /**\n * A related work package for the inline create context\n */\n public referenceTarget:WorkPackageResource|null = null;\n\n /**\n * Reference button text\n */\n public readonly buttonTexts = {\n reference: '',\n create: this.I18n.t('js.label_create_work_package'),\n };\n\n public get canAdd():Observable {\n return this.canCreateWorkPackages();\n }\n\n public get canReference():Observable {\n return of(false);\n }\n\n /**\n * Observable capability check for work_packages/create and /edit.\n * Edit is included as inline create saves quickly, preventing further edits for users\n * that don't also have edit permisison.\n *\n * @protected\n */\n protected canCreateWorkPackages(projectId:string|null = this.currentProject.id):Observable {\n return this\n .currentUser\n .hasCapabilities$(\n ['work_packages/create', 'work_packages/update'],\n projectId || null,\n );\n }\n\n /** Allow callbacks to happen on newly created inline work packages */\n public newInlineWorkPackageCreated = new Subject();\n\n /** Allow callbacks to happen on newly created inline work packages */\n public newInlineWorkPackageReferenced = new Subject();\n\n /**\n * Ensure hierarchical injected versions of this service correctly unregister\n */\n ngOnDestroy():void {\n this.newInlineWorkPackageCreated.complete();\n this.newInlineWorkPackageReferenced.complete();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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) => idFromLink(el.href)) };\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) => idFromLink(column.href as string));\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 idFromLink(href as string);\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) => idFromLink(v.href as string));\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 idFromLink(href as string);\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 return idFromLink(sort.href);\n });\n\n return JSON.stringify(sortByIds.map((id:string) => id.split('-')));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageRelationsHierarchyService } from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { WpRelationInlineCreateServiceInterface } from 'core-app/features/work-packages/components/wp-relations/embedded/wp-relation-inline-create.service.interface';\nimport { WpRelationInlineAddExistingComponent } from 'core-app/features/work-packages/components/wp-relations/embedded/inline/add-existing/wp-relation-inline-add-existing.component';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport {\n Observable,\n of,\n} from 'rxjs';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Injectable()\nexport class WpChildrenInlineCreateService extends WorkPackageInlineCreateService implements WpRelationInlineCreateServiceInterface {\n constructor(readonly injector:Injector,\n protected readonly wpRelationsHierarchyService:WorkPackageRelationsHierarchyService,\n protected readonly schemaCache:SchemaCacheService) {\n super(injector);\n }\n\n /**\n * A separate reference pane for the inline create component\n */\n public readonly referenceComponentClass = WpRelationInlineAddExistingComponent;\n\n /**\n * Define the reference type\n */\n public relationType = 'children';\n\n /**\n * Add a new relation of the above type\n */\n public add(from:WorkPackageResource, toId:string):Promise {\n return this.wpRelationsHierarchyService.addExistingChildWp(from, toId);\n }\n\n /**\n * Remove a given relation\n */\n public remove(from:WorkPackageResource, to:WorkPackageResource):Promise {\n return this.wpRelationsHierarchyService.removeChild(to);\n }\n\n /**\n * A related work package for the inline create context\n */\n public referenceTarget:WorkPackageResource|null = null;\n\n public get canAdd():Observable {\n if (!(this.referenceTarget && this.canAddChild)) {\n return of(false);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return this.canCreateWorkPackages(idFromLink(this.referenceTarget.project.href));\n }\n\n public get canReference():Observable {\n return of(!!this.referenceTarget && this.canAddChild);\n }\n\n public get canAddChild():boolean {\n return !!(this.schema && !this.schema.isMilestone && this.referenceTarget?.changeParent);\n }\n\n /**\n * Reference button text\n */\n public readonly buttonTexts = {\n reference: this.I18n.t('js.relation_buttons.add_existing_child'),\n create: this.I18n.t('js.relation_buttons.add_new_child'),\n };\n\n private get schema() {\n return this.referenceTarget && this.schemaCache.of(this.referenceTarget);\n }\n}\n","\n
\n
\n

\n
\n
\n\n \n \n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector, OnDestroy } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { WpRelationInlineAddExistingComponent } from 'core-app/features/work-packages/components/wp-relations/embedded/inline/add-existing/wp-relation-inline-add-existing.component';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { WpRelationInlineCreateServiceInterface } from 'core-app/features/work-packages/components/wp-relations/embedded/wp-relation-inline-create.service.interface';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport {\n Observable,\n of,\n} from 'rxjs';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Injectable()\nexport class WpRelationInlineCreateService extends WorkPackageInlineCreateService implements WpRelationInlineCreateServiceInterface, OnDestroy {\n @InjectField() wpRelations:WorkPackageRelationsService;\n\n constructor(public injector:Injector) {\n super(injector);\n }\n\n /**\n * A separate reference pane for the inline create component\n */\n public readonly referenceComponentClass = WpRelationInlineAddExistingComponent;\n\n /**\n * Defines the relation type for the relations inline create\n */\n public relationType = '';\n\n /**\n * Add a new relation of the above type\n */\n public add(from:WorkPackageResource, toId:string):Promise {\n return this.wpRelations.addCommonRelation(toId, this.relationType, from.id!);\n }\n\n /**\n * Remove a given relation\n */\n public remove(from:WorkPackageResource, to:WorkPackageResource):Promise {\n // Find the relation matching relationType and from->to which are unique together\n const relation = this.wpRelations.find(to, from, this.relationType);\n\n if (relation !== undefined) {\n return this.wpRelations.removeRelation(relation);\n }\n return Promise.reject();\n }\n\n /**\n * A related work package for the inline create context\n */\n public referenceTarget:WorkPackageResource|null = null;\n\n public get canAdd():Observable {\n if (!this.referenceTarget?.addRelation) {\n return of(false);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return this.canCreateWorkPackages(idFromLink(this.referenceTarget.project.href));\n }\n\n public get canReference():Observable {\n return this.canAdd;\n }\n\n /**\n * Reference button text\n */\n public readonly buttonTexts = {\n reference: this.I18n.t('js.relation_buttons.add_existing'),\n create: this.I18n.t('js.relation_buttons.create_new'),\n };\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectorRef,\n Component,\n EventEmitter, HostListener,\n Input, NgZone,\n Output,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { from, Observable, of } from 'rxjs';\nimport { catchError, map, tap } from 'rxjs/operators';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { ApiV3Filter } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { OpAutocompleterComponent } from 'core-app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\n@Component({\n selector: 'wp-relations-autocomplete',\n templateUrl: './wp-relations-autocomplete.html',\n\n // Allow styling the embedded ng-select\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['./wp-relations-autocomplete.sass'],\n})\nexport class WorkPackageRelationsAutocompleteComponent {\n readonly text = {\n placeholder: this.I18n.t('js.relations_autocomplete.placeholder'),\n };\n\n @Input() inputPlaceholder:string = this.text.placeholder;\n\n @Input() workPackage:WorkPackageResource;\n\n @Input() selectedRelationType:string;\n\n @Input() filterCandidatesFor:string;\n\n /** Do we take the current query filters into account? */\n @Input() additionalFilters:ApiV3Filter[] = [];\n\n @Input() hiddenOverflowContainer = 'body';\n\n @ViewChild(OpAutocompleterComponent, { static: true }) public ngSelectComponent:OpAutocompleterComponent;\n\n @Output() onCancel = new EventEmitter();\n\n @Output() onSelected = new EventEmitter();\n\n @Output() onEmptySelected = new EventEmitter();\n\n getAutocompleterData = (query:string|null):Observable => {\n // Return when the search string is empty\n if (query === null || query.length === 0) {\n return of([]);\n }\n\n return from(\n this.workPackage.availableRelationCandidates.$link.$fetch({\n query,\n filters: JSON.stringify(this.additionalFilters),\n type: this.filterCandidatesFor || this.selectedRelationType,\n sortBy: JSON.stringify([['typeahead', 'asc']]),\n }) as Promise,\n )\n .pipe(\n map((collection) => collection.elements),\n catchError((error:unknown) => {\n this.notificationService.handleRawError(error);\n return of([]);\n }),\n );\n };\n\n public autocompleterOptions = {\n resource: 'work_packages',\n getOptionsFn: this.getAutocompleterData,\n };\n\n public appendToContainer = 'body';\n\n constructor(private readonly querySpace:IsolatedQuerySpace,\n private readonly pathHelper:PathHelperService,\n private readonly notificationService:WorkPackageNotificationService,\n private readonly CurrentProject:CurrentProjectService,\n private readonly halResourceService:HalResourceService,\n private readonly schemaCacheService:SchemaCacheService,\n private readonly cdRef:ChangeDetectorRef,\n private readonly ngZone:NgZone,\n private readonly I18n:I18nService) {\n }\n\n @HostListener('keydown.escape')\n public reset() {\n this.cancel();\n }\n\n cancel() {\n this.onCancel.emit();\n }\n\n public onWorkPackageSelected(workPackage?:WorkPackageResource) {\n if (workPackage) {\n this.schemaCacheService\n .ensureLoaded(workPackage)\n .then(() => {\n this.onSelected.emit(workPackage);\n this.ngSelectComponent.ngSelectInstance.close();\n });\n }\n }\n\n onOpen() {\n // Force reposition as a workaround for BUG\n // https://github.com/ng-select/ng-select/issues/1259\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n this.ngSelectComponent.repositionDropdown();\n jQuery(this.hiddenOverflowContainer).one('scroll', () => {\n this.ngSelectComponent.closeSelect();\n });\n }, 25);\n });\n }\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 {\n filter,\n map,\n take,\n} from 'rxjs/operators';\nimport { Observable, of } from 'rxjs';\n\ninterface CacheInput {\n id:string;\n value:T;\n}\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 as string|number).toString();\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) && state.value) {\n return of(state.value.value);\n }\n\n if (!this.isRequested(id)) {\n // Ensure value is loaded only once\n this.cache.id = id;\n this.cache.state.clearAndPutFromPromise(this.load(workPackage).then((value) => ({ value, id })));\n }\n\n return this\n .cache\n .state\n .values$()\n .pipe(\n filter((cached) => cached && cached.id === id),\n map((cached) => cached.value),\n );\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 * Return whether the given work package is cached.\n * @param {string} workPackageId\n * @returns {boolean}\n */\n public isRequested(workPackageId:string) {\n const { state } = this.cache;\n return this.cache.id === workPackageId && state.hasActivePromiseRequest();\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { BehaviorSubject, combineLatest, of } from 'rxjs';\nimport {\n distinctUntilChanged,\n map,\n switchMap,\n take,\n} from 'rxjs/operators';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport {\n HalResourceEditingService,\n} 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 { randomString } from 'core-app/shared/helpers/random-string';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\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';\nimport { IStorage } from 'core-app/core/state/storages/storage.model';\nimport { StoragesResourceService } from 'core-app/core/state/storages/storages.service';\nimport { ProjectsResourceService } from 'core-app/core/state/projects/projects.service';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\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 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.component.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 // Project context as an indicator\n // when editing the work package in a different project\n public projectContext:{\n matches:boolean,\n id:string|null,\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 },\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 $element:JQuery;\n\n storages$ = new BehaviorSubject([]);\n\n constructor(\n protected readonly injector:Injector,\n private readonly states:States,\n private readonly I18n:I18nService,\n private readonly hook:HookService,\n private readonly $state:StateService,\n private readonly elementRef:ElementRef,\n private readonly cdRef:ChangeDetectorRef,\n private readonly PathHelper:PathHelperService,\n private readonly schemaCache:SchemaCacheService,\n private readonly currentProject:CurrentProjectService,\n private readonly halEditing:HalResourceEditingService,\n private readonly halResourceService:HalResourceService,\n private readonly currentUserService:CurrentUserService,\n private readonly storagesService:StoragesResourceService,\n private readonly displayFieldService:DisplayFieldService,\n private readonly projectsResourceService:ProjectsResourceService,\n ) {\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.refresh(change);\n\n // Whenever the temporary resource changes in any way,\n // update the visible fields.\n this.halEditing\n .temporaryEditResource(this.workPackage)\n .values$()\n .pipe(\n this.untilDestroyed(),\n map((resource) => this.contextFrom(resource)),\n distinctUntilChanged((a, b) => _.isEqual(a, b)),\n map(() => this.halEditing.changeFor(this.workPackage)),\n )\n .subscribe((changeset:WorkPackageChangeset) => this.refresh(changeset));\n }\n\n private refresh(change:WorkPackageChangeset) {\n // Prepare the fields that are required always\n const resource = change.projectedResource;\n\n if (!resource.project) {\n this.projectContext = { matches: false, href: null, id: null };\n } else {\n const project = resource.project as unknown&{ href:string, id:string };\n const workPackageId = this.workPackage.id;\n if (!workPackageId) {\n throw new Error('work package id is invalid');\n }\n\n this.projectContext = {\n id: project.id,\n href: this.PathHelper.projectWorkPackagePath(project.id, workPackageId),\n matches: project.href === this.currentProject.apiv3Path,\n };\n }\n\n if (isNewResource(resource)) {\n this.updateWorkPackageCreationState(change);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n this.groupedFields = this.rebuildGroupedFields(change, this.schema(resource)._attributeGroups) as GroupDescriptor[];\n this.cdRef.detectChanges();\n }\n\n private updateWorkPackageCreationState(change:WorkPackageChangeset) {\n const resource = change.projectedResource;\n if (!this.currentProject.inProjectContext) {\n this.projectContext.field = this.getFields(change, ['project']);\n this.workPackage.project = resource.project as HalResource;\n }\n\n if (resource.project === null) {\n this.storages$.next([]);\n } else {\n const project = resource.project as unknown&{ href:string, id:string };\n combineLatest([\n this.projectsResourceService.update(project.href),\n this.currentUserService.hasCapabilities$('file_links/manage', project.id),\n ])\n .pipe(\n switchMap(([p, manageFileLinks]) => {\n if (!p._links.storages || !manageFileLinks) {\n return of([] as IStorage[]);\n }\n\n return this.storagesService.updateCollection(p._links.self.href, p._links.storages);\n }),\n take(1),\n )\n .subscribe((storages) => {\n this.storages$.next(storages);\n });\n }\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, Input, OnInit } from '@angular/core';\nimport { UIRouterGlobals } from '@uirouter/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { randomString } from 'core-app/shared/helpers/random-string';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Component({\n selector: 'wp-subject',\n templateUrl: './wp-subject.html',\n})\nexport class WorkPackageSubjectComponent extends UntilDestroyedMixin implements OnInit {\n @Input('workPackage') workPackage:WorkPackageResource;\n\n public readonly uniqueElementIdentifier = `work-packages--subject-type-row-${randomString(16)}`;\n\n constructor(protected uiRouterGlobals:UIRouterGlobals,\n protected apiV3Service:ApiV3Service) {\n super();\n }\n\n ngOnInit() {\n if (!this.workPackage) {\n this\n .apiV3Service\n .work_packages\n .id(this.uiRouterGlobals.params.workPackageId)\n .requireAndStream()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp:WorkPackageResource) => {\n this.workPackage = wp;\n });\n }\n }\n}\n","/**\n * A PortalOutlet that lets multiple components live for the lifetime of the outlet,\n * allowing faster switching and persistent data.\n */\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n ApplicationRef,\n ComponentFactoryResolver,\n ComponentRef,\n EmbeddedViewRef,\n Injector,\n} from '@angular/core';\nimport { TabDefinition } from 'core-app/shared/components/tabs/tab.interface';\n\nexport interface TabInterface extends TabDefinition {\n componentClass:{ new(...args:any[]):TabComponent };\n}\n\nexport interface TabComponent {\n onSave:() => void;\n}\n\nexport interface ActiveTabInterface extends TabDefinition {\n portal:ComponentPortal;\n componentRef:ComponentRef;\n dispose:() => void;\n}\n\nexport class TabPortalOutlet {\n // Active tabs that have been instantiated\n public activeTabs:{ [name:string]:ActiveTabInterface } = {};\n\n // The current tab\n public currentTab:ActiveTabInterface|null = null;\n\n constructor(\n public availableTabs:TabInterface[],\n public outletElement:HTMLElement,\n private componentFactoryResolver:ComponentFactoryResolver,\n private appRef:ApplicationRef,\n private injector:Injector,\n ) {\n }\n\n public get activeComponents():TabComponent[] {\n const tabs = _.values(this.activeTabs);\n return tabs.map((tab:ActiveTabInterface) => tab.componentRef.instance);\n }\n\n public switchTo(tab:TabInterface):void {\n if (tab.disable !== undefined) {\n return;\n }\n\n // Detach any current instance\n this.detach();\n\n // Get existing or new component instance\n const instance = this.activateInstance(tab);\n\n // At this point the component has been instantiated, so we move it to the location in the DOM\n // where we want it to be rendered.\n this.outletElement.innerHTML = '';\n this.outletElement.appendChild(this._getComponentRootNode(instance.componentRef));\n this.outletElement.dataset.tabName = tab.name;\n this.currentTab = instance;\n }\n\n public detach():void {\n const current = this.currentTab;\n if (current !== null) {\n current.portal.setAttachedHost(null);\n this.currentTab = null;\n }\n }\n\n /**\n * Clears out a portal from the DOM.\n */\n dispose():void {\n // Dispose all active tabs\n _.each(this.activeTabs, (active) => active.dispose());\n\n // Remove outlet element\n if (this.outletElement.parentNode != null) {\n this.outletElement.parentNode.removeChild(this.outletElement);\n }\n }\n\n private activateInstance(tab:TabInterface):ActiveTabInterface {\n if (!this.activeTabs[tab.name]) {\n this.activeTabs[tab.name] = this.createComponent(tab);\n }\n\n return this.activeTabs[tab.name] || null;\n }\n\n private createComponent(tab:TabInterface):ActiveTabInterface {\n const componentFactory = this.componentFactoryResolver.resolveComponentFactory(tab.componentClass);\n const componentRef = componentFactory.create(this.injector);\n const portal = new ComponentPortal(tab.componentClass, null, this.injector);\n\n // Attach component view\n this.appRef.attachView(componentRef.hostView);\n\n return {\n ...tab,\n portal,\n componentRef,\n dispose: () => {\n this.appRef.detachView(componentRef.hostView);\n componentRef.destroy();\n },\n };\n }\n\n /** Gets the root HTMLElement for an instantiated component. */\n private _getComponentRootNode(componentRef:ComponentRef):HTMLElement {\n return (componentRef.hostView as EmbeddedViewRef).rootNodes[0] as HTMLElement;\n }\n}\n","\n
{{text.title}}
\n\n
\n\n
\n\n \n \n \n\n \n\n \n
\n
\n
\n
\n \n \n \n \n
\n
\n\n","import {\n ApplicationRef,\n ChangeDetectorRef,\n Component,\n ComponentFactoryResolver,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Injector,\n OnDestroy,\n OnInit,\n Optional,\n ViewChild,\n} from '@angular/core';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { WpTableConfigurationService } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.service';\nimport {\n ActiveTabInterface,\n TabComponent,\n TabInterface,\n TabPortalOutlet,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { WorkPackageStatesInitializationService } from 'core-app/features/work-packages/components/wp-list/wp-states-initialization.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\nexport const WpTableConfigurationModalPrependToken = new InjectionToken>('WpTableConfigurationModalPrependComponent');\n\n@Component({\n templateUrl: './wp-table-configuration.modal.html',\n})\nexport class WpTableConfigurationModalComponent extends OpModalComponent implements OnInit, OnDestroy {\n public text = {\n title: this.I18n.t('js.work_packages.table_configuration.modal_title'),\n closePopup: this.I18n.t('js.close_popup_title'),\n\n columnsLabel: this.I18n.t('js.label_columns'),\n selectedColumns: this.I18n.t('js.description_selected_columns'),\n multiSelectLabel: this.I18n.t('js.work_packages.label_column_multiselect'),\n applyButton: this.I18n.t('js.modals.button_apply'),\n cancelButton: this.I18n.t('js.modals.button_cancel'),\n\n upsaleRelationColumns: this.I18n.t('js.modals.upsale_relation_columns'),\n upsaleRelationColumnsLink: this.I18n.t('js.modals.upsale_relation_columns_link'),\n };\n\n public onDataUpdated = new EventEmitter();\n\n public selectedColumnMap:{ [id:string]:boolean } = {};\n\n // Get the view child we'll use as the portal host\n @ViewChild('tabContentOutlet', { static: true }) tabContentOutlet:ElementRef;\n\n // And a reference to the actual portal host interface\n public tabPortalHost:TabPortalOutlet;\n\n // Try to load an optional provided configuration service, and fall back to the default one\n private wpTableConfigurationService:WpTableConfigurationService =\n this.injector.get(WpTableConfigurationService, new WpTableConfigurationService(this.I18n));\n\n constructor(@Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n @Optional() @Inject(WpTableConfigurationModalPrependToken) public prependModalComponent:ComponentType|null,\n readonly I18n:I18nService,\n readonly injector:Injector,\n readonly appRef:ApplicationRef,\n readonly componentFactoryResolver:ComponentFactoryResolver,\n readonly loadingIndicator:LoadingIndicatorService,\n readonly querySpace:IsolatedQuerySpace,\n readonly wpStatesInitialization:WorkPackageStatesInitializationService,\n readonly apiV3Service:ApiV3Service,\n readonly notificationService:WorkPackageNotificationService,\n readonly wpTableColumns:WorkPackageViewColumnsService,\n readonly cdRef:ChangeDetectorRef,\n readonly ConfigurationService:ConfigurationService,\n readonly elementRef:ElementRef) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit() {\n this.$element = this.elementRef.nativeElement as HTMLElement;\n\n this.tabPortalHost = new TabPortalOutlet(\n this.wpTableConfigurationService.tabs,\n this.tabContentOutlet.nativeElement,\n this.componentFactoryResolver,\n this.appRef,\n this.injector,\n );\n\n this.loadingIndicator.indicator('modal').promise = this.loadForm()\n .then(() => {\n const initialTabName = this.locals.initialTab;\n const initialTab = this.availableTabs.find((el) => el.id === initialTabName);\n this.switchTo(initialTab || this.availableTabs[0]);\n this.cdRef.detectChanges();\n });\n }\n\n ngOnDestroy():void {\n this.onDataUpdated.complete();\n this.tabPortalHost.dispose();\n }\n\n public get availableTabs():TabInterface[] {\n return this.tabPortalHost.availableTabs;\n }\n\n public get currentTab():ActiveTabInterface|null {\n return this.tabPortalHost.currentTab;\n }\n\n public switchTo(tab:TabInterface):void {\n this.tabPortalHost.switchTo(tab);\n }\n\n public saveChanges():void {\n this.tabPortalHost.activeComponents.forEach((component:TabComponent) => {\n component.onSave();\n });\n\n this.onDataUpdated.emit();\n this.service.close();\n }\n\n /**\n * Called when the user attempts to close the modal window.\n * The service will close this modal if this method returns true\n * @returns {boolean}\n */\n public onClose():boolean {\n this.afterFocusOn.focus();\n return true;\n }\n\n protected get afterFocusOn():HTMLElement {\n return this.$element;\n }\n\n protected loadForm() {\n const query = this.querySpace.query.value!;\n return this\n .apiV3Service\n .queries\n .form\n .load(query)\n .toPromise()\n .then(([form, _]) => {\n this.wpStatesInitialization.updateStatesFromForm(query, form);\n\n return form;\n })\n .catch((error) => this.notificationService.handleRawError(error));\n }\n}\n","
\n
\n

\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n\n
\n\n
\n
\n
\n \n
\n
\n\n
\n
\n
\n","import { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageViewSumService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sum.service';\nimport { Component, Injector } from '@angular/core';\nimport { QueryGroupByResource } from 'core-app/features/hal/resources/query-group-by-resource';\n\n@Component({\n templateUrl: './display-settings-tab.component.html',\n})\nexport class WpTableConfigurationDisplaySettingsTabComponent implements TabComponent {\n // Display mode\n public displayMode:'hierarchy'|'grouped'|'default' = 'default';\n\n // Grouping\n public currentGroup:QueryGroupByResource|null;\n\n public availableGroups:QueryGroupByResource[] = [];\n\n // Sums row display\n public displaySums = false;\n\n public text = {\n choose_mode: this.I18n.t('js.work_packages.table_configuration.choose_display_mode'),\n label_group_by: this.I18n.t('js.label_group_by'),\n title: this.I18n.t('js.label_group_by'),\n placeholder: this.I18n.t('js.placeholders.default'),\n please_select: this.I18n.t('js.placeholders.selection'),\n default: `— ${this.I18n.t('js.work_packages.table_configuration.default')}`,\n display_sums: this.I18n.t('js.work_packages.query.display_sums'),\n display_sums_hint: `— ${this.I18n.t('js.work_packages.table_configuration.display_sums_hint')}`,\n display_mode: {\n default: this.I18n.t('js.work_packages.table_configuration.default_mode'),\n grouped: this.I18n.t('js.work_packages.table_configuration.grouped_mode'),\n hierarchy: this.I18n.t('js.work_packages.table_configuration.hierarchy_mode'),\n hierarchy_hint: `— ${this.I18n.t('js.work_packages.table_configuration.hierarchy_hint')}`,\n },\n };\n\n constructor(readonly injector:Injector,\n readonly I18n:I18nService,\n readonly wpTableGroupBy:WorkPackageViewGroupByService,\n readonly wpTableHierarchies:WorkPackageViewHierarchiesService,\n readonly wpTableSums:WorkPackageViewSumService) {\n }\n\n public onSave() {\n // Update hierarchy state\n this.wpTableHierarchies.setEnabled(this.displayMode === 'hierarchy');\n\n // Update grouping state\n const group = this.displayMode === 'grouped' ? this.currentGroup : null;\n this.wpTableGroupBy.update(group);\n\n // Update sums state\n this.wpTableSums.setEnabled(this.displaySums);\n }\n\n public updateGroup(href:string) {\n this.displayMode = 'grouped';\n this.currentGroup = _.find(this.availableGroups, (group) => group.href === href) || null;\n }\n\n ngOnInit() {\n if (this.wpTableHierarchies.isEnabled) {\n this.displayMode = 'hierarchy';\n } else if (this.wpTableGroupBy.current) {\n this.displayMode = 'grouped';\n }\n\n this.displaySums = this.wpTableSums.current;\n\n this.wpTableGroupBy\n .onReady()\n .then(() => {\n this.availableGroups = _.sortBy(this.wpTableGroupBy.available, 'name');\n this.currentGroup = this.wpTableGroupBy.current;\n });\n }\n}\n","
\n \n \n\n \n \n\n

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

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

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

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

\n
\n
\n \n {{ text.labels[key] }}\n \n
\n
\n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n","import { Component, Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { zoomLevelOrder } from 'core-app/features/work-packages/components/wp-table/timeline/wp-timeline';\nimport { TimelineLabels, TimelineZoomLevel } from 'core-app/features/hal/resources/query-resource';\n\n@Component({\n templateUrl: './timelines-tab.component.html',\n})\nexport class WpTableConfigurationTimelinesTabComponent implements TabComponent {\n public timelineVisible = false;\n\n public availableAttributes:{ id:string, name:string }[];\n\n public labels:TimelineLabels;\n\n public availableLabels:string[];\n\n public zoomLevel:TimelineZoomLevel;\n\n // Manually build available zoom levels with zoom\n // because it is not part of the order.\n public availableZoomLevels:TimelineZoomLevel[] = ['auto', ...zoomLevelOrder];\n\n public text = {\n title: this.I18n.t('js.timelines.gantt_chart'),\n display_timelines: this.I18n.t('js.timelines.button_activate'),\n display_timelines_hint: this.I18n.t('js.work_packages.table_configuration.show_timeline_hint'),\n zoom: {\n level: this.I18n.t('js.tl_toolbar.zooms'),\n description: this.I18n.t('js.timelines.zoom.description'),\n days: this.I18n.t('js.timelines.zoom.days'),\n weeks: this.I18n.t('js.timelines.zoom.weeks'),\n months: this.I18n.t('js.timelines.zoom.months'),\n quarters: this.I18n.t('js.timelines.zoom.quarters'),\n years: this.I18n.t('js.timelines.zoom.years'),\n auto: this.I18n.t('js.timelines.zoom.auto'),\n },\n labels: {\n title: this.I18n.t('js.timelines.labels.title'),\n description: this.I18n.t('js.timelines.labels.description'),\n bar: this.I18n.t('js.timelines.labels.bar'),\n none: this.I18n.t('js.timelines.filter.noneSelection'),\n left: this.I18n.t('js.timelines.labels.left'),\n right: this.I18n.t('js.timelines.labels.right'),\n farRight: this.I18n.t('js.timelines.labels.farRight'),\n },\n };\n\n constructor(readonly injector:Injector,\n readonly I18n:I18nService,\n readonly wpTableTimeline:WorkPackageViewTimelineService,\n readonly wpTableColumns:WorkPackageViewColumnsService) {\n }\n\n public onSave() {\n this.wpTableTimeline.update({\n ...this.wpTableTimeline.current,\n visible: this.timelineVisible,\n labels: this.labels,\n zoomLevel: this.zoomLevel,\n });\n }\n\n public updateLabels(key:keyof TimelineLabels, value:string|null) {\n if (value === '') {\n value = null;\n }\n\n this.labels[key] = value;\n }\n\n ngOnInit() {\n this.timelineVisible = this.wpTableTimeline.isVisible;\n\n // Current zoom level\n this.zoomLevel = this.wpTableTimeline.zoomLevel;\n\n // Current label models\n const { labels } = this.wpTableTimeline;\n this.labels = _.clone(labels);\n this.availableLabels = Object.keys(this.labels);\n\n // Available labels\n const availableColumns = this.wpTableColumns\n .allPropertyColumns\n .sort((a:QueryColumn, b:QueryColumn) => a.name.localeCompare(b.name));\n\n this.availableAttributes = [{ id: '', name: this.text.labels.none }].concat(availableColumns);\n }\n}\n","
\n \n \n\n
\n

\n
\n \n\n
\n
\n \n \n
\n
\n
\n\n
\n \n\n
\n
\n \n \n
\n
\n
\n\n
\n \n
\n
\n
\n","import {\n ChangeDetectionStrategy,\n Component,\n Injector,\n ViewChild,\n} from '@angular/core';\nimport { TabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { WorkPackageViewHighlightingService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-highlighting.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HighlightingMode } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting-mode.const';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { NgSelectComponent } from '@ng-select/ng-select';\nimport { States } from 'core-app/core/states/states.service';\nimport { enterpriseDocsUrl } from 'core-app/core/setup/globals/constants.const';\n\n@Component({\n templateUrl: './highlighting-tab.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WpTableConfigurationHighlightingTabComponent implements TabComponent {\n // Display mode\n public highlightingMode:HighlightingMode = 'inline';\n\n public entireRowMode = false;\n\n public lastEntireRowAttribute:HighlightingMode = 'status';\n\n public eeShowBanners = false;\n\n public availableInlineHighlightedAttributes:HalResource[] = [];\n\n public selectedAttributes:any[] = [];\n\n public availableRowHighlightedAttributes:{ name:string; value:HighlightingMode }[] = [];\n\n @ViewChild('highlightedAttributesNgSelect') public highlightedAttributesNgSelect:NgSelectComponent;\n\n @ViewChild('rowHighlightNgSelect') public rowHighlightNgSelect:NgSelectComponent;\n\n public text = {\n title: this.I18n.t('js.work_packages.table_configuration.highlighting'),\n highlighting_mode: {\n description: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.description'),\n none: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.none'),\n inline: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.inline'),\n inline_all_attributes: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.inline_all'),\n status: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.status'),\n type: this.I18n.t('js.work_packages.properties.type'),\n priority: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.priority'),\n entire_row_by: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.entire_row_by'),\n },\n upsaleAttributeHighlighting: this.I18n.t('js.work_packages.table_configuration.upsale.attribute_highlighting'),\n upsaleCheckOutLink: this.I18n.t('js.work_packages.table_configuration.upsale.check_out_link'),\n more_info_link: enterpriseDocsUrl.tableHighlighting,\n };\n\n constructor(readonly injector:Injector,\n readonly I18n:I18nService,\n readonly states:States,\n readonly querySpace:IsolatedQuerySpace,\n readonly Banners:BannersService,\n readonly wpTableHighlight:WorkPackageViewHighlightingService) {\n }\n\n ngOnInit() {\n this.availableInlineHighlightedAttributes = this.availableHighlightedAttributes;\n this.availableRowHighlightedAttributes = [\n { name: this.text.highlighting_mode.status, value: 'status' },\n { name: this.text.highlighting_mode.priority, value: 'priority' },\n ];\n\n this.setSelectedValues();\n\n this.eeShowBanners = this.Banners.eeShowBanners;\n this.updateMode(this.wpTableHighlight.current.mode);\n\n if (this.eeShowBanners) {\n this.updateMode('none');\n }\n }\n\n public onSave() {\n const mode = this.highlightingMode;\n this.wpTableHighlight.update({ mode, selectedAttributes: this.selectedAttributes });\n }\n\n public updateMode(mode:HighlightingMode | 'entire-row') {\n if (mode === 'entire-row') {\n this.highlightingMode = this.lastEntireRowAttribute;\n } else {\n this.highlightingMode = mode;\n }\n\n if (['status', 'priority'].indexOf(this.highlightingMode) !== -1) {\n this.lastEntireRowAttribute = this.highlightingMode;\n this.entireRowMode = true;\n } else {\n this.entireRowMode = false;\n }\n }\n\n public updateHighlightingAttributes(model:HalResource[]) {\n this.selectedAttributes = model;\n }\n\n public disabledValue(value:boolean):string | null {\n return value ? 'disabled' : null;\n }\n\n public get availableHighlightedAttributes():HalResource[] {\n const { schema } = this.querySpace.queryForm.value!;\n return schema.highlightedAttributes.allowedValues;\n }\n\n public onOpen(component:any) {\n setTimeout(() => {\n if (component.dropdownPanel) {\n component.dropdownPanel._updatePosition();\n }\n }, 25);\n }\n\n private setSelectedValues() {\n const currentValues = this.wpTableHighlight.current.selectedAttributes;\n\n if (currentValues) {\n this.selectedAttributes = currentValues;\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WpTableConfigurationDisplaySettingsTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/display-settings-tab.component';\nimport { TabInterface } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { WpTableConfigurationColumnsTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/columns-tab.component';\nimport { WpTableConfigurationFiltersTab } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/filters-tab.component';\nimport { WpTableConfigurationSortByTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/sort-by-tab.component';\nimport { WpTableConfigurationTimelinesTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/timelines-tab.component';\nimport { WpTableConfigurationHighlightingTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/highlighting-tab.component';\n\n@Injectable()\nexport class WpTableConfigurationService {\n protected _tabs:TabInterface[] = [\n {\n id: 'columns',\n name: this.I18n.t('js.label_columns'),\n componentClass: WpTableConfigurationColumnsTabComponent,\n },\n {\n id: 'filters',\n name: this.I18n.t('js.work_packages.query.filters'),\n componentClass: WpTableConfigurationFiltersTab,\n },\n {\n id: 'sort-by',\n name: this.I18n.t('js.label_sort_by'),\n componentClass: WpTableConfigurationSortByTabComponent,\n },\n {\n id: 'display-settings',\n name: this.I18n.t('js.work_packages.table_configuration.display_settings'),\n componentClass: WpTableConfigurationDisplaySettingsTabComponent,\n },\n {\n id: 'highlighting',\n name: this.I18n.t('js.work_packages.table_configuration.highlighting'),\n componentClass: WpTableConfigurationHighlightingTabComponent,\n },\n {\n id: 'timelines',\n name: this.I18n.t('js.timelines.gantt_chart'),\n componentClass: WpTableConfigurationTimelinesTabComponent,\n },\n ];\n\n constructor(readonly I18n:I18nService) {\n }\n\n public get tabs() {\n return this._tabs;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Injectable } from '@angular/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageViewHierarchyIdentationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy-indentation.service';\nimport { WorkPackageViewDisplayRepresentationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\n\nexport type WorkPackageAction = {\n text?:string;\n key:string;\n icon?:string;\n indexBy?:(actions:WorkPackageAction[]) => number,\n link?:string;\n href?:string;\n};\n\n@Injectable()\nexport class WorkPackageContextMenuHelperService {\n private BULK_ACTIONS = [\n {\n text: I18n.t('js.work_packages.bulk_actions.edit'),\n key: 'edit',\n link: 'update',\n href: `${this.PathHelper.staticBase}/work_packages/bulk/edit`,\n },\n {\n text: I18n.t('js.work_packages.bulk_actions.move'),\n key: 'move',\n link: 'move',\n href: `${this.PathHelper.staticBase}/work_packages/move/new`,\n },\n {\n text: I18n.t('js.work_packages.bulk_actions.copy'),\n key: 'copy',\n link: 'copy',\n href: `${this.PathHelper.staticBase}/work_packages/move/new?copy=true`,\n },\n {\n text: I18n.t('js.work_packages.bulk_actions.delete'),\n key: 'delete',\n link: 'delete',\n href: `${this.PathHelper.staticBase}/work_packages/bulk?_method=delete`,\n },\n ];\n\n constructor(private HookService:HookService,\n private UrlParamsHelper:UrlParamsHelperService,\n private wpViewRepresentation:WorkPackageViewDisplayRepresentationService,\n private wpViewTimeline:WorkPackageViewTimelineService,\n private wpViewIndent:WorkPackageViewHierarchyIdentationService,\n private PathHelper:PathHelperService) {\n }\n\n public getPermittedActionLinks(workPackage:WorkPackageResource, permittedActionConstants:any, allowSplitScreenActions:boolean):WorkPackageAction[] {\n const singularPermittedActions:any[] = [];\n\n let allowedActions = this.getAllowedActions(workPackage, permittedActionConstants);\n\n allowedActions = allowedActions.concat(this.getAllowedParentActions(workPackage));\n\n allowedActions = allowedActions.concat(this.getAllowedRelationActions(workPackage, allowSplitScreenActions));\n\n _.each(allowedActions, (allowedAction) => {\n singularPermittedActions.push({\n key: allowedAction.key,\n text: allowedAction.text,\n icon: allowedAction.icon,\n link: allowedAction.link ? workPackage[allowedAction.link].href : undefined,\n });\n });\n\n return singularPermittedActions;\n }\n\n public getIntersectOfPermittedActions(workPackages:any) {\n const bulkPermittedActions:any = [];\n const possibleActions = this.BULK_ACTIONS.concat(this.HookService.call('workPackageBulkContextMenu'));\n const permittedActions = _.filter(possibleActions, (action:any) => _.every(workPackages, (workPackage:WorkPackageResource) => this.isActionAllowed(workPackage, action)));\n\n _.each(permittedActions, (permittedAction:any) => {\n bulkPermittedActions.push({\n key: permittedAction.key,\n text: permittedAction.text,\n icon: permittedAction.icon,\n link: this.getBulkActionLink(permittedAction, workPackages),\n });\n });\n\n return bulkPermittedActions;\n }\n\n public getBulkActionLink(action:any, workPackages:any) {\n const workPackageIdParams = {\n 'ids[]': workPackages.map((wp:any) => wp.id),\n };\n const serializedIdParams = this.UrlParamsHelper.buildQueryString(workPackageIdParams);\n\n const linkAndQueryString = action.href.split('?');\n const link = linkAndQueryString.shift();\n const queryParts = linkAndQueryString.concat(new Array(serializedIdParams));\n\n return `${link}?${queryParts.join('&')}`;\n }\n\n private isActionAllowed(workPackage:WorkPackageResource, action:WorkPackageAction):boolean {\n return _.filter(this.getAllowedActions(workPackage, [action]), (a) => a === action).length >= 1;\n }\n\n private getAllowedActions(workPackage:WorkPackageResource, actions:WorkPackageAction[]):WorkPackageAction[] {\n const allowedActions:WorkPackageAction[] = [];\n\n _.each(actions, (action) => {\n if (action.link && workPackage.hasOwnProperty(action.link)) {\n action.text = action.text || I18n.t(`js.button_${action.key}`);\n allowedActions.push(action);\n }\n });\n\n _.each(this.HookService.call('workPackageTableContextMenu'), (action) => {\n if (workPackage.hasOwnProperty(action.link)) {\n const index = action.indexBy ? action.indexBy(allowedActions) : allowedActions.length;\n allowedActions.splice(index, 0, action);\n }\n });\n\n return allowedActions;\n }\n\n private getAllowedParentActions(workPackage:WorkPackageResource) {\n const actions:WorkPackageAction[] = [];\n\n // Do not add these actions unless we're in the table\n if (!this.wpViewRepresentation.isList) {\n return [];\n }\n\n // Can only outdent this item if it has ancestors\n if (this.wpViewIndent.canOutdent(workPackage)) {\n actions.push({\n key: 'hierarchy-outdent',\n icon: 'icon-paragraph-left',\n text: I18n.t('js.relation_buttons.hierarchy_outdent'),\n });\n }\n\n // Can only indent if not first and immediate predecessor is not the parent\n if (this.wpViewIndent.canIndent(workPackage)) {\n actions.push({\n key: 'hierarchy-indent',\n icon: 'icon-paragraph-right',\n text: I18n.t('js.relation_buttons.hierarchy_indent'),\n });\n }\n\n return actions;\n }\n\n private getAllowedRelationActions(workPackage:WorkPackageResource, allowSplitScreenActions:boolean) {\n const allowedActions:WorkPackageAction[] = [];\n\n if (!!workPackage.addRelation && this.wpViewTimeline.isVisible) {\n allowedActions.push({\n key: 'relation-precedes',\n text: I18n.t('js.relation_buttons.add_predecessor'),\n link: 'addRelation',\n });\n allowedActions.push({\n key: 'relation-follows',\n text: I18n.t('js.relation_buttons.add_follower'),\n link: 'addRelation',\n });\n }\n\n if (!!workPackage.addChild && allowSplitScreenActions) {\n allowedActions.push({\n key: 'relation-new-child',\n text: I18n.t('js.relation_buttons.add_new_child'),\n link: 'addChild',\n });\n }\n\n return allowedActions;\n }\n\n public getPermittedActions(workPackages:WorkPackageResource[], permittedActionConstants:any, allowSplitScreenActions:boolean):WorkPackageAction[] {\n if (workPackages.length === 1) {\n return this.getPermittedActionLinks(workPackages[0], permittedActionConstants, allowSplitScreenActions);\n }\n return this.getIntersectOfPermittedActions(workPackages);\n }\n}\n","import { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Injector } from '@angular/core';\n\nexport class TableDragActionService {\n /**\n * Initialize an action service in the given isolated query space\n * @param querySpace The isolated query space for this table\n * @param injector The hierarchical injector for this table\n */\n constructor(readonly querySpace:IsolatedQuerySpace,\n readonly injector:Injector) {\n }\n\n /**\n * Determine whether the service applies for the given\n * query spaces.\n */\n public get applies():boolean {\n return true;\n }\n\n /**\n * Perform a post-order update\n */\n public onNewOrder(newOrder:string[]):void {\n }\n\n /**\n * Returns whether the given work package is movable\n */\n public canPickup(workPackage:WorkPackageResource):boolean {\n return true;\n }\n\n /**\n * Perform the respective action for the drop that just happened\n *\n * @param workPackage\n * @param target\n * @param source\n * @param sibling\n */\n public handleDrop(workPackage:WorkPackageResource, el:HTMLElement):Promise {\n return Promise.resolve(undefined);\n }\n\n /**\n * Manipulate the shadow element\n * @param shadowElement\n * @param backToDefault: Shall the modifications be made undone\n */\n public changeShadowElement(shadowElement:HTMLElement, backToDefault = false) {\n if (backToDefault) {\n shadowElement.classList.remove('-dragged');\n } else {\n shadowElement.classList.add('-dragged');\n }\n return true;\n }\n}\n","import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { TableDragActionService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-action.service';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageRelationsHierarchyService } from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service';\nimport {\n hierarchyGroupClass,\n hierarchyRootClass,\n} from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-hierarchy-helpers';\nimport { relationRowClass, isInsideCollapsedGroup } from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-row-helpers';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\nexport class HierarchyDragActionService extends TableDragActionService {\n @InjectField() private wpTableHierarchies:WorkPackageViewHierarchiesService;\n\n @InjectField() private relationHierarchyService:WorkPackageRelationsHierarchyService;\n\n @InjectField() private apiV3Service:ApiV3Service;\n\n public get applies() {\n return this.wpTableHierarchies.isEnabled;\n }\n\n /**\n * Returns whether the given work package is movable\n */\n public canPickup(workPackage:WorkPackageResource):boolean {\n return !!workPackage.changeParent;\n }\n\n public handleDrop(workPackage:WorkPackageResource, el:HTMLElement):Promise {\n return this.determineParent(el).then((parentId:string|null) => this.relationHierarchyService.changeParent(workPackage, parentId));\n }\n\n /**\n * Find an applicable parent element from the hierarchy information in the table.\n * @param el\n */\n private determineParent(el:Element):Promise {\n let previous = el.previousElementSibling;\n const next = el.nextElementSibling;\n let parent = null;\n\n if (previous !== null && this.droppedIntoGroup(el, previous, next)) {\n // If the previous element is a relation row,\n // skip it until we find the real previous sibling\n const isRelationRow = previous.className.indexOf(relationRowClass()) >= 0;\n\n if (isRelationRow) {\n const relationRoot = this.findRelationRowRoot(previous);\n if (relationRoot == null) {\n return Promise.resolve(null);\n }\n previous = relationRoot;\n }\n\n const previousWpId = (previous as HTMLElement).dataset.workPackageId!;\n\n if (this.isHiearchyRoot(previous, previousWpId)) {\n const droppedIntoCollapsedGroup = isInsideCollapsedGroup(next);\n\n if (droppedIntoCollapsedGroup) {\n return this.determineParent(previous);\n }\n // If the sibling is a hierarchy root, return that sibling as new parent.\n parent = previousWpId;\n } else {\n // If the sibling is no hierarchy root, return it's parent.\n // Thus, the dropped element will get the same hierarchy level as the sibling\n parent = this.loadParentOfWP(previousWpId);\n }\n }\n\n return Promise.resolve(parent);\n }\n\n private findRelationRowRoot(el:Element):Element|null {\n let previous = el.previousElementSibling;\n while (previous !== null) {\n if (previous.className.indexOf(relationRowClass()) < 0) {\n return previous;\n }\n previous = previous.previousElementSibling;\n }\n\n return null;\n }\n\n private droppedIntoGroup(element:Element, previous:Element, next:Element | null):boolean {\n const inGroup = previous.className.indexOf(hierarchyGroupClass('')) >= 0;\n const isRoot = previous.className.indexOf(hierarchyRootClass('')) >= 0;\n let skipDroppedIntoGroup;\n\n if (inGroup || isRoot) {\n const elementGroups = Array.from(element.classList).filter((listClass) => listClass.includes('__hierarchy-group-')) || [];\n const previousGroups = Array.from(previous.classList).filter((listClass) => listClass.includes('__hierarchy-group-')) || [];\n const nextGroups = next && Array.from(next.classList).filter((listClass) => listClass.includes('__hierarchy-group-')) || [];\n const previousWpId = (previous as HTMLElement).dataset.workPackageId!;\n const isLastElementOfGroup = !nextGroups.some((nextGroup) => previousGroups.includes(nextGroup)) && !nextGroups.includes(hierarchyGroupClass(previousWpId));\n const elementAlreadyBelongsToGroup = elementGroups.some((elementGroup) => previousGroups.includes(elementGroup))\n || elementGroups.includes(hierarchyGroupClass(previousWpId));\n\n skipDroppedIntoGroup = isLastElementOfGroup && !elementAlreadyBelongsToGroup;\n }\n\n return !skipDroppedIntoGroup && inGroup || isRoot;\n }\n\n private isHiearchyRoot(previous:Element, previousWpId:string):boolean {\n return previous.classList.contains(hierarchyRootClass(previousWpId));\n }\n\n private loadParentOfWP(wpId:string):Promise {\n return this\n .apiV3Service\n .work_packages\n .id(wpId)\n .get()\n .toPromise()\n .then((wp:WorkPackageResource) => Promise.resolve(wp.parent?.id || null));\n }\n}\n","import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { TableDragActionService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-action.service';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\n\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { rowGroupClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-classes.constants';\nimport { locatePredecessorBySelector } from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-row-helpers';\nimport { groupIdentifier } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-rows-helpers';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\n\nexport class GroupByDragActionService extends TableDragActionService {\n @InjectField() wpTableGroupBy:WorkPackageViewGroupByService;\n\n @InjectField() halEditing:HalResourceEditingService;\n\n @InjectField() halEvents:HalEventsService;\n\n @InjectField() halNotification:HalResourceNotificationService;\n\n @InjectField() schemaCache:SchemaCacheService;\n\n public get applies() {\n return this.wpTableGroupBy.isEnabled;\n }\n\n /**\n * Returns whether the given work package is movable\n */\n public canPickup(workPackage:WorkPackageResource):boolean {\n const attribute = this.groupedAttribute;\n return attribute !== null && this.schemaCache.of(workPackage).isAttributeEditable(attribute);\n }\n\n public handleDrop(workPackage:WorkPackageResource, el:HTMLElement):Promise {\n const changeset = this.halEditing.changeFor(workPackage);\n const groupedValue = this.getValueForGroup(el);\n\n changeset.projectedResource[this.groupedAttribute!] = groupedValue;\n return this.halEditing\n .save(changeset)\n .then((saved) => this.halEvents.push(saved.resource, { eventType: 'updated' }))\n .catch((e) => this.halNotification.handleRawError(e, workPackage));\n }\n\n private getValueForGroup(el:HTMLElement):unknown|null {\n const groupHeader = locatePredecessorBySelector(el, `.${rowGroupClassName}`)!;\n const match = this.groups.find((group) => groupIdentifier(group) === groupHeader.dataset.groupIdentifier);\n\n if (!match) {\n return null;\n }\n\n if (match._links && match._links.valueLink) {\n const links = match._links.valueLink;\n\n // Unwrap single links to properly use them\n return links.length === 1 ? links[0] : links;\n }\n return match.value;\n }\n\n /**\n * Get the attribute we're grouping by\n */\n private get groupedAttribute():string|null {\n const { current } = this.wpTableGroupBy;\n return current ? current.id : null;\n }\n\n /**\n * Returns the reference to the last table.groups state value\n */\n public get groups() {\n return this.querySpace.groups.value || [];\n }\n}\n","import { Injectable, Injector } from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { TableDragActionService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-action.service';\nimport { HierarchyDragActionService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/hierarchy-drag-action.service';\nimport { GroupByDragActionService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/group-by-drag-action.service';\n\ninterface ITableDragActionService {\n new(querySpace:IsolatedQuerySpace, injector:Injector):TableDragActionService;\n}\n\n@Injectable()\nexport class TableDragActionsRegistryService {\n private register:ITableDragActionService[] = [\n HierarchyDragActionService,\n GroupByDragActionService,\n ];\n\n public add(service:ITableDragActionService) {\n this.register.push(service);\n }\n\n public get(injector:Injector):TableDragActionService {\n const querySpace = injector.get(IsolatedQuerySpace);\n\n const match = this.register\n .map((cls) => new cls(querySpace, injector))\n .find((instance) => instance.applies);\n\n return match || new TableDragActionService(querySpace, injector);\n }\n}\n","import {\n AfterViewInit, ChangeDetectorRef, Directive, Input, SimpleChanges,\n} from '@angular/core';\nimport {\n WorkPackageTableConfiguration,\n WorkPackageTableConfigurationObject,\n} from 'core-app/features/work-packages/components/wp-table/wp-table-configuration';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackagesViewBase } from 'core-app/features/work-packages/routing/wp-view-base/work-packages-view.base';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { WorkPackageStatesInitializationService } from '../../wp-list/wp-states-initialization.service';\n\n@Directive()\nexport abstract class WorkPackageEmbeddedBaseComponent extends WorkPackagesViewBase implements AfterViewInit {\n @Input('configuration') protected providedConfiguration:WorkPackageTableConfigurationObject;\n\n @Input() public uniqueEmbeddedTableName = `embedded-table-${Date.now()}`;\n\n @Input() public initialLoadingIndicator = true;\n\n public renderTable = false;\n\n public showTablePagination = false;\n\n public configuration:WorkPackageTableConfiguration;\n\n public error:string|null = null;\n\n protected initialized = false;\n\n @InjectField() apiV3Service:ApiV3Service;\n\n @InjectField() querySpace:IsolatedQuerySpace;\n\n @InjectField() I18n!:I18nService;\n\n @InjectField() urlParamsHelper:UrlParamsHelperService;\n\n @InjectField() loadingIndicatorService:LoadingIndicatorService;\n\n @InjectField() wpStatesInitialization:WorkPackageStatesInitializationService;\n\n @InjectField() currentProject:CurrentProjectService;\n\n @InjectField() cdRef:ChangeDetectorRef;\n\n ngOnInit() {\n this.configuration = new WorkPackageTableConfiguration(this.providedConfiguration);\n // Set embedded status in configuration\n this.configuration.isEmbedded = true;\n this.initialized = true;\n\n super.ngOnInit();\n }\n\n ngAfterViewInit():void {\n // Load initially\n this.loadQuery(true, false);\n }\n\n ngOnChanges(changes:SimpleChanges) {\n if (this.initialized && (changes.queryId || changes.queryProps)) {\n this.loadQuery(this.initialLoadingIndicator, false);\n }\n }\n\n public get projectIdentifier() {\n if (this.configuration.projectContext) {\n return this.currentProject.identifier || undefined;\n }\n return this.configuration.projectIdentifier || undefined;\n }\n\n public buildQueryProps() {\n const query = this.querySpace.query.value!;\n this.wpStatesInitialization.applyToQuery(query);\n\n return this.urlParamsHelper.buildV3GetQueryFromQueryResource(query);\n }\n\n public buildUrlParams() {\n const query = this.querySpace.query.value!;\n this.wpStatesInitialization.applyToQuery(query);\n\n return this.urlParamsHelper.encodeQueryJsonParams(query);\n }\n\n protected setLoaded() {\n this.renderTable = this.configuration.tableVisible;\n this.cdRef.detectChanges();\n }\n\n public refresh(visible = true, firstPage = false):Promise {\n const query = this.querySpace.query.value!;\n const pagination = this.wpTablePagination.paginationObject;\n\n if (firstPage) {\n pagination.offset = 1;\n }\n\n const params = this.urlParamsHelper.buildV3GetQueryFromQueryResource(query, pagination);\n const promise = this\n .wpListService\n .loadQueryFromExisting(query, params, this.queryProjectScope)\n .toPromise()\n .then((query) => this.wpStatesInitialization.updateQuerySpace(query, query.results));\n\n if (visible) {\n this.loadingIndicator = promise;\n }\n return promise;\n }\n\n public get isInitialized() {\n return !!this.configuration;\n }\n\n public set loadingIndicator(promise:Promise) {\n if (this.configuration.tableVisible) {\n this.loadingIndicatorService\n .indicator(this.uniqueEmbeddedTableName)\n .promise = promise;\n }\n }\n\n public abstract loadQuery(visible:boolean, firstPage:boolean):Promise;\n\n protected get queryProjectScope() {\n if (!this.configuration.projectContext) {\n return undefined;\n }\n return this.projectIdentifier;\n }\n\n protected initializeStates(query:QueryResource) {\n this.wpStatesInitialization.clearStates();\n this.wpStatesInitialization.initializeFromQuery(query, query.results);\n this.wpStatesInitialization.updateQuerySpace(query, query.results);\n }\n}\n","
\n\n \n \n \n\n \n\n \n \n\n \n
\n \n \n
\n\n \n \n
\n\n
\n \n
\n
\n","import {\n AfterViewInit, Component, EventEmitter, Input, OnDestroy, OnInit, Output,\n} from '@angular/core';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageViewPaginationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-pagination.service';\nimport { OpTableActionFactory } from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { OpTableActionsService } from 'core-app/features/work-packages/components/wp-table/table-actions/table-actions.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { WpTableConfigurationModalComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { WorkPackageEmbeddedBaseComponent } from 'core-app/features/work-packages/components/wp-table/embedded/wp-embedded-base.component';\nimport { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';\nimport {\n distinctUntilChanged, map, take, withLatestFrom,\n} from 'rxjs/operators';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { KeepTabService } from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Component({\n selector: 'wp-embedded-table',\n templateUrl: './wp-embedded-table.html',\n})\nexport class WorkPackageEmbeddedTableComponent extends WorkPackageEmbeddedBaseComponent implements OnInit, AfterViewInit, OnDestroy {\n @Input('queryId') public queryId?:string;\n\n @Input('queryProps') public queryProps:any = {};\n\n @Input() public tableActions:OpTableActionFactory[] = [];\n\n @Input() public externalHeight = false;\n\n /** Inform about loading errors */\n @Output() public onError = new EventEmitter();\n\n /** Inform about loaded query */\n @Output() public onQueryLoaded = new EventEmitter();\n\n @InjectField() apiv3Service:ApiV3Service;\n\n @InjectField() opModalService:OpModalService;\n\n @InjectField() tableActionsService:OpTableActionsService;\n\n @InjectField() wpTableTimeline:WorkPackageViewTimelineService;\n\n @InjectField() wpTablePagination:WorkPackageViewPaginationService;\n\n @InjectField() keepTab:KeepTabService;\n\n // Cache the form promise\n private formPromise:Promise|undefined;\n\n // If the query was provided to use via the query space,\n // use it to cache first loading\n private loadedQuery:QueryResource|undefined;\n\n ngOnInit() {\n super.ngOnInit();\n this.loadedQuery = this.querySpace.query.value;\n }\n\n ngAfterViewInit():void {\n super.ngAfterViewInit();\n\n // Provision embedded table actions\n if (this.tableActions) {\n this.tableActionsService.setActions(...this.tableActions);\n }\n\n // Reload results on changes to pagination (Regression #29845)\n this.wpTablePagination\n .updates$()\n .pipe(\n map((pagination) => [pagination.page, pagination.perPage]),\n distinctUntilChanged(),\n this.untilDestroyed(),\n withLatestFrom(this.querySpace.query.values$()),\n ).subscribe(([_, query]) => {\n const pagination = this.wpTablePagination.paginationObject;\n const params = this.urlParamsHelper.buildV3GetQueryFromQueryResource(query, pagination);\n\n this.loadingIndicator = this\n .wpListService\n .loadQueryFromExisting(query, params, this.queryProjectScope)\n .toPromise()\n .then((query) => this.initializeStates(query));\n });\n }\n\n public async openConfigurationModal(onUpdated:() => void):Promise {\n await this.querySpace.query.valuesPromise();\n\n this.opModalService\n .show(WpTableConfigurationModalComponent, this.injector)\n // Detach this component when the modal closes and pass along the query data\n .subscribe((modal) => modal.onDataUpdated.subscribe(onUpdated));\n }\n\n protected initializeStates(query:QueryResource) {\n void this.loadForm(query);\n super.initializeStates(query);\n\n this.querySpace\n .initialized\n .values$()\n .pipe(take(1))\n .subscribe(() => {\n this.showTablePagination = query.results.total > query.results.count;\n this.setLoaded();\n\n // Disable compact mode when timeline active\n if (this.wpTableTimeline.isVisible) {\n this.configuration = { ...this.configuration, compactTableStyle: false };\n }\n });\n }\n\n private loadForm(query:QueryResource):Promise {\n if (this.formPromise) {\n return this.formPromise;\n }\n\n return this.formPromise = this\n .apiv3Service\n .withOptionalProject(this.projectIdentifier)\n .queries\n .form\n .load(query)\n .toPromise()\n .then(([form, _]) => {\n this.wpStatesInitialization.updateStatesFromForm(query, form);\n return form;\n })\n .catch(() => this.formPromise = undefined);\n }\n\n public loadQuery(visible = true, firstPage = false):Promise {\n // Ensure we are loading the form.\n this.formPromise = undefined;\n\n if (this.loadedQuery) {\n const query = this.loadedQuery;\n this.loadedQuery = undefined;\n this.initializeStates(query);\n return Promise.resolve(this.loadedQuery!);\n }\n\n // HACK: Decrease loading time of queries when results are not needed.\n // We should allow the backend to disable results embedding instead.\n if (!this.configuration.tableVisible) {\n this.queryProps.pageSize = 1;\n }\n\n // Set first page\n if (firstPage) {\n this.queryProps.page = 1;\n }\n\n this.error = null;\n const promise = this\n .apiv3Service\n .queries\n .find(\n this.queryProps,\n this.queryId,\n this.queryProjectScope,\n )\n .toPromise()\n .then((query:QueryResource) => {\n this.initializeStates(query);\n this.onQueryLoaded.emit(query);\n return query;\n })\n .catch((error) => {\n this.error = this.I18n.t(\n 'js.error.embedded_table_loading',\n { message: _.get(error, 'message', error) },\n );\n this.onError.emit(error);\n });\n\n if (visible) {\n this.loadingIndicator = promise;\n }\n\n return promise;\n }\n\n handleWorkPackageClicked(event:{ workPackageId:string; double:boolean }) {\n if (event.double) {\n this.$state.go(\n 'work-packages.show',\n { workPackageId: event.workPackageId },\n );\n }\n }\n\n openStateLink(event:{ workPackageId:string; requestedState:'show'|'split' }) {\n const params = {\n workPackageId: event.workPackageId,\n focus: true,\n };\n\n if (event.requestedState === 'split') {\n this.keepTab.goCurrentDetailsState(params);\n } else {\n this.keepTab.goCurrentShowState(params);\n }\n }\n}\n","import {\n AfterViewInit, ChangeDetectorRef, Component, Inject, OnInit, ViewChild,\n} from '@angular/core';\nimport { WorkPackageEmbeddedTableComponent } from 'core-app/features/work-packages/components/wp-table/embedded/wp-embedded-table.component';\nimport { WpTableConfigurationService } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.service';\nimport { RestrictedWpTableConfigurationService } from 'core-app/features/work-packages/components/wp-table/external-configuration/restricted-wp-table-configuration.service';\nimport { OpQueryConfigurationLocalsToken } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.constants';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\n\nexport interface QueryConfigurationLocals {\n service:any;\n currentQuery:any;\n urlParams?:boolean;\n disabledTabs?:{ [key:string]:string };\n callback:(newQuery:any) => void;\n}\n\n@Component({\n templateUrl: './external-query-configuration.template.html',\n providers: [[{ provide: WpTableConfigurationService, useClass: RestrictedWpTableConfigurationService }]],\n})\nexport class ExternalQueryConfigurationComponent implements OnInit, AfterViewInit {\n @ViewChild('embeddedTableForConfiguration', { static: true }) private embeddedTable:WorkPackageEmbeddedTableComponent;\n\n queryProps:string;\n\n constructor(@Inject(OpQueryConfigurationLocalsToken) readonly locals:QueryConfigurationLocals,\n readonly urlParamsHelper:UrlParamsHelperService,\n readonly cdRef:ChangeDetectorRef) {\n }\n\n ngOnInit() {\n if (this.locals.urlParams) {\n this.queryProps = this.urlParamsHelper.buildV3GetQueryFromJsonParams(this.locals.currentQuery);\n } else {\n this.queryProps = this.locals.currentQuery;\n }\n }\n\n ngAfterViewInit() {\n // Open the configuration modal in an asynchronous step\n // to avoid nesting components in the view initialization.\n setTimeout(() => {\n this.embeddedTable.openConfigurationModal(() => {\n this.service.detach();\n if (this.locals.urlParams) {\n this.locals.callback(this.embeddedTable.buildUrlParams());\n } else {\n this.locals.callback(this.embeddedTable.buildQueryProps());\n }\n });\n this.cdRef.detectChanges();\n });\n }\n\n public get service():any {\n return this.locals.service;\n }\n}\n","\n \n \n\n","import { InjectionToken } from '@angular/core';\n\nexport const OpQueryConfigurationLocalsToken = new InjectionToken('OpQueryConfigurationLocalsToken');\n","import {\n ApplicationRef, ComponentFactoryResolver, Injectable, Injector,\n} from '@angular/core';\nimport { ComponentPortal, DomPortalOutlet, PortalInjector } from '@angular/cdk/portal';\nimport { TransitionService } from '@uirouter/core';\nimport { FocusHelperService } from 'core-app/shared/directives/focus/focus-helper';\nimport {\n ExternalQueryConfigurationComponent,\n QueryConfigurationLocals,\n} from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.component';\nimport { OpQueryConfigurationLocalsToken } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.constants';\n\nexport type Class = { new(...args:any[]):any; };\n\n@Injectable()\nexport class ExternalQueryConfigurationService {\n // Hold a reference to the DOM node we're using as a host\n private _portalHostElement:HTMLElement;\n\n // And a reference to the actual portal host interface on top of the element\n private _bodyPortalHost:DomPortalOutlet;\n\n constructor(private componentFactoryResolver:ComponentFactoryResolver,\n readonly FocusHelper:FocusHelperService,\n private appRef:ApplicationRef,\n private $transitions:TransitionService,\n private injector:Injector) {\n }\n\n /**\n * Create a portal host element to contain the table configuration components.\n */\n private get bodyPortalHost() {\n if (!this._portalHostElement) {\n const hostElement = this._portalHostElement = document.createElement('div');\n hostElement.classList.add('op-external-query-configuration--container');\n document.body.appendChild(hostElement);\n\n this._bodyPortalHost = new DomPortalOutlet(\n hostElement,\n this.componentFactoryResolver,\n this.appRef,\n this.injector,\n );\n }\n\n return this._bodyPortalHost;\n }\n\n /**\n * Open a Modal reference and append it to the portal\n */\n public show(data:Partial) {\n this.detach();\n\n // Create a portal for the given component class and render it\n const portal = new ComponentPortal(\n this.externalQueryConfigurationComponent(),\n null,\n this.injectorFor(data),\n );\n this.bodyPortalHost.attach(portal);\n this._portalHostElement.style.display = 'block';\n }\n\n /**\n * Closes currently open modal window\n */\n public detach() {\n // Detach any component currently in the portal\n if (this.bodyPortalHost.hasAttached()) {\n this.bodyPortalHost.detach();\n this._portalHostElement.style.display = 'none';\n }\n }\n\n /**\n * Create an augmented injector that is equal to this service's injector + the additional data\n * passed into +show+.\n * This allows callers to pass data into the newly created modal.\n *\n */\n private injectorFor(data:any) {\n const injectorTokens = new WeakMap();\n // Pass the service because otherwise we're getting a cyclic dependency between the portal\n // host service and the bound portal\n data.service = this;\n\n injectorTokens.set(OpQueryConfigurationLocalsToken, data);\n\n return new PortalInjector(this.injector, injectorTokens);\n }\n\n externalQueryConfigurationComponent():Class {\n return ExternalQueryConfigurationComponent;\n }\n}\n","
\n
\n \n &ngsp;\n \n
\n
\n","import {\n Component,\n Injector,\n OnInit,\n} from '@angular/core';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { QueryFilterResource } from 'core-app/features/hal/resources/query-filter-resource';\nimport { QueryOperatorResource } from 'core-app/features/hal/resources/query-operator-resource';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\n\n@Component({\n templateUrl: './wp-table-configuration-relation-selector.html',\n selector: 'wp-table-configuration-relation-selector',\n})\nexport class WpTableConfigurationRelationSelectorComponent implements OnInit {\n private relationFilterIds:string[] = [\n 'parent',\n 'precedes',\n 'follows',\n 'relates',\n 'duplicates',\n 'duplicated',\n 'blocks',\n 'blocked',\n 'partof',\n 'includes',\n 'requires',\n 'required',\n ];\n\n public availableRelationFilters:QueryFilterResource[] = [];\n\n public selectedRelationFilter:QueryFilterResource|undefined = undefined;\n\n public text = {\n filter_work_packages_by_relation_type: this.I18n.t('js.work_packages.table_configuration.relation_filters.filter_work_packages_by_relation_type'),\n please_select: this.I18n.t('js.placeholders.selection'),\n // We need to inverse the translation strings, as the filters's are named the other way around than what\n // a user knows from the relations tab:\n parent: this.I18n.t('js.relation_labels.children'),\n precedes: this.I18n.t('js.relation_labels.follows'),\n follows: this.I18n.t('js.relation_labels.precedes'),\n relates: this.I18n.t('js.relation_labels.relates'),\n duplicates: this.I18n.t('js.relation_labels.duplicated'),\n duplicated: this.I18n.t('js.relation_labels.duplicates'),\n blocks: this.I18n.t('js.relation_labels.blocked'),\n blocked: this.I18n.t('js.relation_labels.blocks'),\n requires: this.I18n.t('js.relation_labels.required'),\n required: this.I18n.t('js.relation_labels.requires'),\n partof: this.I18n.t('js.relation_labels.includes'),\n includes: this.I18n.t('js.relation_labels.partof'),\n };\n\n constructor(readonly injector:Injector,\n readonly I18n:I18nService,\n readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly ConfigurationService:ConfigurationService,\n readonly schemaCache:SchemaCacheService) {\n }\n\n ngOnInit() {\n const self:WpTableConfigurationRelationSelectorComponent = this;\n\n this.wpTableFilters\n .onReady()\n .then(() => {\n self.availableRelationFilters = self.relationFiltersOf(self.wpTableFilters.availableFilters) as QueryFilterResource[];\n self.setSelectedRelationFilter();\n });\n }\n\n private setSelectedRelationFilter():void {\n const currentRelationFilters:QueryFilterInstanceResource[] = this.relationFiltersOf(this.wpTableFilters.current) as QueryFilterInstanceResource[];\n if (currentRelationFilters.length > 0) {\n this.selectedRelationFilter = _.find(this.availableRelationFilters, { id: currentRelationFilters[0].id }) as QueryFilterResource;\n } else {\n this.selectedRelationFilter = this.availableRelationFilters[0];\n }\n this.onRelationFilterSelected();\n }\n\n public onRelationFilterSelected() {\n if (this.selectedRelationFilter) {\n this.removeRelationFiltersFromCurrentState();\n this.addFilterToCurrentState(this.selectedRelationFilter);\n }\n }\n\n private removeRelationFiltersFromCurrentState() {\n const filtersToRemove = this.relationFiltersOf(this.wpTableFilters.current) as QueryFilterInstanceResource[];\n this.wpTableFilters.remove(...filtersToRemove);\n }\n\n private relationFiltersOf(filters:QueryFilterResource[]|QueryFilterInstanceResource[]):QueryFilterResource[]|QueryFilterInstanceResource[] {\n return _.filter(filters, (filter:QueryFilterResource|QueryFilterInstanceResource) => _.includes(this.relationFilterIds, filter.id));\n }\n\n private addFilterToCurrentState(filter:QueryFilterResource):void {\n const newFilter = this.wpTableFilters.instantiate(filter);\n const operator:QueryOperatorResource = this.getOperatorForId(newFilter, '=');\n newFilter.operator = operator;\n newFilter.values = [{ href: '/api/v3/work_packages/{id}' }] as HalResource[];\n\n this.wpTableFilters.add(newFilter);\n }\n\n private getOperatorForId(filter:QueryFilterResource, id:string):QueryOperatorResource {\n return _.find(this.schemaCache.of(filter).availableOperators, { id }) as QueryOperatorResource;\n }\n\n public compareRelationFilters(f1:undefined|QueryFilterResource, f2:undefined|QueryFilterResource):boolean {\n return f1 && f2 ? f1.id === f2.id : f1 === f2;\n }\n}\n","import {\n Component,\n} from '@angular/core';\nimport { WpTableConfigurationService } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.service';\nimport { RestrictedWpTableConfigurationService } from 'core-app/features/work-packages/components/wp-table/external-configuration/restricted-wp-table-configuration.service';\nimport { WpTableConfigurationRelationSelectorComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration-relation-selector';\nimport { WpTableConfigurationModalPrependToken } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\nimport { ExternalQueryConfigurationComponent } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.component';\n\n@Component({\n templateUrl: './external-query-configuration.template.html',\n providers: [\n [\n { provide: WpTableConfigurationService, useClass: RestrictedWpTableConfigurationService },\n ],\n { provide: WpTableConfigurationModalPrependToken, useValue: WpTableConfigurationRelationSelectorComponent },\n ],\n})\nexport class ExternalRelationQueryConfigurationComponent extends ExternalQueryConfigurationComponent {\n}\n","import { Injectable } from '@angular/core';\nimport {\n Class,\n ExternalQueryConfigurationService,\n} from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.service';\nimport { ExternalRelationQueryConfigurationComponent } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.component';\n\n@Injectable()\nexport class ExternalRelationQueryConfigurationService extends ExternalQueryConfigurationService {\n externalQueryConfigurationComponent():Class {\n return ExternalRelationQueryConfigurationComponent;\n }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TabInterface } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { WpTableConfigurationService } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.service';\nimport { QueryConfigurationLocals } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.component';\nimport { OpQueryConfigurationLocalsToken } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.constants';\n\n@Injectable()\nexport class RestrictedWpTableConfigurationService extends WpTableConfigurationService {\n constructor(@Inject(OpQueryConfigurationLocalsToken) readonly locals:QueryConfigurationLocals,\n readonly I18n:I18nService) {\n super(I18n);\n }\n\n public get tabs():TabInterface[] {\n const disabledTabs = this.locals.disabledTabs || {};\n\n return this\n ._tabs\n .map((el) => {\n const reason = disabledTabs[el.id];\n if (reason != null) {\n el.disable = reason;\n }\n\n return el;\n });\n }\n}\n","import {\n contextColumnIcon,\n OpTableAction,\n OpTableActionFactory,\n} from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { opIconElement } from 'core-app/shared/helpers/op-icon-builder';\nimport { Injector } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\nexport class OpUnlinkTableAction extends OpTableAction {\n constructor(public injector:Injector,\n public workPackage:WorkPackageResource,\n public readonly identifier:string,\n private title:string,\n readonly applicable:(workPackage:WorkPackageResource) => boolean,\n readonly onClick:(workPackage:WorkPackageResource) => void) {\n super(injector, workPackage);\n }\n\n /**\n * Returns a factory for this action with the given title and identifier for reusing\n * remove actions.\n *\n * @param {string} identifier\n * @param {string} title\n */\n public static factoryFor(identifier:string,\n title:string,\n onClick:(workPackage:WorkPackageResource) => void,\n applicable:(workPackage:WorkPackageResource) => boolean = () => true):OpTableActionFactory {\n return (injector:Injector, workPackage:WorkPackageResource) => new OpUnlinkTableAction(injector,\n workPackage,\n identifier,\n title,\n applicable,\n onClick) as OpTableAction;\n }\n\n public buildElement() {\n if (!this.applicable(this.workPackage)) {\n return null;\n }\n\n const element = document.createElement('a');\n element.title = this.title;\n element.href = '#';\n element.classList.add(contextColumnIcon, 'wp-table-action--unlink');\n element.dataset.workPackageId = this.workPackage.id!;\n element.appendChild(opIconElement('icon', 'icon-close'));\n jQuery(element).click((event) => {\n event.preventDefault();\n this.onClick(this.workPackage);\n });\n\n return element;\n }\n}\n","import { Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport type OpTableActionFactory = (i:Injector, wp:WorkPackageResource) => OpTableAction;\nexport const contextMenuTdClassName = 'wp-table--context-menu-td';\nexport const contextMenuSpanClassName = 'wp-table--context-menu-span';\nexport const contextMenuLinkClassName = 'wp-table-context-menu-link';\nexport const contextColumnIcon = 'wp-table-context-menu-icon';\n\nexport abstract class OpTableAction {\n @InjectField() I18n!:I18nService;\n\n constructor(readonly injector:Injector,\n readonly workPackage:WorkPackageResource) {\n }\n\n /** Identifier to uniquely identify the action */\n public abstract readonly identifier:string;\n\n /** The actual action factory to return the action element, if it can be rendered */\n public abstract buildElement():HTMLElement|null;\n}\n","import { contextColumnIcon, OpTableAction } from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { opIconElement } from 'core-app/shared/helpers/op-icon-builder';\n\nimport { KeepTabService } from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\nimport { UiStateLinkBuilder } from 'core-app/features/work-packages/components/wp-fast-table/builders/ui-state-link-builder';\nimport { StateService } from '@uirouter/core';\n\nexport const detailsLinkClassName = 'wp-table--details-link';\n\nexport class OpDetailsTableAction extends OpTableAction {\n public readonly identifier = 'open-details-action';\n\n private uiStatebuilder = new UiStateLinkBuilder(this.injector.get(StateService), this.injector.get(KeepTabService));\n\n private text = {\n button: this.I18n.t('js.button_open_details'),\n };\n\n public buildElement() {\n // Append details button\n const detailsLink = this.uiStatebuilder.linkToDetails(\n this.workPackage.id!,\n this.text.button,\n '',\n );\n\n detailsLink.classList.add(detailsLinkClassName, contextColumnIcon, 'hidden-for-mobile');\n detailsLink.appendChild(opIconElement('icon', 'icon-info2'));\n\n return detailsLink;\n }\n}\n","import {\n contextColumnIcon,\n contextMenuLinkClassName,\n OpTableAction,\n} from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { opIconElement } from 'core-app/shared/helpers/op-icon-builder';\n\nexport class OpContextMenuTableAction extends OpTableAction {\n public readonly identifier = 'open-context-menu-action';\n\n private text = {\n linkTitle: this.I18n.t('js.label_open_context_menu'),\n };\n\n public buildElement() {\n const contextMenu = document.createElement('a');\n contextMenu.href = '#';\n contextMenu.classList.add(contextMenuLinkClassName, contextColumnIcon);\n contextMenu.title = this.text.linkTitle;\n contextMenu.appendChild(opIconElement('icon', 'icon-show-more-horizontal'));\n\n return contextMenu;\n }\n}\n","import { Injectable, Injector } from '@angular/core';\nimport {\n OpTableActionFactory,\n} from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { OpDetailsTableAction } from 'core-app/features/work-packages/components/wp-table/table-actions/actions/details-table-action';\nimport { OpContextMenuTableAction } from 'core-app/features/work-packages/components/wp-table/table-actions/actions/context-menu-table-action';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\n@Injectable()\nexport class OpTableActionsService {\n constructor(private readonly injector:Injector) {\n }\n\n /**\n * Actions currently registered\n */\n private actions:OpTableActionFactory[] = [\n (injector, workPackage) => new OpDetailsTableAction(injector, workPackage),\n (injector, workPackage) => new OpContextMenuTableAction(injector, workPackage),\n ];\n\n /**\n * Replace the actions with a different set\n */\n public setActions(...actions:OpTableActionFactory[]) {\n this.actions = actions;\n }\n\n /**\n * Render actions for the given work package.\n * @param {WorkPackageResource} workPackage\n */\n public render(workPackage:WorkPackageResource):HTMLElement[] {\n const built = this.actions.map((factory) => factory(this.injector, workPackage).buildElement());\n return _.compact(built);\n }\n}\n","
\n \n\n
\n
    \n
  • \n\n
  • \n\n \n \n \n\n {{ perPageOption }}\n
  • \n
\n
\n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport const selectorTableSide = '.work-packages-tabletimeline--table-side';\nexport const selectorTimelineSide = '.work-packages-tabletimeline--timeline-side';\nconst jQueryScrollSyncEventNamespace = '.scroll-sync';\nconst scrollStep = 15;\n\nfunction getXandYScrollDeltas(ev:WheelEvent):[number, number] {\n let x = ev.deltaX;\n let y = ev.deltaY;\n\n if (ev.shiftKey) {\n x = y;\n y = 0;\n }\n\n return [x, y];\n}\n\nfunction getPlattformAgnosticScrollAmount(originalValue:number) {\n if (originalValue === 0) {\n return originalValue;\n }\n\n let delta = scrollStep;\n\n // Browser-specific logic\n // TODO\n\n if (originalValue < 0) {\n delta *= -1;\n }\n return delta;\n}\n\nfunction syncWheelEvent(jev:JQuery.TriggeredEvent, elementTable:JQuery, elementTimeline:JQuery) {\n const scrollTarget = jev.target;\n const ev:WheelEvent = jev.originalEvent as any;\n let [deltaX, deltaY] = getXandYScrollDeltas(ev);\n\n if (deltaY === 0) {\n return;\n }\n\n deltaX = getPlattformAgnosticScrollAmount(deltaX); // apply only in target div\n deltaY = getPlattformAgnosticScrollAmount(deltaY); // apply in both divs\n\n window.requestAnimationFrame(() => {\n elementTable[0].scrollTop = elementTable[0].scrollTop + deltaY;\n elementTimeline[0].scrollTop = elementTable[0].scrollTop + deltaY;\n\n scrollTarget.scrollLeft += deltaX;\n });\n}\n\n/**\n * Activate or deactivate the scroll-sync between the table and timeline view.\n *\n * @param $element true if the timeline is visible, false otherwise.\n */\nexport function createScrollSync($element:JQuery) {\n const elTable = jQuery($element).find(selectorTableSide);\n const elTimeline = jQuery($element).find(selectorTimelineSide);\n\n return (timelineVisible:boolean) => {\n // state vars\n let syncedLeft = false;\n let syncedRight = false;\n\n if (timelineVisible) {\n // setup event listener for table\n elTable.on(`wheel${jQueryScrollSyncEventNamespace}`, (jev:JQuery.TriggeredEvent) => {\n syncWheelEvent(jev, elTable, elTimeline);\n });\n elTable.on(`scroll${jQueryScrollSyncEventNamespace}`, (ev:JQuery.TriggeredEvent) => {\n syncedLeft = true;\n if (!syncedRight) {\n elTimeline[0].scrollTop = ev.target.scrollTop;\n }\n if (syncedLeft && syncedRight) {\n syncedLeft = false;\n syncedRight = false;\n }\n });\n\n // setup event listener for timeline\n elTimeline.on(`wheel${jQueryScrollSyncEventNamespace}`, (jev:JQuery.TriggeredEvent) => {\n syncWheelEvent(jev, elTable, elTimeline);\n });\n elTimeline.on(`scroll${jQueryScrollSyncEventNamespace}`, (ev:JQuery.TriggeredEvent) => {\n syncedRight = true;\n if (!syncedLeft) {\n elTable[0].scrollTop = ev.target.scrollTop;\n }\n if (syncedLeft && syncedRight) {\n syncedLeft = false;\n syncedRight = false;\n }\n });\n } else {\n elTable.off(jQueryScrollSyncEventNamespace);\n }\n };\n}\n","import { Injector } from '@angular/core';\nimport { distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageViewHighlightingService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-highlighting.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport class HighlightingTransformer {\n @InjectField() public wpTableHighlighting:WorkPackageViewHighlightingService;\n\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n constructor(public readonly injector:Injector,\n table:WorkPackageTable) {\n this.wpTableHighlighting\n .updates$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n distinctUntilChanged(),\n )\n .subscribe(() => table.redrawTable());\n }\n}\n","import { Injector } from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { TableDragActionsRegistryService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-actions-registry.service';\nimport { TableDragActionService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-action.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { tableRowClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/rows/single-row-builder';\nimport { DragAndDropService } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.service';\nimport { reinsert } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.helpers';\nimport { WorkPackageViewOrderService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service';\nimport { BrowserDetector } from 'core-app/core/browser/browser-detector.service';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { isInsideCollapsedGroup } from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-row-helpers';\nimport { collapsedGroupClass } from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-hierarchy-helpers';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport class DragAndDropTransformer {\n @InjectField() private readonly states:States;\n\n @InjectField() private readonly querySpace:IsolatedQuerySpace;\n\n @InjectField() private readonly inlineCreateService:WorkPackageInlineCreateService;\n\n @InjectField() private readonly halNotification:HalResourceNotificationService;\n\n @InjectField() private readonly wpTableSortBy:WorkPackageViewSortByService;\n\n @InjectField() private readonly wpTableOrder:WorkPackageViewOrderService;\n\n @InjectField() private readonly browserDetector:BrowserDetector;\n\n @InjectField() private readonly apiV3Service:ApiV3Service;\n\n @InjectField() private readonly wpListService:WorkPackagesListService;\n\n @InjectField() private readonly dragActionRegistry:TableDragActionsRegistryService;\n\n @InjectField(DragAndDropService, null) private readonly dragService:DragAndDropService|null;\n\n constructor(public readonly injector:Injector,\n public table:WorkPackageTable) {\n // The DragService may not have been provided\n // in which case we do not provide drag and drop\n if (this.dragService === null) {\n return;\n }\n\n this.inlineCreateService.newInlineWorkPackageCreated\n .pipe(takeUntil(this.querySpace.stopAllSubscriptions))\n .subscribe(async (wpId) => {\n const newOrder = await this.wpTableOrder.add(this.currentOrder, wpId);\n this.updateRenderedOrder(newOrder);\n });\n\n this.querySpace.stopAllSubscriptions\n .pipe(take(1))\n .subscribe(() => {\n this.dragService!.remove(this.table.tbody);\n });\n\n this.dragService.register({\n dragContainer: this.table.tbody,\n scrollContainers: [this.table.scrollContainer],\n accepts: () => true,\n moves: (el:any, source:any, handle:HTMLElement) => {\n if (!handle.classList.contains('wp-table--drag-and-drop-handle')) {\n return false;\n }\n\n const wpId:string = el.dataset.workPackageId!;\n const workPackage = this.states.workPackages.get(wpId).value;\n return !!workPackage && this.actionService.canPickup(workPackage);\n },\n onMoved: async (el:HTMLElement, target:HTMLElement, source:HTMLElement, sibling:HTMLElement|null) => {\n const wpId:string = el.dataset.workPackageId!;\n let rowIndex;\n\n try {\n const workPackage = await this.apiV3Service.work_packages.id(wpId).get().toPromise();\n\n if (isInsideCollapsedGroup(sibling)) {\n const collapsedGroupCSSClass = Array.from(sibling!.classList).find((listClass) => listClass.includes(collapsedGroupClass()))!;\n const collapsedGroupId = collapsedGroupCSSClass.replace(collapsedGroupClass(), '');\n const collapsedGroupElements = source.getElementsByClassName(collapsedGroupClass(collapsedGroupId));\n const collapsedGroupLastChild = collapsedGroupElements[collapsedGroupElements.length - 1];\n rowIndex = this.findRowIndex(collapsedGroupLastChild as HTMLElement);\n } else {\n rowIndex = this.findRowIndex(el);\n }\n\n const newOrder = await this.wpTableOrder.move(this.currentOrder, wpId, rowIndex);\n\n await this.actionService.handleDrop(workPackage, el);\n this.updateRenderedOrder(newOrder);\n this.actionService.onNewOrder(newOrder);\n\n // Save the query when switching to manual\n const query = this.querySpace.query.value;\n if (query && this.wpTableSortBy.switchToManualSorting(query)) {\n await this.wpListService.createOrSave(query);\n }\n } catch (e) {\n this.halNotification.handleRawError(e);\n\n // Restore original element's styles\n this.actionService.changeShadowElement(el, true);\n // Restore element in from container\n reinsert(el, el.dataset.sourceIndex || -1, source);\n }\n },\n onRemoved: (el:HTMLElement) => {\n const wpId:string = el.dataset.workPackageId!;\n const newOrder = this.wpTableOrder.remove(this.currentOrder, wpId);\n this.updateRenderedOrder(newOrder);\n },\n onAdded: async (el:HTMLElement) => {\n const wpId:string = el.dataset.workPackageId!;\n const workPackage = await this.apiV3Service.work_packages.id(wpId).get().toPromise();\n const rowIndex = this.findRowIndex(el);\n\n return this.actionService\n .handleDrop(workPackage, el)\n .then(async () => {\n const newOrder = await this.wpTableOrder.add(this.currentOrder, wpId, rowIndex);\n this.updateRenderedOrder(newOrder);\n this.actionService.onNewOrder(newOrder);\n\n return true;\n })\n .catch(() => false);\n },\n onCloned: async (clone:HTMLElement, original:HTMLElement) => {\n // Replace clone with one TD of the subject\n const wpId:string = original.dataset.workPackageId!;\n const workPackage = await this.apiV3Service.work_packages.id(wpId).get().toPromise();\n\n const colspan = clone.children.length;\n const td = document.createElement('td');\n td.textContent = workPackage.subjectWithId();\n td.colSpan = colspan;\n td.classList.add('wp-table--cell-td', 'subject');\n\n clone.style.maxWidth = '500px';\n clone.innerHTML = td.outerHTML;\n },\n onShadowInserted: (el:HTMLElement) => {\n if (!this.browserDetector.isEdge) {\n this.actionService.changeShadowElement(el);\n }\n },\n onCancel: (el:HTMLElement) => {\n if (!this.browserDetector.isEdge) {\n this.actionService.changeShadowElement(el, true);\n }\n },\n });\n }\n\n /**\n * Update current rendered order\n */\n private async updateRenderedOrder(order:string[]) {\n order = _.uniq(order);\n\n const mappedOrder = await Promise.all(\n order.map(\n (wpId) => this.apiV3Service.work_packages.id(wpId).get().toPromise(),\n ),\n );\n\n /** Re-render the table */\n this.table.initialSetup(mappedOrder);\n }\n\n protected get actionService():TableDragActionService {\n return this.dragActionRegistry.get(this.injector);\n }\n\n protected get currentOrder():string[] {\n return this\n .currentRenderedOrder\n .map((row) => row.workPackageId!);\n }\n\n protected get currentRenderedOrder():RenderedWorkPackage[] {\n return this\n .querySpace\n .renderedWorkPackages\n .getValueOr([]);\n }\n\n /**\n * Find the index of the row in the set of rendered work packages.\n * This will skip non-work-package rows such as group headers\n * @param el\n */\n private findRowIndex(el:HTMLElement):number {\n const rows = Array.from(this.table.tbody.getElementsByClassName(tableRowClassName));\n return rows.indexOf(el) || 0;\n }\n}\n","import { Injector } from '@angular/core';\nimport { distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageViewCollapsedGroupsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-collapsed-groups.service';\n\nexport class GroupFoldTransformer {\n @InjectField() public workPackageViewCollapsedGroupsService:WorkPackageViewCollapsedGroupsService;\n\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n constructor(public readonly injector:Injector,\n table:WorkPackageTable) {\n this.workPackageViewCollapsedGroupsService\n .updates$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n distinctUntilChanged(),\n )\n .subscribe((groupsCollapseEvent) => table.setGroupsCollapseState(groupsCollapseEvent.state));\n }\n}\n","import { Injector } from '@angular/core';\nimport { displayClassName, editableClassName, readOnlyClassName } from 'core-app/shared/components/fields/display/display-field-renderer';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { getPosition } from 'core-app/shared/helpers/set-click-position/set-click-position';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport { States } from 'core-app/core/states/states.service';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { TableEventComponent, TableEventHandler } from '../table-handler-registry';\nimport { ClickOrEnterHandler } from '../click-or-enter-handler';\nimport { WorkPackageTable } from '../../wp-fast-table';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\n\nexport class EditCellHandler extends ClickOrEnterHandler implements TableEventHandler {\n // Injections\n @InjectField() public states:States;\n\n @InjectField() public halEditing:HalResourceEditingService;\n\n // Keep a reference to all\n\n public get EVENT() {\n return 'click.table.cell, keydown.table.cell';\n }\n\n public get SELECTOR() {\n return `.${displayClassName}.${editableClassName}`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tableAndTimelineContainer);\n }\n\n constructor(public readonly injector:Injector) {\n super();\n }\n\n protected processEvent(table:WorkPackageTable, evt:JQuery.TriggeredEvent):boolean {\n debugLog('Starting editing on cell: ', evt.target);\n evt.preventDefault();\n\n // Locate the cell from event\n const target = jQuery(evt.target).closest(`.${displayClassName}`);\n // Get the target field name\n const fieldName = target.data('fieldName');\n\n if (!fieldName) {\n debugLog('Click handled by cell not a field? ', evt.target);\n return true;\n }\n\n // Locate the row\n const rowElement = target.closest(`.${tableRowClassName}`);\n // Get the work package we're editing\n const workPackageId = rowElement.data('workPackageId');\n const workPackage = this.states.workPackages.get(workPackageId).value!;\n // Get the row context\n const classIdentifier = rowElement.data('classIdentifier');\n\n // Get any existing edit state for this work package\n const form = table.editing.startEditing(workPackage, classIdentifier);\n\n // Get the position where the user clicked.\n const positionOffset = getPosition(evt);\n\n // Activate the field\n form.activate(fieldName)\n .then((handler:EditFieldHandler) => {\n handler.$onUserActivate.next();\n handler.focus(positionOffset);\n })\n .catch(() => target.addClass(readOnlyClassName));\n\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageViewRelationColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-relation-columns.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { relationCellIndicatorClassName, relationCellTdClassName } from '../../builders/relation-cell-builder';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { WorkPackageTable } from '../../wp-fast-table';\nimport { ClickOrEnterHandler } from '../click-or-enter-handler';\nimport { TableEventComponent, TableEventHandler } from '../table-handler-registry';\n\nexport class RelationsCellHandler extends ClickOrEnterHandler implements TableEventHandler {\n // Injections\n @InjectField() wpTableRelationColumns:WorkPackageViewRelationColumnsService;\n\n public get EVENT() {\n return 'click.table.relationsCell, keydown.table.relationsCell';\n }\n\n public get SELECTOR() {\n return `.${relationCellIndicatorClassName}`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tableAndTimelineContainer);\n }\n\n constructor(public readonly injector:Injector) {\n super();\n }\n\n protected processEvent(table:WorkPackageTable, evt:JQuery.TriggeredEvent):boolean {\n debugLog('Handled click on relation cell %o', evt.target);\n evt.preventDefault();\n\n // Locate the relation td\n const td = jQuery(evt.target).closest(`.${relationCellTdClassName}`);\n const columnId = td.data('columnId');\n\n // Locate the row\n const rowElement = jQuery(evt.target).closest(`.${tableRowClassName}`);\n const workPackageId = rowElement.data('workPackageId');\n\n // If currently expanded\n if (this.wpTableRelationColumns.getExpandFor(workPackageId) === columnId) {\n this.wpTableRelationColumns.collapse(workPackageId);\n } else {\n this.wpTableRelationColumns.setExpandFor(workPackageId, columnId);\n }\n\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageAction } from 'core-app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { WorkPackageViewContextMenu } from 'core-app/shared/components/op-context-menu/wp-context-menu/wp-view-context-menu.directive';\nimport { WorkPackageViewHierarchyIdentationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy-indentation.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class WorkPackageTableContextMenu extends WorkPackageViewContextMenu {\n @InjectField() wpViewIndentation:WorkPackageViewHierarchyIdentationService;\n\n constructor(public injector:Injector,\n protected workPackageId:string,\n protected $element:JQuery,\n protected additionalPositionArgs:any = {},\n protected table:WorkPackageTable) {\n super(injector, workPackageId, $element, additionalPositionArgs, true);\n }\n\n public triggerContextMenuAction(action:WorkPackageAction) {\n switch (action.key) {\n case 'relation-precedes':\n this.table.timelineController.startAddRelationPredecessor(this.workPackage);\n break;\n\n case 'relation-follows':\n this.table.timelineController.startAddRelationFollower(this.workPackage);\n break;\n\n case 'hierarchy-indent':\n this.wpViewIndentation.indent(this.workPackage);\n break;\n\n case 'hierarchy-outdent':\n this.wpViewIndentation.outdent(this.workPackage);\n break;\n\n default:\n super.triggerContextMenuAction(action);\n break;\n }\n }\n}\n","import { Injector } from '@angular/core';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { WorkPackageTableContextMenu } from 'core-app/shared/components/op-context-menu/wp-context-menu/wp-table-context-menu.directive';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { WorkPackageTable } from '../../wp-fast-table';\nimport { TableEventComponent, TableEventHandler } from '../table-handler-registry';\n\nexport abstract class ContextMenuHandler implements TableEventHandler {\n // Injections\n @InjectField() public opContextMenu:OPContextMenuService;\n\n constructor(public readonly injector:Injector) {\n }\n\n public get rowSelector() {\n return `.${tableRowClassName}`;\n }\n\n public abstract get EVENT():string;\n\n public abstract get SELECTOR():string;\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tableAndTimelineContainer);\n }\n\n public abstract handleEvent(view:TableEventComponent, evt:JQuery.TriggeredEvent):boolean;\n\n protected openContextMenu(table:WorkPackageTable, evt:JQuery.TriggeredEvent, workPackageId:string, positionArgs?:any):void {\n const handler = new WorkPackageTableContextMenu(this.injector, workPackageId, jQuery(evt.target) as JQuery, positionArgs, table);\n this.opContextMenu.show(handler, evt);\n }\n}\n","import { Injector } from '@angular/core';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { contextMenuLinkClassName } from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { TableEventComponent } from 'core-app/features/work-packages/components/wp-fast-table/handlers/table-handler-registry';\nimport { uiStateLinkClass } from '../../builders/ui-state-link-builder';\nimport { ContextMenuHandler } from './context-menu-handler';\n\nexport class ContextMenuClickHandler extends ContextMenuHandler {\n constructor(public readonly injector:Injector) {\n super(injector);\n }\n\n public get EVENT() {\n return 'click.table.contextmenu';\n }\n\n public get SELECTOR() {\n return `.${contextMenuLinkClassName}`;\n }\n\n public handleEvent(view:TableEventComponent, evt:JQuery.TriggeredEvent):boolean {\n const target = jQuery(evt.target);\n\n // We want to keep the original context menu on hrefs\n // (currently, this is only the id\n if (target.closest(`.${uiStateLinkClass}`).length) {\n debugLog('Allowing original context menu on state link');\n return true;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n\n // Locate the row from event\n const element = target.closest(this.rowSelector);\n const wpId = element.data('workPackageId');\n\n if (wpId) {\n this.openContextMenu(view.workPackageTable, evt, wpId);\n }\n\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { KeyCodes } from 'core-app/shared/helpers/keyCodes.enum';\nimport { TableEventComponent } from 'core-app/features/work-packages/components/wp-fast-table/handlers/table-handler-registry';\nimport { ContextMenuHandler } from './context-menu-handler';\n\nexport class ContextMenuKeyboardHandler extends ContextMenuHandler {\n constructor(public readonly injector:Injector) {\n super(injector);\n }\n\n public get EVENT() {\n return 'keydown.table.contextmenu';\n }\n\n public get SELECTOR() {\n return this.rowSelector;\n }\n\n public handleEvent(component:TableEventComponent, evt:JQuery.TriggeredEvent):boolean {\n if (!component.workPackageTable.configuration.contextMenuEnabled) {\n return false;\n }\n\n const target = jQuery(evt.target);\n\n if (!(evt.keyCode === KeyCodes.F10 && evt.shiftKey && evt.altKey)) {\n return true;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n\n // Locate the row from event\n const element = target.closest(this.SELECTOR);\n const wpId = element.data('workPackageId');\n\n // Set position args to open at element\n const position = { my: 'left top', at: 'left bottom', of: target };\n\n super.openContextMenu(component.workPackageTable, evt, wpId, position);\n\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { TableEventComponent } from 'core-app/features/work-packages/components/wp-fast-table/handlers/table-handler-registry';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { timelineCellClassName } from '../../builders/timeline/timeline-row-builder';\nimport { uiStateLinkClass } from '../../builders/ui-state-link-builder';\nimport { ContextMenuHandler } from './context-menu-handler';\n\nexport class ContextMenuRightClickHandler extends ContextMenuHandler {\n @InjectField() readonly wpTableSelection:WorkPackageViewSelectionService;\n\n constructor(public readonly injector:Injector) {\n super(injector);\n }\n\n public get EVENT() {\n return 'contextmenu.table.rightclick';\n }\n\n public get SELECTOR() {\n return `.${tableRowClassName},.${timelineCellClassName}`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tableAndTimelineContainer);\n }\n\n public handleEvent(view:TableEventComponent, evt:JQuery.TriggeredEvent):boolean {\n if (!view.workPackageTable.configuration.contextMenuEnabled) {\n return false;\n }\n const target = jQuery(evt.target);\n\n // We want to keep the original context menu on hrefs\n // (currently, this is only the id\n if (target.closest(`.${uiStateLinkClass}`).length) {\n debugLog('Allowing original context menu on state link');\n return true;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n\n // Locate the row from event\n const element = target.closest(this.SELECTOR);\n const wpId = element.data('workPackageId');\n\n if (wpId) {\n const [index] = view.workPackageTable.findRenderedRow(wpId);\n\n if (!this.wpTableSelection.isSelected(wpId)) {\n this.wpTableSelection.setSelection(wpId, index);\n }\n\n this.openContextMenu(view.workPackageTable, evt, wpId);\n }\n\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { StateService } from '@uirouter/core';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { displayClassName } from 'core-app/shared/components/fields/display/display-field-renderer';\nimport { activeFieldClassName } from 'core-app/shared/components/fields/edit/edit-form/edit-form';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { TableEventComponent, TableEventHandler } from '../table-handler-registry';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { KeepTabService } from '../../../wp-single-view-tabs/keep-tab/keep-tab.service';\n\nexport class RowClickHandler implements TableEventHandler {\n // Injections\n @InjectField() public $state:StateService;\n\n @InjectField() public states:States;\n\n @InjectField() public keepTab:KeepTabService;\n\n @InjectField() public wpTableSelection:WorkPackageViewSelectionService;\n\n @InjectField() public wpTableFocus:WorkPackageViewFocusService;\n\n constructor(public readonly injector:Injector) {\n }\n\n public get EVENT() {\n return 'click.table.row';\n }\n\n public get SELECTOR() {\n return `.${tableRowClassName}`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tbody);\n }\n\n public handleEvent(view:TableEventComponent, evt:JQuery.TriggeredEvent) {\n const target = jQuery(evt.target);\n\n // Ignore links\n if (target.is('a') || target.parent().is('a')) {\n return true;\n }\n\n // Shortcut to any clicks within a cell\n // We don't want to handle these.\n if (target.hasClass(`${displayClassName}`) || target.hasClass(`${activeFieldClassName}`)) {\n debugLog('Skipping click on inner cell');\n return true;\n }\n\n // Locate the row from event\n const element = target.closest(this.SELECTOR);\n const wpId = element.data('workPackageId');\n const classIdentifier = element.data('classIdentifier');\n\n if (!wpId) {\n return true;\n }\n\n const [index, row] = view.workPackageTable.findRenderedRow(classIdentifier);\n\n // Update single selection if no modifier present\n if (!(evt.ctrlKey || evt.metaKey || evt.shiftKey)) {\n this.wpTableSelection.setSelection(wpId, index);\n view.itemClicked.emit({ workPackageId: wpId, double: false });\n }\n\n // Multiple selection if shift present\n if (evt.shiftKey) {\n this.wpTableSelection.setMultiSelectionFrom(view.workPackageTable.renderedRows, wpId, index);\n }\n\n // Single selection expansion if ctrl / cmd(mac)\n if (evt.ctrlKey || evt.metaKey) {\n this.wpTableSelection.toggleRow(wpId);\n }\n\n view.selectionChanged.emit(this.wpTableSelection.getSelectedWorkPackageIds());\n\n // The current row is the last selected work package\n // not matter what other rows are (de-)selected below.\n // Thus save that row for the details view button.\n this.wpTableFocus.updateFocus(wpId);\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { StateService } from '@uirouter/core';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { States } from 'core-app/core/states/states.service';\nimport { isClickedWithModifier } from 'core-app/shared/helpers/link-handling/link-handling';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { displayClassName } from 'core-app/shared/components/fields/display/display-field-renderer';\nimport { activeFieldClassName } from 'core-app/shared/components/fields/edit/edit-form/edit-form';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { TableEventComponent, TableEventHandler } from '../table-handler-registry';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { tdClassName } from '../../builders/cell-builder';\n\nexport class RowDoubleClickHandler implements TableEventHandler {\n // Injections\n @InjectField() public $state:StateService;\n\n @InjectField() public states:States;\n\n @InjectField() public wpTableSelection:WorkPackageViewSelectionService;\n\n @InjectField() public wpTableFocus:WorkPackageViewFocusService;\n\n constructor(public readonly injector:Injector) {\n }\n\n public get EVENT() {\n return 'dblclick.table.row';\n }\n\n public get SELECTOR() {\n return `.${tdClassName}`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tbody);\n }\n\n public handleEvent(view:TableEventComponent, evt:JQuery.TriggeredEvent) {\n const target = jQuery(evt.target);\n\n // Skip clicks with modifiers\n if (isClickedWithModifier(evt)) {\n return true;\n }\n\n // Shortcut to any clicks within a cell\n // We don't want to handle these.\n if (target.hasClass(`${displayClassName}`) || target.hasClass(`${activeFieldClassName}`)) {\n debugLog('Skipping click on inner cell');\n return true;\n }\n\n // Locate the row from event\n const element = target.closest(this.SELECTOR).closest(`.${tableRowClassName}`);\n const wpId = element.data('workPackageId');\n\n // Ignore links\n if (target.is('a') || target.parent().is('a')) {\n return true;\n }\n\n // Save the currently focused work package\n this.wpTableFocus.updateFocus(wpId);\n\n view.itemClicked.emit({ workPackageId: wpId, double: true });\n\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { rowGroupClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-classes.constants';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageViewCollapsedGroupsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-collapsed-groups.service';\nimport { TableEventComponent, TableEventHandler } from '../table-handler-registry';\n\nexport class GroupRowHandler implements TableEventHandler {\n // Injections\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n @InjectField() public workPackageViewCollapsedGroupsService:WorkPackageViewCollapsedGroupsService;\n\n constructor(public readonly injector:Injector) {\n }\n\n public get EVENT() {\n return 'click.table.groupheader';\n }\n\n public get SELECTOR() {\n return `.${rowGroupClassName} .expander`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tbody);\n }\n\n public handleEvent(view:TableEventComponent, evt:JQuery.TriggeredEvent) {\n evt.preventDefault();\n evt.stopPropagation();\n\n const groupHeader = jQuery(evt.target).parents(`.${rowGroupClassName}`);\n const groupIdentifier = groupHeader.data('groupIdentifier');\n\n this.workPackageViewCollapsedGroupsService.toggleGroupCollapseState(groupIdentifier);\n }\n}\n","import { Injector } from '@angular/core';\nimport { States } from 'core-app/core/states/states.service';\nimport { TableEventComponent, TableEventHandler } from 'core-app/features/work-packages/components/wp-fast-table/handlers/table-handler-registry';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { WorkPackageTable } from '../../wp-fast-table';\nimport { ClickOrEnterHandler } from '../click-or-enter-handler';\n\nexport class HierarchyClickHandler extends ClickOrEnterHandler implements TableEventHandler {\n // Injections\n @InjectField() public states:States;\n\n @InjectField() public wpTableHierarchies:WorkPackageViewHierarchiesService;\n\n constructor(public readonly injector:Injector) {\n super();\n }\n\n public get EVENT() {\n return 'click.table.hierarchy';\n }\n\n public get SELECTOR() {\n return `.wp-table--hierarchy-indicator`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tbody);\n }\n\n public processEvent(table:WorkPackageTable, evt:JQuery.TriggeredEvent):boolean {\n const target = jQuery(evt.target);\n\n // Locate the row from event\n const element = target.closest(`.${tableRowClassName}`);\n const wpId = element.data('workPackageId');\n\n this.wpTableHierarchies.toggle(wpId);\n\n evt.stopImmediatePropagation();\n evt.preventDefault();\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { StateService } from '@uirouter/core';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { KeepTabService } from '../../../wp-single-view-tabs/keep-tab/keep-tab.service';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { uiStateLinkClass } from '../../builders/ui-state-link-builder';\nimport { TableEventComponent, TableEventHandler } from '../table-handler-registry';\n\nexport class WorkPackageStateLinksHandler implements TableEventHandler {\n // Injections\n @InjectField() public $state:StateService;\n\n @InjectField() public keepTab:KeepTabService;\n\n @InjectField() public states:States;\n\n @InjectField() public wpTableSelection:WorkPackageViewSelectionService;\n\n @InjectField() public wpTableFocus:WorkPackageViewFocusService;\n\n constructor(public readonly injector:Injector) {\n }\n\n public get EVENT() {\n return 'click.table.wpLink';\n }\n\n public get SELECTOR() {\n return `.${uiStateLinkClass}`;\n }\n\n public eventScope(view:TableEventComponent) {\n return jQuery(view.workPackageTable.tableAndTimelineContainer);\n }\n\n protected workPackage:WorkPackageResource;\n\n public handleEvent(view:TableEventComponent, evt:JQuery.TriggeredEvent) {\n // Avoid the state capture when clicking with modifier\n if (evt.shiftKey || evt.ctrlKey || evt.metaKey || evt.altKey) {\n return true;\n }\n\n // Locate the details link from event\n const target = jQuery(evt.target);\n const element = target.closest(this.SELECTOR);\n const state = element.data('wpState');\n const workPackageId = element.data('workPackageId');\n\n // Blur the target to avoid focus being kept there\n target.closest('a').blur();\n\n // The current row is the last selected work package\n // not matter what other rows are (de-)selected below.\n // Thus save that row for the details view button.\n // Locate the row from event\n const row = target.closest(`.${tableRowClassName}`);\n const classIdentifier = row.data('classIdentifier');\n const [index, _] = view.workPackageTable.findRenderedRow(classIdentifier);\n\n // Update single selection if no modifier present\n this.wpTableSelection.setSelection(workPackageId, index);\n\n view.stateLinkClicked.emit({ workPackageId, requestedState: state });\n\n evt.preventDefault();\n evt.stopPropagation();\n return false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { takeUntil } from 'rxjs/operators';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport class ColumnsTransformer {\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n @InjectField() public wpTableColumns:WorkPackageViewColumnsService;\n\n constructor(public readonly injector:Injector,\n public table:WorkPackageTable) {\n this.wpTableColumns\n .updates$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n )\n .subscribe(() => {\n if (table.originalRows.length > 0) {\n const t0 = performance.now();\n // Redraw the table section, ignore timeline\n table.redrawTable();\n\n const t1 = performance.now();\n\n debugLog(`column redraw took ${t1 - t0} milliseconds.`);\n }\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { scrollTableRowIntoView } from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-row-helpers';\nimport {\n distinctUntilChanged, filter, map, takeUntil,\n} from 'rxjs/operators';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport {\n collapsedGroupClass,\n hierarchyGroupClass,\n hierarchyRootClass,\n} from 'core-app/features/work-packages/components/wp-fast-table/helpers/wp-table-hierarchy-helpers';\nimport { indicatorCollapsedClass } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/hierarchy/single-hierarchy-row-builder';\nimport { tableRowClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/rows/single-row-builder';\nimport { WorkPackageViewHierarchies } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-hierarchies';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class HierarchyTransformer {\n @InjectField() public wpTableHierarchies:WorkPackageViewHierarchiesService;\n\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n constructor(public readonly injector:Injector,\n table:WorkPackageTable) {\n this.wpTableHierarchies\n .updates$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n map((state) => state.isVisible),\n distinctUntilChanged(),\n )\n .subscribe(() => {\n // We don't have to reload all results when _disabling_ the hierarchy mode.\n if (!this.wpTableHierarchies.isEnabled) {\n table.redrawTableAndTimeline();\n }\n });\n\n let lastValue = this.wpTableHierarchies.isEnabled;\n\n this.wpTableHierarchies\n .updates$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n filter(() => this.querySpace.tableRendered.hasValue()),\n )\n .subscribe((state:WorkPackageViewHierarchies) => {\n if (state.isVisible === lastValue) {\n this.renderHierarchyState(state);\n }\n\n lastValue = state.isVisible;\n });\n }\n\n /**\n * Update all currently visible rows to match the selection state.\n */\n private renderHierarchyState(state:WorkPackageViewHierarchies) {\n const rendered = this.querySpace.tableRendered.value!;\n\n // Show all hierarchies\n jQuery('[class^=\"__hierarchy-group-\"]').removeClass((i:number, classNames:string):string => (classNames.match(/__collapsed-group-\\d+/g) || []).join(' '));\n\n // Mark which rows were hidden by some other hierarchy group\n // (e.g., by a collapsed parent)\n const collapsed:{ [index:number]:boolean } = {};\n\n // Hide all collapsed hierarchies\n _.each(state.collapsed, (isCollapsed:boolean, wpId:string) => {\n // Toggle the root style\n jQuery(`.${hierarchyRootClass(wpId)} .wp-table--hierarchy-indicator`).toggleClass(indicatorCollapsedClass, isCollapsed);\n\n // Get parent row and mark/unmark it as collapsed\n const hierarchyRoot = document.querySelector(`.wp-timeline-cell.__hierarchy-root-${wpId}`);\n\n if (hierarchyRoot) {\n if (isCollapsed) {\n hierarchyRoot.classList.add('__hierarchy-root-collapsed');\n } else {\n hierarchyRoot.classList.remove('__hierarchy-root-collapsed');\n }\n }\n\n // Get all affected children rows\n const affected = jQuery(`.${hierarchyGroupClass(wpId)}`);\n\n // Hide/Show the descendants.\n affected.toggleClass(collapsedGroupClass(wpId), isCollapsed);\n\n // Update the hidden section of the rendered state\n affected.filter(`.${tableRowClassName}`).each((i, el) => {\n // Get the index of this row\n const index = jQuery(el).index();\n\n // Update the hidden state\n if (!collapsed[index]) {\n rendered[index].hidden = isCollapsed;\n collapsed[index] = isCollapsed;\n }\n });\n });\n\n // Keep focused on the last element, if any.\n // Based on https://stackoverflow.com/a/3782959\n if (state.last) {\n scrollTableRowIntoView(state.last);\n }\n\n this.querySpace.tableRendered.putValue(rendered, 'Updated hidden state of rows after hierarchy change.');\n }\n}\n","import { Injector } from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { takeUntil } from 'rxjs/operators';\nimport { WorkPackageViewRelationColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-relation-columns.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport class RelationsTransformer {\n @InjectField() public wpTableRelationColumns:WorkPackageViewRelationColumnsService;\n\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n constructor(public readonly injector:Injector,\n table:WorkPackageTable) {\n this.wpTableRelationColumns\n .updates$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n )\n .subscribe(() => {\n table.redrawTableAndTimeline();\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewOrderService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport class RowsTransformer {\n @InjectField() querySpace:IsolatedQuerySpace;\n\n @InjectField() wpTableSortBy:WorkPackageViewSortByService;\n\n @InjectField() wpTableOrder:WorkPackageViewOrderService;\n\n @InjectField() states:States;\n\n constructor(public readonly injector:Injector,\n public table:WorkPackageTable) {\n // Redraw table if the current row state changed\n this.querySpace\n .initialized\n .values$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n )\n .subscribe(() => {\n let rows:WorkPackageResource[];\n\n if (this.wpTableSortBy.isManualSortingMode) {\n rows = this.wpTableOrder.orderedWorkPackages();\n } else {\n rows = this.querySpace.results.value!.elements;\n }\n\n table.initialSetup(rows);\n });\n\n // Refresh a single row if it exists\n this.states.workPackages.observeChange()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions.asObservable()),\n filter(() => {\n const rendered = this.querySpace.tableRendered.getValueOr([]);\n return rendered && rendered.length > 0;\n }),\n )\n .subscribe(([changedId, wp]) => {\n if (wp === undefined) {\n return;\n }\n\n this.table.refreshRows(wp);\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { takeUntil } from 'rxjs/operators';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { FocusHelperService } from 'core-app/shared/directives/focus/focus-helper';\nimport {\n WorkPackageViewSelectionService,\n WorkPackageViewSelectionState,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { tableRowClassName } from '../../builders/rows/single-row-builder';\nimport { checkedClassName } from '../../builders/ui-state-link-builder';\nimport { locateTableRow, scrollTableRowIntoView } from '../../helpers/wp-table-row-helpers';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport class SelectionTransformer {\n @InjectField() public wpTableSelection:WorkPackageViewSelectionService;\n\n @InjectField() public wpTableFocus:WorkPackageViewFocusService;\n\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n @InjectField() public FocusHelper:FocusHelperService;\n\n constructor(public readonly injector:Injector,\n public readonly table:WorkPackageTable) {\n // Focus a single selection when active\n this.querySpace.tableRendered.values$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n )\n .subscribe(() => {\n this.wpTableFocus.ifShouldFocus((wpId:string) => {\n const element = locateTableRow(wpId);\n if (element.length) {\n scrollTableRowIntoView(wpId);\n this.FocusHelper.focus(element[0]);\n }\n });\n });\n\n // Update selection state\n this.wpTableSelection.live$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n )\n .subscribe((state:WorkPackageViewSelectionState) => {\n this.renderSelectionState(state);\n });\n\n this.wpTableSelection.registerSelectAllListener(() => table.renderedRows);\n this.wpTableSelection.registerDeselectAllListener();\n }\n\n /**\n * Update all currently visible rows to match the selection state.\n */\n private renderSelectionState(state:WorkPackageViewSelectionState) {\n const context = jQuery(this.table.tableAndTimelineContainer);\n\n context.find(`.${tableRowClassName}.${checkedClassName}`).removeClass(checkedClassName);\n\n _.each(state.selected, (selected:boolean, workPackageId:any) => {\n context.find(`.${tableRowClassName}[data-work-package-id=\"${workPackageId}\"]`).toggleClass(checkedClassName, selected);\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { takeUntil } from 'rxjs/operators';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageTimelineState } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-timeline';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageTable } from '../../wp-fast-table';\n\nexport class TimelineTransformer {\n @InjectField() public querySpace:IsolatedQuerySpace;\n\n @InjectField() public wpTableTimeline:WorkPackageViewTimelineService;\n\n constructor(readonly injector:Injector,\n readonly table:WorkPackageTable) {\n this.wpTableTimeline\n .live$()\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n )\n .subscribe((state:WorkPackageTimelineState) => {\n this.renderVisibility(state.visible);\n });\n }\n\n /**\n * Update all currently visible rows to match the selection state.\n */\n private renderVisibility(visible:boolean) {\n const container = jQuery(this.table.tableAndTimelineContainer).parent();\n container.find('.work-packages-tabletimeline--timeline-side').toggle(visible);\n container.find('.work-packages-tabletimeline--table-side').toggleClass('-timeline-visible', visible);\n }\n}\n","import { Injector } from '@angular/core';\nimport { HighlightingTransformer } from 'core-app/features/work-packages/components/wp-fast-table/handlers/state/highlighting-transformer';\nimport { DragAndDropTransformer } from 'core-app/features/work-packages/components/wp-fast-table/handlers/state/drag-and-drop-transformer';\nimport {\n WorkPackageViewEventHandler, WorkPackageViewOutputs,\n WorkPackageViewHandlerRegistry,\n} from 'core-app/features/work-packages/routing/wp-view-base/event-handling/event-handler-registry';\nimport { GroupFoldTransformer } from 'core-app/features/work-packages/components/wp-fast-table/handlers/state/group-fold-transformer';\nimport { WorkPackageTable } from '../wp-fast-table';\nimport { EditCellHandler } from './cell/edit-cell-handler';\nimport { RelationsCellHandler } from './cell/relations-cell-handler';\nimport { ContextMenuClickHandler } from './context-menu/context-menu-click-handler';\nimport { ContextMenuKeyboardHandler } from './context-menu/context-menu-keyboard-handler';\nimport { ContextMenuRightClickHandler } from './context-menu/context-menu-rightclick-handler';\nimport { RowClickHandler } from './row/click-handler';\nimport { RowDoubleClickHandler } from './row/double-click-handler';\nimport { GroupRowHandler } from './row/group-row-handler';\nimport { HierarchyClickHandler } from './row/hierarchy-click-handler';\nimport { WorkPackageStateLinksHandler } from './row/wp-state-links-handler';\nimport { ColumnsTransformer } from './state/columns-transformer';\nimport { HierarchyTransformer } from './state/hierarchy-transformer';\nimport { RelationsTransformer } from './state/relations-transformer';\nimport { RowsTransformer } from './state/rows-transformer';\nimport { SelectionTransformer } from './state/selection-transformer';\nimport { TimelineTransformer } from './state/timeline-transformer';\n\ntype StateTransformers = {\n // noinspection JSUnusedLocalSymbols\n new(injector:Injector, table:WorkPackageTable):any;\n};\n\nexport interface TableEventComponent extends WorkPackageViewOutputs {\n // Reference to the fast table instance\n workPackageTable:WorkPackageTable;\n}\n\nexport type TableEventHandler = WorkPackageViewEventHandler;\n\nexport class TableHandlerRegistry extends WorkPackageViewHandlerRegistry {\n protected eventHandlers:((t:TableEventComponent) => TableEventHandler)[] = [\n // Hierarchy expansion/collapsing\n () => new HierarchyClickHandler(this.injector),\n // Clicking or pressing Enter on a single cell, editable or not\n () => new EditCellHandler(this.injector),\n // Clicking on the details view\n () => new WorkPackageStateLinksHandler(this.injector),\n // Clicking on the row (not within a cell)\n () => new RowClickHandler(this.injector),\n // Double Clicking on the cell within the row\n () => new RowDoubleClickHandler(this.injector),\n // Clicking on group headers\n () => new GroupRowHandler(this.injector),\n // Right clicking on rows\n () => new ContextMenuRightClickHandler(this.injector),\n // Left clicking on the dropdown icon\n () => new ContextMenuClickHandler(this.injector),\n // SHIFT+ALT+F10 on rows\n () => new ContextMenuKeyboardHandler(this.injector),\n // Clicking on relations cells\n () => new RelationsCellHandler(this.injector),\n ];\n\n protected readonly stateTransformers:StateTransformers[] = [\n SelectionTransformer,\n RowsTransformer,\n ColumnsTransformer,\n GroupFoldTransformer,\n TimelineTransformer,\n HierarchyTransformer,\n RelationsTransformer,\n HighlightingTransformer,\n DragAndDropTransformer,\n ];\n\n attachTo(viewRef:TableEventComponent) {\n this.stateTransformers.map((cls) => new cls(this.injector, viewRef.workPackageTable));\n\n super.attachTo(viewRef);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n// ++\n\nimport { UIRouterGlobals } from '@uirouter/core';\nimport {\n Component,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { WpTabDefinition } from 'core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/tab';\nimport { WorkPackageTabsService } from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-tabs.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\n@Component({\n templateUrl: './wp-tab-wrapper.html',\n selector: 'op-wp-tab',\n})\nexport class WpTabWrapperComponent implements OnInit {\n workPackage:WorkPackageResource;\n\n ndcDynamicInputs$:Observable<{\n workPackage:WorkPackageResource;\n tab:WpTabDefinition | undefined;\n }>;\n\n get workPackageId():string {\n const { workPackageId } = this.uiRouterGlobals.params as unknown as { workPackageId:string };\n return workPackageId;\n }\n\n constructor(readonly I18n:I18nService,\n readonly uiRouterGlobals:UIRouterGlobals,\n readonly apiV3Service:ApiV3Service,\n readonly wpTabsService:WorkPackageTabsService) {}\n\n ngOnInit() {\n this.ndcDynamicInputs$ = this\n .apiV3Service\n .work_packages\n .id(this.workPackageId)\n .requireAndStream()\n .pipe(\n map((wp) => ({\n workPackage: wp,\n tab: this.findTab(wp),\n })),\n );\n }\n\n findTab(workPackage:WorkPackageResource):WpTabDefinition | undefined {\n const { tabIdentifier } = this.uiRouterGlobals.params as unknown as { tabIdentifier:string };\n\n return this.wpTabsService.getTab(tabIdentifier, workPackage);\n }\n}\n","\n \n
  • \n \n \n \n
  • \n
  • \n \n \n \n
  • \n
    \n\n","import {\n ChangeDetectionStrategy, Component, Injector, Input, OnInit,\n} from '@angular/core';\nimport { KeepTabService } from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\nimport { StateService, UIRouterGlobals } from '@uirouter/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TabDefinition } from 'core-app/shared/components/tabs/tab.interface';\nimport { WorkPackageTabsService } from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-tabs.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\n@Component({\n selector: 'op-wp-tabs',\n templateUrl: './wp-tabs.component.html',\n styleUrls: ['./wp-tabs.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WpTabsComponent implements OnInit {\n @Input() workPackage:WorkPackageResource;\n\n @Input() view:'full'|'split';\n\n public tabs:TabDefinition[];\n\n public uiSrefBase:string;\n\n public canViewWatchers = false;\n\n text = {\n details: {\n close: this.I18n.t('js.button_close_details'),\n goToFullScreen: this.I18n.t('js.button_show_fullscreen'),\n },\n };\n\n constructor(\n readonly wpTabsService:WorkPackageTabsService,\n readonly I18n:I18nService,\n readonly injector:Injector,\n readonly $state:StateService,\n readonly uiRouterGlobals:UIRouterGlobals,\n readonly keepTab:KeepTabService,\n ) {\n }\n\n ngOnInit():void {\n this.uiSrefBase = this.view === 'split' ? '' : 'work-packages.show';\n this.canViewWatchers = !!(this.workPackage && this.workPackage.watchers);\n this.tabs = this.getDisplayableTabs();\n }\n\n private getDisplayableTabs() {\n return this\n .wpTabsService\n .getDisplayableTabs(this.workPackage)\n .map((tab) => ({\n ...tab,\n route: `${this.uiSrefBase}.tabs`,\n routeParams: { workPackageId: this.workPackage.id, tabIdentifier: tab.id },\n }));\n }\n\n public switchToFullscreen():void {\n this.keepTab.goCurrentShowState();\n }\n\n public close():void {\n this.$state.go(\n this.uiRouterGlobals.current.data.baseRoute,\n this.uiRouterGlobals.params,\n );\n }\n}\n","\n \n
    \n \n \n \n \n \n \n \n \n \n
    \n \n\n #{{relatedWorkPackage.id}}
    \n\n \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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\nimport { DeviceService } from 'core-app/core/browser/device.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 readonly deviceService:DeviceService,\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 && this.deviceService.isMobile) {\n scrollContainer.scrollIntoView(true);\n }\n }\n\n public toggleComments():void {\n this.onlyComments = !this.onlyComments;\n this.updateActivities(this.unfilteredActivities);\n\n if (this.onlyComments) {\n this.togglerText = this.text.showAll;\n } else {\n this.togglerText = this.text.commentsOnly;\n }\n }\n\n public info(activity:HalResource, index:number):ActivityEntryInfo {\n return this.wpActivity.info(this.unfilteredActivities, activity, index);\n }\n}\n","import { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport {\n ElementRef, Injector, OnInit, Directive,\n} from '@angular/core';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { Subject } from 'rxjs';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\n@Directive()\nexport abstract class WorkPackageCommentFieldHandler extends EditFieldHandler implements OnInit {\n public fieldName = 'comment';\n\n public handler = this;\n\n public active = false;\n\n public inEditMode = false;\n\n public inFlight = false;\n\n public change:WorkPackageChangeset;\n\n // Destroy events\n public onDestroy = new Subject();\n\n constructor(protected elementRef:ElementRef,\n protected injector:Injector) {\n super();\n }\n\n public ngOnInit() {\n this.change = new WorkPackageChangeset(this.workPackage);\n }\n\n /**\n * Handle saving the comment\n */\n public abstract handleUserSubmit():Promise;\n\n public abstract get workPackage():WorkPackageResource;\n\n public reset(withText = '') {\n if (withText.length > 0) {\n withText += '\\n';\n }\n\n this.change.setValue('comment', { raw: withText });\n }\n\n public get schema():IFieldSchema {\n return {\n name: I18n.t('js.label_comment'),\n writable: true,\n required: false,\n type: '_comment',\n hasDefault: false,\n };\n }\n\n public get rawComment() {\n return _.get(this.commentValue, 'raw', '');\n }\n\n public get commentValue() {\n return this.change.value<{ raw:string }>('comment');\n }\n\n public handleUserCancel() {\n this.deactivate(true);\n }\n\n public activate(withText?:string) {\n this.active = true;\n this.reset(withText);\n }\n\n deactivate(focus:boolean):void {\n this.active = false;\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n\n focus():void {\n const trigger = this.elementRef.nativeElement.querySelector('.inplace-editing--trigger-container');\n trigger && trigger.focus();\n }\n\n onFocusOut():void {\n }\n\n handleUserKeydown(event:JQuery.TriggeredEvent, onlyCancel?:boolean):void {\n }\n\n isChanged():boolean {\n return false;\n }\n\n stopPropagation(evt:JQuery.TriggeredEvent):boolean {\n return false;\n }\n}\n","
    \n
    \n\n \n\n \n
    \n \n \n \n \n \n \n\n \n \n
    \n
    \n
    \n\n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\nimport {\n filter,\n take,\n} from 'rxjs/operators';\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():void {\n super.ngOnInit();\n\n this.canAddComment = !!this.workPackage.addComment;\n this.showAbove = this.configurationService.commentsSortedInDescendingOrder();\n\n this.commentService.draft$\n .pipe(\n this.untilDestroyed(),\n take(1),\n filter((val) => !!val),\n )\n .subscribe((draft:string) => {\n this.activate(draft);\n });\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 public ngOnDestroy():void {\n super.ngOnDestroy();\n this.commentService.draft$.next(this.active ? this.rawComment : null);\n }\n\n // Open the field when its closed and relay drag & drop events to it.\n public startDragOverActivation(event:JQuery.TriggeredEvent):boolean {\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):void {\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):void {\n focus && this.focus();\n this.active = false;\n this.cdRef.detectChanges();\n }\n\n public async handleUserSubmit():Promise {\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","/**\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","","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 {{ 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\nimport { DeviceService } from 'core-app/core/browser/device.service';\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 private additionalScrollMargin = 200;\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 readonly deviceService:DeviceService,\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 if (this.deviceService.isMobile) {\n (this.elementRef.nativeElement as HTMLElement).scrollIntoView(true);\n return;\n }\n const activityElement = document.querySelectorAll(`[data-qa-activity-number='${this.activityNo}']`)[0] as HTMLElement;\n const scrollContainer = document.querySelectorAll(\"[data-notification-selector='notification-scroll-container']\")[0];\n const scrollOffset = activityElement.offsetTop - (scrollContainer as HTMLElement).offsetTop - this.additionalScrollMargin;\n scrollContainer.scrollTop = scrollOffset;\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\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 \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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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 \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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(\n 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { trackByProperty } from 'core-app/shared/helpers/angular/tracking-functions';\nimport { ActivityPanelBaseController } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-base.controller';\n\n@Component({\n templateUrl: './activity-tab.html',\n selector: 'wp-activity-tab',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageActivityTabComponent extends ActivityPanelBaseController {\n public workPackage:WorkPackageResource;\n\n public tabName = this.I18n.t('js.work_packages.tabs.activity');\n\n public trackByIdentifier = trackByProperty('identifier');\n\n ngOnInit() {\n const { workPackageId } = this.uiRouterGlobals.params as unknown as { workPackageId:string };\n this.workPackageId = workPackageId;\n super.ngOnInit();\n }\n}\n","\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n OnInit,\n} from '@angular/core';\nimport {\n combineLatest,\n Observable,\n} from 'rxjs';\nimport { 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 { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\n@Component({\n selector: 'op-files-tab',\n templateUrl: './op-files-tab.component.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 };\n\n showAttachmentHeader$:Observable;\n\n storages$:Observable;\n\n allowManageFileLinks$: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 ) { }\n\n ngOnInit():void {\n const project = this.workPackage.project as HalResource;\n if (project.id === null) {\n return;\n }\n\n const canViewFileLinks = this.currentUserService.hasCapabilities$('file_links/view', project.id);\n\n this.storages$ = this\n .storagesResourceService\n .collection(project.href as string);\n\n this.allowManageFileLinks$ = this\n .currentUserService\n .hasCapabilities$('file_links/manage', (this.workPackage.project as unknown&{ id:string }).id);\n\n this.showAttachmentHeader$ = combineLatest(\n [\n this.storages$,\n canViewFileLinks,\n ],\n ).pipe(\n map(([storages, viewPermission]) => storages.length > 0 && viewPermission),\n );\n }\n}\n","import { Injector } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { WorkPackageWatchersService } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watchers.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { map } from 'rxjs/operators';\n\nexport function workPackageWatchersCount(\n workPackage:WorkPackageResource,\n injector:Injector,\n):Observable {\n const watcherService = injector.get(WorkPackageWatchersService);\n return watcherService\n .requireAndStream(workPackage)\n .pipe(\n map((watchers:HalResource[]) => watchers.length),\n );\n}\n","import { Injector } from '@angular/core';\nimport { combineLatest, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\n\nexport function workPackageRelationsCount(\n workPackage:WorkPackageResource,\n injector:Injector,\n):Observable {\n const wpRelations = injector.get(WorkPackageRelationsService);\n const apiV3Service = injector.get(ApiV3Service);\n const wpId = workPackage.id!.toString();\n\n wpRelations.require(wpId);\n\n return combineLatest([\n wpRelations\n .state(wpId.toString())\n .values$(),\n apiV3Service\n .work_packages\n .id(wpId)\n .requireAndStream(),\n ])\n .pipe(\n map(([relations, workPackage]) => {\n const relationCount = _.size(relations);\n const childrenCount = _.size(workPackage.children);\n\n return relationCount + childrenCount;\n }),\n );\n}\n","import { Injector } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WpSingleViewService } from 'core-app/features/work-packages/routing/wp-view-base/state/wp-single-view.service';\n\nexport function workPackageNotificationsCount(\n workPackage:WorkPackageResource,\n injector:Injector,\n):Observable {\n const storeService = injector.get(WpSingleViewService);\n return storeService.nonDateAlertNotificationsCount$;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { from } from 'rxjs';\nimport { StateService } from '@uirouter/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WpTabDefinition } from 'core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/tab';\nimport {\n WorkPackageRelationsTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/relations-tab/relations-tab.component';\nimport {\n WorkPackageOverviewTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/overview-tab/overview-tab.component';\nimport {\n WorkPackageActivityTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-tab.component';\nimport {\n WorkPackageWatchersTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/watchers-tab.component';\nimport {\n WorkPackageFilesTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/files-tab/op-files-tab.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n workPackageWatchersCount,\n} from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-watchers-count.function';\nimport {\n workPackageRelationsCount,\n} from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-relations-count.function';\nimport {\n workPackageNotificationsCount,\n} from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-notifications-count.function';\nimport {\n workPackageFilesCount,\n} from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-files-count.function';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkPackageTabsService {\n private registeredTabs:WpTabDefinition[];\n\n constructor(\n private $state:StateService,\n private I18n:I18nService,\n private injector:Injector,\n ) {\n this.registeredTabs = this.buildDefaultTabs();\n }\n\n get tabs():WpTabDefinition[] {\n return [...this.registeredTabs];\n }\n\n register(...tabs:WpTabDefinition[]):void {\n this.registeredTabs = [\n ...this.registeredTabs,\n ...tabs,\n ];\n }\n\n patchTabCondition(id:string, displayable:(workPackage:WorkPackageResource, $state:StateService) => boolean):void {\n const tabDefinition = this.registeredTabs.find((tab) => tab.id === id);\n if (tabDefinition) {\n tabDefinition.displayable = displayable;\n }\n }\n\n getDisplayableTabs(workPackage:WorkPackageResource):WpTabDefinition[] {\n return this\n .tabs\n .filter(\n (tab) => !tab.displayable || tab.displayable(workPackage, this.$state),\n )\n .map(\n (tab) => ({\n ...tab,\n counter: tab.count\n ? (injector:Injector) => tab.count!(workPackage, injector || this.injector) // eslint-disable-line @typescript-eslint/no-non-null-assertion\n : (_:Injector) => from([0]),\n }),\n );\n }\n\n getTab(tabId:string, workPackage:WorkPackageResource):WpTabDefinition|undefined {\n return this.getDisplayableTabs(workPackage).find(({ id }) => id === tabId);\n }\n\n private buildDefaultTabs():WpTabDefinition[] {\n return [\n {\n component: WorkPackageOverviewTabComponent,\n name: this.I18n.t('js.work_packages.tabs.overview'),\n id: 'overview',\n displayable: (_, $state) => $state.includes('**.details.*'),\n },\n {\n id: 'activity',\n component: WorkPackageActivityTabComponent,\n name: I18n.t('js.work_packages.tabs.activity'),\n count: workPackageNotificationsCount,\n showCountAsBubble: true,\n },\n {\n id: 'files',\n component: WorkPackageFilesTabComponent,\n name: I18n.t('js.work_packages.tabs.files'),\n count: workPackageFilesCount,\n },\n {\n id: 'relations',\n component: WorkPackageRelationsTabComponent,\n name: I18n.t('js.work_packages.tabs.relations'),\n count: workPackageRelationsCount,\n },\n {\n id: 'watchers',\n component: WorkPackageWatchersTabComponent,\n name: I18n.t('js.work_packages.tabs.watchers'),\n displayable: (workPackage) => !!workPackage.watchers,\n count: workPackageWatchersCount,\n },\n ];\n }\n}\n","
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport class WorkPackageCellLabels {\n constructor(public readonly center:HTMLDivElement|null,\n public readonly left:HTMLDivElement,\n public readonly leftHover:HTMLDivElement|null,\n public readonly right:HTMLDivElement,\n public readonly rightHover:HTMLDivElement|null,\n public readonly farRight:HTMLDivElement,\n public readonly withAlternativeLabels?:boolean) {\n }\n}\n","import * as moment from 'moment';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { DisplayFieldRenderer } from 'core-app/shared/components/fields/display/display-field-renderer';\nimport { Injector } from '@angular/core';\nimport { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\nimport { HierarchyRenderPass } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/hierarchy/hierarchy-render-pass';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport { WorkPackageCellLabels } from './wp-timeline-cell-labels';\nimport {\n calculatePositionValueForDayCount,\n calculatePositionValueForDayCountingPx,\n RenderInfo,\n timelineBackgroundElementClass,\n timelineElementCssClass,\n timelineMarkerSelectionStartClass,\n} from '../wp-timeline';\nimport Moment = moment.Moment;\n\nexport interface CellDateMovement {\n // Target values to move work package to\n startDate?:moment.Moment;\n dueDate?:moment.Moment;\n // Target value to move milestone to\n date?:moment.Moment;\n}\n\nexport type LabelPosition = 'left'|'right'|'farRight';\nexport type MouseDirection = 'left'|'right'|'both'|'create'|'dragright';\n\nexport const classNameLeftLabel = 'labelLeft';\nexport const classNameRightContainer = 'containerRight';\nexport const classNameRightLabel = 'labelRight';\nexport const classNameLeftHoverLabel = 'labelHoverLeft';\nexport const classNameRightHoverLabel = 'labelHoverRight';\nexport const classNameHoverStyle = '-label-style';\nexport const classNameFarRightLabel = 'labelFarRight';\nexport const classNameShowOnHover = 'show-on-hover';\nexport const classNameHideOnHover = 'hide-on-hover';\nexport const classNameLeftHandle = 'leftHandle';\nexport const classNameRightHandle = 'rightHandle';\nexport const classNameBarLabel = 'bar-label';\n\nexport class TimelineCellRenderer {\n @InjectField() wpTableTimeline:WorkPackageViewTimelineService;\n\n @InjectField() weekdayService:WeekdayService;\n\n @InjectField() schemaCache:SchemaCacheService;\n\n @InjectField() I18n!:I18nService;\n\n public text = {\n label_children_derived_duration: this.I18n.t('js.label_children_derived_duration'),\n };\n\n public ganttChartRowHeight:number;\n\n public mouseDirection:MouseDirection;\n\n public fieldRenderer:DisplayFieldRenderer = new DisplayFieldRenderer(this.injector, 'timeline');\n\n protected mouseDownCursorType:string;\n\n constructor(readonly injector:Injector,\n readonly workPackageTimeline:WorkPackageTimelineTableController) {\n this.ganttChartRowHeight = +getComputedStyle(document.documentElement)\n .getPropertyValue('--table-timeline--row-height')\n .replace('px', '');\n }\n\n public get type():string {\n return 'bar';\n }\n\n public canMoveDates(wp:WorkPackageResource):boolean {\n const schema = this.schemaCache.of(wp);\n return schema.startDate.writable && schema.dueDate.writable && schema.isAttributeEditable('startDate');\n }\n\n public isEmpty(wp:WorkPackageResource) {\n const start = moment(wp.startDate as any);\n const due = moment(wp.dueDate as any);\n const noStartAndDueValues = _.isNaN(start.valueOf()) && _.isNaN(due.valueOf());\n return noStartAndDueValues;\n }\n\n public displayPlaceholderUnderCursor(ev:MouseEvent, renderInfo:RenderInfo):HTMLElement {\n const [dateUnderCursor, dayOffset] = this.cursorDateAndDayOffset(ev, renderInfo);\n const duration = this.displayDurationForDate(renderInfo, dateUnderCursor);\n const width = duration * renderInfo.viewParams.pixelPerDay || 30;\n\n const placeholder = document.createElement('div');\n placeholder.style.pointerEvents = 'none';\n placeholder.style.position = 'absolute';\n placeholder.style.height = '1em';\n placeholder.style.width = `${width}px`;\n placeholder.style.zIndex = '9999';\n placeholder.style.left = `${dayOffset * renderInfo.viewParams.pixelPerDay}px`;\n this.applyTypeColor(renderInfo, placeholder);\n\n return placeholder;\n }\n\n /**\n * Assign changed dates to the work package.\n * For generic work packages, assigns start and finish date.\n *\n */\n public assignDateValues(\n change:WorkPackageChangeset,\n labels:WorkPackageCellLabels,\n dates:CellDateMovement,\n ):void {\n this.assignDate(change, 'startDate', dates.startDate as moment.Moment);\n this.assignDate(change, 'dueDate', dates.dueDate as moment.Moment);\n\n this.updateLabels(true, labels, change);\n }\n\n /**\n * Handle movement by days of the work package to either (or both) edge(s)\n * depending on which initial date was set.\n */\n public onDaysMoved(change:WorkPackageChangeset,\n dayUnderCursor:Moment,\n delta:number,\n direction:MouseDirection):CellDateMovement {\n const initialStartDate = change.pristineResource.startDate;\n const initialDueDate = change.pristineResource.dueDate;\n\n const now = moment().format('YYYY-MM-DD');\n\n const startDate = moment(change.projectedResource.startDate);\n const dueDate = moment(change.projectedResource.dueDate);\n\n const dates:CellDateMovement = {};\n\n if (direction === 'left') {\n dates.startDate = moment(initialStartDate || initialDueDate).add(delta, 'days');\n } else if (direction === 'right') {\n // When no due date is present and the start date is in the past,\n // we assume the task hasn't finished yet, meaning the end date is not in the past.\n // To cover this case we have to choose the start date, only when it's in the future,\n // and choose now if the start date is in the past.\n const calculatedDueDate = initialDueDate || (now > initialStartDate ? now : initialStartDate);\n dates.dueDate = moment(calculatedDueDate).add(delta, 'days');\n } else if (direction === 'both') {\n if (initialStartDate) {\n dates.startDate = moment(initialStartDate).add(delta, 'days');\n }\n if (initialDueDate) {\n dates.dueDate = moment(initialDueDate).add(delta, 'days');\n }\n } else if (direction === 'dragright') {\n dates.dueDate = startDate.clone().add(delta, 'days');\n }\n\n // avoid negative \"overdrag\" if only start or due are changed\n if (direction !== 'both') {\n if (dates.startDate !== undefined && dates.startDate.isAfter(dueDate)) {\n dates.startDate = dueDate;\n } else if (dates.dueDate !== undefined && dates.dueDate.isBefore(startDate)) {\n dates.dueDate = startDate;\n }\n }\n\n return dates;\n }\n\n public onMouseDown(ev:MouseEvent,\n dateForCreate:string|null,\n renderInfo:RenderInfo,\n labels:WorkPackageCellLabels):MouseDirection {\n // check for active selection mode\n if (renderInfo.viewParams.activeSelectionMode) {\n renderInfo.viewParams.activeSelectionMode(renderInfo.workPackage);\n ev.preventDefault();\n this.mouseDirection = 'both';\n return 'both'; // irrelevant\n }\n\n const projection = renderInfo.change.projectedResource;\n let direction:Exclude;\n\n // Update the cursor and maybe set start/due values\n if (jQuery(ev.target!).hasClass(classNameLeftHandle)) {\n // only left\n direction = 'left';\n this.mouseDirection = 'left';\n this.mouseDownCursorType = 'col-resize';\n if (projection.startDate === null) {\n projection.startDate = projection.dueDate;\n }\n } else if (jQuery(ev.target!).hasClass(classNameRightHandle) || dateForCreate) {\n // only right\n direction = 'right';\n this.mouseDirection = 'right';\n this.mouseDownCursorType = 'col-resize';\n } else {\n // both\n direction = 'both';\n this.mouseDirection = 'both';\n this.mouseDownCursorType = 'ew-resize';\n }\n\n this.workPackageTimeline.forceCursor(this.mouseDownCursorType);\n\n if (dateForCreate) {\n const dateUnderCursor = this.cursorDateAndDayOffset(ev, renderInfo)[0];\n const duration = this.displayDurationForDate(renderInfo, dateUnderCursor) - 1;\n\n projection.startDate = dateForCreate;\n projection.dueDate = moment(dateForCreate).add(duration, 'days').format('YYYY-MM-DD');\n direction = 'dragright';\n this.mouseDirection = 'dragright';\n }\n\n this.updateLabels(true, labels, renderInfo.change);\n\n return direction;\n }\n\n public onMouseDownEnd(labels:WorkPackageCellLabels, change:WorkPackageChangeset) {\n // Reset the cursor set by onMouseDown\n this.mouseDownCursorType = '';\n this.workPackageTimeline.forceCursor(this.mouseDownCursorType);\n this.updateLabels(false, labels, change);\n }\n\n /**\n * @return true, if the element should still be displayed.\n * false, if the element must be removed from the timeline.\n */\n public update(element:HTMLDivElement, labels:WorkPackageCellLabels|null, renderInfo:RenderInfo):boolean {\n const { change } = renderInfo;\n const bar = element.querySelector(`.${timelineBackgroundElementClass}`) as HTMLElement;\n let start = moment(change.projectedResource.startDate);\n let due = moment(change.projectedResource.dueDate);\n\n if (_.isNaN(start.valueOf()) && _.isNaN(due.valueOf())) {\n element.style.visibility = 'hidden';\n } else {\n element.style.visibility = 'visible';\n }\n\n // only start date, fade out bar to the right\n if (_.isNaN(due.valueOf()) && !_.isNaN(start.valueOf())) {\n // Set due date to today\n due = moment();\n bar.style.backgroundImage = 'linear-gradient(90deg, rgba(255,255,255,0) 0%, #F1F1F1 100%)';\n }\n\n // only finish date, fade out bar to the left\n if (_.isNaN(start.valueOf()) && !_.isNaN(due.valueOf())) {\n start = due.clone();\n bar.style.backgroundImage = 'linear-gradient(90deg, #F1F1F1 0%, rgba(255,255,255,0) 80%)';\n }\n\n this.setElementPositionAndSize(element, renderInfo, start, due);\n\n // Update labels if any\n if (labels) {\n this.updateLabels(false, labels, change);\n }\n\n this.checkForActiveSelectionMode(renderInfo, bar);\n this.checkForSpecialDisplaySituations(renderInfo, bar);\n this.applyTypeColor(renderInfo, bar);\n\n return true;\n }\n\n public cursorDateAndDayOffset(ev:MouseEvent, renderInfo:RenderInfo):[Moment, number] {\n const dayOffset = Math.floor(ev.offsetX / renderInfo.viewParams.pixelPerDay);\n const dateUnderCursor = renderInfo.viewParams.dateDisplayStart.clone().add(dayOffset, 'days');\n return [dateUnderCursor, dayOffset];\n }\n\n protected checkForActiveSelectionMode(renderInfo:RenderInfo, element:HTMLElement) {\n if (renderInfo.viewParams.activeSelectionMode) {\n element.style.backgroundImage = ''; // required! unable to disable \"fade out bar\" with css\n\n if (renderInfo.viewParams.selectionModeStart === `${renderInfo.workPackage.id!}`) {\n jQuery(element).addClass(timelineMarkerSelectionStartClass);\n element.style.background = 'none';\n }\n }\n }\n\n /**\n * Takes the date under the cursor and the work package's duration.\n * It calculates the adjusted duration based on the number of NonWorkingDays\n * that fall in the range of the ( date .. date + duration ).\n * @param renderInfo\n * @param date where we start the duration calculation from\n * @return {number} the NonWorkingDays adjusted duration\n */\n\n protected displayDurationForDate(renderInfo:RenderInfo, date:Moment):number {\n const { workPackage } = renderInfo;\n let duration = Number(moment.duration(workPackage.duration || 'P1D').asDays().toFixed(0));\n\n if (workPackage.ignoreNonWorkingDays) {\n return duration;\n }\n\n const { dateDisplayEnd } = renderInfo.viewParams;\n let newDuration = 0;\n\n for (newDuration; newDuration < duration; newDuration++) {\n const currentDate = date.clone().add(newDuration, 'days');\n\n // Stop adding duration when we reach end of the visible table\n if (currentDate > dateDisplayEnd) {\n break;\n }\n // Extend the duration if the currentDate is non-working\n if (this.weekdayService.isNonWorkingDay(currentDate.toDate() || this.workPackageTimeline.isNonWorkingDay(currentDate.toDate()))) {\n duration += 1;\n }\n }\n return newDuration;\n }\n\n getMarginLeftOfLeftSide(renderInfo:RenderInfo):number {\n const projection = renderInfo.change.projectedResource;\n\n let start = moment(projection.startDate);\n const due = moment(projection.dueDate);\n start = _.isNaN(start.valueOf()) ? due.clone() : start;\n\n const offsetStart = start.diff(renderInfo.viewParams.dateDisplayStart, 'days');\n\n return calculatePositionValueForDayCountingPx(renderInfo.viewParams, offsetStart);\n }\n\n getMarginLeftOfRightSide(renderInfo:RenderInfo):number {\n const projection = renderInfo.change.projectedResource;\n\n let start = moment(projection.startDate);\n let due = moment(projection.dueDate);\n\n start = _.isNaN(start.valueOf()) ? due.clone() : start;\n due = _.isNaN(due.valueOf()) ? start.clone() : due;\n\n const offsetStart = start.diff(renderInfo.viewParams.dateDisplayStart, 'days');\n const duration = due.diff(start, 'days') + 1;\n\n return calculatePositionValueForDayCountingPx(renderInfo.viewParams, offsetStart + duration);\n }\n\n getPaddingLeftForIncomingRelationLines(renderInfo:RenderInfo):number {\n return renderInfo.viewParams.pixelPerDay / 8;\n }\n\n getPaddingRightForOutgoingRelationLines(renderInfo:RenderInfo):number {\n return 0;\n }\n\n /**\n * Render the generic cell element, a bar spanning from\n * start to finish date.\n */\n public render(renderInfo:RenderInfo):HTMLDivElement {\n const container = document.createElement('div');\n const bar = document.createElement('div');\n const left = document.createElement('div');\n const right = document.createElement('div');\n\n container.className = `${timelineElementCssClass} ${this.type}`;\n bar.className = timelineBackgroundElementClass;\n left.className = classNameLeftHandle;\n right.className = classNameRightHandle;\n container.appendChild(bar);\n container.appendChild(left);\n container.appendChild(right);\n\n return container;\n }\n\n createAndAddLabels(renderInfo:RenderInfo, element:HTMLElement):WorkPackageCellLabels {\n // create center label\n const labelCenter = document.createElement('div');\n labelCenter.classList.add(classNameBarLabel);\n this.applyTypeColor(renderInfo, labelCenter);\n element.appendChild(labelCenter);\n\n // create left label\n const labelLeft = document.createElement('div');\n labelLeft.classList.add(classNameLeftLabel, classNameHideOnHover);\n element.appendChild(labelLeft);\n\n // create right container\n const containerRight = document.createElement('div');\n containerRight.classList.add(classNameRightContainer);\n element.appendChild(containerRight);\n\n // create right label\n const labelRight = document.createElement('div');\n labelRight.classList.add(classNameRightLabel, classNameHideOnHover);\n containerRight.appendChild(labelRight);\n\n // create far right label\n const labelFarRight = document.createElement('div');\n labelFarRight.classList.add(classNameFarRightLabel, classNameHideOnHover);\n containerRight.appendChild(labelFarRight);\n\n // create left hover label\n const labelHoverLeft = document.createElement('div');\n labelHoverLeft.classList.add(classNameLeftHoverLabel, classNameShowOnHover, classNameHoverStyle);\n element.appendChild(labelHoverLeft);\n\n // create right hover label\n const labelHoverRight = document.createElement('div');\n labelHoverRight.classList.add(classNameRightHoverLabel, classNameShowOnHover, classNameHoverStyle);\n element.appendChild(labelHoverRight);\n\n const labels = new WorkPackageCellLabels(labelCenter, labelLeft, labelHoverLeft, labelRight, labelHoverRight, labelFarRight);\n this.updateLabels(false, labels, renderInfo.change);\n\n return labels;\n }\n\n protected applyTypeColor(renderInfo:RenderInfo, bg:HTMLElement):void {\n const wp = renderInfo.workPackage;\n const { type } = wp;\n const selectionMode = renderInfo.viewParams.activeSelectionMode;\n\n // Don't apply the class in selection mode\n const { id } = type;\n if (selectionMode) {\n bg.classList.remove(Highlighting.backgroundClass('type', id!));\n } else {\n bg.classList.add(Highlighting.backgroundClass('type', id!));\n }\n }\n\n protected assignDate(change:WorkPackageChangeset, attributeName:string, value:moment.Moment) {\n if (value) {\n change.projectedResource[attributeName] = value.format('YYYY-MM-DD');\n }\n }\n\n setElementPositionAndSize(element:HTMLElement, renderInfo:RenderInfo, start:moment.Moment, due:moment.Moment) {\n const { viewParams } = renderInfo;\n // offset left\n const offsetStart = start.diff(viewParams.dateDisplayStart, 'days');\n element.style.left = calculatePositionValueForDayCount(viewParams, offsetStart);\n\n // duration\n const duration = due.diff(start, 'days') + 1;\n element.style.width = calculatePositionValueForDayCount(viewParams, duration);\n\n // ensure minimum width\n if (!_.isNaN(start.valueOf()) || !_.isNaN(due.valueOf())) {\n const minWidth = _.max([renderInfo.viewParams.pixelPerDay, 2]);\n element.style.minWidth = `${minWidth}px`;\n }\n }\n\n cursorOrDatesAreNonWorking(evOrDates:MouseEvent|Moment[], renderInfo:RenderInfo, direction?:MouseDirection|null):boolean {\n if (renderInfo.workPackage.ignoreNonWorkingDays) {\n return false;\n }\n\n const dates = (evOrDates instanceof MouseEvent)\n ? [this.cursorDateAndDayOffset(evOrDates, renderInfo)[0]]\n : evOrDates;\n if (!renderInfo.workPackage.ignoreNonWorkingDays && direction === 'both'\n && (this.weekdayService.isNonWorkingDay(dates[dates.length - 1].toDate() || this.workPackageTimeline.isNonWorkingDay(dates[dates.length - 1].toDate())))) {\n return false;\n }\n return dates.some((date) => (this.weekdayService.isNonWorkingDay(date.toDate()) || this.workPackageTimeline.isNonWorkingDay(date.toDate())));\n }\n\n /**\n * Changes the presentation of the work package.\n *\n * Known cases:\n * 1. Display a clamp if this work package is a parent element\n * and display a box wrapping all the visible children when the\n * parent is hovered\n */\n checkForSpecialDisplaySituations(renderInfo:RenderInfo, bar:HTMLElement) {\n const wp = renderInfo.workPackage;\n const row = bar.parentElement!.parentElement!;\n const selectionMode = renderInfo.viewParams.activeSelectionMode;\n\n // Cannot edit the work package if it has children\n // and it is not on 'Manual scheduling' mode\n if (!wp.isLeaf && !selectionMode && !wp.scheduleManually) {\n bar.classList.add('-readonly');\n } else {\n bar.classList.remove('-readonly');\n }\n\n // Display the children's duration clamp\n if (wp.derivedStartDate && wp.derivedDueDate) {\n const derivedStartDate = moment(wp.derivedStartDate);\n const derivedDueDate = moment(wp.derivedDueDate);\n const startDate = moment(renderInfo.change.projectedResource.startDate);\n const dueDate = moment(renderInfo.change.projectedResource.dueDate);\n const previousChildrenDurationBar = row.querySelector('.children-duration-bar');\n const childrenDurationBar = document.createElement('div');\n const childrenDurationHoverContainer = document.createElement('div');\n const visibleChildren = document.querySelectorAll(`.wp-timeline-cell.__hierarchy-group-${wp.id}:not([class*='__collapsed-group'])`).length || 0;\n\n childrenDurationBar.classList.add('children-duration-bar', '-clamp-style');\n childrenDurationBar.title = this.text.label_children_derived_duration;\n childrenDurationHoverContainer.classList.add('children-duration-hover-container');\n childrenDurationHoverContainer.style.height = `${this.ganttChartRowHeight * visibleChildren + 10}px`;\n\n if (derivedStartDate.isBefore(startDate) || derivedDueDate.isAfter(dueDate)) {\n childrenDurationBar.classList.add('-duration-overflow');\n }\n\n this.setElementPositionAndSize(childrenDurationBar, renderInfo, derivedStartDate, derivedDueDate);\n\n if (previousChildrenDurationBar) {\n previousChildrenDurationBar.remove();\n }\n\n childrenDurationBar.appendChild(childrenDurationHoverContainer);\n row.appendChild(childrenDurationBar);\n }\n\n // Check for non-working days and display a not-allowed cursor\n // when the startDate, dueDate are non-working days\n const { startDate, dueDate } = renderInfo.change.projectedResource;\n const invalidDates = this.cursorOrDatesAreNonWorking([moment(startDate), moment(dueDate)], renderInfo, this.mouseDirection);\n\n if (invalidDates) {\n this.workPackageTimeline.forceCursor('not-allowed');\n } else {\n // Restore the previous cursor set by onMouseDown\n this.workPackageTimeline.forceCursor(this.mouseDownCursorType);\n }\n }\n\n protected updateLabels(activeDragNDrop:boolean,\n labels:WorkPackageCellLabels,\n change:WorkPackageChangeset) {\n const labelConfiguration = this.wpTableTimeline.getNormalizedLabels(change.projectedResource);\n\n if (!activeDragNDrop) {\n // normal display\n this.renderLabel(change, labels, 'left', labelConfiguration.left);\n this.renderLabel(change, labels, 'right', labelConfiguration.right);\n this.renderLabel(change, labels, 'farRight', labelConfiguration.farRight);\n }\n\n // Update hover labels\n this.renderHoverLabels(labels, change);\n }\n\n protected renderHoverLabels(labels:WorkPackageCellLabels, change:WorkPackageChangeset) {\n this.renderLabel(change, labels, 'leftHover', 'startDate');\n this.renderLabel(change, labels, 'rightHover', 'dueDate');\n }\n\n protected renderLabel(change:WorkPackageChangeset,\n labels:WorkPackageCellLabels,\n position:LabelPosition|'leftHover'|'rightHover',\n attribute:string|null) {\n // Get the label position\n // Skip label if it does not exist (milestones)\n const label = labels[position];\n if (!label) {\n return;\n }\n\n // Reset label value\n label.innerHTML = '';\n\n if (attribute === null) {\n label.classList.remove('not-empty');\n return;\n }\n\n // Get the rendered field\n const [field, span] = this.fieldRenderer.renderFieldValue(change.projectedResource, attribute, change);\n\n if (label && field && span) {\n span.classList.add('label-content');\n label.appendChild(span);\n label.classList.add('not-empty');\n } else if (label) {\n label.classList.remove('not-empty');\n }\n }\n\n protected isParentWithVisibleChildren(wp:WorkPackageResource):boolean {\n if (!this.workPackageTimeline.inHierarchyMode) {\n return false;\n }\n\n const renderPass = this.workPackageTimeline.workPackageTable.lastRenderPass as HierarchyRenderPass|null;\n if (renderPass) {\n return !!renderPass.parentsWithVisibleChildren[wp.id!];\n }\n\n return false;\n }\n}\n","import * as moment from 'moment';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport {\n calculatePositionValueForDayCountingPx,\n RenderInfo,\n timelineElementCssClass,\n} from '../wp-timeline';\n\nimport {\n classNameFarRightLabel,\n classNameHideOnHover,\n classNameHoverStyle,\n classNameLeftHoverLabel,\n classNameLeftLabel,\n classNameRightContainer,\n classNameRightHoverLabel,\n classNameRightLabel,\n classNameShowOnHover,\n CellDateMovement,\n LabelPosition,\n TimelineCellRenderer,\n MouseDirection,\n} from './timeline-cell-renderer';\nimport { WorkPackageCellLabels } from './wp-timeline-cell-labels';\nimport Moment = moment.Moment;\n\nexport class TimelineMilestoneCellRenderer extends TimelineCellRenderer {\n public get type():string {\n return 'milestone';\n }\n\n public isEmpty(wp:WorkPackageResource) {\n const date = moment(wp.date as any);\n return _.isNaN(date.valueOf());\n }\n\n public canMoveDates(wp:WorkPackageResource) {\n const schema = this.schemaCache.of(wp);\n return schema.date.writable && schema.isAttributeEditable('date');\n }\n\n public displayPlaceholderUnderCursor(ev:MouseEvent, renderInfo:RenderInfo):HTMLElement {\n const days = Math.floor(ev.offsetX / renderInfo.viewParams.pixelPerDay);\n\n const placeholder = document.createElement('div');\n placeholder.className = 'timeline-element milestone';\n placeholder.style.pointerEvents = 'none';\n placeholder.style.height = '1em';\n placeholder.style.width = '1em';\n placeholder.style.left = `${days * renderInfo.viewParams.pixelPerDay}px`;\n\n const diamond = document.createElement('div');\n diamond.className = 'diamond';\n diamond.style.left = '0.5em';\n diamond.style.height = '1em';\n diamond.style.width = '1em';\n placeholder.appendChild(diamond);\n\n this.applyTypeColor(renderInfo, diamond);\n\n return placeholder;\n }\n\n /**\n * Assign changed dates to the work package.\n * For generic work packages, assigns start and finish date .\n *\n */\n public assignDateValues(change:WorkPackageChangeset,\n labels:WorkPackageCellLabels,\n dates:any):void {\n this.assignDate(change, 'date', dates.date);\n this.updateLabels(true, labels, change);\n }\n\n /**\n * Handle movement by days of milestone.\n */\n public onDaysMoved(change:WorkPackageChangeset,\n dayUnderCursor:Moment,\n delta:number,\n _direction:MouseDirection):CellDateMovement {\n const initialDate = change.pristineResource.date;\n const dates:CellDateMovement = {};\n\n if (initialDate) {\n dates.date = moment(initialDate).add(delta, 'days');\n }\n\n return dates;\n }\n\n public onMouseDown(ev:MouseEvent,\n dateForCreate:string | null,\n renderInfo:RenderInfo,\n labels:WorkPackageCellLabels):MouseDirection {\n // check for active selection mode\n if (renderInfo.viewParams.activeSelectionMode) {\n renderInfo.viewParams.activeSelectionMode(renderInfo.workPackage);\n ev.preventDefault();\n return 'both'; // irrelevant\n }\n\n let direction:'both' | 'create' = 'both';\n this.workPackageTimeline.forceCursor('ew-resize');\n\n if (dateForCreate) {\n renderInfo.change.projectedResource.date = dateForCreate;\n direction = 'create';\n return direction;\n }\n\n this.updateLabels(true, labels, renderInfo.change);\n\n return direction;\n }\n\n public update(element:HTMLDivElement, labels:WorkPackageCellLabels|null, renderInfo:RenderInfo):boolean {\n const { viewParams } = renderInfo;\n const date = moment(renderInfo.change.projectedResource.date);\n\n // abort if no date\n if (_.isNaN(date.valueOf())) {\n return false;\n }\n\n const diamond = jQuery('.diamond', element)[0];\n\n diamond.style.width = `${15}px`;\n diamond.style.height = `${15}px`;\n diamond.style.width = `${15}px`;\n diamond.style.height = `${15}px`;\n diamond.style.marginLeft = `${-(15 / 2) + (renderInfo.viewParams.pixelPerDay / 2)}px`;\n this.applyTypeColor(renderInfo, diamond);\n\n // offset left\n const offsetStart = date.diff(viewParams.dateDisplayStart, 'days');\n element.style.left = `${calculatePositionValueForDayCountingPx(viewParams, offsetStart)}px`;\n\n // Update labels if any\n if (labels) {\n this.updateLabels(false, labels, renderInfo.change);\n }\n\n this.checkForActiveSelectionMode(renderInfo, diamond);\n\n return true;\n }\n\n getMarginLeftOfLeftSide(renderInfo:RenderInfo):number {\n const { change } = renderInfo;\n const start = moment(change.projectedResource.date);\n const offsetStart = start.diff(renderInfo.viewParams.dateDisplayStart, 'days');\n return calculatePositionValueForDayCountingPx(renderInfo.viewParams, offsetStart);\n }\n\n getMarginLeftOfRightSide(ri:RenderInfo):number {\n return this.getMarginLeftOfLeftSide(ri) + ri.viewParams.pixelPerDay;\n }\n\n getPaddingLeftForIncomingRelationLines(renderInfo:RenderInfo):number {\n return (renderInfo.viewParams.pixelPerDay / 2) - 1;\n }\n\n getPaddingRightForOutgoingRelationLines(renderInfo:RenderInfo):number {\n return (15 / 2);\n }\n\n /**\n * Render a milestone element, a single day event with no resize, but\n * move functionality.\n */\n public render(renderInfo:RenderInfo):HTMLDivElement {\n const element = document.createElement('div');\n element.className = `${timelineElementCssClass} ${this.type}`;\n\n const diamond = document.createElement('div');\n diamond.className = 'diamond';\n element.appendChild(diamond);\n\n return element;\n }\n\n createAndAddLabels(renderInfo:RenderInfo, element:HTMLElement):WorkPackageCellLabels {\n // create left label\n const labelLeft = document.createElement('div');\n labelLeft.classList.add(classNameLeftLabel, classNameHideOnHover);\n element.appendChild(labelLeft);\n\n // create right container\n const containerRight = document.createElement('div');\n containerRight.classList.add(classNameRightContainer);\n element.appendChild(containerRight);\n\n // create right label\n const labelRight = document.createElement('div');\n labelRight.classList.add(classNameRightLabel, classNameHideOnHover);\n containerRight.appendChild(labelRight);\n\n // create far right label\n const labelFarRight = document.createElement('div');\n labelFarRight.classList.add(classNameFarRightLabel, classNameHideOnHover);\n containerRight.appendChild(labelFarRight);\n\n // Create right hover label\n const labelHoverRight = document.createElement('div');\n labelHoverRight.classList.add(classNameRightHoverLabel, classNameShowOnHover, classNameHoverStyle);\n element.appendChild(labelHoverRight);\n\n // Create left hover label\n const labelHoverLeft = document.createElement('div');\n labelHoverLeft.classList.add(classNameLeftHoverLabel, classNameShowOnHover, classNameHoverStyle);\n element.appendChild(labelHoverLeft);\n\n const labels = new WorkPackageCellLabels(null, labelLeft, labelHoverLeft, labelRight, labelHoverRight, labelFarRight, renderInfo.withAlternativeLabels);\n this.updateLabels(false, labels, renderInfo.change);\n\n return labels;\n }\n\n protected renderHoverLabels(labels:WorkPackageCellLabels, change:WorkPackageChangeset) {\n if (labels.withAlternativeLabels) {\n this.renderLabel(change, labels, 'leftHover', 'date');\n this.renderLabel(change, labels, 'rightHover', 'subject');\n } else {\n this.renderLabel(change, labels, 'rightHover', 'date');\n }\n }\n\n protected updateLabels(activeDragNDrop:boolean,\n labels:WorkPackageCellLabels,\n change:WorkPackageChangeset) {\n const labelConfiguration = this.wpTableTimeline.getNormalizedLabels(change.projectedResource);\n\n if (!activeDragNDrop) {\n // normal display\n\n if (labels.withAlternativeLabels) {\n this.renderLabel(change, labels, 'right', 'subject');\n } else {\n // Show only one date field if left=start, right=dueDate\n if (labelConfiguration.left === 'startDate' && labelConfiguration.right === 'dueDate') {\n this.renderLabel(change, labels, 'left', null);\n this.renderLabel(change, labels, 'right', 'date');\n } else {\n this.renderLabel(change, labels, 'left', labelConfiguration.left);\n this.renderLabel(change, labels, 'right', labelConfiguration.right);\n }\n }\n\n this.renderLabel(change, labels, 'farRight', labelConfiguration.farRight);\n }\n\n // Update hover labels\n this.renderHoverLabels(labels, change);\n }\n\n protected renderLabel(change:WorkPackageChangeset,\n labels:WorkPackageCellLabels,\n position:LabelPosition|'leftHover'|'rightHover',\n attribute:string|null) {\n // Normalize attribute\n if (attribute === 'startDate' || attribute === 'dueDate') {\n attribute = 'date';\n }\n\n super.renderLabel(change, labels, position, attribute);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injector } from '@angular/core';\nimport * as moment from 'moment';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { KeyCodes } from 'core-app/shared/helpers/keyCodes.enum';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\n\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { take } from 'rxjs/operators';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WorkPackageCellLabels } from './wp-timeline-cell-labels';\nimport {\n MouseDirection,\n TimelineCellRenderer,\n} from './timeline-cell-renderer';\nimport { RenderInfo } from '../wp-timeline';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport Moment = moment.Moment;\n\nexport function registerWorkPackageMouseHandler(this:void,\n injector:Injector,\n getRenderInfo:() => RenderInfo,\n workPackageTimeline:WorkPackageTimelineTableController,\n halEditing:HalResourceEditingService,\n halEvents:HalEventsService,\n notificationService:WorkPackageNotificationService,\n loadingIndicator:LoadingIndicatorService,\n cell:HTMLElement,\n bar:HTMLDivElement,\n labels:WorkPackageCellLabels,\n renderer:TimelineCellRenderer,\n renderInfo:RenderInfo):void {\n let mouseDownStartDay:number|null = null; // also flag to signal active drag'n'drop\n renderInfo.change = halEditing.changeFor(renderInfo.workPackage);\n\n let placeholderForEmptyCell:HTMLElement;\n const jBody = jQuery('body');\n\n // handles change to existing work packages\n bar.onmousedown = (ev:MouseEvent) => {\n if (ev.which === 1) {\n // Left click only\n workPackageMouseDownFn(ev);\n }\n };\n\n // handles initial creation of start/due values\n cell.onmousemove = handleMouseMoveOnEmptyCell;\n\n function applyRendererMoveChanges(dayUnderCursor:Moment, days:number, direction:MouseDirection) {\n const moved = renderer.onDaysMoved(renderInfo.change, dayUnderCursor, days, direction);\n renderer.assignDateValues(renderInfo.change, labels, moved);\n renderer.update(bar, labels, renderInfo);\n }\n\n function getCursorOffsetInDaysFromLeft(ev:MouseEvent):number {\n const leftOffset = workPackageTimeline.getAbsoluteLeftCoordinates();\n const cursorOffsetLeftInPx = ev.clientX - leftOffset;\n return Math.floor(cursorOffsetLeftInPx / renderInfo.viewParams.pixelPerDay);\n }\n\n function workPackageMouseDownFn(ev:MouseEvent) {\n ev.preventDefault();\n\n // add/remove css class while drag'n'drop is active\n const classNameActiveDrag = 'active-drag';\n bar.classList.add(classNameActiveDrag);\n jBody.on('mouseup.timelinecell', () => bar.classList.remove(classNameActiveDrag));\n\n workPackageTimeline.disableViewParamsCalculation = true;\n mouseDownStartDay = getCursorOffsetInDaysFromLeft(ev);\n\n // If this wp is a parent element, changing it is not allowed\n // if it is not on 'Manual scheduling' mode\n // But adding a relation to it is.\n if (!renderInfo.workPackage.isLeaf && !renderInfo.viewParams.activeSelectionMode && !renderInfo.workPackage.scheduleManually) {\n return;\n }\n\n // Determine what attributes of the work package should be changed\n const direction = renderer.onMouseDown(ev, null, renderInfo, labels);\n\n jBody.on('mousemove.timelinecell', createMouseMoveFn(direction));\n jBody.on('keyup.timelinecell', keyPressFn);\n jBody.on('mouseup.timelinecell', () => deactivate(direction, false));\n }\n\n function createMouseMoveFn(direction:MouseDirection) {\n return (ev:JQuery.MouseMoveEvent) => {\n const days = getCursorOffsetInDaysFromLeft(ev.originalEvent as MouseEvent) - (mouseDownStartDay as number);\n const offsetDayCurrent = Math.floor(ev.offsetX / renderInfo.viewParams.pixelPerDay);\n const dayUnderCursor = renderInfo.viewParams.dateDisplayStart.clone().add(offsetDayCurrent, 'days');\n\n applyRendererMoveChanges(dayUnderCursor, days, direction);\n };\n }\n\n function keyPressFn(ev:JQuery.TriggeredEvent) {\n const kev:KeyboardEvent = ev.originalEvent as KeyboardEvent;\n if (kev.keyCode === KeyCodes.ESCAPE) {\n deactivate(null, true);\n }\n }\n\n function handleMouseMoveOnEmptyCell(ev:MouseEvent) {\n const wp = renderInfo.workPackage;\n\n if (!renderer.isEmpty(wp)) {\n return;\n }\n\n // placeholder logic\n placeholderForEmptyCell?.remove();\n placeholderForEmptyCell = renderer.displayPlaceholderUnderCursor(ev, renderInfo);\n\n const isEditable = (wp.isLeaf || wp.scheduleManually)\n && renderer.canMoveDates(wp)\n && !renderer.cursorOrDatesAreNonWorking(ev, renderInfo);\n\n if (!isEditable) {\n cell.style.cursor = 'not-allowed';\n return;\n }\n\n // display placeholder only if the timeline is editable\n cell.style.cursor = '';\n cell.appendChild(placeholderForEmptyCell);\n\n // abort if mouse leaves cell\n cell.onmouseleave = () => {\n placeholderForEmptyCell.remove();\n };\n\n // create logic\n cell.onmousedown = (evt) => {\n placeholderForEmptyCell.remove();\n\n evt.preventDefault();\n\n if (renderer.cursorOrDatesAreNonWorking(evt, renderInfo)) {\n return;\n }\n\n bar.style.pointerEvents = 'none';\n\n const [clickStart, offsetDayStart] = renderer.cursorDateAndDayOffset(evt, renderInfo);\n const dateForCreate = clickStart.format('YYYY-MM-DD');\n const direction = renderer.onMouseDown(evt, dateForCreate, renderInfo, labels);\n renderer.update(bar, labels, renderInfo);\n\n if (direction === 'create') {\n deactivate(direction, false);\n return;\n }\n\n jBody.on('mousemove.emptytimelinecell', mouseMoveOnEmptyCellFn(offsetDayStart, direction));\n jBody.on('mouseup.emptytimelinecell', () => deactivate(direction, false));\n\n cell.onmouseup = () => {\n deactivate(direction, false);\n };\n\n jBody.on('keyup.timelinecell', keyPressFn);\n };\n }\n\n function mouseMoveOnEmptyCellFn(offsetDayStart:number, mouseDownType:MouseDirection) {\n return (ev:JQuery.MouseMoveEvent) => {\n placeholderForEmptyCell.remove();\n const relativePosition = Math.abs(cell.getBoundingClientRect().x - ev.clientX);\n const offsetDayCurrent = Math.floor(relativePosition / renderInfo.viewParams.pixelPerDay);\n const dayUnderCursor = renderInfo.viewParams.dateDisplayStart.clone().add(offsetDayCurrent, 'days');\n const widthInDays = offsetDayCurrent - offsetDayStart;\n\n applyRendererMoveChanges(dayUnderCursor, widthInDays, mouseDownType);\n };\n }\n\n function deactivate(direction:MouseDirection|null, cancelled:boolean) {\n const change = renderInfo.change;\n workPackageTimeline.disableViewParamsCalculation = false;\n\n cell.onmousemove = handleMouseMoveOnEmptyCell;\n cell.onmousedown = () => undefined;\n cell.onmouseleave = () => undefined;\n cell.onmouseup = () => undefined;\n\n bar.style.pointerEvents = 'auto';\n\n jBody.off('.timelinecell');\n jBody.off('.emptytimelinecell');\n workPackageTimeline.resetCursor();\n mouseDownStartDay = null;\n\n // Cancel changes if the startDate or dueDate are not allowed\n const { startDate, dueDate } = change.projectedResource;\n const invalidDates = renderer.cursorOrDatesAreNonWorking([moment(startDate), moment(dueDate)], renderInfo, direction);\n\n if (cancelled || change.isEmpty() || invalidDates) {\n cancelChange();\n return;\n }\n\n // Remove due date from sending if we moved the work package as is\n // and duration was set\n const duration = change.pristineResource.duration as string|null;\n if (direction === 'both' && duration) {\n change.clearValue('dueDate');\n change.setValue('duration', duration);\n }\n\n // Persist the changes\n saveWorkPackage(renderInfo.change)\n .then(() => {\n renderInfo.change.clear();\n renderer.onMouseDownEnd(labels, renderInfo.change);\n })\n .catch((error) => {\n notificationService.handleRawError(error, renderInfo.workPackage);\n cancelChange();\n });\n }\n\n function cancelChange() {\n renderInfo.change.clear();\n renderer.update(bar, labels, renderInfo);\n renderer.onMouseDownEnd(labels, renderInfo.change);\n workPackageTimeline.refreshView();\n }\n\n function saveWorkPackage(change:WorkPackageChangeset) {\n const apiv3Service:ApiV3Service = injector.get(ApiV3Service);\n const querySpace:IsolatedQuerySpace = injector.get(IsolatedQuerySpace);\n\n // Remember the time before saving the work package to know which work packages to update\n const updatedAt = moment().toISOString();\n\n return (loadingIndicator.table.promise = halEditing\n .save(change)\n .then((result) => {\n notificationService.showSave(result.resource);\n const ids = _.map(querySpace.tableRendered.value, (row) => row.workPackageId);\n return apiv3Service\n .work_packages\n .filterUpdatedSince(ids, updatedAt)\n .get()\n .toPromise()\n .then(() => {\n halEvents.push(result.resource, { eventType: 'updated' });\n return querySpace.timelineRendered.pipe(take(1)).toPromise();\n });\n }));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { Injector } from '@angular/core';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\n\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { registerWorkPackageMouseHandler } from './wp-timeline-cell-mouse-handler';\nimport { TimelineMilestoneCellRenderer } from './timeline-milestone-cell-renderer';\nimport { TimelineCellRenderer } from './timeline-cell-renderer';\nimport { WorkPackageCellLabels } from './wp-timeline-cell-labels';\nimport { RenderInfo } from '../wp-timeline';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\n\nexport class WorkPackageTimelineCell {\n @InjectField() halEditing:HalResourceEditingService;\n\n @InjectField() halEvents:HalEventsService;\n\n @InjectField() notificationService:WorkPackageNotificationService;\n\n @InjectField() states:States;\n\n @InjectField() loadingIndicator:LoadingIndicatorService;\n\n @InjectField() schemaCache:SchemaCacheService;\n\n private wpElement:HTMLDivElement|null = null;\n\n private elementShape:string;\n\n private labels:WorkPackageCellLabels;\n\n constructor(public readonly injector:Injector,\n public workPackageTimeline:WorkPackageTimelineTableController,\n public renderers:{ milestone:TimelineMilestoneCellRenderer, generic:TimelineCellRenderer },\n public latestRenderInfo:RenderInfo,\n public classIdentifier:string,\n public workPackageId:string) {\n }\n\n getMarginLeftOfLeftSide():number {\n const renderer = this.cellRenderer(this.latestRenderInfo.workPackage);\n return renderer.getMarginLeftOfLeftSide(this.latestRenderInfo);\n }\n\n getMarginLeftOfRightSide():number {\n const renderer = this.cellRenderer(this.latestRenderInfo.workPackage);\n return renderer.getMarginLeftOfRightSide(this.latestRenderInfo);\n }\n\n getPaddingLeftForIncomingRelationLines():number {\n const renderer = this.cellRenderer(this.latestRenderInfo.workPackage);\n return renderer.getPaddingLeftForIncomingRelationLines(this.latestRenderInfo);\n }\n\n getPaddingRightForOutgoingRelationLines():number {\n const renderer = this.cellRenderer(this.latestRenderInfo.workPackage);\n return renderer.getPaddingRightForOutgoingRelationLines(this.latestRenderInfo);\n }\n\n canConnectRelations():boolean {\n const wp = this.latestRenderInfo.workPackage;\n if (this.schemaCache.of(wp).isMilestone) {\n return !_.isNil(wp.date);\n }\n\n return !_.isNil(wp.startDate) || !_.isNil(wp.dueDate);\n }\n\n public clear() {\n this.cellElement.html('');\n this.wpElement = null;\n }\n\n private get cellContainer() {\n return this.workPackageTimeline.timelineBody;\n }\n\n private get cellElement():JQuery {\n return this.cellContainer.find(`.${this.classIdentifier}`);\n }\n\n private lazyInit(renderer:TimelineCellRenderer, renderInfo:RenderInfo):Promise {\n const body = this.workPackageTimeline.timelineBody[0];\n const cell = this.cellElement;\n\n if (!cell.length) {\n return Promise.reject('uninitialized');\n }\n\n const wasRendered = this.wpElement !== null && body.contains(this.wpElement);\n\n // If already rendered with correct shape, ignore\n if (wasRendered && this.elementShape === renderer.type) {\n return Promise.resolve();\n }\n\n // Remove the element first if we're redrawing\n if (!renderInfo.isDuplicatedCell) {\n this.clear();\n }\n\n // Render the given element\n this.wpElement = renderer.render(renderInfo);\n this.labels = renderer.createAndAddLabels(renderInfo, this.wpElement);\n this.elementShape = renderer.type;\n\n // Register the element\n cell.append(this.wpElement);\n\n // Allow editing if editable\n if (renderer.canMoveDates(renderInfo.workPackage)) {\n this.wpElement.classList.add('-editable');\n\n registerWorkPackageMouseHandler(\n this.injector,\n () => this.latestRenderInfo,\n this.workPackageTimeline,\n this.halEditing,\n this.halEvents,\n this.notificationService,\n this.loadingIndicator,\n cell[0],\n this.wpElement,\n this.labels,\n renderer,\n renderInfo,\n );\n }\n\n return Promise.resolve();\n }\n\n private cellRenderer(workPackage:WorkPackageResource):TimelineCellRenderer {\n if (this.schemaCache.of(workPackage).isMilestone) {\n return this.renderers.milestone;\n }\n\n return this.renderers.generic;\n }\n\n public refreshView(renderInfo:RenderInfo) {\n this.latestRenderInfo = renderInfo;\n\n const renderer = this.cellRenderer(renderInfo.workPackage);\n\n // Render initial element if necessary\n this.lazyInit(renderer, renderInfo)\n .then(() => {\n // Render the upgrade from renderInfo\n const shouldBeDisplayed = renderer.update(\n this.wpElement as HTMLDivElement,\n this.labels,\n renderInfo,\n );\n\n if (!shouldBeDisplayed) {\n this.clear();\n }\n })\n .catch(() => null);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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, take } 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';\nimport * as Mousetrap from 'mousetrap';\nimport { DayResourceService } from 'core-app/core/state/days/day.service';\nimport { IDay } from 'core-app/core/state/days/day.model';\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 private daysService:DayResourceService,\n ) {\n super();\n }\n\n ngAfterViewInit() {\n this.$element = jQuery(this.elementRef.nativeElement);\n\n const scrollBar = document.querySelector('.work-packages-tabletimeline--timeline-side');\n if (scrollBar) {\n scrollBar.addEventListener('scroll', () => {\n this.requireNonWorkingDays(this.getFirstDayInViewport().format('YYYY-MM-DD'), this.getLastDayInViewport().format('YYYY-MM-DD'));\n });\n }\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 public nonWorkingDays:IDay[] = [];\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', async () => {\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 await this.requireNonWorkingDays(this.getFirstDayInViewport().format('YYYY-MM-DD'), this.getLastDayInViewport().format('YYYY-MM-DD'));\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 async requireNonWorkingDays(start:Date|string, end:Date|string) {\n this.nonWorkingDays = await this\n .daysService\n .requireNonWorkingYears$(start, end)\n .pipe(take(1))\n .toPromise();\n }\n\n isNonWorkingDay(date:Date|string):boolean {\n const formatted = moment(date).format('YYYY-MM-DD');\n return (this.nonWorkingDays.findIndex((el) => el.date === formatted) !== -1);\n }\n\n private calculateViewParams(currentParams:TimelineViewParameters):boolean {\n if (this.disableViewParamsCalculation) {\n return false;\n }\n\n const newParams = new TimelineViewParameters();\n let changed = false;\n const workPackagesToCalculateTimelineWidthFrom = this.getWorkPackagesToCalculateTimelineWidthFrom();\n\n workPackagesToCalculateTimelineWidthFrom.forEach((renderedRow) => {\n const wpId = renderedRow.workPackageId;\n\n if (!wpId) {\n return;\n }\n const workPackageState:InputState = this.states.workPackages.get(wpId);\n const workPackage:WorkPackageResource|undefined = workPackageState.value;\n\n if (!workPackage) {\n return;\n }\n\n // We may still have a reference to a row that, e.g., just got deleted\n const startDate = workPackage.startDate ? moment(workPackage.startDate) : currentParams.now;\n const dueDate = workPackage.dueDate ? moment(workPackage.dueDate) : currentParams.now;\n const date = workPackage.date ? moment(workPackage.date) : currentParams.now;\n\n // start date\n newParams.dateDisplayStart = moment.min(\n newParams.dateDisplayStart,\n currentParams.now,\n startDate,\n date,\n ).clone(); // clone because currentParams.now should not be changed\n\n // finish date\n newParams.dateDisplayEnd = moment.max(\n newParams.dateDisplayEnd,\n currentParams.now,\n dueDate,\n date,\n ).clone(); // clone because currentParams.now should not be changed\n });\n\n // left spacing\n newParams.dateDisplayStart.subtract(currentParams.dayCountForMarginLeft, 'days'); // .substract modifies its instance\n\n // right spacing\n // RR: kept both variants for documentation purpose.\n // A: calculate the minimal width based on the width of the timeline view\n // B: calculate the minimal width based on the window width\n const width = this.$element.children().width()!; // A\n // const width = jQuery('body').width(); // B\n\n const { pixelPerDay } = currentParams;\n const visibleDays = Math.ceil((width / pixelPerDay) * 1.5);\n newParams.dateDisplayEnd.add(visibleDays, 'days'); // .add modifies its instance\n\n // Check if view params changed:\n\n // start date\n if (!newParams.dateDisplayStart.isSame(this._viewParameters.dateDisplayStart)) {\n changed = true;\n this._viewParameters.dateDisplayStart = newParams.dateDisplayStart;\n }\n\n // end date\n if (!newParams.dateDisplayEnd.isSame(this._viewParameters.dateDisplayEnd)) {\n changed = true;\n this._viewParameters.dateDisplayEnd = newParams.dateDisplayEnd;\n }\n\n // Calculate the visible viewport\n const firstDayInViewport = this.getFirstDayInViewport();\n const lastDayInViewport = this.getLastDayInViewport();\n const viewport:[Moment, Moment] = [firstDayInViewport, lastDayInViewport];\n this._viewParameters.visibleViewportAtCalculationTime = viewport;\n\n return changed;\n }\n\n private applyAutoZoomLevel() {\n if (this.workPackageIdOrder.length === 0) {\n return;\n }\n\n const workPackagesToCalculateWidthFrom = this.getWorkPackagesToCalculateTimelineWidthFrom();\n const daysSpan = calculateDaySpan(workPackagesToCalculateWidthFrom, this.states.workPackages, this._viewParameters);\n const timelineWidthInPx = this.$element.parent().width()! - (2 * requiredPixelMarginLeft);\n\n for (const zoomLevel of zoomLevelOrder) {\n const pixelPerDay = getPixelPerDayForZoomLevel(zoomLevel);\n const visibleDays = timelineWidthInPx / pixelPerDay;\n\n if (visibleDays >= daysSpan || zoomLevel === _.last(zoomLevelOrder)) {\n // Zoom level is enough\n const previousZoomLevel = this._viewParameters.settings.zoomLevel;\n\n // did the zoom level changed?\n if (previousZoomLevel !== zoomLevel) {\n this._viewParameters.settings.zoomLevel = zoomLevel;\n this.wpTableComponent.timeline.scrollLeft = 0;\n }\n\n this.wpTableTimeline.appliedZoomLevel = zoomLevel;\n return;\n }\n }\n }\n\n setupManageCollapsedGroupHeaderCells() {\n this.workPackageViewCollapsedGroupsService.updates$()\n .pipe(\n this.commonPipes,\n )\n .subscribe((groupsCollapseEvent:IGroupsCollapseEvent) => {\n this.manageCollapsedGroupHeaderCells(\n groupsCollapseEvent,\n this.querySpace.results.value!.elements,\n this.collapsedGroupsCellsMap,\n );\n });\n }\n\n manageCollapsedGroupHeaderCells(groupsCollapseConfig:IGroupsCollapseEvent,\n tableWorkPackages:WorkPackageResource[],\n collapsedGroupsCellsMap:IGroupCellsMap) {\n const refreshAllGroupHeaderCells = groupsCollapseConfig.allGroupsChanged;\n const collapsedGroupsChange = groupsCollapseConfig.state;\n const collapsedGroupsChangeArray = Object.keys(collapsedGroupsChange);\n let groupsToUpdate:string[] = [];\n\n if (!collapsedGroupsChangeArray.length) {\n return;\n }\n\n if (refreshAllGroupHeaderCells) {\n groupsToUpdate = collapsedGroupsChangeArray.filter((groupIdentifier) => this.shouldManageCollapsedGroupHeaderCells(groupIdentifier, groupsCollapseConfig));\n } else {\n const groupIdentifier = groupsCollapseConfig.lastChangedGroup!;\n if (this.shouldManageCollapsedGroupHeaderCells(groupIdentifier, groupsCollapseConfig)) {\n groupsToUpdate = [groupIdentifier];\n }\n }\n\n groupsToUpdate.forEach((groupIdentifier) => {\n const groupIsCollapsed = collapsedGroupsChange[groupIdentifier];\n\n if (groupIsCollapsed) {\n this.createCollapsedGroupHeaderCells(groupIdentifier, tableWorkPackages, collapsedGroupsCellsMap);\n } else {\n this.removeCollapsedGroupHeaderCells(groupIdentifier, collapsedGroupsCellsMap);\n }\n });\n }\n\n shouldManageCollapsedGroupHeaderCells(groupIdentifier:string, groupsCollapseConfig:IGroupsCollapseEvent) {\n const keyGroupType = groupTypeFromIdentifier(groupIdentifier);\n\n return this.workPackageViewCollapsedGroupsService.groupTypesWithHeaderCellsWhenCollapsed.includes(keyGroupType)\n && this.workPackageViewCollapsedGroupsService.groupTypesWithHeaderCellsWhenCollapsed.includes(groupsCollapseConfig.groupedBy!);\n }\n\n createCollapsedGroupHeaderCells(groupIdentifier:string, tableWorkPackages:WorkPackageResource[], collapsedGroupsCellsMap:IGroupCellsMap) {\n this.removeCollapsedGroupHeaderCells(groupIdentifier, collapsedGroupsCellsMap);\n\n const changedGroupId = groupIdFromIdentifier(groupIdentifier);\n const changedGroupType = groupTypeFromIdentifier(groupIdentifier);\n const changedGroupTableWorkPackages = tableWorkPackages.filter((tableWorkPackage) => tableWorkPackage[changedGroupType].id === changedGroupId);\n const changedGroupWpsWithHeaderCells = changedGroupTableWorkPackages.filter((tableWorkPackage) => this.shouldBeShownInCollapsedGroupHeaders(tableWorkPackage)\n && (tableWorkPackage.date || tableWorkPackage.startDate));\n const changedGroupWpsWithHeaderCellsIds = changedGroupWpsWithHeaderCells.map((workPackage) => workPackage.id!);\n\n this.collapsedGroupsCellsMap[groupIdentifier] = this.cellsRenderer.buildCellsAndRenderOnRow(changedGroupWpsWithHeaderCellsIds, `group-${groupIdentifier}-timeline`, true);\n }\n\n removeCollapsedGroupHeaderCells(groupIdentifier:string, collapsedGroupsCellsMap:IGroupCellsMap) {\n if (collapsedGroupsCellsMap[groupIdentifier]) {\n collapsedGroupsCellsMap[groupIdentifier].forEach((cell:WorkPackageTimelineCell) => cell.clear());\n collapsedGroupsCellsMap[groupIdentifier] = [];\n }\n }\n\n refreshCollapsedGroupsHeaderCells(collapsedGroupsCellsMap:IGroupCellsMap, cellsRenderer:WorkPackageTimelineCellsRenderer) {\n Object.keys(collapsedGroupsCellsMap).forEach((collapsedGroupKey) => {\n const collapsedGroupCells = collapsedGroupsCellsMap[collapsedGroupKey];\n\n collapsedGroupCells.forEach((cell) => cellsRenderer.refreshSingleCell(cell, false, true));\n });\n }\n\n shouldBeShownInCollapsedGroupHeaders(workPackage:WorkPackageResource) {\n return this.workPackageViewCollapsedGroupsService\n .wpTypesToShowInCollapsedGroupHeaders\n .some((wpTypeFunction) => wpTypeFunction(workPackage));\n }\n\n getWorkPackagesToCalculateTimelineWidthFrom() {\n // Include work packages that are show in collapsed group\n // headers into the calculation, if not they could be rendered out\n // of the timeline (ie: milestones are shown on collapsed row groups).\n return [...this.workPackageIdOrder, ...this.workPackagesWithGroupHeaderCell];\n }\n}\n","
    \n
    \n \n \n \n \n
    \n
    \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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 if (this.weekdaysService.isNonWorkingDay(day) || this.wpTimeline.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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component,\n Inject,\n Input,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { OpUnlinkTableAction } from 'core-app/features/work-packages/components/wp-table/table-actions/actions/unlink-table-action';\nimport { OpTableActionFactory } from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { WorkPackageRelationQueryBase } from 'core-app/features/work-packages/components/wp-relations/embedded/wp-relation-query.base';\nimport { WpRelationInlineCreateService } from 'core-app/features/work-packages/components/wp-relations/embedded/relations/wp-relation-inline-create.service';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { filter } from 'rxjs/operators';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { GroupDescriptor } from 'core-app/features/work-packages/components/wp-single-view/wp-single-view.component';\n\n@Component({\n selector: 'wp-relation-query',\n templateUrl: '../wp-relation-query.html',\n providers: [\n { provide: WorkPackageInlineCreateService, useClass: WpRelationInlineCreateService },\n ],\n})\nexport class WorkPackageRelationQueryComponent extends WorkPackageRelationQueryBase implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public query:QueryResource;\n\n @Input() public group:GroupDescriptor;\n\n public tableActions:OpTableActionFactory[] = [\n OpUnlinkTableAction.factoryFor(\n 'remove-relation-action',\n this.I18n.t('js.relation_buttons.remove'),\n (relatedTo:WorkPackageResource) => {\n if (!this.embeddedTable) {\n return;\n }\n\n this.embeddedTable.loadingIndicator = this.wpRelations.require(relatedTo.id!)\n .then(() => this.wpInlineCreate.remove(this.workPackage, relatedTo))\n .then(() => this.refreshTable())\n .catch((error) => this.notificationService.handleRawError(error, this.workPackage));\n },\n (child:WorkPackageResource) => !!child.changeParent,\n ),\n ];\n\n public idFromLink = idFromLink;\n\n constructor(protected readonly PathHelper:PathHelperService,\n @Inject(WorkPackageInlineCreateService) protected readonly wpInlineCreate:WpRelationInlineCreateService,\n protected readonly wpRelations:WorkPackageRelationsService,\n protected readonly halEvents:HalEventsService,\n protected readonly queryUrlParamsHelper:UrlParamsHelperService,\n protected readonly notificationService:WorkPackageNotificationService,\n protected readonly I18n:I18nService) {\n super(queryUrlParamsHelper);\n }\n\n ngOnInit() {\n const relationType = this.getRelationTypeFromQuery();\n\n // Set reference target and reference class\n this.wpInlineCreate.referenceTarget = this.workPackage;\n this.wpInlineCreate.relationType = relationType;\n\n // Set up the query props\n this.queryProps = this.buildQueryProps();\n\n // Wire the successful saving of a new addition to refreshing the embedded table\n this.wpInlineCreate.newInlineWorkPackageCreated\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((toId:string) => this.addRelation(toId));\n\n // When relations have changed, refresh this table\n this.wpRelations.observe(this.workPackage.id!)\n .pipe(\n filter((val) => !_.isEmpty(val)),\n this.untilDestroyed(),\n )\n .subscribe(() => this.refreshTable());\n }\n\n private addRelation(toId:string) {\n this.wpInlineCreate\n .add(this.workPackage, toId)\n .then(() => {\n this.halEvents.push(this.workPackage, {\n eventType: 'association',\n relatedWorkPackage: toId,\n relationType: this.getRelationTypeFromQuery(),\n });\n })\n .catch((error) => this.notificationService.handleRawError(error, this.workPackage));\n }\n\n private getRelationTypeFromQuery() {\n return this.group.relationType!;\n }\n}\n","import { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { Component, Injector } from '@angular/core';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { WpTableConfigurationModalComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\n\n@Component({\n templateUrl: './config-menu.template.html',\n selector: 'wp-table-config-menu',\n})\nexport class WorkPackagesTableConfigMenuComponent {\n public text = {\n configureTable: this.I18n.t('js.toolbar.settings.configure_view'),\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly injector:Injector,\n readonly opModalService:OpModalService,\n readonly opContextMenu:OPContextMenuService,\n ) { }\n\n public openTableConfigurationModal() {\n this.opContextMenu.close();\n this.opModalService.show(WpTableConfigurationModalComponent, this.injector);\n }\n}\n","\n \n\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UIRouterModule } from '@uirouter/angular';\nimport { WpTabWrapperComponent } from 'core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/wp-tab-wrapper.component';\nimport { DynamicModule } from 'ng-dynamic-component';\nimport { OpenprojectTabsModule } from 'core-app/shared/components/tabs/openproject-tabs.module';\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\nimport { WpTabsComponent } from './components/wp-tabs/wp-tabs.component';\n\n@NgModule({\n declarations: [\n WpTabsComponent,\n WpTabWrapperComponent,\n ],\n imports: [\n CommonModule,\n UIRouterModule,\n DynamicModule,\n OpenprojectTabsModule,\n IconModule,\n ],\n exports: [\n WpTabsComponent,\n WpTabWrapperComponent,\n ],\n})\nexport class OpWpTabsModule {\n}\n","\n \n \n \n {{ descriptor.label }}\n *\n \n \n \n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component,\n HostBinding,\n Injector,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { EditFormComponent } from 'core-app/shared/components/fields/edit/edit-form/edit-form.component';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport {\n FieldDescriptor,\n GroupDescriptor,\n} from 'core-app/features/work-packages/components/wp-single-view/wp-single-view.component';\n\n@Component({\n selector: 'wp-attribute-group',\n templateUrl: './wp-attribute-group.template.html',\n styleUrls: ['./wp-attribute-group.component.sass'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class WorkPackageFormAttributeGroupComponent extends UntilDestroyedMixin {\n @HostBinding('class.wp-attribute-group') className = true;\n\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public group:GroupDescriptor;\n\n constructor(readonly I18n:I18nService,\n public wpEditForm:EditFormComponent,\n protected injector:Injector) {\n super();\n }\n\n public trackByName(_index:number, elem:{ name:string }) {\n return elem.name;\n }\n\n /**\n * Hide read-only fields, but only when in the create mode\n * @param {FieldDescriptor} field\n */\n public shouldHideField(descriptor:FieldDescriptor) {\n const field = descriptor.field || descriptor.fields![0];\n return this.wpEditForm.editMode && !field.writable;\n }\n\n public fieldName(name:string) {\n if (name === 'startDate') {\n return 'combinedDate';\n }\n return name;\n }\n}\n","import { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\n\nexport class TimeEntryChangeset extends ResourceChangeset {\n public setValue(key:string, val:any) {\n super.setValue(key, val);\n\n // Update the form for fields that may alter the form itself\n if (key === 'workPackage') {\n this.updateForm();\n }\n }\n\n protected buildPayloadFromChanges() {\n const payload = super.buildPayloadFromChanges();\n\n // we ignore the project and instead rely completely on the work package.\n delete payload._links.project;\n\n return payload;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CookieService } from 'ngx-cookie-service';\n\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\nimport { OpSpotModule } from 'core-app/spot/spot.module';\n\nimport { StorageComponent } from 'core-app/shared/components/storages/storage/storage.component';\nimport {\n FileLinkListItemComponent,\n} from 'core-app/shared/components/storages/file-link-list-item/file-link-list-item.component';\nimport {\n StorageInformationComponent,\n} from 'core-app/shared/components/storages/storage-information/storage-information.component';\nimport {\n FilePickerModalComponent,\n} from 'core-app/shared/components/storages/file-picker-modal/file-picker-modal.component';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { SortFilesPipe } from 'core-app/shared/components/storages/pipes/sort-files.pipe';\nimport {\n StorageFileListItemComponent,\n} from 'core-app/shared/components/storages/storage-file-list-item/storage-file-list-item.component';\nimport {\n LocationPickerModalComponent,\n} from 'core-app/shared/components/storages/location-picker-modal/location-picker-modal.component';\nimport {\n LoadingFileListComponent,\n} from 'core-app/shared/components/storages/loading-file-list/loading-file-list.component';\nimport {\n UploadConflictModalComponent,\n} from 'core-app/shared/components/storages/upload-conflict-modal/upload-conflict-modal.component';\n\n@NgModule({\n imports: [\n CommonModule,\n IconModule,\n OpSpotModule,\n OpSharedModule,\n ],\n declarations: [\n StorageComponent,\n FileLinkListItemComponent,\n FilePickerModalComponent,\n LocationPickerModalComponent,\n LoadingFileListComponent,\n StorageInformationComponent,\n StorageFileListItemComponent,\n SortFilesPipe,\n UploadConflictModalComponent,\n ],\n exports: [\n StorageComponent,\n ],\n providers: [\n SortFilesPipe,\n CookieService,\n ],\n})\nexport class OpenprojectStoragesModule {}\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Injector,\n NgModule,\n} from '@angular/core';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { OpenprojectFieldsModule } from 'core-app/shared/components/fields/openproject-fields.module';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { WorkPackageEmbeddedTableComponent } from 'core-app/features/work-packages/components/wp-table/embedded/wp-embedded-table.component';\nimport { WorkPackageEmbeddedTableEntryComponent } from 'core-app/features/work-packages/components/wp-table/embedded/wp-embedded-table-entry.component';\nimport { WorkPackageTablePaginationComponent } from 'core-app/features/work-packages/components/wp-table/table-pagination/wp-table-pagination.component';\nimport { WorkPackageTimelineTableController } from 'core-app/features/work-packages/components/wp-table/timeline/container/wp-timeline-container.directive';\nimport { WorkPackageInlineCreateComponent } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.component';\nimport { OpTypesContextMenuDirective } from 'core-app/shared/components/op-context-menu/handlers/op-types-context-menu.directive';\nimport { OpColumnsContextMenu } from 'core-app/shared/components/op-context-menu/handlers/op-columns-context-menu.directive';\nimport { OpSettingsMenuDirective } from 'core-app/shared/components/op-context-menu/handlers/op-settings-dropdown-menu.directive';\nimport { WorkPackageStatusDropdownDirective } from 'core-app/shared/components/op-context-menu/handlers/wp-status-dropdown-menu.directive';\nimport { WorkPackageCreateSettingsMenuDirective } from 'core-app/shared/components/op-context-menu/handlers/wp-create-settings-menu.directive';\nimport { WorkPackageSingleContextMenuDirective } from 'core-app/shared/components/op-context-menu/wp-context-menu/wp-single-context-menu';\nimport { WorkPackageTimelineHeaderController } from 'core-app/features/work-packages/components/wp-table/timeline/header/wp-timeline-header.directive';\nimport { WorkPackageTableTimelineRelations } from 'core-app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-relations.directive';\nimport { WorkPackageTableTimelineStaticElements } from 'core-app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-static-elements.directive';\nimport { WorkPackageTableTimelineGrid } from 'core-app/features/work-packages/components/wp-table/timeline/grid/wp-timeline-grid.directive';\nimport { WorkPackageTimelineButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-timeline-toggle-button/wp-timeline-toggle-button.component';\nimport { WorkPackageOverviewTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/overview-tab/overview-tab.component';\nimport { WorkPackageStatusButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-status-button/wp-status-button.component';\nimport { WorkPackageReplacementLabelComponent } from 'core-app/features/work-packages/components/wp-edit/wp-edit-field/wp-replacement-label.component';\nimport { NewestActivityOnOverviewComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-on-overview.component';\nimport { WorkPackageActivityTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-tab.component';\nimport { OpenprojectAttachmentsModule } from 'core-app/shared/components/attachments/openproject-attachments.module';\nimport { WpCustomActionComponent } from 'core-app/features/work-packages/components/wp-custom-actions/wp-custom-actions/wp-custom-action.component';\nimport { WpCustomActionsComponent } from 'core-app/features/work-packages/components/wp-custom-actions/wp-custom-actions.component';\nimport { WorkPackageRelationsTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/relations-tab/relations-tab.component';\nimport { WorkPackageRelationsComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relations.component';\nimport { WorkPackageRelationsGroupComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relations-group/wp-relations-group.component';\nimport { WorkPackageRelationRowComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relation-row/wp-relation-row.component';\nimport { WorkPackageRelationsCreateComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-create.component';\nimport { WorkPackageRelationsHierarchyComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.directive';\nimport { WorkPackageCreateButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-create-button/wp-create-button.component';\nimport { WorkPackageFilterButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-filter-button/wp-filter-button.component';\nimport { WorkPackageDetailsViewButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-details-view-button/wp-details-view-button.component';\nimport { WorkPackageFoldToggleButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-fold-toggle-button/wp-fold-toggle-button.component';\nimport { WpTableConfigurationModalComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\nimport { WpTableConfigurationColumnsTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/columns-tab.component';\nimport { WpTableConfigurationDisplaySettingsTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/display-settings-tab.component';\nimport { WpTableConfigurationFiltersTab } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/filters-tab.component';\nimport { WpTableConfigurationSortByTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/sort-by-tab.component';\nimport { WpTableConfigurationTimelinesTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/timelines-tab.component';\nimport { WpTableConfigurationHighlightingTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/highlighting-tab.component';\nimport { WpTableConfigurationRelationSelectorComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration-relation-selector';\nimport { WorkPackageWatchersTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/watchers-tab.component';\nimport { WorkPackageWatcherEntryComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watcher-entry.component';\nimport { WorkPackageNewSplitViewComponent } from 'core-app/features/work-packages/components/wp-new/wp-new-split-view.component';\nimport { WorkPackageNewFullViewComponent } from 'core-app/features/work-packages/components/wp-new/wp-new-full-view.component';\nimport { EmbeddedTablesMacroComponent } from 'core-app/features/work-packages/components/wp-table/embedded/embedded-tables-macro.component';\nimport { OpenprojectEditorModule } from 'core-app/shared/components/editor/openproject-editor.module';\nimport { WorkPackageTableSumsRowController } from 'core-app/features/work-packages/components/wp-table/wp-table-sums-row/wp-table-sums-row.directive';\nimport { ExternalQueryConfigurationComponent } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.component';\nimport { ExternalQueryConfigurationService } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.service';\nimport { ExternalRelationQueryConfigurationComponent } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.component';\nimport { ExternalRelationQueryConfigurationService } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.service';\nimport { WorkPackagesListInvalidQueryService } from 'core-app/features/work-packages/components/wp-list/wp-list-invalid-query.service';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { WorkPackageWatchersService } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watchers.service';\nimport { WorkPackagesActivityService } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/wp-activity.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageChildrenQueryComponent } from 'core-app/features/work-packages/components/wp-relations/embedded/children/wp-children-query.component';\nimport { WpRelationInlineAddExistingComponent } from 'core-app/features/work-packages/components/wp-relations/embedded/inline/add-existing/wp-relation-inline-add-existing.component';\nimport { WorkPackageRelationQueryComponent } from 'core-app/features/work-packages/components/wp-relations/embedded/relations/wp-relation-query.component';\nimport { WorkPackagesBaseComponent } from 'core-app/features/work-packages/routing/wp-base/wp--base.component';\nimport { WorkPackageSplitViewComponent } from 'core-app/features/work-packages/routing/wp-split-view/wp-split-view.component';\nimport { WorkPackagesFullViewComponent } from 'core-app/features/work-packages/routing/wp-full-view/wp-full-view.component';\nimport { QueryFiltersService } from 'core-app/features/work-packages/components/wp-query/query-filters.service';\nimport { WorkPackageCardViewComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { OpenprojectBcfModule } from 'core-app/features/bim/bcf/openproject-bcf.module';\nimport { WorkPackageRelationsAutocompleteComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-autocomplete/wp-relations-autocomplete.component';\nimport { CustomDateActionAdminComponent } from 'core-app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.component';\nimport { WorkPackagesTableConfigMenuComponent } from 'core-app/features/work-packages/components/wp-table/config-menu/config-menu.component';\nimport { WorkPackageViewToggleButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-view-toggle-button/work-package-view-toggle-button.component';\nimport { WorkPackageViewDropdownMenuDirective } from 'core-app/shared/components/op-context-menu/handlers/wp-view-dropdown-menu.directive';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { OpenprojectProjectsModule } from 'core-app/features/projects/openproject-projects.module';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { WorkPackageEditActionsBarComponent } from 'core-app/features/work-packages/components/edit-actions-bar/wp-edit-actions-bar.component';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { WorkPackageSingleCardComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component';\nimport { WorkPackageListViewComponent } from 'core-app/features/work-packages/routing/wp-list-view/wp-list-view.component';\nimport { PartitionedQuerySpacePageComponent } from 'core-app/features/work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component';\nimport { WorkPackageViewPageComponent } from 'core-app/features/work-packages/routing/wp-view-page/wp-view-page.component';\nimport { WorkPackageSettingsButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-settings-button/wp-settings-button.component';\nimport { BackButtonComponent } from 'core-app/features/work-packages/components/back-routing/back-button.component';\nimport { WorkPackagesTableComponent } from 'core-app/features/work-packages/components/wp-table/wp-table.component';\nimport { WorkPackageGroupToggleDropdownMenuDirective } from 'core-app/shared/components/op-context-menu/handlers/wp-group-toggle-dropdown-menu.directive';\nimport { OpenprojectAutocompleterModule } from 'core-app/shared/components/autocompleter/openproject-autocompleter.module';\nimport { OpWpTabsModule } from 'core-app/features/work-packages/components/wp-tabs/wp-tabs.module';\nimport { EditFieldControlsModule } from 'core-app/shared/components/fields/edit/field-controls/edit-field-controls.module';\nimport { WpTableExportModalComponent } from 'core-app/shared/components/modals/export-modal/wp-table-export.modal';\nimport { WpButtonMacroModalComponent } from 'core-app/shared/components/modals/editor/macro-wp-button-modal/wp-button-macro.modal';\nimport { QuerySharingModalComponent } from 'core-app/shared/components/modals/share-modal/query-sharing.modal';\nimport { SaveQueryModalComponent } from 'core-app/shared/components/modals/save-modal/save-query.modal';\nimport { QuerySharingFormComponent } from 'core-app/shared/components/modals/share-modal/query-sharing-form.component';\nimport { WpDestroyModalComponent } from 'core-app/shared/components/modals/wp-destroy-modal/wp-destroy.modal';\nimport { WorkPackageTypeStatusComponent } from 'core-app/features/work-packages/components/wp-type-status/wp-type-status.component';\nimport { WorkPackageIsolatedQuerySpaceDirective } from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\nimport { WorkPackageBreadcrumbParentComponent } from 'core-app/features/work-packages/components/wp-breadcrumb/wp-breadcrumb-parent.component';\nimport { WorkPackageSubjectComponent } from 'core-app/features/work-packages/components/wp-subject/wp-subject.component';\nimport { WorkPackageBreadcrumbComponent } from 'core-app/features/work-packages/components/wp-breadcrumb/wp-breadcrumb.component';\nimport { UserLinkComponent } from 'core-app/shared/components/user-link/user-link.component';\nimport { WorkPackageCommentComponent } from 'core-app/features/work-packages/components/work-package-comment/work-package-comment.component';\nimport { WorkPackageWatcherButtonComponent } from 'core-app/features/work-packages/components/wp-watcher-button/wp-watcher-button.component';\nimport { WorkPackageCommentFieldComponent } from 'core-app/features/work-packages/components/work-package-comment/wp-comment-field.component';\nimport { WpResizerDirective } from 'core-app/shared/components/resizer/resizer/wp-resizer.component';\nimport {\n GroupDescriptor,\n WorkPackageSingleViewComponent,\n} from 'core-app/features/work-packages/components/wp-single-view/wp-single-view.component';\nimport { WorkPackageIsolatedGraphQuerySpaceDirective } from 'core-app/features/work-packages/directives/query-space/wp-isolated-graph-query-space.directive';\nimport { RevisionActivityComponent } from 'core-app/features/work-packages/components/wp-activity/revision/revision-activity.component';\nimport { WorkPackageCopySplitViewComponent } from 'core-app/features/work-packages/components/wp-copy/wp-copy-split-view.component';\nimport { WorkPackageFormAttributeGroupComponent } from 'core-app/features/work-packages/components/wp-form-group/wp-attribute-group.component';\nimport { WorkPackagesGridComponent } from 'core-app/features/work-packages/components/wp-grid/wp-grid.component';\nimport { ActivityEntryComponent } from 'core-app/features/work-packages/components/wp-activity/activity-entry.component';\nimport { ActivityLinkComponent } from 'core-app/features/work-packages/components/wp-activity/activity-link.component';\nimport { UserActivityComponent } from 'core-app/features/work-packages/components/wp-activity/user/user-activity.component';\nimport { WorkPackageSplitViewToolbarComponent } from 'core-app/features/work-packages/components/wp-details/wp-details-toolbar.component';\nimport { WorkPackageCopyFullViewComponent } from 'core-app/features/work-packages/components/wp-copy/wp-copy-full-view.component';\nimport { OpenprojectTabsModule } from 'core-app/shared/components/tabs/openproject-tabs.module';\nimport { TimeEntryChangeset } from 'core-app/features/work-packages/helpers/time-entries/time-entry-changeset';\n\nimport { OpAttachmentsComponent } from 'core-app/shared/components/attachments/attachments.component';\nimport { QueryFiltersComponent } from 'core-app/features/work-packages/components/filters/query-filters/query-filters.component';\nimport { FilterDateTimesValueComponent } from 'core-app/features/work-packages/components/filters/filter-date-times-value/filter-date-times-value.component';\nimport { FilterSearchableMultiselectValueComponent } from 'core-app/features/work-packages/components/filters/filter-searchable-multiselect-value/filter-searchable-multiselect-value.component';\nimport { QueryFilterComponent } from 'core-app/features/work-packages/components/filters/query-filter/query-filter.component';\nimport { FilterDatesValueComponent } from 'core-app/features/work-packages/components/filters/filter-dates-value/filter-dates-value.component';\nimport { FilterStringValueComponent } from 'core-app/features/work-packages/components/filters/filter-string-value/filter-string-value.component';\nimport { FilterProjectComponent } from 'core-app/features/work-packages/components/filters/filter-project/filter-project.component';\nimport { FilterDateValueComponent } from 'core-app/features/work-packages/components/filters/filter-date-value/filter-date-value.component';\nimport { FilterDateTimeValueComponent } from 'core-app/features/work-packages/components/filters/filter-date-time-value/filter-date-time-value.component';\nimport { FilterToggledMultiselectValueComponent } from 'core-app/features/work-packages/components/filters/filter-toggled-multiselect-value/filter-toggled-multiselect-value.component';\nimport { WorkPackageFilterByTextInputComponent } from 'core-app/features/work-packages/components/filters/quick-filter-by-text-input/quick-filter-by-text-input.component';\nimport { FilterIntegerValueComponent } from 'core-app/features/work-packages/components/filters/filter-integer-value/filter-integer-value.component';\nimport { WorkPackageFilterContainerComponent } from 'core-app/features/work-packages/components/filters/filter-container/filter-container.directive';\nimport { FilterBooleanValueComponent } from 'core-app/features/work-packages/components/filters/filter-boolean-value/filter-boolean-value.component';\nimport { WorkPackageMarkNotificationButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-mark-notification-button/work-package-mark-notification-button.component';\nimport { WorkPackageFilesTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/files-tab/op-files-tab.component';\nimport { WorkPackagesQueryViewService } from 'core-app/features/work-packages/components/wp-list/wp-query-view.service';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { OpenprojectStoragesModule } from 'core-app/shared/components/storages/openproject-storages.module';\nimport { FileLinksResourceService } from 'core-app/core/state/file-links/file-links.service';\nimport { StoragesResourceService } from 'core-app/core/state/storages/storages.service';\nimport { StorageFilesResourceService } from 'core-app/core/state/storage-files/storage-files.service';\n\n@NgModule({\n imports: [\n // Commons\n OpSharedModule,\n // Display + Edit field functionality\n OpenprojectFieldsModule,\n // CKEditor\n OpenprojectEditorModule,\n\n OpenprojectAttachmentsModule,\n\n OpenprojectBcfModule,\n\n OpenprojectProjectsModule,\n\n OpenprojectModalModule,\n\n OpenprojectAutocompleterModule,\n\n OpWpTabsModule,\n\n EditFieldControlsModule,\n OpenprojectTabsModule,\n OpenprojectStoragesModule,\n ],\n providers: [\n // Notification service\n WorkPackageNotificationService,\n\n // External query configuration\n ExternalQueryConfigurationService,\n ExternalRelationQueryConfigurationService,\n\n // Global work package states / services\n SchemaCacheService,\n\n // Global query/table state services\n // For any service that depends on the isolated query space,\n // they should be provided in wp-isolated-query-space.directive instead\n QueryFiltersService,\n WorkPackagesListInvalidQueryService,\n\n // Provide a separate service for creation events of WP Inline create\n // This can be hierarchically injected to provide isolated events on an embedded table\n WorkPackageRelationsService,\n\n WorkPackagesActivityService,\n WorkPackageRelationsService,\n WorkPackageWatchersService,\n\n WorkPackagesQueryViewService,\n\n HalEventsService,\n FileLinksResourceService,\n StorageFilesResourceService,\n\n StoragesResourceService,\n ],\n declarations: [\n // Routing\n WorkPackagesBaseComponent,\n PartitionedQuerySpacePageComponent,\n WorkPackageViewPageComponent,\n\n // WP list side\n WorkPackageListViewComponent,\n WorkPackageSettingsButtonComponent,\n\n // Query injector isolation\n WorkPackageIsolatedQuerySpaceDirective,\n WorkPackageIsolatedGraphQuerySpaceDirective,\n\n // WP New\n WorkPackageNewFullViewComponent,\n WorkPackageNewSplitViewComponent,\n WorkPackageTypeStatusComponent,\n WorkPackageEditActionsBarComponent,\n\n // WP Copy\n WorkPackageCopyFullViewComponent,\n WorkPackageCopySplitViewComponent,\n\n // Embedded table\n WorkPackageEmbeddedTableComponent,\n WorkPackageEmbeddedTableEntryComponent,\n\n // External query configuration\n ExternalQueryConfigurationComponent,\n ExternalRelationQueryConfigurationComponent,\n\n // Inline create\n WorkPackageInlineCreateComponent,\n WpRelationInlineAddExistingComponent,\n\n WorkPackagesGridComponent,\n\n WorkPackagesTableComponent,\n WorkPackagesTableConfigMenuComponent,\n WorkPackageTablePaginationComponent,\n\n WpResizerDirective,\n\n WorkPackageTableSumsRowController,\n\n // Fold/Unfold button on wp list\n WorkPackageFoldToggleButtonComponent,\n\n // Filters\n QueryFiltersComponent,\n QueryFilterComponent,\n FilterBooleanValueComponent,\n FilterDateValueComponent,\n FilterDatesValueComponent,\n FilterDateTimeValueComponent,\n FilterDateTimesValueComponent,\n FilterIntegerValueComponent,\n FilterStringValueComponent,\n FilterProjectComponent,\n FilterToggledMultiselectValueComponent,\n FilterSearchableMultiselectValueComponent,\n\n WorkPackageFilterContainerComponent,\n WorkPackageFilterButtonComponent,\n\n // Context menus\n OpTypesContextMenuDirective,\n OpColumnsContextMenu,\n OpSettingsMenuDirective,\n WorkPackageStatusDropdownDirective,\n WorkPackageCreateSettingsMenuDirective,\n WorkPackageSingleContextMenuDirective,\n WorkPackageViewDropdownMenuDirective,\n WorkPackageGroupToggleDropdownMenuDirective,\n\n // Timeline\n WorkPackageTimelineButtonComponent,\n WorkPackageTimelineHeaderController,\n WorkPackageTableTimelineRelations,\n WorkPackageTableTimelineStaticElements,\n WorkPackageTableTimelineGrid,\n WorkPackageTimelineTableController,\n\n WorkPackageCreateButtonComponent,\n WorkPackageFilterByTextInputComponent,\n\n // Single view\n WorkPackageOverviewTabComponent,\n WorkPackageSingleViewComponent,\n WorkPackageStatusButtonComponent,\n WorkPackageReplacementLabelComponent,\n UserLinkComponent,\n WorkPackageChildrenQueryComponent,\n WorkPackageRelationQueryComponent,\n WorkPackageFormAttributeGroupComponent,\n BackButtonComponent,\n\n // Activity Tab\n NewestActivityOnOverviewComponent,\n WorkPackageCommentComponent,\n WorkPackageCommentFieldComponent,\n ActivityEntryComponent,\n UserActivityComponent,\n RevisionActivityComponent,\n ActivityLinkComponent,\n WorkPackageActivityTabComponent,\n\n // Watchers wp-tab-wrapper\n WorkPackageWatchersTabComponent,\n WorkPackageWatcherEntryComponent,\n\n // Relations\n WorkPackageRelationsTabComponent,\n WorkPackageRelationsComponent,\n WorkPackageRelationsGroupComponent,\n WorkPackageRelationRowComponent,\n WorkPackageRelationsCreateComponent,\n WorkPackageRelationsHierarchyComponent,\n WorkPackageRelationsAutocompleteComponent,\n WorkPackageBreadcrumbParentComponent,\n\n // Files tab\n WorkPackageFilesTabComponent,\n\n // Split view\n WorkPackageDetailsViewButtonComponent,\n WorkPackageSplitViewComponent,\n WorkPackageBreadcrumbComponent,\n WorkPackageSplitViewToolbarComponent,\n WorkPackageWatcherButtonComponent,\n WorkPackageSubjectComponent,\n\n // Full view\n WorkPackagesFullViewComponent,\n\n // Modals\n WpTableConfigurationModalComponent,\n WpTableConfigurationColumnsTabComponent,\n WpTableConfigurationDisplaySettingsTabComponent,\n WpTableConfigurationFiltersTab,\n WpTableConfigurationSortByTabComponent,\n WpTableConfigurationTimelinesTabComponent,\n WpTableConfigurationHighlightingTabComponent,\n WpTableConfigurationRelationSelectorComponent,\n WpTableExportModalComponent,\n QuerySharingFormComponent,\n QuerySharingModalComponent,\n SaveQueryModalComponent,\n WpDestroyModalComponent,\n\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('workPackageAttachmentListComponent', () => OpAttachmentsComponent);\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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):void {\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 void promise.then((loadedQuery:QueryResource) => {\n this.wpStatesInitialization.initialize(loadedQuery, loadedQuery.results);\n });\n }\n }\n\n protected inviteModal = InviteUserModalComponent;\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\nimport { CommentService } from 'core-app/features/work-packages/components/wp-activity/comment-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 CommentService,\n { provide: HalResourceNotificationService, useClass: WorkPackageNotificationService },\n ],\n})\nexport class WorkPackageSplitViewComponent extends WorkPackageSingleViewBase implements OnInit {\n /** Reference to the base route e.g., work-packages.partitioned.list or bim.partitioned.split */\n private baseRoute:string = this.$state.current.data.baseRoute;\n\n constructor(\n public injector:Injector,\n public states:States,\n public firstRoute:FirstRouteService,\n public keepTab:KeepTabService,\n public wpTableSelection:WorkPackageViewSelectionService,\n public wpTableFocus:WorkPackageViewFocusService,\n readonly $state:StateService,\n readonly backRouting:BackRoutingService,\n ) {\n super(injector, $state.params.workPackageId);\n }\n\n ngOnInit():void {\n this.observeWorkPackage();\n\n const wpId = this.$state.params.workPackageId;\n const focusedWP = this.wpTableFocus.focusedWorkPackage;\n\n if (!focusedWP) {\n // Focus on the work package if we're the first route\n const isFirstRoute = this.firstRoute.name === `${this.baseRoute}.details.overview`;\n const isSameID = this.firstRoute.params && wpId === this.firstRoute.params.workPackageI;\n this.wpTableFocus.updateFocus(wpId, (isFirstRoute && isSameID));\n } else {\n this.wpTableFocus.updateFocus(wpId, false);\n }\n\n if (this.wpTableSelection.isEmpty) {\n this.wpTableSelection.setRowState(wpId, true);\n }\n\n this.wpTableFocus.whenChanged()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((newId) => {\n const idSame = wpId.toString() === newId.toString();\n if (!idSame && this.$state.includes(`${this.baseRoute}.details`)) {\n this.$state.go(\n (this.$state.current.name as string),\n { workPackageId: newId, focus: false },\n );\n }\n });\n }\n\n get shouldFocus():boolean {\n return this.$state.params.focus === true;\n }\n\n showBackButton():boolean {\n return this.baseRoute.includes('bim');\n }\n\n backToList():void {\n this.backRouting.goToBaseState();\n }\n\n protected handleLoadingError(error:unknown):void {\n const message = this.notificationService.retrieveErrorMessage(error);\n\n // Go back to the base route, closing this split view\n void this.$state.go(\n this.baseRoute,\n { flash_message: { type: 'error', message } },\n );\n }\n}\n","import { EventEmitter, InjectionToken, Injector } from '@angular/core';\n\nexport interface WorkPackageViewEventHandler {\n /** Event name to register * */\n EVENT:string;\n\n /** Event context CSS selector */\n SELECTOR:string;\n\n /** Event callback handler */\n handleEvent(view:T, evt:JQuery.TriggeredEvent):void;\n\n /** Event scope method */\n eventScope(view:T):JQuery;\n}\n\nexport interface WorkPackageViewOutputs {\n // On selection updated\n selectionChanged:EventEmitter;\n // On row (double) clicked\n itemClicked:EventEmitter<{ workPackageId:string, double:boolean }>;\n // On work package link / details icon clicked\n stateLinkClicked:EventEmitter<{ workPackageId:string, requestedState:string }>;\n}\n\nexport const WorkPackageViewHandlerToken = new InjectionToken>('CardEventHandler');\n\n/**\n * Abstract view handler registry for globally handling arbitrary event on the\n * view container. Used e.g., for table to register single event callbacks for the entirety\n * of the table.\n */\nexport abstract class WorkPackageViewHandlerRegistry {\n constructor(public readonly injector:Injector) {\n }\n\n protected abstract eventHandlers:((view:T) => WorkPackageViewEventHandler)[];\n\n attachTo(viewRef:T) {\n this.eventHandlers.map((factory) => {\n const handler = factory(viewRef);\n const target = handler.eventScope(viewRef);\n\n target.on(handler.EVENT, handler.SELECTOR, (evt:JQuery.TriggeredEvent) => {\n handler.handleEvent(viewRef, evt);\n });\n\n return handler;\n });\n }\n}\n","import { Store, StoreConfig } from '@datorama/akita';\nimport { ApiV3ListFilter } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\n\nexport interface WpSingleViewState {\n notifications:{\n filters:ApiV3ListFilter[];\n }\n}\n\nexport function createInitialState():WpSingleViewState {\n return {\n notifications: {\n filters: [],\n },\n };\n}\n\n@StoreConfig({ name: 'wp-single-view' })\nexport class WpSingleViewStore extends Store {\n constructor() {\n super(createInitialState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport { WpSingleViewStore } from './wp-single-view.store';\nimport {\n filter,\n map,\n switchMap,\n take,\n} from 'rxjs/operators';\nimport { InAppNotificationsResourceService } from 'core-app/core/state/in-app-notifications/in-app-notifications.service';\nimport {\n ApiV3ListFilter,\n ApiV3ListParameters,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport {\n centerUpdatedInPlace,\n markNotificationsAsRead,\n notificationsMarkedRead,\n} from 'core-app/core/state/in-app-notifications/in-app-notifications.actions';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport {\n EffectCallback,\n EffectHandler,\n} from 'core-app/core/state/effects/effect-handler.decorator';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { collectionKey } from 'core-app/core/state/collection-store';\nimport { Query } from '@datorama/akita';\n\n@EffectHandler\n@Injectable()\nexport class WpSingleViewService {\n id = 'WorkPackage Activity Store';\n\n protected store = new WpSingleViewStore();\n\n protected query = new Query(this.store);\n\n selectNotifications$ = this\n .query\n .select((state) => state.notifications.filters)\n .pipe(\n filter((filters) => filters.length > 0),\n switchMap((filters) => this.resourceService.collection(collectionKey({ filters }))),\n );\n\n selectNotificationsCount$ = this\n .selectNotifications$\n .pipe(\n map((notifications) => notifications.length),\n );\n\n nonDateAlertNotificationsCount$ = this\n .selectNotifications$\n .pipe(\n map((notifications) => notifications.filter((notification) => notification.reason !== 'dateAlert')),\n map((notifications) => notifications.length),\n );\n\n hasNotifications$ = this\n .selectNotificationsCount$\n .pipe(\n map((count) => count > 0),\n );\n\n get params():ApiV3ListParameters {\n return { filters: this.query.getValue().notifications.filters };\n }\n\n constructor(\n readonly actions$:ActionsService,\n readonly currentUser$:CurrentUserService,\n private resourceService:InAppNotificationsResourceService,\n ) {\n }\n\n setFilters(workPackageId:string):void {\n const filters:ApiV3ListFilter[] = [\n ['readIAN', '=', false],\n ['resourceId', '=', [workPackageId]],\n ['resourceType', '=', ['WorkPackage']],\n ];\n\n this.store.update(({ notifications }) => (\n {\n notifications: {\n ...notifications,\n filters,\n },\n }\n ));\n\n this.reload();\n }\n\n markAllAsRead():void {\n const key = collectionKey({ filters: this.store.getValue().notifications.filters });\n this\n .resourceService\n .collection(key)\n .pipe(\n take(1),\n )\n .subscribe((collection) => {\n this.actions$.dispatch(\n markNotificationsAsRead({ origin: this.id, notifications: collection.map((el) => el.id) }),\n );\n });\n }\n\n private reload() {\n this\n .currentUser$\n .isLoggedIn$\n .pipe(\n take(1),\n filter((loggedIn) => loggedIn),\n switchMap(() => this.resourceService.fetchCollection(this.params)),\n )\n .subscribe();\n }\n\n /**\n * Reload after notifications were successfully marked as read\n */\n @EffectCallback(notificationsMarkedRead)\n private reloadOnNotificationRead() {\n this.reload();\n }\n\n /**\n * Reload after notifications were successfully marked as read\n */\n @EffectCallback(centerUpdatedInPlace)\n private reloadOnCenterUpdate() {\n this.reload();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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?.length === 0) {\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 ((_.isEmpty(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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\nimport * as Mousetrap from 'mousetrap';\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ChangeDetectorRef, Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport {\n WorkPackageViewFocusService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { OpTitleService } from 'core-app/core/html/op-title.service';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { States } from 'core-app/core/states/states.service';\nimport {\n KeepTabService,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\nimport {\n HalResourceEditingService,\n} from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport {\n WorkPackageNotificationService,\n} from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport {\n switchMap, take,\n} from 'rxjs/operators';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { WpSingleViewService } from 'core-app/features/work-packages/routing/wp-view-base/state/wp-single-view.service';\nimport { Observable } from 'rxjs';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { AttachmentsResourceService } from 'core-app/core/state/attachments/attachments.service';\nimport { StoragesResourceService } from 'core-app/core/state/storages/storages.service';\nimport { FileLinksResourceService } from 'core-app/core/state/file-links/file-links.service';\nimport { ProjectsResourceService } from 'core-app/core/state/projects/projects.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { HttpErrorResponse } from '@angular/common/http';\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 // 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(\n public injector:Injector,\n protected workPackageId:string,\n ) {\n super();\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 * 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(\n () => {},\n (error:HttpErrorResponse) => {\n this.toastService.addError(error);\n },\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(-1));\n\n // Preselect this work package for future list operations\n this.showStaticPagePath = this.PathHelper.workPackagePath(this.workPackageId);\n\n // Fetch attachments of current work package\n const attachments = this.workPackage.attachments as unknown&{ href:string };\n this.attachmentsResourceService.fetchAttachments(attachments.href).subscribe();\n\n if (this.workPackage.$links.fileLinks) {\n this.fileLinkResourceService\n .updateCollectionsForWorkPackage(this.workPackage.$links.fileLinks.href as string)\n .pipe(\n this.untilDestroyed(),\n switchMap(() => this.projectsResourceService.lookup((this.workPackage.project as unknown&{ id:string }).id)),\n take(1),\n )\n .subscribe(\n (project) => {\n if (project._links.storages) {\n this.storages.updateCollection(project._links.self.href, project._links.storages).subscribe();\n }\n },\n (error:HttpErrorResponse) => {\n this.toastService.addError(error);\n },\n );\n }\n\n // Listen to tab changes to update the tab label\n this.keepTab.observable\n .pipe(this.untilDestroyed())\n .subscribe((tabs:{ active:string }) => {\n this.updateFocusAnchorLabel(tabs.active);\n });\n }\n\n protected handleLoadingError(error:unknown):void {\n this.notificationService.handleRawError(error);\n }\n\n /**\n * Recompute the current tab focus label\n */\n public updateFocusAnchorLabel(tabName:string):string {\n this.focusAnchorLabel = this.i18n.t('js.label_work_package_details_you_are_here', {\n tab: this.i18n.t(`js.work_packages.tabs.${tabName}`),\n type: this.workPackage.type.name,\n subject: this.workPackage.subject,\n });\n return this.focusAnchorLabel;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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):void;\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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { StateService } from '@uirouter/core';\nimport { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalDeletedEvent, HalEventsService } from 'core-app/features/hal/services/hal-events.service';\n\n@Injectable()\nexport class WorkPackageService {\n private text = {\n successful_delete: this.I18n.t('js.work_packages.message_successful_bulk_delete'),\n };\n\n constructor(private readonly http:HttpClient,\n private readonly $state:StateService,\n private readonly PathHelper:PathHelperService,\n private readonly UrlParamsHelper:UrlParamsHelperService,\n private readonly toastService:ToastService,\n private readonly I18n:I18nService,\n private readonly halEvents:HalEventsService) {\n }\n\n public performBulkDelete(ids:string[], defaultHandling:boolean) {\n const params = {\n 'ids[]': ids,\n };\n const promise = this.http\n .delete(\n this.PathHelper.workPackagesBulkDeletePath(),\n { params, withCredentials: true },\n )\n .toPromise();\n\n if (defaultHandling) {\n promise\n .then(() => {\n this.toastService.addSuccess(this.text.successful_delete);\n\n ids.forEach((id) => this.halEvents.push({ _type: 'WorkPackage', id }, { eventType: 'deleted' } as HalDeletedEvent));\n\n if (this.$state.includes('**.list.details.**')\n && ids.indexOf(this.$state.params.workPackageId) > -1) {\n this.$state.go('work-packages.partitioned.list', this.$state.params);\n }\n })\n .catch(() => {\n const urlParams = this.UrlParamsHelper.buildQueryString(params);\n window.location.href = `${this.PathHelper.workPackagesBulkDeletePath()}?${urlParams}`;\n });\n }\n\n return promise;\n }\n}\n","
    \n \n \n \n\n \n
    \n\n \n\n \n \n \n \n \n \n \n \n \n \n\n\n\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';\nimport { ConfirmDialogOptions } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.modal';\nimport { getIconForMimeType } from 'core-app/shared/components/storages/functions/storages.functions';\nimport { IFileIcon } from 'core-app/shared/components/storages/icons.mapping';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[op-attachment-list-item]',\n templateUrl: './attachment-list-item.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OpAttachmentListItemComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit {\n @Input() public attachment:IAttachment;\n\n @Input() public index:number;\n\n @Output() public removeAttachment = new EventEmitter();\n\n @ViewChild('avatar') avatar:ElementRef;\n\n static imageFileExtensions:string[] = ['jpeg', 'jpg', 'gif', 'bmp', 'png'];\n\n public text = {\n dragHint: this.I18n.t('js.attachments.draggable_hint'),\n deleteTitle: this.I18n.t('js.attachments.delete'),\n deleteConfirmation: this.I18n.t('js.attachments.delete_confirmation'),\n removeFile: (arg:unknown):string => this.I18n.t('js.label_remove_file', arg),\n };\n\n public get deleteIconTitle():string {\n return this.text.removeFile({ fileName: this.attachment.fileName });\n }\n\n public author$:Observable;\n\n public timestampText:string;\n\n public fileIcon:IFileIcon;\n\n private viewInitialized$ = new BehaviorSubject(false);\n\n constructor(\n private readonly I18n:I18nService,\n private readonly pathHelper:PathHelperService,\n private readonly timezoneService:TimezoneService,\n private readonly confirmDialogService:ConfirmDialogService,\n private readonly principalsResourceService:PrincipalsResourceService,\n private readonly principalRendererService:PrincipalRendererService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.fileIcon = getIconForMimeType(this.attachment.contentType);\n\n const authorId = idFromLink(this.attachment._links.author.href);\n\n if (!this.principalsResourceService.exists(authorId)) {\n this.principalsResourceService.fetchUser(authorId).subscribe();\n }\n\n this.timestampText = this.timezoneService.parseDatetime(this.attachment.createdAt).fromNow();\n\n this.author$ = this.principalsResourceService.lookup(authorId).pipe(first());\n\n combineLatest([\n this.author$,\n this.viewInitialized$.pipe(distinctUntilChanged()),\n ]).pipe(this.untilDestroyed())\n .subscribe(([user, initialized]) => {\n if (!initialized) {\n return;\n }\n\n this.principalRendererService.render(\n this.avatar.nativeElement,\n user,\n { hide: true, link: false },\n { hide: false, size: 'mini' },\n );\n });\n }\n\n ngAfterViewInit():void {\n this.viewInitialized$.next(true);\n }\n\n /**\n * Set the appropriate data for drag & drop of an attachment item.\n * @param evt DragEvent\n */\n public setDragData(evt:DragEvent):void {\n const url = this.downloadPath;\n const previewElement = this.draggableHTML(url);\n\n if (evt.dataTransfer == null) return;\n\n evt.dataTransfer.setData('text/plain', url);\n evt.dataTransfer.setData('text/html', previewElement.outerHTML);\n evt.dataTransfer.setData('text/uri-list', url);\n evt.dataTransfer.setDragImage(previewElement, 0, 0);\n }\n\n public draggableHTML(url:string):HTMLImageElement|HTMLAnchorElement {\n let el:HTMLImageElement|HTMLAnchorElement;\n\n if (this.isImage) {\n el = document.createElement('img');\n el.src = url;\n el.textContent = this.attachment.fileName;\n } else {\n el = document.createElement('a');\n el.href = url;\n el.textContent = this.attachment.fileName;\n }\n\n return el;\n }\n\n private get downloadPath():string {\n return this.pathHelper.attachmentDownloadPath(String(this.attachment.id), this.attachment.fileName);\n }\n\n private get isImage():boolean {\n const ext = this.attachment.fileName.split('.').pop() || '';\n return OpAttachmentListItemComponent.imageFileExtensions.indexOf(ext.toLowerCase()) > -1;\n }\n\n public confirmRemoveAttachment():void {\n const options:ConfirmDialogOptions = {\n text: {\n text: this.text.deleteConfirmation,\n title: this.text.deleteTitle,\n button_continue: this.text.deleteTitle,\n },\n icon: {\n continue: 'delete',\n },\n dangerHighlighting: true,\n };\n void this.confirmDialogService\n .confirm(options)\n .then(() => { this.removeAttachment.emit(); })\n .catch(() => { /* confirmation rejected */ });\n }\n}\n"," 0\"\n class=\"spot-list spot-list_compact op-file-list\"\n>\n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { IAttachment } from 'core-app/core/state/attachments/attachment.model';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { AttachmentsResourceService } from 'core-app/core/state/attachments/attachments.service';\n\n@Component({\n selector: 'op-attachment-list',\n templateUrl: './attachment-list.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OpAttachmentListComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public attachments:IAttachment[] = [];\n\n @Input() public collectionKey:string;\n\n constructor(\n private readonly attachmentsResourceService:AttachmentsResourceService,\n ) {\n super();\n }\n\n ngOnInit():void {\n }\n\n public removeAttachment(attachment:IAttachment):void {\n this.attachmentsResourceService.removeAttachment(this.collectionKey, attachment).subscribe();\n }\n}\n"," 0\n }\"\n *ngIf=\"(attachments$ | async).length\"\n [attachments]=\"attachments$ | async\"\n [collectionKey]=\"collectionKey\"\n>\n\n\n\n 0,\n 'op-file-section--drop-box_dragging-over': draggingOverDropZone,\n 'op-file-section--drop-box_float': (attachments$ | async).length\n }\"\n type=\"button\"\n (click)=\"triggerFileInput()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDropFiles($event)\"\n>\n \n 0\"\n class=\"op-file-section--drop-box-text\"\n [textContent]=\"text.dropFiles\"\n >\n \n\n\n\n \n \n {{text.uploadLabel}}\n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 HostBinding,\n Input,\n OnDestroy,\n OnInit,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { filter, map, tap } from 'rxjs/operators';\n\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 { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\nimport { UploadFile } from 'core-app/core/file-upload/op-file-upload.service';\nimport { AttachmentsResourceService } from 'core-app/core/state/attachments/attachments.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { IAttachment } from 'core-app/core/state/attachments/attachment.model';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\nfunction containsFiles(dataTransfer:DataTransfer):boolean {\n return dataTransfer.types.indexOf('Files') >= 0;\n}\n\nexport const attachmentsSelector = 'op-attachments';\n\n@Component({\n selector: attachmentsSelector,\n templateUrl: './attachments.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OpAttachmentsComponent extends UntilDestroyedMixin implements OnInit, OnDestroy {\n @HostBinding('attr.data-qa-selector') public qaSelector = 'op-attachments';\n\n @HostBinding('id.attachments_fields') public hostId = true;\n\n @HostBinding('class.op-file-section') public className = true;\n\n @Input() public resource:HalResource;\n\n @Input() public allowUploading = true;\n\n @Input() public destroyImmediately = true;\n\n public attachments$:Observable;\n\n public draggingOverDropZone = false;\n\n public dragging = 0;\n\n @ViewChild('hiddenFileInput') public filePicker:ElementRef;\n\n public text = {\n attachments: this.I18n.t('js.label_attachments'),\n uploadLabel: this.I18n.t('js.label_add_attachments'),\n dropFiles: this.I18n.t('js.label_drop_files'),\n dropClickFiles: this.I18n.t('js.label_drop_or_click_files'),\n foldersWarning: this.I18n.t('js.label_drop_folders_hint'),\n };\n\n private get attachmentsSelfLink():string {\n const attachments = this.resource.attachments as unknown & { href:string };\n return attachments.href;\n }\n\n public get collectionKey():string {\n return isNewResource(this.resource) ? 'new' : this.attachmentsSelfLink;\n }\n\n private onGlobalDragLeave:(_event:DragEvent) => void = (_event) => {\n this.dragging = Math.max(this.dragging - 1, 0);\n this.cdRef.detectChanges();\n };\n\n private onGlobalDragEnd:(_event:DragEvent) => void = (_event) => {\n this.dragging = 0;\n this.cdRef.detectChanges();\n };\n\n private onGlobalDragEnter:(_event:DragEvent) => void = (_event) => {\n this.dragging += 1;\n this.cdRef.detectChanges();\n };\n\n constructor(\n public elementRef:ElementRef,\n protected readonly I18n:I18nService,\n protected readonly states:States,\n protected readonly halResourceService:HalResourceService,\n protected readonly attachmentsResourceService:AttachmentsResourceService,\n protected readonly toastService:ToastService,\n protected readonly timezoneService:TimezoneService,\n protected readonly cdRef:ChangeDetectorRef,\n ) {\n super();\n\n populateInputsFromDataset(this);\n }\n\n ngOnInit():void {\n if (!(this.resource instanceof HalResource)) {\n // Parse the resource if any exists\n this.resource = this.halResourceService.createHalResource(this.resource, true);\n }\n\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 // 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 document.body.addEventListener('dragenter', this.onGlobalDragEnter);\n document.body.addEventListener('dragleave', this.onGlobalDragLeave);\n document.body.addEventListener('dragend', this.onGlobalDragEnd);\n document.body.addEventListener('drop', this.onGlobalDragEnd);\n }\n\n ngOnDestroy():void {\n document.body.removeEventListener('dragenter', this.onGlobalDragEnter);\n document.body.removeEventListener('dragleave', this.onGlobalDragLeave);\n document.body.removeEventListener('dragend', this.onGlobalDragEnd);\n document.body.removeEventListener('drop', this.onGlobalDragEnd);\n }\n\n public triggerFileInput():void {\n this.filePicker.nativeElement.click();\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 // reset file input, so that selecting the same file again triggers a change\n this.filePicker.nativeElement.value = '';\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\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.draggingOverDropZone = false;\n this.dragging = 0;\n }\n\n public onDragOver(event:DragEvent):void {\n if (event.dataTransfer !== null && containsFiles(event.dataTransfer)) {\n // eslint-disable-next-line no-param-reassign\n event.dataTransfer.dropEffect = 'copy';\n this.draggingOverDropZone = true;\n }\n }\n\n public onDragLeave(_event:DragEvent):void {\n this.draggingOverDropZone = false;\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { OpAttachmentsComponent } from './attachments.component';\nimport { OpAttachmentListComponent } from './attachment-list/attachment-list.component';\nimport { OpAttachmentListItemComponent } from './attachment-list/attachment-list-item.component';\n\n@NgModule({\n imports: [\n CommonModule,\n IconModule,\n ],\n declarations: [\n OpAttachmentsComponent,\n OpAttachmentListComponent,\n OpAttachmentListItemComponent,\n ],\n exports: [\n OpAttachmentListComponent,\n OpAttachmentsComponent,\n\n OpAttachmentListItemComponent,\n ],\n})\nexport class OpenprojectAttachmentsModule {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { input } from 'reactivestates';\nimport { Injectable } from '@angular/core';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { take } from 'rxjs/operators';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { HelpTextResource } from 'core-app/features/hal/resources/help-text-resource';\n\n@Injectable({ providedIn: 'root' })\nexport class AttributeHelpTextsService {\n private helpTexts = input();\n\n constructor(private apiV3Service:ApiV3Service) {\n }\n\n /**\n * Search for a given attribute help text\n *\n * @param attribute\n * @param scope\n */\n public require(attribute:string, scope:string):Promise {\n this.load();\n\n return new Promise((resolve, reject) => {\n this.helpTexts\n .valuesPromise()\n .then(() => resolve(this.find(attribute, scope)));\n });\n }\n\n /**\n * Search for a given attribute help text\n *\n */\n public requireById(id:string|number):Promise {\n this.load();\n\n return this\n .helpTexts\n .values$()\n .pipe(\n take(1),\n )\n .toPromise()\n .then(() => {\n const value = this.helpTexts.getValueOr([]);\n return _.find(value, (element) => element.id?.toString() === id.toString());\n });\n }\n\n private load():void {\n this.helpTexts.putFromPromiseIfPristine(() => this.apiV3Service\n .help_texts\n .get()\n .toPromise()\n .then((resources:CollectionResource) => resources.elements));\n }\n\n private find(attribute:string, scope:string):HelpTextResource|undefined {\n const value = this.helpTexts.getValueOr([]);\n return _.find(value, (element) => element.scope === scope && element.attribute === attribute);\n }\n}\n","\n \n \n \n \n\n
    \n
    \n\n
    0\">\n \n {{ text.attachments }}\n \n \n
    \n \n\n
    \n
    \n \n {{ text.close }}\n \n \n \n \n \n
    \n
    \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, OnInit,\n} from '@angular/core';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HelpTextResource } from 'core-app/features/hal/resources/help-text-resource';\n\n@Component({\n templateUrl: './help-text.modal.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AttributeHelpTextModalComponent extends OpModalComponent implements OnInit {\n readonly text = {\n attachments: this.I18n.t('js.label_attachments'),\n edit: this.I18n.t('js.button_edit'),\n close: this.I18n.t('js.button_close'),\n };\n\n public helpText:HelpTextResource = this.locals.helpText!;\n\n constructor(\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit() {\n super.ngOnInit();\n\n // Load the attachments\n this\n .helpText\n .attachments\n .$load()\n .then(() => this.cdRef.detectChanges());\n }\n\n public get helpTextLink() {\n if (this.helpText.editText) {\n return this.helpText.editText.$link.href;\n }\n\n return '';\n }\n}\n","\n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component, ElementRef, OnInit, ViewChild,\n} from '@angular/core';\nimport { NgSelectComponent } from '@ng-select/ng-select';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { IProjectAutocompleterData } from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocompleter.component';\nimport { IProjectAutocompleteItem } from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocomplete-item';\n\ntype SelectItem = { label:string, value:string, selected?:boolean };\n\nexport const autocompleteSelectDecorationSelector = 'autocomplete-select-decoration';\n\n@Component({\n template: `\n \n \n\n \n \n {{ item.label }}\n \n \n `,\n selector: autocompleteSelectDecorationSelector,\n})\nexport class AutocompleteSelectDecorationComponent implements OnInit {\n @ViewChild(NgSelectComponent) public ngSelectComponent:NgSelectComponent;\n\n public options:SelectItem[];\n\n /** Whether we're a multiselect */\n public multiselect = false;\n\n /** Get the selected options */\n public selected:SelectItem|SelectItem[];\n\n /** Get the selected options especially for the project autocompleter */\n public currentProjectSelection:{ id:string, name:string }|{ id:string, name:string }[];\n\n /** The input name we're syncing selections to */\n private syncInputFieldName:string;\n\n /** The input id used for label */\n public labelForId:string;\n\n /** The field key (e.g. status, type, or project) */\n public key:string;\n\n text = {\n placeholder: this.I18n.t('js.placeholders.selection'),\n };\n\n constructor(\n protected elementRef:ElementRef,\n readonly I18n:I18nService,\n ) {\n }\n\n ngOnInit():void {\n const element = this.elementRef.nativeElement as HTMLElement;\n\n // Set options\n this.multiselect = element.dataset.multiselect === 'true';\n this.labelForId = element.dataset.inputId!;\n this.key = element.dataset.key!;\n\n // Get the sync target\n this.syncInputFieldName = element.dataset.inputName!;\n // Add Rails multiple identifier if multiselect\n if (this.multiselect) {\n this.syncInputFieldName += '[]';\n }\n\n // Prepare and build the options\n // Expected array of objects with id, name, select\n const data:SelectItem[] = JSON.parse(element.dataset.options!);\n\n // Set initial selection\n this.setInitialSelection(data);\n if (this.isProjectField()) {\n this.setInitialProjectSelection();\n }\n\n if (!this.multiselect) {\n this.selected = (this.selected as SelectItem[])[0];\n }\n\n this.options = data;\n\n // Unhide the parent\n element.parentElement!.hidden = false;\n }\n\n setInitialSelection(data:SelectItem[]):void {\n this.updateSelection(data.filter((element) => element.selected));\n }\n\n updateSelection(items:SelectItem|SelectItem[]):void {\n this.selected = items;\n items = _.castArray(items);\n\n this.removeCurrentSyncedFields();\n items.forEach((el:SelectItem) => {\n this.createSyncedField(el.value);\n });\n }\n\n createSyncedField(value:string):void {\n const element = jQuery(this.elementRef.nativeElement);\n element\n .parent()\n .append(``);\n }\n\n removeCurrentSyncedFields():void {\n const element = jQuery(this.elementRef.nativeElement);\n element\n .parent()\n .find(`input[name=\"${this.syncInputFieldName}\"]`)\n .remove();\n }\n\n updateProjectSelection(items:IProjectAutocompleteItem|IProjectAutocompleteItem[]):void {\n items = _.castArray(items);\n const mappedItems = items.map(item => {\n const selectedItem:SelectItem = {\n label: item.name,\n value: item.id.toString(),\n selected: true,\n };\n\n return selectedItem;\n });\n\n this.updateSelection(mappedItems);\n }\n\n setInitialProjectSelection():void {\n const items = _.castArray(this.selected);\n if (items.length === 0) return;\n\n if (this.multiselect) {\n this.currentProjectSelection = items.map((item:SelectItem) => ({\n id: item.value,\n name: item.label,\n }));\n } else {\n this.currentProjectSelection = {\n id: items[0].value,\n name: items[0].label,\n };\n }\n }\n\n isProjectField():boolean {\n return this.key === 'project';\n }\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[op-autocompleter-footer-tmp]',\n})\n// A Directive to be used on the option template of\n// ng-select (what will be shown in each row of drop down)\n// it is used when you want to inject a different template\nexport class OpAutocompleterFooterTemplateDirective {\n\n}\n","\n \n : {{search}}\n \n\n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Injector,\n Input,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { NgSelectComponent } from '@ng-select/ng-select';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpInviteUserModalService } from 'core-app/features/invite-user-modal/invite-user-modal.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { AddTagFn } from '@ng-select/ng-select/lib/ng-select.component';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { Subject } from 'rxjs';\nimport { typeFromHref } from 'core-app/shared/components/principal/principal-helper';\nimport { compareByHref } from 'core-app/shared/helpers/angular/tracking-functions';\nimport { filter } from 'rxjs/operators';\n\nexport interface CreateAutocompleterValueOption {\n name:string;\n href:string|null;\n}\n\n@Component({\n templateUrl: './create-autocompleter.component.html',\n selector: 'create-autocompleter',\n styleUrls: ['./create-autocompleter.component.sass'],\n})\nexport class CreateAutocompleterComponent extends UntilDestroyedMixin implements AfterViewInit {\n @Input() public availableValues:CreateAutocompleterValueOption[];\n\n @Input() public appendTo:string;\n\n @Input() public resource:HalResource;\n\n @Input() public model:any;\n\n @Input() public required = false;\n\n @Input() public disabled = false;\n\n @Input() public finishedLoading = false;\n\n @Input() public id = '';\n\n @Input() public classes = '';\n\n @Input() public typeahead?:Subject;\n\n @Input() public hideSelected = false;\n\n @Output() public onChange = new EventEmitter();\n\n @Output() public onKeydown = new EventEmitter();\n\n @Output() public onOpen = new EventEmitter();\n\n @Output() public onClose = new EventEmitter();\n\n @Output() public onAfterViewInit = new EventEmitter();\n\n @Output() public onAddNew = new EventEmitter();\n\n @ViewChild(NgSelectComponent) public ngSelectComponent:NgSelectComponent;\n\n @InjectField() readonly I18n:I18nService;\n\n @InjectField() readonly cdRef:ChangeDetectorRef;\n\n @InjectField() readonly currentProject:CurrentProjectService;\n\n @InjectField() readonly pathHelper:PathHelperService;\n\n public compareByHref = compareByHref;\n\n public text:{ [key:string]:string } = {};\n\n public createAllowed:boolean|AddTagFn = false;\n\n private _openDirectly = false;\n\n constructor(readonly injector:Injector) {\n super();\n\n this.text.add_new_action = this.I18n.t('js.label_create');\n }\n\n ngAfterViewInit() {\n this.onAfterViewInit.emit(this);\n }\n\n public openSelect() {\n if (this.ngSelectComponent) {\n this.ngSelectComponent.open();\n } else {\n // In case the autocompleter was not loaded,\n // do not reset the variable\n return;\n }\n\n this.openDirectly = false;\n }\n\n public closeSelect() {\n this.ngSelectComponent && this.ngSelectComponent.close();\n }\n\n public changeModel(element:HalResource) {\n this.onChange.emit(element);\n }\n\n public opened() {\n // Force reposition as a workaround for BUG\n // https://github.com/ng-select/ng-select/issues/1259\n setTimeout(() => {\n const component = this.ngSelectComponent as any;\n if (this.appendTo && component && component.dropdownPanel) {\n component.dropdownPanel._updatePosition();\n }\n }, 25);\n\n this.onOpen.emit();\n }\n\n public closed() {\n this.openDirectly = false;\n this.onClose.emit();\n }\n\n public keyPressed(event:JQuery.TriggeredEvent) {\n this.onKeydown.emit(event);\n }\n\n public get openDirectly() {\n return this._openDirectly;\n }\n\n public set openDirectly(val:boolean) {\n this._openDirectly = val;\n if (val) {\n this.openSelect();\n }\n }\n\n public focusInputField() {\n this.ngSelectComponent && this.ngSelectComponent.focus();\n }\n}\n","
    \n \n
    \n \n \n
    \n
    \n\n \n\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { NgSelectComponent } from '@ng-select/ng-select';\nimport { DragulaService, Group } from 'ng2-dragula';\nimport { DomAutoscrollService } from 'core-app/shared/helpers/drag-and-drop/dom-autoscroll.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { merge } from 'rxjs';\nimport { setBodyCursor } from 'core-app/shared/helpers/dom/set-window-cursor.helper';\n\nexport interface DraggableOption {\n name:string;\n id:string;\n}\n\n@Component({\n selector: 'draggable-autocompleter',\n templateUrl: './draggable-autocomplete.component.html',\n styleUrls: ['./draggable-autocomplete.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DraggableAutocompleteComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit {\n /** Options to show in the autocompleter */\n @Input() options:DraggableOption[];\n\n /** Should we focus the autocompleter ? */\n @Input() autofocus = true;\n\n /** Order list of selected items */\n @Input('selected') _selected:DraggableOption[] = [];\n\n /** Output when autocompleter changes values or items removed */\n @Output() onChange = new EventEmitter();\n\n /** List of items still available for selection */\n availableOptions:DraggableOption[] = [];\n\n private autoscroll:any;\n\n private columnsGroup:Group;\n\n @ViewChild('ngSelectComponent') public ngSelectComponent:NgSelectComponent;\n\n text = {\n placeholder: this.I18n.t('js.label_add_columns'),\n };\n\n constructor(readonly I18n:I18nService,\n readonly dragula:DragulaService) {\n super();\n }\n\n ngOnInit():void {\n this.updateAvailableOptions();\n\n // Setup groups\n this.columnsGroup = this.dragula.createGroup('columns', {});\n\n // Set cursor when dragging\n this.dragula.drag('columns')\n .pipe(this.untilDestroyed())\n .subscribe(() => setBodyCursor('move', 'important'));\n\n // Reset cursor when cancel or dropped\n merge(\n this.dragula.drop('columns'),\n this.dragula.cancel('columns'),\n )\n .pipe(this.untilDestroyed())\n .subscribe(() => setBodyCursor('auto'));\n\n // Setup autoscroll\n const that = this;\n this.autoscroll = new DomAutoscrollService(\n [\n document.getElementById('content-wrapper')!,\n ],\n {\n margin: 25,\n maxSpeed: 10,\n scrollWhenOutside: true,\n autoScroll(this:any) {\n return this.down && that.columnsGroup.drake.dragging;\n },\n },\n );\n }\n\n ngAfterViewInit():void {\n if (this.autofocus) {\n this.ngSelectComponent.focus();\n }\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n\n this.dragula.destroy('columns');\n }\n\n select(item:DraggableOption|undefined) {\n if (!item) {\n return;\n }\n\n this.selected = [...this.selected, item];\n\n // Remove selection\n this.ngSelectComponent.clearModel();\n }\n\n remove(item:DraggableOption) {\n this.selected = this.selected.filter((selected) => selected.id !== item.id);\n }\n\n get selected() {\n return this._selected;\n }\n\n set selected(val:DraggableOption[]) {\n this._selected = val;\n this.updateAvailableOptions();\n\n this.onChange.emit(this.selected);\n }\n\n opened() {\n // Force reposition as a workaround for BUG\n // https://github.com/ng-select/ng-select/issues/1259\n setTimeout(() => {\n const component = this.ngSelectComponent as any;\n if (component && component.dropdownPanel) {\n component.dropdownPanel._updatePosition();\n }\n }, 25);\n }\n\n private updateAvailableOptions() {\n this.availableOptions = this.options\n .filter((item) => !this.selected.find((selected) => selected.id === item.id));\n }\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[op-autocompleter-header-tmp]',\n})\n// A Directive to be used on the option template of\n// ng-select (what will be shown in each row of drop down)\n// it is used when you want to inject a different template\nexport class OpAutocompleterHeaderTemplateDirective {\n\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[op-autocompleter-label-tmp]',\n})\n// A Directive to be used on the label template of\n// ng-select (what will be shown in the input box after selecting an item)\n// it is used when you want to inject a different template\nexport class OpAutocompleterLabelTemplateDirective {\n\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[op-autocompleter-option-tmp]',\n})\n// A Directive to be used on the option template of\n// ng-select (what will be shown in each row of drop down)\n// it is used when you want to inject a different template\nexport class OpAutocompleterOptionTemplateDirective {\n\n}\n","import { Injectable } from '@angular/core';\nimport { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { map } from 'rxjs/operators';\nimport { ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { ApiV3UserPaths } from 'core-app/core/apiv3/endpoints/users/apiv3-user-paths';\nimport { ApiV3WorkPackagePaths } from 'core-app/core/apiv3/endpoints/work_packages/api-v3-work-package-paths';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { Observable } from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\n@Injectable()\n\nexport class OpAutocompleterService extends UntilDestroyedMixin {\n constructor(\n private apiV3Service:ApiV3Service,\n ) {\n super();\n }\n\n // A method for fetching data with different resource type and different filter\n public loadAvailable(matching:string, resource:resource, filters?:IAPIFilter[], searchKey?:string):Observable {\n const finalFilters:ApiV3FilterBuilder = this.createFilters(filters ?? [], matching, searchKey);\n\n const filteredData = (this.apiV3Service[resource] as\n ApiV3ResourceCollection)\n .filtered(finalFilters).get()\n .pipe(map((collection) => collection.elements));\n return filteredData;\n }\n\n // A method for building filters\n protected createFilters(filters:IAPIFilter[], matching:string, searchKey?:string) {\n const finalFilters = new ApiV3FilterBuilder();\n\n for (const filter of filters) {\n finalFilters.add(filter.name, filter.operator, filter.values);\n }\n if (matching) {\n finalFilters.add(searchKey ?? '', '**', [matching]);\n }\n return finalFilters;\n }\n\n // A method for returning data based on the resource type\n // If you need to fetch our default date sources like work_packages or users,\n // you should use the default method (loadAvailable), otherwise you should implement a function for\n // your desired resource\n public loadData(matching:string, resource:resource, filters?:IAPIFilter[], searchKey?:string) {\n switch (resource) {\n // in this case we can add more functions for fetching usual resources\n default: {\n return this.loadAvailable(matching, resource, filters, searchKey);\n }\n }\n }\n}\n","
    \n \n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n \n
    \n\n\n \n
    \n \n \n \n \n \n \n\n
    \n \n\n #{{item.id}}\n\n \n\n
    \n
    \n
    \n\n \n
    \n \n {{ item.name }}\n
    \n
    \n\n \n {{ item.name }}\n \n
    \n\n\n \n \n {{item.type?.name }} #{{ item.id }} {{ item.subject || item.name }}\n \n \n\n \n ×\n {{item.name}}\n \n\n","/* We just forward the ng-select outputs without renaming */\n/* eslint-disable @angular-eslint/no-output-native */\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n EventEmitter,\n HostBinding,\n Input,\n NgZone,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport {\n DropdownPosition,\n NgSelectComponent,\n} from '@ng-select/ng-select';\nimport {\n BehaviorSubject,\n merge,\n NEVER,\n Observable,\n of,\n Subject,\n} from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport { GroupValueFn } from '@ng-select/ng-select/lib/ng-select.component';\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpAutocompleterFooterTemplateDirective } from 'core-app/shared/components/autocompleter/autocompleter-footer-template/op-autocompleter-footer-template.directive';\n\nimport { OpAutocompleterService } from './services/op-autocompleter.service';\nimport { OpAutocompleterHeaderTemplateDirective } from './directives/op-autocompleter-header-template.directive';\nimport { OpAutocompleterLabelTemplateDirective } from './directives/op-autocompleter-label-template.directive';\nimport { OpAutocompleterOptionTemplateDirective } from './directives/op-autocompleter-option-template.directive';\n\n@Component({\n selector: 'op-autocompleter',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './op-autocompleter.component.html',\n styleUrls: ['./op-autocompleter.component.sass'],\n providers: [OpAutocompleterService],\n})\n// It is component that you can use whenever you need an autocompleter\n// it has all inputs and outputs of ng-select\n// in order to use it, you only need to pass the data type and its filters\n// you also can change the value of ng-select default options by changing @inputs and @outputs\nexport class OpAutocompleterComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit, OnChanges {\n @HostBinding('class.op-autocompleter') className = true;\n\n @Input() public filters?:IAPIFilter[] = [];\n\n @Input() public resource:resource;\n\n @Input() public model?:any;\n\n @Input() public searchKey?:string = '';\n\n @Input() public defaultData?:boolean = false;\n\n @Input() public focusDirectly?:boolean = true;\n\n @Input() public fetchDataDirectly?:boolean = false;\n\n @Input() public labelRequired?:boolean = true;\n\n @Input() public name?:string;\n\n @Input() public required?:boolean = false;\n\n @Input() public disabled?:string;\n\n @Input() public searchable?:boolean = true;\n\n @Input() public clearable?:boolean = true;\n\n @Input() public addTag?:boolean = false;\n\n @Input() public id = '';\n\n @Input() public accesskey?:number;\n\n @Input() public items?:IOPAutocompleterOption[]|HalResource[];\n\n private items$ = new BehaviorSubject(null);\n\n @Input() public clearSearchOnAdd?:boolean = true;\n\n @Input() public classes?:string;\n\n @Input() public multiple?:boolean = false;\n\n @Input() public openDirectly?:boolean = false;\n\n @Input() public bindLabel?:string;\n\n @Input() public bindValue?:string;\n\n @Input() public markFirst ? = true;\n\n @Input() public placeholder:string = this.I18n.t('js.autocompleter.placeholder');\n\n @Input() public notFoundText:string = this.I18n.t('js.autocompleter.notFoundText');\n\n @Input() public typeToSearchText:string = this.I18n.t('js.autocompleter.typeToSearchText');\n\n @Input() public addTagText?:string;\n\n @Input() public loadingText:string = this.I18n.t('js.ajax.loading');\n\n @Input() public clearAllText?:string;\n\n @Input() public appearance?:string;\n\n @Input() public dropdownPosition?:DropdownPosition = 'auto';\n\n @Input() public appendTo?:string;\n\n @Input() public closeOnSelect?:boolean = true;\n\n @Input() public hideSelected?:boolean = false;\n\n @Input() public selectOnTab?:boolean = false;\n\n @Input() public openOnEnter?:boolean = true;\n\n @Input() public maxSelectedItems?:number;\n\n @Input() public groupBy?:string|(() => string);\n\n @Input() public groupValue?:GroupValueFn;\n\n @Input() public bufferAmount ? = 4;\n\n @Input() public virtualScroll?:boolean;\n\n @Input() public selectableGroup?:boolean = false;\n\n @Input() public selectableGroupAsModel?:boolean = true;\n\n @Input() public searchFn:(term:string, item:any) => boolean;\n\n @Input() public trackByFn ? = null;\n\n @Input() public compareWith ? = (a:unknown, b:unknown):boolean => a === b;\n\n @Input() public clearOnBackspace?:boolean = true;\n\n @Input() public labelForId ? = null;\n\n @Input() public inputAttrs?:{ [key:string]:string } = {};\n\n @Input() public tabIndex?:number;\n\n @Input() public readonly?:boolean = false;\n\n @Input() public searchWhileComposing?:boolean = true;\n\n @Input() public minTermLength ? = 0;\n\n @Input() public editableSearchTerm?:boolean = false;\n\n @Input() public keyDownFn ? = ():boolean => true;\n\n @Input() public typeahead:BehaviorSubject|null = null;\n\n // a function for setting the options of ng-select\n @Input() public getOptionsFn:(searchTerm:string) => Observable;\n\n @Output() public open = new EventEmitter();\n\n @Output() public close = new EventEmitter();\n\n @Output() public change = new EventEmitter();\n\n @Output() public focus = new EventEmitter();\n\n @Output() public blur = new EventEmitter();\n\n @Output() public search = new EventEmitter<{ term:string, items:unknown[] }>();\n\n @Output() public keydown = new EventEmitter();\n\n @Output() public clear = new EventEmitter();\n\n @Output() public add = new EventEmitter();\n\n @Output() public remove = new EventEmitter();\n\n @Output() public scroll = new EventEmitter<{ start:number; end:number }>();\n\n @Output() public scrollToEnd = new EventEmitter();\n\n public active:Set;\n\n public results$:Observable;\n\n public loading$ = new Subject();\n\n @ViewChild('ngSelectInstance') ngSelectInstance:NgSelectComponent;\n\n @ContentChild(OpAutocompleterOptionTemplateDirective, { read: TemplateRef })\n optionTemplate:TemplateRef;\n\n @ContentChild(OpAutocompleterLabelTemplateDirective, { read: TemplateRef })\n labelTemplate:TemplateRef;\n\n @ContentChild(OpAutocompleterHeaderTemplateDirective, { read: TemplateRef })\n headerTemplate:TemplateRef;\n\n @ContentChild(OpAutocompleterFooterTemplateDirective, { read: TemplateRef })\n footerTemplate:TemplateRef;\n\n constructor(\n readonly opAutocompleterService:OpAutocompleterService,\n readonly cdRef:ChangeDetectorRef,\n readonly ngZone:NgZone,\n private readonly I18n:I18nService,\n ) {\n super();\n }\n\n ngOnInit() {\n if (!!this.getOptionsFn || this.defaultData) {\n this.typeahead = new BehaviorSubject('');\n }\n }\n\n ngOnChanges(changes:SimpleChanges):void {\n if (changes.items) {\n this.items$.next(changes.items.currentValue);\n }\n }\n\n ngAfterViewInit():void {\n if (!this.ngSelectInstance) {\n return;\n }\n\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n this.results$ = merge(\n this.items$,\n this.autocompleteInputStream(),\n );\n\n if (this.fetchDataDirectly) {\n this.typeahead?.next('');\n }\n\n if (this.openDirectly) {\n this.ngSelectInstance.open();\n this.ngSelectInstance.focus();\n } else if (this.focusDirectly) {\n this.ngSelectInstance.focus();\n }\n }, 25);\n });\n }\n\n public repositionDropdown() {\n if (this.ngSelectInstance) {\n setTimeout(() => {\n this.cdRef.detectChanges();\n const component = this.ngSelectInstance;\n if (this.appendTo && component && component.dropdownPanel) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access,no-underscore-dangle\n (component.dropdownPanel as any)._updatePosition();\n }\n }, 25);\n }\n }\n\n public opened():void { // eslint-disable-line no-unused-vars\n // Re-search for empty value as search value gets removed\n this.typeahead?.next('');\n this.repositionDropdown();\n this.open.emit();\n }\n\n public getOptionsItems(searchKey:string):Observable {\n return of((this.items as IOPAutocompleterOption[])?.filter((element) => element.name.includes(searchKey)));\n }\n\n public closeSelect():void {\n this.ngSelectInstance?.close();\n }\n\n public openSelect():void {\n this.ngSelectInstance?.open();\n }\n\n public focusSelect():void {\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n this.ngSelectInstance.focus();\n }, 25);\n });\n }\n\n public closed():void {\n this.close.emit();\n }\n\n public changed(val:unknown):void {\n this.change.emit(val);\n }\n\n public searched(val:{ term:string, items:unknown[] }):void {\n this.search.emit(val);\n }\n\n public blured(val:unknown):void {\n this.blur.emit(val);\n }\n\n public focused(val:unknown):void {\n this.focus.emit(val);\n }\n\n public cleared(val:unknown):void {\n this.clear.emit(val);\n }\n\n public keydowned(val:unknown):void {\n this.keydown.emit(val);\n }\n\n public added(val:unknown):void {\n this.add.emit(val);\n }\n\n public removed(val:unknown):void {\n this.remove.emit(val);\n }\n\n public scrolled(val:{ start:number; end:number }):void {\n this.scroll.emit(val);\n }\n\n public scrolledToEnd(val:unknown):void {\n this.scrollToEnd.emit(val);\n }\n\n public highlighting(property:string, id:string):string {\n return Highlighting.inlineClass(property, id);\n }\n\n private autocompleteInputStream():Observable {\n if (!this.typeahead) {\n return NEVER;\n }\n\n return this.typeahead.pipe(\n filter(() => !!(this.defaultData || this.getOptionsFn)),\n distinctUntilChanged(),\n debounceTime(250),\n tap(() => this.loading$.next(true)),\n switchMap((queryString:string) => {\n if (this.defaultData) {\n return this.opAutocompleterService.loadData(queryString, this.resource, this.filters, this.searchKey);\n }\n\n if (this.getOptionsFn) {\n return this.getOptionsFn(queryString);\n }\n\n return NEVER;\n }),\n tap(\n () => this.loading$.next(false),\n () => this.loading$.next(false),\n ),\n );\n }\n}\n","import { NgModule } from '@angular/core';\nimport { NgSelectModule } from '@ng-select/ng-select';\nimport {\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { DynamicModule } from 'ng-dynamic-component';\nimport { CommonModule } from '@angular/common';\nimport { DragulaModule } from 'ng2-dragula';\n\nimport { InviteUserButtonModule } from 'core-app/features/invite-user-modal/button/invite-user-button.module';\nimport { OpenprojectPrincipalRenderingModule } from 'core-app/shared/components/principal/principal-rendering.module';\n\nimport { DraggableAutocompleteComponent } from 'core-app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component';\nimport { ColorsAutocompleterComponent } from 'core-app/shared/components/colors/colors-autocompleter.component';\nimport { WorkPackageAutocompleterComponent } from 'core-app/shared/components/autocompleter/work-package-autocompleter/wp-autocompleter.component';\nimport { TimeEntryWorkPackageAutocompleterComponent } from 'core-app/shared/components/autocompleter/te-work-package-autocompleter/te-work-package-autocompleter.component';\nimport { AutocompleteSelectDecorationComponent } from 'core-app/shared/components/autocompleter/autocomplete-select-decoration/autocomplete-select-decoration.component';\nimport { VersionAutocompleterComponent } from 'core-app/shared/components/autocompleter/version-autocompleter/version-autocompleter.component';\nimport { UserAutocompleterComponent } from 'core-app/shared/components/autocompleter/user-autocompleter/user-autocompleter.component';\nimport { ProjectAutocompleterComponent } from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocompleter.component';\nimport { OpAutocompleterComponent } from 'core-app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component';\nimport { OpAutocompleterOptionTemplateDirective } from 'core-app/shared/components/autocompleter/op-autocompleter/directives/op-autocompleter-option-template.directive';\nimport { OpAutocompleterLabelTemplateDirective } from 'core-app/shared/components/autocompleter/op-autocompleter/directives/op-autocompleter-label-template.directive';\nimport { OpAutocompleterHeaderTemplateDirective } from 'core-app/shared/components/autocompleter/op-autocompleter/directives/op-autocompleter-header-template.directive';\nimport { CreateAutocompleterComponent } from 'core-app/shared/components/autocompleter/create-autocompleter/create-autocompleter.component';\nimport { OpAutocompleterFooterTemplateDirective } from 'core-app/shared/components/autocompleter/autocompleter-footer-template/op-autocompleter-footer-template.directive';\nimport { OpSearchHighlightDirective } from 'core-app/shared/directives/search-highlight.directive';\n\nexport const OPENPROJECT_AUTOCOMPLETE_COMPONENTS = [\n CreateAutocompleterComponent,\n VersionAutocompleterComponent,\n WorkPackageAutocompleterComponent,\n TimeEntryWorkPackageAutocompleterComponent,\n DraggableAutocompleteComponent,\n UserAutocompleterComponent,\n ProjectAutocompleterComponent,\n ColorsAutocompleterComponent,\n AutocompleteSelectDecorationComponent,\n OpAutocompleterComponent,\n OpAutocompleterOptionTemplateDirective,\n OpAutocompleterLabelTemplateDirective,\n OpAutocompleterHeaderTemplateDirective,\n OpAutocompleterFooterTemplateDirective,\n OpSearchHighlightDirective,\n];\n\n@NgModule({\n imports: [\n CommonModule,\n NgSelectModule,\n DragulaModule,\n FormsModule,\n ReactiveFormsModule,\n\n DynamicModule.withComponents(OPENPROJECT_AUTOCOMPLETE_COMPONENTS),\n OpenprojectPrincipalRenderingModule,\n InviteUserButtonModule,\n ],\n exports: OPENPROJECT_AUTOCOMPLETE_COMPONENTS,\n declarations: OPENPROJECT_AUTOCOMPLETE_COMPONENTS,\n})\nexport class OpenprojectAutocompleterModule { }\n","import { IProjectAutocompleteItem, IProjectAutocompleteItemTree } from './project-autocomplete-item';\n\nexport const flattenProjectTree = (\n projectTreeItems:IProjectAutocompleteItemTree[],\n depth = 0,\n):IProjectAutocompleteItem[] => projectTreeItems.reduce(\n (fullList, projectTreeItem) => [\n ...fullList,\n {\n ...projectTreeItem,\n numberOfAncestors: depth,\n // The actual list of ancestors does not matter anymore from this point forward,\n // but to keep typing straightforward for consumers of this component that use mapResultsFn,\n // it is marked as required in the interface.\n ancestors: [],\n },\n ...flattenProjectTree(projectTreeItem.children, depth + 1),\n ],\n [],\n);\n","import { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport {\n IProjectAutocompleteItem,\n IProjectAutocompleteItemTree,\n} from './project-autocomplete-item';\n\nconst insertProjectWithAncestors = (\n tree:IProjectAutocompleteItemTree[],\n project:IProjectAutocompleteItem,\n ancestors:IHalResourceLink[],\n):IProjectAutocompleteItemTree[] => {\n // The project has no ancestors, thus it can become a part of the tree right away.\n if (!ancestors.length) {\n return [\n ...tree,\n {\n ...project,\n children: [],\n },\n ];\n }\n\n const ancestorToFind = ancestors[0];\n const ancestorInTree = tree.find((leaf) => leaf.href === ancestorToFind.href);\n\n if (ancestorInTree) {\n return tree.map((item) => (item === ancestorInTree\n ? { ...item, children: insertProjectWithAncestors(item.children, project, ancestors.slice(1)) }\n : { ...item }));\n }\n\n return [\n ...tree,\n {\n id: idFromLink(ancestorToFind.href),\n name: ancestorToFind.title,\n href: ancestorToFind.href,\n disabled: true,\n children: insertProjectWithAncestors([], project, ancestors.slice(1)),\n },\n ];\n};\n\nexport const buildTree = (\n projects:IProjectAutocompleteItem[],\n):IProjectAutocompleteItemTree[] => projects.reduce(\n // The ancestors are listed from direct parent up to root. We'll build a tree structure for these ancestors here.\n // Some might already exist from other children that added them to the tree, or because they were part of the result\n // list themselves. However, if they're not available yet we'll need to generate them.\n (tree, project) => insertProjectWithAncestors(tree, project, project.ancestors),\n [],\n);\n","import { IProjectAutocompleteItemTree } from './project-autocomplete-item';\n\n// Recursively sort project children and their children by name\nexport const recursiveSort = (projects:IProjectAutocompleteItemTree[]):IProjectAutocompleteItemTree[] => projects\n .map((project) => ({\n ...project,\n children: recursiveSort(project.children),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n","\n \n {{ item.name }}\n \n\n \n {{ item.name }}\n {{ item.disabledReason }}\n \n\n\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { merge, Observable, of } from 'rxjs';\nimport { map, switchMap } 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 //