{"version":3,"file":"main.a4311dc8a1f090d6.js","mappings":"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qDAEA,4BACA,MACA,oDACA,uDAEA,oBACA,MACA,oDACA,uDAEA,wBACA,MACA,oDACA,mDAEA,oBACA,MACA,oDACA,+CAEA,oBACA,MACA,oDACA,+CAEA,kCACA,MACA,oDACA,UAEA,8BACA,KACA,oDACA,yDAEA,wBACA,MACA,oDACA,mDAEA,gBACA,MACA,oDACA,mDAEA,sBACA,MACA,oDACA,iDAEA,YACA,MACA,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,iDACA2lJ,UAEA,CACA2rF,0BACAA,WACA7hL,uBCnqBA,cACA,8CACA,gCACAzvD,CACA,CACAuxO,cACAA,YACAA,WACA9hL,4BCRAA,sBAAkCk2F,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,gCACA3lJ,EAEA,WACA,CACAwxO,kBACA,qBACA,EACAA,YACA/hL,YACA+hL,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,gCACAxxO,IAIA,kBACA,iDACA2lJ,eAEA,CACA2rF,0BACAA,WACA7hL,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,gCACAzvD,IAIA,kBACA,0BACA2lJ,UAEA,CACA2rF,0BACAA,WACA7hL,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,gCACAzvD,IAIA,kBACA,0BACA2lJ,UAEA,CACA2rF,0BACAA,WACA7hL","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","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","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","Date","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","p","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","H","positionSwap","myPosition","neighbor","neighborPosition","insertAsFirst","successorPosition","se","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","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","V","formattedResourcesModel","resourceKey","resourceModel","formattedResourceModel","resourceElement","formatModelToEdit","metaModel","otherElements","otherElementsModel","isValue","getFormattedResourcesModel","_d","formErrors","getAllFormValidationErrors","formControlKeys","keysToValidate","K","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 const formatted = moment(date).format('YYYY-MM-DD');\n if (date && (this.weekdayService.isNonWorkingDay(date) || 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 { WorkPackagesActivityService } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/wp-activity.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { OpenProjectFileUploadService } from 'core-app/core/file-upload/op-file-upload.service';\nimport { AttachmentCollectionResource } from 'core-app/features/hal/resources/attachment-collection-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { TypeResource } from 'core-app/features/hal/resources/type-resource';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { FormResource } from 'core-app/features/hal/resources/form-resource';\nimport { Attachable } from 'core-app/features/hal/resources/mixins/attachable-mixin';\nimport { ICKEditorContext } from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\nexport interface WorkPackageResourceEmbedded {\n activities:CollectionResource;\n ancestors:WorkPackageResource[];\n assignee:HalResource|any;\n attachments:AttachmentCollectionResource;\n fileLinks?:CollectionResource;\n author:HalResource|any;\n availableWatchers:HalResource|any;\n category:HalResource|any;\n children:WorkPackageResource[];\n parent:WorkPackageResource|null;\n priority:HalResource|any;\n project:HalResource|any;\n relations:CollectionResource;\n responsible:HalResource|any;\n revisions:CollectionResource|any;\n status:HalResource|any;\n timeEntries:HalResource[]|any[];\n type:TypeResource;\n version:HalResource|any;\n watchers:CollectionResource;\n // For regular work packages\n startDate:string;\n dueDate:string;\n // Only for milestones\n date:string;\n relatedBy:RelationResource|null;\n scheduleManually:boolean;\n}\n\nexport interface WorkPackageResourceLinks extends WorkPackageResourceEmbedded {\n addAttachment(attachment:HalResource):Promise;\n\n addChild(child:HalResource):Promise;\n\n addComment(comment:unknown, headers?:any):Promise;\n\n addRelation(relation:any):Promise|undefined;\n\n addWatcher(watcher:HalResource):Promise;\n\n changeParent(params:any):Promise;\n\n copy():Promise;\n\n delete():Promise;\n\n logTime():Promise;\n\n move():Promise;\n\n removeWatcher():Promise;\n\n self():Promise;\n\n update(payload:any):Promise>;\n\n updateImmediately(payload:any):Promise;\n\n watch():Promise;\n}\n\nexport interface WorkPackageLinksObject extends WorkPackageResourceLinks {\n schema:HalResource;\n}\n\nexport class WorkPackageBaseResource extends HalResource {\n public $embedded:WorkPackageResourceEmbedded;\n\n public $links:WorkPackageLinksObject;\n\n public subject:string;\n\n public updatedAt:Date;\n\n public lockVersion:number;\n\n public description:any;\n\n public activities:CollectionResource;\n\n public attachments:AttachmentCollectionResource;\n\n @InjectField() I18n!:I18nService;\n\n @InjectField() states:States;\n\n @InjectField() wpActivity:WorkPackagesActivityService;\n\n @InjectField() apiV3Service:ApiV3Service;\n\n @InjectField() ToastService:ToastService;\n\n @InjectField() workPackageNotificationService:WorkPackageNotificationService;\n\n @InjectField() pathHelper:PathHelperService;\n\n @InjectField() opFileUpload:OpenProjectFileUploadService;\n\n readonly attachmentsBackend = true;\n\n /**\n * Return the ids of all its ancestors, if any\n */\n public get ancestorIds():string[] {\n const { ancestors } = this as any;\n return ancestors.map((el:WorkPackageResource) => el.id!);\n }\n\n /**\n * Return \": (#)\" if type and id are known.\n */\n public subjectWithType(truncateSubject = 40):string {\n const type = this.type ? `${this.type.name}: ` : '';\n const subject = this.subjectWithId(truncateSubject);\n\n return `${type}${subject}`;\n }\n\n /**\n * Return \" (#)\" if the id is known.\n */\n public subjectWithId(truncateSubject = 40):string {\n const id = isNewResource(this) ? '' : ` (#${this.id})`;\n const subject = _.truncate(this.subject, { length: truncateSubject });\n\n return `${subject}${id}`;\n }\n\n public get isLeaf():boolean {\n const { children } = this.$links;\n return !(children && children.length > 0);\n }\n\n public previewPath() {\n if (!isNewResource(this)) {\n return this.apiV3Service.work_packages.id(this.id!).path;\n }\n return super.previewPath();\n }\n\n public getEditorContext(fieldName:string):ICKEditorContext {\n return {\n type: fieldName === 'description' ? 'full' : 'constrained',\n macros: false,\n ...(fieldName.startsWith('customField') && { disabledMentions: ['user'] }),\n };\n }\n\n public isParentOf(otherWorkPackage:WorkPackageResource) {\n return otherWorkPackage.parent?.$links.self.$link.href === this.$links.self.$link.href;\n }\n\n /**\n * Invalidate a set of linked resources of this work package.\n * And inform the cache service about the work package update.\n *\n * Return a promise that returns the linked resources as properties.\n * Return a rejected promise, if the resource is not a property of the work package.\n */\n public updateLinkedResources(...resourceNames:string[]):Promise {\n const resources:{ [id:string]:Promise } = {};\n\n resourceNames.forEach((name) => {\n const linked = this[name];\n resources[name] = linked ? linked.$update() : Promise.reject(undefined);\n });\n\n const promise = Promise.all(_.values(resources));\n promise.then(() => {\n this.wpCacheService.touch(this.id!);\n });\n\n return promise;\n }\n\n public $initialize(source:any) {\n super.$initialize(source);\n\n const attachments:any = this.attachments || { $source: {}, elements: [] };\n this.attachments = new AttachmentCollectionResource(\n this.injector,\n // Attachments MAY be an array if we're building from a form\n _.get(attachments, '$source', attachments),\n false,\n this.halInitializer,\n 'HalResource',\n );\n }\n\n /**\n * Exclude the schema _link from the linkable Resources.\n */\n public $linkableKeys():string[] {\n return _.without(super.$linkableKeys(), 'schema');\n }\n\n /**\n * Return the associated state to this HAL resource, if any.\n */\n public get state():InputState {\n return this.states.workPackages.get(this.id!) as any;\n }\n\n /**\n * Update the state\n */\n public push(newValue:this):Promise {\n this.wpActivity.clear(newValue.id);\n\n // If there is a parent, its view has to be updated as well\n if (newValue.parent) {\n this.apiV3Service.work_packages.id(newValue.parent).refresh();\n }\n\n return this.apiV3Service.work_packages.cache.updateWorkPackage(newValue as any);\n }\n}\n\nexport const WorkPackageResource = Attachable(WorkPackageBaseResource);\n\nexport interface WorkPackageResource extends WorkPackageBaseResource, WorkPackageResourceLinks, WorkPackageResourceEmbedded {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 .utc()\n .startOf('day');\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 .utc()\n .endOf('day');\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
    \n \n \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(20));\n\n // Preselect this work package for future list operations\n this.showStaticPagePath = this.PathHelper.workPackagePath(this.workPackageId);\n\n // Fetch attachments of current work package\n const attachments = this.workPackage.attachments as unknown&{ href:string };\n this.attachmentsResourceService.fetchAttachments(attachments.href).subscribe();\n\n if (this.workPackage.$links.fileLinks) {\n this.fileLinkResourceService\n .updateCollectionsForWorkPackage(this.workPackage.$links.fileLinks.href as string)\n .pipe(\n this.untilDestroyed(),\n switchMap(() => this.projectsResourceService.lookup((this.workPackage.project as unknown&{ id:string }).id)),\n 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 { Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { ID } from '@datorama/akita';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport {\n ApiV3ListFilter,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\n\nimport { IProjectAutocompleteItem } from './project-autocomplete-item';\nimport { flattenProjectTree } from './flatten-project-tree';\nimport { getPaginatedResults } from 'core-app/core/apiv3/helpers/get-paginated-results';\nimport { IProject } from 'core-app/core/state/projects/project.model';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { buildTree } from 'core-app/shared/components/autocompleter/project-autocompleter/insert-in-list';\nimport { recursiveSort } from 'core-app/shared/components/autocompleter/project-autocompleter/recursive-sort';\n\nexport const projectsAutocompleterSelector = 'op-project-autocompleter';\n\nexport interface IProjectAutocompleterData {\n id:ID;\n href:string;\n name:string;\n}\n\n@Component({\n templateUrl: './project-autocompleter.component.html',\n styleUrls: ['./project-autocompleter.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n selector: projectsAutocompleterSelector,\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ProjectAutocompleterComponent),\n multi: true,\n }],\n})\nexport class ProjectAutocompleterComponent implements ControlValueAccessor {\n @HostBinding('class.op-project-autocompleter') public className = true;\n\n @HostBinding('class.op-project-autocompleter_inline')\n public get inlineClass():boolean {\n return this.isInlineContext;\n }\n\n projectTracker = (item:IProjectAutocompleteItem):ID => item.href || item.id;\n\n // Load all projects as default\n @Input() public url:string = this.apiV3Service.projects.path;\n\n @Input() public name = '';\n\n @Input() public focusDirectly = false;\n\n @Input() public openDirectly = false;\n\n @Input() public multiple = false;\n\n @Input() public dropdownPosition:'bottom'|'top'|'auto' = 'auto';\n\n // ID that should be set on the input HTML element. It is used with\n //