{"version":3,"file":"main.037779936c7e57b0.js","mappings":"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,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,iDACA2mJ,UAEA,CACAksF,0BACAA,WACA3iL,uBCnqBA,cACA,8CACA,gCACAlwD,CACA,CACA8yO,cACAA,YACAA,WACA5iL,4BCRAA,sBAAkCy2F,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,gCACA3mJ,EAEA,WACA,CACA+yO,kBACA,qBACA,EACAA,YACA7iL,YACA6iL,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,gCACA/yO,IAIA,kBACA,iDACA2mJ,eAEA,CACAksF,0BACAA,WACA3iL,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,gCACAlwD,IAIA,kBACA,0BACA2mJ,UAEA,CACAksF,0BACAA,WACA3iL,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,gCACAlwD,IAIA,kBACA,0BACA2mJ,UAEA,CACAksF,0BACAA,WACA3iL","names":["ActiveWindowService","constructor","document","this","BehaviorSubject","addEventListener","visibilityState","debugLog","activeState$","next","isActive","value","active$","asObservable","_angular_core__WEBPACK_IMPORTED_MODULE_2__","DOCUMENT","factory","ApiV3GridPaths","ApiV3GettableResource","subResource","ApiV3GridForm","patch","resource","schema","payload","form","extractPayload","halResourceService","path","delete","ApiV3GridsPaths","ApiV3ResourceCollection","apiRoot","basePath","super","list","params","get","listParamsString","post","ApiV3Resource","createCache","requireAndStream","force","id","toString","cache","stale","observable","load","pipe","take","shareReplay","clearAndLoad","concat","state","values$","observe","refresh","toPromise","switchMap","$links","schemaCache","href","mapTo","of","touch","updateFor","cacheResponse","source$","tap","__decorate","InjectField","tslib_es6","States","SchemaCacheService","ApiV3TimeEntryPaths","ApiV3FormResource","clearSome","parent","HalResource","HalPayloadHelper","ApiV3Collection","observeAll","response","CollectionResource","_a","elements","forEach","bind","TimeEntryCacheService","StateCacheService","injector","updateValue","val","ensureLoaded","then","putValue","ApiV3TimeEntriesPaths","states","timeEntries","ApiV3CapabilityPaths","ApiV3CapabilitiesPaths","ApiV3AvailableProjectsPaths","exists","projectId","filters","ApiV3Filter","toJson","map","collection","count","ApiV3MembershipsForm","static","_links","project","principal","roles","role","_meta","notificationMessage","raw","request","ApiV3MembershipsPaths","ApiV3UserPreferencesPaths","ApiV3ResourcePath","http","withCredentials","responseType","HttpClient","ApiV3UserPaths","users","ApiV3UsersPaths","ApiV3TypePaths","ApiV3TypesPaths","types","ApiV3QueryOrder","SimpleResource","result","update","delta","t","wpIds","ApiV3QueryForm","query","name","queries","withOptionalId","queryFilters","setSchemas","$embedded","filtersSchemas","buildQueryResource","loadWithParams","queryId","projectIdentifier","projects","URI","search","createHalResourceOfType","QueryFiltersService","ApiV3QueryPaths","parameterised","QueryResource","mapSchemasIntoFilters","paginated","pagination","ApiV3QueriesPaths","find","queryData","withOptionalProject","default","toggleStarred","starred","unstar","star","ApiV3RelationsPaths","loadInvolved","workPackageIds","validIds","_","filter","test","length","from","filtered","getPaginatedResults","ApiV3WorkPackageForm","forTypePayload","type","forPayload","ApiV3WorkPackagePaths","WorkPackageCache","schemaCacheService","updateWorkPackage","wp","immediate","isNewResource","updateWorkPackageList","skipOnIdentical","i","workPackageId","multiState","hasValue","isEqual","$source","core","ApiV3WorkPackageCachedSubresource","schemas","updateSchemas","ApiV3WorkPackagesPaths","requireAll","ids","Promise","resolve","reject","loadCollectionsFor","uniq","pagedResults","each","results","undefined","filterByTypeaheadOrId","term","idOnly","additionalParams","ApiV3FilterBuilder","add","Object","sortBy","offset","pageSize","filterUpdatedSince","timestamp","n","getAllPaginated","workPackages","ApiV3VersionPaths","version","versions","ApiV3VersionsPaths","ApiV3ProjectCopyPaths","ApiV3ProjectPaths","ProjectCache","ApiV3ProjectsPaths","ApiV3StatusPaths","statuses","ApiV3StatusesPaths","ApiV3RolePaths","ApiV3RolesPaths","ApiV3NewsPaths","ApiV3HelpTextsPaths","ApiV3ConfigurationPath","$configuration","Board","grid","editable","updateImmediately","isFree","isAction","options","actionAttribute","attribute","highlightingMode","addQuery","widget","isNewWidget","widgets","push","removeQuery","el","createdAt","sortWidgets","sort","a","b","startColumn","showStatusButton","ApiV3BoardPath","grids","newBoard","save","board","fetchSchema","ApiV3BoardsPaths","authorisationService","initModelAuth","allInScope","boardPath","MAGIC_PAGE_NUMBER","create","scope","createGrid","PathHelper","projectBoardsPath","forType","set","AuthorisationService","PathHelperService","ApiV3PlaceholderUserPaths","ApiV3PlaceholderUsersPaths","ApiV3GroupPaths","ApiV3GroupsPaths","ApiV3NotificationPaths","markRead","markUnread","ApiV3NotificationsPaths","facet","unread","listPath","additional","markAsReadByIds","markAsReadByFilter","f","ApiV3ViewsPaths","view","Apiv3BackupsPath","backupToken","includeAttachments","attachments","ApiV3DayPaths","ApiV3DaysPaths","Apiv3StoragesPaths","ApiV3Service","pathHelper","apiV3CollectionEndpoint","apiV3CustomEndpoint","apiV3SingularEndpoint","isNil","collectionFromString","fullPath","replace","api","v3","apiV3Base","segment","cls","holdValuesForSeconds","cacheDurationInMs","current","fallback","getValueOr","loader","share","clearAndPutFromPromise","changes$","observeChange","startWith","auditTime","mapped","clear","hasActivePromiseRequest","isPristine","isValueOlderThan","startRow","endRow","endColumn","identifier","addFiltersToPath","url","URL","window","location","origin","searchParams","has","existingFilters","JSON","parse","stringify","keys","key","getPaginatedCollections","mergeMap","resolvedSize","total","remaining","pagesRemaining","Math","ceil","calls","Array","fill","forkJoin","reduce","acc","extractCollectionElements","_embedded","queryProps","groupBy","select","join","filterParam","toParams","queryPropsString","tslib__WEBPACK_IMPORTED_MODULE_4__","HalResourceService","ApiV3GettableResourceCollection","pageParams","SimpleResourceCollection","input","toPath","resourceClass","pathname","signalled","separator","startsWith","BrowserDetector","documentElement","isMobile","hasBodyClass","isEdge","body","classList","contains","_angular_core__WEBPACK_IMPORTED_MODULE_0__","DeviceService","innerWidth","mobileWidthTreshold","ConfigurationService","I18n","apiV3Service","initialized","loadConfiguration","catch","commentsSortedInDescendingOrder","userPreference","warnOnLeavingUnsaved","autoHidePopups","isTimezoneSet","timezone","isDirectUploads","prepareAttachmentURL","configuration","maximumAttachmentFileSize","systemPreference","perPageOptions","dateFormatPresent","dateFormat","timeFormatPresent","timeFormat","startOfWeekPresent","startOfWeek","moment","locale","firstDayOfWeek","hostName","activeFeatureFlags","pref","_angular_core__WEBPACK_IMPORTED_MODULE_3__","CurrentProjectService","detect","inProjectContext","projectPath","apiv3Path","getCurrent","element","querySelector","dataset","projectName","CurrentUserModule","bootstrapModule","currentUserService","CurrentUserService","ErrorReporter","addHook","user$","user","userMeta","querySelectorAll","setUser","mail","_angular_core__WEBPACK_IMPORTED_MODULE_4__","CurrentUserStore","CurrentUserQuery","Query","store","currentUserStore","currentUserQuery","capabilitiesService","isLoggedIn$","setupLegacyDataListeners","capabilities$","actions","projectContext","principalFilter$","userFilter","require","hasCapabilities$","action","castArray","capabilities","contextAction","cap","endsWith","distinctUntilChanged","hasAnyCapabilityOf$","actionsToFilter","subscribe","_user","isLoggedIn","_isLoggedIn","userId","language","_angular_core__WEBPACK_IMPORTED_MODULE_9__","Store","tslib__WEBPACK_IMPORTED_MODULE_2__","StoreConfig","TimezoneService","configurationService","setupLocale","parseDatetime","datetime","format","d","local","tz","parseDate","date","parseISODatetime","parseISODate","formattedDate","getDateFormat","daysFromToday","dateString","today","startOf","diff","formattedTime","datetimeString","getTimeFormat","formattedDatetime","c","formattedDatetimeComponents","formattedRelativeDateTime","fromNow","toHours","durationString","Number","asHours","toFixed","toDays","asDays","toISODuration","unit","toIsoString","formattedDuration","formattedISODate","formattedISODateTime","isValidISODate","isValid","isValidISODateTime","dateTime","WeekdayService","isNonWorkingDay","isoDayOfWeek","isoWeekday","weekdays","wd","day","working","nonWorkingDays","loadWeekdays","weekdaysService","_angular_core__WEBPACK_IMPORTED_MODULE_6__","tslib__WEBPACK_IMPORTED_MODULE_7__","WeekdayResourceService","BannersService","_banners","eeShowBanners","getEnterPriseEditionUrl","referrer","hash","enterpriseEditionUrl","conditional","bannersVisible","bannersNotVisible","callMaybe","func","_angular_core__WEBPACK_IMPORTED_MODULE_1__","OpenProjectDirectFileUploadService","OpenProjectFileUploadService","uploadSingle","file","method","getDirectUploadFormFrom","uploadToExternal","append","customName","headers","EXTERNAL_REQUEST_HEADER","reportProgress","finishUpload","event","HttpResponse","_c","_b","completeUpload","fileName","contentType","getType","formData","FormData","metadata","description","fileSize","size","addAttachment","form_fields","halResource","uploadAndMapResponse","files","uploads","finished","upload","uploadUrl","staticDownloadLocation","whenFinished","promises","evt","HttpEventType","createHalResource","all","_angular_core__WEBPACK_IMPORTED_MODULE_5__","GonService","gon","titlePartsSeparator","OpTitleService","titleService","getTitle","titleParts","split","setFirstPart","parts","setTitle","prependFirstPart","unshift","I18nService","i18n","lookup","toTime","toNumber","toPercentage","toCurrency","strftime","toHumanSize","withLoadingIndicator","indicator","delayStopTime","start","delayedStop","stop","withDelayedLoadingIndicator","setTimeout","LoadingIndicator","promise","stopper","prepend","indicatorTemplate","time","remove","LoadingIndicatorService","table","wpDetails","modal","getter","getIndicatorAt","jQuery","MainMenuToggleService","deviceService","getElementsByTagName","titleData","changeData","initializeMenu","mainMenu","elementWidth","parseInt","OpenProject","guardedLocalStorage","localStorageKey","menuCollapsed","localStorageStateKey","closeMenu","setWidth","saveWidth","offsetWidth","currentProject","hasClass","defaultWidth","closeWhenOnMobile","toggleNavigation","stopPropagation","preventDefault","showNavigation","savedWidth","widthToSave","elementMinWidth","first","focus","blur","width","String","maxMenuWidth","snapBack","setToggleTitle","toggleClassHidden","global","htmlNode","style","setProperty","changeEvent","Event","toggleTitle","hideElements","toggleClass","tslib__WEBPACK_IMPORTED_MODULE_6__","modelName","modelLinks","links","doModify","observeUntil","unsubscribe","takeUntil","can","cannot","ApiV3Paths","openApiSpecPath","previewMarkup","context","base","principals","appBasePath","staticBase","attachmentDownloadPath","attachmentIdentifier","slug","attachmentContentPath","fileLinksPath","ifcModelsPath","ifcModelsNewPath","ifcModelsEditPath","modelId","ifcModelsDeletePath","bimDetailsPath","viewpoint","highlightingCssPath","forumPath","forumIdentifier","projectForumPath","keyboardShortcutsHelpPath","messagePath","messageIdentifier","myPagePath","myNotificationsSettingsPath","newsPath","newsId","notificationsPath","loginPath","projectsPath","projectsNewPath","projectActivityPath","projectCalendarPath","projectMembershipsPath","projectNewsPath","projectTimeEntriesPath","projectWikiPath","projectWorkPackagePath","wpId","projectWorkPackagesPath","projectWorkPackageNewPath","projectDashboardsPath","timeEntriesPath","suffix","workPackagePath","usersPath","groupsPath","placeholderUsersPath","userPath","placeholderUserPath","groupPath","rolesPath","rolePath","versionsPath","versionEditPath","versionShowPath","workPackagesPath","workPackageCopyPath","workPackageDetailsCopyPath","workPackagesBulkDeletePath","textFormattingHelp","FirstRouteService","isEmpty","setIfFirst","stateName","stateKey","Error","_type","WorkPackageSchemaProxy","SchemaProxy","getSchemaHref","loadAll","hrefs","_angular_core__WEBPACK_IMPORTED_MODULE_7__","contactUrl","en","de","pricingUrl","enterpriseDocsUrl","website","boards","tableHighlighting","graphWidgets","DynamicBootstrapper","defs","optionalBoostrapComponents","appRef","doc","definitions","performBootstrap","embeddable","root","embedded","selector","target","closest","bootstrap","setAttribute","demoProjectName","scrumDemoProjectName","onboardingTourStorageKey","ProjectName","matchingFilter","filterFunction","waitForElement","containerSelector","execFunction","container","initial","MutationObserver","mutations","observerInstance","matches","disconnect","childList","subtree","demoProjectsLinks","demoProjects","demoProjectsLink","scrumDemoProjectsLink","preventClickHandler","e","$","_i","tree","selectedPage","data","selected","scrollIntoView","on","toggle","which","GlobalHelpers","checkAll","checked","toggleCheckboxesBySelector","boxes","all_checked","getPluginContext","pluginContext","urlRoot","attr","environment","edition","isStandardEdition","isBimEdition","newValue","localStorage","getItem","setItem","console","error","ActionsService","Subject","ofType","actions$","dispatch","AttachmentsStore","EntityStore","createInitialCollectionState","AttachmentsResourceService","ResourceCollectionService","requireCollection","getValue","collections","fetchAttachments","attachmentsSelfLink","insertCollectionIntoState","catchError","toastService","addError","removeAttachment","collectionKey","attachment","HttpHeaders","removeEntityFromCollectionAndState","attachFiles","getAttachmentsSelfLink","HAL_NEW_RESOURCE_ID","getUploadTarget","isDirectUpload","getDirectUploadLink","addAttachments","uploadHref","uploadAttachments","applyTransaction","E","directFileUploadService","fileUploadService","message","notification","addAttachmentUpload","prepareAttachment","createStore","ToastService","CapabilitiesStore","CapabilitiesResourceService","require$","collectionExists","collectionLoading","loadedCollection","fetchCapabilities","loadedCapabilities$","contextId","selectAll","fetchCollection","mapHALCollectionToIDCollection","loadingCollections","setCollectionLoading","collectionUrl","w","removeCollectionLoading","upsertMany","x","entityId","extendCollectionElementsWithId","idFromLink","self","DayStore","DayResourceService","days","isNonWorkingDay$","requireNonWorkingYear$","findIndex","endOf","requireNonWorkingYears$","end","collectionURL","finalize","WeekdayStore","selectHasCache","hasCache","EMPTY","fetchWeekdays","week","EffectHandlers","Symbol","EffectHandler","args","handlers","prototype","item","takeWhile","serviceDestroyed","instance","callback","call","ngOnDestroy","EffectCallback","service","property","descriptor","Map","FileLinksStore","FileLinksResourceService","file_links","updateCollectionsForWorkPackage","fileLinksSelfLink","fileLink","storage","group$","seed","fileLinks","fileLinkCollections","storageId","group","updateCollection","addFileLinks","addFileLinksHref","filesToLink","originData","newFileLinks","k","link","NOTIFICATIONS_MAX_SIZE","markNotificationsAsRead","props","markNotificationsAsReadByFilters","notificationsMarkedRead","notificationCountIncreased","centerUpdatedInPlace","InAppNotificationsStore","InAppNotificationsResourceService","inAppNotification","markAsRead","notifications","readIAN","isDefinedEntity","entity","isNotNull","PrincipalsStore","PrincipalsResourceService","fetchUser","fetchPrincipals","ProjectsStore","ProjectsResourceService","QueryEntity","collectionState","selectMany","selectEntity","lookupMany","hasEntity","omit","fetchResults","handleErrors","handleCollectionLoadingError","_collectionKey","_angular_core__WEBPACK_IMPORTED_MODULE_12__","StorageFilesStore","resettable","StorageFilesResourceService","httpClient","combineLatest","storageFiles","insert","uploadLink","reset","fileIds","parentId","p","StoragesStore","StoragesResourceService","storageLinks","storages","storageCollection","ViewsStore","ViewsResourceService","views","StatesGroup","multiInput","forResource","camelCase","backlogsPageComponentSelector","BacklogsPageComponent","ngOnInit","getElementById","hidden","selectors","BcfResourcePath","BcfResourceCollectionPath","BcfApiRequestService","config","HttpParams","encoder","URLParamsEncoder","fromObject","_request","deserialize","throwError","TypedJSON","BcfProjectResource","jsonMember","jsonObject","BcfTopicAuthorizationMap","jsonArrayMember","BcfTopicResource","preserveNull","deserializer","serializer","toISOString","BcfViewpointSelectionPath","bcfViewpointsService","BcfViewpointVisibilityPaths","BcfViewpointPaths","BcfViewpointCollectionPath","bcfViewpointService","BcfTopicPaths","bcfTopicService","BcfTopicCollectionPath","BcfExtensionResource","BcfExtensionPaths","bcfExtensionService","BcfProjectPaths","bcfProjectService","BcfApiService","bcfApiVersion","bcfApiBase","pathOrId","ViewerBridgeService","tslib__WEBPACK_IMPORTED_MODULE_3__","StateService","BcfPathHelperService","projectImportIssuePath","projectExportIssuesPath","snapshotPath","ViewpointsService","getViewPointResource","workPackage","index","viewpointHref","bcfViewpoints","bcfApi","getViewPoint$","viewpointResource","selection","visibility","components","deleteViewPoint$","work_packages","saveViewpoint$","projectLink","wpProjectId","topicUUID$","setBcfTopic$","viewpoint$","viewerBridge","getViewpoint$","topicUUID","topics","viewpoints","topicHref","bcfTopic","createBcfTopic$","wpPayload","convertBCF","guid","_angular_core__WEBPACK_IMPORTED_MODULE_10__","tslib__WEBPACK_IMPORTED_MODULE_11__","BcfThumbnailDisplayField","DisplayField","render","displayText","innerHTML","bcfPathHelper","BcfDetectorService","isBcfActivated","BcfAuthorizationService","authorized$","extension","authorizationMap","putFromPromiseIfPristine","extensions","includes","isAllowedTo","i0","BcfWpAttributeGroupComponent","UntilDestroyedMixin","bcfAuthorization","wpCreate","bcfViewer","cdRef","viewpointsService","bcf","add_viewpoint","show_viewpoint","delete_viewpoint","text_are_you_sure","notice_successful_create","notice_successful_delete","height","startIndex","image","thumbnailsColumns","thumbnailsAutoHide","thumbnailSize","imageAnimation","previewAnimation","previewCloseOnEsc","previewKeyboardNavigation","imageSize","imageArrowsAutoHide","thumbnailsMargin","thumbnailMargin","previewDownload","previewCloseOnClick","arrowPrevIcon","arrowNextIcon","closeIcon","downloadIcon","thumbnailActions","breakpoint","imagePercent","thumbnailsPercent","ngAfterViewInit","observeChanges","viewerVisible$","visible","viewerVisible","detectChanges","untilDestroyed","__awaiter","initialize","refreshViewpoints","viewAllowed","createAllowed","loadViewpointFromRoute","snapshotURL","setViewpointsOnGallery","showViewpoint","shouldShowViewer","currentViewerState","deleteViewpoint","confirm","text","addSuccess","gallery","preview","close","saveViewpoint","showIndex","selectViewpointInGallery","go","reload","shouldShowGroup","icon","onClick","titleText","galleryPreviewOpen","addClass","galleryPreviewClose","removeClass","show","onGalleryChanged","galleryOptions","setThumbnailProperties","galleryImages","small","medium","big","viewpointCount","dynamicThumbnailHeight","max","round","NgxGalleryComponent","BcfNewWpAttributeGroupComponent","observeCreation","onNewWorkPackage","observables","galleryViewpoints","viewPointItem","_workPackage","_index","newViewpoint","snapshot","snapshot_data","RevitBridgeService","revitMessageReceivedSource","RevitBridge","hookUpRevitListener","once","trackingId","newTrackingId","sendMessageToRevit","revitMessageReceived$","messageType","viewpointJson","messagePayload","hasOwnProperty","snapshot_type","sendMessageToOpenProject","messageString","trackingIdNumber","OpenprojectBcfModule","bootstrapCalled","DisplayFieldService","addFieldType","HookService","register","provide","useFactory","navigator","userAgent","IFCViewerService","deps","Injector","imports","OpSharedModule","NgxGalleryModule","XeokitServer","ifcModels","ifc_models","getProjects","done","_error","getProject","projectData","models","viewerContent","modelsLoaded","shown_models","viewerConfigs","getGeometry","attachmentId","xkt_attachment_ids","log","utils","newViewer","server","viewerUI","BIMViewer","loadProject","currentProjectService","inspectorVisible$","viewer","destroy","xeokitViewer","setKeyboardEnabled","saveBCFViewpoint","spacesVisible","reverseClippingPlanes","bitmaps","opts","updateCompositeObjects","loadBCFViewpoint","bcfCardsViewIdentifier","bcfViewerViewIdentifier","bcfSplitViewTableIdentifier","bcfSplitViewCardsIdentifier","bcfTableViewIdentifier","BcfViewService","WorkPackageQueryStateService","viewerBridgeService","querySpace","cards","splitTable","splitCards","hasChanged","displayRepresentation","applyToQuery","valueFromQuery","dr","BoardActionsRegistryService","bannersService","mapping","available","localizedName","disabled","BoardListsService","CurrentProject","filterJson","buildQueryRequest","public","writable","addFreeQuery","queryParams","freeBoardQueryFilter","source","createHalResourceOfClass","GridWidgetResource","manualSort","operator","values","_angular_core__WEBPACK_IMPORTED_MODULE_8__","BoardService","boardActions","boardsList","unnamed_board","action_board","unnamed_list","loadAllBoards","loadAllPromise","canManage","reorderWidgets","boardName","addInitialColumnsForAction","columnCount","CausedUpdatesService","causedUpdates","cacheValue","splice","updatedAt","TileViewComponent","EventEmitter","created","emit","NewBoardModalComponent","OpModalComponent","locals","elementRef","boardService","halNotification","loadingIndicatorService","boardActionRegistry","close_popup","free_board","free_board_text","free_board_title","board_type","action_board_text","select_attribute","select_board_type","placeholder","teaser_text","upgrade_to_ee_text","more_info_ee_link","cancel_button","initiateTiles","createBoard","createFree","createAction","imagePath","addIcon","addDescription","addText","addImage","inFlight","closeMe","board_id","isNew","handleRawError","tiles","OpModalLocalsToken","ctx","calendarRefreshRequest","OpCalendarService","weekdayService","dayService","resizeObserver","v","resizeObs","ResizeObserver","resize$","nativeElement","applyNonWorkingDay","utcDate","Date","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","formatted","OpWorkPackagesCalendarService","sanitizer","$state","wpTableFilters","wpListService","wpListChecksumService","urlParamsHelper","uiRouterGlobals","timezoneService","halEditing","wpTableSelection","contextMenuService","calendarService","calendarOptions","additionalOptions","defaultOptions","eventDate","isMilestone","warnOnTooManyResults","isStatic","tooManyResultsText","MAX_DISPLAYED","addNotice","requireNonWorkingDays","updateTimeframe","fetchInfo","areFiltersEmpty","startDate","endDate","urlParams","query_id","initializingWithQuery","initialQuery","generateQueryProps","initializingWithQueryProps","query_props","oldQueryProps","newQueryProps","dateFilter","defaultQueryProps","fromQueryParams","encodeQueryJsonParams","pp","pa","initialView","cview","dateEditable","schemaEditable","isAttributeEditable","isLeaf","scheduleManually","eventDurationEditable","getEndDateFromTimestamp","subtract","openSplitView","onlyWhenOpen","setSelection","splitViewRoute","tabIdentifier","openFullView","onCardClicked","isClickedWithModifier","onCardDblClicked","showEventContextMenu","uiStateLinkClass","handler","WorkPackageViewContextMenu","fixedWeekCount","firstDay","timeZone","headerToolbar","left","center","right","initialDate","datesSet","dates","updateDateParam","dayHeaderClassNames","dayCellClassNames","dayGridClassNames","slotLaneClassNames","slotLabelClassNames","o","hi","cdate","currentStart","custom","notify","updateDates","resizeInfo","dragged","extendedProps","changeset","edit","ignoreNonWorkingDays","duration","setValue","due","endStr","startStr","_angular_core__WEBPACK_IMPORTED_MODULE_28__","WorkPackagesCalendarPageComponent","PartitionedQuerySpacePageComponent","title","unsaved_title","component","WorkPackageFilterContainerComponent","OpProjectIncludeComponent","WorkPackageFilterButtonComponent","ZenModeButtonComponent","WorkPackageSettingsButtonComponent","containerClasses","inputs","hideTableOptions","setPartition","currentPartition","partition","staticQueryName","_query","loadInitialQuery","visibly","_firstPage","showLoading","WorkPackagesCalendarComponent","QueryParamListenerService","CALENDAR_ROUTES","redirectTo","WorkPackagesBaseComponent","dynamic","bodyClasses","baseRoute","makeSplitViewRoutes","WorkPackageSplitViewComponent","OpenprojectCalendarModule","UIRouterModule","OpenprojectWorkPackagesModule","OpenprojectTimeEntriesModule","OpenprojectFieldsModule","FullCalendarModule","ucCalendarElement","calendar","workPackagesCalendar","cannot_drag_to_non_working_day","debounceTime","ucCalendar","getApi","updateSize","stopAllSubscriptions","initializeCalendar","calendarEventsFunction","successCallback","alreadyLoaded","events","updateResults","currentWorkPackages$","buildHeader","eventSources","color","background","textColor","display","plugins","dayGridPlugin","interactionPlugin","selectable","handleDateClicked","eventResizableFromStart","eventDidMount","eventResize","toDate","revert","updateEvent","eventDrop","dropInfo","eventResizeStart","addBackgroundEventsForNonWorkingDays","eventResizeStop","removeBackgroundEvents","eventDragStart","dragInfo","eventDragStop","removeProperty","eventClick","calendarOptions$","openContextMenu","eventContainer","mapToCalendarEvents","exclusiveEnd","subject","durationEditable","allDay","className","info","showSave","wasNew","projectedResource","defaults","dueDate","reloadOnRefreshRequest","refetchEvents","addBackgroundEvents","_angular_core__WEBPACK_IMPORTED_MODULE_22__","FullCalendarComponent","ElementRef","tslib__WEBPACK_IMPORTED_MODULE_25__","WorkPackageViewFiltersService","WorkPackagesListService","IsolatedQuerySpace","DomSanitizer","HalResourceEditingService","HalResourceNotificationService","EEActiveTrialBase","label_email","label_expires_at","label_maximum_users","label_company","label_domain","label_starts_at","label_subscriber","text_expired","text_reprieve_days_left","localizeLink","EETrialFormComponent","formBuilder","eeTrialService","host","company","userData","Validators","first_name","last_name","email","domain","configuredHost","general_consent","newsletter_consent","link_terms","link_privacy","label_test_ee","label_first_name","label_last_name","domain_mismatch","privacy_policy","receive_newsletter","terms_of_service","checkMailField","trialForm","controls","errors","emailInvalid","EnterpriseTrialModalComponent","domSanitizer","button_submit","button_cancel","button_continue","heading_confirmation","heading_next_steps","heading_test_ee","quick_overview","observe$","status","cancelled","trustedEEVideoURL","trustedURL","formComponent","onSubmit","valid","addControl","UntypedFormControl","sendForm","startEnterpriseTrial","setStartTrialStatus","closeModal","confirmed","modalOpen","bypassSecurityTrustResourceUrl","EEActiveTrialComponent","Gon","subscriber","userData$","formatUserData","eeTrialKey","trialLink","baseUrlAugur","getUserDataFromAugur","retryConfirmation","getToken","userForm","EETrialWaitingComponent","confirmation_info","resend","resend_success","resend_warning","session_timeout","status_confirmed","status_label","status_waiting","ee_trial_key","savedDateStr","resendMail","resendLink","EnterpriseTrialStore","EnterpriseTrialService","invalid_email","errorResponse","taken_email","taken_domain","augur_url","tokenVersion","token_version","setMailSubmittedStatus","enterpriseTrial","saveTrialKey","addWarning","res","token_retrieved","saveToken","token","resendlink","trialKey","trial_key","enterprise_token","encoded_token","delay","retries","freeTrialButtonSelector","FreeTrialButtonComponent","opModalService","button_trial","openTrialModal","trialRequested","HalLink","requestMethod","templated","$fetch","$prepare","templateValues","clone","regexp","RegExp","$callable","linkFunc","extend","$link","OpenprojectHalModuleHelpers","cloneHalResourceCollection","$copy","cloneHalResource","initializeHalProperties","asHalResource","loaded","setupProperty","instanceName","sourceName","sourceObj","isObject","propName","setter","linkName","isArray","setSource","setupLinks","l","setupEmbedded","child","proxyProperties","$embeddableKeys","defineProperty","enumerable","configurable","setLinksAsProperties","$linkableKeys","items","createLinkedResource","ObservableArray","indexOf","setEmbeddedAsProperties","lazy","obj","idPart","pop","decodeURIComponent","isPersistedResource","OpenProjectHeaderInterceptor","intercept","req","handleAuthenticatedRequest","handleExternalRequest","clonedRequest","handle","csrf_token","newHeaders","HalAwareErrorHandler","ErrorHandler","internal_error","handleError","rejection","HalError","httpError","captureError","ErrorResource","errorMessages","captureException","HttpErrorResponse","captureMessage","WikiPageBaseResource","WikiPageResource","Attachable","MeetingContentBaseResource","MeetingContentResource","PostBaseResource","PostResource","TimeEntryResource","without","NewsResource","MembershipResource","GroupResource","RootResource","TypeResource","QueryOperatorResource","FormResource","getErrors","validationErrors","halInitializer","errorIdentifier","v3ErrorIdentifierMultipleErrors","isValidationError","HelpTextBaseResource","HelpTextResource","SchemaResource","availableAttributes","attributeFromLocalizedName","match","SchemaDependencyResource","forValue","dependencies","QueryFilterInstanceSchemaResource","availableOperators","allowedValues","allowedFilterValue","$initialize","_dependencies","dependency","getFilter","definesAllowedValues","QueryFilterInstanceResource","isValueRequired","isResourceValue","loadedAllowedValues","resultingSchema","staticSchema","dependentSchema","merge","some","WorkPackageCollectionResource","halResourceDefaultConfig","WorkPackage","WorkPackageResource","attrTypes","ancestors","children","relations","Activity","Relation","RelationResource","to","Schema","Type","Status","StatusResource","SchemaDependency","User","UserResource","Group","Collection","WorkPackageCollection","AttachmentCollection","AttachmentCollectionResource","Form","FormPayload","QueryFilterInstance","QueryFilterInstanceSchema","QueryFilter","QueryFilterResource","Root","QueryOperator","HelpText","CustomAction","CustomActionResource","WikiPage","MeetingContent","Post","Project","ProjectResource","Role","RoleResource","Grid","GridResource","GridWidget","TimeEntry","Membership","News","Version","VersionResource","OpenprojectHalModule","useClass","APP_INITIALIZER","initializeHalResourceConfig","registerResource","multi","CommonModule","updateElements","$load","isHalError","err","hasOwn","isMultiErrorMessage","getInvolvedAttributes","columns","details","flatten","extractMultiError","getMessagesPerAttribute","perAttribute","messages","GridBaseResource","widgetResource","updateAttachments","$update","$loaded","$halType","expectedResource","exec","retainFrom","other","__initialized_at","$plain","cloneDeep","$isHal","_name","previewPath","getEditorContext","fieldName","$loadResource","valuesPromise","$self","properties","tslib__WEBPACK_IMPORTED_MODULE_5__","Base","canAddAttachments","hasAttachments","lookupDownloadLocationByName","pull","attachmentsBackend","updateState","performUpload","r","ErrorEvent","directUploadURL","opDirectFileUpload","opFileUpload","macros","currentSchema","memoizedCurrentSchemas","isCompletelyDefined","findOperator","operatorSymbol","isTemplated","flag","newId","setSortBy","newSortBy","QUERY_SORT_BY_ASC","QUERY_SORT_BY_DESC","includeParentChild","includeParentchild","RELATION_TYPES","label","normalizedType","denormalized","relationType","targetId","reverseType","reverseRelationType","isInvolved","updateDescription","updateType","active_user_statuses","showUserPath","showUser","isLocked","isOpen","isClosed","WorkPackageBaseResource","ancestorIds","subjectWithType","truncateSubject","subjectWithId","truncate","disabledMentions","isParentOf","otherWorkPackage","updateLinkedResources","resourceNames","resources","linked","wpCacheService","wpActivity","tslib__WEBPACK_IMPORTED_MODULE_13__","WorkPackagesActivityService","WorkPackageNotificationService","extractPayloadFromSchema","nonLinkProperties","Proxy","receiver","proxyMethod","ofProperty","mappedName","isEditable","Reflect","propertySchema","apply","__","argumentsList","isReadonly","readonly","setPrototypeOf","HalEventsService","_events","aggregated$","resourceType","debounceTimeInMs","events$","buffer","resourceReference","isCreate","handleErrorResponse","errorBody","retrieveError","showGeneralError","retrieveErrorMessage","errorResource","showError","showApiErrorMessages","showCustomError","showEditingBlockedError","attributeName","i18nString","toLowerCase","_angular_core__WEBPACK_IMPORTED_MODULE_11__","tslib__WEBPACK_IMPORTED_MODULE_12__","HalResourceSortingService","halType","sortingProperty","hasSortingProperty","performRequest","whenDebugging","createErrorObservable","requestParams","toEprops","put","entry","defaultClass","getResourceClassOfType","fromLink","fromSelfLink","fromType","toType","getResourceClassOfAttribute","typeConfig","deflatedArray","Pako","eprops","base64","_angular_core__WEBPACK_IMPORTED_MODULE_13__","encodeKey","encodeURIComponent","encodeValue","decodeKey","decodeValue","IanBellQuery","unread$","pairwise","last","curr","IanBellStore","totalUnread","IanBellService","resourceService","unreadCountIncreased$","skip","fetchUnread","IAN_FACET_FILTERS","reloadOnNotificationRead","IanCenterStore","createInitialState","page","activeCollection","activeFacet","notLoaded","IanCenterService","hasFilters","params$","selectLoading","activeCollection$","defaultIfEmpty","selectNotifications$","aggregatedCenterNotifications$","notifications$","notLoaded$","setToLoading","setLoading","sideLoadInvolvedWorkPackages","pluck","stateChanged$","updateSelectedNotification","setFilters","onReload","setFacet","selectedNotification","goToCenter","markAllAsRead","openSplitScreen","showNextNotification","selectedNotificationIndex","checkForNewNotifications","allInOldCollection","activeReloadToast","activeID","compact","UIRouterGlobals","InAppNotificationStatusComponent","ngOnChanges","changes","highlightClass","Highlighting","currentValue","InAppNotificationActorsLineComponent","and","and_other_singular","and_other_plural","loading","mark_as_read","updated_by_at","age","buildActors","buildTime","text_for_additional_authors","number","fixedTime","relativeTime$","timer","actors","aggregatedNotifications","actor","uniqBy","InAppNotificationDateAlertComponent","work_package_is","overdue","overdue_since","difference_in_days","property_is","property_was","property_deleted","due_today","detail","deriveMostRelevantAlert","deriveDueDate","propertyText","alertText","dateValue","dateIsPast","isBefore","isOverdue","dateDiff","buildAlertText","daysDiff","daysText","reference","now","abs","dateAlerts","reason","InAppNotificationEntryComponent","storeService","activeReason$","dateAlertFiltered","buildTranslatedReason","buildProject","loadWorkPackage","workPackage$","showDetails","withLatestFrom","showDateAlert$","openDetailsTab","tab","projectClicked","reasons","translatedReason","defaultValue","translatedReasons","showUrl","InAppNotificationCenterComponent","bellService","apiV3","pathService","hasMoreThanPageSize$","hasNotifications$","loading$","newest_count","maxSize","more_count","reasonMenuItems","no_notification","no_selection","no_notification_with_current_filter_project","no_notification_with_current_filter","selectedFilter","change_notification_settings","button_close","no_results","at_all","with_current_filter","noNotificationText","hasNotifications","NotificationSettingsButtonComponent","mySettings","ActivateFacetButtonComponent","facets","facet_titles","activeFacet$","activateFacet","MarkAllAsReadButtonComponent","mark_all_read","markAllRead","InAppNotificationCenterPageComponent","$transitions","backRoutingService","documentReferer","setInitialHtmlTitle","removeTransitionSubscription","onSuccess","updateTitleName","_val","changeChangesFromTitle","currentTitleParts","InAppNotificationsDateAlertsUpsaleComponent","videoPath","video","__webpack_public_path__","IAN_ROUTES","OpenProjectInAppNotificationsModule","DynamicModule","IconModule","OpenprojectPrincipalRenderingModule","OpenprojectContentLoaderModule","ScrollingModule","InviteUserButtonModule","OpInviteUserModalService","open","InviteUserModalComponent","closingEvent","Steps","PrincipalType","ProjectSelection","customFields","markForCheck","onProjectSelectionSave","goTo","Principal","onPrincipalSave","principalData","isAlreadyMember","closeWithPrincipal","Summary","onSuccessfulSubmission","$event","createdNewPrincipal","Success","step","JobStatusModalComponent","loadingIndicator","sanitization","closePopup","redirect","redirect_errors","redirect_link","download_starts","click_to_download","jobId","listenOnJobStatus","continuedStatus","onResponse","isLoading","iconForStatus","handleRedirect","handleDownload","download","handleHTML","html","statusIcon","content","htmlContent","bypassSecurityTrustHtml","redirectionUrl","downloadHref","downloadLink","click","jobUrl","job_statuses","hooks","ProjectsComponent","_pathHelperService","_$state","_currentProjectService","dynamicFieldsSettingsPipe","dynamicFieldsSettings","formattedDynamicFieldsSettings","dynamicFormField","isFieldHidden","hide","hiddenFields","NewProjectComponent","templateControl","templateForm","uIRouterGlobals","pathHelperService","modalService","fieldSettingsPipe","use_template","no_template_selected","advancedSettingsLabel","copySettingsLabel","copyableTemplateFilter","UntypedFormGroup","template","resourcePath","fieldGroups","fieldsFilter","field","templateOptions","isMeta","required","hasDefault","payloadValue","parent_id","setParentAsPayload","onSubmitted","onTemplateSelected","initialPayload","dynamicForm","model","sendNotifications","formUrl","isHiddenField","DynamicFormComponent","CopyProjectComponent","copy","isPrimaryAttribute","sortedCopyFields","fieldA","fieldB","localeCompare","nonCopyFields","PROJECTS_ROUTES","OpenprojectProjectsModule","ReactiveFormsModule","uiRouterProjectsConfiguration","uiRouter","urlService","rules","when","DynamicFormsModule","nonWorkingDay","currentStartDate","activeStart","currentEndDate","activeEnd","getTime","addEvent","getEvents","BackButtonComponent","goBack","customBackMethod","BackRoutingService","goToOtherState","route","goBackToDetailsState","preferListOverSplit","backRoute","keepTab","currentDetailsTab","goBackNotToDetailsState","goBackToPreviousState","isDetailsState","goToBaseState","sync","transition","fromState","toState","paramsFromCopy","_backRoute","KeepTabService","WorkPackageEditActionsBarComponent","editForm","cancel","saving","active","_saving","submit","onSave","onCancel","wpFiltersService","DebouncedEventEmitter","componentDestroyed","visible$","pristine$","replaceIfComplete","isAvailable","filtersChanged","FilterBooleanValueComponent","onFilterUpdated","filterChanged","FilterDateValueComponent","valueChanged","parser","formatter","FilterDatesValueComponent","spacer","begin","AbstractDateTimeValueController","isoDateParser","isoDateFormatter","isTimeZoneDifferent","lowerBoundary","upperBoundary","hours","minutes","timeZoneText","features","FilterDateTimeValueComponent","valueString","FilterDateTimesValueComponent","parseBegin","validDate","parsed","utc","parseEnd","FilterIntegerValueComponent","FilterStringValueComponent","enter_text","FilterProjectComponent","projectID","additionalProjectApiFilters","onChange","FilterToggledMultiselectValueComponent","halSorting","currentUser","compareByHref","availableOptions","ngSelectInstance","shouldFocus","setValues","FilterSearchableMultiselectValueComponent","ngZone","me","searchTerm","autocomplete","initialRequest$","loadCollection","matching","initialLoad","matchingItems","withMeValue","lowered","createFilters","allowedValuesLink","isUserResource","logged","meValue","QueryFilterComponent","bannerService","halHref","open_filter","close_filter","label_filter_add","upsale_for_more","upsale_link","button_delete","showValuesInput","showValues","removeThisFilter","deactivateFilter","valueType","WorkPackageFilterByTextInputComponent","createWithDropdown","createButton","explanation","currentSearchFilter","upstreamTerm","timestampOfLastValue","searchTermChanged","QueryFiltersComponent","trackByName","close_form","selected_filter_list","please_select","filter_by_text","updateRemainingFilters","onFilterAdded","filterToBeAdded","newFilter","instantiate","currentFilterLength","updateFilterFocus","ngSelectComponent","clearItem","closeFilter","toggleVisibility","removedFilter","isSecondSpacerVisible","hasSearch","hasAvailableFilter","isFilterAvailable","remainingFilters","remainingVisibleFilters","activeFilterCount","focusElementIndex","filterIndex","currentFilterAt","availableFilters","availableFilter","onOpen","dropdownPanel","_updatePosition","NgSelectComponent","WorkPackageFiltersService","CommentService","workPackageNotificationService","createComment","comment","addComment","errorAndReject","updateComment","activity","WorkPackageBreadcrumbParentComponent","wpRelationsHierarchy","notificationService","edit_parent","set_or_remove_parent","remove_parent","set_parent","canModifyParent","changeParent","editing","updateParent","newParent","newParentId","isSaving","onSwitch","WorkPackageBreadcrumbComponent","hierarchy","hierarchyCount","hierarchyLabel","updateActiveInput","inputActive","AbstractWorkPackageButtonComponent","activate","deactivate","labelKey","buttonText","textKey","activationPrefix","deactivationPrefix","prefix","isToggle","OpTypesContextMenuDirective","OpContextMenuTrigger","opContextMenu","browserDetector","getEmptyForm","buildItems","contextMenuId","linkText","ariaLabel","class","WorkPackageCreateButtonComponent","allowed","allowedWhen","combined","module","permission","updateDisabledState","transitionUnregisterFn","setupObserver","filterCount","performAction","live$","currentlyVisibleFilters","WorkPackageMarkNotificationButtonComponent","markAllBelongingNotificationsAsRead","QuerySharingFormComponent","showInMenu","visibleForOthers","showInMenuText","visibleForOthersText","canStar","isSave","canPublish","queryForm","updateStarred","isStarred","changed","updatePublic","isPublic","QuerySharingModalComponent","save_as","label_name","label_visibility_settings","button_save","change","afterFocusOn","saveQuery","isBusy","SaveQueryModalComponent","queryNameField","saveQueryAs","queryName","savedQuery","OpSettingsMenuDirective","queryUpdate","loadingPromise","formUpdate","positionArgs","position","assign","my","at","onClose","allowQueryAction","allowAction","allowWorkPackageAction","allowFormAction","WpTableConfigurationModalComponent","initialTab","selectableTitleIdentifier","trigger","triggerEditingEvent","create_new","WpTableExportModalComponent","divider","configureForm","more_actions","WorkPackageStatusDropdownDirective","halEvents","changeFor","getForm","updateStatus","postIcon","postIconTitle","WorkPackageStatusButtonComponent","workPackageReadOnly","workPackageStatusBlocked","temporaryEditResource","buttonTitle","statusHighlightClass","typedState","screenfull","sfimport","zenModeComponentSelector","activateLabel","deactivateLabel","enabled","onchange","isFullscreen","deactivateZenMode","inZenMode","exit","activateZenMode","CardClickHandler","card","EVENT","SELECTOR","eventScope","handleEvent","is","handleWorkPackage","itemClicked","double","classIdentifier","wpCardView","findRenderedCard","ctrlKey","metaKey","shiftKey","setMultiSelectionFrom","renderedCards","toggleRow","selectionChanged","getSelectedWorkPackageIds","wpTableFocus","updateFocus","WorkPackageViewSelectionService","WorkPackageViewFocusService","WorkPackageCardViewService","CardDblClickHandler","CardRightClickHandler","isSelected","showInfoButton","OPContextMenuService","CardViewHandlerRegistry","WorkPackageViewHandlerRegistry","WorkPackageCardDragAndDropService","reorderService","dragService","wpInlineCreate","init","componentRef","cardView","registerDragAndDrop","dragContainer","scrollContainers","moves","canDragOutOf","accepts","dragInto","onMoved","toIndex","newOrder","move","currentOrder","updateOrder","onRemoved","onAdded","addWorkPackageToQuery","parentElement","removeChild","_workPackages","activeInlineCreateWp","existingNewWp","addNewCard","createOrContinueWorkPackage","workPackageAddedHandler","removeReferenceWorkPackageForm","removeCard","onCardSaved","newInlineWorkPackageCreated","tableRendered","updateRenderedCardsValues","WorkPackageCardViewComponent","wpViewOrder","cardDragDrop","trackByHrefAndProperty","noResults","referenceComponentClass","setReferenceMode","onReferenced","registerCreationCallback","eventType","orderedWorkPackages","isResultEmpty","registry","WorkPackageViewHandlerToken","attachTo","registerSelectAllListener","registerDeselectAllListener","mode","inReference","classes","orientation","shrinkOnMobile","_angular_core__WEBPACK_IMPORTED_MODULE_20__","WorkPackageSingleCardComponent","detailsView","Intl","DateTimeFormat","year","month","selectedWhenOpen","emitStateLinkClicked","stateToEmit","stateLinkClicked","requestedState","cardClasses","draggable","showAsInlineCard","showAsGhost","cardTitle","wpTypeAttribute","wpSubject","wpProjectName","wpDates","dateTimeFormatYear","formatRange","dateTimeFormat","wpOverDueHighlighting","fullWorkPackageLink","cardHighlightingClass","cardHighlighting","typeHighlightingClass","attributeHighlighting","onRemove","cardCoverImageShown","bcfSnapshotPath","_angular_core__WEBPACK_IMPORTED_MODULE_15__","WorkPackageCopyController","WorkPackageCreateComponent","wpRelations","addCommonRelation","copiedWorkPackageId","createdWorkPackage","stateParams","copiedFromWorkPackageId","createCopyFrom","sourceChangeset","copyWorkPackage","copyChangeset","pristineResource","WorkPackageRelationsService","WorkPackageFilterValues","excluded","applyFirstValue","setToNull","applyDefaultsFromFilters","projectFilter","filterAlreadyApplied","mapFilterToAttribute","setValueFor","findSpecialValue","WorkPackageChangeset","j","compareByHrefOrString","ResourceChangeset","updateForm","applyChanges","setNewDefaultFor","form$","WorkPackageReplacementLabelComponent","wpeditForm","$element","fields","handleUserActivate","tdClassName","editCellContainer","CellBuilder","DisplayFieldRenderer","build","column","td","createElement","editFieldContainerClass","displayElement","fieldRenderer","appendChild","backgroundClass","inlineClass","colorClass","highlightColorTextInline","overdueDate","isBright","styles","variable","getPropertyValue","internalSortColumn","internalContextMenuColumn","GroupSumsBuilder","SingleRowBuilder","sum","buildSumsRow","tr","groupedRowClassName","renderColumns","sums","augmentedColumns","div","renderContent","sumsSchema","appendFirstLabel","span","textContent","fieldSchema","displayFieldService","getField","rowGroupClassName","collapsedRowClass","groupIdentifier","groupByProperty","groupName","groupIndex","groupTypeFromIdentifier","groupIdFromIdentifier","indicatorCollapsedClass","additionalHierarchyRowClassName","SingleHierarchyRowBuilder","workPackageTable","leaf","level","expanded","collapsed","refreshRow","jRow","newRow","appendHierarchyIndicator","buildEmpty","ancestorRowData","wpTableHierarchies","rowClasses","parentsWithVisibleChildren","hierarchyRootClass","ancestor","hierarchyGroupClass","collapsedGroupClass","buildAncestorRow","ancestorGroups","hierarchyLevel","hierarchyElement","buildHierarchyIndicator","css","hierarchyIndicator","indicatorWidth","indentation","WorkPackageViewHierarchiesService","relationCellTdClassName","relationCellIndicatorClassName","RelationCellbuilder","columnId","wpTableRelationColumns","getExpandFor","relationState","relationsForColumn","renderIndicator","badge","renderBadge","WorkPackageViewRelationColumnsService","TableActionRenderer","contextMenuTdClassName","contextMenuSpanClassName","tableActionsService","OpTableActionsService","tableRowClassName","commonRowClassName","buildAugmentedColumns","wpTableColumns","getColumns","dragAndDropEnabled","buildCell","isRelationColumn","relationCellBuilder","actionsColumnEnabled","contextLinkBuilder","columnMenuEnabled","cellBuilder","row","createEmptyRow","buildEmptyRow","placeholderRow","colSpan","cells","detach","newCells","oldTd","isColumnBeingEdited","cell","forms","activeFields","oldRow","locateTableRowByIdentifier","changedAttributes","oldCell","checkedClassName","WorkPackageViewColumnsService","timelineCellClassName","TimelineRowBuilder","timelineBody","WorkPackageViewTimelineService","UiStateLinkBuilder","linkToDetails","linkToShow","tabState","currentShowTab","wpState","onClickOrEnter","KeyCodes","ClickOrEnterHandler","processEvent","ancestorId","ancestorClassIdentifier","rowId","relationRowClass","locateTableRow","isInsideCollapsedGroup","listClass","locatePredecessorBySelector","previous","previousElementSibling","scrollTableRowIntoView","scrollParent","containerTop","scrollTop","containerBottom","elemTop","offsetTop","elemBottom","warn","RowsBuilder","isApplicable","groupClassNameFor","GroupHeaderBuilder","collapse","expand","buildGroupRow","colspan","togglerIconClass","escape","HighlightingRenderPass","tablePass","highlightAttribute","wpTableHighlighting","getComputedStyle","renderedOrder","tableBody","isInline","isDisabled","WorkPackageViewHighlightingService","DragDropHandleBuilder","dragActionRegistry","TableDragActionsRegistryService","actionService","canPickup","DragDropHandleRenderPass","wpTableOrder","withLoadedPositions","positions","renderType","dragDropHandleBuilder","replaceChild","firstElementChild","WorkPackageViewOrderService","TimelineRenderPass","createDocumentFragment","timelineBuilder","secondary","additionalClasses","relationGroupClass","relationCellClassName","RelationRowBuilder","emptyRelationCell","buildEmptyRelationRow","relation","createEmptyRelationRow","relationClassIdentifier","relationIdentifier","appendRelationLabel","typeLabel","relationLabel","createTextNode","empty","RelationsRenderPass","relationRowBuilder","fromId","relationsToExtendFor","relationRow","spliceRow","belongsTo","refreshRelationRow","renderedRow","hasRelationColumns","PrimaryRenderPass","rowBuilder","timeOutput","prepare","doRender","postRender","highlighting","dragDropHandle","timeline","replacement","replaceWith","renderedInfo","after","renderPlaceholderRow","appendRow","appendNonWorkPackageRow","classIdentifer","PlainRenderPass","originalRows","originalRowIndex","object","GroupedRenderPass","groups","headerBuilder","currentGroup","nextGroup","matchingGroup","groupsChanged","renderSumsRow","groupClass","rowElement","buildSingleRow","matchesMultiValue","valueLink","joinedOrderedHrefs","objects","isEqualWith","sumsBuilder","GroupedRowsBuilder","collapsedGroups","buildRows","builder","getGroupData","refreshExpansionState","rendered","tableAndTimelineContainer","parentNode","affected","HierarchyRenderPass","hierarchies","deferInsertion","buildWithHierarchy","markRendered","renderAllDeferredChildren","ancestorChain","inTable","deferred","newElements","slice","insertUnderParent","getOrBuildRow","ancestorRow","insertAtExistingHierarchy","additionalParents","previousAncestor","isAncestor","buildRenderInfo","hierarchyRoot","hierarchyGroup","ancestorClasses","HierarchyRowsBuilder","_table","isEnabled","PlainRowsBuilder","TableEditForm","EditForm","resourceSubscription","findContainer","rowContainer","findCell","activateField","waitForContainer","editModeClassName","editingPortalService","FocusHelper","requireVisible","addColumn","focusOnFirstError","loadFieldSchema","noWarnings","interval","setInterval","clearInterval","FocusHelperService","EditingPortalService","WorkPackageTableEditingContext","stopEditing","existing","startEditing","WorkPackageTable","scrollContainer","tbody","timelineController","hierarchyRowsBuilder","groupedRowsBuilder","plainRowsBuilder","renderedRows","findRenderedRow","builders","buildIndex","rows","initialSetup","redrawTableAndTimeline","renderPass","performRenderPass","requestAnimationFrame","redrawTable","refreshRows","pass","lastRenderPass","setGroupsCollapseState","newState","t0","performance","t1","WorkPackageViewCollapsedGroupsService","WorkPackagesGridComponent","wpTableHighlight","wpTableSortBy","wpList","onReady","highlightingModeChanged","updates$","switchToManualSorting","createOrSave","DragAndDropService","decls","inlineCreateRowClassName","inlineCreateCancelClassName","InlineCreateRowBuilder","cancelButton","buildCancelButton","buildNew","WorkPackageInlineCreateComponent","buttonTexts","canAdd","canReference","hasReferenceClass","showing","refreshOnColumnChanges","registerCancelHandler","resetRow","stopImmediatePropagation","currentWorkPackage","isEmbedded","cancelCreation","removeWorkPackageRow","showRow","handleAddRowClick","addWorkPackageRow","handleReferenceClick","referenceClass","editingSubscription","changesetUpdates$","insertRow","workPackageEditForm","renderInlineCreateRow","activateMissingFields","hideRow","WorkPackageInlineCreateService","canCreateWorkPackages","complete","newInlineWorkPackageReferenced","WorkPackagesListChecksumService","UrlParamsHelper","updateIfDifferent","newQueryChecksum","getNewChecksum","routePromise","isUninitialized","isIdDifferent","maintainUrlQueryState","isChecksumDifferent","setToQuery","isQueryOutdated","isOutdated","executeIfOutdated","newChecksum","checksum","visibleChecksum","otherId","otherChecksum","hasCurrentQueryID","hasCurrentChecksum","idChanged","checksumChanged","visibleChecksumChanged","perPage","WorkPackagesListInvalidQueryService","restoreQuery","restoreFilters","restoreColumns","restoreSortBy","restoreGroupBy","restoreOtherProperties","querySchema","filterInstanceSchema","recreatedFilter","stubQuery","candidate","sortBys","wpTablePagination","wpStatesInitialization","wpListInvalidQueryService","wpQueryView","queryRequests","q","ensurePerPageKnown","streamQueryRequest","conditionallyLoadForm","decodedProps","getCurrentQueryProps","buildV3GetQueryFromJsonParams","handleQueryLoadingError","queryLoading","loadDefaultQuery","reloadQuery","extractParamsFromQuery","loadQueryFromExisting","buildV3GetQueryFromQueryResource","loadCurrentQueryFromParams","loadForm","updateStatesFromForm","createQueryAndView","createdQuery","currentQuery","givenQuery","getPaginationInfo","paginationObject","currentForm","isPerPageKnown","_angular_core__WEBPACK_IMPORTED_MODULE_25__","WorkPackagesQueryViewService","viewType","WorkPackageStatesInitializationService","wpTableGroupBy","wpTableGroupFold","wpTableSum","wpTableTimeline","wpTableAdditionalElements","wpDisplayRepresentation","wpIncludeSubprojects","clearStates","initializeFromQuery","updateQuerySpace","updateChecksum","initializeFilters","additionalRequiredWorkPackages","_angular_core__WEBPACK_IMPORTED_MODULE_21__","$transition","wpViewFocus","button_settings","closeEditFormWhenNewWorkPackageSaved","showForm","switchToFullscreen","onSaved","savedResource","isInitial","successState","newWorkPackage","parentWorkPackage","back_url","cancelAndBackToList","cancelState","_angular_core__WEBPACK_IMPORTED_MODULE_16__","viewQuery","EditFormComponent","newWorkPackageHref","WorkPackageCreateService","attachmentsService","committedChanges","commit","newWorkPackageCreated","newWorkPackageCreatedSubject","createNewWorkPackage","fromCreateForm","initializeNewResource","copyFrom","changePromise","continueExistingEdit","createNewWithDefaults","changeType","hasChanges","typeEmpty","typeMatches","withFiltersPayload","filterDefaults","mergedPayload","defaultsFromFilters","except","fromFilter","toApiPayload","WorkPackageNewFullViewComponent","queryColumnTypes","PROPERTY","RELATION_OF_TYPE","RELATION_TO_TYPE","getFilterSchema","TransitionService","listenForQueryParamsChanged","queryChangeListener","removeQueryChangeListener","UrlParamsHelperService","paginationService","buildQueryString","extender","paramsData","showHierarchies","g","includeSubprojects","encodeSums","encodeTimelineVisible","encodeHighlightingMode","encodeHighlightedAttributes","encodeSortBy","encodeFilters","s","hl","highlightedAttributes","hla","queryFilterValueToParam","timelineVisible","tv","timelineLabels","tll","tzl","timelineZoomLevel","updateJson","getPerPage","showSums","urlFilter","attributes","vs","filterData","contextual","buildV3GetColumnsFromQueryResource","buildV3GetFiltersAsJson","buildV3GetSortByFromQuery","halValue","buildV3GetFilters","replacements","buildV3GetFilterIdFromFilter","buildV3GetOperatorIdFromFilter","buildV3GetValuesFromFilter","filterHash","filterBuilderFrom","sortByIds","WpChildrenInlineCreateService","wpRelationsHierarchyService","WpRelationInlineAddExistingComponent","toId","addExistingChildWp","referenceTarget","canAddChild","WorkPackageChildrenQueryComponent","WorkPackageRelationQueryBase","queryUrlParamsHelper","OpUnlinkTableAction","embeddedTable","buildQueryProps","relatedWorkPackage","isInitialized","refreshTable","buildQueryFilters","abort","addExisting","selectedWpId","newRelationId","onSelected","relationTypes","WpRelationInlineCreateService","removeRelation","addRelation","loadQuery","handleQueryLoaded","filtersLength","projectValuesCount","loadedFiltersLength","valid_subset","WorkPackageRelationsAutocompleteComponent","availableRelationCandidates","additionalFilters","filterCandidatesFor","selectedRelationType","getOptionsFn","getAutocompleterData","onWorkPackageSelected","runOutsideAngular","repositionDropdown","hiddenOverflowContainer","one","closeSelect","OpAutocompleterComponent","WorkPackageRelationsHierarchyService","lockVersion","removeParent","childWpId","wpToBecomeChild","addNewChildWp","childWorkPackage","RelationStateGroup","initializeMembers","relationsStateValue","accumulateRelationsFromInvolved","removeFromStates","updateRelationType","updateRelation","savedRelation","insertIntoStates","relatedWpId","keyBy","involved","relevant","ActivityEntryInfo","isReversed","activities","activityDate","dateOfPrevious","forceReverse","orderedIndex","activityNo","idx","WorkPackageLinkedResourceCache","order","aggregated","revisions","sortedActivityList","sorted","reverse","ReplaySubject","updateTabs","lastActiveTab","isCurrentState","goCurrentShowState","goCurrentDetailsState","currentTab","currentTabIdentifier","updateTab","WorkPackageWatchersTabComponent","wpWatchersService","trackByHref","loadingError","loadCurrentWatchers","availableWatchersPath","available_watchers","allowedToView","watchers","allowedToAdd","addWatcher","allowedToRemove","removeWatcher","watching","watcher","user_id","WorkPackageWatchersService","isCached","isRequested","cached","cacheDurationInSeconds","WpCustomActionComponent","wpSchemaCacheService","fetchAction","savedWp","onMouseEnter","WpCustomActionsComponent","customActions","WorkPackageSingleViewComponent","hook","storagesService","projectsResourceService","infoRow","createdBy","lastUpdatedOn","uiSelfRef","$current","contextFrom","updateWorkPackageCreationState","groupedFields","rebuildGroupedFields","_attributeGroups","getFields","storages$","manageFileLinks","shouldHideGroup","members","queryInNew","elem","prependedAttributeGroupComponents","attributeGroupComponent","attachmentListComponent","attachmentUploadComponent","idLabel","showSwitchToProjectBanner","switchToProjectText","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","switchTo","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","V","positionSwap","myPosition","neighbor","neighborPosition","insertAsFirst","successorPosition","oe","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","debounce","getDebounceTimeout","queryString","NEVER","initialDebounce","OPENPROJECT_AUTOCOMPLETE_COMPONENTS","VersionAutocompleterComponent","WorkPackageAutocompleterComponent","TimeEntryWorkPackageAutocompleterComponent","UserAutocompleterComponent","ProjectAutocompleterComponent","ColorsAutocompleterComponent","OpSearchHighlightDirective","NgSelectModule","DragulaModule","FormsModule","flattenProjectTree","projectTreeItems","depth","fullList","projectTreeItem","numberOfAncestors","insertProjectWithAncestors","ancestorToFind","ancestorInTree","buildTree","recursiveSort","projectsAutocompleterSelector","isInlineContext","_value","valueChange","onTouched","hiddenInput","dispatchEvent","plainValue","disableSelectedItems","normalizedValue","arrayedValue","projectTracker","getAvailableProjects","dataLoaded","mapResultsFn","apiFilters","fullParams","writeValue","registerOnChange","fn","registerOnTouched","NG_VALUE_ACCESSOR","forwardRef","recent","setMode","modeSwitch","InviteUserButtonComponent","opInviteUserModalService","autocompleter","canInviteUsersToProject$","onAddNewClick","usersAutocompleterSelector","inputFilters","userInvited","getAvailableUsers","searchFilters","filteredURL","canCreateNewActionElements","createNewVersion","available_projects","getVersionPayload","onCreate","definingProject","colorsAutocompleterSelector","setColorOptions","updateInputField","getElementsByName","updateInput","highlightTextInline","onModelChange","colors","selectedOption","selectedColorId","selectedColor","highlightColor","highlightingClass","ColorsService","toHsl","valueHash","toHsla","opacity","charCodeAt","cstr","declaredInputsParentKey","declaredInputs","outsideName","insideName","OpDateTimeComponent","dateTimeValue","OpBasicRangeDatePickerComponent","stringValue","resolveDateArrayToString","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","te","formattedResourcesModel","resourceKey","resourceModel","formattedResourceModel","resourceElement","formatModelToEdit","metaModel","otherElements","otherElementsModel","isValue","getFormattedResourcesModel","_d","formErrors","getAllFormValidationErrors","formControlKeys","keysToValidate","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","prefetch","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","initializeServices","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","searchTermIsId","searchTermWithoutHash","substr","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","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","_markable","autocompleteWorkPackages","all_projects","current_project_and_all_descendants","search_dots","close_search","toggleTopMenuClass","unregister","markable","btn","toggleMobileSearch","submitNonEmptySearch","redirectToWp","wpPath","openCloseMenu","searchedTerm","selectedItem","clearSearch","onEnterBeforeResultsLoaded","markable$","followSelectedItem","searchInScope","currentScope","statusHighlighting","statusId","followItem","customSearchFn","hashFreeQuery","queryWithoutHash","fetchSearchResults","searchResultsToOptions","setMarkedOption","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","initializer","ASSET_HOST","assetHost","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' || projectContext === 'projects' ? 'g' : `p${projectContext}`]]);\n }\n\n if (actions.length > 0) {\n filters.push(['action', '=', actions]);\n }\n\n return { filters, pageSize: -1 };\n }),\n switchMap((params) => this.capabilitiesService.require(params)),\n );\n }\n\n /**\n * Returns an Observable indicating whether the current user has the required capabilities\n * in the provided context.\n */\n public hasCapabilities$(action:string|string[], projectContext:string|null):Observable {\n const actions = _.castArray(action);\n return this\n .capabilities$(actions, projectContext)\n .pipe(\n map((capabilities) => actions.reduce(\n (acc, contextAction) => acc && !!capabilities.find((cap) => cap._links.action.href.endsWith(`/api/v3/actions/${contextAction}`)),\n capabilities.length > 0,\n )),\n distinctUntilChanged(),\n );\n }\n\n /**\n * Returns an Observable indicating whether the current user\n * has any of the required capabilities in the provided context.\n */\n public hasAnyCapabilityOf$(actions:string|string[], projectContext:string|null):Observable {\n const actionsToFilter = _.castArray(actions);\n return this\n .capabilities$(actionsToFilter, projectContext)\n .pipe(\n map((capabilities) => capabilities.reduce(\n (acc, cap) => acc || !!actionsToFilter.find((action) => cap._links.action.href.endsWith(`/api/v3/actions/${action}`)),\n false,\n )),\n distinctUntilChanged(),\n );\n }\n\n /**\n * Returns a principal filter for the current user.\n */\n private principalFilter$():Observable {\n return this\n .user$\n .pipe(\n filter((user) => !!user.id),\n take(1),\n map((user) => ['principal', '=', [user.id as string]]),\n );\n }\n\n // Everything below this is deprecated legacy interfacing and should not be used\n\n private setupLegacyDataListeners() {\n this.currentUserQuery.user$.subscribe((user) => (this._user = user));\n this.currentUserQuery.isLoggedIn$.subscribe((isLoggedIn) => (this._isLoggedIn = isLoggedIn));\n }\n\n private _isLoggedIn = false;\n\n /** @deprecated Use the store mechanism `currentUserQuery.isLoggedIn$` */\n public get isLoggedIn():boolean {\n return this._isLoggedIn;\n }\n\n private _user:CurrentUser = {\n id: null,\n name: null,\n mail: null,\n };\n\n /** @deprecated Use the store mechanism `currentUserQuery.user$` */\n public get userId():string {\n return this._user.id || '';\n }\n\n /** @deprecated Use the store mechanism `currentUserQuery.user$` */\n public get name():string {\n return this._user.name || '';\n }\n\n /** @deprecated Use the store mechanism `currentUserQuery.user$` */\n public get mail():string {\n return this._user.mail || '';\n }\n\n /** @deprecated Use the store mechanism `currentUserQuery.user$` */\n public get href():string {\n return `/api/v3/users/${this.userId}`;\n }\n\n /** @deprecated Use `I18nService.locale` instead */\n public get language():string {\n return I18n.locale || 'en';\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport {\n Store,\n StoreConfig,\n} from '@datorama/akita';\n\nexport interface CurrentUser {\n id:string|null;\n name:string|null;\n mail:string|null;\n}\n\nexport interface CurrentUserState extends CurrentUser {\n}\n\nexport function createInitialState():CurrentUserState {\n return {\n id: null,\n name: null,\n mail: null,\n };\n}\n\n@Injectable()\n@StoreConfig({ name: 'current-user' })\nexport class CurrentUserStore extends Store {\n constructor() {\n super(createInitialState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport * as moment from 'moment-timezone';\nimport {\n Moment,\n} from 'moment';\n\ndeclare module 'moment' {\n interface Moment {\n tz():string|undefined;\n\n tz(timezone:string, keepLocalTime?:boolean):Moment;\n\n zoneAbbr():string;\n\n zoneName():string;\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class TimezoneService {\n constructor(\n readonly configurationService:ConfigurationService,\n readonly I18n:I18nService,\n ) {\n this.setupLocale();\n }\n\n public setupLocale():void {\n moment.locale(I18n.locale);\n }\n\n /**\n * Takes a utc date time string and turns it into\n * a local date time moment object.\n */\n public parseDatetime(datetime:string, format?:string):Moment {\n const d = moment.utc(datetime, format);\n\n if (this.configurationService.isTimezoneSet()) {\n d.local();\n d.tz(this.configurationService.timezone());\n }\n\n return d;\n }\n\n public parseDate(date:Date|string, format?:string):Moment {\n return moment(date, format);\n }\n\n /**\n * Parses the specified datetime and applies the user's configured timezone, if any.\n *\n * This will effectfully transform the [server] provided datetime object to the user's configured local timezone.\n *\n * @param {String} datetime in 'YYYY-MM-DDTHH:mm:ssZ' format\n * @returns {Moment}\n */\n public parseISODatetime(datetime:string):Moment {\n return this.parseDatetime(datetime, 'YYYY-MM-DDTHH:mm:ssZ');\n }\n\n public parseISODate(date:string):Moment {\n return this.parseDate(date, 'YYYY-MM-DD');\n }\n\n public formattedDate(date:string):string {\n const d = this.parseDate(date);\n return d.format(this.getDateFormat());\n }\n\n /**\n * Returns the number of days from today the given dateString is apart.\n * Negative means the date lies in the past.\n * @param dateString\n */\n public daysFromToday(dateString:string):number {\n const date = this.parseDate(dateString);\n const today = moment().startOf('day');\n\n return date.diff(today, 'days');\n }\n\n public formattedTime(datetimeString:string):string {\n return this.parseDatetime(datetimeString).format(this.getTimeFormat());\n }\n\n public formattedDatetime(datetimeString:string):string {\n const c = this.formattedDatetimeComponents(datetimeString);\n return `${c[0]} ${c[1]}`;\n }\n\n public formattedRelativeDateTime(datetimeString:string):string {\n const d = this.parseDatetime(datetimeString);\n return d.fromNow();\n }\n\n public formattedDatetimeComponents(datetimeString:string):string[] {\n const d = this.parseDatetime(datetimeString);\n return [\n d.format(this.getDateFormat()),\n d.format(this.getTimeFormat()),\n ];\n }\n\n public toHours(durationString:string):number {\n return Number(moment.duration(durationString).asHours().toFixed(2));\n }\n\n public toDays(durationString:string):number {\n return Number(moment.duration(durationString).asDays().toFixed(2));\n }\n\n public toISODuration(input:string|number, unit:'hours'|'days'):string {\n return moment.duration(input, unit).toIsoString();\n }\n\n public formattedDuration(durationString:string, unit:'hour'|'days' = 'hour'):string {\n switch (unit) {\n case 'hour':\n return this.I18n.t('js.units.hour', { count: this.toHours(durationString) });\n case 'days':\n return this.I18n.t('js.units.day', { count: this.toDays(durationString) });\n default:\n // Case fallthrough for eslint\n return '';\n }\n }\n\n public formattedISODate(date:any):string {\n return this.parseDate(date).format('YYYY-MM-DD');\n }\n\n public formattedISODateTime(datetime:any):string {\n return datetime.format();\n }\n\n public isValidISODate(date:any):boolean {\n return this.isValid(date, 'YYYY-MM-DD');\n }\n\n public isValidISODateTime(dateTime:string):boolean {\n return this.isValid(dateTime, 'YYYY-MM-DDTHH:mm:ssZ');\n }\n\n public isValid(date:string, dateFormat:string):boolean {\n const format = dateFormat || this.getDateFormat();\n return moment(date, [format], true).isValid();\n }\n\n public getDateFormat():string {\n return this.configurationService.dateFormatPresent() ? this.configurationService.dateFormat() : 'L';\n }\n\n public getTimeFormat():string {\n return this.configurationService.timeFormatPresent() ? this.configurationService.timeFormat() : 'LT';\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Injectable,\n Injector,\n} from '@angular/core';\nimport * as moment from 'moment';\nimport {\n take,\n tap,\n} from 'rxjs/operators';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WeekdayResourceService } from 'core-app/core/state/days/weekday.service';\nimport { IWeekday } from 'core-app/core/state/days/weekday.model';\nimport {\n Observable,\n of,\n} from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class WeekdayService {\n @InjectField() weekdaysService:WeekdayResourceService;\n\n private weekdays:IWeekday[];\n\n constructor(\n readonly injector:Injector,\n ) {}\n\n /**\n * @param date The iso day number (1-7) or a date instance\n * @return {boolean} whether the given iso day is working or not\n */\n public isNonWorkingDay(date:Date|number):boolean {\n const isoDayOfWeek = (typeof date === 'number') ? date : moment(date).isoWeekday();\n return !!(this.weekdays || []).find((wd) => wd.day === isoDayOfWeek && !wd.working);\n }\n\n public get nonWorkingDays():IWeekday[] {\n return this.weekdays.filter((day) => !day.working);\n }\n\n loadWeekdays():Observable {\n if (this.weekdays) {\n return of(this.weekdays);\n }\n\n return this\n .weekdaysService\n .require()\n .pipe(\n take(1),\n tap((weekdays) => {\n this.weekdays = weekdays;\n }),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Inject, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { enterpriseEditionUrl } from 'core-app/core/setup/globals/constants.const';\n\n@Injectable({ providedIn: 'root' })\nexport class BannersService {\n private readonly _banners:boolean = true;\n\n constructor(@Inject(DOCUMENT) protected documentElement:Document) {\n this._banners = documentElement.body.classList.contains('ee-banners-visible');\n }\n\n public get eeShowBanners():boolean {\n return this._banners;\n }\n\n public getEnterPriseEditionUrl({ referrer, hash }:{ referrer?:string, hash?:string } = {}) {\n const url = new URL(enterpriseEditionUrl);\n if (referrer) {\n url.searchParams.set('op_referrer', referrer);\n }\n\n if (hash) {\n url.hash = hash;\n }\n\n return url.toString();\n }\n\n public conditional(bannersVisible?:() => void, bannersNotVisible?:() => void) {\n this._banners ? this.callMaybe(bannersVisible) : this.callMaybe(bannersNotVisible);\n }\n\n private callMaybe(func?:Function) {\n func && func();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { getType } from 'mime';\nimport { Injectable } from '@angular/core';\nimport { HttpEvent, HttpResponse } from '@angular/common/http';\nimport { from, Observable, of } from 'rxjs';\nimport { share, switchMap } from 'rxjs/operators';\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { EXTERNAL_REQUEST_HEADER } from 'core-app/features/hal/http/openproject-header-interceptor';\nimport {\n OpenProjectFileUploadService, UploadBlob, UploadFile, UploadInProgress,\n} from './op-file-upload.service';\n\ninterface PrepareUploadResult {\n url:string;\n form:FormData;\n response:{\n _links:{\n completeUpload:{\n href:string;\n };\n };\n };\n}\n\n@Injectable()\nexport class OpenProjectDirectFileUploadService extends OpenProjectFileUploadService {\n /**\n * Upload a single file, get an UploadResult observable\n */\n public uploadSingle(url:string, file:UploadFile|UploadBlob, method = 'post') {\n const observable = from(this.getDirectUploadFormFrom(url, file))\n .pipe(\n switchMap(this.uploadToExternal(file, method)),\n share(),\n );\n\n return [file, observable] as UploadInProgress;\n }\n\n private uploadToExternal(file:UploadFile|UploadBlob, method:string):(result:PrepareUploadResult) => Observable> {\n return (result) => {\n result.form.append('file', file, file.customName || file.name);\n\n return this.http.request(\n method,\n result.url,\n {\n body: result.form,\n // Observe the response, not the body\n observe: 'events',\n // This is important as the CORS policy for the bucket is * and you can't use credentials then,\n // besides we don't need them here anyway.\n headers: {\n [EXTERNAL_REQUEST_HEADER]: 'true',\n },\n responseType: 'text',\n // Subscribe to progress events. subscribe() will fire multiple times!\n reportProgress: true,\n },\n ).pipe(\n switchMap(this.finishUpload(result)),\n );\n };\n }\n\n private finishUpload(result:PrepareUploadResult):(result:HttpEvent) => Observable> {\n return (event) => {\n if (event instanceof HttpResponse) {\n return this\n .http\n .get(\n result.response?._links?.completeUpload?.href,\n { observe: 'response' },\n );\n }\n\n // Return as new observable due to switchMap\n return of(event);\n };\n }\n\n public async getDirectUploadFormFrom(url:string, file:UploadFile|UploadBlob):Promise {\n const fileName = file.customName || file.name;\n const contentType = (file.type || (fileName && getType(fileName)) || '' as string);\n\n const formData = new FormData();\n const metadata = {\n fileName,\n contentType,\n description: file.description,\n fileSize: file.size,\n };\n\n /*\n * @TODO We could calculate the MD5 hash here too and pass that.\n * The MD5 hash can be used as the `content-md5` option during the upload to S3 for instance.\n * This way S3 can verify the integrity of the file which we currently don't do.\n */\n\n // add the metadata object\n formData.append(\n 'metadata',\n JSON.stringify(metadata),\n );\n\n const result = await this.http.request(\n 'post',\n url,\n {\n body: formData,\n withCredentials: true,\n responseType: 'json',\n },\n ).toPromise();\n\n const form = new FormData();\n\n _.each(result._links.addAttachment.form_fields, (value, key) => {\n form.append(key, value);\n });\n\n return {\n form,\n url: result._links.addAttachment.href,\n response: result as any,\n };\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport {\n HttpClient,\n HttpEvent,\n HttpEventType,\n HttpResponse,\n} from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { filter, map, share } from 'rxjs/operators';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport interface UploadFile extends File {\n description?:string;\n customName?:string;\n}\n\nexport interface UploadBlob extends Blob {\n description?:string;\n customName?:string;\n name?:string;\n}\n\nexport type UploadHttpEvent = HttpEvent;\nexport type UploadInProgress = [UploadFile, Observable];\n\nexport interface UploadResult {\n uploads:UploadInProgress[];\n finished:Promise;\n}\n\nexport interface MappedUploadResult {\n uploads:UploadInProgress[];\n finished:Promise<{ response:any, uploadUrl:string }[]>;\n}\n\n@Injectable()\nexport class OpenProjectFileUploadService {\n constructor(\n protected readonly http:HttpClient,\n protected readonly halResource:HalResourceService,\n ) { }\n\n /**\n * Upload multiple files and return a promise for each uploading file and a single promise for all processed uploads\n * with their accessible URLs returned.\n */\n public uploadAndMapResponse(url:string, files:UploadFile[]):MappedUploadResult {\n const { uploads, finished } = this.upload(url, files);\n const mapped = finished\n .then((result:HalResource[]) => result.map((element:HalResource) => ({\n response: element,\n uploadUrl: (element.staticDownloadLocation as unknown&{ href:string }).href,\n }))) as Promise<{ response:HalResource, uploadUrl:string }[]>;\n\n return { uploads, finished: mapped } as MappedUploadResult;\n }\n\n /**\n * Upload multiple files and return a promise for each uploading file and a single promise for all processed uploads\n * Ignore directories.\n */\n public upload(url:string, files:UploadFile[], method = 'post'):UploadResult {\n files = _.filter(files, (file:UploadFile) => file.type !== 'directory');\n const uploads:UploadInProgress[] = _.map(files, (file:UploadFile) => this.uploadSingle(url, file, method));\n\n const finished = this.whenFinished(uploads);\n return { uploads, finished } as UploadResult;\n }\n\n /**\n * Upload a single file, get an UploadResult observable\n */\n public uploadSingle(\n url:string,\n file:UploadFile|UploadBlob,\n method = 'post',\n responseType:'json'|'text' = 'json',\n ):UploadInProgress {\n const formData = new FormData();\n const metadata = {\n description: file.description,\n fileName: file.customName || file.name,\n };\n\n // add the metadata object\n formData.append(\n 'metadata',\n JSON.stringify(metadata),\n );\n\n // Add the file\n formData.append('file', file, metadata.fileName);\n\n const observable = this.http.request(\n method,\n url,\n {\n body: formData,\n // Observe the response, not the body\n observe: 'events',\n withCredentials: true,\n responseType,\n // Subscribe to progress events. subscribe() will fire multiple times!\n reportProgress: true,\n },\n ).pipe(share());\n\n return [file, observable] as UploadInProgress;\n }\n\n /**\n * Create a promise for all uploaded responses when all uploads are fully uploaded.\n *\n * @param {UploadInProgress[]} uploads\n */\n private whenFinished(uploads:UploadInProgress[]):Promise {\n const promises = uploads.map(([_, observable]) => observable\n .pipe(\n filter((evt) => evt.type === HttpEventType.Response),\n map((evt:HttpResponse) => this.halResource.createHalResource(evt.body)),\n )\n .toPromise());\n\n return Promise.all(promises);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { IFCGonDefinition } from '../../features/bim/ifc_models/pages/viewer/ifc-models-data.service';\n\ndeclare global {\n interface Window {\n gon:GonType;\n }\n}\n\nexport interface GonType {\n [key:string]:unknown;\n ifc_models:IFCGonDefinition;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class GonService {\n get(...path:string[]):unknown|null {\n return _.get(window.gon, path, null);\n }\n\n /**\n * Get the gon object\n */\n get gon():GonType {\n return window.gon;\n }\n}\n","import { Title } from '@angular/platform-browser';\nimport { Injectable } from '@angular/core';\n\nconst titlePartsSeparator = ' | ';\n\n@Injectable({ providedIn: 'root' })\nexport class OpTitleService {\n constructor(private titleService:Title) {\n\n }\n\n public get current():string {\n return this.titleService.getTitle();\n }\n\n public get titleParts():string[] {\n return this.current.split(titlePartsSeparator);\n }\n\n public setFirstPart(value:string) {\n const parts = this.titleParts;\n parts[0] = value;\n\n this.titleService.setTitle(parts.join(titlePartsSeparator));\n }\n\n public prependFirstPart(value:string):void {\n const parts = this.titleParts;\n parts.unshift(value);\n\n this.titleService.setTitle(parts.join(titlePartsSeparator));\n }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * General components\n */\nexport interface GlobalI18n {\n t(translateId:string, parameters?:unknown):T;\n\n lookup(translateId:string):boolean|undefined;\n\n toNumber(num:number, options?:ToNumberOptions):string;\n\n toPercentage(num:number, options?:ToPercentageOptions):string;\n\n toCurrency(num:number, options?:ToCurrencyOptions):string;\n\n strftime(date:Date, format:string):string;\n\n toHumanSize(num:number, options?:ToHumanSizeOptions):string;\n\n toTime(format:string, date:Date):string;\n\n locale:string;\n firstDayOfWeek:number;\n pluralization:any;\n}\n\ninterface ToNumberOptions {\n precision?:number;\n separator?:string;\n delimiter?:string;\n strip_insignificant_zeros?:boolean;\n}\n\ntype ToPercentageOptions = ToNumberOptions;\n\ninterface ToCurrencyOptions extends ToNumberOptions {\n format?:string;\n unit?:string;\n sign_first?:boolean;\n}\n\ninterface ToHumanSizeOptions extends ToNumberOptions {\n format?:string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class I18nService {\n private i18n:GlobalI18n = window.I18n;\n\n public get locale():string {\n return this.i18n.locale;\n }\n\n public t = this.i18n.t.bind(this.i18n) as GlobalI18n['t'];\n\n public lookup = this.i18n.lookup.bind(this.i18n) as GlobalI18n['lookup'];\n\n public toTime = this.i18n.toTime.bind(this.i18n) as GlobalI18n['toTime'];\n\n public toNumber = this.i18n.toNumber.bind(this.i18n) as GlobalI18n['toNumber'];\n\n public toPercentage = this.i18n.toPercentage.bind(this.i18n) as GlobalI18n['toPercentage'];\n\n public toCurrency = this.i18n.toCurrency.bind(this.i18n) as GlobalI18n['toCurrency'];\n\n public strftime = this.i18n.strftime.bind(this.i18n) as GlobalI18n['strftime'];\n\n public toHumanSize = this.i18n.toHumanSize.bind(this.i18n) as GlobalI18n['toHumanSize'];\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\n\nexport const indicatorLocationSelector = '.loading-indicator--location';\nexport const indicatorBackgroundSelector = '.loading-indicator--background';\n\nexport function withLoadingIndicator(indicator:LoadingIndicator, delayStopTime?:number):(source:Observable) => Observable {\n return (source$:Observable) => {\n indicator.start();\n\n return source$.pipe(\n tap(\n () => indicator.delayedStop(delayStopTime),\n () => indicator.stop(),\n () => indicator.stop(),\n ),\n );\n };\n}\n\nexport function withDelayedLoadingIndicator(indicator:() => LoadingIndicator):(source:Observable) => Observable {\n return (source$:Observable) => {\n setTimeout(() => indicator().start());\n\n return source$.pipe(\n tap(\n () => undefined,\n () => indicator().stop(),\n () => indicator().stop(),\n ),\n );\n };\n}\n\nexport class LoadingIndicator {\n private indicatorTemplate =\n `
\n
\n
\n
\n
\n
\n
\n
\n
\n `;\n\n constructor(public indicator:JQuery) {\n }\n\n public set promise(promise:Promise) {\n this.start();\n\n // Keep bound method around\n const stopper = () => this.delayedStop();\n\n promise\n .then(stopper)\n .catch(stopper);\n }\n\n public start() {\n // If we're currently having an active indicator, remove that one\n this.stop();\n this.indicator.prepend(this.indicatorTemplate);\n }\n\n public delayedStop(time = 25) {\n setTimeout(() => this.stop(), time);\n }\n\n public stop() {\n this.indicator.find('.loading-indicator--background').remove();\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class LoadingIndicatorService {\n // Provide shortcut to the primarily used indicators\n public get table() {\n return this.indicator('table');\n }\n\n public get wpDetails() {\n return this.indicator('wpDetails');\n }\n\n public get modal() {\n return this.indicator('modal');\n }\n\n // Returns a getter function to an indicator\n // in case the indicator is shown conditionally\n public getter(name:string):() => LoadingIndicator {\n return this.indicator.bind(this, name);\n }\n\n // Return an indicator by name or element\n public indicator(indicator:string|JQuery):LoadingIndicator {\n if (typeof indicator === 'string') {\n indicator = this.getIndicatorAt(indicator);\n }\n\n return new LoadingIndicator(indicator);\n }\n\n private getIndicatorAt(name:string):JQuery {\n return jQuery(indicatorLocationSelector).filter(`[data-indicator-name=\"${name}\"]`);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Injectable({ providedIn: 'root' })\nexport class MainMenuToggleService {\n public toggleTitle:string;\n\n private elementWidth:number;\n\n private elementMinWidth = 11;\n\n private readonly defaultWidth:number = 230;\n\n private readonly localStorageKey:string = 'openProject-mainMenuWidth';\n\n private readonly localStorageStateKey:string = 'openProject-mainMenuCollapsed';\n\n @InjectField() currentProject:CurrentProjectService;\n\n private global = (window as any);\n\n private htmlNode = document.getElementsByTagName('html')[0];\n\n private mainMenu = jQuery('#main-menu')[0]; // main menu, containing sidebar and resizer\n\n private hideElements = jQuery('.can-hide-navigation');\n\n // Title needs to be sync in main-menu-toggle.component.ts and main-menu-resizer.component.ts\n private titleData = new BehaviorSubject('');\n\n public titleData$ = this.titleData.asObservable();\n\n // Notes all changes of the menu size (currently needed in wp-resizer.component.ts)\n private changeData = new BehaviorSubject({});\n\n public changeData$ = this.changeData.asObservable();\n\n constructor(protected I18n:I18nService,\n public injector:Injector,\n readonly deviceService:DeviceService) {\n }\n\n public initializeMenu():void {\n if (!this.mainMenu) {\n return;\n }\n\n this.elementWidth = parseInt(window.OpenProject.guardedLocalStorage(this.localStorageKey) as string);\n const menuCollapsed = window.OpenProject.guardedLocalStorage(this.localStorageStateKey) as string;\n\n if (!this.elementWidth) {\n this.saveWidth(this.mainMenu.offsetWidth);\n } else if (menuCollapsed && JSON.parse(menuCollapsed)) {\n this.closeMenu();\n } else {\n this.setWidth();\n }\n\n const currentProject:CurrentProjectService = this.injector.get(CurrentProjectService);\n if (jQuery(document.body).hasClass('controller-my') && this.elementWidth === 0 || currentProject.id === null) {\n this.saveWidth(this.defaultWidth);\n }\n\n // mobile version default: hide menu on initialization\n this.closeWhenOnMobile();\n }\n\n // click on arrow or hamburger icon\n public toggleNavigation(event?:JQuery.TriggeredEvent|Event):void {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n }\n\n if (!this.showNavigation) { // sidebar is hidden -> show menu\n if (this.deviceService.isMobile) { // mobile version\n this.setWidth(window.innerWidth);\n } else { // desktop version\n const savedWidth = parseInt(window.OpenProject.guardedLocalStorage(this.localStorageKey) as string);\n const widthToSave = savedWidth >= this.elementMinWidth ? savedWidth : this.defaultWidth;\n\n this.saveWidth(widthToSave);\n }\n } else { // sidebar is expanded -> close menu\n this.closeMenu();\n }\n\n // Set focus on first visible main menu item.\n // This needs to be called after AngularJS has rendered the menu, which happens some when after(!) we leave this\n // method here. So we need to set the focus after a timeout.\n setTimeout(() => {\n jQuery('#main-menu [class*=\"-menu-item\"]:visible').first().focus();\n }, 500);\n }\n\n public closeMenu():void {\n this.setWidth(0);\n window.OpenProject.guardedLocalStorage(this.localStorageStateKey, 'true');\n jQuery('.searchable-menu--search-input').blur();\n }\n\n public closeWhenOnMobile():void {\n if (this.deviceService.isMobile) {\n this.closeMenu();\n window.OpenProject.guardedLocalStorage(this.localStorageStateKey, 'false');\n }\n }\n\n public saveWidth(width?:number):void {\n this.setWidth(width);\n window.OpenProject.guardedLocalStorage(this.localStorageKey, String(this.elementWidth));\n window.OpenProject.guardedLocalStorage(this.localStorageStateKey, String(this.elementWidth === 0));\n }\n\n public setWidth(width?:any):void {\n if (width !== undefined) {\n // Leave a minimum amount of space for space for the content\n const maxMenuWidth = this.deviceService.isMobile ? window.innerWidth - 120 : window.innerWidth - 520;\n if (width > maxMenuWidth) {\n this.elementWidth = maxMenuWidth;\n } else {\n this.elementWidth = width as number;\n }\n }\n\n this.snapBack();\n this.setToggleTitle();\n this.toggleClassHidden();\n\n this.global.showNavigation = this.showNavigation;\n this.htmlNode.style.setProperty('--main-menu-width', `${this.elementWidth}px`);\n\n // Send change event when size of menu is changing (menu toggled or resized)\n const changeEvent = jQuery.Event('change');\n this.changeData.next(changeEvent);\n }\n\n public get showNavigation():boolean {\n return (this.elementWidth >= this.elementMinWidth);\n }\n\n private snapBack():void {\n if (this.elementWidth < this.elementMinWidth) {\n this.elementWidth = 0;\n }\n }\n\n private setToggleTitle():void {\n if (this.showNavigation) {\n this.toggleTitle = this.I18n.t('js.label_hide_project_menu');\n } else {\n this.toggleTitle = this.I18n.t('js.label_expand_project_menu');\n }\n this.titleData.next(this.toggleTitle);\n }\n\n private toggleClassHidden():void {\n this.hideElements.toggleClass('hidden-navigation', !this.showNavigation);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { input } from 'reactivestates';\nimport { Observable } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nexport type ModelLinks = { [action:string]:any };\nexport type ModelLinksHash = { [model:string]:ModelLinks };\n\n@Injectable({ providedIn: 'root' })\nexport class AuthorisationService {\n private links = input({});\n\n public initModelAuth(modelName:string, modelLinks:ModelLinks) {\n this.links.doModify((value:ModelLinksHash) => {\n const links = { ...value };\n links[modelName] = modelLinks;\n return links;\n });\n }\n\n public observeUntil(unsubscribe:Observable) {\n return this.links.values$().pipe(takeUntil(unsubscribe));\n }\n\n public can(modelName:string, action:string) {\n const links:ModelLinksHash = this.links.getValueOr({});\n return links[modelName] && (action in links[modelName]);\n }\n\n public cannot(modelName:string, action:string) {\n return !this.can(modelName, action);\n }\n}\n","import { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\n\nexport class ApiV3Paths {\n readonly apiV3Base:string;\n\n constructor(basePath:string) {\n this.apiV3Base = `${basePath}/api/v3`;\n }\n\n public get openApiSpecPath():string {\n return `${this.apiV3Base}/spec.json`;\n }\n\n /**\n * Preview markup path\n *\n * Primarily used from ckeditor-augmented-textarea\n * https://github.com/opf/commonmark-ckeditor-build/\n *\n * @param context\n */\n public previewMarkup(context:string) {\n const base = `${this.apiV3Base}/render/markdown`;\n\n if (context) {\n return `${base}?context=${context}`;\n }\n return base;\n }\n\n /**\n * Principals autocompleter path\n *\n * Primarily used from ckeditor-augmented-textarea\n * https://github.com/opf/commonmark-ckeditor-build/\n *\n */\n public principals(projectId:string|number, term:string|null) {\n const filters:ApiV3FilterBuilder = new ApiV3FilterBuilder();\n // Only real and activated users:\n filters.add('status', '!', ['3']);\n // that are members of that project:\n filters.add('member', '=', [projectId.toString()]);\n // That are users:\n filters.add('type', '=', ['User', 'Group']);\n\n if (term && term.length > 0) {\n // Containing the that substring:\n filters.add('name', '~', [term]);\n }\n\n return `${this.apiV3Base\n }/principals?${\n filters.toParams({ sortBy: '[[\"name\",\"asc\"]]', offset: '1', pageSize: '10' })}`;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { ApiV3Paths } from './apiv3-paths';\n\n@Injectable({ providedIn: 'root' })\nexport class PathHelperService {\n public readonly appBasePath = window.appBasePath || '';\n\n public readonly api = {\n v3: new ApiV3Paths(this.appBasePath),\n };\n\n public get staticBase() {\n return this.appBasePath;\n }\n\n public attachmentDownloadPath(attachmentIdentifier:string, slug:string|undefined) {\n const path = `${this.staticBase}/attachments/${attachmentIdentifier}`;\n\n if (slug) {\n return `${path}/${slug}`;\n }\n return path;\n }\n\n public attachmentContentPath(attachmentIdentifier:number|string) {\n return `${this.staticBase}/attachments/${attachmentIdentifier}/content`;\n }\n\n public fileLinksPath():string {\n return `${this.api.v3.apiV3Base}/file_links`;\n }\n\n public ifcModelsPath(projectIdentifier:string) {\n return `${this.staticBase}/projects/${projectIdentifier}/ifc_models`;\n }\n\n public ifcModelsNewPath(projectIdentifier:string) {\n return `${this.ifcModelsPath(projectIdentifier)}/new`;\n }\n\n public ifcModelsEditPath(projectIdentifier:string, modelId:number|string) {\n return `${this.ifcModelsPath(projectIdentifier)}/${modelId}/edit`;\n }\n\n public ifcModelsDeletePath(projectIdentifier:string, modelId:number|string) {\n return `${this.ifcModelsPath(projectIdentifier)}/${modelId}`;\n }\n\n public bimDetailsPath(projectIdentifier:string, workPackageId:string, viewpoint:number|string|null = null) {\n let path = `${this.projectPath(projectIdentifier)}/bcf/details/${workPackageId}`;\n\n if (viewpoint !== null) {\n path += `?query_props=%7B\"t\"%3A\"id%3Adesc\"%2C\"dr\"%3A\"splitCards\"%7D&viewpoint=${viewpoint}`;\n }\n\n return path;\n }\n\n public highlightingCssPath() {\n return `${this.staticBase}/highlighting/styles`;\n }\n\n public forumPath(projectIdentifier:string, forumIdentifier:string) {\n return `${this.projectForumPath(projectIdentifier)}/${forumIdentifier}`;\n }\n\n public keyboardShortcutsHelpPath() {\n return `${this.staticBase}/help/keyboard_shortcuts`;\n }\n\n public messagePath(messageIdentifier:string) {\n return `${this.staticBase}/topics/${messageIdentifier}`;\n }\n\n public myPagePath() {\n return `${this.staticBase}/my/page`;\n }\n\n public myNotificationsSettingsPath() {\n return `${this.staticBase}/my/notifications`;\n }\n\n public newsPath(newsId:string) {\n return `${this.staticBase}/news/${newsId}`;\n }\n\n public notificationsPath():string {\n return `${this.staticBase}/notifications`;\n }\n\n public loginPath() {\n return `${this.staticBase}/login`;\n }\n\n public projectsPath() {\n return `${this.staticBase}/projects`;\n }\n\n public projectsNewPath():string {\n return `${this.staticBase}/projects/new`;\n }\n\n public projectPath(projectIdentifier:string) {\n return `${this.projectsPath()}/${projectIdentifier}`;\n }\n\n public projectActivityPath(projectIdentifier:string) {\n return `${this.projectPath(projectIdentifier)}/activity`;\n }\n\n public projectForumPath(projectIdentifier:string) {\n return `${this.projectPath(projectIdentifier)}/forums`;\n }\n\n public projectCalendarPath(projectId:string) {\n return `${this.projectPath(projectId)}/calendar`;\n }\n\n public projectMembershipsPath(projectId:string) {\n return `${this.projectPath(projectId)}/members`;\n }\n\n public projectNewsPath(projectId:string) {\n return `${this.projectPath(projectId)}/news`;\n }\n\n public projectTimeEntriesPath(projectIdentifier:string) {\n return `${this.projectPath(projectIdentifier)}/cost_reports`;\n }\n\n public projectWikiPath(projectId:string) {\n return `${this.projectPath(projectId)}/wiki`;\n }\n\n public projectWorkPackagePath(projectId:string, wpId:string|number) {\n return `${this.projectWorkPackagesPath(projectId)}/${wpId}`;\n }\n\n public projectWorkPackagesPath(projectId:string) {\n return `${this.projectPath(projectId)}/work_packages`;\n }\n\n public projectWorkPackageNewPath(projectId:string) {\n return `${this.projectWorkPackagesPath(projectId)}/new`;\n }\n\n public projectBoardsPath(projectIdentifier:string|null) {\n if (projectIdentifier) {\n return `${this.projectPath(projectIdentifier)}/boards`;\n }\n return `${this.staticBase}/boards`;\n }\n\n public projectDashboardsPath(projectIdentifier:string) {\n return `${this.projectPath(projectIdentifier)}/dashboards`;\n }\n\n public timeEntriesPath(workPackageId:string|number) {\n const suffix = '/time_entries';\n\n if (workPackageId) {\n return this.workPackagePath(workPackageId) + suffix;\n }\n return this.staticBase + suffix; // time entries root path\n }\n\n public usersPath() {\n return `${this.staticBase}/users`;\n }\n\n public groupsPath() {\n return `${this.staticBase}/groups`;\n }\n\n public placeholderUsersPath() {\n return `${this.staticBase}/placeholder_users`;\n }\n\n public userPath(id:string|number) {\n return `${this.usersPath()}/${id}`;\n }\n\n public placeholderUserPath(id:string|number) {\n return `${this.placeholderUsersPath()}/${id}`;\n }\n\n public groupPath(id:string|number) {\n return `${this.groupsPath()}/${id}`;\n }\n\n public rolesPath() {\n return `${this.staticBase}/roles`;\n }\n\n public rolePath(id:string|number) {\n return `${this.rolesPath()}/${id}`;\n }\n\n public versionsPath() {\n return `${this.staticBase}/versions`;\n }\n\n public versionEditPath(id:string|number) {\n return `${this.staticBase}/versions/${id}/edit`;\n }\n\n public versionShowPath(id:string|number) {\n return `${this.staticBase}/versions/${id}`;\n }\n\n public workPackagesPath() {\n return `${this.staticBase}/work_packages`;\n }\n\n public workPackagePath(id:string|number) {\n return `${this.staticBase}/work_packages/${id}`;\n }\n\n public workPackageCopyPath(workPackageId:string|number) {\n return `${this.workPackagePath(workPackageId)}/copy`;\n }\n\n public workPackageDetailsCopyPath(projectIdentifier:string, workPackageId:string|number) {\n return `${this.projectWorkPackagesPath(projectIdentifier)}/details/${workPackageId}/copy`;\n }\n\n public workPackagesBulkDeletePath() {\n return `${this.workPackagesPath()}/bulk`;\n }\n\n public textFormattingHelp() {\n return `${this.staticBase}/help/text_formatting`;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\n\n@Injectable()\nexport class FirstRouteService {\n public name:string;\n\n public params:any;\n\n constructor() {}\n\n public get isEmpty() {\n return !this.name;\n }\n\n public setIfFirst(stateName:string|undefined, params:any) {\n if (!this.isEmpty || !stateName) {\n return;\n }\n\n this.name = stateName;\n this.params = params;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport { State } from 'reactivestates';\nimport { Injectable } from '@angular/core';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport { Observable } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { States } from 'core-app/core/states/states.service';\nimport { ISchemaProxy, SchemaProxy } from 'core-app/features/hal/schemas/schema-proxy';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { WorkPackageSchemaProxy } from 'core-app/features/hal/schemas/work-package-schema-proxy';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\n\n@Injectable()\nexport class SchemaCacheService extends StateCacheService {\n constructor(readonly states:States,\n readonly halResourceService:HalResourceService) {\n super(states.schemas);\n }\n\n public state(id:string|HalResource):State {\n return super.state(this.stateKey(id));\n }\n\n /**\n * Returns the schema of the provided resource.\n * This method assumes the schema is loaded and will fail if it is not.\n * @deprecated Assuming the schema to be loaded is deprecated. Rely on the states instead.\n * @param resource The HalResource for which the schema is to be returned\n * @return The schema for the HalResource\n */\n of(resource:HalResource):ISchemaProxy {\n const schema = this.state(resource).value;\n\n if (!schema) {\n throw new Error(`Schema for resource ${resource} was expected to be loaded but isn't.`);\n }\n\n if (resource._type === 'WorkPackage') {\n return WorkPackageSchemaProxy.create(schema, resource);\n }\n return SchemaProxy.create(schema, resource);\n }\n\n public getSchemaHref(resource:HalResource):string {\n const href = resource.$links.schema?.href;\n\n if (!href) {\n throw new Error(`Resource ${resource} has no schema to load.`);\n }\n\n return href;\n }\n\n /**\n * Ensure the given schema identified by its href is currently loaded.\n * @param resource The resource with a schema property or a string to the schema href.\n * @return A promise with the loaded schema.\n */\n ensureLoaded(resource:HalResource|string):Promise {\n const href = resource instanceof HalResource ? this.getSchemaHref(resource) : resource;\n\n return this\n .requireAndStream(href)\n .pipe(\n take(1),\n )\n .toPromise() as unknown as Promise;\n }\n\n /**\n * Require the value to be loaded either when forced or the value is stale\n * according to the cache interval specified for this service.\n *\n * Returns an observable to the values stream of the state.\n *\n * @param id The state to require\n * @param force Load the value anyway.\n */\n public requireAndStream(href:string, force = false):Observable {\n // Refresh when stale or being forced\n if (this.stale(href) || force) {\n this.clearAndLoad(\n href,\n this.load(href),\n );\n }\n\n return this.state(href).values$();\n }\n\n /**\n * Load the associated schema for the given work package, if needed.\n */\n protected load(href:string):Observable {\n return this\n .halResourceService\n .get(href)\n .pipe(\n take(1),\n );\n }\n\n protected loadAll(hrefs:string[]):Promise {\n return Promise.all(hrefs.map((href) => this.load(href)));\n }\n\n /**\n * Places the schema in the schema state of the resource.\n * @param resource The resource for which the schema is to be updated\n * @param schema\n */\n update(resource:HalResource, schema:SchemaResource) {\n this.multiState.get(this.stateKey(resource)).putValue(schema);\n }\n\n private stateKey(id:string|HalResource):string {\n if (id instanceof HalResource) {\n return this.getSchemaHref(id);\n }\n return id;\n }\n}\n","export const enterpriseEditionUrl = 'https://www.openproject.org/enterprise-edition/?op_edition=community-edition';\n\nexport const contactUrl:{ [locale:string]:string } = {\n en: 'https://www.openproject.org/contact/',\n de: 'https://www.openproject.org/de/kontakt/',\n};\n\nexport const pricingUrl = 'https://www.openproject.org/pricing';\n\nexport const enterpriseDocsUrl:{ [key:string]:string } = {\n website: 'https://www.openproject.org/enterprise-edition/',\n boards: 'https://www.openproject.org/docs/user-guide/agile-boards/#action-boards-enterprise-add-on',\n tableHighlighting: 'https://www.openproject.org/docs/user-guide/work-packages/work-package-table-configuration/#attribute-highlighting-enterprise-add-on',\n graphWidgets: 'https://www.openproject.org/docs/user-guide/project-overview/#work-package-graph-widgets-enterprise-add-on',\n};\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n\nimport { ComponentType } from '@angular/cdk/portal';\nimport { ApplicationRef } from '@angular/core';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\n\n/**\n * Optional bootstrap definition to allow selecting all matching\n * DOM nodes to manually bootstrap them.\n *\n * This differs from Angular's bootstrap module definition since it expects these\n * entries to be present on ALL pages. This is never the case for our optional\n * bootstrapped components.\n */\nexport interface OptionalBootstrapDefinition {\n // The DOM selector used to locate an optional node\n selector:string;\n // The component class tied to it.\n cls:ComponentType;\n // Whether the component may be embeddable in dynamically generated responses\n // e.g., previews\n embeddable?:boolean;\n}\n\n/**\n * Static lookup table for dynamically bootstrapped components within our application\n */\nexport class DynamicBootstrapper {\n private static optionalBoostrapComponents:OptionalBootstrapDefinition[] = [];\n\n /**\n * Register an optional bootstrap component to be dynamically bootstrapped\n * whenever it occurs in the initially loaded DOM.\n *\n * @param {OptionalBootstrapDefinition} definition\n */\n public static register(...defs:OptionalBootstrapDefinition[]) {\n this.optionalBoostrapComponents.push(...defs);\n }\n\n /**\n * Perform bootstrapping of matched elements within the given document.\n *\n * @param {ApplicationRef} appRef The application reference to lookup elements.\n * @param {Document} doc The document element\n * @param {OptionalBootstrapDefinition[]|undefined} definitions An optional set of components to bootstrap\n */\n public static bootstrapOptionalDocument(appRef:ApplicationRef, doc:Document, definitions = this.optionalBoostrapComponents) {\n this.performBootstrap(appRef, doc, false, definitions);\n }\n\n /**\n * Perform bootstrapping of embeddable elements within the given node.\n *\n * @param {ApplicationRef} appRef The application reference to lookup elements.\n * @param {HTMLElement} element A node to bootstrap elements within.\n * @param {OptionalBootstrapDefinition[]|undefined} definitions An optional set of components to bootstrap\n */\n public static bootstrapOptionalEmbeddable(appRef:ApplicationRef, element:HTMLElement, definitions = this.optionalBoostrapComponents) {\n // Delay the execution to avoid bootstrapping the embedded components while\n // the app is running the Change Detection. This was throwing \"ApplicationRef.tick\n // is called recursively\" error because of bootstrapOptionalEmbeddable and\n // bootstrapOptionalDocument were called too close (ie: ckEditor macros).\n Promise.resolve().then(() => this.performBootstrap(appRef, element, true, definitions));\n }\n\n /**\n * Get embeddable components\n */\n public static getEmbeddable() {\n return this.optionalBoostrapComponents.filter((el) => el.embeddable);\n }\n\n /**\n * Bootstrap within a given document (globally, all components available) or within an element (embeddable compoennts\n * only).\n *\n * @param {ApplicationRef} appRef\n * @param {Document | HTMLElement} root\n * @param {boolean} embedded\n */\n private static performBootstrap(appRef:ApplicationRef, root:Document|HTMLElement, embedded:boolean, definitions:OptionalBootstrapDefinition[]) {\n definitions\n .forEach((el) => {\n // Skip non-embeddable components in an embedded bootstrap.\n if (embedded && !el.embeddable) {\n return;\n }\n\n const elements = root.querySelectorAll(el.selector);\n for (let i = 0; i < elements.length; i++) {\n const target = elements[i];\n\n if (!embedded && target.closest('[op-dynamic-bootstrap]')) {\n debugLog(`Skipping nested bootstrap ${el.selector} in %O`, target);\n return;\n }\n\n appRef.bootstrap(el.cls, target);\n target.setAttribute('op-dynamic-bootstrap', 'true');\n }\n });\n }\n}\n","export const demoProjectName = 'Demo project';\nexport const scrumDemoProjectName = 'Scrum project';\nexport const onboardingTourStorageKey = 'openProject-onboardingTour';\nexport type OnboardingTourNames = 'prepareBacklogs'|'backlogs'|'taskboard'|'homescreen'|'main';\n\nexport enum ProjectName {\n demo = 'demo',\n scrum = 'scrum',\n}\n\nfunction matchingFilter(list:NodeListOf, filterFunction:(match:HTMLElement) => boolean):HTMLElement|null {\n for (let i = 0; i < list.length; i++) {\n if (filterFunction(list[i])) {\n return list[i];\n }\n }\n\n return null;\n}\n\nexport function waitForElement(\n selector:string,\n containerSelector:string,\n execFunction:(match:HTMLElement) => void,\n filterFunction:(match:HTMLElement) => boolean = () => true,\n):void {\n const container = document.querySelector(containerSelector) as HTMLElement;\n // If the element is ready immediately\n const initial = matchingFilter(container.querySelectorAll(selector), filterFunction);\n if (initial) {\n execFunction(initial);\n return;\n }\n\n // Wait for the element to be ready\n const observer = new MutationObserver((mutations, observerInstance) => {\n const matches = matchingFilter(container.querySelectorAll(selector), filterFunction);\n if (matches) {\n execFunction(matches);\n observerInstance.disconnect();\n }\n });\n\n observer.observe(container, {\n childList: true,\n subtree: true,\n });\n}\n\nexport function demoProjectsLinks() {\n const demoProjects = [];\n const demoProjectsLink = jQuery(`.widget-box.welcome a:contains(${demoProjectName})`);\n const scrumDemoProjectsLink = jQuery(`.widget-box.welcome a:contains(${scrumDemoProjectName})`);\n\n if (demoProjectsLink.length) {\n demoProjects.push(demoProjectsLink);\n }\n if (scrumDemoProjectsLink.length) {\n demoProjects.push(scrumDemoProjectsLink);\n }\n\n return demoProjects;\n}\n\nexport function preventClickHandler(e:any) {\n e.preventDefault();\n e.stopPropagation();\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\n(function ($) {\n $(() => {\n // set selected page for menu tree if provided.\n $('[data-selected-page]').closest('.tree-menu--container').each((_i:number, tree:HTMLElement) => {\n const selectedPage = $(tree).data('selected-page');\n\n if (selectedPage) {\n const selected = $(`[slug=\"${selectedPage}\"]`, tree);\n selected.toggleClass('-selected', true);\n if (selected.length > 0) {\n selected[0].scrollIntoView();\n }\n }\n });\n\n function toggle(event:any) {\n // ignore the event if a key different from ENTER was pressed.\n if (event.type === 'keypress' && event.which !== 13) {\n return false;\n }\n\n const target = $(event.target);\n const targetList = target.closest('ul.-with-hierarchy > li');\n targetList.toggleClass('-hierarchy-collapsed -hierarchy-expanded');\n return false;\n }\n\n // set click handlers for expanding and collapsing tree nodes\n $('.pages-hierarchy.-with-hierarchy .tree-menu--hierarchy-span').on('click keypress', toggle);\n });\n}(jQuery));\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\n/**\n * A set of global helpers that were used in the app/assets/javascript namespace\n * but exposed globally.\n *\n * It is used in some `link_to_function` helpers in Rails templates\n */\nexport class GlobalHelpers {\n public checkAll(selector:any, checked:any) {\n document\n .querySelectorAll(`#${selector} input[type=\"checkbox\"]:not([disabled])`)\n .forEach((el:HTMLInputElement) => el.checked = checked);\n }\n\n public toggleCheckboxesBySelector(selector:any) {\n const boxes = jQuery(selector);\n let all_checked = true;\n for (let i = 0; i < boxes.length; i++) {\n if (boxes[i].checked === false) {\n all_checked = false;\n }\n }\n for (let i = 0; i < boxes.length; i++) {\n boxes[i].checked = !all_checked;\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { OpenProjectPluginContext } from 'core-app/features/plugins/plugin-context';\nimport { input, InputState } from 'reactivestates';\nimport { take } from 'rxjs/operators';\nimport { GlobalHelpers } from 'core-app/core/setup/globals/global-helpers';\n\n/**\n * OpenProject instance methods\n */\nexport class OpenProject {\n public pluginContext:InputState = input();\n\n public helpers = new GlobalHelpers();\n\n /** Globally setable variable whether the page was edited */\n public pageWasEdited = false;\n\n /** Globally setable variable whether the page form is submitted.\n * Necessary to avoid a data loss warning on beforeunload */\n public pageIsSubmitted = false;\n\n /** Globally setable variable whether any of the EditFormComponent\n * contain changes.\n * Necessary to show a data loss warning on beforeunload when clicking\n * on a link out of the Angular app (ie: main side menu)\n * */\n public editFormsContainModelChanges:boolean;\n\n public getPluginContext():Promise {\n return this.pluginContext\n .values$()\n .pipe(take(1))\n .toPromise();\n }\n\n public get urlRoot():string {\n return jQuery('meta[name=app_base_path]').attr('content') || '';\n }\n\n public get environment():string {\n return jQuery('meta[name=openproject_initializer]').data('environment');\n }\n\n public get edition():string {\n return jQuery('meta[name=openproject_initializer]').data('edition');\n }\n\n public get isStandardEdition():boolean {\n return this.edition === 'standard';\n }\n\n public get isBimEdition():boolean {\n return this.edition === 'bim';\n }\n\n /**\n * Guard access to reads and writes to the localstorage due to corrupted local databases\n * in Firefox happening in one larger client.\n *\n * NS_ERROR_FILE_CORRUPTED\n *\n * @param {string} key\n * @param {string} newValue\n * @returns {string | undefined}\n */\n public guardedLocalStorage(key:string, newValue?:string):string | void {\n try {\n if (newValue !== undefined) {\n window.localStorage.setItem(key, newValue);\n } else {\n const value = window.localStorage.getItem(key);\n return value === null ? undefined : value;\n }\n } catch (e) {\n console.error('Failed to access your browsers local storage. Is your local database corrupted?');\n }\n }\n}\n\nwindow.OpenProject = new OpenProject();\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\n// 'Global' dependencies\n//\n// dependencies required by classic (Rails) and Angular application.\n\n// Lodash\nrequire('expose-loader?_!lodash');\n\n// jQuery\nrequire('expose-loader?jQuery!jquery');\nrequire('jquery-ujs');\n\nrequire('expose-loader?mousetrap!mousetrap/mousetrap.js');\n\n// Angular dependencies\nrequire('expose-loader?dragula!dragula/dist/dragula.min.js');\nrequire('@uirouter/angular');\n\n// Jquery UI\nrequire('jquery-ui/ui/core.js');\nrequire('jquery-ui/ui/position.js');\nrequire('jquery-ui/ui/disable-selection.js');\nrequire('jquery-ui/ui/widgets/sortable.js');\nrequire('jquery-ui/ui/widgets/dialog.js');\nrequire('jquery-ui/ui/widgets/tooltip.js');\n\nrequire('expose-loader?moment!moment');\nrequire('moment/locale/en-gb.js');\nrequire('moment/locale/de.js');\n\nrequire('jquery.caret');\n// Text highlight for autocompleter\nrequire('mark.js/dist/jquery.mark.min.js');\n// Micro Text fuzzy search library\nrequire('fuse.js');\n\nrequire('moment-timezone/builds/moment-timezone-with-data.min.js');\n\nrequire('expose-loader?URI!urijs');\nrequire('urijs/src/URITemplate');\n\nrequire('expose-loader?I18n!core-vendor/i18n');\n\n// Localization for fullcalendar\nrequire('@fullcalendar/core/locales-all');\n","import { Injectable } from '@angular/core';\nimport {\n Observable,\n Subject,\n} from 'rxjs';\nimport { ActionCreator } from 'ts-action/action';\nimport { ActionType } from 'ts-action';\nimport { ofType } from 'ts-action-operators';\n\nexport interface Action {\n type:string;\n\n [key:string]:unknown;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ActionsService {\n private actions = new Subject();\n\n /** Entire event stream */\n public actions$ = this.actions.asObservable();\n\n /**\n * Observe one or more event type\n * @param action The set of action creators to listen for\n * */\n ofType(action:C):Observable> {\n return this\n .actions$\n .pipe(\n ofType(action),\n );\n }\n\n dispatch(action:Action):void {\n this.actions.next(action);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { EntityStore, StoreConfig } from '@datorama/akita';\nimport { IAttachment } from 'core-app/core/state/attachments/attachment.model';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\n\nexport interface AttachmentsState extends CollectionState {}\n\n@StoreConfig({ name: 'attachments' })\nexport class AttachmentsStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport {\n HttpHeaders,\n} from '@angular/common/http';\nimport { applyTransaction } from '@datorama/akita';\nimport {\n from,\n Observable,\n} from 'rxjs';\nimport {\n catchError,\n map,\n tap,\n} from 'rxjs/operators';\nimport { AttachmentsStore } from 'core-app/core/state/attachments/attachments.store';\nimport { IAttachment } from 'core-app/core/state/attachments/attachment.model';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport {\n OpenProjectFileUploadService,\n UploadFile,\n} from 'core-app/core/file-upload/op-file-upload.service';\nimport { OpenProjectDirectFileUploadService } from 'core-app/core/file-upload/op-direct-file-upload.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { HalLink } from 'core-app/features/hal/hal-link/hal-link';\nimport isNewResource, { HAL_NEW_RESOURCE_ID } from 'core-app/features/hal/helpers/is-new-resource';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { insertCollectionIntoState, removeEntityFromCollectionAndState } from 'core-app/core/state/collection-store';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Injectable()\nexport class AttachmentsResourceService extends ResourceCollectionService {\n @InjectField() I18n:I18nService;\n\n @InjectField() fileUploadService:OpenProjectFileUploadService;\n\n @InjectField() directFileUploadService:OpenProjectDirectFileUploadService;\n\n @InjectField() configurationService:ConfigurationService;\n\n @InjectField() toastService:ToastService;\n\n /**\n * This method ensures that a specific collection is fetched, if not available.\n *\n * @param key The collection key, of the required collection.\n */\n requireCollection(key:string):void {\n if (this.store.getValue().collections[key]) {\n return;\n }\n\n this.fetchAttachments(key).subscribe();\n }\n\n /**\n * Fetches attachments by the attachment collection self link.\n * This link is used as key to store the result collection in the resource store.\n *\n * @param attachmentsSelfLink The self link of the attachment collection from the parent resource.\n */\n fetchAttachments(attachmentsSelfLink:string):Observable> {\n return this.http\n .get>(attachmentsSelfLink)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, attachmentsSelfLink)),\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n /**\n * Sends deletion request and updates the store collection of attachments.\n *\n * @param collectionKey The identifier of the current attachment collection.\n * @param attachment The attachment to be deleted.\n */\n removeAttachment(collectionKey:string, attachment:IAttachment):Observable {\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n return this.http\n .delete(attachment._links.delete.href, { withCredentials: true, headers })\n .pipe(\n tap(() => removeEntityFromCollectionAndState(this.store, attachment.id, collectionKey)),\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n /**\n * Sends an upload request and updates the store collection of attachments.\n *\n * @param resource The HAL resource to attach the files to\n * @param files The upload files to be attached.\n */\n attachFiles(resource:HalResource, files:UploadFile[]):Observable {\n const identifier = AttachmentsResourceService.getAttachmentsSelfLink(resource) || HAL_NEW_RESOURCE_ID;\n const href = this.getUploadTarget(resource);\n const isDirectUpload = !!this.getDirectUploadLink(resource);\n\n return this\n .addAttachments(\n identifier,\n href,\n files,\n isDirectUpload,\n );\n }\n\n /**\n * Sends an upload request and updates the store collection of attachments.\n *\n * @param collectionKey The identifier of the current attachment collection.\n * @param uploadHref The API target to perform the call against.\n * @param files The upload files to be attached.\n * @param isDirectUpload whether the provided upload target is a direct upload URL.\n */\n addAttachments(\n collectionKey:string,\n uploadHref:string,\n files:UploadFile[],\n isDirectUpload = false,\n ):Observable {\n return this\n .uploadAttachments(uploadHref, files, isDirectUpload)\n .pipe(\n tap((attachments) => {\n applyTransaction(() => {\n this.store.add(attachments);\n this.store.update(({ collections }) => (\n {\n collections: {\n ...collections,\n [collectionKey]: {\n ...collections[collectionKey],\n ids: (collections[collectionKey]?.ids || []).concat(attachments.map((a) => a.id)),\n },\n },\n }\n ));\n });\n }),\n );\n }\n\n private uploadAttachments(href:string, files:UploadFile[], isDirectUpload:boolean):Observable {\n const { uploads, finished } = isDirectUpload\n ? this.directFileUploadService.uploadAndMapResponse(href, files)\n : this.fileUploadService.uploadAndMapResponse(href, files);\n\n const message = this.I18n.t('js.label_upload_notification');\n const notification = this.toastService.addAttachmentUpload(message, uploads);\n\n return from(finished)\n .pipe(\n tap(() => {\n setTimeout(() => this.toastService.remove(notification), 700);\n }),\n map((result) => result.map(({ response }) => (response as HalResource).$source as IAttachment)),\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n /**\n * Get the upload target for a HAL resource, depending on its\n * persisted state and available links.\n *\n * This will be one of the following:\n * - The direct upload PREPARE URL endpoint for the resource (if direct upload active + resource persisted)\n * - The generic prepare URL endpoint (if direct upload active)\n * - The resource's own upload HAL link (if persisted)\n * - The generic APIv3 attachments endpoint (new resource, no direct upload)\n *\n * @param resource The resource we're uploading attachments for.\n * @returns {string} The API target URL to perform the upload against.\n * @private\n */\n private getUploadTarget(resource:HalResource):string {\n return this.getDirectUploadLink(resource)\n || AttachmentsResourceService.getAttachmentsSelfLink(resource)\n || this.apiV3Service.attachments.path;\n }\n\n private getDirectUploadLink(resource:HalResource):string|null {\n const links = resource.$links as unknown&{ prepareAttachment:HalLink };\n\n if (links.prepareAttachment) {\n return links.prepareAttachment.href as string;\n }\n\n if (isNewResource(resource)) {\n return this.configurationService.prepareAttachmentURL as string|null;\n }\n\n return null;\n }\n\n private static getAttachmentsSelfLink(resource:HalResource):string|null {\n const attachments = resource.attachments as unknown&{ href?:string };\n return attachments?.href || null;\n }\n\n protected createStore():CollectionStore {\n return new AttachmentsStore();\n }\n\n protected basePath():string {\n return this.apiV3Service.attachments.path;\n }\n}\n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\nimport { ICapability } from 'core-app/core/state/capabilities/capability.model';\n\nexport interface CapabilitiesState extends CollectionState {\n}\n\n@StoreConfig({ name: 'capabilities' })\nexport class CapabilitiesStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n catchError,\n map,\n switchMap,\n} from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { collectionKey } from 'core-app/core/state/collection-store';\nimport { ICapability } from 'core-app/core/state/capabilities/capability.model';\nimport { CapabilitiesStore } from 'core-app/core/state/capabilities/capabilities.store';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Injectable()\nexport class CapabilitiesResourceService extends ResourceCollectionService {\n @InjectField() toastService:ToastService;\n\n /**\n * Require the available capabilities for the given filter params\n * Returns a cached set if it was loaded already.\n *\n * @param params List params to require\n * @private\n */\n public require$(params:ApiV3ListParameters):Observable {\n const key = collectionKey(params);\n if (this.collectionExists(key) || this.collectionLoading(key)) {\n return this.loadedCollection(key);\n }\n\n return this\n .fetchCapabilities(params)\n .pipe(\n switchMap(() => this.loadedCollection(key)),\n );\n }\n\n /**\n * Returns the loaded capabilities for a context\n */\n public loadedCapabilities$(contextId:string):Observable {\n return this\n .query\n .selectAll()\n .pipe(\n map((capabilities) => capabilities.filter((cap) => cap._links.context.href.endsWith(`/${contextId}`))),\n );\n }\n\n public fetchCapabilities(params:ApiV3ListParameters):Observable> {\n return this\n .fetchCollection(params)\n .pipe(\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n protected createStore():CollectionStore {\n return new CapabilitiesStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .capabilities\n .path;\n }\n}\n","import {\n applyTransaction,\n EntityState,\n EntityStore,\n ID,\n} from '@datorama/akita';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport {\n ApiV3ListParameters,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { IHalResourceLinks } from 'core-app/core/state/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { filter } from 'lodash';\n\nexport interface CollectionResponse {\n ids:ID[];\n}\n\nexport interface CollectionState extends EntityState {\n /** Loaded notification collections */\n collections:Record;\n\n /** Loading collections */\n loadingCollections:Record;\n}\n\nexport interface CollectionItem {\n id:ID;\n}\n\nexport function mapHALCollectionToIDCollection(collection:IHALCollection):CollectionResponse {\n return {\n ids: collection._embedded.elements.map((el) => el.id),\n };\n}\n\n/**\n * Initialize the collection part of the entity store\n */\nexport function createInitialCollectionState():CollectionState {\n return {\n collections: {},\n loadingCollections: {},\n };\n}\n\n/**\n * Returns the collection key for the given APIv3 parameters\n *\n * @param params list params\n */\nexport function collectionKey(params:ApiV3ListParameters):string {\n return listParamsString(params);\n}\n\n/**\n * Mark a collection key as being loaded\n *\n * @param store An entity store for the collection\n * @param collectionUrl The key to insert the collection at\n * @param loading The loading state\n */\nexport function setCollectionLoading(\n store:EntityStore>,\n collectionUrl:string,\n):void {\n store.update(({ loadingCollections }) => (\n {\n loadingCollections: {\n ...loadingCollections,\n [collectionUrl]: true,\n },\n }\n ));\n}\n\n/**\n * Mark a collection key as no longer loading\n *\n * @param store An entity store for the collection\n * @param collectionUrl The key to insert the collection at\n */\nexport function removeCollectionLoading(\n store:EntityStore>,\n collectionUrl:string,\n):void {\n store.update(({ loadingCollections }) => (\n {\n loadingCollections: filter(loadingCollections, (_, key) => key !== collectionUrl),\n }\n ));\n}\n\n/**\n * Insert a collection into the given entity store\n *\n * @param store An entity store for the collection\n * @param collection A loaded collection\n * @param collectionUrl The key to insert the collection at\n */\nexport function insertCollectionIntoState(\n store:EntityStore>,\n collection:IHALCollection,\n collectionUrl:string,\n):void {\n const { elements } = collection._embedded as { elements:undefined|T[] };\n\n // Some JSON endpoints return no elements result if there are no elements\n const ids = elements?.map((el) => el.id) || [];\n\n applyTransaction(() => {\n // Avoid inserting when elements is not defined\n if (elements && elements.length > 0) {\n store.upsertMany(elements);\n }\n\n store.update(({ collections }) => (\n {\n collections: {\n ...collections,\n [collectionUrl]: {\n ids,\n },\n },\n }\n ));\n });\n}\n\nexport function removeEntityFromCollectionAndState(\n store:EntityStore>,\n entityId:ID,\n collectionUrl:string,\n):void {\n applyTransaction(() => {\n store.remove(entityId);\n store.update(({ collections }) => (\n {\n collections: {\n ...collections,\n [collectionUrl]: {\n ...collections[collectionUrl],\n ids: (collections[collectionUrl]?.ids || []).filter((id) => id !== entityId),\n },\n },\n }\n ));\n });\n}\n\nexport function collectionFrom(elements:T[]):IHALCollection {\n const count = elements.length;\n\n return {\n _type: 'Collection',\n count,\n total: count,\n pageSize: count,\n offset: 1,\n _embedded: {\n elements,\n },\n };\n}\n\n/**\n * Takes a collection of elements that do not have an ID, and extract the ID from self link.\n * @param collection a IHALCollection with elements that have a self link\n * @returns the same collection with elements extended with an ID derived from the self link.\n */\nexport function extendCollectionElementsWithId(\n collection:IHALCollection,\n):IHALCollection {\n const elements = collection._embedded.elements.map((element) => ({\n ...element,\n id: idFromLink(element._links.self.href),\n }));\n\n return {\n ...collection,\n _embedded: {\n ...collection._embedded,\n elements,\n },\n };\n}\n","import {\n EntityStore,\n StoreConfig,\n} from '@datorama/akita';\nimport {\n CollectionState,\n createInitialCollectionState,\n} from 'core-app/core/state/collection-store';\nimport { IDay } from 'core-app/core/state/days/day.model';\n\nexport interface DayState extends CollectionState {\n}\n\n@StoreConfig({ name: 'days' })\nexport class DayStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n finalize,\n map,\n take,\n tap,\n} from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport {\n ApiV3ListFilter,\n ApiV3ListParameters,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport {\n collectionKey,\n insertCollectionIntoState,\n removeCollectionLoading,\n setCollectionLoading,\n} from 'core-app/core/state/collection-store';\nimport { DayStore } from 'core-app/core/state/days/day.store';\nimport { IDay } from 'core-app/core/state/days/day.model';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\n\n@Injectable()\nexport class DayResourceService extends ResourceCollectionService {\n protected basePath():string {\n return this\n .apiV3Service\n .days\n .nonWorkingDays\n .path;\n }\n\n isNonWorkingDay$(input:Date):Promise {\n const date = moment(input).format('YYYY-MM-DD');\n\n return this\n .requireNonWorkingYear$(input)\n .pipe(\n map((days) => days.findIndex((day:IDay) => day.date === date) !== -1),\n take(1),\n )\n .toPromise();\n }\n\n requireNonWorkingYear$(date:Date|string):Observable {\n const from = moment(date).startOf('year').format('YYYY-MM-DD');\n const to = moment(date).endOf('year').format('YYYY-MM-DD');\n\n const filters:ApiV3ListFilter[] = [\n ['date', '<>d', [from, to]],\n ];\n\n return this.require({ filters });\n }\n\n requireNonWorkingYears$(start:Date|string, end:Date|string):Observable {\n const from = moment(start).startOf('year').format('YYYY-MM-DD');\n const to = moment(end).endOf('year').format('YYYY-MM-DD');\n\n const filters:ApiV3ListFilter[] = [\n ['date', '<>d', [from, to]],\n ];\n\n return this.require({ filters });\n }\n\n fetchCollection(params:ApiV3ListParameters):Observable> {\n const collectionURL = collectionKey(params);\n\n setCollectionLoading(this.store, collectionURL);\n\n return this\n .http\n .get>(this.basePath() + collectionURL)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, collectionURL)),\n finalize(() => removeCollectionLoading(this.store, collectionURL)),\n );\n }\n\n protected createStore():CollectionStore {\n return new DayStore();\n }\n}\n","import {\n EntityStore,\n StoreConfig,\n} from '@datorama/akita';\nimport {\n CollectionState,\n createInitialCollectionState,\n} from 'core-app/core/state/collection-store';\nimport { IWeekday } from 'core-app/core/state/days/weekday.model';\n\nexport interface WeekdayState extends CollectionState {\n}\n\n@StoreConfig({ name: 'weekdays' })\nexport class WeekdayStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n map,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport {\n EMPTY,\n Observable,\n} from 'rxjs';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport {\n extendCollectionElementsWithId,\n insertCollectionIntoState,\n} from 'core-app/core/state/collection-store';\nimport { WeekdayStore } from 'core-app/core/state/days/weekday.store';\nimport { IWeekday } from 'core-app/core/state/days/weekday.model';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\n\n@Injectable()\nexport class WeekdayResourceService extends ResourceCollectionService {\n require():Observable {\n return this\n .query\n .selectHasCache()\n .pipe(\n switchMap((hasCache) => (hasCache ? EMPTY : this.fetchWeekdays())),\n switchMap(() => this.query.selectAll()),\n );\n }\n\n protected fetchWeekdays():Observable> {\n const collectionURL = 'all'; // We load all weekdays\n\n return this\n .http\n .get>(this.basePath())\n .pipe(\n map((collection) => extendCollectionElementsWithId(collection)),\n tap((collection) => insertCollectionIntoState(this.store, collection, collectionURL)),\n );\n }\n\n protected createStore():CollectionStore {\n return new WeekdayStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .days\n .week\n .path;\n }\n}\n","import 'reflect-metadata';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { ActionCreator } from 'ts-action/action';\nimport { Action } from 'ts-action';\nimport { takeWhile } from 'rxjs/operators';\n\n/**\n * This interface specifies a constraint on the classes that can\n * be used as an @EffectHandler.\n *\n * As we depend on the ActionsService, we need that as a public property.\n */\nexport interface EffectClass {\n actions$:ActionsService;\n ngOnDestroy?():void;\n}\n\nconst EffectHandlers = Symbol('EffectHandlers');\n\ntype EffectHandlerItem = { callback:(action:Action) => void, action:ActionCreator };\n\n/**\n * The EffectHandler decorates a class to be used for effects callbacks\n * To use, add it to a store service like so\n *\n * ```\n * @Injectable()\n * @EffectHandler\n * export class FooStoreService {\n * @EffectCallback(someActionName)\n * private actionCallback(action:ReturnType) {\n * // Effect callback for the given action\n * }\n * }\n */\n/* The class decorator requires any[] args to it to function */\n\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\nexport function EffectHandler(constructor:T):any {\n return class extends constructor {\n private serviceDestroyed = false;\n\n /* The class decorator requires any[] args to it to function */\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n constructor(...args:any[]) {\n super(...args);\n\n // Access the handlers registered in the @EffectCallback method decorator\n // We're accessing a separate symbol on the base class that is not present\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const handlers = constructor.prototype[EffectHandlers] as Map;\n if (handlers) {\n handlers.forEach((item:EffectHandlerItem, key:string) => {\n debugLog(`[${constructor.name}] Subscribing to effect ${key}`);\n\n // Subscribe to the specified action for the duration of this service's life.\n this.actions$\n .ofType(item.action)\n .pipe(\n takeWhile(() => !this.serviceDestroyed),\n )\n .subscribe((instance) => {\n // Wrap callback in a try-catch to avoid completing the subscription.\n try {\n item.callback.call(this, instance);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n console.error(`Error thrown in effect callback ${key}: ${e}`);\n }\n });\n });\n }\n }\n\n ngOnDestroy():void {\n this.serviceDestroyed = true;\n if (super.ngOnDestroy) {\n super.ngOnDestroy();\n }\n }\n };\n}\n\n/**\n * The EffectCallback decorates a method of a `@EffectHandler` decorated class\n * to be used for effects callbacks.\n *\n * The decorator subscribes to the actionService for the given service for\n * the lifetime of the service.\n *\n * Example:\n *\n * ```\n * @Injectable()\n * @EffectHandler\n * export class FooStoreService {\n * @EffectCallback(someActionName)\n * private actionCallback(action:ReturnType) {\n * // Effect callback for the given action\n * }\n * }\n */\nexport function EffectCallback(action:ActionCreator) {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n return (service:unknown, property:string, descriptor:PropertyDescriptor):void => {\n const target = service as { [EffectHandlers]:Map };\n if (!target[EffectHandlers]) {\n // We're assigning the symbol property in the base class\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,no-param-reassign\n target[EffectHandlers] = new Map();\n }\n\n // Here we just add some information that class decorator will use\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n target[EffectHandlers].set(property, { action, callback: descriptor.value as (action:Action) => void });\n };\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\nimport { EntityStore, StoreConfig } from '@datorama/akita';\nimport { IFileLink } from 'core-app/core/state/file-links/file-link.model';\n\nexport interface FileLinksState extends CollectionState {}\n\n@StoreConfig({ name: 'file_links' })\nexport class FileLinksStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { applyTransaction } from '@datorama/akita';\nimport { Injectable } from '@angular/core';\nimport { HttpHeaders } from '@angular/common/http';\nimport { from, Observable, of } from 'rxjs';\nimport {\n groupBy,\n mergeMap,\n reduce,\n switchMap,\n tap,\n} from 'rxjs/operators';\n\nimport { IFileLink, IFileLinkOriginData } from 'core-app/core/state/file-links/file-link.model';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { FileLinksStore } from 'core-app/core/state/file-links/file-links.store';\nimport { insertCollectionIntoState, removeEntityFromCollectionAndState } from 'core-app/core/state/collection-store';\nimport { CollectionStore, ResourceCollectionService } from 'core-app/core/state/resource-collection.service';\nimport { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Injectable()\nexport class FileLinksResourceService extends ResourceCollectionService {\n protected createStore():CollectionStore {\n return new FileLinksStore();\n }\n\n protected basePath():string {\n return this.apiV3Service.file_links.path;\n }\n\n updateCollectionsForWorkPackage(fileLinksSelfLink:string):Observable {\n return this.http\n .get>(fileLinksSelfLink)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, fileLinksSelfLink)),\n switchMap((collection) => from(collection._embedded.elements)),\n groupBy(\n (fileLink) => fileLink._links.storage.href,\n (fileLink) => fileLink,\n ),\n mergeMap((group$) => {\n const seed = { storage: group$.key, fileLinks: [] as IFileLink[] };\n return group$.pipe(reduce((acc, fileLink) => {\n acc.fileLinks = [...acc.fileLinks, fileLink];\n return acc;\n }, seed));\n }),\n tap((fileLinkCollections) => {\n const storageId = idFromLink(fileLinkCollections.storage);\n const collectionKey = `${fileLinksSelfLink}?filters=[{\"storage\":{\"operator\":\"=\",\"values\":[\"${storageId}\"]}}]`;\n const collection = { _embedded: { elements: fileLinkCollections.fileLinks } } as IHALCollection;\n insertCollectionIntoState(this.store, collection, collectionKey);\n }),\n reduce((acc, group) => acc.concat(group.fileLinks), [] as IFileLink[]),\n );\n }\n\n updateCollection(href:string):Observable> {\n return this.http\n .get>(href)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, href)),\n );\n }\n\n remove(collectionKey:string, fileLink:IFileLink):Observable {\n if (!fileLink._links.delete) {\n return of();\n }\n\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n return this.http\n .delete(fileLink._links.delete.href, { withCredentials: true, headers })\n .pipe(\n tap(() => removeEntityFromCollectionAndState(this.store, fileLink.id, collectionKey)),\n );\n }\n\n addFileLinks(\n collectionKey:string,\n addFileLinksHref:string,\n storage:IHalResourceLink,\n filesToLink:IFileLinkOriginData[],\n ):Observable> {\n const elements = filesToLink.map((file) => ({\n originData: { ...file },\n _links: { storage },\n }));\n\n return this.http\n .post>(addFileLinksHref, { _type: 'Collection', _embedded: { elements } })\n .pipe(\n tap((collection) => {\n applyTransaction(() => {\n const newFileLinks = collection._embedded.elements;\n this.store.add(newFileLinks);\n this.store.update(\n ({ collections }) => (\n {\n collections: {\n ...collections,\n [collectionKey]: {\n ...collections[collectionKey],\n ids: (collections[collectionKey]?.ids || []).concat(newFileLinks.map((link) => link.id)),\n },\n },\n }\n ),\n );\n });\n }),\n );\n }\n}\n","import { ID } from '@datorama/akita';\nimport {\n IHalResourceLink,\n IHalResourceLinks,\n} from 'core-app/core/state/hal-resource';\n\nexport const NOTIFICATIONS_MAX_SIZE = 100;\n\nexport interface IInAppNotificationHalResourceLinks extends IHalResourceLinks {\n actor:IHalResourceLink;\n project:IHalResourceLink;\n resource:IHalResourceLink;\n activity:IHalResourceLink;\n}\n\nexport type IInAppNotificationDetailsAttribute = 'startDate'|'dueDate'|'date';\n\nexport interface IInAppNotificationDetailsResource {\n property:IInAppNotificationDetailsAttribute;\n value:string|null;\n\n _links:{\n self:IHalResourceLink;\n schema:IHalResourceLink;\n };\n}\n\nexport interface IInAppNotificationHalResourceEmbedded {\n details:IInAppNotificationDetailsResource[];\n}\n\nexport interface INotification {\n id:ID;\n subject:string;\n createdAt:string;\n updatedAt:string;\n reason:string;\n readIAN:boolean|null;\n readEmail:boolean|null;\n\n // Mark a notification to be kept in the center even though it was saved as \"read\".\n keep?:boolean;\n // Show message of a notification?\n expanded:boolean;\n\n _links:IInAppNotificationHalResourceLinks;\n _embedded:IInAppNotificationHalResourceEmbedded;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ID } from '@datorama/akita';\nimport {\n action,\n props,\n} from 'ts-action';\n\nimport { ApiV3ListFilter } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\n\nexport const markNotificationsAsRead = action(\n '[IAN] Mark notifications as read',\n props<{ origin:string, notifications:ID[] }>(),\n);\n\nexport const markNotificationsAsReadByFilters = action(\n '[IAN] Mark notifications as read by filter',\n props<{ origin:string, filters:ApiV3ListFilter[] }>(),\n);\n\nexport const notificationsMarkedRead = action(\n '[IAN] Notifications were marked as read',\n props<{ origin:string, notifications:ID[], all:boolean }>(),\n);\n\nexport const notificationCountIncreased = action(\n '[IAN] The backend sent a notification count that was higher than the last known',\n props<{ origin:string, count:number }>(),\n);\n\nexport const centerUpdatedInPlace = action(\n '[IAN] The notification center updated the notification list without a full page refresh',\n props<{ origin:string }>(),\n);\n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { INotification } from './in-app-notification.model';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\n\nexport interface InAppNotificationsState extends CollectionState {\n}\n\n@StoreConfig({ name: 'in-app-notifications' })\nexport class InAppNotificationsStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { tap } from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { ID } from '@datorama/akita';\n\nimport {\n markNotificationsAsRead,\n markNotificationsAsReadByFilters,\n notificationsMarkedRead,\n} from 'core-app/core/state/in-app-notifications/in-app-notifications.actions';\nimport { EffectCallback, EffectHandler } from 'core-app/core/state/effects/effect-handler.decorator';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { INotification } from 'core-app/core/state/in-app-notifications/in-app-notification.model';\nimport { InAppNotificationsStore } from 'core-app/core/state/in-app-notifications/in-app-notifications.store';\nimport { CollectionStore, ResourceCollectionService } from 'core-app/core/state/resource-collection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@EffectHandler\n@Injectable()\nexport class InAppNotificationsResourceService extends ResourceCollectionService {\n @InjectField() actions$:ActionsService;\n\n update(id:ID, inAppNotification:Partial):void {\n this.store.update(id, inAppNotification);\n }\n\n markAsRead(notifications:ID[]):Observable {\n return this\n .apiV3Service\n .notifications\n .markAsReadByIds(notifications)\n .pipe(\n tap(() => {\n this.store.update(notifications, { readIAN: true });\n }),\n );\n }\n\n /**\n * Mark the given notification IDs as read through the API.\n */\n @EffectCallback(markNotificationsAsRead)\n private markNotificationsAsRead(action:ReturnType) {\n this\n .markAsRead(action.notifications)\n .subscribe(() => (\n this.actions$.dispatch(notificationsMarkedRead({ ...action, all: false }))\n ));\n }\n\n @EffectCallback(markNotificationsAsReadByFilters)\n private markNotificationsAsReadByFilters(action:ReturnType) {\n return this\n .apiV3Service\n .notifications\n .markAsReadByFilter(action.filters)\n .subscribe(() => {\n this.actions$.dispatch(notificationsMarkedRead({ origin: action.origin, notifications: [], all: true }));\n });\n }\n\n protected createStore():CollectionStore {\n return new InAppNotificationsStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .notifications\n .path;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport default function isDefinedEntity(entity:T|undefined):entity is T {\n return entity !== undefined;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport default function isNotNull(entity:T|null):entity is T {\n return entity !== null;\n}\n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { IPrincipal } from './principal.model';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\n\nexport interface PrincipalsState extends CollectionState {\n}\n\n@StoreConfig({ name: 'principals' })\nexport class PrincipalsStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n catchError,\n tap,\n} from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { applyTransaction } from '@datorama/akita';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport {\n collectionKey,\n insertCollectionIntoState,\n} from 'core-app/core/state/collection-store';\nimport { EffectHandler } from 'core-app/core/state/effects/effect-handler.decorator';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { PrincipalsStore } from './principals.store';\nimport { IPrincipal } from './principal.model';\nimport { IUser } from 'core-app/core/state/principals/user.model';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@EffectHandler\n@Injectable()\nexport class PrincipalsResourceService extends ResourceCollectionService {\n @InjectField() actions$:ActionsService;\n\n @InjectField() toastService:ToastService;\n\n fetchUser(id:string|number):Observable {\n return this.http\n .get(this.apiV3Service.users.id(id).path)\n .pipe(\n tap((data) => {\n applyTransaction(() => {\n this.store.upsertMany([data]);\n });\n }),\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n fetchPrincipals(params:ApiV3ListParameters):Observable> {\n const collectionURL = collectionKey(params);\n\n return this\n .http\n .get>(this.basePath() + collectionURL)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, collectionURL)),\n catchError((error) => {\n this.toastService.addError(error);\n throw error;\n }),\n );\n }\n\n protected createStore():CollectionStore {\n return new PrincipalsStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .principals\n .path;\n }\n}\n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\nimport { IProject } from './project.model';\n\nexport interface ProjectsState extends CollectionState {\n}\n\n@StoreConfig({ name: 'projects' })\nexport class ProjectsStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { tap } from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { IProject } from './project.model';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { ProjectsStore } from 'core-app/core/state/projects/projects.store';\n\n@Injectable()\nexport class ProjectsResourceService extends ResourceCollectionService {\n update(link:string):Observable {\n return this.http.get(link)\n .pipe(\n tap((project) => {\n this.store.upsertMany([project]);\n }),\n );\n }\n\n protected createStore():CollectionStore {\n return new ProjectsStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .projects\n .path;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n EntityStore,\n ID,\n QueryEntity,\n} from '@datorama/akita';\nimport { Observable } from 'rxjs';\nimport {\n catchError,\n filter,\n finalize,\n map,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport {\n collectionKey,\n CollectionResponse,\n CollectionState,\n insertCollectionIntoState,\n removeCollectionLoading,\n setCollectionLoading,\n} from 'core-app/core/state/collection-store';\nimport { omit } from 'lodash';\nimport isDefinedEntity from 'core-app/core/state/is-defined-entity';\nimport { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport {\n HttpClient,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport {\n Injectable,\n Injector,\n} from '@angular/core';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\n\nexport type CollectionStore = EntityStore>;\n\nexport interface ResourceCollectionLoadOptions {\n handleErrors:boolean;\n}\n\n@Injectable()\nexport abstract class ResourceCollectionService {\n protected store:CollectionStore = this.createStore();\n\n protected query = new QueryEntity(this.store);\n\n constructor(\n readonly injector:Injector,\n readonly http:HttpClient,\n readonly apiV3Service:ApiV3Service,\n readonly toastService:ToastService,\n ) {\n }\n\n /**\n * Require the results for the given filter params\n * Returns a cached set if it was loaded already.\n *\n * @param params List params to require\n * @private\n */\n public require(params:ApiV3ListParameters):Observable {\n const key = collectionKey(params);\n if (this.collectionExists(key) || this.collectionLoading(key)) {\n return this.loadedCollection(key);\n }\n\n return this\n .fetchCollection(params)\n .pipe(\n switchMap(() => this.loadedCollection(key)),\n );\n }\n\n /**\n * Retrieve a collection from the store\n *\n * @param key The collection key to fetch\n */\n collection(key:string):Observable {\n return this\n .collectionState(key)\n .pipe(\n switchMap((collection) => this.query.selectMany(collection?.ids || [])),\n );\n }\n\n /**\n * Return a collection observable that triggers only when the collection is loaded.\n * @param key\n */\n loadedCollection(key:string):Observable {\n return this\n .collectionState(key)\n .pipe(\n filter((collection) => !!collection),\n switchMap((collection:CollectionResponse) => this.query.selectMany(collection.ids)),\n );\n }\n\n /**\n * Return a collection observable that triggers only when the collection is loaded.\n * @param key\n */\n collectionState(key:string):Observable {\n return this\n .query\n .select()\n .pipe(\n map((state) => state.collections[key]),\n );\n }\n\n /**\n * Lookup a single entity from the store\n * @param id\n */\n lookup(id:ID):Observable {\n return this\n .query\n .selectEntity(id)\n .pipe(filter(isDefinedEntity));\n }\n\n /**\n * Lookup multiple entities from the store\n */\n lookupMany(ids:ID[]):Observable {\n return this\n .query\n .selectMany(ids);\n }\n\n /**\n * Checks, if the store already has a resource loaded by id.\n * @param id\n */\n exists(id:ID):boolean {\n return this.query.hasEntity(id);\n }\n\n /**\n * Checks, if the store already has a collection given the key\n */\n collectionExists(input:string|ApiV3ListParameters):boolean {\n const key = typeof input === 'string' ? input : collectionKey(input);\n return !!this\n .query\n .getValue()\n .collections[key];\n }\n\n /**\n * Checks, if the store already has a collection given the key\n */\n collectionLoading(input:string|ApiV3ListParameters):boolean {\n const key = typeof input === 'string' ? input : collectionKey(input);\n return this\n .query\n .getValue()\n .loadingCollections[key] === true;\n }\n\n /**\n * Clear a collection key\n * @param key Collection key to clear\n */\n clear(key:string):void {\n this\n .store\n .update(\n ({ collections }) => ({\n collections: omit(collections, key),\n }),\n );\n }\n\n /**\n * Update a single entity in the store\n *\n * @param id The id to update\n * @param entity A section of the entity to update\n */\n update(id:ID, entity:Partial):void {\n this.store.update(id, entity);\n }\n\n /**\n * Fetch a given collection, returning only its results\n */\n fetchResults(params:ApiV3ListParameters|string):Observable {\n return this\n .fetchCollection(params)\n .pipe(\n map((collection) => collection._embedded.elements),\n );\n }\n\n /**\n * Fetch a given collection, ensuring it is being flagged as loaded\n *\n * @param params {ApiV3ListParameters|string} collection key or list params to build collection key from\n * @param options {ResourceCollectionLoadOptions} Handle collection loading errors within the resource service\n */\n fetchCollection(\n params:ApiV3ListParameters|string,\n options:ResourceCollectionLoadOptions = { handleErrors: true },\n ):Observable> {\n const key = typeof params === 'string' ? params : collectionKey(params);\n\n setCollectionLoading(this.store, key);\n\n return this\n .http\n .get>(this.basePath() + key)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, key)),\n finalize(() => removeCollectionLoading(this.store, key)),\n catchError((error:unknown) => {\n if (options.handleErrors) {\n this.handleCollectionLoadingError(error as HttpErrorResponse, key);\n }\n\n throw error;\n }),\n );\n }\n\n /**\n * Create a new instance of this resource service's underlying store.\n * @protected\n */\n protected abstract createStore():CollectionStore;\n\n /**\n * Base path for this collection\n * @protected\n */\n protected abstract basePath():string;\n\n /**\n * By default, add a toast error in case of loading errors\n * @param error\n * @param _collectionKey\n * @protected\n */\n protected handleCollectionLoadingError(error:HttpErrorResponse, _collectionKey:string):void {\n this.toastService.addError(error);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n EntityState, EntityStore, ID, StoreConfig,\n} from '@datorama/akita';\nimport { IStorageFile } from 'core-app/core/state/storage-files/storage-file.model';\n\nexport interface IStorageFilesResponse {\n files:ID[];\n parent:ID;\n}\n\nexport interface IStorageFilesState extends EntityState {\n files:Record;\n}\n\n@StoreConfig({\n name: 'storage-files',\n resettable: true,\n})\nexport class StorageFilesStore extends EntityStore {\n constructor() {\n super({ files: {} });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { combineLatest, Observable } from 'rxjs';\nimport {\n filter, map, take, tap,\n} from 'rxjs/operators';\n\nimport { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport { StorageFilesStore } from 'core-app/core/state/storage-files/storage-files.store';\nimport { IUploadLink } from 'core-app/core/state/storage-files/upload-link.model';\nimport { IPrepareUploadLink } from 'core-app/core/state/storages/storage.model';\nimport { IStorageFiles } from 'core-app/core/state/storage-files/storage-files.model';\nimport { HttpClient } from '@angular/common/http';\nimport { ID, QueryEntity } from '@datorama/akita';\nimport { IStorageFile } from 'core-app/core/state/storage-files/storage-file.model';\nimport isDefinedEntity from 'core-app/core/state/is-defined-entity';\n\n@Injectable()\nexport class StorageFilesResourceService {\n private readonly store:StorageFilesStore = new StorageFilesStore();\n\n private readonly query = new QueryEntity(this.store);\n\n constructor(private readonly httpClient:HttpClient) {}\n\n files(link:IHalResourceLink):Observable {\n const value = this.store.getValue().files[link.href];\n if (value !== undefined) {\n return combineLatest([this.lookupMany(value.files), this.lookup(value.parent)])\n .pipe(\n map(([files, parent]):IStorageFiles => ({\n files, parent, _type: 'StorageFiles', _links: { self: link },\n })),\n take(1),\n );\n }\n\n return this.httpClient\n .get(link.href)\n .pipe(tap((storageFiles) => this.insert(storageFiles, link.href)));\n }\n\n uploadLink(link:IPrepareUploadLink):Observable {\n return this.httpClient.request(link.method, link.href, { body: link.payload });\n }\n\n reset():void {\n this.store.reset();\n }\n\n private lookup(id:ID):Observable {\n return this\n .query\n .selectEntity(id)\n .pipe(filter(isDefinedEntity));\n }\n\n private lookupMany(ids:ID[]):Observable {\n return this.query.selectMany(ids);\n }\n\n private insert(storageFiles:IStorageFiles, link:string):void {\n this.store.upsertMany([...storageFiles.files, storageFiles.parent]);\n\n const fileIds = storageFiles.files.map((file) => file.id);\n const parentId = storageFiles.parent.id;\n\n this.store.update(({ files }) => ({\n files: {\n ...files,\n [link]: {\n files: fileIds,\n parent: parentId,\n },\n },\n }));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { EntityStore, StoreConfig } from '@datorama/akita';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\nimport { IStorage } from 'core-app/core/state/storages/storage.model';\n\nexport interface StoragesState extends CollectionState {}\n\n@StoreConfig({ name: 'storages' })\nexport class StoragesStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { tap } from 'rxjs/operators';\nimport { forkJoin, Observable } from 'rxjs';\nimport { IStorage } from 'core-app/core/state/storages/storage.model';\nimport { StoragesStore } from 'core-app/core/state/storages/storages.store';\nimport { insertCollectionIntoState } from 'core-app/core/state/collection-store';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\n\n@Injectable()\nexport class StoragesResourceService extends ResourceCollectionService {\n updateCollection(key:string, storageLinks:IHalResourceLink[]):Observable {\n return forkJoin(storageLinks.map((link) => this.http.get(link.href)))\n .pipe(\n tap((storages) => {\n const storageCollection = { _embedded: { elements: storages } } as IHALCollection;\n insertCollectionIntoState(this.store, storageCollection, key);\n }),\n );\n }\n\n protected createStore():CollectionStore {\n return new StoragesStore();\n }\n\n protected basePath():string {\n return this.apiV3Service.storages.path;\n }\n}\n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { CollectionState, createInitialCollectionState } from 'core-app/core/state/collection-store';\nimport { IView } from './view.model';\n\nexport interface ViewsState extends CollectionState {\n}\n\n@StoreConfig({ name: 'views' })\nexport class ViewsStore extends EntityStore {\n constructor() {\n super(createInitialCollectionState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport { EffectHandler } from 'core-app/core/state/effects/effect-handler.decorator';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { ViewsStore } from 'core-app/core/state/views/views.store';\nimport { IView } from 'core-app/core/state/views/view.model';\nimport {\n CollectionStore,\n ResourceCollectionService,\n} from 'core-app/core/state/resource-collection.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@EffectHandler\n@Injectable()\nexport class ViewsResourceService extends ResourceCollectionService {\n @InjectField() actions$:ActionsService;\n\n protected createStore():CollectionStore {\n return new ViewsStore();\n }\n\n protected basePath():string {\n return this\n .apiV3Service\n .views\n .path;\n }\n}\n","import { InputState, multiInput, MultiInputState, StatesGroup } from 'reactivestates';\nimport { Subject } from 'rxjs';\nimport { TypeResource } from 'core-app/features/hal/resources/type-resource';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { VersionResource } from 'core-app/features/hal/resources/version-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { StatusResource } from 'core-app/features/hal/resources/status-resource';\nimport { PlaceholderUserResource } from 'core-app/features/hal/resources/placeholder-user-resource';\nimport { RoleResource } from 'core-app/features/hal/resources/role-resource';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { PostResource } from 'core-app/features/hal/resources/post-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\n\nexport class States extends StatesGroup {\n name = 'MainStore';\n\n /* /api/v3/projects */\n projects:MultiInputState = multiInput();\n\n /* /api/v3/work_packages */\n workPackages = multiInput();\n\n /* /api/v3/wiki_pages */\n posts = multiInput();\n\n /* /api/v3/schemas */\n schemas = multiInput();\n\n /* /api/v3/types */\n types = multiInput();\n\n /* /api/v3/statuses */\n statuses = multiInput();\n\n /* /api/v3/time_entries */\n timeEntries = multiInput();\n\n /* /api/v3/versions */\n versions = multiInput();\n\n /* /api/v3/users */\n users = multiInput();\n\n /* /api/v3/placeholder_users */\n placeholderUsers = multiInput();\n\n /* /api/v3/roles */\n roles = multiInput();\n\n // Global events to isolated changes\n changes = {\n // Global subject on changes to the given query ID\n queries: new Subject(),\n };\n\n // Additional state map that can be dynamically registered.\n additional:{ [id:string]:MultiInputState } = {};\n\n forType(stateName:string):MultiInputState {\n let state = (this as any)[stateName] || this.additional[stateName];\n\n if (!state) {\n state = this.additional[stateName] = multiInput();\n }\n\n return state;\n }\n\n forResource(resource:T):InputState|undefined {\n const stateName = `${_.camelCase(resource._type)}s`;\n const state = this.forType(stateName);\n\n return state && state.get(resource.id!);\n }\n\n public add(name:string, state:MultiInputState) {\n this.additional[name] = state;\n }\n}\n","import { Component, OnInit, ViewEncapsulation } from '@angular/core';\n\nexport const backlogsPageComponentSelector = 'op-backlogs-page';\n\n@Component({\n selector: backlogsPageComponentSelector,\n // Empty wrapper around legacy backlogs for CSS loading\n // that got removed in the Rails assets pipeline\n encapsulation: ViewEncapsulation.None,\n template: '',\n styleUrls: [\n './styles/backlogs.sass',\n ],\n})\nexport class BacklogsPageComponent implements OnInit {\n ngOnInit() {\n document.getElementById('projected-content')!.hidden = false;\n }\n}\n","import { Injector } from '@angular/core';\nimport { Constructor } from '@angular/cdk/table';\nimport { SimpleResource, SimpleResourceCollection } from 'core-app/core/apiv3/paths/path-resources';\n\nexport class BcfResourcePath extends SimpleResource {\n constructor(readonly injector:Injector,\n basePath:string,\n readonly id:string|number) {\n super(basePath, id);\n }\n}\n\nexport class BcfResourceCollectionPath extends SimpleResourceCollection {\n constructor(readonly injector:Injector,\n protected basePath:string,\n segment:string,\n protected resource?:Constructor) {\n super(basePath, segment, resource);\n }\n\n public id(id:string|number):T {\n return new (this.resource || BcfResourcePath)(this.injector, this.path, id) as T;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HttpClient, HttpErrorResponse, HttpParams } from '@angular/common/http';\nimport { Injector } from '@angular/core';\nimport { TypedJSON } from 'typedjson';\nimport { Constructor } from '@angular/cdk/table';\nimport { Observable, throwError } from 'rxjs';\nimport {\n HTTPClientHeaders,\n HTTPClientOptions,\n HTTPClientParamMap,\n HTTPSupportedMethods,\n} from 'core-app/features/hal/http/http.interfaces';\nimport { catchError, map } from 'rxjs/operators';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { URLParamsEncoder } from 'core-app/features/hal/services/url-params-encoder';\n\nexport class BcfApiRequestService {\n @InjectField() http:HttpClient;\n\n /**\n * Create a BCF api request service.\n * Optionally pass a resource map to map the resulting data to with TypedJson.\n *\n * @param injector Injector\n * @param resourceClass Optional mapped resource class with TypedJson annotations\n */\n constructor(readonly injector:Injector,\n readonly resourceClass?:Constructor) {\n }\n\n /**\n * Request GET from the given BCF API 2.1 resource and map it to +resourceClass+.\n *\n * @param path API path to request\n * @param params Request query params\n * @param headers optional headers map\n */\n get(path:string, params:HTTPClientParamMap, headers:HTTPClientHeaders = {}):Observable {\n const config:HTTPClientOptions = {\n headers,\n params: new HttpParams({ encoder: new URLParamsEncoder(), fromObject: params }),\n withCredentials: true,\n responseType: 'json',\n };\n\n return this._request('get', path, config);\n }\n\n /**\n * Request the given BCF API 2.1 resource and map it to +resourceClass+.\n *\n * @param method request method\n * @param path API path to request\n * @param data Request payload (URL params for get, JSON payload otherwise)\n * @param headers Request headers\n */\n public request(method:HTTPSupportedMethods, path:string, data:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}):Observable {\n // HttpClient requires us to create HttpParams instead of passing data for get\n // so forward to that method instead.\n if (method === 'get') {\n return this.get(path, data, headers);\n }\n\n const config:HTTPClientOptions = {\n body: data || {},\n headers,\n withCredentials: true,\n responseType: 'json',\n };\n\n return this._request(method, path, config);\n }\n\n /**\n * Perform the request with httpClient and deserialize the result\n *\n * @param method Request method\n * @param path Request path\n * @param config HTTP client configuration\n *\n * @private\n */\n private _request(method:HTTPSupportedMethods, path:string, config:HTTPClientOptions):Observable {\n return this\n .http\n .request(method, path, config)\n .pipe(\n map((response:any) => this.deserialize(response)),\n catchError((error:HttpErrorResponse) => {\n console.error(`Failed to ${method} ${path}: ${error.name}`);\n return throwError(error);\n }),\n );\n }\n\n /**\n * Deserialize the JSON data into the mapped resource class, if given.\n * @param data JSON API response.\n */\n protected deserialize(data:any):T {\n if (this.resourceClass) {\n const serializer = new TypedJSON(this.resourceClass);\n return serializer.parse(data)!;\n }\n return data;\n }\n}\n","import { jsonMember, jsonObject } from 'typedjson';\n\n@jsonObject\nexport class BcfProjectResource {\n @jsonMember\n project_id:number;\n\n @jsonMember\n name:string;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { jsonArrayMember, jsonMember, jsonObject } from 'typedjson';\nimport * as moment from 'moment';\nimport { Moment } from 'moment';\n\n@jsonObject\nexport class BcfTopicAuthorizationMap {\n @jsonArrayMember(String)\n topic_actions:string[];\n\n @jsonArrayMember(String)\n topic_status:string[];\n}\n\n@jsonObject\nexport class BcfTopicResource {\n @jsonMember\n guid:string;\n\n @jsonMember\n topic_type:string;\n\n @jsonMember\n topic_status:string;\n\n @jsonMember\n priority:string;\n\n @jsonArrayMember(String)\n reference_links:string[];\n\n @jsonMember\n title:string;\n\n @jsonMember({ preserveNull: true })\n index:number|null;\n\n @jsonArrayMember(String)\n labels:string[];\n\n @jsonMember({ deserializer: (value) => moment(value), serializer: (timestamp:Moment) => timestamp.toISOString() })\n creation_date:Moment;\n\n @jsonMember\n creation_author:string;\n\n @jsonMember({ deserializer: (value) => moment(value), serializer: (timestamp:Moment) => timestamp.toISOString() })\n modified_date:Moment;\n\n @jsonMember({ preserveNull: true })\n modified_author:string|null;\n\n @jsonMember\n assigned_to:string;\n\n @jsonMember({ preserveNull: true })\n stage:string|null;\n\n @jsonMember\n description:string;\n\n @jsonMember({\n deserializer: (value) => moment(value),\n serializer: (timestamp:Moment) => timestamp.format('YYYY-MM-DD'),\n })\n due_date:Moment;\n\n @jsonMember\n authorization:BcfTopicAuthorizationMap;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { BcfResourcePath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { HTTPClientHeaders, HTTPClientParamMap } from 'core-app/features/hal/http/http.interfaces';\nimport { Observable } from 'rxjs';\nimport { BcfViewpointSelection } from 'core-app/features/bim/bcf/api/bcf-api.model';\n\nexport class BcfViewpointSelectionPath extends BcfResourcePath {\n readonly bcfViewpointsService = new BcfApiRequestService(this.injector);\n\n get(params:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}):Observable {\n return this.bcfViewpointsService.get(this.toPath(), params, headers);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { BcfResourcePath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { HTTPClientHeaders, HTTPClientParamMap } from 'core-app/features/hal/http/http.interfaces';\nimport { Observable } from 'rxjs';\nimport { BcfViewpointVisibility } from 'core-app/features/bim/bcf/api/bcf-api.model';\n\nexport class BcfViewpointVisibilityPaths extends BcfResourcePath {\n readonly bcfViewpointsService = new BcfApiRequestService(this.injector);\n\n get(params:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}):Observable {\n return this.bcfViewpointsService.get(this.toPath(), params, headers);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HTTPClientHeaders, HTTPClientParamMap } from 'core-app/features/hal/http/http.interfaces';\nimport { BcfResourcePath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { BcfViewpointSelectionPath } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint-selection.paths';\nimport { Observable } from 'rxjs';\nimport { BcfViewpointVisibilityPaths } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint-visibility.paths';\nimport { BcfViewpoint } from 'core-app/features/bim/bcf/api/bcf-api.model';\nimport { map } from 'rxjs/operators';\n\nexport class BcfViewpointPaths extends BcfResourcePath {\n readonly bcfViewpointsService = new BcfApiRequestService(this.injector);\n\n public readonly selection = new BcfViewpointSelectionPath(this.injector, this.path, 'selection');\n\n public readonly visibility = new BcfViewpointVisibilityPaths(this.injector, this.path, 'visibility');\n\n get(params:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}):Observable {\n return this.bcfViewpointsService.get(this.toPath(), params, headers);\n }\n\n delete(headers:HTTPClientHeaders = {}):Observable {\n return this.bcfViewpointsService\n .request('delete', this.toPath(), {}, headers)\n .pipe(\n map(() => { }),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { BcfResourceCollectionPath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { Observable } from 'rxjs';\nimport { BcfViewpointPaths } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint.paths';\nimport { CreateBcfViewpointData } from 'core-app/features/bim/bcf/api/bcf-api.model';\n\nexport class BcfViewpointCollectionPath extends BcfResourceCollectionPath {\n readonly bcfViewpointService = new BcfApiRequestService(this.injector);\n\n post(viewpoint:CreateBcfViewpointData):Observable {\n return this\n .bcfViewpointService\n .request(\n 'post',\n this.toPath(),\n viewpoint,\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { BcfResourceCollectionPath, BcfResourcePath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfTopicResource } from 'core-app/features/bim/bcf/api/topics/bcf-topic.resource';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { BcfViewpointPaths } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint.paths';\nimport { BcfViewpointCollectionPath } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint-collection.paths';\nimport { HTTPClientHeaders, HTTPClientParamMap } from 'core-app/features/hal/http/http.interfaces';\nimport { Observable } from 'rxjs';\n\nexport class BcfTopicPaths extends BcfResourcePath {\n readonly bcfTopicService = new BcfApiRequestService(this.injector, BcfTopicResource);\n\n /** /comments */\n public readonly comments = new BcfResourceCollectionPath(this.injector, this.path, 'comments');\n\n /** /viewpoints */\n public readonly viewpoints = new BcfViewpointCollectionPath(this.injector, this.path, 'viewpoints', BcfViewpointPaths);\n\n get(params:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}):Observable {\n return this.bcfTopicService.get(this.toPath(), params, headers);\n }\n}\n","import { BcfResourceCollectionPath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { HTTPClientHeaders, HTTPClientParamMap } from 'core-app/features/hal/http/http.interfaces';\nimport { Observable } from 'rxjs';\nimport { BcfTopicPaths } from 'core-app/features/bim/bcf/api/topics/bcf-topic.paths';\nimport { Injector } from '@angular/core';\nimport { BcfTopicResource } from 'core-app/features/bim/bcf/api/topics/bcf-topic.resource';\n\nexport class BcfTopicCollectionPath extends BcfResourceCollectionPath {\n readonly bcfTopicService = new BcfApiRequestService(this.injector, BcfTopicResource);\n\n constructor(readonly injector:Injector,\n protected basePath:string,\n segment:string) {\n super(injector, basePath, segment, BcfTopicPaths);\n }\n\n get(params:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}) {\n throw new Error('Not implemented');\n }\n\n /**\n * Create a topic from its to-be-associated work package\n */\n post(payload:any):Observable {\n return this\n .bcfTopicService\n .request(\n 'post',\n this.toPath(),\n payload,\n );\n }\n}\n","import { jsonArrayMember, jsonObject } from 'typedjson';\n\n@jsonObject\nexport class BcfExtensionResource {\n @jsonArrayMember(String)\n topic_actions:string[];\n\n @jsonArrayMember(String)\n project_actions:string[];\n\n @jsonArrayMember(String)\n comment_actions:string[];\n}\n","import { BcfResourcePath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { HTTPClientHeaders, HTTPClientParamMap } from 'core-app/features/hal/http/http.interfaces';\nimport { BcfExtensionResource } from 'core-app/features/bim/bcf/api/extensions/bcf-extension.resource';\n\nexport class BcfExtensionPaths extends BcfResourcePath {\n readonly bcfExtensionService = new BcfApiRequestService(this.injector, BcfExtensionResource);\n\n get(params:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}) {\n return this.bcfExtensionService.get(this.toPath(), params, headers);\n }\n}\n","import { BcfResourcePath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfApiRequestService } from 'core-app/features/bim/bcf/api/bcf-api-request.service';\nimport { BcfProjectResource } from 'core-app/features/bim/bcf/api/projects/bcf-project.resource';\nimport { HTTPClientHeaders, HTTPClientParamMap } from 'core-app/features/hal/http/http.interfaces';\nimport { BcfTopicCollectionPath } from 'core-app/features/bim/bcf/api/topics/bcf-viewpoint-collection.paths';\nimport { BcfExtensionPaths } from 'core-app/features/bim/bcf/api/extensions/bcf-extension.paths';\n\nexport class BcfProjectPaths extends BcfResourcePath {\n readonly bcfProjectService = new BcfApiRequestService(this.injector, BcfProjectResource);\n\n /** /topics */\n public readonly topics = new BcfTopicCollectionPath(this.injector, this.path, 'topics');\n\n public readonly extensions = new BcfExtensionPaths(this.injector, this.path, 'extensions');\n\n get(params:HTTPClientParamMap = {}, headers:HTTPClientHeaders = {}) {\n return this.bcfProjectService.get(this.toPath(), params, headers);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { BcfResourceCollectionPath } from 'core-app/features/bim/bcf/api/bcf-path-resources';\nimport { BcfProjectPaths } from 'core-app/features/bim/bcf/api/projects/bcf-project.paths';\n\n@Injectable({ providedIn: 'root' })\nexport class BcfApiService {\n public readonly bcfApiVersion = '2.1';\n\n public readonly appBasePath = window.appBasePath || '';\n\n public readonly bcfApiBase = `${this.appBasePath}/api/bcf/${this.bcfApiVersion}`;\n\n // /api/bcf/:version/projects\n public readonly projects = new BcfResourceCollectionPath(this.injector, this.bcfApiBase, 'projects', BcfProjectPaths);\n\n constructor(readonly injector:Injector) {\n }\n\n /**\n * Parse the given string into a BCF resource path\n *\n * @param href\n */\n parse(href:string):T {\n if (!href.startsWith(this.bcfApiBase)) {\n throw new Error(`Cannot parse ${href} into BCF resource.`);\n }\n\n const parts = href\n .replace(`${this.bcfApiBase}/`, '')\n .split('/');\n\n // Try to find a target collection or resource\n let current:any = this;\n\n for (let i = 0; i < parts.length; i++) {\n const pathOrId:string = parts[i];\n if (pathOrId in current) {\n // Current has a member named like this URL part\n // descend into it\n current = current[pathOrId];\n } else if (current instanceof BcfResourceCollectionPath) {\n // Otherwise, assume we're looking for an ID\n current = current.id(pathOrId);\n } else {\n // Otherwise, return the current\n break;\n }\n }\n\n return current === this ? undefined : current;\n }\n}\n","import { Injectable, Injector } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { StateService } from '@uirouter/core';\nimport { CreateBcfViewpointData } from 'core-app/features/bim/bcf/api/bcf-api.model';\n\n@Injectable()\nexport abstract class ViewerBridgeService {\n @InjectField() state:StateService;\n\n /**\n * Determine whether a viewer should be shown\n */\n abstract shouldShowViewer:boolean;\n\n protected constructor(readonly injector:Injector) {}\n\n /**\n * Get a viewpoint from the viewer\n */\n abstract getViewpoint$():Observable;\n\n /**\n * Show the given viewpoint JSON in the viewer\n */\n abstract showViewpoint(workPackage:WorkPackageResource, index:number):void;\n\n /**\n * Determine whether a viewer is present to ensure we can show viewpoints\n */\n abstract viewerVisible():boolean;\n\n /**\n * Fires when viewer becomes visible.\n */\n abstract viewerVisible$:Observable;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { HalLink } from 'core-app/features/hal/hal-link/hal-link';\n\n@Injectable()\nexport class BcfPathHelperService {\n constructor(readonly pathHelper:PathHelperService) {\n }\n\n public projectImportIssuePath(projectIdentifier:string) {\n return `${this.pathHelper.projectPath(projectIdentifier)}/issues/upload`;\n }\n\n public projectExportIssuesPath(projectIdentifier:string, filters:string|null) {\n if (filters) {\n return `${this.pathHelper.projectPath(projectIdentifier)}/work_packages.bcf?filters=${filters}`;\n }\n return `${this.pathHelper.projectPath(projectIdentifier)}/work_packages.bcf`;\n }\n\n public snapshotPath(viewpoint:HalLink) {\n return `${viewpoint.href}/snapshot`;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { BcfApiService } from 'core-app/features/bim/bcf/api/bcf-api.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { BcfViewpointPaths } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint.paths';\nimport { ViewerBridgeService } from 'core-app/features/bim/bcf/bcf-viewer-bridge/viewer-bridge.service';\nimport { map, switchMap, tap } from 'rxjs/operators';\nimport { forkJoin, Observable, of } from 'rxjs';\nimport { BcfTopicResource } from 'core-app/features/bim/bcf/api/topics/bcf-topic.resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { BcfViewpointData, CreateBcfViewpointData } from 'core-app/features/bim/bcf/api/bcf-api.model';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\n@Injectable()\nexport class ViewpointsService {\n topicUUID:string|number;\n\n @InjectField() bcfApi:BcfApiService;\n\n @InjectField() viewerBridge:ViewerBridgeService;\n\n @InjectField() apiV3Service:ApiV3Service;\n\n constructor(readonly injector:Injector) { }\n\n public getViewPointResource(workPackage:WorkPackageResource, index:number):BcfViewpointPaths {\n const viewpointHref = (workPackage.bcfViewpoints as HalResource[])[index].href as string;\n\n return this.bcfApi.parse(viewpointHref);\n }\n\n public getViewPoint$(workPackage:WorkPackageResource, index:number):Observable {\n const viewpointResource = this.getViewPointResource(workPackage, index);\n\n return forkJoin({\n viewpoint: viewpointResource.get(),\n selection: viewpointResource.selection.get(),\n visibility: viewpointResource.visibility.get(),\n })\n .pipe(\n map(({ viewpoint, selection, visibility }) => {\n const data = viewpoint as BcfViewpointData;\n data.components = {\n selection: selection.selection,\n visibility: visibility.visibility,\n };\n return data;\n }),\n );\n }\n\n public deleteViewPoint$(workPackage:WorkPackageResource, index:number):Observable {\n const viewpointResource = this.getViewPointResource(workPackage, index);\n\n return viewpointResource\n .delete()\n .pipe(\n // Update the work package to reload the viewpoints\n tap(() => this.apiV3Service.work_packages.id(workPackage).requireAndStream(true)),\n );\n }\n\n public saveViewpoint$(workPackage:WorkPackageResource, viewpoint?:CreateBcfViewpointData):Observable {\n const projectLink = (workPackage.project as HalResource).href;\n const wpProjectId = idFromLink(projectLink);\n const topicUUID$ = this.setBcfTopic$(workPackage);\n // Default to the current viewer's viewpoint\n const viewpoint$ = viewpoint\n ? of(viewpoint)\n : this.viewerBridge.getViewpoint$();\n\n return forkJoin({\n topicUUID: topicUUID$,\n viewpoint: viewpoint$,\n })\n .pipe(\n switchMap((results) => this.bcfApi\n .projects.id(wpProjectId)\n .topics.id(results.topicUUID)\n .viewpoints\n .post(results.viewpoint)),\n // Update the work package to reload the viewpoints\n tap(() => this.apiV3Service.work_packages.id(workPackage).requireAndStream(true)),\n );\n }\n\n public setBcfTopic$(workPackage:WorkPackageResource):Observable {\n if (this.topicUUID) {\n return of(this.topicUUID);\n }\n const topicHref = (workPackage.bcfTopic as HalResource)?.href;\n const topicUUID$ = topicHref\n ? of(this.bcfApi.parse(topicHref).id)\n : this.createBcfTopic$(workPackage);\n\n return topicUUID$.pipe(\n map((topicUUID) => {\n this.topicUUID = topicUUID;\n return this.topicUUID;\n }),\n );\n }\n\n private createBcfTopic$(workPackage:WorkPackageResource):Observable {\n const wpProjectId = idFromLink(workPackage.project.href);\n const wpPayload = workPackage.convertBCF.payload;\n\n return this.bcfApi\n .projects.id(wpProjectId)\n .topics\n .post(wpPayload)\n .pipe(\n map((resource:BcfTopicResource) => {\n this.topicUUID = resource.guid;\n return this.topicUUID;\n }),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { BcfPathHelperService } from 'core-app/features/bim/bcf/helper/bcf-path-helper.service';\n\nexport class BcfThumbnailDisplayField extends DisplayField {\n @InjectField() bcfPathHelper:BcfPathHelperService;\n\n public render(element:HTMLElement, displayText:string):void {\n const viewpoints = this.resource.bcfViewpoints;\n if (viewpoints && viewpoints.length > 0) {\n const viewpoint = viewpoints[0];\n element.innerHTML = `\n \n `;\n } else {\n element.innerHTML = '';\n }\n }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n@Injectable()\nexport class BcfDetectorService {\n constructor(@Inject(DOCUMENT) private documentElement:Document) {\n }\n\n /**\n * Detect whether the BCF module was activated,\n * resulting in a body class.\n */\n public get isBcfActivated() {\n return this.hasBodyClass('bcf-activated');\n }\n\n private hasBodyClass(name:string):boolean {\n return this.documentElement.body.classList.contains(name);\n }\n}\n","import { multiInput } from 'reactivestates';\nimport { BcfExtensionResource } from 'core-app/features/bim/bcf/api/extensions/bcf-extension.resource';\nimport { BcfApiService } from 'core-app/features/bim/bcf/api/bcf-api.service';\nimport { Observable } from 'rxjs';\nimport { map, take } from 'rxjs/operators';\nimport { Injectable } from '@angular/core';\n\nexport type AllowedExtensionKey = keyof BcfExtensionResource;\n\n@Injectable({ providedIn: 'root' })\nexport class BcfAuthorizationService {\n // Poor mans caching to avoid repeatedly fetching from the backend.\n protected authorizationMap = multiInput();\n\n constructor(readonly bcfApi:BcfApiService) {\n }\n\n /**\n * Returns an observable boolean whether the given action\n * is authorized in the project by using the project extensions.\n *\n * Ensures the extension is loaded only once per project\n *\n * @param projectIdentifier Project identifier to check permission in\n * @param extension The extension key to check for\n * @param action The desired action\n */\n public authorized$(projectIdentifier:string, extension:AllowedExtensionKey, action:string):Observable {\n const state = this.authorizationMap.get(projectIdentifier);\n\n state.putFromPromiseIfPristine(() => this.bcfApi\n .projects.id(projectIdentifier)\n .extensions\n .get()\n .toPromise());\n\n return state\n .values$()\n .pipe(\n map(\n (resource) => resource[extension] && resource[extension].includes(action),\n ),\n );\n }\n\n /**\n * One-time check to determine current allowed state.\n *\n * @param projectIdentifier Project identifier to check permission in\n * @param extension The extension key to check for\n * @param action The desired action\n */\n public isAllowedTo(projectIdentifier:string, extension:AllowedExtensionKey, action:string):Promise {\n return this\n .authorized$(projectIdentifier, extension, action)\n .pipe(\n take(1),\n )\n .toPromise()\n .catch(() => false);\n }\n}\n","\n
\n
\n
\n

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

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

\n

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

\n

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

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

\n

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

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

\n 0)\">\n \n

\n 0\"\n [textContent]=\"text.no_results.with_current_filter\"\n >\n \n

\n \n
\n \n

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

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

\n
    \n
  • \n
\n\n

\n \n \n \n

\n
\n
\n \n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Inject,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n HttpClient,\n HttpErrorResponse,\n HttpResponse,\n} from '@angular/common/http';\nimport {\n Observable,\n timer,\n} from 'rxjs';\nimport {\n switchMap,\n takeWhile,\n} from 'rxjs/operators';\nimport {\n LoadingIndicatorService,\n withDelayedLoadingIndicator,\n} from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport {\n JobStatusEnum,\n JobStatusInterface,\n} from 'core-app/features/job-status/job-status.interface';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { EXTERNAL_REQUEST_HEADER } from 'core-app/features/hal/http/openproject-header-interceptor';\nimport {\n DomSanitizer,\n SafeHtml,\n} from '@angular/platform-browser';\n\n@Component({\n templateUrl: './job-status.modal.html',\n styleUrls: ['./job-status.modal.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class JobStatusModalComponent extends OpModalComponent implements OnInit {\n public text = {\n title: this.I18n.t('js.job_status.title'),\n closePopup: this.I18n.t('js.close_popup_title'),\n redirect: this.I18n.t('js.job_status.redirect'),\n redirect_errors: `${this.I18n.t('js.job_status.redirect_errors')} `,\n redirect_link: this.I18n.t('js.job_status.redirect_link'),\n errors: this.I18n.t('js.job_status.errors'),\n download_starts: this.I18n.t('js.job_status.download_starts'),\n click_to_download: this.I18n.t('js.job_status.click_to_download'),\n };\n\n /** The job ID reference */\n public jobId:string;\n\n /** Whether to show the loading indicator */\n public isLoading = false;\n\n /** The current status */\n public status:JobStatusEnum;\n\n /** An associated icon to render, if any */\n public statusIcon:string|null;\n\n /** Public message to show */\n public message:string;\n\n /** Payload object of the response */\n public payload:any;\n\n /** Title to show */\n public title:string = this.text.title;\n\n /** Additional html to render */\n public htmlContent:SafeHtml|null = null;\n\n /** A link in case the job results in a download */\n public downloadHref:string|null = null;\n\n @ViewChild('downloadLink') private downloadLink:ElementRef;\n\n constructor(@Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n readonly elementRef:ElementRef,\n readonly pathHelper:PathHelperService,\n readonly apiV3Service:ApiV3Service,\n readonly loadingIndicator:LoadingIndicatorService,\n readonly toastService:ToastService,\n readonly sanitization:DomSanitizer,\n readonly httpClient:HttpClient) {\n super(locals, cdRef, elementRef);\n\n this.jobId = locals.jobId;\n }\n\n ngOnInit() {\n super.ngOnInit();\n this.listenOnJobStatus();\n }\n\n private listenOnJobStatus() {\n timer(0, 2000)\n .pipe(\n switchMap(() => this.performRequest()),\n takeWhile((response) => !!response.body && this.continuedStatus(response.body), true),\n this.untilDestroyed(),\n withDelayedLoadingIndicator(this.loadingIndicator.getter('modal')),\n ).subscribe(\n (response) => this.onResponse(response),\n (error) => this.handleError(error),\n () => { this.isLoading = false; },\n );\n }\n\n private iconForStatus():string|null {\n switch (this.status) {\n case 'cancelled':\n case 'failure':\n case 'error':\n return 'icon-error';\n break;\n case 'success':\n return 'icon-checkmark';\n break;\n default:\n return null;\n }\n }\n\n /**\n * Determine whether the given status continues the timer\n * @param response\n */\n private continuedStatus(response:JobStatusInterface) {\n return ['in_queue', 'in_process'].includes(response.status);\n }\n\n private onResponse(response:HttpResponse) {\n const { body } = response;\n\n if (!body) {\n throw new Error(response as any);\n }\n\n const status = this.status = body.status;\n\n this.message = body.message\n || this.I18n.t(`js.job_status.generic_messages.${status}`, { defaultValue: status });\n\n this.payload = body.payload;\n if (body.payload) {\n this.title = body.payload.title || this.text.title;\n this.handleRedirect(body.payload);\n this.handleDownload(body.payload?.download);\n this.handleHTML(body.payload?.html);\n }\n\n this.statusIcon = this.iconForStatus();\n this.cdRef.detectChanges();\n }\n\n private handleHTML(content?:string) {\n if (content) {\n this.htmlContent = this.sanitization.bypassSecurityTrustHtml(content);\n }\n }\n\n private handleRedirect(payload:JobStatusInterface['payload']) {\n if (payload?.redirect && !payload?.errors) {\n setTimeout(() => { window.location.href = payload.redirect as string; }, 2000);\n this.message += `. ${this.text.redirect}`;\n }\n }\n\n private handleDownload(redirectionUrl?:string) {\n if (redirectionUrl !== undefined) {\n // Get the file url from the redirectionUrl\n this.httpClient\n .get(redirectionUrl, {\n observe: 'response',\n responseType: 'text',\n // This might or might not be an external request (depending on the configuration of an S3 storage)\n // But not having headers like X-CSRF-TOKEN set works in both cases.\n headers: {\n [EXTERNAL_REQUEST_HEADER]: 'true',\n },\n })\n .subscribe((response) => {\n this.downloadHref = response.url;\n\n this.cdRef.detectChanges();\n this.downloadLink.nativeElement.click();\n }, (error:HttpErrorResponse) => {\n // In this case, most typically, there is a CORS error.\n // Instead of failing completely, we show a manual link for the user to click themselves.\n if (error.status === 0) {\n this.downloadHref = redirectionUrl;\n\n this.cdRef.detectChanges();\n }\n });\n }\n }\n\n private performRequest():Observable> {\n return this\n .httpClient\n .get(\n this.jobUrl,\n { observe: 'response', responseType: 'json' },\n );\n }\n\n private handleError(error:HttpErrorResponse) {\n if (error?.status === 404) {\n this.statusIcon = 'icon-help';\n this.message = this.I18n.t('js.job_status.generic_messages.not_found');\n } else {\n this.statusIcon = 'icon-error';\n this.message = error?.message || this.I18n.t('js.error.internal');\n this.toastService.addError(this.message);\n }\n\n this.cdRef.detectChanges();\n }\n\n private get jobUrl():string {\n return this.apiV3Service.job_statuses.id(this.jobId).toString();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HookService {\n private hooks:{ [hook:string]:Function[] } = {};\n\n public register(id:string, callback:Function) {\n if (!callback) {\n return;\n }\n\n if (!this.hooks[id]) {\n this.hooks[id] = [];\n }\n\n this.hooks[id].push(callback);\n }\n\n public call(id:string, ...params:any[]):any[] {\n const results = [];\n\n if (this.hooks[id]) {\n for (let x = 0; x < this.hooks[id].length; x++) {\n const result = this.hooks[id][x](...params);\n\n if (result) {\n results.push(result);\n }\n }\n }\n\n return results;\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { StateService } from '@uirouter/core';\nimport { IOPFormlyFieldSettings } from 'core-app/shared/components/dynamic-forms/typings';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\n\n@Component({\n selector: 'app-projects',\n templateUrl: './projects.component.html',\n styleUrls: ['./projects.component.scss'],\n})\nexport class ProjectsComponent extends UntilDestroyedMixin implements OnInit {\n projectsPath:string;\n\n formMethod = 'patch';\n\n text:{ [key:string]:string };\n\n dynamicFieldsSettingsPipe:(dynamicFieldsSettings:IOPFormlyFieldSettings[]) => IOPFormlyFieldSettings[];\n\n hiddenFields = ['identifier', 'active'];\n\n constructor(\n private _pathHelperService:PathHelperService,\n private _$state:StateService,\n private _currentProjectService:CurrentProjectService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.projectsPath = this._currentProjectService.apiv3Path!;\n this.dynamicFieldsSettingsPipe = (dynamicFieldsSettings) => dynamicFieldsSettings\n .reduce((formattedDynamicFieldsSettings:IOPFormlyFieldSettings[], dynamicFormField) => {\n if (this.isFieldHidden(dynamicFormField.key)) {\n dynamicFormField = {\n ...dynamicFormField,\n hide: true,\n };\n }\n\n return [...formattedDynamicFieldsSettings, dynamicFormField];\n }, []);\n }\n\n private isFieldHidden(name:string|undefined) {\n return this.hiddenFields.includes(name || '');\n }\n}\n","","import { Component, OnInit, ViewChild } from '@angular/core';\nimport { StateService, UIRouterGlobals } from '@uirouter/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { IDynamicFieldGroupConfig, IOPFormlyFieldSettings } from 'core-app/shared/components/dynamic-forms/typings';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { map } from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { JobStatusModalComponent } from 'core-app/features/job-status/job-status-modal/job-status.modal';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { DynamicFormComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-form/dynamic-form.component';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport interface ProjectTemplateOption {\n href:string|null;\n name:string;\n}\n\n@Component({\n selector: 'op-new-project',\n templateUrl: './new-project.component.html',\n styleUrls: ['./new-project.component.sass'],\n})\nexport class NewProjectComponent extends UntilDestroyedMixin implements OnInit {\n formUrl:string|null;\n\n resourcePath:string;\n\n dynamicFieldsSettingsPipe = this.fieldSettingsPipe.bind(this);\n\n fieldGroups:IDynamicFieldGroupConfig[];\n\n initialPayload:Record = {};\n\n text = {\n use_template: this.I18n.t('js.project.use_template'),\n no_template_selected: this.I18n.t('js.project.no_template_selected'),\n advancedSettingsLabel: this.I18n.t('js.forms.advanced_settings'),\n copySettingsLabel: this.I18n.t('js.project.copy.copy_options'),\n };\n\n hiddenFields:string[] = [\n 'identifier',\n 'active',\n ];\n\n copyableTemplateFilter = new ApiV3FilterBuilder()\n .add('user_action', '=', ['projects/copy']) // no null values\n .add('templated', '=', true);\n\n templateOptions$:Observable =\n this\n .apiV3Service\n .projects\n .filtered(\n this.copyableTemplateFilter,\n { pageSize: '-1' },\n )\n .get()\n .pipe(\n map((response) => response.elements.map((el:HalResource) => ({ href: el.href, name: el.name }))),\n );\n\n templateForm = new UntypedFormGroup({\n template: new UntypedFormControl(),\n });\n\n get templateControl() {\n return this.templateForm.get('template');\n }\n\n @ViewChild(DynamicFormComponent) dynamicForm:DynamicFormComponent;\n\n constructor(\n private apiV3Service:ApiV3Service,\n private uIRouterGlobals:UIRouterGlobals,\n private pathHelperService:PathHelperService,\n private modalService:OpModalService,\n private $state:StateService,\n private I18n:I18nService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.resourcePath = this.apiV3Service.projects.path;\n this.fieldGroups = [{\n name: this.text.advancedSettingsLabel,\n fieldsFilter: (field) => !['name', 'parent'].includes(field.templateOptions?.property as string)\n && !this.isMeta(field.templateOptions?.property)\n && !(field.templateOptions?.required\n && !field.templateOptions.hasDefault\n && field.templateOptions.payloadValue == null),\n },\n {\n name: this.text.copySettingsLabel,\n fieldsFilter: (field:IOPFormlyFieldSettings) => this.isMeta(field.templateOptions?.property),\n }];\n\n if (this.uIRouterGlobals.params.parent_id) {\n this.setParentAsPayload(this.uIRouterGlobals.params.parent_id);\n }\n }\n\n onSubmitted(response:HalSource) {\n if (response._type === 'JobStatus') {\n this.modalService.show(JobStatusModalComponent, 'global', { jobId: response.jobId });\n } else {\n window.location.href = this.pathHelperService.projectPath(response.identifier as string);\n }\n }\n\n onTemplateSelected(selected:{ href:string|null }) {\n this.initialPayload = {\n ...this.initialPayload,\n name: this.dynamicForm.model.name,\n _meta: {\n ...(this.initialPayload?._meta as Record),\n sendNotifications: false,\n },\n };\n this.formUrl = selected?.href ? `${selected.href}/copy` : null;\n }\n\n private isHiddenField(key:string|undefined):boolean {\n // We explicitly want to show the sendNotifications param\n if (key === '_meta.sendNotifications') {\n return false;\n }\n\n return !!key && (this.hiddenFields.includes(key) || this.isMeta(key));\n }\n\n private isMeta(property:string|undefined):boolean {\n return !!property && (property.startsWith('copy') || property === 'sendNotifications');\n }\n\n private setParentAsPayload(parentId:string) {\n const href = this.apiV3Service.projects.id(parentId).path;\n\n this.initialPayload = {\n _links: {\n parent: {\n href,\n },\n },\n };\n }\n\n private fieldSettingsPipe(dynamicFieldsSettings:IOPFormlyFieldSettings[]):IOPFormlyFieldSettings[] {\n return dynamicFieldsSettings.map((field) => ({ ...field, hide: this.isHiddenField(field.key) }));\n }\n}\n","\n
\n \n \n \n \n
\n\n\n","import {\n IDynamicFieldGroupConfig,\n IOPFormlyFieldSettings,\n IOPFormlyTemplateOptions,\n} from 'core-app/shared/components/dynamic-forms/typings';\nimport { JobStatusModalComponent } from 'core-app/features/job-status/job-status-modal/job-status.modal';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { Component, OnInit } from '@angular/core';\nimport { StateService } from '@uirouter/core';\n\n@Component({\n selector: 'op-copy-project',\n templateUrl: './copy-project.component.html',\n})\nexport class CopyProjectComponent extends UntilDestroyedMixin implements OnInit {\n dynamicFieldsSettingsPipe = this.fieldSettingsPipe.bind(this);\n\n fieldGroups:IDynamicFieldGroupConfig[];\n\n formUrl:string;\n\n hiddenFields:string[] = [\n 'identifier',\n 'active',\n ];\n\n text = {\n advancedSettingsLabel: this.I18n.t('js.forms.advanced_settings'),\n copySettingsLabel: this.I18n.t('js.project.copy.copy_options'),\n };\n\n constructor(\n private apiV3Service:ApiV3Service,\n private currentProjectService:CurrentProjectService,\n private pathHelperService:PathHelperService,\n private modalService:OpModalService,\n private $state:StateService,\n private I18n:I18nService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.formUrl = this.apiV3Service.projects.id(this.currentProjectService.id!).copy.form.path;\n this.fieldGroups = [\n {\n name: this.text.advancedSettingsLabel,\n fieldsFilter: (field:IOPFormlyFieldSettings) => !this.isMeta(field.templateOptions?.property) && !this.isPrimaryAttribute(field.templateOptions),\n },\n {\n name: this.text.copySettingsLabel,\n fieldsFilter: (field:IOPFormlyFieldSettings) => this.isMeta(field.templateOptions?.property),\n },\n ];\n }\n\n onSubmitted(response:HalSource) {\n this.modalService.show(JobStatusModalComponent, 'global', { jobId: response.jobId });\n }\n\n private isHiddenField(key:string|undefined):boolean {\n return !!key && this.hiddenFields.includes(key);\n }\n\n private fieldSettingsPipe(dynamicFieldsSettings:IOPFormlyFieldSettings[]):IOPFormlyFieldSettings[] {\n return this.sortedCopyFields(dynamicFieldsSettings)\n .map((field) => ({ ...field, hide: this.isHiddenField(field.key) }));\n }\n\n private isPrimaryAttribute(to?:IOPFormlyTemplateOptions):boolean {\n if (!to) {\n return false;\n }\n\n return (to.required\n && !to.hasDefault\n && to.payloadValue == null)\n || to.property === 'name'\n || to.property === 'parent';\n }\n\n private isMeta(property:string|undefined):boolean {\n return !!property && (property.startsWith('copy') || property === 'sendNotifications');\n }\n\n // Sorts the copy options by their label.\n // The order of the rest of the fields is left unchanged but all copy options are returned first.\n private sortedCopyFields(dynamicFieldsSettings:IOPFormlyFieldSettings[]):IOPFormlyFieldSettings[] {\n const sortedCopyFields = dynamicFieldsSettings\n .filter((field) => field.key && field.key.startsWith('_meta.copy'))\n .sort((fieldA, fieldB) => {\n if (!fieldA.templateOptions\n || !fieldA.templateOptions.label\n || !fieldB.templateOptions\n || !fieldB.templateOptions.label) {\n return 0;\n }\n\n return fieldA.templateOptions.label.localeCompare(fieldB.templateOptions.label);\n });\n\n const nonCopyFields = dynamicFieldsSettings\n .filter((field) => !field.key || !field.key.startsWith('_meta.copy'));\n\n // Now all copy fields are before the non Copy fields.\n // That way, the \"Sent notifications\" is after the copy fields.\n // For the rest, it does not make a difference since the _meta\n // fields are rendered in a separate group.\n return sortedCopyFields.concat(nonCopyFields);\n }\n}\n","","import { Ng2StateDeclaration, UIRouter } from '@uirouter/angular';\nimport { ProjectsComponent } from 'core-app/features/projects/components/projects/projects.component';\nimport { NewProjectComponent } from 'core-app/features/projects/components/new-project/new-project.component';\nimport { CopyProjectComponent } from 'core-app/features/projects/components/copy-project/copy-project.component';\n\nexport const PROJECTS_ROUTES:Ng2StateDeclaration[] = [\n {\n name: 'project_settings',\n parent: 'optional_project',\n url: '/settings/general/',\n component: ProjectsComponent,\n },\n {\n name: 'project_copy',\n parent: 'optional_project',\n url: '/copy',\n component: CopyProjectComponent,\n },\n {\n name: 'new_project',\n url: '/projects/new?parent_id',\n component: NewProjectComponent,\n },\n];\n\nexport function uiRouterProjectsConfiguration(uiRouter:UIRouter) {\n // Ensure projects/ are being redirected correctly\n // cf., https://community.openproject.com/wp/29754\n uiRouter.urlService.rules\n .when(\n new RegExp('^/projects/(.*)/settings/general$'),\n (match:string[]) => `/projects/${match[1]}/settings/general/`,\n );\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { NgModule } from '@angular/core';\nimport { OpenprojectHalModule } from 'core-app/features/hal/openproject-hal.module';\nimport { UIRouterModule } from '@uirouter/angular';\nimport { OpenprojectFieldsModule } from 'core-app/shared/components/fields/openproject-fields.module';\nimport { PROJECTS_ROUTES, uiRouterProjectsConfiguration } from 'core-app/features/projects/projects-routes';\nimport { DynamicFormsModule } from 'core-app/shared/components/dynamic-forms/dynamic-forms.module';\nimport { NewProjectComponent } from 'core-app/features/projects/components/new-project/new-project.component';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { CopyProjectComponent } from 'core-app/features/projects/components/copy-project/copy-project.component';\nimport { ProjectsComponent } from './components/projects/projects.component';\n\n@NgModule({\n imports: [\n // Commons\n OpSharedModule,\n ReactiveFormsModule,\n\n OpenprojectHalModule,\n OpenprojectFieldsModule,\n UIRouterModule.forChild({\n states: PROJECTS_ROUTES,\n config: uiRouterProjectsConfiguration,\n }),\n DynamicFormsModule,\n ],\n declarations: [\n ProjectsComponent,\n NewProjectComponent,\n CopyProjectComponent,\n ],\n})\nexport class OpenprojectProjectsModule {\n}\n","import { Calendar } from '@fullcalendar/core';\nimport * as moment from 'moment/moment';\n\nexport const backgroundEvents = {\n events: [],\n id: 'background',\n color: 'red',\n textColor: 'white',\n display: 'background',\n editable: false,\n};\n\nexport function addBackgroundEvents(\n calendar:Calendar,\n nonWorkingDay:(date:Date) => boolean,\n) {\n let currentStartDate = calendar.view.activeStart;\n const currentEndDate = calendar.view.activeEnd.getTime();\n const nonWorkingDays = new Array<{ start:Date|string, end:Date|string }>();\n\n while (currentStartDate.getTime() < currentEndDate) {\n if (nonWorkingDay(currentStartDate)) {\n nonWorkingDays.push({\n start: moment(currentStartDate).format('YYYY-MM-DD'),\n end: moment(currentStartDate).add('1', 'day').format('YYYY-MM-DD'),\n });\n }\n currentStartDate = moment(currentStartDate).add('1', 'day').toDate();\n }\n nonWorkingDays.forEach((day) => {\n calendar.addEvent({ ...day }, 'background');\n });\n}\n\nexport function removeBackgroundEvents(calendar:Calendar) {\n calendar\n .getEvents()\n .filter((el) => el.source?.id === 'background')\n .forEach((el) => el.remove());\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { BackRoutingService } from 'core-app/features/work-packages/components/back-routing/back-routing.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n@Component({\n templateUrl: './back-button.component.html',\n styleUrls: ['./back-button.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'op-back-button',\n})\nexport class BackButtonComponent {\n @Input() public linkClass:string;\n\n @Input() public customBackMethod:() => unknown;\n\n public text = {\n goBack: this.I18n.t('js.button_back'),\n };\n\n constructor(readonly backRoutingService:BackRoutingService,\n readonly I18n:I18nService) {\n }\n\n public goBack():void {\n if (this.customBackMethod) {\n this.customBackMethod();\n } else {\n this.backRoutingService.goBack();\n }\n }\n}\n","\n \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { StateService, Transition } from '@uirouter/core';\nimport { KeepTabService } from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport interface BackRouteOptions {\n name:string;\n params:{};\n parent:string;\n baseRoute:string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class BackRoutingService {\n @InjectField() private $state:StateService;\n\n @InjectField() private keepTab:KeepTabService;\n\n private _backRoute:BackRouteOptions;\n\n constructor(readonly injector:Injector) {\n }\n\n private goToOtherState(route:string, params:Record):Promise {\n return this.$state.go(route, params);\n }\n\n private goBackToDetailsState(preferListOverSplit:boolean, baseRoute:string):void {\n if (preferListOverSplit) {\n this.goToOtherState(baseRoute, this.backRoute.params);\n } else {\n const state = `${baseRoute}.details.tabs`;\n const params = { ...this.backRoute.params, tabIdentifier: this.keepTab.currentDetailsTab };\n this.goToOtherState(state, params);\n }\n }\n\n private goBackNotToDetailsState():void {\n if (this.backRoute.parent) {\n this.goToOtherState(this.backRoute.name, this.backRoute.params).then(() => {\n this.$state.reload();\n });\n } else {\n this.goToOtherState(this.backRoute.name, this.backRoute.params);\n }\n }\n\n private goBackToPreviousState(preferListOverSplit:boolean, baseRoute:string):void {\n if (this.keepTab.isDetailsState(this.backRoute.parent)) {\n this.goBackToDetailsState(preferListOverSplit, baseRoute);\n } else {\n this.goBackNotToDetailsState();\n }\n }\n\n public goBack(preferListOverSplit = false) {\n // Default: back to list\n // When coming from a deep link or a create form\n const baseRoute = this.backRoute?.baseRoute || this.$state.current.data.baseRoute || 'work-packages.partitioned.list';\n // if we are in the first state\n if (!this.backRoute && baseRoute.includes('show')) {\n this.$state.reload();\n } else if (!this.backRoute || this.backRoute.name.includes('new')) {\n this.$state.go(baseRoute, this.$state.params);\n } else {\n this.goBackToPreviousState(preferListOverSplit, baseRoute);\n }\n }\n\n public goToBaseState() {\n const baseRoute = this.$state.current.data.baseRoute || 'work-packages.partitioned.list';\n this.$state.go(baseRoute, this.$state.params);\n }\n\n public sync(transition:Transition) {\n const fromState = transition.from();\n const toState = transition.to();\n\n // Set backRoute to know where we came from\n if (fromState.name\n && fromState.data\n && toState.data\n && fromState.data.parent !== toState.data.parent) {\n const paramsFromCopy = { ...transition.params('from') };\n this.backRoute = {\n name: fromState.name,\n params: paramsFromCopy,\n parent: fromState.data.parent,\n baseRoute: fromState.data.baseRoute,\n };\n }\n }\n\n public set backRoute(route:BackRouteOptions) {\n this._backRoute = route;\n }\n\n public get backRoute():BackRouteOptions {\n return this._backRoute;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { EditFormComponent } from 'core-app/shared/components/fields/edit/edit-form/edit-form.component';\n\n@Component({\n templateUrl: './wp-edit-actions-bar.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'wp-edit-actions-bar',\n})\nexport class WorkPackageEditActionsBarComponent {\n @Output('onSave') public onSave = new EventEmitter();\n\n @Output('onCancel') public onCancel = new EventEmitter();\n\n public _saving = false;\n\n public text = {\n save: this.I18n.t('js.button_save'),\n cancel: this.I18n.t('js.button_cancel'),\n };\n\n constructor(private I18n:I18nService,\n private editForm:EditFormComponent,\n private cdRef:ChangeDetectorRef) {\n }\n\n public set saving(active:boolean) {\n this._saving = active;\n this.cdRef.detectChanges();\n }\n\n public get saving() {\n return this._saving;\n }\n\n public save():void {\n if (this.saving) {\n return;\n }\n\n this.saving = true;\n this.editForm\n .submit()\n .then(() => {\n this.saving = false;\n this.onSave.emit();\n })\n .catch(() => {\n this.saving = false;\n });\n }\n\n public cancel():void {\n this.editForm.cancel();\n this.onCancel.emit();\n }\n}\n","
\n \n \n \n \n \n \n \n \n
\n","\n \n \n\n\n\n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n Output,\n\n} from '@angular/core';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { Observable } from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { WorkPackageFiltersService } from 'core-app/features/work-packages/components/filters/wp-filters/wp-filters.service';\n\n@Component({\n templateUrl: './filter-container.directive.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'op-filter-container',\n})\nexport class WorkPackageFilterContainerComponent extends UntilDestroyedMixin implements OnInit, OnDestroy {\n @Input('showFilterButton') showFilterButton = false;\n\n @Input('filterButtonText') filterButtonText:string = I18n.t('js.button_filter');\n\n @Output() public filtersChanged = new DebouncedEventEmitter(componentDestroyed(this));\n\n public visible$:Observable;\n\n public filters = this.wpTableFilters.current;\n\n public loaded = false;\n\n constructor(\n readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly cdRef:ChangeDetectorRef,\n readonly wpFiltersService:WorkPackageFiltersService,\n ) {\n super();\n this.visible$ = this.wpFiltersService.observeUntil(componentDestroyed(this));\n }\n\n ngOnInit():void {\n this.wpTableFilters\n .pristine$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n this.filters = this.wpTableFilters.current;\n this.loaded = true;\n this.cdRef.detectChanges();\n });\n }\n\n public replaceIfComplete(filters:QueryFilterInstanceResource[]) {\n const available = filters.filter((el) => this.wpTableFilters.isAvailable(el));\n this.wpTableFilters.replaceIfComplete(available);\n this.filtersChanged.emit(available);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component, EventEmitter, Input, Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\n\n@Component({\n selector: 'op-filter-boolean-value',\n templateUrl: './filter-boolean-value.component.html',\n})\nexport class FilterBooleanValueComponent {\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new EventEmitter();\n\n constructor(readonly I18n:I18nService) {\n }\n\n public get value():HalResource | string {\n return this.filter.values[0];\n }\n\n public onFilterUpdated(val:string | HalResource) {\n this.filter.values[0] = val;\n this.filterChanged.emit(this.filter);\n }\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, HostBinding, Input, Output } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\n\n@Component({\n selector: 'op-filter-date-value',\n templateUrl: './filter-date-value.component.html',\n})\nexport class FilterDateValueComponent extends UntilDestroyedMixin {\n @HostBinding('id') get id() {\n return `div-values-${this.filter.id}`;\n }\n\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new DebouncedEventEmitter(componentDestroyed(this));\n\n constructor(readonly timezoneService:TimezoneService,\n readonly I18n:I18nService) {\n super();\n }\n\n public get value():string {\n return this.filter.values[0] as string;\n }\n\n public set value(val) {\n this.filter.values = [val];\n this.filterChanged.emit(this.filter);\n }\n\n valueChanged(val:string) {\n const parsed = this.parser(val);\n if (parsed) {\n this.value = val;\n }\n }\n\n public parser(data:string) {\n if (moment(data, 'YYYY-MM-DD', true).isValid()) {\n return data;\n }\n return null;\n }\n\n public formatter(data:string) {\n if (moment(data, 'YYYY-MM-DD', true).isValid()) {\n const d = this.timezoneService.parseDate(data);\n return this.timezoneService.formattedISODate(d);\n }\n return null;\n }\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component,\n HostBinding,\n Input,\n Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport * as moment from 'moment';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\n\n@Component({\n selector: 'op-filter-dates-value',\n templateUrl: './filter-dates-value.component.html',\n})\nexport class FilterDatesValueComponent extends UntilDestroyedMixin {\n @HostBinding('id') get id() {\n return `div-values-${this.filter.id}`;\n }\n\n @HostBinding('class.inline-label') className = true;\n\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new DebouncedEventEmitter(componentDestroyed(this));\n\n readonly text = {\n spacer: this.I18n.t('js.filter.value_spacer'),\n };\n\n constructor(\n readonly timezoneService:TimezoneService,\n readonly I18n:I18nService,\n ) {\n super();\n }\n\n public get value():string[] {\n return (this.filter.values || []) as string[];\n }\n\n public set value(val:string[]) {\n this.filter.values = val;\n this.filterChanged.emit(this.filter);\n }\n\n public get begin():string {\n return (this.filter.values[0] || '') as string;\n }\n\n public get end():string {\n return (this.filter.values[1] || '') as string;\n }\n\n public parser(data:string):string|null {\n if (moment(data, 'YYYY-MM-DD', true).isValid()) {\n return data;\n }\n return null;\n }\n\n public formatter(data:string):string|null {\n if (moment(data, 'YYYY-MM-DD', true).isValid()) {\n const d = this.timezoneService.parseDate(data);\n return this.timezoneService.formattedISODate(d);\n }\n return null;\n }\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Moment } from 'moment';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OnInit, Directive } from '@angular/core';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\n\n@Directive()\nexport abstract class AbstractDateTimeValueController extends UntilDestroyedMixin implements OnInit {\n public filter:QueryFilterInstanceResource;\n\n constructor(\n protected I18n:I18nService,\n protected timezoneService:TimezoneService,\n ) {\n super();\n }\n\n ngOnInit() {\n _.remove(this.filter.values as string[], (value) => !(value === '' || this.timezoneService.isValidISODateTime(value)));\n }\n\n public abstract get lowerBoundary():Moment|null;\n\n public abstract get upperBoundary():Moment|null;\n\n public isoDateParser(data:any) {\n if (!this.timezoneService.isValidISODate(data)) {\n return '';\n }\n const d = this.timezoneService.parseISODatetime(data);\n return this.timezoneService.formattedISODateTime(d);\n }\n\n public isoDateFormatter(data:any) {\n if (!this.timezoneService.isValidISODateTime(data)) {\n return '';\n }\n const d = this.timezoneService.parseISODatetime(data);\n return this.timezoneService.formattedISODate(d);\n }\n\n public get isTimeZoneDifferent() {\n const value = this.lowerBoundary || this.upperBoundary;\n\n if (!value) {\n return false;\n }\n return value.hours() !== 0 || value.minutes() !== 0;\n }\n\n public get timeZoneText() {\n if (this.lowerBoundary && this.upperBoundary) {\n return this.I18n.t('js.filter.time_zone_converted.two_values',\n {\n from: this.lowerBoundary.format('YYYY-MM-DD HH:mm'),\n to: this.upperBoundary.format('YYYY-MM-DD HH:mm'),\n });\n } if (this.upperBoundary) {\n return this.I18n.t('js.filter.time_zone_converted.only_end',\n { to: this.upperBoundary.format('YYYY-MM-DD HH:mm') });\n } if (this.lowerBoundary) {\n return this.I18n.t('js.filter.time_zone_converted.only_start',\n { from: this.lowerBoundary.format('YYYY-MM-DD HH:mm') });\n }\n\n return '';\n }\n}\n","\n\n\n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component,\n Input,\n HostBinding,\n OnInit,\n Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport { Moment } from 'moment';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { AbstractDateTimeValueController } from '../abstract-filter-date-time-value/abstract-filter-date-time-value.controller';\n\n@Component({\n selector: 'op-filter-date-time-value',\n templateUrl: './filter-date-time-value.component.html',\n})\nexport class FilterDateTimeValueComponent extends AbstractDateTimeValueController implements OnInit {\n @HostBinding('id') get id() {\n return `div-values-${this.filter.id}`;\n }\n\n @HostBinding('class.inline-label') className = true;\n\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new DebouncedEventEmitter(componentDestroyed(this));\n\n constructor(readonly I18n:I18nService,\n readonly timezoneService:TimezoneService) {\n super(I18n, timezoneService);\n }\n\n public get value():HalResource|string {\n return this.filter.values[0];\n }\n\n public get valueString() {\n return this.filter.values[0].toString();\n }\n\n public set value(val) {\n this.filter.values = [val as string];\n this.filterChanged.emit(this.filter);\n }\n\n public get lowerBoundary():Moment|null {\n if (this.value && this.timezoneService.isValidISODateTime(this.valueString)) {\n return this.timezoneService.parseDatetime(this.valueString);\n }\n\n return null;\n }\n\n public get upperBoundary():Moment|null {\n if (this.value && this.timezoneService.isValidISODateTime(this.valueString)) {\n return this.timezoneService.parseDatetime(this.valueString).add(24, 'hours');\n }\n\n return null;\n }\n}\n","\n\n\n\n\n\n\n\n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Moment } from 'moment';\nimport {\n Component,\n HostBinding,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { AbstractDateTimeValueController } from '../abstract-filter-date-time-value/abstract-filter-date-time-value.controller';\nimport { validDate } from 'core-app/shared/components/datepicker/helpers/date-modal.helpers';\n\n@Component({\n selector: 'op-filter-date-times-value',\n templateUrl: './filter-date-times-value.component.html',\n})\nexport class FilterDateTimesValueComponent extends AbstractDateTimeValueController implements OnInit {\n @HostBinding('id') get id() {\n return `div-values-${this.filter.id}`;\n }\n\n @HostBinding('class.inline-label') className = true;\n\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new DebouncedEventEmitter(componentDestroyed(this));\n\n readonly text = {\n spacer: this.I18n.t('js.filter.value_spacer'),\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly timezoneService:TimezoneService,\n ) {\n super(I18n, timezoneService);\n }\n\n public get begin():string {\n return (this.filter.values[0] || '') as string;\n }\n\n public set begin(val:string) {\n this.filter.values[0] = val || '';\n this.filterChanged.emit(this.filter);\n }\n\n public get end():string {\n return (this.filter.values[1] || '') as string;\n }\n\n public set end(val:string) {\n this.filter.values = [this.begin, val || ''] as string[];\n this.filterChanged.emit(this.filter);\n }\n\n public get lowerBoundary():Moment|null {\n if (this.begin && this.timezoneService.isValidISODateTime(this.begin.toString())) {\n return this.timezoneService.parseDatetime(this.begin.toString());\n }\n return null;\n }\n\n public get upperBoundary():Moment|null {\n if (this.end && this.timezoneService.isValidISODateTime(this.end.toString())) {\n return this.timezoneService.parseDatetime(this.end.toString());\n }\n return null;\n }\n\n public parseBegin(date:string|null) {\n if (date === null || !validDate(date)) {\n return;\n }\n\n if (date === '') {\n this.begin = date;\n } else {\n const parsed = this\n .timezoneService\n .parseISODatetime(date)\n .startOf('day')\n .utc();\n\n this.begin = this.timezoneService.formattedISODateTime(parsed);\n }\n }\n\n public parseEnd(date:string|null) {\n if (date === null || !validDate(date)) {\n return;\n }\n\n if (date === '') {\n this.end = date;\n } else {\n const parsed = this\n .timezoneService\n .parseISODatetime(date)\n .endOf('day')\n .utc();\n\n this.end = this.timezoneService.formattedISODateTime(parsed);\n }\n }\n\n public formatter(data:string[]):string[] {\n return data.map((date) => this.isoDateFormatter(date));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, Input, Output } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { QueryFilterResource } from 'core-app/features/hal/resources/query-filter-resource';\n\n@Component({\n selector: 'op-filter-integer-value',\n templateUrl: './filter-integer-value.component.html',\n})\nexport class FilterIntegerValueComponent extends UntilDestroyedMixin {\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new DebouncedEventEmitter(componentDestroyed(this));\n\n constructor(readonly I18n:I18nService,\n readonly schemaCache:SchemaCacheService) {\n super();\n }\n\n public get value() {\n return parseInt(this.filter.values[0] as string);\n }\n\n public set value(val) {\n if (typeof (val) === 'number') {\n this.filter.values = [val.toString()];\n } else {\n this.filter.values = [];\n }\n\n this.filterChanged.emit(this.filter);\n }\n\n public get unit() {\n switch ((this.schema.filter.allowedValues as QueryFilterResource[])[0].id) {\n case 'startDate':\n case 'dueDate':\n case 'updatedAt':\n case 'createdAt':\n return this.I18n.t('js.work_packages.time_relative.days');\n default:\n return '';\n }\n }\n\n private get schema() {\n return this.schemaCache.of(this.filter);\n }\n}\n","
\n \n \n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, Input, Output } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\n\n@Component({\n selector: 'op-filter-string-value',\n templateUrl: './filter-string-value.component.html',\n})\nexport class FilterStringValueComponent extends UntilDestroyedMixin {\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new DebouncedEventEmitter(componentDestroyed(this));\n\n readonly text = {\n enter_text: this.I18n.t('js.work_packages.description_enter_text'),\n };\n\n constructor(readonly I18n:I18nService) {\n super();\n }\n\n public get value():HalResource|string {\n return this.filter.values[0];\n }\n\n public set value(val) {\n if (val.length) {\n this.filter.values[0] = val;\n } else {\n this.filter.values.length = 0;\n }\n this.filterChanged.emit(this.filter);\n }\n}\n","
\n \n \n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { DebouncedEventEmitter } from 'core-app/shared/helpers/rxjs/debounced-event-emitter';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { IProjectAutocompleteItem } from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocomplete-item';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3ListFilter } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\n\n@Component({\n selector: 'op-filter-project',\n templateUrl: './filter-project.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FilterProjectComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public shouldFocus = false;\n\n @Input() public filter:QueryFilterInstanceResource;\n\n @Output() public filterChanged = new DebouncedEventEmitter(componentDestroyed(this), 0);\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 const operator = filter.operator.id as FilterOperator;\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 if (operator !== '=') return;\n\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 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 },\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 showSwitchToProjectBanner():boolean {\n return !this.isNewResource && this.projectContext && !this.projectContext.matches;\n }\n\n public get switchToProjectText():string {\n const id = idFromLink(this.workPackage.project.href);\n const projectPath = this.PathHelper.projectPath(id);\n const projectName = this.workPackage.project.name as string;\n const project = `${projectName}`;\n return this.I18n.t('js.project.click_to_switch_to_project', { projectname: project });\n }\n\n showTwoColumnLayout():boolean {\n return this.$element[0].getBoundingClientRect().width > 750;\n }\n\n private rebuildGroupedFields(change:WorkPackageChangeset, attributeGroups:any) {\n if (!attributeGroups) {\n return [];\n }\n\n return attributeGroups.map((group:any) => {\n const groupId = this.getAttributesGroupId(group);\n\n if (group._type === 'WorkPackageFormAttributeGroup') {\n return {\n name: group.name,\n id: groupId || randomString(16),\n members: this.getFields(change, group.attributes),\n type: group._type,\n isolated: false,\n };\n }\n return {\n name: group.name,\n id: groupId || randomString(16),\n query: this.halResourceService.createHalResourceOfClass(QueryResource, group._embedded.query),\n relationType: group.relationType,\n members: [group._embedded.query],\n type: group._type,\n isolated: true,\n };\n });\n }\n\n /**\n * Maps the grouped fields into their display fields.\n * May return multiple fields (for the date virtual field).\n */\n private getFields(change:WorkPackageChangeset, fieldNames:string[]):FieldDescriptor[] {\n const descriptors:FieldDescriptor[] = [];\n\n fieldNames.forEach((fieldName:string) => {\n if (fieldName === 'date') {\n descriptors.push(this.getDateField(change));\n return;\n }\n\n if (!change.schema.ofProperty(fieldName)) {\n debugLog('Unknown field for current schema', fieldName);\n return;\n }\n\n const field:DisplayField = this.displayField(change, fieldName);\n descriptors.push({\n name: fieldName,\n label: field.label,\n multiple: false,\n spanAll: field.isFormattable,\n field,\n });\n });\n\n return descriptors;\n }\n\n /**\n * We need to discern between milestones, which have a single\n * 'date' field vs. all other types which should display a\n * combined 'start' and 'due' date field.\n */\n private getDateField(change:WorkPackageChangeset):FieldDescriptor {\n const object:FieldDescriptor = {\n name: '',\n label: this.I18n.t('js.work_packages.properties.date'),\n spanAll: false,\n multiple: false,\n };\n\n if (change.schema.ofProperty('date')) {\n object.field = this.displayField(change, 'date');\n object.name = 'date';\n } else {\n object.field = this.displayField(change, 'combinedDate');\n object.name = 'combinedDate';\n }\n\n return object;\n }\n\n /**\n * Get the current resource context change from the WP resource.\n * Used to identify changes in the schema or project that may result in visual changes\n * to the single view.\n *\n * @param {WorkPackage} workPackage\n * @returns {ResourceContextChange}\n */\n private contextFrom(workPackage:WorkPackageResource):ResourceContextChange {\n const schema = this.schema(workPackage);\n\n let schemaHref:string|null;\n const projectHref:string|null = workPackage.project && workPackage.project.href;\n\n if (schema.baseSchema) {\n schemaHref = schema.baseSchema.href;\n } else {\n schemaHref = schema.href;\n }\n\n return {\n isNew: workPackage.isNew,\n schema: schemaHref,\n project: projectHref,\n };\n }\n\n private displayField(change:WorkPackageChangeset, name:string):DisplayField {\n return this.displayFieldService.getField(\n change.projectedResource,\n name,\n change.schema.ofProperty(name),\n { container: 'single-view', injector: this.injector, options: {} },\n );\n }\n\n private getAttributesGroupId(group:any):string {\n const overflowingIdentifier = this.$element\n .find(`[data-group-name=\\'${group.name}\\']`)\n .data(overflowingContainerAttribute);\n\n if (overflowingIdentifier) {\n return overflowingIdentifier.replace('.__overflowing_', '');\n }\n return '';\n }\n\n private schema(resource:WorkPackageResource) {\n if (this.halEditing.typedState(resource).hasValue()) {\n return this.halEditing.typedState(this.workPackage).value!.schema;\n }\n return this.schemaCache.of(resource);\n }\n}\n","
\n
\n \n \n
\n
\n \n \n
\n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, Input, OnInit } from '@angular/core';\nimport { UIRouterGlobals } from '@uirouter/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { randomString } from 'core-app/shared/helpers/random-string';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Component({\n selector: 'wp-subject',\n templateUrl: './wp-subject.html',\n})\nexport class WorkPackageSubjectComponent extends UntilDestroyedMixin implements OnInit {\n @Input('workPackage') workPackage:WorkPackageResource;\n\n public readonly uniqueElementIdentifier = `work-packages--subject-type-row-${randomString(16)}`;\n\n constructor(protected uiRouterGlobals:UIRouterGlobals,\n protected apiV3Service:ApiV3Service) {\n super();\n }\n\n ngOnInit() {\n if (!this.workPackage) {\n this\n .apiV3Service\n .work_packages\n .id(this.uiRouterGlobals.params.workPackageId)\n .requireAndStream()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp:WorkPackageResource) => {\n this.workPackage = wp;\n });\n }\n }\n}\n","/**\n * A PortalOutlet that lets multiple components live for the lifetime of the outlet,\n * allowing faster switching and persistent data.\n */\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n ApplicationRef,\n ComponentFactoryResolver,\n ComponentRef,\n EmbeddedViewRef,\n Injector,\n} from '@angular/core';\nimport { TabDefinition } from 'core-app/shared/components/tabs/tab.interface';\n\nexport interface TabInterface extends TabDefinition {\n componentClass:{ new(...args:any[]):TabComponent };\n}\n\nexport interface TabComponent {\n onSave:() => void;\n}\n\nexport interface ActiveTabInterface extends TabDefinition {\n portal:ComponentPortal;\n componentRef:ComponentRef;\n dispose:() => void;\n}\n\nexport class TabPortalOutlet {\n // Active tabs that have been instantiated\n public activeTabs:{ [name:string]:ActiveTabInterface } = {};\n\n // The current tab\n public currentTab:ActiveTabInterface|null = null;\n\n constructor(\n public availableTabs:TabInterface[],\n public outletElement:HTMLElement,\n private componentFactoryResolver:ComponentFactoryResolver,\n private appRef:ApplicationRef,\n private injector:Injector,\n ) {\n }\n\n public get activeComponents():TabComponent[] {\n const tabs = _.values(this.activeTabs);\n return tabs.map((tab:ActiveTabInterface) => tab.componentRef.instance);\n }\n\n public switchTo(tab:TabInterface):void {\n if (tab.disable !== undefined) {\n return;\n }\n\n // Detach any current instance\n this.detach();\n\n // Get existing or new component instance\n const instance = this.activateInstance(tab);\n\n // At this point the component has been instantiated, so we move it to the location in the DOM\n // where we want it to be rendered.\n this.outletElement.innerHTML = '';\n this.outletElement.appendChild(this._getComponentRootNode(instance.componentRef));\n this.outletElement.dataset.tabName = tab.name;\n this.currentTab = instance;\n }\n\n public detach():void {\n const current = this.currentTab;\n if (current !== null) {\n current.portal.setAttachedHost(null);\n this.currentTab = null;\n }\n }\n\n /**\n * Clears out a portal from the DOM.\n */\n dispose():void {\n // Dispose all active tabs\n _.each(this.activeTabs, (active) => active.dispose());\n\n // Remove outlet element\n if (this.outletElement.parentNode != null) {\n this.outletElement.parentNode.removeChild(this.outletElement);\n }\n }\n\n private activateInstance(tab:TabInterface):ActiveTabInterface {\n if (!this.activeTabs[tab.name]) {\n this.activeTabs[tab.name] = this.createComponent(tab);\n }\n\n return this.activeTabs[tab.name] || null;\n }\n\n private createComponent(tab:TabInterface):ActiveTabInterface {\n const componentFactory = this.componentFactoryResolver.resolveComponentFactory(tab.componentClass);\n const componentRef = componentFactory.create(this.injector);\n const portal = new ComponentPortal(tab.componentClass, null, this.injector);\n\n // Attach component view\n this.appRef.attachView(componentRef.hostView);\n\n return {\n ...tab,\n portal,\n componentRef,\n dispose: () => {\n this.appRef.detachView(componentRef.hostView);\n componentRef.destroy();\n },\n };\n }\n\n /** Gets the root HTMLElement for an instantiated component. */\n private _getComponentRootNode(componentRef:ComponentRef):HTMLElement {\n return (componentRef.hostView as EmbeddedViewRef).rootNodes[0] as HTMLElement;\n }\n}\n","\n
{{text.title}}
\n\n
\n\n
\n\n \n \n \n\n \n\n \n
\n
\n
\n
\n \n \n \n \n
\n
\n\n","import {\n ApplicationRef,\n ChangeDetectorRef,\n Component,\n ComponentFactoryResolver,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Injector,\n OnDestroy,\n OnInit,\n Optional,\n ViewChild,\n} from '@angular/core';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { WpTableConfigurationService } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.service';\nimport {\n ActiveTabInterface,\n TabComponent,\n TabInterface,\n TabPortalOutlet,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { WorkPackageStatesInitializationService } from 'core-app/features/work-packages/components/wp-list/wp-states-initialization.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\nexport const WpTableConfigurationModalPrependToken = new InjectionToken>('WpTableConfigurationModalPrependComponent');\n\n@Component({\n templateUrl: './wp-table-configuration.modal.html',\n})\nexport class WpTableConfigurationModalComponent extends OpModalComponent implements OnInit, OnDestroy {\n public text = {\n title: this.I18n.t('js.work_packages.table_configuration.modal_title'),\n closePopup: this.I18n.t('js.close_popup_title'),\n\n columnsLabel: this.I18n.t('js.label_columns'),\n selectedColumns: this.I18n.t('js.description_selected_columns'),\n multiSelectLabel: this.I18n.t('js.work_packages.label_column_multiselect'),\n applyButton: this.I18n.t('js.modals.button_apply'),\n cancelButton: this.I18n.t('js.modals.button_cancel'),\n\n upsaleRelationColumns: this.I18n.t('js.modals.upsale_relation_columns'),\n upsaleRelationColumnsLink: this.I18n.t('js.modals.upsale_relation_columns_link'),\n };\n\n public onDataUpdated = new EventEmitter();\n\n public selectedColumnMap:{ [id:string]:boolean } = {};\n\n // Get the view child we'll use as the portal host\n @ViewChild('tabContentOutlet', { static: true }) tabContentOutlet:ElementRef;\n\n // And a reference to the actual portal host interface\n public tabPortalHost:TabPortalOutlet;\n\n // Try to load an optional provided configuration service, and fall back to the default one\n private wpTableConfigurationService:WpTableConfigurationService =\n this.injector.get(WpTableConfigurationService, new WpTableConfigurationService(this.I18n));\n\n constructor(@Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n @Optional() @Inject(WpTableConfigurationModalPrependToken) public prependModalComponent:ComponentType|null,\n readonly I18n:I18nService,\n readonly injector:Injector,\n readonly appRef:ApplicationRef,\n readonly componentFactoryResolver:ComponentFactoryResolver,\n readonly loadingIndicator:LoadingIndicatorService,\n readonly querySpace:IsolatedQuerySpace,\n readonly wpStatesInitialization:WorkPackageStatesInitializationService,\n readonly apiV3Service:ApiV3Service,\n readonly notificationService:WorkPackageNotificationService,\n readonly wpTableColumns:WorkPackageViewColumnsService,\n readonly cdRef:ChangeDetectorRef,\n readonly ConfigurationService:ConfigurationService,\n readonly elementRef:ElementRef) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit() {\n this.$element = this.elementRef.nativeElement as HTMLElement;\n\n this.tabPortalHost = new TabPortalOutlet(\n this.wpTableConfigurationService.tabs,\n this.tabContentOutlet.nativeElement,\n this.componentFactoryResolver,\n this.appRef,\n this.injector,\n );\n\n this.loadingIndicator.indicator('modal').promise = this.loadForm()\n .then(() => {\n const initialTabName = this.locals.initialTab;\n const initialTab = this.availableTabs.find((el) => el.id === initialTabName);\n this.switchTo(initialTab || this.availableTabs[0]);\n this.cdRef.detectChanges();\n });\n }\n\n ngOnDestroy():void {\n this.onDataUpdated.complete();\n this.tabPortalHost.dispose();\n }\n\n public get availableTabs():TabInterface[] {\n return this.tabPortalHost.availableTabs;\n }\n\n public get currentTab():ActiveTabInterface|null {\n return this.tabPortalHost.currentTab;\n }\n\n public switchTo(tab:TabInterface):void {\n this.tabPortalHost.switchTo(tab);\n }\n\n public saveChanges():void {\n this.tabPortalHost.activeComponents.forEach((component:TabComponent) => {\n component.onSave();\n });\n\n this.onDataUpdated.emit();\n this.service.close();\n }\n\n /**\n * Called when the user attempts to close the modal window.\n * The service will close this modal if this method returns true\n * @returns {boolean}\n */\n public onClose():boolean {\n this.afterFocusOn.focus();\n return true;\n }\n\n protected get afterFocusOn():HTMLElement {\n return this.$element;\n }\n\n protected loadForm() {\n const query = this.querySpace.query.value!;\n return this\n .apiV3Service\n .queries\n .form\n .load(query)\n .toPromise()\n .then(([form, _]) => {\n this.wpStatesInitialization.updateStatesFromForm(query, form);\n\n return form;\n })\n .catch((error) => this.notificationService.handleRawError(error));\n }\n}\n","
\n
\n

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

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

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

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

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

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

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

    \n

    \n
    \n
    \n \n \n \n \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Observable, zip } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { RelationsStateValue, WorkPackageRelationsService } from './wp-relations.service';\nimport { RelatedWorkPackagesGroup } from './wp-relations.interfaces';\n\n@Component({\n selector: 'wp-relations',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './wp-relations.template.html',\n})\nexport class WorkPackageRelationsComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n public relationGroups:RelatedWorkPackagesGroup = {};\n\n public relationGroupKeys:string[] = [];\n\n public relationsPresent = false;\n\n public canAddRelation:boolean;\n\n // By default, group by relation type\n public groupByWorkPackageType = false;\n\n public text = {\n relations_header: this.I18n.t('js.work_packages.tabs.relations'),\n };\n\n public currentRelations:WorkPackageResource[] = [];\n\n constructor(private I18n:I18nService,\n private wpRelations:WorkPackageRelationsService,\n private cdRef:ChangeDetectorRef,\n private apiV3Service:ApiV3Service) {\n super();\n }\n\n ngOnInit() {\n this.canAddRelation = !!this.workPackage.addRelation;\n\n this.wpRelations\n .state(this.workPackage.id!)\n .values$()\n .pipe(\n takeUntil(componentDestroyed(this)),\n )\n .subscribe((relations:RelationsStateValue) => {\n this.loadedRelations(relations);\n });\n\n this.wpRelations.require(this.workPackage.id!);\n\n // Listen for changes to this WP.\n this\n .apiV3Service\n .work_packages\n .id(this.workPackage)\n .requireAndStream()\n .pipe(\n takeUntil(componentDestroyed(this)),\n )\n .subscribe((wp:WorkPackageResource) => {\n this.workPackage = wp;\n });\n }\n\n private getRelatedWorkPackages(workPackageIds:string[]):Observable {\n const observablesToGetZipped:Observable[] = workPackageIds.map((wpId) => this\n .apiV3Service\n .work_packages\n .id(wpId)\n .get());\n\n return zip(...observablesToGetZipped);\n }\n\n protected getRelatedWorkPackageId(relation:RelationResource):string {\n const involved = relation.ids;\n return (relation.to.href === this.workPackage.href) ? involved.from : involved.to;\n }\n\n public toggleGroupBy() {\n this.groupByWorkPackageType = !this.groupByWorkPackageType;\n this.buildRelationGroups();\n }\n\n protected buildRelationGroups() {\n if (_.isNil(this.currentRelations)) {\n return;\n }\n\n this.relationGroups = _.groupBy(this.currentRelations,\n (wp:WorkPackageResource) => {\n if (this.groupByWorkPackageType) {\n return wp.type.name;\n }\n const normalizedType = (wp.relatedBy as RelationResource).normalizedType(this.workPackage);\n return this.I18n.t(`js.relation_labels.${normalizedType}`);\n });\n this.relationGroupKeys = _.keys(this.relationGroups);\n this.relationsPresent = _.size(this.relationGroups) > 0;\n this.cdRef.detectChanges();\n }\n\n protected loadedRelations(stateValues:RelationsStateValue):void {\n const relatedWpIds:string[] = [];\n const relations:{ [wpId:string]:any } = [];\n\n if (_.size(stateValues) === 0) {\n this.currentRelations = [];\n return this.buildRelationGroups();\n }\n\n _.each(stateValues, (relation:RelationResource) => {\n const relatedWpId = this.getRelatedWorkPackageId(relation);\n relatedWpIds.push(relatedWpId);\n relations[relatedWpId] = relation;\n });\n\n this.getRelatedWorkPackages(relatedWpIds)\n .pipe(\n take(1),\n )\n .subscribe((relatedWorkPackages:WorkPackageResource[]) => {\n this.currentRelations = relatedWorkPackages.map((wp:WorkPackageResource) => {\n wp.relatedBy = relations[wp.id!];\n return wp;\n });\n\n this.buildRelationGroups();\n });\n }\n}\n","
    \n
    \n \n
    \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Transition } from '@uirouter/core';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Component({\n templateUrl: './relations-tab.html',\n selector: 'wp-relations-tab',\n})\nexport class WorkPackageRelationsTabComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public workPackageId?:string;\n\n public workPackage:WorkPackageResource;\n\n public constructor(readonly I18n:I18nService,\n readonly $transition:Transition,\n readonly apiV3Service:ApiV3Service) {\n super();\n }\n\n ngOnInit() {\n const wpId = this.workPackageId || this.$transition.params('to').workPackageId;\n this\n .apiV3Service\n .work_packages\n .id(wpId)\n .requireAndStream()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp) => {\n this.workPackageId = wp.id!;\n this.workPackage = wp;\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectorRef,\n Directive,\n OnInit,\n} from '@angular/core';\nimport { UIRouterGlobals } from '@uirouter/core';\nimport { Observable } from 'rxjs';\nimport { map, distinctUntilChanged } from 'rxjs/operators';\nimport { take } from 'rxjs/internal/operators/take';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ActivityEntryInfo } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-entry-info';\nimport { WorkPackagesActivityService } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/wp-activity.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WpSingleViewService } from 'core-app/features/work-packages/routing/wp-view-base/state/wp-single-view.service';\nimport { BrowserDetector } from 'core-app/core/browser/browser-detector.service';\nimport { DeviceService } from 'core-app/core/browser/device.service';\n\n@Directive()\nexport class ActivityPanelBaseController extends UntilDestroyedMixin implements OnInit {\n public workPackage:WorkPackageResource;\n\n public workPackageId:string;\n\n // All activities retrieved for the work package\n public unfilteredActivities:HalResource[] = [];\n\n // Visible activities\n public visibleActivities:ActivityEntryInfo[] = [];\n\n public reverse:boolean;\n\n public showToggler:boolean;\n\n public onlyComments = false;\n\n public togglerText:string;\n\n public text = {\n commentsOnly: this.I18n.t('js.label_activity_show_only_comments'),\n showAll: this.I18n.t('js.label_activity_show_all'),\n };\n\n private additionalScrollMargin = 200;\n\n private initialized = false;\n\n private comingFromNotifications = false;\n\n constructor(\n readonly apiV3Service:ApiV3Service,\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n readonly uiRouterGlobals:UIRouterGlobals,\n readonly wpActivity:WorkPackagesActivityService,\n readonly storeService:WpSingleViewService,\n readonly browserDetector:BrowserDetector,\n private wpSingleViewService:WpSingleViewService,\n readonly deviceService:DeviceService,\n ) {\n super();\n\n this.reverse = wpActivity.isReversed;\n this.togglerText = this.text.commentsOnly;\n\n const lastTransitionName = uiRouterGlobals.successfulTransitions.peekTail().from().name as string;\n const comingFromNotifications = /^notifications/.test(lastTransitionName);\n const firstRouteOnMobile = lastTransitionName === '' && this.browserDetector.isMobile;\n\n if (comingFromNotifications || firstRouteOnMobile) {\n this.comingFromNotifications = true;\n }\n }\n\n ngOnInit():void {\n this.initialized = false;\n this\n .apiV3Service\n .work_packages\n .id(this.workPackageId)\n .requireAndStream()\n .pipe(this.untilDestroyed())\n .subscribe((wp) => {\n this.workPackage = wp;\n this.reloadActivities();\n });\n\n this\n .wpSingleViewService\n .selectNotificationsCount$\n .pipe(\n this.untilDestroyed(),\n distinctUntilChanged(),\n )\n .subscribe(() => {\n this.reloadActivities();\n });\n }\n\n private scrollIfNotificationPresent() {\n this\n .storeService\n .hasNotifications$\n .pipe(take(1))\n .subscribe((hasNotification) => {\n if (hasNotification) {\n this.scrollToUnreadNotification();\n }\n });\n }\n\n private reloadActivities() {\n void this.wpActivity.require(this.workPackage, true).then((activities:HalResource[]) => {\n this.updateActivities(activities);\n this.cdRef.detectChanges();\n\n if (!this.initialized) {\n this.initialized = true;\n this.scrollIfNotificationPresent();\n }\n });\n }\n\n protected updateActivities(activities:HalResource[]):void {\n this.unfilteredActivities = activities;\n\n const visible = this.getVisibleActivities();\n this.visibleActivities = visible.map((el:HalResource, i:number) => this.info(el, i));\n this.showToggler = this.shouldShowToggler();\n }\n\n protected shouldShowToggler():boolean {\n const countAll = this.unfilteredActivities.length;\n const countWithComments = this.getActivitiesWithComments().length;\n\n return countAll > 1\n && countWithComments > 0\n && countWithComments < this.unfilteredActivities.length;\n }\n\n protected getVisibleActivities():HalResource[] {\n if (!this.onlyComments) {\n return this.unfilteredActivities;\n }\n return this.getActivitiesWithComments();\n }\n\n protected getActivitiesWithComments():HalResource[] {\n return this.unfilteredActivities\n .filter((activity:HalResource) => !!_.get(activity, 'comment.html'));\n }\n\n protected hasUnreadNotification(activityHref:string):Observable {\n return this\n .storeService\n .selectNotifications$\n .pipe(\n map((notifications) => (\n !!notifications.find((notification) => notification._links.activity?.href === activityHref)\n )),\n );\n }\n\n protected scrollToUnreadNotification():void {\n const unreadNotifications = document.querySelectorAll(\"[data-notification-selector='notification-activity']\");\n // scroll to the unread notification only if there is no deep link\n if (window.location.href.indexOf('activity#') > -1 || unreadNotifications.length === 0) {\n return;\n }\n\n const notificationElement = unreadNotifications[this.reverse ? unreadNotifications.length - 1 : 0] as HTMLElement;\n const scrollContainer = document.querySelectorAll(\"[data-notification-selector='notification-scroll-container']\")[0];\n\n const scrollOffset = notificationElement.offsetTop - (scrollContainer as HTMLElement).offsetTop - this.additionalScrollMargin;\n scrollContainer.scrollTop = scrollOffset;\n\n // Make sure the scrollContainer is visible on mobile\n if (this.comingFromNotifications && this.deviceService.isMobile) {\n scrollContainer.scrollIntoView(true);\n }\n }\n\n public toggleComments():void {\n this.onlyComments = !this.onlyComments;\n this.updateActivities(this.unfilteredActivities);\n\n if (this.onlyComments) {\n this.togglerText = this.text.showAll;\n } else {\n this.togglerText = this.text.commentsOnly;\n }\n }\n\n public info(activity:HalResource, index:number):ActivityEntryInfo {\n return this.wpActivity.info(this.unfilteredActivities, activity, index);\n }\n}\n","import { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport {\n ElementRef, Injector, OnInit, Directive,\n} from '@angular/core';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { Subject } from 'rxjs';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\n@Directive()\nexport abstract class WorkPackageCommentFieldHandler extends EditFieldHandler implements OnInit {\n public fieldName = 'comment';\n\n public handler = this;\n\n public active = false;\n\n public inEditMode = false;\n\n public inFlight = false;\n\n public change:WorkPackageChangeset;\n\n // Destroy events\n public onDestroy = new Subject();\n\n constructor(protected elementRef:ElementRef,\n protected injector:Injector) {\n super();\n }\n\n public ngOnInit() {\n this.change = new WorkPackageChangeset(this.workPackage);\n }\n\n /**\n * Handle saving the comment\n */\n public abstract handleUserSubmit():Promise;\n\n public abstract get workPackage():WorkPackageResource;\n\n public reset(withText = '') {\n if (withText.length > 0) {\n withText += '\\n';\n }\n\n this.change.setValue('comment', { raw: withText });\n }\n\n public get schema():IFieldSchema {\n return {\n name: I18n.t('js.label_comment'),\n writable: true,\n required: false,\n type: '_comment',\n hasDefault: false,\n };\n }\n\n public get rawComment() {\n return _.get(this.commentValue, 'raw', '');\n }\n\n public get commentValue() {\n return this.change.value<{ raw:string }>('comment');\n }\n\n public handleUserCancel() {\n this.deactivate(true);\n }\n\n public activate(withText?:string) {\n this.active = true;\n this.reset(withText);\n }\n\n deactivate(focus:boolean):void {\n this.active = false;\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n\n focus():void {\n const trigger = this.elementRef.nativeElement.querySelector('.inplace-editing--trigger-container');\n trigger && trigger.focus();\n }\n\n onFocusOut():void {\n }\n\n handleUserKeydown(event:JQuery.TriggeredEvent, onlyCancel?:boolean):void {\n }\n\n isChanged():boolean {\n return false;\n }\n\n stopPropagation(evt:JQuery.TriggeredEvent):boolean {\n return false;\n }\n}\n","
    \n
    \n\n \n\n \n
    \n \n \n \n \n \n \n\n \n \n
    \n
    \n
    \n\n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n Injector,\n Input,\n OnDestroy,\n OnInit,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WorkPackageCommentFieldHandler } from 'core-app/features/work-packages/components/work-package-comment/work-package-comment-field-handler';\nimport { CommentService } from 'core-app/features/work-packages/components/wp-activity/comment-service';\nimport { WorkPackagesActivityService } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/wp-activity.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ErrorResource } from 'core-app/features/hal/resources/error-resource';\nimport { HalError } from 'core-app/features/hal/services/hal-error';\nimport {\n filter,\n take,\n} from 'rxjs/operators';\n\n@Component({\n selector: 'work-package-comment',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './work-package-comment.component.html',\n})\nexport class WorkPackageCommentComponent extends WorkPackageCommentFieldHandler implements OnInit, OnDestroy {\n @Input() public workPackage:WorkPackageResource;\n\n @ContentChild(TemplateRef) template:TemplateRef;\n\n @ViewChild('commentContainer') public commentContainer:ElementRef;\n\n public text = {\n editTitle: this.I18n.t('js.label_add_comment_title'),\n addComment: this.I18n.t('js.label_add_comment'),\n cancelTitle: this.I18n.t('js.label_cancel_comment'),\n placeholder: this.I18n.t('js.label_add_comment_title'),\n };\n\n public fieldLabel:string = this.text.editTitle;\n\n public inFlight = false;\n\n public canAddComment:boolean;\n\n public showAbove:boolean;\n\n public htmlId = 'wp-comment-field';\n\n constructor(protected elementRef:ElementRef,\n protected injector:Injector,\n protected commentService:CommentService,\n protected wpLinkedActivities:WorkPackagesActivityService,\n protected configurationService:ConfigurationService,\n protected loadingIndicator:LoadingIndicatorService,\n protected apiV3Service:ApiV3Service,\n protected workPackageNotificationService:WorkPackageNotificationService,\n protected toastService:ToastService,\n protected cdRef:ChangeDetectorRef,\n protected I18n:I18nService) {\n super(elementRef, injector);\n }\n\n public ngOnInit():void {\n super.ngOnInit();\n\n this.canAddComment = !!this.workPackage.addComment;\n this.showAbove = this.configurationService.commentsSortedInDescendingOrder();\n\n this.commentService.draft$\n .pipe(\n this.untilDestroyed(),\n take(1),\n filter((val) => !!val),\n )\n .subscribe((draft:string) => {\n this.activate(draft);\n });\n\n this.commentService.quoteEvents$\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((quote:string) => {\n this.activate(quote);\n this.commentContainer.nativeElement.scrollIntoView();\n });\n }\n\n public ngOnDestroy():void {\n super.ngOnDestroy();\n this.commentService.draft$.next(this.active ? this.rawComment : null);\n }\n\n // Open the field when its closed and relay drag & drop events to it.\n public startDragOverActivation(event:JQuery.TriggeredEvent):boolean {\n if (this.active) {\n return true;\n }\n\n this.activate();\n\n event.preventDefault();\n return false;\n }\n\n public activate(withText?:string):void {\n super.activate(withText);\n\n if (!this.showAbove) {\n this.scrollToBottom();\n }\n\n this.cdRef.detectChanges();\n }\n\n public deactivate(focus:boolean):void {\n focus && this.focus();\n this.active = false;\n this.cdRef.detectChanges();\n }\n\n public async handleUserSubmit():Promise {\n if (this.inFlight || !this.rawComment) {\n return Promise.resolve();\n }\n\n this.inFlight = true;\n await this.onSubmit();\n const indicator = this.loadingIndicator.wpDetails;\n indicator.promise = this.commentService.createComment(this.workPackage, this.commentValue)\n .then(() => {\n this.active = false;\n this.toastService.addSuccess(this.I18n.t('js.work_packages.comment_added'));\n\n void this.wpLinkedActivities.require(this.workPackage, true);\n void this\n .apiV3Service\n .work_packages\n .id(this.workPackage.id!)\n .refresh();\n\n this.inFlight = false;\n this.deactivate(true);\n })\n .catch((error:any) => {\n this.inFlight = false;\n if (error instanceof HalError) {\n this.workPackageNotificationService.showError(error.resource, this.workPackage);\n } else {\n this.toastService.addError(this.I18n.t('js.work_packages.comment_send_failed'));\n }\n });\n\n return indicator.promise;\n }\n\n scrollToBottom():void {\n const scrollableContainer = jQuery(this.elementRef.nativeElement).scrollParent()[0];\n if (scrollableContainer) {\n setTimeout(() => {\n scrollableContainer.scrollTop = scrollableContainer.scrollHeight;\n }, 400);\n }\n }\n\n setErrors(newErrors:string[]):void {\n // interface\n }\n}\n","/**\n * Allows to dynamically render an HTML string into any HTML node, dynamically\n * bootstrapping all its Angular components and directives.\n *\n * ```\n * \">\n * \n * ```\n * @module\n * @public\n */\nimport {\n ApplicationRef, Component, ElementRef, Input,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { DynamicBootstrapper } from 'core-app/core/setup/globals/dynamic-bootstrapper';\n\n@Component({\n selector: 'op-dynamic-bootstrap',\n templateUrl: './dynamic-bootstrap.component.html',\n})\nexport class DynamicBootstrapComponent {\n /*\n * HTML string to be rendered.\n */\n @Input()\n set HTML(templateString:string) {\n this.innerHtml = this.domSanitizer.bypassSecurityTrustHtml(templateString);\n this.dynamicBootstrapper.bootstrapOptionalEmbeddable(this.appRef, this.elementRef.nativeElement);\n }\n\n innerHtml:SafeHtml;\n\n dynamicBootstrapper = DynamicBootstrapper;\n\n constructor(\n readonly domSanitizer:DomSanitizer,\n readonly elementRef:ElementRef,\n readonly appRef:ApplicationRef,\n ) { }\n}\n","","import { Component, Input, OnInit } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\n@Component({\n selector: 'activity-link',\n template: `\n \n \n `,\n})\nexport class ActivityLinkComponent implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public activityNo:number;\n\n public activityHtmlId:string;\n\n public activityLabel:string;\n\n ngOnInit() {\n this.activityHtmlId = `activity-${this.activityNo}`;\n this.activityLabel = `#${this.activityNo}`;\n }\n}\n\nfunction activityLink() {\n return {\n restrict: 'E',\n template: `\n `,\n scope: {\n },\n link(scope:any) {\n scope.workPackageId = scope.workPackage.id!;\n scope.activityHtmlId = `activity-${scope.activityNo}`;\n },\n };\n}\n","\n
    \n \n\n
    \n \n \n {{ isInitial ? text.label_created_on : text.label_updated_on }}\n \n \n
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n
    \n \n \n
    \n
    \n
    \n \n
    \n
    \n \n
      \n
    • \n \n
    • \n
    \n
    \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport {\n ApplicationRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Injector,\n Input, NgZone,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WorkPackageCommentFieldHandler } from 'core-app/features/work-packages/components/work-package-comment/work-package-comment-field-handler';\nimport { WorkPackagesActivityService } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/wp-activity.service';\nimport { CommentService } from 'core-app/features/work-packages/components/wp-activity/comment-service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { DeviceService } from 'core-app/core/browser/device.service';\n\n@Component({\n selector: 'user-activity',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './user-activity.component.html',\n styleUrls: ['./user-activity.component.sass'],\n})\nexport class UserActivityComponent extends WorkPackageCommentFieldHandler implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public activity:HalResource;\n\n @Input() public activityNo:number;\n\n @Input() public isInitial:boolean;\n\n @Input() public hasUnreadNotification:boolean;\n\n private additionalScrollMargin = 200;\n\n public userCanEdit = false;\n\n public userCanQuote = false;\n\n public userId:string | number;\n\n public user:UserResource;\n\n public userName:string;\n\n public userAvatar:string;\n\n public details:any[] = [];\n\n public isComment:boolean;\n\n public isBcfComment:boolean;\n\n public postedComment:SafeHtml;\n\n public focused = false;\n\n public text = {\n label_created_on: this.I18n.t('js.label_created_on'),\n label_updated_on: this.I18n.t('js.label_updated_on'),\n quote_comment: this.I18n.t('js.label_quote_comment'),\n edit_comment: this.I18n.t('js.label_edit_comment'),\n };\n\n private $element:JQuery;\n\n constructor(readonly elementRef:ElementRef,\n readonly injector:Injector,\n readonly sanitization:DomSanitizer,\n readonly PathHelper:PathHelperService,\n readonly wpLinkedActivities:WorkPackagesActivityService,\n readonly commentService:CommentService,\n readonly ConfigurationService:ConfigurationService,\n readonly apiV3Service:ApiV3Service,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n readonly ngZone:NgZone,\n readonly deviceService:DeviceService,\n protected appRef:ApplicationRef) {\n super(elementRef, injector);\n }\n\n public ngOnInit() {\n super.ngOnInit();\n\n this.htmlId = `user_activity_edit_field_${this.activityNo}`;\n this.updateCommentText();\n this.isComment = this.activity._type === 'Activity::Comment';\n this.isBcfComment = this.activity._type === 'Activity::BcfComment';\n\n this.$element = jQuery(this.elementRef.nativeElement);\n this.reset();\n this.userCanEdit = !!this.activity.update;\n this.userCanQuote = !!this.workPackage.addComment;\n\n this.$element.bind('focusin', this.focus.bind(this));\n this.$element.bind('focusout', this.blur.bind(this));\n\n _.each(this.activity.details, (detail:any) => {\n this.details.push(detail.html);\n });\n\n this\n .apiV3Service\n .users\n .id(idFromLink(this.activity.user.href))\n .get()\n .subscribe((user:UserResource) => {\n this.user = user;\n this.userId = user.id!;\n this.userName = user.name;\n this.userAvatar = user.avatar;\n this.cdRef.detectChanges();\n });\n\n if (window.location.hash === `#activity-${this.activityNo}`) {\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n if (this.deviceService.isMobile) {\n (this.elementRef.nativeElement as HTMLElement).scrollIntoView(true);\n return;\n }\n const activityElement = document.querySelectorAll(`[data-qa-activity-number='${this.activityNo}']`)[0] as HTMLElement;\n const scrollContainer = document.querySelectorAll(\"[data-notification-selector='notification-scroll-container']\")[0];\n const scrollOffset = activityElement.offsetTop - (scrollContainer as HTMLElement).offsetTop - this.additionalScrollMargin;\n scrollContainer.scrollTop = scrollOffset;\n });\n });\n }\n }\n\n public shouldHideIcons():boolean {\n return !((this.isComment || this.isBcfComment) && this.focussing());\n }\n\n public activate() {\n super.activate(this.activity.comment.raw);\n this.cdRef.detectChanges();\n }\n\n public handleUserSubmit() {\n if (this.inFlight || !this.rawComment) {\n return Promise.resolve();\n }\n return this.updateComment();\n }\n\n public quoteComment() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n this.commentService.quoteEvents$.next(this.quotedText(this.activity.comment.raw));\n }\n\n public get bcfSnapshotUrl() {\n if (_.get(this.activity, 'bcfViewpoints[0]')) {\n return `${_.get(this.activity, 'bcfViewpoints[0]').href}/snapshot`;\n }\n return null;\n }\n\n public async updateComment() {\n this.inFlight = true;\n\n await this.onSubmit();\n return this.commentService.updateComment(this.activity, this.rawComment || '')\n .then((newActivity:HalResource) => {\n this.activity = newActivity;\n this.updateCommentText();\n this.wpLinkedActivities.require(this.workPackage, true);\n this\n .apiV3Service\n .work_packages\n .cache\n .updateWorkPackage(this.workPackage);\n })\n .finally(() => {\n this.deactivate(true); this.inFlight = false;\n });\n }\n\n public focusEditIcon() {\n // Find the according edit icon and focus it\n jQuery(`.edit-activity--${this.activityNo} a`).focus();\n }\n\n public focus() {\n this.focused = true;\n this.cdRef.detectChanges();\n }\n\n public blur() {\n this.focused = false;\n this.cdRef.detectChanges();\n }\n\n public focussing() {\n return this.focused;\n }\n\n setErrors(newErrors:string[]):void {\n // interface\n }\n\n public quotedText(rawComment:string) {\n const quoted = rawComment.split('\\n')\n .map((line:string) => `\\n> ${line}`)\n .join('');\n return `${this.userName} wrote:\\n${quoted}`;\n }\n\n deactivate(focus:boolean):void {\n super.deactivate(focus);\n\n if (focus) {\n this.focusEditIcon();\n }\n }\n\n private updateCommentText() {\n this.postedComment = this.activity.comment.html;\n }\n}\n","\n
    \n \n \n
    \n\n \n\n \n\n \n \n \n  \n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Component({\n selector: 'revision-activity',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './revision-activity.component.html',\n})\nexport class RevisionActivityComponent implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public activity:any;\n\n @Input() public activityNo:number;\n\n @Input() public hasUnreadNotification:boolean;\n\n public userId:string | number;\n\n public userName:string;\n\n public userActive:boolean;\n\n public userPath:string | null;\n\n public userLabel:string;\n\n public userAvatar:string;\n\n public project:ProjectResource;\n\n public revision:string;\n\n public message:string;\n\n public revisionLink:string;\n\n constructor(readonly I18n:I18nService,\n readonly timezoneService:TimezoneService,\n readonly cdRef:ChangeDetectorRef,\n readonly apiV3Service:ApiV3Service) {\n }\n\n ngOnInit() {\n this.loadAuthor();\n\n this.project = this.workPackage.project;\n this.revision = this.activity.identifier;\n this.message = this.activity.message.html;\n\n const revisionPath = this.activity.showRevision.$link.href;\n const formattedRevision = this.activity.formattedIdentifier;\n\n const link = document.createElement('a');\n link.href = revisionPath;\n link.title = this.revision;\n link.textContent = this.I18n.t(\n 'js.label_committed_link',\n { revision_identifier: formattedRevision },\n );\n\n this.revisionLink = this.I18n.t('js.label_committed_at',\n {\n committed_revision_link: link.outerHTML,\n date: this.timezoneService.formattedDatetime(this.activity.createdAt),\n });\n }\n\n private loadAuthor() {\n if (this.activity.author === undefined) {\n this.userName = this.activity.authorName;\n } else {\n this\n .apiV3Service\n .users\n .id(idFromLink(this.activity.author.href))\n .get()\n .subscribe((user:UserResource) => {\n this.userId = user.id!;\n this.userName = user.name;\n this.userActive = user.isActive;\n this.userAvatar = user.avatar;\n this.userPath = user.showUser.href;\n this.userLabel = this.I18n.t('js.label_author', { user: this.userName });\n this.cdRef.detectChanges();\n });\n }\n }\n}\n","\n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, Input, OnInit } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Component({\n selector: 'activity-entry',\n templateUrl: './activity-entry.component.html',\n})\nexport class ActivityEntryComponent implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public activity:any;\n\n @Input() public activityNo:number;\n\n @Input() public isInitial:boolean;\n\n @Input() public hasUnreadNotification:boolean;\n\n public projectId:string;\n\n public activityType:string;\n\n constructor(\n readonly PathHelper:PathHelperService,\n readonly I18n:I18nService,\n ) { }\n\n ngOnInit() {\n this.projectId = idFromLink(this.workPackage.project.href);\n\n this.activityType = this.activity._type;\n }\n}\n","\n \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ActivityPanelBaseController } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-base.controller';\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ActivityEntryInfo } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-entry-info';\nimport { trackByProperty } from 'core-app/shared/helpers/angular/tracking-functions';\n\n@Component({\n selector: 'newest-activity-on-overview',\n templateUrl: './activity-on-overview.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NewestActivityOnOverviewComponent extends ActivityPanelBaseController {\n @Input('workPackage') public workPackage:WorkPackageResource;\n\n public latestActivityInfo:ActivityEntryInfo[] = [];\n\n public trackByIdentifier = trackByProperty('identifier');\n\n ngOnInit() {\n this.workPackageId = this.workPackage.id!;\n super.ngOnInit();\n }\n\n protected shouldShowToggler() {\n return false;\n }\n\n protected updateActivities(activities:any) {\n super.updateActivities(activities);\n this.latestActivityInfo = this.latestActivities();\n }\n\n private latestActivities(visible = 3) {\n if (this.reverse) {\n // In reverse, we already get reversed entries from API.\n // So simply take the first three\n const segment = this.unfilteredActivities.slice(0, visible);\n return segment.map((el:HalResource, i:number) => this.info(el, i));\n }\n // In ascending sort, take the last three items\n const segment = this.unfilteredActivities.slice(-visible);\n const startIndex = this.unfilteredActivities.length - segment.length;\n return segment.map((el:HalResource, i:number) => this.info(el, startIndex + i));\n }\n}\n","\n\n
    \n
    \n
    \n

    \n
    \n
    \n\n \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component } from '@angular/core';\nimport { StateService } from '@uirouter/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Component({\n templateUrl: './overview-tab.html',\n selector: 'wp-overview-tab',\n})\nexport class WorkPackageOverviewTabComponent extends UntilDestroyedMixin {\n public workPackageId:string;\n\n public workPackage:WorkPackageResource;\n\n public tabName = this.I18n.t('js.label_latest_activity');\n\n public constructor(readonly I18n:I18nService,\n readonly $state:StateService,\n readonly apiV3Service:ApiV3Service) {\n super();\n\n this.workPackageId = this.$state.params.workPackageId;\n\n this\n .apiV3Service\n .work_packages\n .id(this.workPackageId)\n .requireAndStream()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp) => this.workPackage = wp);\n }\n}\n","\n \n
    \n
    \n \n \n \n \n \n\n \n
    \n
    \n \n
    \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { trackByProperty } from 'core-app/shared/helpers/angular/tracking-functions';\nimport { ActivityPanelBaseController } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-base.controller';\n\n@Component({\n templateUrl: './activity-tab.html',\n selector: 'wp-activity-tab',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageActivityTabComponent extends ActivityPanelBaseController {\n public workPackage:WorkPackageResource;\n\n public tabName = this.I18n.t('js.work_packages.tabs.activity');\n\n public trackByIdentifier = trackByProperty('identifier');\n\n ngOnInit() {\n const { workPackageId } = this.uiRouterGlobals.params as unknown as { workPackageId:string };\n this.workPackageId = workPackageId;\n super.ngOnInit();\n }\n}\n","\n \n \n \n \n \n\n \n \n\n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n OnInit,\n} from '@angular/core';\nimport {\n combineLatest,\n Observable,\n} from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { StoragesResourceService } from 'core-app/core/state/storages/storages.service';\nimport { IStorage } from 'core-app/core/state/storages/storage.model';\nimport { ProjectsResourceService } from 'core-app/core/state/projects/projects.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\n@Component({\n selector: 'op-files-tab',\n templateUrl: './op-files-tab.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageFilesTabComponent implements OnInit {\n workPackage:WorkPackageResource;\n\n text = {\n attachments: {\n label: this.i18n.t('js.label_attachments'),\n },\n };\n\n showAttachmentHeader$:Observable;\n\n storages$:Observable;\n\n allowManageFileLinks$:Observable;\n\n constructor(\n private readonly i18n:I18nService,\n private readonly hook:HookService,\n private readonly currentUserService:CurrentUserService,\n private readonly projectsResourceService:ProjectsResourceService,\n private readonly storagesResourceService:StoragesResourceService,\n ) { }\n\n ngOnInit():void {\n const project = this.workPackage.project as HalResource;\n if (project.id === null) {\n return;\n }\n\n const canViewFileLinks = this.currentUserService.hasCapabilities$('file_links/view', project.id);\n\n this.storages$ = this\n .storagesResourceService\n .collection(project.href as string);\n\n this.allowManageFileLinks$ = this\n .currentUserService\n .hasCapabilities$('file_links/manage', (this.workPackage.project as unknown&{ id:string }).id);\n\n this.showAttachmentHeader$ = combineLatest(\n [\n this.storages$,\n canViewFileLinks,\n ],\n ).pipe(\n map(([storages, viewPermission]) => storages.length > 0 && viewPermission),\n );\n }\n}\n","import { Injector } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { WorkPackageWatchersService } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watchers.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { map } from 'rxjs/operators';\n\nexport function workPackageWatchersCount(\n workPackage:WorkPackageResource,\n injector:Injector,\n):Observable {\n const watcherService = injector.get(WorkPackageWatchersService);\n return watcherService\n .requireAndStream(workPackage)\n .pipe(\n map((watchers:HalResource[]) => watchers.length),\n );\n}\n","import { Injector } from '@angular/core';\nimport { combineLatest, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\n\nexport function workPackageRelationsCount(\n workPackage:WorkPackageResource,\n injector:Injector,\n):Observable {\n const wpRelations = injector.get(WorkPackageRelationsService);\n const apiV3Service = injector.get(ApiV3Service);\n const wpId = workPackage.id!.toString();\n\n wpRelations.require(wpId);\n\n return combineLatest([\n wpRelations\n .state(wpId.toString())\n .values$(),\n apiV3Service\n .work_packages\n .id(wpId)\n .requireAndStream(),\n ])\n .pipe(\n map(([relations, workPackage]) => {\n const relationCount = _.size(relations);\n const childrenCount = _.size(workPackage.children);\n\n return relationCount + childrenCount;\n }),\n );\n}\n","import { Injector } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WpSingleViewService } from 'core-app/features/work-packages/routing/wp-view-base/state/wp-single-view.service';\n\nexport function workPackageNotificationsCount(\n workPackage:WorkPackageResource,\n injector:Injector,\n):Observable {\n const storeService = injector.get(WpSingleViewService);\n return storeService.nonDateAlertNotificationsCount$;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injector } from '@angular/core';\nimport { combineLatest, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { FileLinksResourceService } from 'core-app/core/state/file-links/file-links.service';\nimport { AttachmentsResourceService } from 'core-app/core/state/attachments/attachments.service';\n\nexport function workPackageFilesCount(\n workPackage:WorkPackageResource,\n injector:Injector,\n):Observable {\n const attachmentService = injector.get(AttachmentsResourceService);\n const fileLinkService = injector.get(FileLinksResourceService);\n\n return combineLatest(\n [\n attachmentService.collection(workPackage.$links.attachments.href || ''),\n fileLinkService.collection(workPackage.$links.fileLinks?.href || ''),\n ],\n ).pipe(\n map(([a, f]) => a.length + f.length),\n );\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { from } from 'rxjs';\nimport { StateService } from '@uirouter/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WpTabDefinition } from 'core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/tab';\nimport {\n WorkPackageRelationsTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/relations-tab/relations-tab.component';\nimport {\n WorkPackageOverviewTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/overview-tab/overview-tab.component';\nimport {\n WorkPackageActivityTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-tab.component';\nimport {\n WorkPackageWatchersTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/watchers-tab.component';\nimport {\n WorkPackageFilesTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/files-tab/op-files-tab.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n workPackageWatchersCount,\n} from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-watchers-count.function';\nimport {\n workPackageRelationsCount,\n} from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-relations-count.function';\nimport {\n workPackageNotificationsCount,\n} from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-notifications-count.function';\nimport {\n workPackageFilesCount,\n} from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-files-count.function';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkPackageTabsService {\n private registeredTabs:WpTabDefinition[];\n\n constructor(\n private $state:StateService,\n private I18n:I18nService,\n private injector:Injector,\n ) {\n this.registeredTabs = this.buildDefaultTabs();\n }\n\n get tabs():WpTabDefinition[] {\n return [...this.registeredTabs];\n }\n\n register(...tabs:WpTabDefinition[]):void {\n this.registeredTabs = [\n ...this.registeredTabs,\n ...tabs,\n ];\n }\n\n patchTabCondition(id:string, displayable:(workPackage:WorkPackageResource, $state:StateService) => boolean):void {\n const tabDefinition = this.registeredTabs.find((tab) => tab.id === id);\n if (tabDefinition) {\n tabDefinition.displayable = displayable;\n }\n }\n\n getDisplayableTabs(workPackage:WorkPackageResource):WpTabDefinition[] {\n return this\n .tabs\n .filter(\n (tab) => !tab.displayable || tab.displayable(workPackage, this.$state),\n )\n .map(\n (tab) => ({\n ...tab,\n counter: tab.count\n ? (injector:Injector) => tab.count!(workPackage, injector || this.injector) // eslint-disable-line @typescript-eslint/no-non-null-assertion\n : (_:Injector) => from([0]),\n }),\n );\n }\n\n getTab(tabId:string, workPackage:WorkPackageResource):WpTabDefinition|undefined {\n return this.getDisplayableTabs(workPackage).find(({ id }) => id === tabId);\n }\n\n private buildDefaultTabs():WpTabDefinition[] {\n return [\n {\n component: WorkPackageOverviewTabComponent,\n name: this.I18n.t('js.work_packages.tabs.overview'),\n id: 'overview',\n displayable: (_, $state) => $state.includes('**.details.*'),\n },\n {\n id: 'activity',\n component: WorkPackageActivityTabComponent,\n name: I18n.t('js.work_packages.tabs.activity'),\n count: workPackageNotificationsCount,\n showCountAsBubble: true,\n },\n {\n id: 'files',\n component: WorkPackageFilesTabComponent,\n name: I18n.t('js.work_packages.tabs.files'),\n count: workPackageFilesCount,\n },\n {\n id: 'relations',\n component: WorkPackageRelationsTabComponent,\n name: I18n.t('js.work_packages.tabs.relations'),\n count: workPackageRelationsCount,\n },\n {\n id: 'watchers',\n component: WorkPackageWatchersTabComponent,\n name: I18n.t('js.work_packages.tabs.watchers'),\n displayable: (workPackage) => !!workPackage.watchers,\n count: workPackageWatchersCount,\n },\n ];\n }\n}\n","
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'wp-type-status',\n templateUrl: './wp-type-status.html',\n})\nexport class WorkPackageTypeStatusComponent {\n @Input('workPackage') workPackage:WorkPackageResource;\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageWatchersService } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watchers.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Component({\n selector: 'wp-watcher-button',\n templateUrl: './wp-watcher-button.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageWatcherButtonComponent extends UntilDestroyedMixin implements OnInit {\n @Input('workPackage') public workPackage:WorkPackageResource;\n\n @Input('showText') public showText = false;\n\n @Input('disabled') public disabled = false;\n\n public buttonText:string;\n\n public buttonTitle:string;\n\n public buttonClass:string;\n\n public buttonId:string;\n\n public watchIconClass:string;\n\n constructor(readonly I18n:I18nService,\n readonly wpWatchersService:WorkPackageWatchersService,\n readonly apiV3Service:ApiV3Service,\n readonly cdRef:ChangeDetectorRef) {\n super();\n }\n\n ngOnInit() {\n this\n .apiV3Service\n .work_packages\n .id(this.workPackage)\n .requireAndStream()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((wp:WorkPackageResource) => {\n this.workPackage = wp;\n this.setWatchStatus();\n this.cdRef.detectChanges();\n });\n }\n\n public get isWatched() {\n return this.workPackage.hasOwnProperty('unwatch');\n }\n\n public get displayWatchButton() {\n return this.isWatched || this.workPackage.hasOwnProperty('watch');\n }\n\n public toggleWatch() {\n const toggleLink = this.nextStateLink();\n\n toggleLink(toggleLink.$link.payload).then(() => {\n this.wpWatchersService.clear(this.workPackage.id);\n this\n .apiV3Service\n .work_packages\n .id(this.workPackage)\n .refresh();\n });\n }\n\n public nextStateLink() {\n const linkName = this.isWatched ? 'unwatch' : 'watch';\n return this.workPackage[linkName];\n }\n\n private setWatchStatus() {\n if (this.isWatched) {\n this.buttonTitle = this.I18n.t('js.label_unwatch_work_package');\n this.buttonText = this.I18n.t('js.label_unwatch');\n this.buttonClass = '-active';\n this.buttonId = 'unwatch-button';\n this.watchIconClass = 'icon-watched';\n } else {\n this.buttonTitle = this.I18n.t('js.label_watch_work_package');\n this.buttonText = this.I18n.t('js.label_watch');\n this.buttonClass = '';\n this.buttonId = 'watch-button';\n this.watchIconClass = 'icon-unwatched';\n }\n }\n}\n","import {\n derive,\n input,\n InputState,\n State,\n StatesGroup,\n} from 'reactivestates';\nimport { Subject } from 'rxjs';\nimport { Injectable } from '@angular/core';\nimport { map } from 'rxjs/operators';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport {\n GroupObject,\n WorkPackageCollectionResource,\n} from 'core-app/features/hal/resources/wp-collection-resource';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { WorkPackageDisplayRepresentationValue } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\nimport { QueryFilterInstanceSchemaResource } from 'core-app/features/hal/resources/query-filter-instance-schema-resource';\nimport { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';\nimport { QuerySortByResource } from 'core-app/features/hal/resources/query-sort-by-resource';\nimport { QueryGroupByResource } from 'core-app/features/hal/resources/query-group-by-resource';\n\n@Injectable()\nexport class IsolatedQuerySpace extends StatesGroup {\n name = 'IsolatedQuerySpace';\n\n // The query that results in this table state\n query:InputState = input();\n\n // the query form associated with the table\n queryForm = input();\n\n // the results associated with the table/time-entry-changeset\n results = input();\n\n // all groups returned as results\n groups = input();\n\n // Set of columns in strict order of appearance\n columns = input();\n\n // Current state of collapsed groups (if any)\n collapsedGroups = input<{ [identifier:string]:boolean }>();\n\n // State to be updated when the table is up to date\n tableRendered = input();\n\n // Event to be raised when the timeline is up to date\n timelineRendered = new Subject();\n\n renderedWorkPackages:State = derive(this.tableRendered, ($) => $.pipe(\n map((rows) => rows.filter((row) => !!row.workPackageId)),\n ));\n\n renderedWorkPackageIds:State = derive(this.renderedWorkPackages, ($) => $.pipe(\n map((rows) => rows.map((row) => row.workPackageId!.toString())),\n ));\n\n // Subject used to unregister all listeners of states above.\n stopAllSubscriptions = new Subject();\n\n // Required work packages to be rendered by hierarchy mode + relation columns\n additionalRequiredWorkPackages = input();\n\n // Input state that emits whenever table services have initialized\n initialized = input();\n\n // Available states\n available = {\n // Available columns\n columns: input(),\n\n // Available SortBy Columns\n sortBy: input(),\n\n // Available GroupBy columns\n groupBy: input(),\n\n // Available filter schemas (derived from their schema)\n filters: input(),\n\n // Display of the WP results\n displayRepresentation: input(),\n };\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Directive, ElementRef, Injector } from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { OpTableActionsService } from 'core-app/features/work-packages/components/wp-table/table-actions/table-actions.service';\nimport { WorkPackageViewRelationColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-relation-columns.service';\nimport { WorkPackageViewPaginationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-pagination.service';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { WorkPackageViewSumService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sum.service';\nimport { WorkPackageViewAdditionalElementsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-additional-elements.service';\nimport { WorkPackageViewHighlightingService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-highlighting.service';\nimport { WorkPackageCreateService } from 'core-app/features/work-packages/components/wp-new/wp-create.service';\nimport { WorkPackageStatesInitializationService } from 'core-app/features/work-packages/components/wp-list/wp-states-initialization.service';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { WorkPackageRelationsHierarchyService } from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service';\nimport { WorkPackageFiltersService } from 'core-app/features/work-packages/components/filters/wp-filters/wp-filters.service';\nimport { WorkPackageContextMenuHelperService } from 'core-app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { WpChildrenInlineCreateService } from 'core-app/features/work-packages/components/wp-relations/embedded/children/wp-children-inline-create.service';\nimport { WpRelationInlineCreateService } from 'core-app/features/work-packages/components/wp-relations/embedded/relations/wp-relation-inline-create.service';\nimport { WorkPackagesListChecksumService } from 'core-app/features/work-packages/components/wp-list/wp-list-checksum.service';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { TableDragActionsRegistryService } from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-actions-registry.service';\nimport { WorkPackageViewOrderService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service';\nimport { CausedUpdatesService } from 'core-app/features/boards/board/caused-updates/caused-updates.service';\nimport { WorkPackageCardViewService } from 'core-app/features/work-packages/components/wp-card-view/services/wp-card-view.service';\nimport { WorkPackageViewDisplayRepresentationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\nimport { WorkPackageViewIncludeSubprojectsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-include-subprojects.service';\nimport { WorkPackageViewHierarchyIdentationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy-indentation.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { TimeEntryCreateService } from 'core-app/shared/components/time_entries/create/create.service';\nimport { WorkPackageViewCollapsedGroupsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-collapsed-groups.service';\nimport { WorkPackageService } from 'core-app/features/work-packages/services/work-package.service';\n\n/**\n * Directive to open a work package query 'space', an isolated injector hierarchy\n * that provides access to query-bound data and services, especially around the querySpace services.\n *\n * If you add services that depend on a table state, they should be provided here, not globally\n * in a module.\n */\n@Directive({\n selector: '[wp-isolated-query-space]',\n providers: [\n // Override the hal notification service\n { provide: HalResourceNotificationService, useExisting: WorkPackageNotificationService },\n\n // Open the isolated space first, order is important here\n IsolatedQuerySpace,\n OpTableActionsService,\n\n // Work package table services\n WorkPackagesListChecksumService,\n WorkPackagesListService,\n WorkPackageViewRelationColumnsService,\n WorkPackageViewPaginationService,\n WorkPackageViewGroupByService,\n WorkPackageViewCollapsedGroupsService,\n WorkPackageViewHierarchiesService,\n WorkPackageViewSortByService,\n WorkPackageViewColumnsService,\n WorkPackageViewFiltersService,\n WorkPackageViewTimelineService,\n WorkPackageViewSelectionService,\n WorkPackageViewSumService,\n WorkPackageViewAdditionalElementsService,\n WorkPackageViewFocusService,\n WorkPackageViewHighlightingService,\n WorkPackageViewDisplayRepresentationService,\n WorkPackageViewIncludeSubprojectsService,\n WorkPackageViewOrderService,\n WorkPackageViewHierarchyIdentationService,\n CausedUpdatesService,\n\n WorkPackageService,\n WorkPackageRelationsHierarchyService,\n WorkPackageFiltersService,\n WorkPackageContextMenuHelperService,\n\n // Provide a separate service for creation events of WP Inline create\n // This can be hierarchically injected to provide isolated events on an embedded table\n WorkPackageInlineCreateService,\n WpChildrenInlineCreateService,\n WpRelationInlineCreateService,\n\n WorkPackageCardViewService,\n\n HalResourceEditingService,\n TimeEntryCreateService,\n WorkPackageCreateService,\n\n WorkPackageStatesInitializationService,\n\n // Table Drag & Drop actions\n TableDragActionsRegistryService,\n ],\n})\nexport class WorkPackageIsolatedQuerySpaceDirective {\n constructor(private elementRef:ElementRef,\n public querySpace:IsolatedQuerySpace,\n private injector:Injector) {\n debugLog('Opening isolated query space %O in %O', injector, elementRef.nativeElement);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport class WorkPackageCellLabels {\n constructor(public readonly center:HTMLDivElement|null,\n public readonly left:HTMLDivElement,\n public readonly leftHover:HTMLDivElement|null,\n public readonly right:HTMLDivElement,\n public readonly rightHover:HTMLDivElement|null,\n public readonly farRight:HTMLDivElement,\n public readonly withAlternativeLabels?:boolean) {\n }\n}\n","import * as moment from 'moment';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { DisplayFieldRenderer } from 'core-app/shared/components/fields/display/display-field-renderer';\nimport { Injector } from '@angular/core';\nimport { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\nimport { HierarchyRenderPass } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/hierarchy/hierarchy-render-pass';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport { WorkPackageCellLabels } from './wp-timeline-cell-labels';\nimport {\n calculatePositionValueForDayCount,\n calculatePositionValueForDayCountingPx,\n RenderInfo,\n timelineBackgroundElementClass,\n timelineElementCssClass,\n timelineMarkerSelectionStartClass,\n} from '../wp-timeline';\nimport Moment = moment.Moment;\n\nexport interface CellDateMovement {\n // Target values to move work package to\n startDate?:moment.Moment;\n dueDate?:moment.Moment;\n // Target value to move milestone to\n date?:moment.Moment;\n}\n\nexport type LabelPosition = 'left'|'right'|'farRight';\nexport type MouseDirection = 'left'|'right'|'both'|'create'|'dragright';\n\nexport const classNameLeftLabel = 'labelLeft';\nexport const classNameRightContainer = 'containerRight';\nexport const classNameRightLabel = 'labelRight';\nexport const classNameLeftHoverLabel = 'labelHoverLeft';\nexport const classNameRightHoverLabel = 'labelHoverRight';\nexport const classNameHoverStyle = '-label-style';\nexport const classNameFarRightLabel = 'labelFarRight';\nexport const classNameShowOnHover = 'show-on-hover';\nexport const classNameHideOnHover = 'hide-on-hover';\nexport const classNameLeftHandle = 'leftHandle';\nexport const classNameRightHandle = 'rightHandle';\nexport const classNameBarLabel = 'bar-label';\n\nexport class TimelineCellRenderer {\n @InjectField() wpTableTimeline:WorkPackageViewTimelineService;\n\n @InjectField() weekdayService:WeekdayService;\n\n @InjectField() schemaCache:SchemaCacheService;\n\n @InjectField() I18n!:I18nService;\n\n public text = {\n label_children_derived_duration: this.I18n.t('js.label_children_derived_duration'),\n };\n\n public ganttChartRowHeight:number;\n\n public mouseDirection:MouseDirection;\n\n public fieldRenderer:DisplayFieldRenderer = new DisplayFieldRenderer(this.injector, 'timeline');\n\n protected mouseDownCursorType:string;\n\n constructor(readonly injector:Injector,\n readonly workPackageTimeline:WorkPackageTimelineTableController) {\n this.ganttChartRowHeight = +getComputedStyle(document.documentElement)\n .getPropertyValue('--table-timeline--row-height')\n .replace('px', '');\n }\n\n public get type():string {\n return 'bar';\n }\n\n public canMoveDates(wp:WorkPackageResource):boolean {\n const schema = this.schemaCache.of(wp);\n return schema.startDate.writable && schema.dueDate.writable && schema.isAttributeEditable('startDate');\n }\n\n public isEmpty(wp:WorkPackageResource) {\n const start = moment(wp.startDate as any);\n const due = moment(wp.dueDate as any);\n const noStartAndDueValues = _.isNaN(start.valueOf()) && _.isNaN(due.valueOf());\n return noStartAndDueValues;\n }\n\n public displayPlaceholderUnderCursor(ev:MouseEvent, renderInfo:RenderInfo):HTMLElement {\n const [dateUnderCursor, dayOffset] = this.cursorDateAndDayOffset(ev, renderInfo);\n const duration = this.displayDurationForDate(renderInfo, dateUnderCursor);\n const width = duration * renderInfo.viewParams.pixelPerDay || 30;\n\n const placeholder = document.createElement('div');\n placeholder.style.pointerEvents = 'none';\n placeholder.style.position = 'absolute';\n placeholder.style.height = '1em';\n placeholder.style.width = `${width}px`;\n placeholder.style.zIndex = '9999';\n placeholder.style.left = `${dayOffset * renderInfo.viewParams.pixelPerDay}px`;\n this.applyTypeColor(renderInfo, placeholder);\n\n return placeholder;\n }\n\n /**\n * Assign changed dates to the work package.\n * For generic work packages, assigns start and finish date.\n *\n */\n public assignDateValues(\n change:WorkPackageChangeset,\n labels:WorkPackageCellLabels,\n dates:CellDateMovement,\n ):void {\n this.assignDate(change, 'startDate', dates.startDate as moment.Moment);\n this.assignDate(change, 'dueDate', dates.dueDate as moment.Moment);\n\n this.updateLabels(true, labels, change);\n }\n\n /**\n * Handle movement by days of the work package to either (or both) edge(s)\n * depending on which initial date was set.\n */\n public onDaysMoved(change:WorkPackageChangeset,\n dayUnderCursor:Moment,\n delta:number,\n direction:MouseDirection):CellDateMovement {\n const initialStartDate = change.pristineResource.startDate;\n const initialDueDate = change.pristineResource.dueDate;\n\n const now = moment().format('YYYY-MM-DD');\n\n const startDate = moment(change.projectedResource.startDate);\n const dueDate = moment(change.projectedResource.dueDate);\n\n const dates:CellDateMovement = {};\n\n if (direction === 'left') {\n dates.startDate = moment(initialStartDate || initialDueDate).add(delta, 'days');\n } else if (direction === 'right') {\n // When no due date is present and the start date is in the past,\n // we assume the task hasn't finished yet, meaning the end date is not in the past.\n // To cover this case we have to choose the start date, only when it's in the future,\n // and choose now if the start date is in the past.\n const calculatedDueDate = initialDueDate || (now > initialStartDate ? now : initialStartDate);\n dates.dueDate = moment(calculatedDueDate).add(delta, 'days');\n } else if (direction === 'both') {\n if (initialStartDate) {\n dates.startDate = moment(initialStartDate).add(delta, 'days');\n }\n if (initialDueDate) {\n dates.dueDate = moment(initialDueDate).add(delta, 'days');\n }\n } else if (direction === 'dragright') {\n dates.dueDate = startDate.clone().add(delta, 'days');\n }\n\n // avoid negative \"overdrag\" if only start or due are changed\n if (direction !== 'both') {\n if (dates.startDate !== undefined && dates.startDate.isAfter(dueDate)) {\n dates.startDate = dueDate;\n } else if (dates.dueDate !== undefined && dates.dueDate.isBefore(startDate)) {\n dates.dueDate = startDate;\n }\n }\n\n return dates;\n }\n\n public onMouseDown(ev:MouseEvent,\n dateForCreate:string|null,\n renderInfo:RenderInfo,\n labels:WorkPackageCellLabels):MouseDirection {\n // check for active selection mode\n if (renderInfo.viewParams.activeSelectionMode) {\n renderInfo.viewParams.activeSelectionMode(renderInfo.workPackage);\n ev.preventDefault();\n this.mouseDirection = 'both';\n return 'both'; // irrelevant\n }\n\n const projection = renderInfo.change.projectedResource;\n let direction:Exclude;\n\n // Update the cursor and maybe set start/due values\n if (jQuery(ev.target!).hasClass(classNameLeftHandle)) {\n // only left\n direction = 'left';\n this.mouseDirection = 'left';\n this.mouseDownCursorType = 'col-resize';\n if (projection.startDate === null) {\n projection.startDate = projection.dueDate;\n }\n } else if (jQuery(ev.target!).hasClass(classNameRightHandle) || dateForCreate) {\n // only right\n direction = 'right';\n this.mouseDirection = 'right';\n this.mouseDownCursorType = 'col-resize';\n } else {\n // both\n direction = 'both';\n this.mouseDirection = 'both';\n this.mouseDownCursorType = 'ew-resize';\n }\n\n this.workPackageTimeline.forceCursor(this.mouseDownCursorType);\n\n if (dateForCreate) {\n const dateUnderCursor = this.cursorDateAndDayOffset(ev, renderInfo)[0];\n const duration = this.displayDurationForDate(renderInfo, dateUnderCursor) - 1;\n\n projection.startDate = dateForCreate;\n projection.dueDate = moment(dateForCreate).add(duration, 'days').format('YYYY-MM-DD');\n direction = 'dragright';\n this.mouseDirection = 'dragright';\n }\n\n this.updateLabels(true, labels, renderInfo.change);\n\n return direction;\n }\n\n public onMouseDownEnd(labels:WorkPackageCellLabels, change:WorkPackageChangeset) {\n // Reset the cursor set by onMouseDown\n this.mouseDownCursorType = '';\n this.workPackageTimeline.forceCursor(this.mouseDownCursorType);\n this.updateLabels(false, labels, change);\n }\n\n /**\n * @return true, if the element should still be displayed.\n * false, if the element must be removed from the timeline.\n */\n public update(element:HTMLDivElement, labels:WorkPackageCellLabels|null, renderInfo:RenderInfo):boolean {\n const { change } = renderInfo;\n const bar = element.querySelector(`.${timelineBackgroundElementClass}`) as HTMLElement;\n let start = moment(change.projectedResource.startDate);\n let due = moment(change.projectedResource.dueDate);\n\n if (_.isNaN(start.valueOf()) && _.isNaN(due.valueOf())) {\n element.style.visibility = 'hidden';\n } else {\n element.style.visibility = 'visible';\n }\n\n // only start date, fade out bar to the right\n if (_.isNaN(due.valueOf()) && !_.isNaN(start.valueOf())) {\n // Set due date to today\n due = moment();\n bar.style.backgroundImage = 'linear-gradient(90deg, rgba(255,255,255,0) 0%, #F1F1F1 100%)';\n }\n\n // only finish date, fade out bar to the left\n if (_.isNaN(start.valueOf()) && !_.isNaN(due.valueOf())) {\n start = due.clone();\n bar.style.backgroundImage = 'linear-gradient(90deg, #F1F1F1 0%, rgba(255,255,255,0) 80%)';\n }\n\n this.setElementPositionAndSize(element, renderInfo, start, due);\n\n // Update labels if any\n if (labels) {\n this.updateLabels(false, labels, change);\n }\n\n this.checkForActiveSelectionMode(renderInfo, bar);\n this.checkForSpecialDisplaySituations(renderInfo, bar);\n this.applyTypeColor(renderInfo, bar);\n\n return true;\n }\n\n public cursorDateAndDayOffset(ev:MouseEvent, renderInfo:RenderInfo):[Moment, number] {\n const dayOffset = Math.floor(ev.offsetX / renderInfo.viewParams.pixelPerDay);\n const dateUnderCursor = renderInfo.viewParams.dateDisplayStart.clone().add(dayOffset, 'days');\n return [dateUnderCursor, dayOffset];\n }\n\n protected checkForActiveSelectionMode(renderInfo:RenderInfo, element:HTMLElement) {\n if (renderInfo.viewParams.activeSelectionMode) {\n element.style.backgroundImage = ''; // required! unable to disable \"fade out bar\" with css\n\n if (renderInfo.viewParams.selectionModeStart === `${renderInfo.workPackage.id!}`) {\n jQuery(element).addClass(timelineMarkerSelectionStartClass);\n element.style.background = 'none';\n }\n }\n }\n\n /**\n * Takes the date under the cursor and the work package's duration.\n * It calculates the adjusted duration based on the number of NonWorkingDays\n * that fall in the range of the ( date .. date + duration ).\n * @param renderInfo\n * @param date where we start the duration calculation from\n * @return {number} the NonWorkingDays adjusted duration\n */\n\n protected displayDurationForDate(renderInfo:RenderInfo, date:Moment):number {\n const { workPackage } = renderInfo;\n let duration = Number(moment.duration(workPackage.duration || 'P1D').asDays().toFixed(0));\n\n if (workPackage.ignoreNonWorkingDays) {\n return duration;\n }\n\n const { dateDisplayEnd } = renderInfo.viewParams;\n let newDuration = 0;\n\n for (newDuration; newDuration < duration; newDuration++) {\n const currentDate = date.clone().add(newDuration, 'days');\n\n // Stop adding duration when we reach end of the visible table\n if (currentDate > dateDisplayEnd) {\n break;\n }\n // Extend the duration if the currentDate is non-working\n if (this.weekdayService.isNonWorkingDay(currentDate.toDate() || this.workPackageTimeline.isNonWorkingDay(currentDate.toDate()))) {\n duration += 1;\n }\n }\n return newDuration;\n }\n\n getMarginLeftOfLeftSide(renderInfo:RenderInfo):number {\n const projection = renderInfo.change.projectedResource;\n\n let start = moment(projection.startDate);\n const due = moment(projection.dueDate);\n start = _.isNaN(start.valueOf()) ? due.clone() : start;\n\n const offsetStart = start.diff(renderInfo.viewParams.dateDisplayStart, 'days');\n\n return calculatePositionValueForDayCountingPx(renderInfo.viewParams, offsetStart);\n }\n\n getMarginLeftOfRightSide(renderInfo:RenderInfo):number {\n const projection = renderInfo.change.projectedResource;\n\n let start = moment(projection.startDate);\n let due = moment(projection.dueDate);\n\n start = _.isNaN(start.valueOf()) ? due.clone() : start;\n due = _.isNaN(due.valueOf()) ? start.clone() : due;\n\n const offsetStart = start.diff(renderInfo.viewParams.dateDisplayStart, 'days');\n const duration = due.diff(start, 'days') + 1;\n\n return calculatePositionValueForDayCountingPx(renderInfo.viewParams, offsetStart + duration);\n }\n\n getPaddingLeftForIncomingRelationLines(renderInfo:RenderInfo):number {\n return renderInfo.viewParams.pixelPerDay / 8;\n }\n\n getPaddingRightForOutgoingRelationLines(renderInfo:RenderInfo):number {\n return 0;\n }\n\n /**\n * Render the generic cell element, a bar spanning from\n * start to finish date.\n */\n public render(renderInfo:RenderInfo):HTMLDivElement {\n const container = document.createElement('div');\n const bar = document.createElement('div');\n const left = document.createElement('div');\n const right = document.createElement('div');\n\n container.className = `${timelineElementCssClass} ${this.type}`;\n bar.className = timelineBackgroundElementClass;\n left.className = classNameLeftHandle;\n right.className = classNameRightHandle;\n container.appendChild(bar);\n container.appendChild(left);\n container.appendChild(right);\n\n return container;\n }\n\n createAndAddLabels(renderInfo:RenderInfo, element:HTMLElement):WorkPackageCellLabels {\n // create center label\n const labelCenter = document.createElement('div');\n labelCenter.classList.add(classNameBarLabel);\n this.applyTypeColor(renderInfo, labelCenter);\n element.appendChild(labelCenter);\n\n // create left label\n const labelLeft = document.createElement('div');\n labelLeft.classList.add(classNameLeftLabel, classNameHideOnHover);\n element.appendChild(labelLeft);\n\n // create right container\n const containerRight = document.createElement('div');\n containerRight.classList.add(classNameRightContainer);\n element.appendChild(containerRight);\n\n // create right label\n const labelRight = document.createElement('div');\n labelRight.classList.add(classNameRightLabel, classNameHideOnHover);\n containerRight.appendChild(labelRight);\n\n // create far right label\n const labelFarRight = document.createElement('div');\n labelFarRight.classList.add(classNameFarRightLabel, classNameHideOnHover);\n containerRight.appendChild(labelFarRight);\n\n // create left hover label\n const labelHoverLeft = document.createElement('div');\n labelHoverLeft.classList.add(classNameLeftHoverLabel, classNameShowOnHover, classNameHoverStyle);\n element.appendChild(labelHoverLeft);\n\n // create right hover label\n const labelHoverRight = document.createElement('div');\n labelHoverRight.classList.add(classNameRightHoverLabel, classNameShowOnHover, classNameHoverStyle);\n element.appendChild(labelHoverRight);\n\n const labels = new WorkPackageCellLabels(labelCenter, labelLeft, labelHoverLeft, labelRight, labelHoverRight, labelFarRight);\n this.updateLabels(false, labels, renderInfo.change);\n\n return labels;\n }\n\n protected applyTypeColor(renderInfo:RenderInfo, bg:HTMLElement):void {\n const wp = renderInfo.workPackage;\n const { type } = wp;\n const selectionMode = renderInfo.viewParams.activeSelectionMode;\n\n // Don't apply the class in selection mode\n const { id } = type;\n if (selectionMode) {\n bg.classList.remove(Highlighting.backgroundClass('type', id!));\n } else {\n bg.classList.add(Highlighting.backgroundClass('type', id!));\n }\n }\n\n protected assignDate(change:WorkPackageChangeset, attributeName:string, value:moment.Moment) {\n if (value) {\n change.projectedResource[attributeName] = value.format('YYYY-MM-DD');\n }\n }\n\n setElementPositionAndSize(element:HTMLElement, renderInfo:RenderInfo, start:moment.Moment, due:moment.Moment) {\n const { viewParams } = renderInfo;\n // offset left\n const offsetStart = start.diff(viewParams.dateDisplayStart, 'days');\n element.style.left = calculatePositionValueForDayCount(viewParams, offsetStart);\n\n // duration\n const duration = due.diff(start, 'days') + 1;\n element.style.width = calculatePositionValueForDayCount(viewParams, duration);\n\n // ensure minimum width\n if (!_.isNaN(start.valueOf()) || !_.isNaN(due.valueOf())) {\n const minWidth = _.max([renderInfo.viewParams.pixelPerDay, 2]);\n element.style.minWidth = `${minWidth}px`;\n }\n }\n\n cursorOrDatesAreNonWorking(evOrDates:MouseEvent|Moment[], renderInfo:RenderInfo, direction?:MouseDirection|null):boolean {\n if (renderInfo.workPackage.ignoreNonWorkingDays) {\n return false;\n }\n\n const dates = (evOrDates instanceof MouseEvent)\n ? [this.cursorDateAndDayOffset(evOrDates, renderInfo)[0]]\n : evOrDates;\n if (!renderInfo.workPackage.ignoreNonWorkingDays && direction === 'both'\n && (this.weekdayService.isNonWorkingDay(dates[dates.length - 1].toDate() || this.workPackageTimeline.isNonWorkingDay(dates[dates.length - 1].toDate())))) {\n return false;\n }\n return dates.some((date) => (this.weekdayService.isNonWorkingDay(date.toDate()) || this.workPackageTimeline.isNonWorkingDay(date.toDate())));\n }\n\n /**\n * Changes the presentation of the work package.\n *\n * Known cases:\n * 1. Display a clamp if this work package is a parent element\n * and display a box wrapping all the visible children when the\n * parent is hovered\n */\n checkForSpecialDisplaySituations(renderInfo:RenderInfo, bar:HTMLElement) {\n const wp = renderInfo.workPackage;\n const row = bar.parentElement!.parentElement!;\n const selectionMode = renderInfo.viewParams.activeSelectionMode;\n\n // Cannot edit the work package if it has children\n // and it is not on 'Manual scheduling' mode\n if (!wp.isLeaf && !selectionMode && !wp.scheduleManually) {\n bar.classList.add('-readonly');\n } else {\n bar.classList.remove('-readonly');\n }\n\n // Display the children's duration clamp\n if (wp.derivedStartDate && wp.derivedDueDate) {\n const derivedStartDate = moment(wp.derivedStartDate);\n const derivedDueDate = moment(wp.derivedDueDate);\n const startDate = moment(renderInfo.change.projectedResource.startDate);\n const dueDate = moment(renderInfo.change.projectedResource.dueDate);\n const previousChildrenDurationBar = row.querySelector('.children-duration-bar');\n const childrenDurationBar = document.createElement('div');\n const childrenDurationHoverContainer = document.createElement('div');\n const visibleChildren = document.querySelectorAll(`.wp-timeline-cell.__hierarchy-group-${wp.id}:not([class*='__collapsed-group'])`).length || 0;\n\n childrenDurationBar.classList.add('children-duration-bar', '-clamp-style');\n childrenDurationBar.title = this.text.label_children_derived_duration;\n childrenDurationHoverContainer.classList.add('children-duration-hover-container');\n childrenDurationHoverContainer.style.height = `${this.ganttChartRowHeight * visibleChildren + 10}px`;\n\n if (derivedStartDate.isBefore(startDate) || derivedDueDate.isAfter(dueDate)) {\n childrenDurationBar.classList.add('-duration-overflow');\n }\n\n this.setElementPositionAndSize(childrenDurationBar, renderInfo, derivedStartDate, derivedDueDate);\n\n if (previousChildrenDurationBar) {\n previousChildrenDurationBar.remove();\n }\n\n childrenDurationBar.appendChild(childrenDurationHoverContainer);\n row.appendChild(childrenDurationBar);\n }\n\n // Check for non-working days and display a not-allowed cursor\n // when the startDate, dueDate are non-working days\n const { startDate, dueDate } = renderInfo.change.projectedResource;\n const invalidDates = this.cursorOrDatesAreNonWorking([moment(startDate), moment(dueDate)], renderInfo, this.mouseDirection);\n\n if (invalidDates) {\n this.workPackageTimeline.forceCursor('not-allowed');\n } else {\n // Restore the previous cursor set by onMouseDown\n this.workPackageTimeline.forceCursor(this.mouseDownCursorType);\n }\n }\n\n protected updateLabels(activeDragNDrop:boolean,\n labels:WorkPackageCellLabels,\n change:WorkPackageChangeset) {\n const labelConfiguration = this.wpTableTimeline.getNormalizedLabels(change.projectedResource);\n\n if (!activeDragNDrop) {\n // normal display\n this.renderLabel(change, labels, 'left', labelConfiguration.left);\n this.renderLabel(change, labels, 'right', labelConfiguration.right);\n this.renderLabel(change, labels, 'farRight', labelConfiguration.farRight);\n }\n\n // Update hover labels\n this.renderHoverLabels(labels, change);\n }\n\n protected renderHoverLabels(labels:WorkPackageCellLabels, change:WorkPackageChangeset) {\n this.renderLabel(change, labels, 'leftHover', 'startDate');\n this.renderLabel(change, labels, 'rightHover', 'dueDate');\n }\n\n protected renderLabel(change:WorkPackageChangeset,\n labels:WorkPackageCellLabels,\n position:LabelPosition|'leftHover'|'rightHover',\n attribute:string|null) {\n // Get the label position\n // Skip label if it does not exist (milestones)\n const label = labels[position];\n if (!label) {\n return;\n }\n\n // Reset label value\n label.innerHTML = '';\n\n if (attribute === null) {\n label.classList.remove('not-empty');\n return;\n }\n\n // Get the rendered field\n const [field, span] = this.fieldRenderer.renderFieldValue(change.projectedResource, attribute, change);\n\n if (label && field && span) {\n span.classList.add('label-content');\n label.appendChild(span);\n label.classList.add('not-empty');\n } else if (label) {\n label.classList.remove('not-empty');\n }\n }\n\n protected isParentWithVisibleChildren(wp:WorkPackageResource):boolean {\n if (!this.workPackageTimeline.inHierarchyMode) {\n return false;\n }\n\n const renderPass = this.workPackageTimeline.workPackageTable.lastRenderPass as HierarchyRenderPass|null;\n if (renderPass) {\n return !!renderPass.parentsWithVisibleChildren[wp.id!];\n }\n\n return false;\n }\n}\n","import * as moment from 'moment';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport {\n calculatePositionValueForDayCountingPx,\n RenderInfo,\n timelineElementCssClass,\n} from '../wp-timeline';\n\nimport {\n classNameFarRightLabel,\n classNameHideOnHover,\n classNameHoverStyle,\n classNameLeftHoverLabel,\n classNameLeftLabel,\n classNameRightContainer,\n classNameRightHoverLabel,\n classNameRightLabel,\n classNameShowOnHover,\n CellDateMovement,\n LabelPosition,\n TimelineCellRenderer,\n MouseDirection,\n} from './timeline-cell-renderer';\nimport { WorkPackageCellLabels } from './wp-timeline-cell-labels';\nimport Moment = moment.Moment;\n\nexport class TimelineMilestoneCellRenderer extends TimelineCellRenderer {\n public get type():string {\n return 'milestone';\n }\n\n public isEmpty(wp:WorkPackageResource) {\n const date = moment(wp.date as any);\n return _.isNaN(date.valueOf());\n }\n\n public canMoveDates(wp:WorkPackageResource) {\n const schema = this.schemaCache.of(wp);\n return schema.date.writable && schema.isAttributeEditable('date');\n }\n\n public displayPlaceholderUnderCursor(ev:MouseEvent, renderInfo:RenderInfo):HTMLElement {\n const days = Math.floor(ev.offsetX / renderInfo.viewParams.pixelPerDay);\n\n const placeholder = document.createElement('div');\n placeholder.className = 'timeline-element milestone';\n placeholder.style.pointerEvents = 'none';\n placeholder.style.height = '1em';\n placeholder.style.width = '1em';\n placeholder.style.left = `${days * renderInfo.viewParams.pixelPerDay}px`;\n\n const diamond = document.createElement('div');\n diamond.className = 'diamond';\n diamond.style.left = '0.5em';\n diamond.style.height = '1em';\n diamond.style.width = '1em';\n placeholder.appendChild(diamond);\n\n this.applyTypeColor(renderInfo, diamond);\n\n return placeholder;\n }\n\n /**\n * Assign changed dates to the work package.\n * For generic work packages, assigns start and finish date .\n *\n */\n public assignDateValues(change:WorkPackageChangeset,\n labels:WorkPackageCellLabels,\n dates:any):void {\n this.assignDate(change, 'date', dates.date);\n this.updateLabels(true, labels, change);\n }\n\n /**\n * Handle movement by days of milestone.\n */\n public onDaysMoved(change:WorkPackageChangeset,\n dayUnderCursor:Moment,\n delta:number,\n _direction:MouseDirection):CellDateMovement {\n const initialDate = change.pristineResource.date;\n const dates:CellDateMovement = {};\n\n if (initialDate) {\n dates.date = moment(initialDate).add(delta, 'days');\n }\n\n return dates;\n }\n\n public onMouseDown(ev:MouseEvent,\n dateForCreate:string | null,\n renderInfo:RenderInfo,\n labels:WorkPackageCellLabels):MouseDirection {\n // check for active selection mode\n if (renderInfo.viewParams.activeSelectionMode) {\n renderInfo.viewParams.activeSelectionMode(renderInfo.workPackage);\n ev.preventDefault();\n return 'both'; // irrelevant\n }\n\n let direction:'both' | 'create' = 'both';\n this.workPackageTimeline.forceCursor('ew-resize');\n\n if (dateForCreate) {\n renderInfo.change.projectedResource.date = dateForCreate;\n direction = 'create';\n return direction;\n }\n\n this.updateLabels(true, labels, renderInfo.change);\n\n return direction;\n }\n\n public update(element:HTMLDivElement, labels:WorkPackageCellLabels|null, renderInfo:RenderInfo):boolean {\n const { viewParams } = renderInfo;\n const date = moment(renderInfo.change.projectedResource.date);\n\n // abort if no date\n if (_.isNaN(date.valueOf())) {\n return false;\n }\n\n const diamond = jQuery('.diamond', element)[0];\n\n diamond.style.width = `${15}px`;\n diamond.style.height = `${15}px`;\n diamond.style.width = `${15}px`;\n diamond.style.height = `${15}px`;\n diamond.style.marginLeft = `${-(15 / 2) + (renderInfo.viewParams.pixelPerDay / 2)}px`;\n this.applyTypeColor(renderInfo, diamond);\n\n // offset left\n const offsetStart = date.diff(viewParams.dateDisplayStart, 'days');\n element.style.left = `${calculatePositionValueForDayCountingPx(viewParams, offsetStart)}px`;\n\n // Update labels if any\n if (labels) {\n this.updateLabels(false, labels, renderInfo.change);\n }\n\n this.checkForActiveSelectionMode(renderInfo, diamond);\n\n return true;\n }\n\n getMarginLeftOfLeftSide(renderInfo:RenderInfo):number {\n const { change } = renderInfo;\n const start = moment(change.projectedResource.date);\n const offsetStart = start.diff(renderInfo.viewParams.dateDisplayStart, 'days');\n return calculatePositionValueForDayCountingPx(renderInfo.viewParams, offsetStart);\n }\n\n getMarginLeftOfRightSide(ri:RenderInfo):number {\n return this.getMarginLeftOfLeftSide(ri) + ri.viewParams.pixelPerDay;\n }\n\n getPaddingLeftForIncomingRelationLines(renderInfo:RenderInfo):number {\n return (renderInfo.viewParams.pixelPerDay / 2) - 1;\n }\n\n getPaddingRightForOutgoingRelationLines(renderInfo:RenderInfo):number {\n return (15 / 2);\n }\n\n /**\n * Render a milestone element, a single day event with no resize, but\n * move functionality.\n */\n public render(renderInfo:RenderInfo):HTMLDivElement {\n const element = document.createElement('div');\n element.className = `${timelineElementCssClass} ${this.type}`;\n\n const diamond = document.createElement('div');\n diamond.className = 'diamond';\n element.appendChild(diamond);\n\n return element;\n }\n\n createAndAddLabels(renderInfo:RenderInfo, element:HTMLElement):WorkPackageCellLabels {\n // create left label\n const labelLeft = document.createElement('div');\n labelLeft.classList.add(classNameLeftLabel, classNameHideOnHover);\n element.appendChild(labelLeft);\n\n // create right container\n const containerRight = document.createElement('div');\n containerRight.classList.add(classNameRightContainer);\n element.appendChild(containerRight);\n\n // create right label\n const labelRight = document.createElement('div');\n labelRight.classList.add(classNameRightLabel, classNameHideOnHover);\n containerRight.appendChild(labelRight);\n\n // create far right label\n const labelFarRight = document.createElement('div');\n labelFarRight.classList.add(classNameFarRightLabel, classNameHideOnHover);\n containerRight.appendChild(labelFarRight);\n\n // Create right hover label\n const labelHoverRight = document.createElement('div');\n labelHoverRight.classList.add(classNameRightHoverLabel, classNameShowOnHover, classNameHoverStyle);\n element.appendChild(labelHoverRight);\n\n // Create left hover label\n const labelHoverLeft = document.createElement('div');\n labelHoverLeft.classList.add(classNameLeftHoverLabel, classNameShowOnHover, classNameHoverStyle);\n element.appendChild(labelHoverLeft);\n\n const labels = new WorkPackageCellLabels(null, labelLeft, labelHoverLeft, labelRight, labelHoverRight, labelFarRight, renderInfo.withAlternativeLabels);\n this.updateLabels(false, labels, renderInfo.change);\n\n return labels;\n }\n\n protected renderHoverLabels(labels:WorkPackageCellLabels, change:WorkPackageChangeset) {\n if (labels.withAlternativeLabels) {\n this.renderLabel(change, labels, 'leftHover', 'date');\n this.renderLabel(change, labels, 'rightHover', 'subject');\n } else {\n this.renderLabel(change, labels, 'rightHover', 'date');\n }\n }\n\n protected updateLabels(activeDragNDrop:boolean,\n labels:WorkPackageCellLabels,\n change:WorkPackageChangeset) {\n const labelConfiguration = this.wpTableTimeline.getNormalizedLabels(change.projectedResource);\n\n if (!activeDragNDrop) {\n // normal display\n\n if (labels.withAlternativeLabels) {\n this.renderLabel(change, labels, 'right', 'subject');\n } else {\n // Show only one date field if left=start, right=dueDate\n if (labelConfiguration.left === 'startDate' && labelConfiguration.right === 'dueDate') {\n this.renderLabel(change, labels, 'left', null);\n this.renderLabel(change, labels, 'right', 'date');\n } else {\n this.renderLabel(change, labels, 'left', labelConfiguration.left);\n this.renderLabel(change, labels, 'right', labelConfiguration.right);\n }\n }\n\n this.renderLabel(change, labels, 'farRight', labelConfiguration.farRight);\n }\n\n // Update hover labels\n this.renderHoverLabels(labels, change);\n }\n\n protected renderLabel(change:WorkPackageChangeset,\n labels:WorkPackageCellLabels,\n position:LabelPosition|'leftHover'|'rightHover',\n attribute:string|null) {\n // Normalize attribute\n if (attribute === 'startDate' || attribute === 'dueDate') {\n attribute = 'date';\n }\n\n super.renderLabel(change, labels, position, attribute);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injector } from '@angular/core';\nimport * as moment from 'moment';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { KeyCodes } from 'core-app/shared/helpers/keyCodes.enum';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\n\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { take } from 'rxjs/operators';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WorkPackageCellLabels } from './wp-timeline-cell-labels';\nimport {\n MouseDirection,\n TimelineCellRenderer,\n} from './timeline-cell-renderer';\nimport { RenderInfo } from '../wp-timeline';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport Moment = moment.Moment;\n\nexport function registerWorkPackageMouseHandler(this:void,\n injector:Injector,\n getRenderInfo:() => RenderInfo,\n workPackageTimeline:WorkPackageTimelineTableController,\n halEditing:HalResourceEditingService,\n halEvents:HalEventsService,\n notificationService:WorkPackageNotificationService,\n loadingIndicator:LoadingIndicatorService,\n cell:HTMLElement,\n bar:HTMLDivElement,\n labels:WorkPackageCellLabels,\n renderer:TimelineCellRenderer,\n renderInfo:RenderInfo):void {\n let mouseDownStartDay:number|null = null; // also flag to signal active drag'n'drop\n renderInfo.change = halEditing.changeFor(renderInfo.workPackage);\n\n let placeholderForEmptyCell:HTMLElement;\n const jBody = jQuery('body');\n\n // handles change to existing work packages\n bar.onmousedown = (ev:MouseEvent) => {\n if (ev.which === 1) {\n // Left click only\n workPackageMouseDownFn(ev);\n }\n };\n\n // handles initial creation of start/due values\n cell.onmousemove = handleMouseMoveOnEmptyCell;\n\n function applyRendererMoveChanges(dayUnderCursor:Moment, days:number, direction:MouseDirection) {\n const moved = renderer.onDaysMoved(renderInfo.change, dayUnderCursor, days, direction);\n renderer.assignDateValues(renderInfo.change, labels, moved);\n renderer.update(bar, labels, renderInfo);\n }\n\n function getCursorOffsetInDaysFromLeft(ev:MouseEvent):number {\n const leftOffset = workPackageTimeline.getAbsoluteLeftCoordinates();\n const cursorOffsetLeftInPx = ev.clientX - leftOffset;\n return Math.floor(cursorOffsetLeftInPx / renderInfo.viewParams.pixelPerDay);\n }\n\n function workPackageMouseDownFn(ev:MouseEvent) {\n ev.preventDefault();\n\n // add/remove css class while drag'n'drop is active\n const classNameActiveDrag = 'active-drag';\n bar.classList.add(classNameActiveDrag);\n jBody.on('mouseup.timelinecell', () => bar.classList.remove(classNameActiveDrag));\n\n workPackageTimeline.disableViewParamsCalculation = true;\n mouseDownStartDay = getCursorOffsetInDaysFromLeft(ev);\n\n // If this wp is a parent element, changing it is not allowed\n // if it is not on 'Manual scheduling' mode\n // But adding a relation to it is.\n if (!renderInfo.workPackage.isLeaf && !renderInfo.viewParams.activeSelectionMode && !renderInfo.workPackage.scheduleManually) {\n return;\n }\n\n // Determine what attributes of the work package should be changed\n const direction = renderer.onMouseDown(ev, null, renderInfo, labels);\n\n jBody.on('mousemove.timelinecell', createMouseMoveFn(direction));\n jBody.on('keyup.timelinecell', keyPressFn);\n jBody.on('mouseup.timelinecell', () => deactivate(direction, false));\n }\n\n function createMouseMoveFn(direction:MouseDirection) {\n return (ev:JQuery.MouseMoveEvent) => {\n const days = getCursorOffsetInDaysFromLeft(ev.originalEvent as MouseEvent) - (mouseDownStartDay as number);\n const offsetDayCurrent = Math.floor(ev.offsetX / renderInfo.viewParams.pixelPerDay);\n const dayUnderCursor = renderInfo.viewParams.dateDisplayStart.clone().add(offsetDayCurrent, 'days');\n\n applyRendererMoveChanges(dayUnderCursor, days, direction);\n };\n }\n\n function keyPressFn(ev:JQuery.TriggeredEvent) {\n const kev:KeyboardEvent = ev.originalEvent as KeyboardEvent;\n if (kev.keyCode === KeyCodes.ESCAPE) {\n deactivate(null, true);\n }\n }\n\n function handleMouseMoveOnEmptyCell(ev:MouseEvent) {\n const wp = renderInfo.workPackage;\n\n if (!renderer.isEmpty(wp)) {\n return;\n }\n\n // placeholder logic\n placeholderForEmptyCell?.remove();\n placeholderForEmptyCell = renderer.displayPlaceholderUnderCursor(ev, renderInfo);\n\n const isEditable = (wp.isLeaf || wp.scheduleManually)\n && renderer.canMoveDates(wp)\n && !renderer.cursorOrDatesAreNonWorking(ev, renderInfo);\n\n if (!isEditable) {\n cell.style.cursor = 'not-allowed';\n return;\n }\n\n // display placeholder only if the timeline is editable\n cell.style.cursor = '';\n cell.appendChild(placeholderForEmptyCell);\n\n // abort if mouse leaves cell\n cell.onmouseleave = () => {\n placeholderForEmptyCell.remove();\n };\n\n // create logic\n cell.onmousedown = (evt) => {\n placeholderForEmptyCell.remove();\n\n evt.preventDefault();\n\n if (renderer.cursorOrDatesAreNonWorking(evt, renderInfo)) {\n return;\n }\n\n bar.style.pointerEvents = 'none';\n\n const [clickStart, offsetDayStart] = renderer.cursorDateAndDayOffset(evt, renderInfo);\n const dateForCreate = clickStart.format('YYYY-MM-DD');\n const direction = renderer.onMouseDown(evt, dateForCreate, renderInfo, labels);\n renderer.update(bar, labels, renderInfo);\n\n if (direction === 'create') {\n deactivate(direction, false);\n return;\n }\n\n jBody.on('mousemove.emptytimelinecell', mouseMoveOnEmptyCellFn(offsetDayStart, direction));\n jBody.on('mouseup.emptytimelinecell', () => deactivate(direction, false));\n\n cell.onmouseup = () => {\n deactivate(direction, false);\n };\n\n jBody.on('keyup.timelinecell', keyPressFn);\n };\n }\n\n function mouseMoveOnEmptyCellFn(offsetDayStart:number, mouseDownType:MouseDirection) {\n return (ev:JQuery.MouseMoveEvent) => {\n placeholderForEmptyCell.remove();\n const relativePosition = Math.abs(cell.getBoundingClientRect().x - ev.clientX);\n const offsetDayCurrent = Math.floor(relativePosition / renderInfo.viewParams.pixelPerDay);\n const dayUnderCursor = renderInfo.viewParams.dateDisplayStart.clone().add(offsetDayCurrent, 'days');\n const widthInDays = offsetDayCurrent - offsetDayStart;\n\n applyRendererMoveChanges(dayUnderCursor, widthInDays, mouseDownType);\n };\n }\n\n function deactivate(direction:MouseDirection|null, cancelled:boolean) {\n const change = renderInfo.change;\n workPackageTimeline.disableViewParamsCalculation = false;\n\n cell.onmousemove = handleMouseMoveOnEmptyCell;\n cell.onmousedown = () => undefined;\n cell.onmouseleave = () => undefined;\n cell.onmouseup = () => undefined;\n\n bar.style.pointerEvents = 'auto';\n\n jBody.off('.timelinecell');\n jBody.off('.emptytimelinecell');\n workPackageTimeline.resetCursor();\n mouseDownStartDay = null;\n\n // Cancel changes if the startDate or dueDate are not allowed\n const { startDate, dueDate } = change.projectedResource;\n const invalidDates = renderer.cursorOrDatesAreNonWorking([moment(startDate), moment(dueDate)], renderInfo, direction);\n\n if (cancelled || change.isEmpty() || invalidDates) {\n cancelChange();\n return;\n }\n\n // Remove due date from sending if we moved the work package as is\n // and duration was set\n const duration = change.pristineResource.duration as string|null;\n if (direction === 'both' && duration) {\n change.clearValue('dueDate');\n change.setValue('duration', duration);\n }\n\n // Persist the changes\n saveWorkPackage(renderInfo.change)\n .then(() => {\n renderInfo.change.clear();\n renderer.onMouseDownEnd(labels, renderInfo.change);\n })\n .catch((error) => {\n notificationService.handleRawError(error, renderInfo.workPackage);\n cancelChange();\n });\n }\n\n function cancelChange() {\n renderInfo.change.clear();\n renderer.update(bar, labels, renderInfo);\n renderer.onMouseDownEnd(labels, renderInfo.change);\n workPackageTimeline.refreshView();\n }\n\n function saveWorkPackage(change:WorkPackageChangeset) {\n const apiv3Service:ApiV3Service = injector.get(ApiV3Service);\n const querySpace:IsolatedQuerySpace = injector.get(IsolatedQuerySpace);\n\n // Remember the time before saving the work package to know which work packages to update\n const updatedAt = moment().toISOString();\n\n return (loadingIndicator.table.promise = halEditing\n .save(change)\n .then((result) => {\n notificationService.showSave(result.resource);\n const ids = _.map(querySpace.tableRendered.value, (row) => row.workPackageId);\n return apiv3Service\n .work_packages\n .filterUpdatedSince(ids, updatedAt)\n .get()\n .toPromise()\n .then(() => {\n halEvents.push(result.resource, { eventType: 'updated' });\n return querySpace.timelineRendered.pipe(take(1)).toPromise();\n });\n }));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { Injector } from '@angular/core';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\n\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { registerWorkPackageMouseHandler } from './wp-timeline-cell-mouse-handler';\nimport { TimelineMilestoneCellRenderer } from './timeline-milestone-cell-renderer';\nimport { TimelineCellRenderer } from './timeline-cell-renderer';\nimport { WorkPackageCellLabels } from './wp-timeline-cell-labels';\nimport { RenderInfo } from '../wp-timeline';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\n\nexport class WorkPackageTimelineCell {\n @InjectField() halEditing:HalResourceEditingService;\n\n @InjectField() halEvents:HalEventsService;\n\n @InjectField() notificationService:WorkPackageNotificationService;\n\n @InjectField() states:States;\n\n @InjectField() loadingIndicator:LoadingIndicatorService;\n\n @InjectField() schemaCache:SchemaCacheService;\n\n private wpElement:HTMLDivElement|null = null;\n\n private elementShape:string;\n\n private labels:WorkPackageCellLabels;\n\n constructor(public readonly injector:Injector,\n public workPackageTimeline:WorkPackageTimelineTableController,\n public renderers:{ milestone:TimelineMilestoneCellRenderer, generic:TimelineCellRenderer },\n public latestRenderInfo:RenderInfo,\n public classIdentifier:string,\n public workPackageId:string) {\n }\n\n getMarginLeftOfLeftSide():number {\n const renderer = this.cellRenderer(this.latestRenderInfo.workPackage);\n return renderer.getMarginLeftOfLeftSide(this.latestRenderInfo);\n }\n\n getMarginLeftOfRightSide():number {\n const renderer = this.cellRenderer(this.latestRenderInfo.workPackage);\n return renderer.getMarginLeftOfRightSide(this.latestRenderInfo);\n }\n\n getPaddingLeftForIncomingRelationLines():number {\n const renderer = this.cellRenderer(this.latestRenderInfo.workPackage);\n return renderer.getPaddingLeftForIncomingRelationLines(this.latestRenderInfo);\n }\n\n getPaddingRightForOutgoingRelationLines():number {\n const renderer = this.cellRenderer(this.latestRenderInfo.workPackage);\n return renderer.getPaddingRightForOutgoingRelationLines(this.latestRenderInfo);\n }\n\n canConnectRelations():boolean {\n const wp = this.latestRenderInfo.workPackage;\n if (this.schemaCache.of(wp).isMilestone) {\n return !_.isNil(wp.date);\n }\n\n return !_.isNil(wp.startDate) || !_.isNil(wp.dueDate);\n }\n\n public clear() {\n this.cellElement.html('');\n this.wpElement = null;\n }\n\n private get cellContainer() {\n return this.workPackageTimeline.timelineBody;\n }\n\n private get cellElement():JQuery {\n return this.cellContainer.find(`.${this.classIdentifier}`);\n }\n\n private lazyInit(renderer:TimelineCellRenderer, renderInfo:RenderInfo):Promise {\n const body = this.workPackageTimeline.timelineBody[0];\n const cell = this.cellElement;\n\n if (!cell.length) {\n return Promise.reject('uninitialized');\n }\n\n const wasRendered = this.wpElement !== null && body.contains(this.wpElement);\n\n // If already rendered with correct shape, ignore\n if (wasRendered && this.elementShape === renderer.type) {\n return Promise.resolve();\n }\n\n // Remove the element first if we're redrawing\n if (!renderInfo.isDuplicatedCell) {\n this.clear();\n }\n\n // Render the given element\n this.wpElement = renderer.render(renderInfo);\n this.labels = renderer.createAndAddLabels(renderInfo, this.wpElement);\n this.elementShape = renderer.type;\n\n // Register the element\n cell.append(this.wpElement);\n\n // Allow editing if editable\n if (renderer.canMoveDates(renderInfo.workPackage)) {\n this.wpElement.classList.add('-editable');\n\n registerWorkPackageMouseHandler(\n this.injector,\n () => this.latestRenderInfo,\n this.workPackageTimeline,\n this.halEditing,\n this.halEvents,\n this.notificationService,\n this.loadingIndicator,\n cell[0],\n this.wpElement,\n this.labels,\n renderer,\n renderInfo,\n );\n }\n\n return Promise.resolve();\n }\n\n private cellRenderer(workPackage:WorkPackageResource):TimelineCellRenderer {\n if (this.schemaCache.of(workPackage).isMilestone) {\n return this.renderers.milestone;\n }\n\n return this.renderers.generic;\n }\n\n public refreshView(renderInfo:RenderInfo) {\n this.latestRenderInfo = renderInfo;\n\n const renderer = this.cellRenderer(renderInfo.workPackage);\n\n // Render initial element if necessary\n this.lazyInit(renderer, renderInfo)\n .then(() => {\n // Render the upgrade from renderInfo\n const shouldBeDisplayed = renderer.update(\n this.wpElement as HTMLDivElement,\n this.labels,\n renderInfo,\n );\n\n if (!shouldBeDisplayed) {\n this.clear();\n }\n })\n .catch(() => null);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injector } from '@angular/core';\nimport { States } from 'core-app/core/states/states.service';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport { RenderInfo } from '../wp-timeline';\nimport { TimelineCellRenderer } from './timeline-cell-renderer';\nimport { TimelineMilestoneCellRenderer } from './timeline-milestone-cell-renderer';\nimport { WorkPackageTimelineCell } from './wp-timeline-cell';\n\nexport class WorkPackageTimelineCellsRenderer {\n // Injections\n @InjectField() public states:States;\n\n @InjectField() public halEditing:HalResourceEditingService;\n\n public cells:{ [classIdentifier:string]:WorkPackageTimelineCell } = {};\n\n private cellRenderers:{ milestone:TimelineMilestoneCellRenderer, generic:TimelineCellRenderer };\n\n constructor(readonly injector:Injector,\n readonly wpTimeline:WorkPackageTimelineTableController) {\n this.cellRenderers = {\n milestone: new TimelineMilestoneCellRenderer(this.injector, wpTimeline),\n generic: new TimelineCellRenderer(this.injector, wpTimeline),\n };\n }\n\n public hasCell(wpId:string) {\n return this.getCellsFor(wpId).length > 0;\n }\n\n public getCellsFor(wpId:string):WorkPackageTimelineCell[] {\n return _.filter(this.cells, (cell) => cell.workPackageId === wpId) || [];\n }\n\n /**\n * Synchronize the currently active cells and render them all\n */\n public refreshAllCells() {\n // Create new cells and delete old ones\n this.synchronizeCells();\n\n // Update all cells\n _.each(this.cells, (cell) => this.refreshSingleCell(cell));\n }\n\n public refreshCellsFor(wpId:string) {\n _.each(this.getCellsFor(wpId), (cell) => this.refreshSingleCell(cell));\n }\n\n public refreshSingleCell(cell:WorkPackageTimelineCell, isDuplicatedCell?:boolean, withAlternativeLabels?:boolean) {\n const renderInfo = this.renderInfoFor(cell.workPackageId, isDuplicatedCell, withAlternativeLabels);\n\n if (renderInfo.workPackage) {\n cell.refreshView(renderInfo);\n }\n }\n\n /**\n * Synchronize the current cells:\n *\n * 1. Create new cells in workPackageIdOrder not yet tracked\n * 2. Remove old cells no longer contained.\n */\n private synchronizeCells() {\n const currentlyActive:string[] = Object.keys(this.cells);\n const newCells:string[] = [];\n\n _.each(this.wpTimeline.workPackageIdOrder, (renderedRow:RenderedWorkPackage) => {\n const wpId = renderedRow.workPackageId;\n\n // Ignore extra rows not tied to a work package\n if (!wpId) {\n return;\n }\n\n const state = this.states.workPackages.get(wpId);\n if (state.isPristine()) {\n return;\n }\n\n // As work packages may occur several times, get the unique identifier\n // to identify the cell\n const identifier = renderedRow.classIdentifier;\n\n // Create a cell unless we already have an active cell\n if (!this.cells[identifier]) {\n this.cells[identifier] = this.buildCell(identifier, wpId.toString());\n }\n\n newCells.push(identifier);\n });\n\n _.difference(currentlyActive, newCells).forEach((identifier:string) => {\n this.cells[identifier].clear();\n delete this.cells[identifier];\n });\n }\n\n private buildCell(classIdentifier:string, workPackageId:string) {\n return new WorkPackageTimelineCell(\n this.injector,\n this.wpTimeline,\n this.cellRenderers,\n this.renderInfoFor(workPackageId),\n classIdentifier,\n workPackageId,\n );\n }\n\n private renderInfoFor(wpId:string, isDuplicatedCell?:boolean, withAlternativeLabels?:boolean):RenderInfo {\n const wp = this.states.workPackages.get(wpId).value!;\n return {\n viewParams: this.wpTimeline.viewParameters,\n workPackage: wp,\n change: this.halEditing.changeFor(wp),\n isDuplicatedCell,\n withAlternativeLabels,\n };\n }\n\n public buildCellsAndRenderOnRow(workPackageIds:string[], rowClassIdentifier:string, isDuplicatedCell?:boolean):WorkPackageTimelineCell[] {\n const cells = workPackageIds.map((workPackageId) => this.buildCell(rowClassIdentifier, workPackageId));\n\n cells.forEach((cell:WorkPackageTimelineCell) => this.refreshSingleCell(cell, isDuplicatedCell, true));\n\n return cells;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit, Component, ElementRef, Injector,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IToast, ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport * as moment from 'moment';\nimport { Moment } from 'moment';\nimport { filter, takeUntil, take } from 'rxjs/operators';\nimport { input, InputState } from 'reactivestates';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { WorkPackageTimelineCellsRenderer } from 'core-app/features/work-packages/components/wp-table/timeline/cells/wp-timeline-cells-renderer';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageTimelineCell } from 'core-app/features/work-packages/components/wp-table/timeline/cells/wp-timeline-cell';\nimport { selectorTimelineSide } from 'core-app/features/work-packages/components/wp-table/wp-table-scroll-sync';\nimport { debugLog, timeOutput } from 'core-app/shared/helpers/debug_output';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { combineLatest, Observable } from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { WorkPackagesTableComponent } from 'core-app/features/work-packages/components/wp-table/wp-table.component';\nimport {\n groupIdFromIdentifier,\n groupTypeFromIdentifier,\n} from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/grouped/grouped-rows-helpers';\nimport { WorkPackageViewCollapsedGroupsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-collapsed-groups.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport {\n calculateDaySpan,\n getPixelPerDayForZoomLevel,\n requiredPixelMarginLeft,\n timelineElementCssClass,\n timelineHeaderSelector,\n timelineMarkerSelectionStartClass,\n TimelineViewParameters,\n zoomLevelOrder,\n} from '../wp-timeline';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\nimport * as Mousetrap from 'mousetrap';\nimport { DayResourceService } from 'core-app/core/state/days/day.service';\nimport { IDay } from 'core-app/core/state/days/day.model';\n\n@Component({\n selector: 'wp-timeline-container',\n templateUrl: './wp-timeline-container.html',\n})\nexport class WorkPackageTimelineTableController extends UntilDestroyedMixin implements AfterViewInit {\n private $element:JQuery;\n\n public workPackageTable:WorkPackageTable;\n\n private _viewParameters:TimelineViewParameters = new TimelineViewParameters();\n\n public disableViewParamsCalculation = false;\n\n public workPackageIdOrder:RenderedWorkPackage[] = [];\n\n private renderers:{ [name:string]:(vp:TimelineViewParameters) => void } = {};\n\n private cellsRenderer = new WorkPackageTimelineCellsRenderer(this.injector, this);\n\n public outerContainer:JQuery;\n\n public timelineBody:JQuery;\n\n private selectionParams:{ notification:IToast|null } = {\n notification: null,\n };\n\n private text:{ selectionMode:string };\n\n private refreshRequest = input();\n\n private collapsedGroupsCellsMap:IGroupCellsMap = {};\n\n private orderedRows:RenderedWorkPackage[] = [];\n\n get commonPipes() {\n return (source:Observable) => source.pipe(\n this.untilDestroyed(),\n takeUntil(this.querySpace.stopAllSubscriptions),\n filter(() => this.initialized && this.wpTableTimeline.isVisible),\n );\n }\n\n get workPackagesWithGroupHeaderCell():RenderedWorkPackage[] {\n const tableWorkPackages = this.querySpace.results.value!.elements;\n const wpsWithGroupHeaderCell = tableWorkPackages\n .filter((tableWorkPackage) => this.shouldBeShownInCollapsedGroupHeaders(tableWorkPackage))\n .map((tableWorkPackage) => tableWorkPackage.id);\n const workPackagesWithGroupHeaderCell = this.orderedRows.filter((row) => wpsWithGroupHeaderCell.includes(row.workPackageId) && !this.workPackageIdOrder.includes(row));\n\n return workPackagesWithGroupHeaderCell;\n }\n\n constructor(\n public readonly injector:Injector,\n private elementRef:ElementRef,\n private states:States,\n public wpTableComponent:WorkPackagesTableComponent,\n private toastService:ToastService,\n private wpTableTimeline:WorkPackageViewTimelineService,\n private notificationService:WorkPackageNotificationService,\n private wpRelations:WorkPackageRelationsService,\n private wpTableHierarchies:WorkPackageViewHierarchiesService,\n private halEvents:HalEventsService,\n private querySpace:IsolatedQuerySpace,\n readonly I18n:I18nService,\n private workPackageViewCollapsedGroupsService:WorkPackageViewCollapsedGroupsService,\n private weekdaysService:WeekdayService,\n private daysService:DayResourceService,\n ) {\n super();\n }\n\n ngAfterViewInit() {\n this.$element = jQuery(this.elementRef.nativeElement);\n\n const scrollBar = document.querySelector('.work-packages-tabletimeline--timeline-side');\n if (scrollBar) {\n scrollBar.addEventListener('scroll', () => {\n this.requireNonWorkingDays(this.getFirstDayInViewport().format('YYYY-MM-DD'), this.getLastDayInViewport().format('YYYY-MM-DD'));\n });\n }\n\n this.text = {\n selectionMode: this.I18n.t('js.timelines.selection_mode.notification'),\n };\n\n // Get the outer container for width computation\n this.outerContainer = this.$element.find('.wp-table-timeline--outer');\n this.timelineBody = this.$element.find('.wp-table-timeline--body');\n\n // Register this instance to the table\n this.wpTableComponent.registerTimeline(this, this.timelineBody[0]);\n\n // Refresh on window resize events\n window.addEventListener('wp-resize.timeline', () => this.refreshRequest.putValue(undefined));\n\n combineLatest([\n this.querySpace.tableRendered.values$(),\n this.refreshRequest.changes$(),\n this.wpTableTimeline.live$(),\n this.weekdaysService.loadWeekdays(),\n ]).pipe(\n this.commonPipes,\n )\n .subscribe(([orderedRows]) => {\n // Remember all visible rows in their order of appearance.\n this.workPackageIdOrder = orderedRows.filter((row:RenderedWorkPackage) => !row.hidden);\n this.orderedRows = orderedRows;\n this.refreshView();\n });\n\n this.setupManageCollapsedGroupHeaderCells();\n }\n\n public nonWorkingDays:IDay[] = [];\n\n workPackageCells(wpId:string):WorkPackageTimelineCell[] {\n return this.cellsRenderer.getCellsFor(wpId);\n }\n\n /**\n * Return the index of a given row by its class identifier\n */\n workPackageIndex(classIdentifier:string):number {\n return this.workPackageIdOrder.findIndex((el) => el.classIdentifier === classIdentifier);\n }\n\n onRefreshRequested(name:string, callback:(vp:TimelineViewParameters) => void) {\n this.renderers[name] = callback;\n }\n\n getAbsoluteLeftCoordinates():number {\n return this.$element.offset()!.left;\n }\n\n getParentScrollContainer() {\n return this.outerContainer.closest(selectorTimelineSide)[0];\n }\n\n get viewParameters():TimelineViewParameters {\n return this._viewParameters;\n }\n\n get inHierarchyMode():boolean {\n return this.wpTableHierarchies.isEnabled;\n }\n\n get initialized():boolean {\n return this.workPackageTable && this.querySpace.tableRendered.hasValue();\n }\n\n refreshView() {\n if (!this.wpTableTimeline.isVisible) {\n debugLog('refreshView() requested, but TL is invisible.');\n return;\n }\n\n if (this.wpTableTimeline.isAutoZoom()) {\n // Update autozoom level\n this.applyAutoZoomLevel();\n } else {\n this._viewParameters.settings.zoomLevel = this.wpTableTimeline.zoomLevel;\n this.wpTableTimeline.appliedZoomLevel = this.wpTableTimeline.zoomLevel;\n }\n\n timeOutput('refreshView() in timeline container', async () => {\n // Reset the width of the outer container if its content shrinks\n this.outerContainer.css('width', 'auto');\n\n this.calculateViewParams(this._viewParameters);\n\n await this.requireNonWorkingDays(this.getFirstDayInViewport().format('YYYY-MM-DD'), this.getLastDayInViewport().format('YYYY-MM-DD'));\n\n // Update all cells\n this.cellsRenderer.refreshAllCells();\n\n _.each(this.renderers, (cb, key) => {\n debugLog(`Refreshing timeline member ${key}`);\n cb(this._viewParameters);\n });\n\n this.refreshCollapsedGroupsHeaderCells(this.collapsedGroupsCellsMap, this.cellsRenderer);\n\n // Calculate overflowing width to set to outer container\n // required to match width in all child divs.\n // The header is the only one reliable, as it already has the final width.\n const currentWidth = this.$element.find(timelineHeaderSelector)[0].scrollWidth;\n this.outerContainer.width(currentWidth);\n\n // Mark rendering event in a timeout to give DOM some time\n setTimeout(() => {\n this.querySpace.timelineRendered.next(null);\n });\n });\n }\n\n startAddRelationPredecessor(start:WorkPackageResource) {\n this.activateSelectionMode(start.id!, (end) => {\n this.wpRelations\n .addCommonRelation(start.id!, 'follows', end.id!)\n .then(() => {\n this.halEvents.push(start, {\n eventType: 'association',\n relatedWorkPackage: end.id!,\n relationType: 'follows',\n });\n })\n .catch((error:any) => this.notificationService.handleRawError(error, end));\n });\n }\n\n startAddRelationFollower(start:WorkPackageResource) {\n this.activateSelectionMode(start.id!, (end) => {\n this.wpRelations\n .addCommonRelation(start.id!, 'precedes', end.id!)\n .then(() => {\n this.halEvents.push(start, {\n eventType: 'association',\n relatedWorkPackage: end.id!,\n relationType: 'precedes',\n });\n })\n .catch((error:any) => this.notificationService.handleRawError(error, end));\n });\n }\n\n getFirstDayInViewport() {\n const outerContainer = this.getParentScrollContainer();\n const { scrollLeft } = outerContainer;\n const nonVisibleDaysLeft = Math.floor(scrollLeft / this.viewParameters.pixelPerDay);\n return this.viewParameters.dateDisplayStart.clone().add(nonVisibleDaysLeft, 'days');\n }\n\n getLastDayInViewport() {\n const outerContainer = this.getParentScrollContainer();\n const { scrollLeft } = outerContainer;\n const width = outerContainer.offsetWidth;\n const viewPortRight = scrollLeft + width;\n const daysUntilViewPortEnds = Math.ceil(viewPortRight / this.viewParameters.pixelPerDay) + 1;\n return this.viewParameters.dateDisplayStart.clone().add(daysUntilViewPortEnds, 'days');\n }\n\n forceCursor(cursor:string) {\n jQuery(`.${timelineElementCssClass}`).css('cursor', cursor);\n jQuery('.wp-timeline-cell').css('cursor', cursor);\n jQuery('.hascontextmenu').css('cursor', cursor);\n jQuery('.leftHandle').css('cursor', cursor);\n jQuery('.rightHandle').css('cursor', cursor);\n }\n\n resetCursor() {\n jQuery(`.${timelineElementCssClass}`).css('cursor', '');\n jQuery('.wp-timeline-cell').css('cursor', '');\n jQuery('.hascontextmenu').css('cursor', '');\n jQuery('.leftHandle').css('cursor', '');\n jQuery('.rightHandle').css('cursor', '');\n }\n\n private resetSelectionMode() {\n this._viewParameters.activeSelectionMode = null;\n this._viewParameters.selectionModeStart = null;\n\n if (this.selectionParams.notification) {\n this.toastService.remove(this.selectionParams.notification);\n }\n\n Mousetrap.unbind('esc');\n\n this.$element.removeClass('active-selection-mode');\n jQuery(`.${timelineMarkerSelectionStartClass}`).removeClass(timelineMarkerSelectionStartClass);\n this.refreshView();\n }\n\n private activateSelectionMode(start:string, callback:(wp:WorkPackageResource) => any) {\n start = start.toString(); // old system bug: ID can be a 'number'\n\n this._viewParameters.activeSelectionMode = (wp:WorkPackageResource) => {\n callback(wp);\n this.resetSelectionMode();\n };\n\n this._viewParameters.selectionModeStart = start;\n Mousetrap.bind('esc', () => this.resetSelectionMode());\n this.selectionParams.notification = this.toastService.addNotice(this.text.selectionMode);\n\n this.$element.addClass('active-selection-mode');\n\n this.refreshView();\n }\n\n async requireNonWorkingDays(start:Date|string, end:Date|string) {\n this.nonWorkingDays = await this\n .daysService\n .requireNonWorkingYears$(start, end)\n .pipe(take(1))\n .toPromise();\n }\n\n isNonWorkingDay(date:Date|string):boolean {\n const formatted = moment(date).format('YYYY-MM-DD');\n return (this.nonWorkingDays.findIndex((el) => el.date === formatted) !== -1);\n }\n\n private calculateViewParams(currentParams:TimelineViewParameters):boolean {\n if (this.disableViewParamsCalculation) {\n return false;\n }\n\n const newParams = new TimelineViewParameters();\n let changed = false;\n const workPackagesToCalculateTimelineWidthFrom = this.getWorkPackagesToCalculateTimelineWidthFrom();\n\n workPackagesToCalculateTimelineWidthFrom.forEach((renderedRow) => {\n const wpId = renderedRow.workPackageId;\n\n if (!wpId) {\n return;\n }\n const workPackageState:InputState = this.states.workPackages.get(wpId);\n const workPackage:WorkPackageResource|undefined = workPackageState.value;\n\n if (!workPackage) {\n return;\n }\n\n // We may still have a reference to a row that, e.g., just got deleted\n const startDate = workPackage.startDate ? moment(workPackage.startDate) : currentParams.now;\n const dueDate = workPackage.dueDate ? moment(workPackage.dueDate) : currentParams.now;\n const date = workPackage.date ? moment(workPackage.date) : currentParams.now;\n\n // start date\n newParams.dateDisplayStart = moment.min(\n newParams.dateDisplayStart,\n currentParams.now,\n startDate,\n date,\n ).clone(); // clone because currentParams.now should not be changed\n\n // finish date\n newParams.dateDisplayEnd = moment.max(\n newParams.dateDisplayEnd,\n currentParams.now,\n dueDate,\n date,\n ).clone(); // clone because currentParams.now should not be changed\n });\n\n // left spacing\n newParams.dateDisplayStart.subtract(currentParams.dayCountForMarginLeft, 'days'); // .substract modifies its instance\n\n // right spacing\n // RR: kept both variants for documentation purpose.\n // A: calculate the minimal width based on the width of the timeline view\n // B: calculate the minimal width based on the window width\n const width = this.$element.children().width()!; // A\n // const width = jQuery('body').width(); // B\n\n const { pixelPerDay } = currentParams;\n const visibleDays = Math.ceil((width / pixelPerDay) * 1.5);\n newParams.dateDisplayEnd.add(visibleDays, 'days'); // .add modifies its instance\n\n // Check if view params changed:\n\n // start date\n if (!newParams.dateDisplayStart.isSame(this._viewParameters.dateDisplayStart)) {\n changed = true;\n this._viewParameters.dateDisplayStart = newParams.dateDisplayStart;\n }\n\n // end date\n if (!newParams.dateDisplayEnd.isSame(this._viewParameters.dateDisplayEnd)) {\n changed = true;\n this._viewParameters.dateDisplayEnd = newParams.dateDisplayEnd;\n }\n\n // Calculate the visible viewport\n const firstDayInViewport = this.getFirstDayInViewport();\n const lastDayInViewport = this.getLastDayInViewport();\n const viewport:[Moment, Moment] = [firstDayInViewport, lastDayInViewport];\n this._viewParameters.visibleViewportAtCalculationTime = viewport;\n\n return changed;\n }\n\n private applyAutoZoomLevel() {\n if (this.workPackageIdOrder.length === 0) {\n return;\n }\n\n const workPackagesToCalculateWidthFrom = this.getWorkPackagesToCalculateTimelineWidthFrom();\n const daysSpan = calculateDaySpan(workPackagesToCalculateWidthFrom, this.states.workPackages, this._viewParameters);\n const timelineWidthInPx = this.$element.parent().width()! - (2 * requiredPixelMarginLeft);\n\n for (const zoomLevel of zoomLevelOrder) {\n const pixelPerDay = getPixelPerDayForZoomLevel(zoomLevel);\n const visibleDays = timelineWidthInPx / pixelPerDay;\n\n if (visibleDays >= daysSpan || zoomLevel === _.last(zoomLevelOrder)) {\n // Zoom level is enough\n const previousZoomLevel = this._viewParameters.settings.zoomLevel;\n\n // did the zoom level changed?\n if (previousZoomLevel !== zoomLevel) {\n this._viewParameters.settings.zoomLevel = zoomLevel;\n this.wpTableComponent.timeline.scrollLeft = 0;\n }\n\n this.wpTableTimeline.appliedZoomLevel = zoomLevel;\n return;\n }\n }\n }\n\n setupManageCollapsedGroupHeaderCells() {\n this.workPackageViewCollapsedGroupsService.updates$()\n .pipe(\n this.commonPipes,\n )\n .subscribe((groupsCollapseEvent:IGroupsCollapseEvent) => {\n this.manageCollapsedGroupHeaderCells(\n groupsCollapseEvent,\n this.querySpace.results.value!.elements,\n this.collapsedGroupsCellsMap,\n );\n });\n }\n\n manageCollapsedGroupHeaderCells(groupsCollapseConfig:IGroupsCollapseEvent,\n tableWorkPackages:WorkPackageResource[],\n collapsedGroupsCellsMap:IGroupCellsMap) {\n const refreshAllGroupHeaderCells = groupsCollapseConfig.allGroupsChanged;\n const collapsedGroupsChange = groupsCollapseConfig.state;\n const collapsedGroupsChangeArray = Object.keys(collapsedGroupsChange);\n let groupsToUpdate:string[] = [];\n\n if (!collapsedGroupsChangeArray.length) {\n return;\n }\n\n if (refreshAllGroupHeaderCells) {\n groupsToUpdate = collapsedGroupsChangeArray.filter((groupIdentifier) => this.shouldManageCollapsedGroupHeaderCells(groupIdentifier, groupsCollapseConfig));\n } else {\n const groupIdentifier = groupsCollapseConfig.lastChangedGroup!;\n if (this.shouldManageCollapsedGroupHeaderCells(groupIdentifier, groupsCollapseConfig)) {\n groupsToUpdate = [groupIdentifier];\n }\n }\n\n groupsToUpdate.forEach((groupIdentifier) => {\n const groupIsCollapsed = collapsedGroupsChange[groupIdentifier];\n\n if (groupIsCollapsed) {\n this.createCollapsedGroupHeaderCells(groupIdentifier, tableWorkPackages, collapsedGroupsCellsMap);\n } else {\n this.removeCollapsedGroupHeaderCells(groupIdentifier, collapsedGroupsCellsMap);\n }\n });\n }\n\n shouldManageCollapsedGroupHeaderCells(groupIdentifier:string, groupsCollapseConfig:IGroupsCollapseEvent) {\n const keyGroupType = groupTypeFromIdentifier(groupIdentifier);\n\n return this.workPackageViewCollapsedGroupsService.groupTypesWithHeaderCellsWhenCollapsed.includes(keyGroupType)\n && this.workPackageViewCollapsedGroupsService.groupTypesWithHeaderCellsWhenCollapsed.includes(groupsCollapseConfig.groupedBy!);\n }\n\n createCollapsedGroupHeaderCells(groupIdentifier:string, tableWorkPackages:WorkPackageResource[], collapsedGroupsCellsMap:IGroupCellsMap) {\n this.removeCollapsedGroupHeaderCells(groupIdentifier, collapsedGroupsCellsMap);\n\n const changedGroupId = groupIdFromIdentifier(groupIdentifier);\n const changedGroupType = groupTypeFromIdentifier(groupIdentifier);\n const changedGroupTableWorkPackages = tableWorkPackages.filter((tableWorkPackage) => tableWorkPackage[changedGroupType].id === changedGroupId);\n const changedGroupWpsWithHeaderCells = changedGroupTableWorkPackages.filter((tableWorkPackage) => this.shouldBeShownInCollapsedGroupHeaders(tableWorkPackage)\n && (tableWorkPackage.date || tableWorkPackage.startDate));\n const changedGroupWpsWithHeaderCellsIds = changedGroupWpsWithHeaderCells.map((workPackage) => workPackage.id!);\n\n this.collapsedGroupsCellsMap[groupIdentifier] = this.cellsRenderer.buildCellsAndRenderOnRow(changedGroupWpsWithHeaderCellsIds, `group-${groupIdentifier}-timeline`, true);\n }\n\n removeCollapsedGroupHeaderCells(groupIdentifier:string, collapsedGroupsCellsMap:IGroupCellsMap) {\n if (collapsedGroupsCellsMap[groupIdentifier]) {\n collapsedGroupsCellsMap[groupIdentifier].forEach((cell:WorkPackageTimelineCell) => cell.clear());\n collapsedGroupsCellsMap[groupIdentifier] = [];\n }\n }\n\n refreshCollapsedGroupsHeaderCells(collapsedGroupsCellsMap:IGroupCellsMap, cellsRenderer:WorkPackageTimelineCellsRenderer) {\n Object.keys(collapsedGroupsCellsMap).forEach((collapsedGroupKey) => {\n const collapsedGroupCells = collapsedGroupsCellsMap[collapsedGroupKey];\n\n collapsedGroupCells.forEach((cell) => cellsRenderer.refreshSingleCell(cell, false, true));\n });\n }\n\n shouldBeShownInCollapsedGroupHeaders(workPackage:WorkPackageResource) {\n return this.workPackageViewCollapsedGroupsService\n .wpTypesToShowInCollapsedGroupHeaders\n .some((wpTypeFunction) => wpTypeFunction(workPackage));\n }\n\n getWorkPackagesToCalculateTimelineWidthFrom() {\n // Include work packages that are show in collapsed group\n // headers into the calculation, if not they could be rendered out\n // of the timeline (ie: milestones are shown on collapsed row groups).\n return [...this.workPackageIdOrder, ...this.workPackagesWithGroupHeaderCell];\n }\n}\n","
    \n
    \n \n \n \n \n
    \n
    \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Directive, ElementRef, Injector, Input,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\nimport { OpContextMenuTrigger } from 'core-app/shared/components/op-context-menu/handlers/op-context-menu-trigger.directive';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { WpTableConfigurationModalComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\nimport { QUERY_SORT_BY_ASC, QUERY_SORT_BY_DESC } from 'core-app/features/hal/resources/query-sort-by-resource';\nimport { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';\n\n@Directive({\n selector: '[opColumnsContextMenu]',\n})\nexport class OpColumnsContextMenu extends OpContextMenuTrigger {\n @Input('opColumnsContextMenu-column') public column:QueryColumn;\n\n @Input('opColumnsContextMenu-table') public table:WorkPackageTable;\n\n public text = {\n confirmDelete: {\n text: this.I18n.t('js.work_packages.table_configuration.sorting_mode.warning'),\n title: this.I18n.t('js.modals.form_submit.title'),\n },\n };\n\n constructor(readonly elementRef:ElementRef,\n readonly opContextMenu:OPContextMenuService,\n readonly wpTableColumns:WorkPackageViewColumnsService,\n readonly wpTableSortBy:WorkPackageViewSortByService,\n readonly wpTableGroupBy:WorkPackageViewGroupByService,\n readonly wpTableHierarchies:WorkPackageViewHierarchiesService,\n readonly opModalService:OpModalService,\n readonly injector:Injector,\n readonly I18n:I18nService,\n readonly confirmDialog:ConfirmDialogService) {\n super(elementRef, opContextMenu);\n }\n\n protected open(evt:JQuery.TriggeredEvent) {\n if (!this.table.configuration.columnMenuEnabled) {\n return;\n }\n this.buildItems();\n this.opContextMenu.show(this, evt);\n }\n\n public get locals() {\n return {\n showAnchorRight: this.column && this.column.id !== 'id',\n contextMenuId: 'column-context-menu',\n items: this.items,\n };\n }\n\n /**\n * Positioning args for jquery-ui position.\n *\n * @param {Event} openerEvent\n */\n public positionArgs(evt:JQuery.TriggeredEvent) {\n const additionalPositionArgs = {\n of: this.$element.find('.generic-table--sort-header-outer'),\n };\n\n const position = super.positionArgs(evt);\n _.assign(position, additionalPositionArgs);\n\n return position;\n }\n\n protected get afterFocusOn():JQuery {\n return this.$element.find(`#${this.column.id}`);\n }\n\n private buildItems() {\n const c = this.column;\n\n this.items = [\n {\n // Sort ascending\n hidden: !this.wpTableSortBy.isSortable(c),\n linkText: this.I18n.t('js.work_packages.query.sort_descending'),\n icon: 'icon-sort-descending',\n onClick: (evt:any) => {\n if (this.wpTableSortBy.isManualSortingMode) {\n this.confirmDialog.confirm({\n text: this.text.confirmDelete,\n }).then(() => {\n this.wpTableSortBy.setAsSingleSortCriteria(c, QUERY_SORT_BY_DESC);\n return true;\n });\n return false;\n }\n this.wpTableSortBy.addSortCriteria(c, QUERY_SORT_BY_DESC);\n return true;\n },\n },\n {\n // Sort descending\n hidden: !this.wpTableSortBy.isSortable(c),\n linkText: this.I18n.t('js.work_packages.query.sort_ascending'),\n icon: 'icon-sort-ascending',\n onClick: (evt:any) => {\n if (this.wpTableSortBy.isManualSortingMode) {\n this.confirmDialog.confirm({\n text: this.text.confirmDelete,\n }).then(() => {\n this.wpTableSortBy.setAsSingleSortCriteria(c, QUERY_SORT_BY_ASC);\n return true;\n });\n return false;\n }\n this.wpTableSortBy.addSortCriteria(c, QUERY_SORT_BY_ASC);\n return true;\n },\n },\n {\n // Group by\n hidden: !this.wpTableGroupBy.isGroupable(c) || this.wpTableGroupBy.isCurrentlyGroupedBy(c),\n linkText: this.I18n.t('js.work_packages.query.group'),\n icon: 'icon-group-by',\n onClick: () => {\n if (this.wpTableHierarchies.isEnabled) {\n this.wpTableHierarchies.setEnabled(false);\n }\n this.wpTableGroupBy.setBy(c);\n return true;\n },\n },\n {\n // Move left\n hidden: this.wpTableColumns.isFirst(c),\n linkText: this.I18n.t('js.work_packages.query.move_column_left'),\n icon: 'icon-column-left',\n onClick: () => {\n this.wpTableColumns.shift(c, -1);\n return true;\n },\n },\n {\n // Move right\n hidden: this.wpTableColumns.isLast(c),\n linkText: this.I18n.t('js.work_packages.query.move_column_right'),\n icon: 'icon-column-right',\n onClick: () => {\n this.wpTableColumns.shift(c, 1);\n return true;\n },\n },\n {\n // Hide column\n linkText: this.I18n.t('js.work_packages.query.hide_column'),\n icon: 'icon-delete',\n onClick: () => {\n const focusColumn = this.wpTableColumns.previous(c) || this.wpTableColumns.next(c);\n this.wpTableColumns.removeColumn(c);\n\n setTimeout(() => {\n if (focusColumn) {\n jQuery(`#${focusColumn.id}`).focus();\n }\n });\n return true;\n },\n },\n {\n // Insert columns\n linkText: this.I18n.t('js.work_packages.query.insert_columns'),\n icon: 'icon-columns',\n onClick: () => {\n this.opModalService.show(\n WpTableConfigurationModalComponent,\n this.injector,\n { initialTab: 'columns' },\n );\n return true;\n },\n },\n ];\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component, ElementRef, OnInit } from '@angular/core';\nimport { WorkPackageTimelineTableController } from 'core-app/features/work-packages/components/wp-table/timeline/container/wp-timeline-container.directive';\nimport * as moment from 'moment';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { TimelineZoomLevel } from 'core-app/features/hal/resources/query-resource';\nimport {\n calculatePositionValueForDayCount,\n getTimeSlicesForHeader,\n timelineHeaderCSSClass,\n timelineHeaderSelector,\n TimelineViewParameters,\n} from '../wp-timeline';\nimport Moment = moment.Moment;\n\n@Component({\n selector: timelineHeaderSelector,\n templateUrl: './wp-timeline-header.html',\n})\nexport class WorkPackageTimelineHeaderController implements OnInit {\n public $element:JQuery;\n\n private activeZoomLevel:TimelineZoomLevel;\n\n private innerHeader:JQuery;\n\n constructor(elementRef:ElementRef,\n readonly I18n:I18nService,\n readonly wpTimelineService:WorkPackageViewTimelineService,\n readonly workPackageTimelineTableController:WorkPackageTimelineTableController) {\n this.$element = jQuery(elementRef.nativeElement);\n }\n\n ngOnInit() {\n this.workPackageTimelineTableController\n .onRefreshRequested('header', (vp:TimelineViewParameters) => this.refreshView(vp));\n }\n\n refreshView(vp:TimelineViewParameters) {\n this.innerHeader = this.$element.find('.wp-table-timeline--header-inner');\n this.renderLabels(vp);\n }\n\n private renderLabels(vp:TimelineViewParameters):void {\n this.innerHeader.empty();\n this.innerHeader.attr('data-current-zoom-level', this.wpTimelineService.zoomLevel);\n\n switch (vp.settings.zoomLevel) {\n case 'days':\n this.renderLabelsDays(vp);\n break;\n case 'weeks':\n this.renderLabelsWeeks(vp);\n break;\n case 'months':\n this.renderLabelsMonths(vp);\n break;\n case 'quarters':\n this.renderLabelsQuarters(vp);\n break;\n case 'years':\n this.renderLabelsYears(vp);\n break;\n default:\n return;\n }\n\n this.activeZoomLevel = vp.settings.zoomLevel;\n }\n\n private renderLabelsDays(vp:TimelineViewParameters) {\n this.renderTimeSlices(vp, 'month', 0, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('MMM YYYY');\n cell.classList.add('wp-timeline--header-top-bold-element');\n cell.style.height = '13px';\n });\n\n this.renderTimeSlices(vp, 'week', 13, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('ww');\n cell.classList.add('-top-border');\n cell.style.height = '32px';\n });\n\n this.renderTimeSlices(vp, 'day', 23, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('D');\n cell.classList.add('-top-border');\n cell.style.height = '22px';\n });\n\n this.renderTimeSlices(vp, 'day', 33, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('dd');\n cell.classList.add('wp-timeline--header-day-element');\n });\n }\n\n private renderLabelsWeeks(vp:TimelineViewParameters) {\n this.renderTimeSlices(vp, 'month', 0, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('MMM YYYY');\n cell.classList.add('wp-timeline--header-top-bold-element');\n });\n\n this.renderTimeSlices(vp, 'week', 15, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('ww');\n cell.classList.add('-top-border');\n cell.style.height = '22px';\n });\n\n this.renderTimeSlices(vp, 'day', 25, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('D');\n cell.classList.add('wp-timeline--header-middle-element');\n });\n }\n\n private renderLabelsMonths(vp:TimelineViewParameters) {\n this.renderTimeSlices(vp, 'year', 0, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('YYYY');\n cell.classList.add('wp-timeline--header-top-bold-element');\n });\n\n this.renderTimeSlices(vp, 'month', 15, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('MMM');\n cell.classList.add('-top-border');\n cell.style.height = '30px';\n });\n\n this.renderTimeSlices(vp, 'week', 25, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('ww');\n cell.classList.add('wp-timeline--header-middle-element');\n });\n }\n\n private renderLabelsQuarters(vp:TimelineViewParameters) {\n this.renderTimeSlices(vp, 'year', 0, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--header-top-bold-element');\n cell.innerHTML = start.format('YYYY');\n });\n\n this.renderTimeSlices(vp, 'quarter', 15, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = this.I18n.t('js.timelines.quarter_label',\n { quarter_number: start.format('Q') });\n cell.classList.add('-top-border');\n cell.style.height = '30px';\n });\n\n this.renderTimeSlices(vp, 'month', 25, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('MMM');\n cell.classList.add('wp-timeline--header-middle-element');\n });\n }\n\n private renderLabelsYears(vp:TimelineViewParameters) {\n this.renderTimeSlices(vp, 'year', 0, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('YYYY');\n cell.classList.add('wp-timeline--header-top-bold-element');\n });\n\n this.renderTimeSlices(vp, 'quarter', 15, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = this.I18n.t('js.timelines.quarter_label',\n { quarter_number: start.format('Q') });\n cell.classList.add('-top-border');\n cell.style.height = '30px';\n });\n\n this.renderTimeSlices(vp, 'month', 25, vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.innerHTML = start.format('M');\n cell.classList.add('wp-timeline--header-middle-element');\n });\n }\n\n private renderTimeSlices(vp:TimelineViewParameters,\n unit:moment.unitOfTime.DurationConstructor,\n marginTop:number,\n startView:Moment,\n endView:Moment,\n cellCallback:(start:Moment, cell:HTMLElement) => void) {\n const { inViewportAndBoundaries, rest } = getTimeSlicesForHeader(vp, unit, startView, endView);\n\n for (const [start, end] of inViewportAndBoundaries) {\n const cell = this.addLabelCell();\n cell.style.top = `${marginTop}px`;\n cell.style.left = calculatePositionValueForDayCount(vp, start.diff(startView, 'days'));\n cell.style.width = calculatePositionValueForDayCount(vp, end.diff(start, 'days') + 1);\n cellCallback(start, cell);\n }\n setTimeout(() => {\n for (const [start, end] of rest) {\n const cell = this.addLabelCell();\n cell.style.top = `${marginTop}px`;\n cell.style.left = calculatePositionValueForDayCount(vp, start.diff(startView, 'days'));\n cell.style.width = calculatePositionValueForDayCount(vp, end.diff(start, 'days') + 1);\n cellCallback(start, cell);\n }\n }, 0);\n }\n\n private addLabelCell():HTMLElement {\n const label = document.createElement('div');\n label.className = timelineHeaderCSSClass;\n\n this.innerHeader.append(label);\n return label;\n }\n}\n","
    \n
    \n
    \n","import { RelationResource } from 'core-app/features/hal/resources/relation-resource';\n\nexport function workPackagePrefix(workPackageId:string) {\n return `__tl-relation-${workPackageId}`;\n}\n\nexport class TimelineRelationElement {\n constructor(public belongsToId:string, public relation:RelationResource) {\n }\n\n public get classNames():string[] {\n return [\n workPackagePrefix(this.relation.ids.from),\n workPackagePrefix(this.relation.ids.to),\n ];\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component, ElementRef, Injector, OnInit,\n} from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { State } from 'reactivestates';\nimport { combineLatest } from 'rxjs';\nimport { filter, map, take } from 'rxjs/operators';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { RelationsStateValue, WorkPackageRelationsService } from '../../../wp-relations/wp-relations.service';\nimport { WorkPackageTimelineCell } from '../cells/wp-timeline-cell';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport { timelineElementCssClass, TimelineViewParameters } from '../wp-timeline';\nimport { TimelineRelationElement, workPackagePrefix } from './timeline-relation-element';\n\nconst DEBUG_DRAW_RELATION_LINES_WITH_COLOR = false;\n\nexport const timelineGlobalElementCssClassname = 'relation-line';\n\nfunction newSegment(vp:TimelineViewParameters,\n classNames:string[],\n yPosition:number,\n top:number,\n left:number,\n width:number,\n height:number,\n color?:string):HTMLElement {\n const segment = document.createElement('div');\n segment.classList.add(\n timelineElementCssClass,\n timelineGlobalElementCssClassname,\n ...classNames,\n );\n\n // segment.style.backgroundColor = color;\n segment.style.top = `${(yPosition * 40) + top}px`;\n segment.style.left = `${left}px`;\n segment.style.width = `${width}px`;\n segment.style.height = `${height}px`;\n\n if (DEBUG_DRAW_RELATION_LINES_WITH_COLOR && color !== undefined) {\n segment.style.zIndex = '9999999';\n segment.style.backgroundColor = color;\n }\n return segment;\n}\n\n@Component({\n selector: 'wp-timeline-relations',\n template: '
    ',\n})\nexport class WorkPackageTableTimelineRelations extends UntilDestroyedMixin implements OnInit {\n @InjectField() querySpace:IsolatedQuerySpace;\n\n private container:JQuery;\n\n private workPackagesWithRelations:{ [workPackageId:string]:State } = {};\n\n constructor(public readonly injector:Injector,\n public elementRef:ElementRef,\n public states:States,\n public workPackageTimelineTableController:WorkPackageTimelineTableController,\n public wpTableTimeline:WorkPackageViewTimelineService,\n public wpRelations:WorkPackageRelationsService) {\n super();\n }\n\n ngOnInit() {\n const $element = jQuery(this.elementRef.nativeElement);\n this.container = $element.find('.wp-table-timeline--relations');\n this.workPackageTimelineTableController\n .onRefreshRequested('relations', (vp:TimelineViewParameters) => this.refreshView());\n\n this.setupRelationSubscription();\n }\n\n private refreshView() {\n this.update();\n }\n\n private get workPackageIdOrder() {\n return this.workPackageTimelineTableController.workPackageIdOrder;\n }\n\n /**\n * Refresh relations of visible rows.\n */\n private setupRelationSubscription() {\n // for all visible WorkPackage rows...\n combineLatest([\n this.querySpace.renderedWorkPackages.values$(),\n this.wpTableTimeline.live$(),\n ])\n .pipe(\n filter(([_, timeline]) => timeline.visible),\n this.untilDestroyed(),\n map(([rendered, _]) => rendered),\n )\n .subscribe((list) => {\n // ... make sure that the corresponding relations are loaded ...\n const wps = _.compact(list.map((row) => row.workPackageId) as string[]);\n this.wpRelations.requireAll(wps);\n\n wps.forEach((wpId) => {\n const relationsForWorkPackage = this.wpRelations.state(wpId);\n this.workPackagesWithRelations[wpId] = relationsForWorkPackage;\n\n // ... once they are loaded, display them.\n relationsForWorkPackage.values$()\n .pipe(\n take(1),\n )\n .subscribe(() => {\n this.renderWorkPackagesRelations([wpId]);\n });\n });\n });\n\n // When a WorkPackage changes, redraw the corresponding relations\n this.states.workPackages.observeChange()\n .pipe(\n this.untilDestroyed(),\n filter(() => this.wpTableTimeline.isVisible),\n )\n .subscribe(([workPackageId]) => {\n this.renderWorkPackagesRelations([workPackageId]);\n });\n }\n\n private renderWorkPackagesRelations(workPackageIds:string[]) {\n workPackageIds.forEach((workPackageId) => {\n const workPackageWithRelation = this.workPackagesWithRelations[workPackageId];\n if (_.isNil(workPackageWithRelation)) {\n return;\n }\n\n this.removeRelationElementsForWorkPackage(workPackageId);\n const relations = _.values(workPackageWithRelation.value);\n const relationsList = _.values(relations);\n relationsList.forEach((relation) => {\n if (!(relation.type === 'precedes'\n || relation.type === 'follows')) {\n return;\n }\n\n const elem = new TimelineRelationElement(relation.ids.from, relation);\n this.renderElement(this.workPackageTimelineTableController.viewParameters, elem);\n });\n });\n }\n\n private update() {\n this.removeAllVisibleElements();\n this.renderElements();\n }\n\n private removeRelationElementsForWorkPackage(workPackageId:string) {\n const className = workPackagePrefix(workPackageId);\n const found = this.container.find(`.${className}`);\n found.remove();\n }\n\n private removeAllVisibleElements() {\n this.container.find(`.${timelineGlobalElementCssClassname}`).remove();\n }\n\n private renderElements() {\n const wpIdsWithRelations:string[] = _.keys(this.workPackagesWithRelations);\n this.renderWorkPackagesRelations(wpIdsWithRelations);\n }\n\n /**\n * Render a single relation to all shown work packages. Since work packages may occur multiple\n * times in the timeline, iterate all potential combinations and render them.\n * @param vp\n * @param e\n */\n private renderElement(vp:TimelineViewParameters, e:TimelineRelationElement) {\n const involved = e.relation.ids;\n\n const startCells = this.workPackageTimelineTableController.workPackageCells(involved.to);\n const endCells = this.workPackageTimelineTableController.workPackageCells(involved.from);\n\n // If either sources or targets are not rendered, ignore this relation\n if (startCells.length === 0 || endCells.length === 0) {\n return;\n }\n\n // Now, render all sources to all targets\n startCells.forEach((startCell) => {\n const idxFrom = this.workPackageTimelineTableController.workPackageIndex(startCell.classIdentifier);\n endCells.forEach((endCell) => {\n const idxTo = this.workPackageTimelineTableController.workPackageIndex(endCell.classIdentifier);\n this.renderRelation(vp, e, idxFrom, idxTo, startCell, endCell);\n });\n });\n }\n\n private renderRelation(vp:TimelineViewParameters,\n e:TimelineRelationElement,\n idxFrom:number,\n idxTo:number,\n startCell:WorkPackageTimelineCell,\n endCell:WorkPackageTimelineCell) {\n const rowFrom = this.workPackageIdOrder[idxFrom];\n const rowTo = this.workPackageIdOrder[idxTo];\n\n // If any of the targets are hidden in the table, skip\n if (!(rowFrom && rowTo) || (rowFrom.hidden || rowTo.hidden)) {\n return;\n }\n\n // Skip if relations cannot be drawn between these cells\n if (!startCell.canConnectRelations() || !endCell.canConnectRelations()) {\n return;\n }\n\n // Get X values\n // const hookLength = endCell.getPaddingLeftForIncomingRelationLines();\n const startX = startCell.getMarginLeftOfRightSide() - startCell.getPaddingRightForOutgoingRelationLines();\n const targetX = endCell.getMarginLeftOfLeftSide() + endCell.getPaddingLeftForIncomingRelationLines();\n\n // Vertical direction\n const directionY:'toUp'|'toDown' = idxFrom < idxTo ? 'toDown' : 'toUp';\n\n // Horizontal direction\n const directionX:'toLeft'|'beneath'|'toRight' = targetX > startX ? 'toRight' : targetX < startX ? 'toLeft' : 'beneath';\n\n // start\n if (!startCell) {\n return;\n }\n\n // Draw the first line next to the bar/milestone element\n const paddingRight = startCell.getPaddingRightForOutgoingRelationLines();\n const startLineWith = endCell.getPaddingLeftForIncomingRelationLines()\n + (paddingRight > 0 ? paddingRight : 0);\n this.container.append(newSegment(vp, e.classNames, idxFrom, 19, startX, startLineWith, 1, 'red'));\n const lastX = startX + startLineWith;\n // lastX += hookLength;\n\n // Draw vertical line between rows\n const height = Math.abs(idxTo - idxFrom);\n if (directionY === 'toDown') {\n if (directionX === 'toRight' || directionX === 'beneath') {\n this.container.append(newSegment(vp, e.classNames, idxFrom, 19, lastX, 1, height * 40, 'black'));\n } else if (directionX === 'toLeft') {\n this.container.append(newSegment(vp, e.classNames, idxFrom, 19, lastX, 1, (height * 40) - 10, 'black'));\n }\n } else if (directionY === 'toUp') {\n this.container.append(newSegment(vp, e.classNames, idxTo, 30, lastX, 1, (height * 40) - 10, 'black'));\n }\n\n // Draw end corner to the target\n if (directionX === 'toRight') {\n if (directionY === 'toDown') {\n this.container.append(newSegment(vp, e.classNames, idxTo, 19, lastX, targetX - lastX, 1, 'red'));\n } else if (directionY === 'toUp') {\n this.container.append(newSegment(vp, e.classNames, idxTo, 20, lastX, 1, 10, 'green'));\n this.container.append(newSegment(vp, e.classNames, idxTo, 20, lastX, targetX - lastX, 1, 'lightsalmon'));\n }\n } else if (directionX === 'toLeft') {\n if (directionY === 'toDown') {\n this.container.append(newSegment(vp, e.classNames, idxTo, 0, lastX, 1, 8, 'red'));\n this.container.append(newSegment(vp, e.classNames, idxTo, 8, targetX, lastX - targetX, 1, 'green'));\n this.container.append(newSegment(vp, e.classNames, idxTo, 8, targetX, 1, 11, 'blue'));\n } else if (directionY === 'toUp') {\n this.container.append(newSegment(vp, e.classNames, idxTo, 30, targetX + 1, lastX - targetX, 1, 'red'));\n this.container.append(newSegment(vp, e.classNames, idxTo, 19, targetX + 1, 1, 11, 'blue'));\n }\n }\n }\n}\n","import { TimelineViewParameters } from '../wp-timeline';\n\nexport const timelineStaticElementCssClassname = 'wp-timeline--static-element';\n\nexport abstract class TimelineStaticElement {\n constructor() {\n }\n\n /**\n * Render the static element according to the current ViewParameters\n * @param vp Current timeline view paraemters\n * @returns {HTMLElement} The finished static element\n */\n public render(vp:TimelineViewParameters):HTMLElement {\n const elem = document.createElement('div');\n elem.id = this.identifier;\n elem.classList.add(...this.classNames);\n\n return this.finishElement(elem, vp);\n }\n\n protected abstract finishElement(elem:HTMLElement, vp:TimelineViewParameters):HTMLElement;\n\n public abstract get identifier():string;\n\n public get classNames():string[] {\n return [timelineStaticElementCssClassname];\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport * as moment from 'moment';\nimport { calculatePositionValueForDayCount, TimelineViewParameters } from '../wp-timeline';\nimport { TimelineStaticElement } from './timeline-static-element';\n\nexport class TodayLineElement extends TimelineStaticElement {\n protected finishElement(elem:HTMLElement, vp:TimelineViewParameters):HTMLElement {\n const offsetToday = vp.now.diff(vp.dateDisplayStart, 'days');\n const dayProgress = moment().hour() / 24;\n elem.style.left = calculatePositionValueForDayCount(vp, offsetToday + dayProgress);\n\n return elem;\n }\n\n public get identifier():string {\n return 'wp-timeline-static-element-today-line';\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport {\n Component,\n ElementRef,\n OnInit,\n} from '@angular/core';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport { TimelineViewParameters } from '../wp-timeline';\nimport {\n TimelineStaticElement,\n timelineStaticElementCssClassname,\n} from './timeline-static-element';\nimport { TodayLineElement } from './wp-timeline.today-line';\n\n@Component({\n selector: 'wp-timeline-static-elements',\n template: '
    '\n})\nexport class WorkPackageTableTimelineStaticElements implements OnInit {\n public $element:HTMLElement;\n\n private container:HTMLElement;\n\n private elements:TimelineStaticElement[];\n\n constructor(elementRef:ElementRef,\n public states:States,\n public workPackageTimelineTableController:WorkPackageTimelineTableController) {\n this.$element = elementRef.nativeElement;\n\n this.elements = [\n new TodayLineElement(),\n ];\n }\n\n ngOnInit() {\n this.container = this.$element.querySelector('.wp-table-timeline--static-elements') as HTMLElement;\n this.workPackageTimelineTableController\n .onRefreshRequested('static elements', (vp:TimelineViewParameters) => this.update(vp));\n }\n\n private update(vp:TimelineViewParameters) {\n this.removeAllVisibleElements();\n this.renderElements(vp);\n }\n\n private removeAllVisibleElements() {\n this\n .container\n .querySelectorAll(`.${timelineStaticElementCssClassname}`)\n .forEach((el) => el.remove());\n }\n\n private renderElements(vp:TimelineViewParameters) {\n for (const e of this.elements) {\n this.container.appendChild(e.render(vp));\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n} from '@angular/core';\nimport * as moment from 'moment';\nimport { TimelineZoomLevel } from 'core-app/features/hal/resources/query-resource';\nimport { WorkPackageTimelineTableController } from '../container/wp-timeline-container.directive';\nimport {\n calculatePositionValueForDayCount,\n getTimeSlicesForHeader,\n timelineElementCssClass,\n timelineGridElementCssClass,\n TimelineViewParameters,\n} from '../wp-timeline';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\nimport Moment = moment.Moment;\n\n@Component({\n selector: 'wp-timeline-grid',\n template: '
    ',\n})\nexport class WorkPackageTableTimelineGrid implements AfterViewInit {\n private activeZoomLevel:TimelineZoomLevel;\n\n private gridContainer:JQuery;\n\n constructor(\n private elementRef:ElementRef,\n public wpTimeline:WorkPackageTimelineTableController,\n private weekdaysService:WeekdayService,\n ) {}\n\n ngAfterViewInit():void {\n const $element = jQuery(this.elementRef.nativeElement);\n this.gridContainer = $element.find('.wp-table-timeline--grid');\n this.wpTimeline.onRefreshRequested('grid', (vp:TimelineViewParameters) => this.refreshView(vp));\n }\n\n refreshView(vp:TimelineViewParameters):void {\n this.renderLabels(vp);\n }\n\n private renderLabels(vp:TimelineViewParameters):void {\n this.gridContainer.empty();\n\n switch (vp.settings.zoomLevel) {\n case 'days':\n this.renderLabelsDays(vp);\n break;\n case 'weeks':\n this.renderLabelsWeeks(vp);\n break;\n case 'months':\n this.renderLabelsMonths(vp);\n break;\n case 'quarters':\n this.renderLabelsQuarters(vp);\n break;\n case 'years':\n this.renderLabelsYears(vp);\n break;\n default:\n return;\n }\n\n this.activeZoomLevel = vp.settings.zoomLevel;\n }\n\n private renderLabelsDays(vp:TimelineViewParameters):void {\n this.renderTimeSlices(vp, 'day', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.style.paddingTop = '1px';\n this.checkForNonWorkingDayHighlight(start, cell);\n });\n\n this.renderTimeSlices(vp, 'year', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n cell.style.zIndex = '2';\n });\n }\n\n private renderLabelsWeeks(vp:TimelineViewParameters):void {\n this.renderTimeSlices(vp, 'day', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n this.checkForNonWorkingDayHighlight(start, cell);\n });\n\n this.renderTimeSlices(vp, 'week', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n });\n\n this.renderTimeSlices(vp, 'year', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n cell.style.zIndex = '2';\n });\n }\n\n private renderLabelsMonths(vp:TimelineViewParameters):void {\n this.renderTimeSlices(vp, 'week', vp.dateDisplayStart, vp.dateDisplayEnd, () => {\n });\n\n this.renderTimeSlices(vp, 'month', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n });\n\n this.renderTimeSlices(vp, 'year', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n cell.style.zIndex = '2';\n });\n }\n\n private renderLabelsQuarters(vp:TimelineViewParameters):void {\n this.renderTimeSlices(vp, 'month', vp.dateDisplayStart, vp.dateDisplayEnd, () => {\n });\n\n this.renderTimeSlices(vp, 'quarter', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n });\n\n this.renderTimeSlices(vp, 'year', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n cell.style.zIndex = '2';\n });\n }\n\n private renderLabelsYears(vp:TimelineViewParameters):void {\n this.renderTimeSlices(vp, 'month', vp.dateDisplayStart, vp.dateDisplayEnd, () => {\n });\n\n this.renderTimeSlices(vp, 'year', vp.dateDisplayStart, vp.dateDisplayEnd, (start, cell) => {\n cell.classList.add('wp-timeline--grid-element_highlight');\n });\n }\n\n renderTimeSlices(vp:TimelineViewParameters,\n unit:moment.unitOfTime.DurationConstructor,\n startView:Moment,\n endView:Moment,\n cellCallback:(start:Moment, cell:HTMLElement) => void):void {\n const { inViewportAndBoundaries, rest } = getTimeSlicesForHeader(vp, unit, startView, endView);\n\n for (const [start, end] of inViewportAndBoundaries) {\n const cell = document.createElement('div');\n cell.classList.add(timelineElementCssClass, timelineGridElementCssClass);\n cell.style.left = calculatePositionValueForDayCount(vp, start.diff(startView, 'days'));\n cell.style.width = calculatePositionValueForDayCount(vp, end.diff(start, 'days') + 1);\n this.gridContainer[0].appendChild(cell);\n cellCallback(start, cell);\n }\n setTimeout(() => {\n for (const [start, end] of rest) {\n const cell = document.createElement('div');\n cell.classList.add(timelineElementCssClass, timelineGridElementCssClass);\n cell.style.left = calculatePositionValueForDayCount(vp, start.diff(startView, 'days'));\n cell.style.width = calculatePositionValueForDayCount(vp, end.diff(start, 'days') + 1);\n this.gridContainer[0].appendChild(cell);\n cellCallback(start, cell);\n }\n }, 0);\n }\n\n private checkForNonWorkingDayHighlight(date:Moment, cell:HTMLElement) {\n const day = date.toDate();\n if (this.weekdaysService.isNonWorkingDay(day) || this.wpTimeline.isNonWorkingDay(day)) {\n cell.classList.add('wp-timeline--non-working-day');\n cell.dataset.qaSelector = `wp-timeline--non-working-day_${day.getDate()}-${day.getMonth() + 1}-${day.getFullYear()}`;\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { WorkPackageWatchersTabComponent } from './watchers-tab.component';\n\n@Component({\n templateUrl: './wp-watcher-entry.component.html',\n styleUrls: ['./wp-watcher-entry.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'op-wp-watcher-entry',\n})\nexport class WorkPackageWatcherEntryComponent implements OnInit {\n @Input() public watcher:UserResource;\n\n public text:{ remove:string };\n\n constructor(readonly I18n:I18nService,\n readonly panelCtrl:WorkPackageWatchersTabComponent) {\n }\n\n ngOnInit():void {\n this.text = {\n remove: this.I18n.t('js.label_remove_watcher', { name: this.watcher.name }),\n };\n }\n\n public remove():void {\n this.panelCtrl.removeWatcher(this.watcher);\n }\n}\n","
    \n \n \n \n \n \n \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit, Directive, ElementRef, Injector, Input,\n} from '@angular/core';\nimport { takeUntil } from 'rxjs/operators';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { WorkPackageViewSumService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sum.service';\nimport { combineLatest } from 'rxjs';\nimport { GroupSumsBuilder } from 'core-app/features/work-packages/components/wp-fast-table/builders/modes/grouped/group-sums-builder';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\n\n@Directive({\n selector: '[wpTableSumsRow]',\n host: {\n '[class.-hidden]': 'isHidden',\n },\n})\nexport class WorkPackageTableSumsRowController implements AfterViewInit {\n @Input('wpTableSumsRow-table') workPackageTable:WorkPackageTable;\n\n public isHidden = true;\n\n private text:{ sum:string };\n\n private element:HTMLTableRowElement;\n\n private groupSumsBuilder:GroupSumsBuilder;\n\n constructor(readonly injector:Injector,\n readonly elementRef:ElementRef,\n readonly querySpace:IsolatedQuerySpace,\n readonly states:States,\n readonly schemaCache:SchemaCacheService,\n readonly wpTableColumns:WorkPackageViewColumnsService,\n readonly wpTableSums:WorkPackageViewSumService,\n readonly I18n:I18nService) {\n this.text = {\n sum: I18n.t('js.label_total_sum'),\n };\n }\n\n ngAfterViewInit():void {\n this.element = this.elementRef.nativeElement;\n\n combineLatest([\n this.wpTableColumns.live$(),\n this.wpTableSums.live$(),\n this.querySpace.results.values$(),\n ])\n .pipe(\n takeUntil(this.querySpace.stopAllSubscriptions),\n )\n .subscribe(([columns, sum, resource]) => {\n this.isHidden = !sum;\n if (sum && resource.sumsSchema) {\n this.schemaCache\n .ensureLoaded(resource.sumsSchema.href!)\n .then((schema:SchemaResource) => {\n this.refresh(columns, resource, schema);\n });\n } else {\n this.clear();\n }\n });\n }\n\n private clear() {\n this.element.innerHTML = '';\n }\n\n private refresh(columns:QueryColumn[], resource:WorkPackageCollectionResource, schema:SchemaResource) {\n this.clear();\n this.render(columns, resource, schema);\n }\n\n private render(columns:QueryColumn[], resource:WorkPackageCollectionResource, schema:SchemaResource) {\n this.groupSumsBuilder = new GroupSumsBuilder(this.injector, this.workPackageTable);\n this.groupSumsBuilder.text = this.text;\n this.groupSumsBuilder.renderColumns(resource.totalSums!, this.element);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component,\n Inject,\n Input,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { OpUnlinkTableAction } from 'core-app/features/work-packages/components/wp-table/table-actions/actions/unlink-table-action';\nimport { OpTableActionFactory } from 'core-app/features/work-packages/components/wp-table/table-actions/table-action';\nimport { WorkPackageInlineCreateService } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport { WorkPackageRelationQueryBase } from 'core-app/features/work-packages/components/wp-relations/embedded/wp-relation-query.base';\nimport { WpRelationInlineCreateService } from 'core-app/features/work-packages/components/wp-relations/embedded/relations/wp-relation-inline-create.service';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { filter } from 'rxjs/operators';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { GroupDescriptor } from 'core-app/features/work-packages/components/wp-single-view/wp-single-view.component';\n\n@Component({\n selector: 'wp-relation-query',\n templateUrl: '../wp-relation-query.html',\n providers: [\n { provide: WorkPackageInlineCreateService, useClass: WpRelationInlineCreateService },\n ],\n})\nexport class WorkPackageRelationQueryComponent extends WorkPackageRelationQueryBase implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public query:QueryResource;\n\n @Input() public group:GroupDescriptor;\n\n public tableActions:OpTableActionFactory[] = [\n OpUnlinkTableAction.factoryFor(\n 'remove-relation-action',\n this.I18n.t('js.relation_buttons.remove'),\n (relatedTo:WorkPackageResource) => {\n if (!this.embeddedTable) {\n return;\n }\n\n this.embeddedTable.loadingIndicator = this.wpRelations.require(relatedTo.id!)\n .then(() => this.wpInlineCreate.remove(this.workPackage, relatedTo))\n .then(() => this.refreshTable())\n .catch((error) => this.notificationService.handleRawError(error, this.workPackage));\n },\n (child:WorkPackageResource) => !!child.changeParent,\n ),\n ];\n\n public idFromLink = idFromLink;\n\n constructor(protected readonly PathHelper:PathHelperService,\n @Inject(WorkPackageInlineCreateService) protected readonly wpInlineCreate:WpRelationInlineCreateService,\n protected readonly wpRelations:WorkPackageRelationsService,\n protected readonly halEvents:HalEventsService,\n protected readonly queryUrlParamsHelper:UrlParamsHelperService,\n protected readonly notificationService:WorkPackageNotificationService,\n protected readonly I18n:I18nService) {\n super(queryUrlParamsHelper);\n }\n\n ngOnInit() {\n const relationType = this.getRelationTypeFromQuery();\n\n // Set reference target and reference class\n this.wpInlineCreate.referenceTarget = this.workPackage;\n this.wpInlineCreate.relationType = relationType;\n\n // Set up the query props\n this.queryProps = this.buildQueryProps();\n\n // Wire the successful saving of a new addition to refreshing the embedded table\n this.wpInlineCreate.newInlineWorkPackageCreated\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((toId:string) => this.addRelation(toId));\n\n // When relations have changed, refresh this table\n this.wpRelations.observe(this.workPackage.id!)\n .pipe(\n filter((val) => !_.isEmpty(val)),\n this.untilDestroyed(),\n )\n .subscribe(() => this.refreshTable());\n }\n\n private addRelation(toId:string) {\n this.wpInlineCreate\n .add(this.workPackage, toId)\n .then(() => {\n this.halEvents.push(this.workPackage, {\n eventType: 'association',\n relatedWorkPackage: toId,\n relationType: this.getRelationTypeFromQuery(),\n });\n })\n .catch((error) => this.notificationService.handleRawError(error, this.workPackage));\n }\n\n private getRelationTypeFromQuery() {\n return this.group.relationType!;\n }\n}\n","import { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { Component, Injector } from '@angular/core';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { WpTableConfigurationModalComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\n\n@Component({\n templateUrl: './config-menu.template.html',\n selector: 'wp-table-config-menu',\n})\nexport class WorkPackagesTableConfigMenuComponent {\n public text = {\n configureTable: this.I18n.t('js.toolbar.settings.configure_view'),\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly injector:Injector,\n readonly opModalService:OpModalService,\n readonly opContextMenu:OPContextMenuService,\n ) { }\n\n public openTableConfigurationModal() {\n this.opContextMenu.close();\n this.opModalService.show(WpTableConfigurationModalComponent, this.injector);\n }\n}\n","\n \n\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UIRouterModule } from '@uirouter/angular';\nimport { WpTabWrapperComponent } from 'core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/wp-tab-wrapper.component';\nimport { DynamicModule } from 'ng-dynamic-component';\nimport { OpenprojectTabsModule } from 'core-app/shared/components/tabs/openproject-tabs.module';\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\nimport { WpTabsComponent } from './components/wp-tabs/wp-tabs.component';\n\n@NgModule({\n declarations: [\n WpTabsComponent,\n WpTabWrapperComponent,\n ],\n imports: [\n CommonModule,\n UIRouterModule,\n DynamicModule,\n OpenprojectTabsModule,\n IconModule,\n ],\n exports: [\n WpTabsComponent,\n WpTabWrapperComponent,\n ],\n})\nexport class OpWpTabsModule {\n}\n","\n \n \n \n {{ descriptor.label }}\n *\n \n \n \n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component,\n HostBinding,\n Injector,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { EditFormComponent } from 'core-app/shared/components/fields/edit/edit-form/edit-form.component';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport {\n FieldDescriptor,\n GroupDescriptor,\n} from 'core-app/features/work-packages/components/wp-single-view/wp-single-view.component';\n\n@Component({\n selector: 'wp-attribute-group',\n templateUrl: './wp-attribute-group.template.html',\n styleUrls: ['./wp-attribute-group.component.sass'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class WorkPackageFormAttributeGroupComponent extends UntilDestroyedMixin {\n @HostBinding('class.wp-attribute-group') className = true;\n\n @Input() public workPackage:WorkPackageResource;\n\n @Input() public group:GroupDescriptor;\n\n constructor(readonly I18n:I18nService,\n public wpEditForm:EditFormComponent,\n protected injector:Injector) {\n super();\n }\n\n public trackByName(_index:number, elem:{ name:string }) {\n return elem.name;\n }\n\n /**\n * Hide read-only fields, but only when in the create mode\n * @param {FieldDescriptor} field\n */\n public shouldHideField(descriptor:FieldDescriptor) {\n const field = descriptor.field || descriptor.fields![0];\n return this.wpEditForm.editMode && !field.writable;\n }\n\n public fieldName(name:string) {\n if (name === 'startDate') {\n return 'combinedDate';\n }\n return name;\n }\n}\n","import { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\n\nexport class TimeEntryChangeset extends ResourceChangeset {\n public setValue(key:string, val:any) {\n super.setValue(key, val);\n\n // Update the form for fields that may alter the form itself\n if (key === 'workPackage') {\n this.updateForm();\n }\n }\n\n protected buildPayloadFromChanges() {\n const payload = super.buildPayloadFromChanges();\n\n // we ignore the project and instead rely completely on the work package.\n delete payload._links.project;\n\n return payload;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CookieService } from 'ngx-cookie-service';\n\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\nimport { OpSpotModule } from 'core-app/spot/spot.module';\n\nimport { StorageComponent } from 'core-app/shared/components/storages/storage/storage.component';\nimport {\n FileLinkListItemComponent,\n} from 'core-app/shared/components/storages/file-link-list-item/file-link-list-item.component';\nimport {\n StorageInformationComponent,\n} from 'core-app/shared/components/storages/storage-information/storage-information.component';\nimport {\n FilePickerModalComponent,\n} from 'core-app/shared/components/storages/file-picker-modal/file-picker-modal.component';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { SortFilesPipe } from 'core-app/shared/components/storages/pipes/sort-files.pipe';\nimport {\n StorageFileListItemComponent,\n} from 'core-app/shared/components/storages/storage-file-list-item/storage-file-list-item.component';\nimport {\n LocationPickerModalComponent,\n} from 'core-app/shared/components/storages/location-picker-modal/location-picker-modal.component';\nimport {\n LoadingFileListComponent,\n} from 'core-app/shared/components/storages/loading-file-list/loading-file-list.component';\nimport {\n UploadConflictModalComponent,\n} from 'core-app/shared/components/storages/upload-conflict-modal/upload-conflict-modal.component';\n\n@NgModule({\n imports: [\n CommonModule,\n IconModule,\n OpSpotModule,\n OpSharedModule,\n ],\n declarations: [\n StorageComponent,\n FileLinkListItemComponent,\n FilePickerModalComponent,\n LocationPickerModalComponent,\n LoadingFileListComponent,\n StorageInformationComponent,\n StorageFileListItemComponent,\n SortFilesPipe,\n UploadConflictModalComponent,\n ],\n exports: [\n StorageComponent,\n ],\n providers: [\n SortFilesPipe,\n CookieService,\n ],\n})\nexport class OpenprojectStoragesModule {}\n","
    \n\n \n \n \n \n\n \n {{headerColumn.name}}\n {{headerColumn.name}}\n\n \n \n\n \n \n \n {{columnName}}\n \n \n \n\n \n \n\n \n\n \n {{headerColumn.name}}\n\n {{headerColumn.name}}\n\n \n \n\n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit, ChangeDetectorRef, Component, ElementRef, Input,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { RelationQueryColumn, TypeRelationQueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { QUERY_SORT_BY_ASC, QUERY_SORT_BY_DESC } from 'core-app/features/hal/resources/query-sort-by-resource';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport { WorkPackageViewRelationColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-relation-columns.service';\nimport { combineLatest } from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\n@Component({\n selector: 'sortHeader',\n templateUrl: './sort-header.directive.html',\n})\nexport class SortHeaderDirective extends UntilDestroyedMixin implements AfterViewInit {\n @Input() headerColumn:any;\n\n @Input() locale:string;\n\n @Input() table:WorkPackageTable;\n\n sortable:boolean;\n\n directionClass:string;\n\n public text = {\n toggleHierarchy: this.I18n.t('js.work_packages.hierarchy.show'),\n openMenu: this.I18n.t('js.label_open_menu'),\n sortColumn: 'Sorting column', // TODO\n };\n\n isHierarchyColumn:boolean;\n\n columnType:'hierarchy'|'relation'|'sort';\n\n columnName:string;\n\n hierarchyIcon:string;\n\n isHierarchyDisabled:boolean;\n\n private element:JQuery;\n\n private currentSortDirection:any;\n\n constructor(private wpTableHierarchies:WorkPackageViewHierarchiesService,\n private wpTableSortBy:WorkPackageViewSortByService,\n private wpTableGroupBy:WorkPackageViewGroupByService,\n private wpTableRelationColumns:WorkPackageViewRelationColumnsService,\n private elementRef:ElementRef,\n private cdRef:ChangeDetectorRef,\n private I18n:I18nService) {\n super();\n }\n\n ngAfterViewInit() {\n setTimeout(() => this.initialize());\n }\n\n private initialize():void {\n this.element = jQuery(this.elementRef.nativeElement);\n\n combineLatest([\n this.wpTableSortBy.onReadyWithAvailable(),\n this.wpTableSortBy.live$(),\n ])\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n const latestSortElement = this.wpTableSortBy.current[0];\n\n if (!latestSortElement || this.headerColumn.href !== latestSortElement.column.href) {\n this.currentSortDirection = null;\n } else {\n this.currentSortDirection = latestSortElement.direction;\n }\n this.setActiveColumnClass();\n\n this.sortable = this.wpTableSortBy.isSortable(this.headerColumn);\n\n this.directionClass = this.getDirectionClass();\n\n this.cdRef.detectChanges();\n });\n\n // Place the hierarchy icon left to the subject column\n this.isHierarchyColumn = this.headerColumn.id === 'subject';\n\n if (this.headerColumn.id === 'sortHandle') {\n this.columnType = 'sort';\n }\n if (this.isHierarchyColumn) {\n this.columnType = 'hierarchy';\n } else if (this.wpTableRelationColumns.relationColumnType(this.headerColumn) === 'toType') {\n this.columnType = 'relation';\n this.columnName = (this.headerColumn as TypeRelationQueryColumn).type.name;\n } else if (this.wpTableRelationColumns.relationColumnType(this.headerColumn) === 'ofType') {\n this.columnType = 'relation';\n this.columnName = I18n.t(`js.relation_labels.${(this.headerColumn as RelationQueryColumn).relationType}`);\n }\n\n if (this.isHierarchyColumn) {\n this.hierarchyIcon = 'icon-hierarchy';\n this.isHierarchyDisabled = this.wpTableGroupBy.isEnabled;\n\n // Disable hierarchy mode when group by is active\n this.wpTableGroupBy\n .live$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n this.isHierarchyDisabled = this.wpTableGroupBy.isEnabled;\n this.cdRef.detectChanges();\n });\n\n // Update hierarchy icon when updated elsewhere\n this.wpTableHierarchies\n .live$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n this.setHierarchyIcon();\n this.cdRef.detectChanges();\n });\n\n // Set initial icon\n this.setHierarchyIcon();\n }\n\n this.cdRef.detectChanges();\n }\n\n public get displayDropdownIcon() {\n return this.table && this.table.configuration.columnMenuEnabled;\n }\n\n public get displayHierarchyIcon() {\n return this.table && this.table.configuration.hierarchyToggleEnabled;\n }\n\n toggleHierarchy(evt:JQuery.TriggeredEvent) {\n if (this.wpTableHierarchies.toggleState()) {\n this.wpTableGroupBy.disable();\n }\n\n this.setHierarchyIcon();\n\n evt.stopPropagation();\n return false;\n }\n\n setHierarchyIcon() {\n if (this.wpTableHierarchies.isEnabled) {\n this.text.toggleHierarchy = I18n.t('js.work_packages.hierarchy.hide');\n this.hierarchyIcon = 'icon-hierarchy';\n } else {\n this.text.toggleHierarchy = I18n.t('js.work_packages.hierarchy.show');\n this.hierarchyIcon = 'icon-no-hierarchy';\n }\n }\n\n private getDirectionClass():string {\n if (!this.currentSortDirection) {\n return '';\n }\n\n switch (this.currentSortDirection.href) {\n case QUERY_SORT_BY_ASC:\n return 'asc';\n case QUERY_SORT_BY_DESC:\n return 'desc';\n default:\n return '';\n }\n }\n\n setActiveColumnClass() {\n this.element.toggleClass('active-column', !!this.currentSortDirection);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Injector,\n NgModule,\n} from '@angular/core';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { OpenprojectFieldsModule } from 'core-app/shared/components/fields/openproject-fields.module';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { WorkPackageEmbeddedTableComponent } from 'core-app/features/work-packages/components/wp-table/embedded/wp-embedded-table.component';\nimport { WorkPackageEmbeddedTableEntryComponent } from 'core-app/features/work-packages/components/wp-table/embedded/wp-embedded-table-entry.component';\nimport { WorkPackageTablePaginationComponent } from 'core-app/features/work-packages/components/wp-table/table-pagination/wp-table-pagination.component';\nimport { WorkPackageTimelineTableController } from 'core-app/features/work-packages/components/wp-table/timeline/container/wp-timeline-container.directive';\nimport { WorkPackageInlineCreateComponent } from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.component';\nimport { OpTypesContextMenuDirective } from 'core-app/shared/components/op-context-menu/handlers/op-types-context-menu.directive';\nimport { OpColumnsContextMenu } from 'core-app/shared/components/op-context-menu/handlers/op-columns-context-menu.directive';\nimport { OpSettingsMenuDirective } from 'core-app/shared/components/op-context-menu/handlers/op-settings-dropdown-menu.directive';\nimport { WorkPackageStatusDropdownDirective } from 'core-app/shared/components/op-context-menu/handlers/wp-status-dropdown-menu.directive';\nimport { WorkPackageCreateSettingsMenuDirective } from 'core-app/shared/components/op-context-menu/handlers/wp-create-settings-menu.directive';\nimport { WorkPackageSingleContextMenuDirective } from 'core-app/shared/components/op-context-menu/wp-context-menu/wp-single-context-menu';\nimport { WorkPackageTimelineHeaderController } from 'core-app/features/work-packages/components/wp-table/timeline/header/wp-timeline-header.directive';\nimport { WorkPackageTableTimelineRelations } from 'core-app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-relations.directive';\nimport { WorkPackageTableTimelineStaticElements } from 'core-app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-static-elements.directive';\nimport { WorkPackageTableTimelineGrid } from 'core-app/features/work-packages/components/wp-table/timeline/grid/wp-timeline-grid.directive';\nimport { WorkPackageTimelineButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-timeline-toggle-button/wp-timeline-toggle-button.component';\nimport { WorkPackageOverviewTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/overview-tab/overview-tab.component';\nimport { WorkPackageStatusButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-status-button/wp-status-button.component';\nimport { WorkPackageReplacementLabelComponent } from 'core-app/features/work-packages/components/wp-edit/wp-edit-field/wp-replacement-label.component';\nimport { NewestActivityOnOverviewComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-on-overview.component';\nimport { WorkPackageActivityTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-tab.component';\nimport { OpenprojectAttachmentsModule } from 'core-app/shared/components/attachments/openproject-attachments.module';\nimport { WpCustomActionComponent } from 'core-app/features/work-packages/components/wp-custom-actions/wp-custom-actions/wp-custom-action.component';\nimport { WpCustomActionsComponent } from 'core-app/features/work-packages/components/wp-custom-actions/wp-custom-actions.component';\nimport { WorkPackageRelationsTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/relations-tab/relations-tab.component';\nimport { WorkPackageRelationsComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relations.component';\nimport { WorkPackageRelationsGroupComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relations-group/wp-relations-group.component';\nimport { WorkPackageRelationRowComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relation-row/wp-relation-row.component';\nimport { WorkPackageRelationsCreateComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-create.component';\nimport { WorkPackageRelationsHierarchyComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.directive';\nimport { WorkPackageCreateButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-create-button/wp-create-button.component';\nimport { WorkPackageFilterButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-filter-button/wp-filter-button.component';\nimport { WorkPackageDetailsViewButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-details-view-button/wp-details-view-button.component';\nimport { WorkPackageFoldToggleButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-fold-toggle-button/wp-fold-toggle-button.component';\nimport { WpTableConfigurationModalComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\nimport { WpTableConfigurationColumnsTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/columns-tab.component';\nimport { WpTableConfigurationDisplaySettingsTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/display-settings-tab.component';\nimport { WpTableConfigurationFiltersTab } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/filters-tab.component';\nimport { WpTableConfigurationSortByTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/sort-by-tab.component';\nimport { WpTableConfigurationTimelinesTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/timelines-tab.component';\nimport { WpTableConfigurationHighlightingTabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/highlighting-tab.component';\nimport { WpTableConfigurationRelationSelectorComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration-relation-selector';\nimport { WorkPackageWatchersTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/watchers-tab.component';\nimport { WorkPackageWatcherEntryComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watcher-entry.component';\nimport { WorkPackageNewSplitViewComponent } from 'core-app/features/work-packages/components/wp-new/wp-new-split-view.component';\nimport { WorkPackageNewFullViewComponent } from 'core-app/features/work-packages/components/wp-new/wp-new-full-view.component';\nimport { EmbeddedTablesMacroComponent } from 'core-app/features/work-packages/components/wp-table/embedded/embedded-tables-macro.component';\nimport { OpenprojectEditorModule } from 'core-app/shared/components/editor/openproject-editor.module';\nimport { WorkPackageTableSumsRowController } from 'core-app/features/work-packages/components/wp-table/wp-table-sums-row/wp-table-sums-row.directive';\nimport { ExternalQueryConfigurationComponent } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.component';\nimport { ExternalQueryConfigurationService } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.service';\nimport { ExternalRelationQueryConfigurationComponent } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.component';\nimport { ExternalRelationQueryConfigurationService } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.service';\nimport { WorkPackagesListInvalidQueryService } from 'core-app/features/work-packages/components/wp-list/wp-list-invalid-query.service';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { WorkPackageWatchersService } from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watchers.service';\nimport { WorkPackagesActivityService } from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/wp-activity.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageChildrenQueryComponent } from 'core-app/features/work-packages/components/wp-relations/embedded/children/wp-children-query.component';\nimport { WpRelationInlineAddExistingComponent } from 'core-app/features/work-packages/components/wp-relations/embedded/inline/add-existing/wp-relation-inline-add-existing.component';\nimport { WorkPackageRelationQueryComponent } from 'core-app/features/work-packages/components/wp-relations/embedded/relations/wp-relation-query.component';\nimport { WorkPackagesBaseComponent } from 'core-app/features/work-packages/routing/wp-base/wp--base.component';\nimport { WorkPackageSplitViewComponent } from 'core-app/features/work-packages/routing/wp-split-view/wp-split-view.component';\nimport { WorkPackagesFullViewComponent } from 'core-app/features/work-packages/routing/wp-full-view/wp-full-view.component';\nimport { QueryFiltersService } from 'core-app/features/work-packages/components/wp-query/query-filters.service';\nimport { WorkPackageCardViewComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport { WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { OpenprojectBcfModule } from 'core-app/features/bim/bcf/openproject-bcf.module';\nimport { WorkPackageRelationsAutocompleteComponent } from 'core-app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-autocomplete/wp-relations-autocomplete.component';\nimport { CustomDateActionAdminComponent } from 'core-app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.component';\nimport { WorkPackagesTableConfigMenuComponent } from 'core-app/features/work-packages/components/wp-table/config-menu/config-menu.component';\nimport { WorkPackageViewToggleButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-view-toggle-button/work-package-view-toggle-button.component';\nimport { WorkPackageViewDropdownMenuDirective } from 'core-app/shared/components/op-context-menu/handlers/wp-view-dropdown-menu.directive';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { OpenprojectProjectsModule } from 'core-app/features/projects/openproject-projects.module';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { WorkPackageEditActionsBarComponent } from 'core-app/features/work-packages/components/edit-actions-bar/wp-edit-actions-bar.component';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { WorkPackageSingleCardComponent } from 'core-app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component';\nimport { WorkPackageListViewComponent } from 'core-app/features/work-packages/routing/wp-list-view/wp-list-view.component';\nimport { PartitionedQuerySpacePageComponent } from 'core-app/features/work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component';\nimport { WorkPackageViewPageComponent } from 'core-app/features/work-packages/routing/wp-view-page/wp-view-page.component';\nimport { WorkPackageSettingsButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-settings-button/wp-settings-button.component';\nimport { BackButtonComponent } from 'core-app/features/work-packages/components/back-routing/back-button.component';\nimport { WorkPackagesTableComponent } from 'core-app/features/work-packages/components/wp-table/wp-table.component';\nimport { WorkPackageGroupToggleDropdownMenuDirective } from 'core-app/shared/components/op-context-menu/handlers/wp-group-toggle-dropdown-menu.directive';\nimport { OpenprojectAutocompleterModule } from 'core-app/shared/components/autocompleter/openproject-autocompleter.module';\nimport { OpWpTabsModule } from 'core-app/features/work-packages/components/wp-tabs/wp-tabs.module';\nimport { EditFieldControlsModule } from 'core-app/shared/components/fields/edit/field-controls/edit-field-controls.module';\nimport { WpTableExportModalComponent } from 'core-app/shared/components/modals/export-modal/wp-table-export.modal';\nimport { WpButtonMacroModalComponent } from 'core-app/shared/components/modals/editor/macro-wp-button-modal/wp-button-macro.modal';\nimport { QuerySharingModalComponent } from 'core-app/shared/components/modals/share-modal/query-sharing.modal';\nimport { SaveQueryModalComponent } from 'core-app/shared/components/modals/save-modal/save-query.modal';\nimport { QuerySharingFormComponent } from 'core-app/shared/components/modals/share-modal/query-sharing-form.component';\nimport { WpDestroyModalComponent } from 'core-app/shared/components/modals/wp-destroy-modal/wp-destroy.modal';\nimport { WorkPackageTypeStatusComponent } from 'core-app/features/work-packages/components/wp-type-status/wp-type-status.component';\nimport { WorkPackageIsolatedQuerySpaceDirective } from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\nimport { WorkPackageBreadcrumbParentComponent } from 'core-app/features/work-packages/components/wp-breadcrumb/wp-breadcrumb-parent.component';\nimport { WorkPackageSubjectComponent } from 'core-app/features/work-packages/components/wp-subject/wp-subject.component';\nimport { WorkPackageBreadcrumbComponent } from 'core-app/features/work-packages/components/wp-breadcrumb/wp-breadcrumb.component';\nimport { UserLinkComponent } from 'core-app/shared/components/user-link/user-link.component';\nimport { WorkPackageCommentComponent } from 'core-app/features/work-packages/components/work-package-comment/work-package-comment.component';\nimport { WorkPackageWatcherButtonComponent } from 'core-app/features/work-packages/components/wp-watcher-button/wp-watcher-button.component';\nimport { WorkPackageCommentFieldComponent } from 'core-app/features/work-packages/components/work-package-comment/wp-comment-field.component';\nimport { WpResizerDirective } from 'core-app/shared/components/resizer/resizer/wp-resizer.component';\nimport {\n GroupDescriptor,\n WorkPackageSingleViewComponent,\n} from 'core-app/features/work-packages/components/wp-single-view/wp-single-view.component';\nimport { WorkPackageIsolatedGraphQuerySpaceDirective } from 'core-app/features/work-packages/directives/query-space/wp-isolated-graph-query-space.directive';\nimport { RevisionActivityComponent } from 'core-app/features/work-packages/components/wp-activity/revision/revision-activity.component';\nimport { WorkPackageCopySplitViewComponent } from 'core-app/features/work-packages/components/wp-copy/wp-copy-split-view.component';\nimport { WorkPackageFormAttributeGroupComponent } from 'core-app/features/work-packages/components/wp-form-group/wp-attribute-group.component';\nimport { WorkPackagesGridComponent } from 'core-app/features/work-packages/components/wp-grid/wp-grid.component';\nimport { ActivityEntryComponent } from 'core-app/features/work-packages/components/wp-activity/activity-entry.component';\nimport { ActivityLinkComponent } from 'core-app/features/work-packages/components/wp-activity/activity-link.component';\nimport { UserActivityComponent } from 'core-app/features/work-packages/components/wp-activity/user/user-activity.component';\nimport { WorkPackageSplitViewToolbarComponent } from 'core-app/features/work-packages/components/wp-details/wp-details-toolbar.component';\nimport { WorkPackageCopyFullViewComponent } from 'core-app/features/work-packages/components/wp-copy/wp-copy-full-view.component';\nimport { OpenprojectTabsModule } from 'core-app/shared/components/tabs/openproject-tabs.module';\nimport { TimeEntryChangeset } from 'core-app/features/work-packages/helpers/time-entries/time-entry-changeset';\n\nimport { OpAttachmentsComponent } from 'core-app/shared/components/attachments/attachments.component';\nimport { QueryFiltersComponent } from 'core-app/features/work-packages/components/filters/query-filters/query-filters.component';\nimport { FilterDateTimesValueComponent } from 'core-app/features/work-packages/components/filters/filter-date-times-value/filter-date-times-value.component';\nimport { FilterSearchableMultiselectValueComponent } from 'core-app/features/work-packages/components/filters/filter-searchable-multiselect-value/filter-searchable-multiselect-value.component';\nimport { QueryFilterComponent } from 'core-app/features/work-packages/components/filters/query-filter/query-filter.component';\nimport { FilterDatesValueComponent } from 'core-app/features/work-packages/components/filters/filter-dates-value/filter-dates-value.component';\nimport { FilterStringValueComponent } from 'core-app/features/work-packages/components/filters/filter-string-value/filter-string-value.component';\nimport { FilterProjectComponent } from 'core-app/features/work-packages/components/filters/filter-project/filter-project.component';\nimport { FilterDateValueComponent } from 'core-app/features/work-packages/components/filters/filter-date-value/filter-date-value.component';\nimport { FilterDateTimeValueComponent } from 'core-app/features/work-packages/components/filters/filter-date-time-value/filter-date-time-value.component';\nimport { FilterToggledMultiselectValueComponent } from 'core-app/features/work-packages/components/filters/filter-toggled-multiselect-value/filter-toggled-multiselect-value.component';\nimport { WorkPackageFilterByTextInputComponent } from 'core-app/features/work-packages/components/filters/quick-filter-by-text-input/quick-filter-by-text-input.component';\nimport { FilterIntegerValueComponent } from 'core-app/features/work-packages/components/filters/filter-integer-value/filter-integer-value.component';\nimport { WorkPackageFilterContainerComponent } from 'core-app/features/work-packages/components/filters/filter-container/filter-container.directive';\nimport { FilterBooleanValueComponent } from 'core-app/features/work-packages/components/filters/filter-boolean-value/filter-boolean-value.component';\nimport { WorkPackageMarkNotificationButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-mark-notification-button/work-package-mark-notification-button.component';\nimport { WorkPackageFilesTabComponent } from 'core-app/features/work-packages/components/wp-single-view-tabs/files-tab/op-files-tab.component';\nimport { WorkPackagesQueryViewService } from 'core-app/features/work-packages/components/wp-list/wp-query-view.service';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { OpenprojectStoragesModule } from 'core-app/shared/components/storages/openproject-storages.module';\nimport { FileLinksResourceService } from 'core-app/core/state/file-links/file-links.service';\nimport { StoragesResourceService } from 'core-app/core/state/storages/storages.service';\nimport { StorageFilesResourceService } from 'core-app/core/state/storage-files/storage-files.service';\n\n@NgModule({\n imports: [\n // Commons\n OpSharedModule,\n // Display + Edit field functionality\n OpenprojectFieldsModule,\n // CKEditor\n OpenprojectEditorModule,\n\n OpenprojectAttachmentsModule,\n\n OpenprojectBcfModule,\n\n OpenprojectProjectsModule,\n\n OpenprojectModalModule,\n\n OpenprojectAutocompleterModule,\n\n OpWpTabsModule,\n\n EditFieldControlsModule,\n OpenprojectTabsModule,\n OpenprojectStoragesModule,\n ],\n providers: [\n // Notification service\n WorkPackageNotificationService,\n\n // External query configuration\n ExternalQueryConfigurationService,\n ExternalRelationQueryConfigurationService,\n\n // Global work package states / services\n SchemaCacheService,\n\n // Global query/table state services\n // For any service that depends on the isolated query space,\n // they should be provided in wp-isolated-query-space.directive instead\n QueryFiltersService,\n WorkPackagesListInvalidQueryService,\n\n // Provide a separate service for creation events of WP Inline create\n // This can be hierarchically injected to provide isolated events on an embedded table\n WorkPackageRelationsService,\n\n WorkPackagesActivityService,\n WorkPackageRelationsService,\n WorkPackageWatchersService,\n\n WorkPackagesQueryViewService,\n\n HalEventsService,\n FileLinksResourceService,\n StorageFilesResourceService,\n\n StoragesResourceService,\n ],\n declarations: [\n // Routing\n WorkPackagesBaseComponent,\n PartitionedQuerySpacePageComponent,\n WorkPackageViewPageComponent,\n\n // WP list side\n WorkPackageListViewComponent,\n WorkPackageSettingsButtonComponent,\n\n // Query injector isolation\n WorkPackageIsolatedQuerySpaceDirective,\n WorkPackageIsolatedGraphQuerySpaceDirective,\n\n // WP New\n WorkPackageNewFullViewComponent,\n WorkPackageNewSplitViewComponent,\n WorkPackageTypeStatusComponent,\n WorkPackageEditActionsBarComponent,\n\n // WP Copy\n WorkPackageCopyFullViewComponent,\n WorkPackageCopySplitViewComponent,\n\n // Embedded table\n WorkPackageEmbeddedTableComponent,\n WorkPackageEmbeddedTableEntryComponent,\n\n // External query configuration\n ExternalQueryConfigurationComponent,\n ExternalRelationQueryConfigurationComponent,\n\n // Inline create\n WorkPackageInlineCreateComponent,\n WpRelationInlineAddExistingComponent,\n\n WorkPackagesGridComponent,\n\n WorkPackagesTableComponent,\n WorkPackagesTableConfigMenuComponent,\n WorkPackageTablePaginationComponent,\n\n WpResizerDirective,\n\n WorkPackageTableSumsRowController,\n\n // Fold/Unfold button on wp list\n WorkPackageFoldToggleButtonComponent,\n\n // Filters\n QueryFiltersComponent,\n QueryFilterComponent,\n FilterBooleanValueComponent,\n FilterDateValueComponent,\n FilterDatesValueComponent,\n FilterDateTimeValueComponent,\n FilterDateTimesValueComponent,\n FilterIntegerValueComponent,\n FilterStringValueComponent,\n FilterProjectComponent,\n FilterToggledMultiselectValueComponent,\n FilterSearchableMultiselectValueComponent,\n\n WorkPackageFilterContainerComponent,\n WorkPackageFilterButtonComponent,\n\n // Context menus\n OpTypesContextMenuDirective,\n OpColumnsContextMenu,\n OpSettingsMenuDirective,\n WorkPackageStatusDropdownDirective,\n WorkPackageCreateSettingsMenuDirective,\n WorkPackageSingleContextMenuDirective,\n WorkPackageViewDropdownMenuDirective,\n WorkPackageGroupToggleDropdownMenuDirective,\n\n // Timeline\n WorkPackageTimelineButtonComponent,\n WorkPackageTimelineHeaderController,\n WorkPackageTableTimelineRelations,\n WorkPackageTableTimelineStaticElements,\n WorkPackageTableTimelineGrid,\n WorkPackageTimelineTableController,\n\n WorkPackageCreateButtonComponent,\n WorkPackageFilterByTextInputComponent,\n\n // Single view\n WorkPackageOverviewTabComponent,\n WorkPackageSingleViewComponent,\n WorkPackageStatusButtonComponent,\n WorkPackageReplacementLabelComponent,\n UserLinkComponent,\n WorkPackageChildrenQueryComponent,\n WorkPackageRelationQueryComponent,\n WorkPackageFormAttributeGroupComponent,\n BackButtonComponent,\n\n // Activity Tab\n NewestActivityOnOverviewComponent,\n WorkPackageCommentComponent,\n WorkPackageCommentFieldComponent,\n ActivityEntryComponent,\n UserActivityComponent,\n RevisionActivityComponent,\n ActivityLinkComponent,\n WorkPackageActivityTabComponent,\n\n // Watchers wp-tab-wrapper\n WorkPackageWatchersTabComponent,\n WorkPackageWatcherEntryComponent,\n\n // Relations\n WorkPackageRelationsTabComponent,\n WorkPackageRelationsComponent,\n WorkPackageRelationsGroupComponent,\n WorkPackageRelationRowComponent,\n WorkPackageRelationsCreateComponent,\n WorkPackageRelationsHierarchyComponent,\n WorkPackageRelationsAutocompleteComponent,\n WorkPackageBreadcrumbParentComponent,\n\n // Files tab\n WorkPackageFilesTabComponent,\n\n // Split view\n WorkPackageDetailsViewButtonComponent,\n WorkPackageSplitViewComponent,\n WorkPackageBreadcrumbComponent,\n WorkPackageSplitViewToolbarComponent,\n WorkPackageWatcherButtonComponent,\n WorkPackageSubjectComponent,\n\n // Full view\n WorkPackagesFullViewComponent,\n\n // Modals\n WpTableConfigurationModalComponent,\n WpTableConfigurationColumnsTabComponent,\n WpTableConfigurationDisplaySettingsTabComponent,\n WpTableConfigurationFiltersTab,\n WpTableConfigurationSortByTabComponent,\n WpTableConfigurationTimelinesTabComponent,\n WpTableConfigurationHighlightingTabComponent,\n WpTableConfigurationRelationSelectorComponent,\n WpTableExportModalComponent,\n QuerySharingFormComponent,\n QuerySharingModalComponent,\n SaveQueryModalComponent,\n WpDestroyModalComponent,\n\n // CustomActions\n WpCustomActionComponent,\n WpCustomActionsComponent,\n CustomDateActionAdminComponent,\n\n // CKEditor macros which could not be included in the\n // editor module to avoid circular dependencies\n EmbeddedTablesMacroComponent,\n WpButtonMacroModalComponent,\n\n // Card view\n WorkPackageCardViewComponent,\n WorkPackageSingleCardComponent,\n WorkPackageViewToggleButtonComponent,\n\n // Notifications\n WorkPackageMarkNotificationButtonComponent,\n ],\n exports: [\n WorkPackagesTableComponent,\n WorkPackageTablePaginationComponent,\n WorkPackageEmbeddedTableComponent,\n WorkPackageEmbeddedTableEntryComponent,\n WorkPackageCardViewComponent,\n WorkPackageSingleCardComponent,\n WorkPackageFilterButtonComponent,\n WorkPackageFilterContainerComponent,\n WorkPackageIsolatedQuerySpaceDirective,\n WorkPackageIsolatedGraphQuerySpaceDirective,\n QueryFiltersComponent,\n\n WpResizerDirective,\n WorkPackageBreadcrumbComponent,\n WorkPackageBreadcrumbParentComponent,\n WorkPackageSplitViewToolbarComponent,\n WorkPackageSubjectComponent,\n WorkPackagesGridComponent,\n\n // Modals\n WpTableConfigurationModalComponent,\n WpTableConfigurationFiltersTab,\n\n // Needed so that e.g. IFC can access it.\n WorkPackageCreateButtonComponent,\n WorkPackageStatusButtonComponent,\n WorkPackageTypeStatusComponent,\n WorkPackageEditActionsBarComponent,\n WorkPackageSingleViewComponent,\n WorkPackageSplitViewComponent,\n BackButtonComponent,\n ],\n})\nexport class OpenprojectWorkPackagesModule {\n static bootstrapAttributeGroupsCalled = false;\n\n constructor(injector:Injector) {\n OpenprojectWorkPackagesModule.bootstrapAttributeGroups(injector);\n }\n\n // The static property prevents running the function\n // multiple times. This happens e.g. when the module is included\n // into a plugin's module.\n public static bootstrapAttributeGroups(injector:Injector):void {\n if (this.bootstrapAttributeGroupsCalled) {\n return;\n }\n\n this.bootstrapAttributeGroupsCalled = true;\n\n const hookService = injector.get(HookService);\n\n hookService.register('attributeGroupComponent', (group:GroupDescriptor, workPackage:WorkPackageResource) => {\n if (group.type === 'WorkPackageFormAttributeGroup') {\n return WorkPackageFormAttributeGroupComponent;\n }\n if (!isNewResource(workPackage) && group.type === 'WorkPackageFormChildrenQueryGroup') {\n return WorkPackageChildrenQueryComponent;\n }\n if (!isNewResource(workPackage) && group.type === 'WorkPackageFormRelationQueryGroup') {\n return WorkPackageRelationQueryComponent;\n }\n return null;\n });\n\n hookService.register('workPackageAttachmentListComponent', () => OpAttachmentsComponent);\n\n /** Return specialized work package changeset for editing service */\n hookService.register('halResourceChangesetClass', (resource:HalResource) => {\n switch (resource._type) {\n case 'WorkPackage':\n return WorkPackageChangeset;\n case 'TimeEntry':\n return TimeEntryChangeset;\n default:\n return null;\n }\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { OpTitleService } from 'core-app/core/html/op-title.service';\nimport { WorkPackagesViewBase } from 'core-app/features/work-packages/routing/wp-view-base/work-packages-view.base';\nimport { take } from 'rxjs/operators';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { QueryParamListenerService } from 'core-app/features/work-packages/components/wp-query/query-param-listener.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ComponentType } from '@angular/cdk/overlay';\nimport { Ng2StateDeclaration } from '@uirouter/angular';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { InviteUserModalComponent } from 'core-app/features/invite-user-modal/invite-user.component';\nimport { WorkPackageFilterContainerComponent } from 'core-app/features/work-packages/components/filters/filter-container/filter-container.directive';\nimport isPersistedResource from 'core-app/features/hal/helpers/is-persisted-resource';\nimport { UIRouterGlobals } from '@uirouter/core';\n\nexport interface DynamicComponentDefinition {\n component:ComponentType;\n inputs?:{ [inputName:string]:any };\n outputs?:{ [outputName:string]:Function };\n}\n\nexport interface ToolbarButtonComponentDefinition extends DynamicComponentDefinition {\n containerClasses?:string;\n show?:() => boolean;\n}\n\nexport type ViewPartitionState = '-split'|'-left-only'|'-right-only';\n\n@Component({\n templateUrl: './partitioned-query-space-page.component.html',\n styleUrls: ['./partitioned-query-space-page.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n /** We need to provide the wpNotification service here to get correct save notifications for WP resources */\n { provide: HalResourceNotificationService, useClass: WorkPackageNotificationService },\n QueryParamListenerService,\n ],\n})\nexport class PartitionedQuerySpacePageComponent extends WorkPackagesViewBase implements OnInit, OnDestroy {\n @InjectField() I18n!:I18nService;\n\n @InjectField() titleService:OpTitleService;\n\n @InjectField() queryParamListener:QueryParamListenerService;\n\n @InjectField() opModalService:OpModalService;\n\n @InjectField() uiRouterGlobals:UIRouterGlobals;\n\n text:{ [key:string]:string } = {\n jump_to_pagination: this.I18n.t('js.work_packages.jump_marks.pagination'),\n text_jump_to_pagination: this.I18n.t('js.work_packages.jump_marks.label_pagination'),\n };\n\n /** Whether the title can be edited */\n titleEditingEnabled:boolean;\n\n /** Current query title to render */\n selectedTitle?:string;\n\n currentQuery:QueryResource|undefined;\n\n /** Whether we're saving the query */\n toolbarDisabled:boolean;\n\n /** Do we currently have query props ? */\n showToolbarSaveButton:boolean;\n\n /** Listener callbacks */\n // eslint-disable-next-line @typescript-eslint/ban-types\n removeTransitionSubscription:Function;\n\n /** Determine when query is initially loaded */\n showToolbar = false;\n\n /** The toolbar buttons to render */\n toolbarButtonComponents:ToolbarButtonComponentDefinition[] = [];\n\n /** Whether filtering is allowed */\n filterAllowed = true;\n\n /** We need to pass the correct partition state to the view to manage the grid */\n currentPartition:ViewPartitionState = '-split';\n\n /** What route (if any) should we go back to using the back button left of the title? */\n backButtonCallback:() => void|undefined;\n\n /** Which filter container component to mount */\n filterContainerDefinition:DynamicComponentDefinition = {\n component: WorkPackageFilterContainerComponent,\n };\n\n ngOnInit():void {\n super.ngOnInit();\n\n this.showToolbarSaveButton = !!this.$state.params.query_props;\n this.setPartition(this.$state.current);\n this.removeTransitionSubscription = this.$transitions.onSuccess({}, (transition):any => {\n const params = transition.params('to');\n const toState = transition.to();\n this.showToolbarSaveButton = !!params.query_props;\n this.setPartition(toState);\n\n const query = this.querySpace.query.value;\n if (query && this.shouldUpdateHtmlTitle()) {\n // Update the title if we're in the list state alone\n this.titleService.setFirstPart(this.queryTitle(query));\n }\n\n this.cdRef.detectChanges();\n });\n\n // Load the query. If it hasn't been loaded before, do that visibly.\n this.loadInitialQuery();\n\n // Mark tableInformationLoaded when initially loading done\n this.setupInformationLoadedListener();\n\n // Load query on URL transitions\n this.queryParamListener\n .observe$\n .pipe(this.untilDestroyed())\n .subscribe(() => {\n /** Ensure we reload the query from the changed props */\n this.currentQuery = undefined;\n void this.refresh(true, true);\n });\n\n this.querySpace.query.values$()\n .pipe(this.untilDestroyed())\n .subscribe((query) => {\n // Update the title whenever the query changes\n this.updateTitle(query);\n this.currentQuery = query;\n });\n }\n\n /**\n * We need to set the current partition to the grid to ensure\n * either side gets expanded to full width if we're not in '-split' mode.\n *\n * @param state The current or entering state\n */\n protected setPartition(state:Ng2StateDeclaration):void {\n this.currentPartition = (state.data && state.data.partition) ? state.data.partition : '-split';\n }\n\n protected setupInformationLoadedListener():void {\n this\n .querySpace\n .initialized\n .values$()\n .pipe(take(1))\n .subscribe(() => {\n this.showToolbar = true;\n this.cdRef.detectChanges();\n });\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n this.removeTransitionSubscription();\n this.queryParamListener.removeQueryChangeListener();\n }\n\n public changeChangesFromTitle(val:string):void {\n if (this.currentQuery && isPersistedResource(this.currentQuery)) {\n this.updateTitleName(val);\n } else {\n this.wpListService\n .create(this.currentQuery!, val)\n .finally(() => { this.toolbarDisabled = false; });\n }\n }\n\n updateTitleName(val:string):void {\n this.toolbarDisabled = true;\n this.currentQuery!.name = val;\n this.wpListService\n .save(this.currentQuery)\n .finally(() => { this.toolbarDisabled = false; });\n }\n\n updateTitle(query?:QueryResource):void {\n // Too early for loaded query\n if (!query) {\n return;\n }\n\n this.selectedTitle = this.queryTitle(query);\n\n this.titleEditingEnabled = this.authorisationService.can('query', 'updateImmediately');\n\n // Update the title if we're in the list state alone\n if (this.shouldUpdateHtmlTitle()) {\n this.titleService.setFirstPart(this.selectedTitle);\n }\n }\n\n refresh(visibly = false, firstPage = false):void {\n let promise = this.loadQuery(firstPage);\n\n if (visibly) {\n promise = promise.then((loadedQuery:QueryResource) => {\n this.wpStatesInitialization.initialize(loadedQuery, loadedQuery.results);\n return this.additionalLoadingTime()\n .then(() => loadedQuery);\n });\n\n this.loadingIndicator = promise;\n } else {\n void promise.then((loadedQuery:QueryResource) => {\n this.wpStatesInitialization.initialize(loadedQuery, loadedQuery.results);\n });\n }\n }\n\n protected inviteModal = InviteUserModalComponent;\n\n protected loadQuery(firstPage = false):Promise {\n let promise:Promise;\n const query = this.currentQuery;\n\n if (firstPage || !query) {\n promise = this.loadFirstPage();\n } else {\n const pagination = this.wpListService.getPaginationInfo();\n promise = this.wpListService\n .loadQueryFromExisting(query, pagination, this.projectIdentifier)\n .toPromise();\n }\n\n return promise;\n }\n\n protected loadFirstPage():Promise {\n if (this.currentQuery) {\n return this.wpListService.reloadQuery(this.currentQuery, this.projectIdentifier).toPromise();\n }\n return this.wpListService.loadCurrentQueryFromParams(this.projectIdentifier);\n }\n\n protected additionalLoadingTime():Promise {\n return Promise.resolve();\n }\n\n protected set loadingIndicator(promise:Promise) {\n this.loadingIndicatorService.table.promise = promise;\n }\n\n protected shouldUpdateHtmlTitle():boolean {\n return true;\n }\n\n protected staticQueryName(query:QueryResource):string {\n return this.opStaticQueries.getStaticName(query);\n }\n\n protected loadInitialQuery():void {\n const isFirstLoad = !this.querySpace.initialized.hasValue();\n this.loadingIndicator = this.loadQuery(isFirstLoad);\n }\n\n private queryTitle(query:QueryResource):string {\n return isPersistedResource(query) ? query.name : this.staticQueryName(query);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { StateService } from '@uirouter/angular';\n\n/**\n * Returns the path to the split view based on the current route\n *\n * @param state State service\n */\nexport function splitViewRoute(state:StateService, target:'details'|'new' = 'details'):string {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment\n const baseRoute:string = state.current.data.baseRoute || '';\n return `${baseRoute}.${target}`;\n}\n","\n \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n \n
    \n\n
    \n \n \n
    \n\n
    \n \n
    \n
    \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageCreateComponent } from 'core-app/features/work-packages/components/wp-new/wp-create.component';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\n\n@Component({\n selector: 'wp-new-split-view',\n templateUrl: './wp-new-split-view.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageNewSplitViewComponent extends WorkPackageCreateComponent {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { WorkPackageCopyController } from 'core-app/features/work-packages/components/wp-copy/wp-copy.controller';\n\n@Component({\n selector: 'wp-copy-split-view',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: '../wp-new/wp-new-split-view.html',\n})\nexport class WorkPackageCopySplitViewComponent extends WorkPackageCopyController {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageNewSplitViewComponent } from 'core-app/features/work-packages/components/wp-new/wp-new-split-view.component';\nimport { Ng2StateDeclaration } from '@uirouter/angular';\nimport { ComponentType } from '@angular/cdk/overlay';\nimport { WpTabWrapperComponent } from 'core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/wp-tab-wrapper.component';\nimport { WorkPackageCopySplitViewComponent } from 'core-app/features/work-packages/components/wp-copy/wp-copy-split-view.component';\n\n/**\n * Return a set of routes for a split view mounted under the given base route,\n * which must be a grandchild of a PartitionedQuerySpacePageComponent.\n *\n * Example: base route = foo.bar\n *\n * Split view will be created at\n *\n * foo.bar.details\n * foo.bar.details.activity\n * foo.bar.details.relations\n * foo.bar.details.watchers\n *\n * NOTE: All parameters here must either be `export const` or literal strings,\n * otherwise AOT will not be able to look them up. This might result in missing routes.\n *\n * @param baseRoute The base route to mount under\n * @param showComponent The split view component to mount\n */\nexport function makeSplitViewRoutes(baseRoute:string,\n menuItemClass:string|undefined,\n showComponent:ComponentType,\n newComponent:ComponentType = WorkPackageNewSplitViewComponent,\n makeFullWidth?:boolean,\n showMobileAlternative = true,\n routeName = baseRoute):Ng2StateDeclaration[] {\n // makeFullWidth configuration\n const views:{ [content:string]:{ component:ComponentType; }; } = makeFullWidth\n ? { 'content-left@^.^': { component: showComponent } }\n : { 'content-right@^.^': { component: showComponent } };\n const partition = makeFullWidth ? '-left-only' : '-split';\n\n return [\n {\n name: `${routeName}.details`,\n url: '/details/{workPackageId:[0-9]+}',\n redirectTo: (trans) => {\n const params = trans.params('to');\n return {\n state: `${routeName}.details.tabs`,\n params: { ...params, tabIdentifier: 'overview' },\n };\n },\n reloadOnSearch: false,\n data: {\n bodyClasses: 'router--work-packages-partitioned-split-view-details',\n menuItem: menuItemClass,\n // Remember the base route so we can route back to it anywhere\n baseRoute,\n newRoute: `${routeName}.new`,\n partition,\n mobileAlternative: showMobileAlternative ? 'work-packages.show' : undefined,\n },\n // Retarget and by that override the grandparent views\n // https://ui-router.github.io/guide/views#relative-parent-state\n views,\n },\n {\n name: `${routeName}.details.tabs`,\n url: '/:tabIdentifier',\n component: WpTabWrapperComponent,\n data: {\n baseRoute,\n menuItem: menuItemClass,\n parent: `${routeName}.details`,\n mobileAlternative: showMobileAlternative ? 'work-packages.show' : undefined,\n },\n },\n // Split create route\n {\n name: `${routeName}.new`,\n url: '/create_new?{type:[0-9]+}&{parent_id:[0-9]+}',\n reloadOnSearch: false,\n params: {\n defaults: {\n value: null,\n },\n },\n data: {\n partition: '-split',\n allowMovingInEditMode: true,\n bodyClasses: 'router--work-packages-partitioned-split-view-new',\n // Remember the base route so we can route back to it anywhere\n baseRoute,\n parent: baseRoute,\n mobileAlternative: showMobileAlternative ? 'work-packages.show' : undefined,\n },\n views: {\n // Retarget and by that override the grandparent views\n // https://ui-router.github.io/guide/views#relative-parent-state\n 'content-right@^.^': { component: newComponent },\n },\n },\n // Split copy route\n {\n name: `${routeName}.copy`,\n url: '/details/{copiedFromWorkPackageId:[0-9]+}/copy',\n views: {\n 'content-right@^.^': { component: WorkPackageCopySplitViewComponent },\n },\n reloadOnSearch: false,\n data: {\n baseRoute,\n parent: baseRoute,\n allowMovingInEditMode: true,\n bodyClasses: 'router--work-packages-partitioned-split-view',\n menuItem: menuItemClass,\n partition: '-split',\n mobileAlternative: showMobileAlternative ? 'work-packages.show' : undefined,\n },\n },\n ];\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Transition } from '@uirouter/core';\nimport { Injectable } from '@angular/core';\nimport { EditFormRoutingService } from 'core-app/shared/components/fields/edit/edit-form/edit-form-routing.service';\n\n@Injectable()\nexport class WorkPackageEditFormRoutingService extends EditFormRoutingService {\n /**\n * Return whether the given transition is cancelled during the editing of this form\n *\n * @param transition The transition that is underway.\n * @return A boolean marking whether the transition should be blocked.\n */\n public blockedTransition(transition:Transition):boolean {\n const toState = transition.to();\n const fromState = transition.from();\n const fromParams = transition.params('from');\n const toParams = transition.params('to');\n\n // In new/copy mode, transitions to the same controller are allowed\n if (fromState.name && (/\\.(new|copy)$/.exec(fromState.name))) {\n return !(toState.data && toState.data.allowMovingInEditMode);\n }\n\n // When editing an existing WP, transitions on the same WP id are allowed\n return toParams.workPackageId === undefined || toParams.workPackageId !== fromParams.workPackageId;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Component } from '@angular/core';\nimport { EditFormRoutingService } from 'core-app/shared/components/fields/edit/edit-form/edit-form-routing.service';\nimport { WorkPackageEditFormRoutingService } from 'core-app/features/work-packages/routing/wp-edit-form/wp-edit-form-routing.service';\n\nexport const wpBaseSelector = 'work-packages-base';\n\n@Component({\n selector: wpBaseSelector,\n template: `\n
    \n \n
    \n `,\n providers: [\n { provide: EditFormRoutingService, useClass: WorkPackageEditFormRoutingService },\n ],\n})\nexport class WorkPackagesBaseComponent {\n}\n","
    \n\n\n\n\n\n\n
    \n\n\n
    \n\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Injector,\n OnInit,\n ElementRef,\n NgZone,\n} from '@angular/core';\nimport { take } from 'rxjs/operators';\nimport { CausedUpdatesService } from 'core-app/features/boards/board/caused-updates/caused-updates.service';\nimport { DragAndDropService } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.service';\nimport {\n WorkPackageViewDisplayRepresentationService,\n wpDisplayCardRepresentation,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\nimport { WorkPackageTableConfigurationObject } from 'core-app/features/work-packages/components/wp-table/wp-table-configuration';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { StateService } from '@uirouter/core';\nimport { KeepTabService } from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\n\n@Component({\n selector: 'wp-list-view',\n templateUrl: './wp-list-view.component.html',\n styleUrls: ['./wp-list-view.component.sass'],\n host: { class: 'op-wp-list-view work-packages-split-view--tabletimeline-side' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: HalResourceNotificationService, useClass: WorkPackageNotificationService },\n DragAndDropService,\n CausedUpdatesService,\n ],\n})\nexport class WorkPackageListViewComponent extends UntilDestroyedMixin implements OnInit {\n text = {\n jump_to_pagination: this.I18n.t('js.work_packages.jump_marks.pagination'),\n text_jump_to_pagination: this.I18n.t('js.work_packages.jump_marks.label_pagination'),\n button_settings: this.I18n.t('js.button_settings'),\n };\n\n /** Switch between list and card view */\n showTableView = true;\n\n /** Determine when query is initially loaded */\n tableInformationLoaded = false;\n\n /** If loaded list of work packages is empty */\n noResults = false;\n\n /** Whether we should render a blocked view */\n showResultOverlay$ = this.wpViewFilters.incomplete$;\n\n /** */\n readonly wpTableConfiguration:WorkPackageTableConfigurationObject = {\n dragAndDropEnabled: true,\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly injector:Injector,\n readonly $state:StateService,\n readonly keepTab:KeepTabService,\n readonly querySpace:IsolatedQuerySpace,\n readonly wpViewFilters:WorkPackageViewFiltersService,\n readonly deviceService:DeviceService,\n readonly CurrentProject:CurrentProjectService,\n readonly wpDisplayRepresentation:WorkPackageViewDisplayRepresentationService,\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef,\n private ngZone:NgZone,\n ) {\n super();\n }\n\n ngOnInit() {\n // Mark tableInformationLoaded when initially loading done\n this.setupInformationLoadedListener();\n\n this.querySpace.query.values$().pipe(\n this.untilDestroyed(),\n ).subscribe((query) => {\n // Update the visible representation\n this.updateViewRepresentation(query);\n this.noResults = query.results.total === 0;\n this.cdRef.detectChanges();\n });\n\n // Scroll into view the card/row that represents the last selected WorkPackage\n // so when the user opens a WP detail page on a split-view and then clicks on\n // the 'back button', the last selected card is visible on this list.\n // ngAfterViewInit doesn't find the .-checked elements on components\n // that inherit from this class (BcfListContainerComponent) so\n // opting for a timeout 'runOutsideAngular' to avoid running change\n // detection on the entire app\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n const selectedRow = this.elementRef.nativeElement.querySelector('.wp-table--row.-checked');\n const selectedCard = this.elementRef.nativeElement.querySelector('[data-qa-selector=\"op-wp-single-card\"].-checked');\n\n // The header of the table hides the scrolledIntoView element\n // so we scrollIntoView the previous element, if any\n if (selectedRow && selectedRow.previousSibling) {\n selectedRow.previousSibling.scrollIntoView({ block: 'start' });\n }\n\n if (selectedCard) {\n selectedCard.scrollIntoView({ block: 'start' });\n }\n }, 0);\n });\n }\n\n protected setupInformationLoadedListener() {\n this\n .querySpace\n .initialized\n .values$()\n .pipe(take(1))\n .subscribe(() => {\n this.tableInformationLoaded = true;\n this.cdRef.detectChanges();\n });\n }\n\n public showResizerInCardView():boolean {\n return false;\n }\n\n protected updateViewRepresentation(query:QueryResource) {\n this.showTableView = !(this.deviceService.isMobile\n || this.wpDisplayRepresentation.valueFromQuery(query) === wpDisplayCardRepresentation);\n }\n\n handleWorkPackageClicked(event:{ workPackageId:string; double:boolean }) {\n if (event.double) {\n this.openInFullView(event.workPackageId);\n }\n }\n\n openStateLink(event:{ workPackageId:string; requestedState:'show'|'split' }) {\n const params = {\n workPackageId: event.workPackageId,\n focus: true,\n };\n\n if (event.requestedState === 'split') {\n this.keepTab.goCurrentDetailsState(params);\n } else {\n this.keepTab.goCurrentShowState(params);\n }\n }\n\n /**\n * Special handling for clicking on cards.\n * If we are on mobile, a click on the card should directly open the full view\n */\n handleWorkPackageCardClicked(event:{ workPackageId:string; double:boolean }):void {\n if (this.deviceService.isMobile) {\n this.openInFullView(event.workPackageId);\n } else {\n this.handleWorkPackageClicked(event);\n }\n }\n\n private openInFullView(workPackageId:string) {\n this.$state.go(\n 'work-packages.show',\n { workPackageId },\n );\n }\n}\n","
    \n \n \n\n \n\n \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { Component, Input } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\n@Component({\n selector: 'wp-details-toolbar',\n templateUrl: './wp-details-toolbar.html',\n})\nexport class WorkPackageSplitViewToolbarComponent {\n @Input('workPackage') workPackage:WorkPackageResource;\n\n @Input() displayNotificationsButton:boolean;\n\n public text = {\n button_more: this.I18n.t('js.button_more'),\n };\n\n constructor(readonly I18n:I18nService,\n readonly halEditing:HalResourceEditingService) {}\n}\n","\n \n
    \n \n\n \n
    \n
    \n \n\n
    \n \n\n \n
    \n
    \n
    \n\n
    \n \n \n\n
    \n \n
    \n\n
    \n \n
    \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n Injector,\n OnInit,\n} from '@angular/core';\nimport { StateService } from '@uirouter/core';\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { FirstRouteService } from 'core-app/core/routing/first-route-service';\nimport { KeepTabService } from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { WorkPackageSingleViewBase } from 'core-app/features/work-packages/routing/wp-view-base/work-package-single-view.base';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { BackRoutingService } from 'core-app/features/work-packages/components/back-routing/back-routing.service';\nimport { WpSingleViewService } from 'core-app/features/work-packages/routing/wp-view-base/state/wp-single-view.service';\nimport { CommentService } from 'core-app/features/work-packages/components/wp-activity/comment-service';\n\n@Component({\n templateUrl: './wp-split-view.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'op-wp-split-view',\n providers: [\n WpSingleViewService,\n CommentService,\n { provide: HalResourceNotificationService, useClass: WorkPackageNotificationService },\n ],\n})\nexport class WorkPackageSplitViewComponent extends WorkPackageSingleViewBase implements OnInit {\n /** Reference to the base route e.g., work-packages.partitioned.list or bim.partitioned.split */\n private baseRoute:string = this.$state.current.data.baseRoute;\n\n constructor(\n public injector:Injector,\n public states:States,\n public firstRoute:FirstRouteService,\n public keepTab:KeepTabService,\n public wpTableSelection:WorkPackageViewSelectionService,\n public wpTableFocus:WorkPackageViewFocusService,\n readonly $state:StateService,\n readonly backRouting:BackRoutingService,\n ) {\n super(injector, $state.params.workPackageId);\n }\n\n ngOnInit():void {\n this.observeWorkPackage();\n\n const wpId = this.$state.params.workPackageId;\n const focusedWP = this.wpTableFocus.focusedWorkPackage;\n\n if (!focusedWP) {\n // Focus on the work package if we're the first route\n const isFirstRoute = this.firstRoute.name === `${this.baseRoute}.details.overview`;\n const isSameID = this.firstRoute.params && wpId === this.firstRoute.params.workPackageI;\n this.wpTableFocus.updateFocus(wpId, (isFirstRoute && isSameID));\n } else {\n this.wpTableFocus.updateFocus(wpId, false);\n }\n\n if (this.wpTableSelection.isEmpty) {\n this.wpTableSelection.setRowState(wpId, true);\n }\n\n this.wpTableFocus.whenChanged()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((newId) => {\n const idSame = wpId.toString() === newId.toString();\n if (!idSame && this.$state.includes(`${this.baseRoute}.details`)) {\n this.$state.go(\n (this.$state.current.name as string),\n { workPackageId: newId, focus: false },\n );\n }\n });\n }\n\n get shouldFocus():boolean {\n return this.$state.params.focus === true;\n }\n\n showBackButton():boolean {\n return this.baseRoute.includes('bim');\n }\n\n backToList():void {\n this.backRouting.goToBaseState();\n }\n\n protected handleLoadingError(error:unknown):void {\n const message = this.notificationService.retrieveErrorMessage(error);\n\n // Go back to the base route, closing this split view\n void this.$state.go(\n this.baseRoute,\n { flash_message: { type: 'error', message } },\n );\n }\n}\n","import { EventEmitter, InjectionToken, Injector } from '@angular/core';\n\nexport interface WorkPackageViewEventHandler {\n /** Event name to register * */\n EVENT:string;\n\n /** Event context CSS selector */\n SELECTOR:string;\n\n /** Event callback handler */\n handleEvent(view:T, evt:JQuery.TriggeredEvent):void;\n\n /** Event scope method */\n eventScope(view:T):JQuery;\n}\n\nexport interface WorkPackageViewOutputs {\n // On selection updated\n selectionChanged:EventEmitter;\n // On row (double) clicked\n itemClicked:EventEmitter<{ workPackageId:string, double:boolean }>;\n // On work package link / details icon clicked\n stateLinkClicked:EventEmitter<{ workPackageId:string, requestedState:string }>;\n}\n\nexport const WorkPackageViewHandlerToken = new InjectionToken>('CardEventHandler');\n\n/**\n * Abstract view handler registry for globally handling arbitrary event on the\n * view container. Used e.g., for table to register single event callbacks for the entirety\n * of the table.\n */\nexport abstract class WorkPackageViewHandlerRegistry {\n constructor(public readonly injector:Injector) {\n }\n\n protected abstract eventHandlers:((view:T) => WorkPackageViewEventHandler)[];\n\n attachTo(viewRef:T) {\n this.eventHandlers.map((factory) => {\n const handler = factory(viewRef);\n const target = handler.eventScope(viewRef);\n\n target.on(handler.EVENT, handler.SELECTOR, (evt:JQuery.TriggeredEvent) => {\n handler.handleEvent(viewRef, evt);\n });\n\n return handler;\n });\n }\n}\n","import { Store, StoreConfig } from '@datorama/akita';\nimport { ApiV3ListFilter } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\n\nexport interface WpSingleViewState {\n notifications:{\n filters:ApiV3ListFilter[];\n }\n}\n\nexport function createInitialState():WpSingleViewState {\n return {\n notifications: {\n filters: [],\n },\n };\n}\n\n@StoreConfig({ name: 'wp-single-view' })\nexport class WpSingleViewStore extends Store {\n constructor() {\n super(createInitialState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport { WpSingleViewStore } from './wp-single-view.store';\nimport {\n filter,\n map,\n switchMap,\n take,\n} from 'rxjs/operators';\nimport { InAppNotificationsResourceService } from 'core-app/core/state/in-app-notifications/in-app-notifications.service';\nimport {\n ApiV3ListFilter,\n ApiV3ListParameters,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport {\n centerUpdatedInPlace,\n markNotificationsAsRead,\n notificationsMarkedRead,\n} from 'core-app/core/state/in-app-notifications/in-app-notifications.actions';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport {\n EffectCallback,\n EffectHandler,\n} from 'core-app/core/state/effects/effect-handler.decorator';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { collectionKey } from 'core-app/core/state/collection-store';\nimport { Query } from '@datorama/akita';\n\n@EffectHandler\n@Injectable()\nexport class WpSingleViewService {\n id = 'WorkPackage Activity Store';\n\n protected store = new WpSingleViewStore();\n\n protected query = new Query(this.store);\n\n selectNotifications$ = this\n .query\n .select((state) => state.notifications.filters)\n .pipe(\n filter((filters) => filters.length > 0),\n switchMap((filters) => this.resourceService.collection(collectionKey({ filters }))),\n );\n\n selectNotificationsCount$ = this\n .selectNotifications$\n .pipe(\n map((notifications) => notifications.length),\n );\n\n nonDateAlertNotificationsCount$ = this\n .selectNotifications$\n .pipe(\n map((notifications) => notifications.filter((notification) => notification.reason !== 'dateAlert')),\n map((notifications) => notifications.length),\n );\n\n hasNotifications$ = this\n .selectNotificationsCount$\n .pipe(\n map((count) => count > 0),\n );\n\n get params():ApiV3ListParameters {\n return { filters: this.query.getValue().notifications.filters };\n }\n\n constructor(\n readonly actions$:ActionsService,\n readonly currentUser$:CurrentUserService,\n private resourceService:InAppNotificationsResourceService,\n ) {\n }\n\n setFilters(workPackageId:string):void {\n const filters:ApiV3ListFilter[] = [\n ['readIAN', '=', false],\n ['resourceId', '=', [workPackageId]],\n ['resourceType', '=', ['WorkPackage']],\n ];\n\n this.store.update(({ notifications }) => (\n {\n notifications: {\n ...notifications,\n filters,\n },\n }\n ));\n\n this.reload();\n }\n\n markAllAsRead():void {\n const key = collectionKey({ filters: this.store.getValue().notifications.filters });\n this\n .resourceService\n .collection(key)\n .pipe(\n take(1),\n )\n .subscribe((collection) => {\n this.actions$.dispatch(\n markNotificationsAsRead({ origin: this.id, notifications: collection.map((el) => el.id) }),\n );\n });\n }\n\n private reload() {\n this\n .currentUser$\n .isLoggedIn$\n .pipe(\n take(1),\n filter((loggedIn) => loggedIn),\n switchMap(() => this.resourceService.fetchCollection(this.params)),\n )\n .subscribe();\n }\n\n /**\n * Reload after notifications were successfully marked as read\n */\n @EffectCallback(notificationsMarkedRead)\n private reloadOnNotificationRead() {\n this.reload();\n }\n\n /**\n * Reload after notifications were successfully marked as read\n */\n @EffectCallback(centerUpdatedInPlace)\n private reloadOnCenterUpdate() {\n this.reload();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable } from '@angular/core';\nimport { RelationsStateValue, WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { WorkPackageViewHierarchiesService } from './wp-view-hierarchy.service';\nimport { WorkPackageViewColumnsService } from './wp-view-columns.service';\n\n@Injectable()\nexport class WorkPackageViewAdditionalElementsService {\n constructor(readonly querySpace:IsolatedQuerySpace,\n readonly wpTableHierarchies:WorkPackageViewHierarchiesService,\n readonly wpTableColumns:WorkPackageViewColumnsService,\n readonly notificationService:WorkPackageNotificationService,\n readonly halResourceService:HalResourceService,\n readonly apiV3Service:ApiV3Service,\n readonly schemaCache:SchemaCacheService,\n readonly wpRelations:WorkPackageRelationsService) {\n }\n\n public initialize(query:QueryResource, results:WorkPackageCollectionResource):void {\n const rows = results.elements;\n\n // Add relations to the stack\n Promise.all([\n this.requireInvolvedRelations(rows.map((el) => el.id!)),\n this.requireHierarchyElements(rows),\n this.requireSumsSchema(results),\n ]).then((results:string[][]) => {\n this.loadAdditional(_.flatten(results));\n });\n }\n\n private loadAdditional(wpIds:string[]) {\n this\n .apiV3Service\n .work_packages\n .requireAll(wpIds)\n .then(() => {\n this.querySpace.additionalRequiredWorkPackages.putValue(null, 'All required work packages are loaded');\n })\n .catch((e) => {\n this.querySpace.additionalRequiredWorkPackages.putValue(null, 'Failure loading required work packages');\n this.notificationService.handleRawError(e);\n });\n }\n\n /**\n * Requires both the relation resource of the given work package ids as well\n * as the `to` work packages returned from the relations\n */\n private requireInvolvedRelations(rows:string[]):Promise {\n if (!this.wpTableColumns.hasRelationColumns()) {\n return Promise.resolve([]);\n }\n return this.wpRelations\n .requireAll(rows)\n .then(() => {\n const ids = this.getInvolvedWorkPackages(rows.map((id) => this.wpRelations.state(id).value!));\n return _.flatten(ids);\n });\n }\n\n /**\n * Return the id of all ancestors for visible rows in the table.\n * @param rows\n * @return {string[]}\n */\n private requireHierarchyElements(rows:WorkPackageResource[]):Promise {\n if (!this.wpTableHierarchies.isEnabled) {\n return Promise.resolve([]);\n }\n\n const ids = _.flatten(rows.map((el) => el.ancestorIds));\n return Promise.resolve(ids);\n }\n\n /**\n * From a set of relations state values, return all involved IDs.\n * @param states\n * @return {string[]}\n */\n private getInvolvedWorkPackages(states:RelationsStateValue[]) {\n const ids:string[] = [];\n _.each(states, (relations:RelationsStateValue) => {\n _.each(relations, (resource:RelationResource) => {\n ids.push(resource.ids.from, resource.ids.to);\n });\n });\n\n return ids;\n }\n\n private requireSumsSchema(results:WorkPackageCollectionResource):Promise {\n if (results.sumsSchema) {\n return this\n .schemaCache\n .ensureLoaded(results.sumsSchema.href!)\n .then(() => []);\n }\n\n return Promise.resolve([]);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport {\n combine, deriveRaw, input, State,\n} from 'reactivestates';\nimport { map, mapTo, take } from 'rxjs/operators';\nimport { merge, Observable } from 'rxjs';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { Injectable } from '@angular/core';\nimport { QuerySchemaResource } from 'core-app/features/hal/resources/query-schema-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\n\n@Injectable()\nexport abstract class WorkPackageViewBaseService {\n /** Internal state to push non-persisted updates */\n protected updatesState = input();\n\n /** Internal pristine state filled during +initialize+ only */\n protected pristineState = input();\n\n constructor(\n protected readonly querySpace:IsolatedQuerySpace,\n ) { }\n\n /**\n * Get the state value from the current query.\n *\n * @param {QueryResource} query\n * @returns {T} Instance of the state value for this type.\n */\n public abstract valueFromQuery(query:QueryResource, results:WorkPackageCollectionResource):T|undefined;\n\n /**\n * Initialize this table state from the given query resource,\n * and possibly the associated schema.\n *\n * @param {QueryResource} querywp-view-group-by.service\n * @param {QuerySchemaResource} schema\n */\n public initialize(query:QueryResource, results:WorkPackageCollectionResource, schema?:QuerySchemaResource) {\n const initial = this.valueFromQuery(query, results)!;\n this.pristineState.putValue(initial);\n }\n\n public update(value:T) {\n this.updatesState.putValue(value);\n }\n\n public clear(reason:string) {\n this.pristineState.clear(reason);\n this.updatesState.clear(reason);\n }\n\n /**\n * Get the combined pristine and update value changes\n * @param unsubscribe\n */\n public live$():Observable {\n return merge(\n this.pristineState.values$(),\n this.updatesState.values$(),\n );\n }\n\n /**\n * Get pristine upstream changes\n *\n * @param unsubscribe\n */\n public pristine$():Observable {\n return this\n .pristineState\n .values$();\n }\n\n /**\n * Get only the local update changes\n *\n * @param unsubscribe\n */\n public updates$():Observable {\n return this\n .updatesState\n .values$();\n }\n\n /**\n * Get only the local update changes\n *\n * @param unsubscribe\n */\n public changes$():Observable {\n return this\n .updatesState\n .changes$();\n }\n\n public onReady() {\n return this\n .pristineState\n .values$()\n .pipe(\n take(1),\n mapTo(null),\n )\n .toPromise();\n }\n\n /** Get the last updated value from either pristine or update state */\n protected get lastUpdatedState():State {\n const combinedRaw = combine(this.pristineState, this.updatesState);\n\n return deriveRaw(combinedRaw,\n ($) => $\n .pipe(\n map(([pristine, current]) => {\n if (current === undefined) {\n return pristine;\n }\n return current;\n }),\n ));\n }\n\n /**\n * Helper to set the value of the current state\n * @param val\n */\n protected set current(val:T|undefined) {\n if (val) {\n this.updatesState.putValue(val);\n } else {\n this.updatesState.clear();\n }\n }\n\n /**\n * Get the value of the current state, if any.\n */\n protected get current():T|undefined {\n return this.lastUpdatedState.value;\n }\n}\n\n@Injectable()\nexport abstract class WorkPackageQueryStateService extends WorkPackageViewBaseService {\n /**\n * Check whether the state value does not match the query resource's value.\n * @param query The current query resource\n */\n abstract hasChanged(query:QueryResource):boolean;\n\n /**\n * Apply the current state value to query\n *\n * @return Whether the query should be visibly updated.\n */\n abstract applyToQuery(query:QueryResource):boolean;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { Injectable } from '@angular/core';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { take } from 'rxjs/operators';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { QuerySchemaResource } from 'core-app/features/hal/resources/query-schema-resource';\nimport { GroupObject, WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { QueryGroupByResource } from 'core-app/features/hal/resources/query-group-by-resource';\nimport { WorkPackageViewBaseService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewCollapsedGroupsService extends WorkPackageViewBaseService {\n readonly wpTypesToShowInCollapsedGroupHeaders:((wp:WorkPackageResource) => boolean)[];\n\n readonly groupTypesWithHeaderCellsWhenCollapsed = ['project'];\n\n get config():IGroupsCollapseEvent {\n return this.updatesState.getValueOr(this.getDefaultState());\n }\n\n get currentGroups():GroupObject[] {\n return this.querySpace.groups.value!;\n }\n\n get allGroupsAreCollapsed():boolean {\n return this.config.allGroupsAreCollapsed;\n }\n\n get allGroupsAreExpanded():boolean {\n return this.config.allGroupsAreExpanded;\n }\n\n get currentGroupedBy():QueryGroupByResource|null {\n return this.workPackageViewGroupByService.current;\n }\n\n constructor(\n protected readonly querySpace:IsolatedQuerySpace,\n readonly workPackageViewGroupByService:WorkPackageViewGroupByService,\n private schemaCacheService:SchemaCacheService,\n ) {\n super(querySpace);\n this.wpTypesToShowInCollapsedGroupHeaders = [this.isMilestone];\n }\n\n // Every time the groupedBy changes, this services is initialized\n private getDefaultState():IGroupsCollapseEvent {\n return {\n state: this.querySpace.collapsedGroups.value || {},\n allGroupsChanged: false,\n lastChangedGroup: null,\n groupedBy: this.currentGroupedBy?.id || null,\n ...this.getAllGroupsCollapsedState(this.currentGroups, this.querySpace.collapsedGroups.value!),\n };\n }\n\n isMilestone = (workPackage:WorkPackageResource):boolean => this.schemaCacheService.of(workPackage)?.isMilestone;\n\n toggleGroupCollapseState(groupIdentifier:string):void {\n const newCollapsedState = !this.config.state[groupIdentifier];\n const state = {\n ...this.config.state,\n [groupIdentifier]: newCollapsedState,\n };\n const newState = {\n ...this.config,\n state,\n lastChangedGroup: groupIdentifier,\n ...this.getAllGroupsCollapsedState(this.currentGroups, state),\n };\n\n this.update(newState);\n }\n\n setAllGroupsCollapseStateTo(collapsedState:boolean):void {\n const groupUpdatedState = this.currentGroups.reduce((updatedState:{ [key:string]:boolean }, group) => ({\n ...updatedState,\n [group.identifier]: collapsedState,\n }), {});\n const newState = {\n ...this.config,\n state: {\n ...this.config.state,\n ...groupUpdatedState,\n },\n lastChangedGroup: null,\n allGroupsAreCollapsed: collapsedState,\n allGroupsAreExpanded: !collapsedState,\n allGroupsChanged: true,\n };\n\n this.update(newState);\n }\n\n getAllGroupsCollapsedState(groups:GroupObject[], currentCollapsedGroupsState:IGroupsCollapseEvent['state']) {\n let allGroupsAreCollapsed = false;\n let allGroupsAreExpanded = true;\n\n if (currentCollapsedGroupsState && groups?.length) {\n const firstGroupIdentifier = groups[0].identifier;\n const firstGroupCollapsedState = currentCollapsedGroupsState[firstGroupIdentifier];\n const allGroupsHaveTheSameCollapseState = groups.every((group) => currentCollapsedGroupsState[group.identifier] != null\n && currentCollapsedGroupsState[group.identifier] === currentCollapsedGroupsState[firstGroupIdentifier]);\n\n allGroupsAreCollapsed = allGroupsHaveTheSameCollapseState && firstGroupCollapsedState;\n allGroupsAreExpanded = allGroupsHaveTheSameCollapseState && !firstGroupCollapsedState;\n }\n\n return { allGroupsAreCollapsed, allGroupsAreExpanded };\n }\n\n initialize(query:QueryResource, results:WorkPackageCollectionResource, schema?:QuerySchemaResource) {\n // When this service is initialized (first time the table is loaded and very time the groupBy changes),\n // we need to wait until the table is ready to emit the collapseStatus. Otherwise the groups are not\n // ready in the DOM and can't be collapsed/expanded.\n this.querySpace.tableRendered.values$().pipe(take(1)).subscribe(() => this.update({ ...this.config, allGroupsChanged: true }));\n }\n\n valueFromQuery(query:QueryResource, results:WorkPackageCollectionResource) {\n return this.getDefaultState();\n }\n\n applyToQuery(query:QueryResource) {\n\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { States } from 'core-app/core/states/states.service';\nimport { Injectable } from '@angular/core';\nimport { QueryColumn, queryColumnTypes } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { combine } from 'reactivestates';\nimport { mapTo, take } from 'rxjs/operators';\nimport { cloneHalResourceCollection } from 'core-app/features/hal/helpers/hal-resource-builder';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewColumnsService extends WorkPackageQueryStateService {\n public constructor(readonly states:States, readonly querySpace:IsolatedQuerySpace) {\n super(querySpace);\n }\n\n public initialize(query:any, results:any, schema?:any) {\n super.initialize(query, results, schema);\n }\n\n public valueFromQuery(query:QueryResource):QueryColumn[] {\n return [...query.columns];\n }\n\n public hasChanged(query:QueryResource) {\n return !this.isCurrentlyEqualTo(query.columns);\n }\n\n public isCurrentlyEqualTo(a:QueryColumn[]) {\n const comparer = (columns:QueryColumn[]) => columns.map((c) => c.href);\n\n return _.isEqual(\n comparer(a),\n comparer(this.getColumns()),\n );\n }\n\n public applyToQuery(query:QueryResource) {\n const toApply = this.getColumns();\n\n const oldColumns = query.columns.map((el) => el.id);\n const newColumns = toApply.map((el) => el.id);\n query.columns = cloneHalResourceCollection(toApply);\n\n // We can avoid reloading even with relation columns if we only removed columns\n const onlyRemoved = _.difference(newColumns, oldColumns).length === 0;\n\n // Reload the table visibly if adding relation columns.\n return !onlyRemoved && this.hasRelationColumns();\n }\n\n /**\n * Returns whether the current set of columns include relations\n */\n public hasRelationColumns() {\n const relationColumns = [queryColumnTypes.RELATION_OF_TYPE, queryColumnTypes.RELATION_TO_TYPE];\n return !!_.find(this.getColumns(), (c) => relationColumns.indexOf(c._type) >= 0);\n }\n\n /**\n * Retrieve the QueryColumn objects for the selected columns.\n * Returns a shallow copy with the original column objects.\n */\n public getColumns():QueryColumn[] {\n return [...this.current];\n }\n\n /**\n * Return the index of the given column or -1 if it is not contained.\n */\n public index(id:string):number {\n return _.findIndex(this.getColumns(), (column) => column.id === id);\n }\n\n /**\n * Return the column object for the given id.\n * @param id\n */\n public findById(id:string):QueryColumn|undefined {\n return _.find(this.getColumns(), (column) => column.id === id);\n }\n\n /**\n * Return the previous column of the given column name\n * @param column\n */\n public previous(column:QueryColumn):QueryColumn|null {\n const index = this.index(column.id);\n\n if (index <= 0) {\n return null;\n }\n\n return this.getColumns()[index - 1];\n }\n\n /**\n * Return the next column of the given column name\n * @param column\n */\n public next(column:QueryColumn):QueryColumn|null {\n const index = this.index(column.id);\n\n if (index === -1 || this.isLast(column)) {\n return null;\n }\n\n return this.getColumns()[index + 1];\n }\n\n /**\n * Returns true if the column is the first selected\n */\n public isFirst(column:QueryColumn):boolean {\n return this.index(column.id) === 0;\n }\n\n /**\n * Returns true if the column is the last selected\n */\n public isLast(column:QueryColumn):boolean {\n return this.index(column.id) === this.columnCount - 1;\n }\n\n /**\n * Update the selected columns to a new set of columns.\n */\n public setColumns(columns:QueryColumn[]) {\n // Don't publish if this is the same content\n if (this.isCurrentlyEqualTo(columns)) {\n return;\n }\n\n this.update(columns);\n }\n\n public setColumnsById(columnIds:string[]) {\n const mapped = columnIds.map((id) => _.find(this.all, (c) => c.id === id));\n this.setColumns(_.compact(mapped));\n }\n\n /**\n * Move the column at index {fromIndex} to {toIndex}.\n * - If toIndex is larger than all columns, insert at the end.\n * - If toIndex is less than zero, insert at the start.\n */\n public moveColumn(fromIndex:number, toIndex:number) {\n const columns = this.getColumns();\n\n if (toIndex >= columns.length) {\n toIndex = columns.length - 1;\n }\n\n if (toIndex < 0) {\n toIndex = 0;\n }\n\n const element = columns[fromIndex];\n columns.splice(fromIndex, 1);\n columns.splice(toIndex, 0, element);\n\n this.setColumns(columns);\n }\n\n /**\n * Shift the given column name X indices,\n * where X is the offset in indices (-1 = shift one to left)\n */\n public shift(column:QueryColumn, offset:number) {\n const index = this.index(column.id);\n if (index === -1) {\n return;\n }\n\n this.moveColumn(index, index + offset);\n }\n\n /**\n * Add a new column to the selection at the given position\n */\n public addColumn(id:string, position?:number) {\n const columns = this.getColumns();\n\n if (position === undefined) {\n position = columns.length;\n }\n\n if (this.index(id) === -1) {\n const newColumn = _.find(this.all, (column) => column.id === id);\n\n if (!newColumn) {\n throw new Error('Column with provided name is not found');\n }\n\n columns.splice(position, 0, newColumn);\n this.setColumns(columns);\n }\n }\n\n /**\n * Remove a column from the active list\n */\n public removeColumn(column:QueryColumn) {\n const index = this.index(column.id);\n\n if (index !== -1) {\n const columns = this.getColumns();\n columns.splice(index, 1);\n this.setColumns(columns);\n }\n }\n\n // only exists to cast the state\n protected get current() {\n return this.lastUpdatedState.getValueOr([]);\n }\n\n // Get the available state\n protected get availableState() {\n return this.querySpace.available.columns;\n }\n\n /**\n * Return the number of selected rows.\n */\n public get columnCount():number {\n return this.getColumns().length;\n }\n\n /**\n * Get all available columns (regardless of whether they are selected already)\n */\n public get all():QueryColumn[] {\n return this.availableState.getValueOr([]);\n }\n\n public get allPropertyColumns():QueryColumn[] {\n return this\n .all\n .filter((column:QueryColumn) => column._type === queryColumnTypes.PROPERTY);\n }\n\n /**\n * Get columns not yet selected\n */\n public get unused():QueryColumn[] {\n return _.differenceBy(this.all, this.getColumns(), '$href');\n }\n\n /**\n * Columns service depends on two states\n */\n public onReady() {\n return combine(this.pristineState, this.availableState)\n .values$()\n .pipe(\n take(1),\n mapTo(null),\n )\n .toPromise();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable } from '@angular/core';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\nexport const wpDisplayListRepresentation = 'list';\nexport const wpDisplayCardRepresentation = 'card';\nexport type WorkPackageDisplayRepresentationValue = 'list'|'card';\n\n@Injectable()\nexport class WorkPackageViewDisplayRepresentationService extends WorkPackageQueryStateService {\n public constructor(\n readonly states:States,\n readonly querySpace:IsolatedQuerySpace,\n ) {\n super(querySpace);\n }\n\n public hasChanged(query:QueryResource) {\n return this.current !== query.displayRepresentation;\n }\n\n valueFromQuery(query:QueryResource) {\n return query.displayRepresentation || null;\n }\n\n public applyToQuery(query:QueryResource) {\n const { current } = this;\n query.displayRepresentation = current === null ? undefined : current;\n\n return false;\n }\n\n public get current():string|null {\n return this.lastUpdatedState.getValueOr(null);\n }\n\n public get isList():boolean {\n const { current } = this;\n return !current || current === wpDisplayListRepresentation;\n }\n\n public get isCards():boolean {\n return this.current === wpDisplayCardRepresentation;\n }\n\n public setDisplayRepresentation(representation:WorkPackageDisplayRepresentationValue) {\n this.update(representation);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { combine, input, InputState } from 'reactivestates';\nimport { States } from 'core-app/core/states/states.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { mapTo, take } from 'rxjs/operators';\nimport { QuerySchemaResource } from 'core-app/features/hal/resources/query-schema-resource';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { cloneHalResourceCollection } from 'core-app/features/hal/helpers/hal-resource-builder';\nimport { QueryFilterInstanceSchemaResource } from 'core-app/features/hal/resources/query-filter-instance-schema-resource';\nimport { QueryFilterResource } from 'core-app/features/hal/resources/query-filter-resource';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewFiltersService extends WorkPackageQueryStateService {\n public hidden:string[] = [\n 'datesInterval',\n 'precedes',\n 'follows',\n 'relates',\n 'duplicates',\n 'duplicated',\n 'blocks',\n 'blocked',\n 'partof',\n 'includes',\n 'requires',\n 'required',\n 'search',\n // The filter should be named subjectOrId but for some reason\n // it is only named subjectOr\n 'subjectOrId',\n 'subjectOr',\n 'manualSort',\n 'typeahead',\n ];\n\n /** Flag state to determine whether the filters are incomplete */\n private incomplete = input(false);\n\n constructor(\n protected readonly states:States,\n readonly querySpace:IsolatedQuerySpace,\n ) {\n super(querySpace);\n }\n\n /**\n * Load all schemas for the current filters and fill respective states\n * @param query\n * @param schema\n */\n public initializeFilters(query:QueryResource, schema:QuerySchemaResource) {\n const filters = cloneHalResourceCollection(query.filters);\n\n this.availableState.putValue(schema.filtersSchemas.elements);\n this.pristineState.putValue(filters);\n }\n\n /**\n * Return whether the filters are empty\n */\n public get isEmpty() {\n const { value } = this.lastUpdatedState;\n return !value || value.length === 0;\n }\n\n public get availableState():InputState {\n return this.querySpace.available.filters;\n }\n\n /** Return whether the filters the user is working on are incomplete */\n public get incomplete$() {\n return this.incomplete.values$();\n }\n\n /**\n * Add a filter instantiation from the set of available filter schemas\n *\n * @param filter\n */\n public add(filter:QueryFilterInstanceResource) {\n this.updatesState.putValue([...this.rawFilters, filter]);\n }\n\n /**\n * Replace a filter, or add a new one\n */\n public replace(id:string, modifier:(filter:QueryFilterInstanceResource) => void):void {\n const filter:QueryFilterInstanceResource = this.instantiate(id);\n\n const newFilters = [...this.rawFilters];\n modifier(filter);\n\n const index = this.findIndex(id);\n if (index === -1) {\n newFilters.push(filter);\n } else {\n newFilters.splice(index, 1, filter);\n }\n\n this.update(newFilters);\n }\n\n /**\n * Modify a live filter and push it to the state.\n * Avoids copying the resource.\n *\n * Returns whether the filter was found and modified\n */\n public modify(id:string, modifier:(filter:QueryFilterInstanceResource) => void):boolean {\n const index = this.findIndex(id);\n\n if (index === -1) {\n return false;\n }\n\n const filters = [...this.rawFilters];\n modifier(filters[index]!);\n this.update(filters);\n\n return true;\n }\n\n /**\n * Get an instantiated filter without adding it to the current state\n * @param filterOrId The query filter or id to instantiate\n */\n public instantiate(filterOrId:QueryFilterResource|string):QueryFilterInstanceResource {\n const id = (filterOrId instanceof QueryFilterResource) ? filterOrId.id : filterOrId;\n\n const schema = _.find(\n this.availableSchemas,\n (schema) => (schema.filter.allowedValues as HalResource)[0].id === id,\n )!;\n\n return schema.getFilter();\n }\n\n /**\n * Remove one or more filters from the live state of filters.\n * @param filters Filters to be removed\n */\n public remove(...filters:(QueryFilterInstanceResource|string)[]) {\n const mapper = (f:QueryFilterInstanceResource|string) => ((f instanceof QueryFilterInstanceResource) ? f.id : f);\n const set = new Set(filters.map(mapper));\n\n this.update(\n this.rawFilters.filter((f) => !set.has(mapper(f))),\n );\n }\n\n /**\n * Return the remaining visible filters from the given filters set.\n * @param filters Array of active filters, defaults to the current live state.\n */\n public remainingVisibleFilters(filters = this.current) {\n return this\n .remainingFilters(filters)\n .filter((filter) => this.hidden.indexOf(filter.id) === -1);\n }\n\n /**\n * Return all available filter resources.\n * They need to be instantiated before using them in this service.\n */\n public get availableFilters():QueryFilterResource[] {\n return this.availableSchemas.map((schema) => schema.allowedFilterValue);\n }\n\n private get availableSchemas():QueryFilterInstanceSchemaResource[] {\n return this.availableState.getValueOr([]);\n }\n\n /**\n * Determine whether all given filters are completely defined.\n * @param filters\n */\n public isComplete(filters:QueryFilterInstanceResource[]):boolean {\n return _.every(filters, (filter) => filter.isCompletelyDefined());\n }\n\n /**\n * Compare the current set of filters to the given query.\n * @param query\n */\n public hasChanged(query:QueryResource) {\n const comparer = (filter:HalResource[]) => filter.map((el) => el.$source);\n\n return !_.isEqual(\n comparer(query.filters),\n comparer(this.rawFilters),\n );\n }\n\n public valueFromQuery(query:QueryResource) {\n return undefined;\n }\n\n update(value:QueryFilterInstanceResource[]) {\n super.update(value);\n this.incomplete.putValue(false);\n }\n\n /**\n * Returns the live filter instance for the given ID, or undefined\n * if it does not exist.\n *\n * @param id Identifier of the filter\n */\n public find(id:string):QueryFilterInstanceResource|undefined {\n const index = this.findIndex(id);\n\n if (index === -1) {\n return;\n }\n\n return this.rawFilters[index];\n }\n\n /**\n * Returns the index of the filter, or -1 if it does not exist\n * @param id Identifier of the filter\n */\n public findIndex(id:string):number {\n return _.findIndex(this.current, (f) => f.id === id);\n }\n\n public applyToQuery(query:QueryResource):boolean {\n query.filters = this.cloneFilters();\n return true;\n }\n\n /**\n * Returns a shallow copy of the current filters.\n * Modifications to filters themselves will still\n */\n public get current():QueryFilterInstanceResource[] {\n return [...this.rawFilters];\n }\n\n /**\n * Returns a deep clone of the current filters set, may be used\n * to modify the filters without altering this state.\n */\n public cloneFilters():QueryFilterInstanceResource[] {\n return cloneHalResourceCollection(this.rawFilters);\n }\n\n /**\n * Returns the live state array, used for inspection of the filters\n * without modification.\n */\n protected get rawFilters():QueryFilterInstanceResource[] {\n return this.lastUpdatedState.value || [];\n }\n\n public get currentlyVisibleFilters():QueryFilterInstanceResource[] {\n const invisibleFilters = new Set(this.hidden);\n invisibleFilters.delete('search');\n\n return _.reject(this.current, (filter) => invisibleFilters.has(filter.id));\n }\n\n /**\n * Replace this filter state, but only if the given filters are complete\n * @param newState\n */\n public replaceIfComplete(newState:QueryFilterInstanceResource[]):void {\n if (this.isComplete(newState)) {\n this.update(newState);\n } else {\n this.incomplete.putValue(true);\n }\n }\n\n /**\n * Filters service depends on two states\n */\n public onReady():Promise {\n return combine(this.pristineState, this.availableState)\n .values$()\n .pipe(\n take(1),\n mapTo(null),\n )\n .toPromise();\n }\n\n /**\n * Get all filters that are not in the current active set\n */\n private remainingFilters(filters = this.rawFilters) {\n return _.differenceBy(this.availableFilters, filters, (filter) => filter.id);\n }\n\n isAvailable(el:QueryFilterInstanceResource):boolean {\n return !!this.availableFilters.find((available) => available.id === el.id);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Observable } from 'rxjs';\nimport { distinctUntilChanged, map } from 'rxjs/operators';\nimport { WorkPackageViewSelectionService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport { WorkPackageViewBaseService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-base.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\n\nexport interface WPFocusState {\n workPackageId:string;\n focusAfterRender:boolean;\n}\n\n@Injectable()\nexport class WorkPackageViewFocusService extends WorkPackageViewBaseService {\n constructor(public querySpace:IsolatedQuerySpace,\n public wpTableSelection:WorkPackageViewSelectionService) {\n super(querySpace);\n }\n\n public isFocused(workPackageId:string) {\n return this.focusedWorkPackage === workPackageId;\n }\n\n public ifShouldFocus(callback:(workPackageId:string) => void) {\n const value = this.current;\n\n if (value && value.focusAfterRender) {\n callback(value.workPackageId);\n value.focusAfterRender = false;\n this.update(value);\n }\n }\n\n public get focusedWorkPackage():string|null {\n const value = this.current;\n\n if (value) {\n return value.workPackageId;\n }\n\n // Return the first result if none selected\n const results = this.querySpace.results.value;\n if (results && results.elements.length > 0) {\n return results.elements[0].id!.toString();\n }\n\n return null;\n }\n\n public whenChanged():Observable {\n return this.live$()\n .pipe(\n map((val:WPFocusState) => val.workPackageId),\n distinctUntilChanged(),\n );\n }\n\n public updateFocus(workPackageId:string, setFocusAfterRender = false) {\n // Set the selection to this row, if nothing else is selected.\n if (this.wpTableSelection.isEmpty) {\n this.wpTableSelection.setRowState(workPackageId, true);\n }\n this.update({ workPackageId, focusAfterRender: setFocusAfterRender });\n }\n\n valueFromQuery(query:QueryResource, results:WorkPackageCollectionResource):WPFocusState|undefined {\n return undefined;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable } from '@angular/core';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { QueryGroupByResource } from 'core-app/features/hal/resources/query-group-by-resource';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewGroupByService extends WorkPackageQueryStateService {\n public constructor(readonly states:States,\n readonly querySpace:IsolatedQuerySpace) {\n super(querySpace);\n }\n\n valueFromQuery(query:QueryResource) {\n return query.groupBy || null;\n }\n\n public hasChanged(query:QueryResource) {\n const comparer = (groupBy:QueryColumn|HalResource|null|undefined) => (groupBy ? groupBy.href : null);\n\n return !_.isEqual(\n comparer(query.groupBy),\n comparer(this.current),\n );\n }\n\n public applyToQuery(query:QueryResource) {\n const { current } = this;\n query.groupBy = current === null ? undefined : current;\n return true;\n }\n\n public isGroupable(column:QueryColumn):boolean {\n return !!_.find(this.available, (candidate) => candidate.id === column.id);\n }\n\n public disable() {\n this.update(null);\n }\n\n public setBy(column:QueryColumn) {\n const groupBy = _.find(this.available, (candidate) => candidate.id === column.id);\n\n if (groupBy) {\n this.update(groupBy);\n }\n }\n\n public get current():QueryGroupByResource|null {\n return this.lastUpdatedState.getValueOr(null);\n }\n\n protected get availableState() {\n return this.querySpace.available.groupBy;\n }\n\n public get isEnabled():boolean {\n return !!this.current;\n }\n\n public get available():QueryGroupByResource[] {\n return this.availableState.getValueOr([]);\n }\n\n public isCurrentlyGroupedBy(column:QueryColumn):boolean {\n const cur = this.current;\n return !!(cur && cur.id === column.id);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageRelationsHierarchyService } from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewDisplayRepresentationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Injectable()\nexport class WorkPackageViewHierarchyIdentationService {\n constructor(private wpViewHierarchies:WorkPackageViewHierarchiesService,\n private wpDisplayRepresentation:WorkPackageViewDisplayRepresentationService,\n private states:States,\n private wpRelationHierarchy:WorkPackageRelationsHierarchyService,\n private apiV3Service:ApiV3Service,\n private querySpace:IsolatedQuerySpace) {\n }\n\n /**\n * Return whether the current hierarchy mode is active\n */\n public get applicable():boolean {\n return this.wpViewHierarchies.isEnabled && this.wpDisplayRepresentation.isList;\n }\n\n /**\n * Returns whether the given work package can be indented in the current render order\n * @param workPackage\n */\n public canIndent(workPackage:WorkPackageResource):boolean {\n if (!workPackage.changeParent || !this.applicable) {\n return false;\n }\n\n const rendered = this.renderedWorkPackageIds;\n const index = rendered.indexOf(workPackage.id!);\n\n // We can never indent the first item\n if (index === 0) {\n return false;\n }\n\n // We can not indent work packages whose predecessors are already their ancestors\n const ancestors = workPackage.ancestorIds;\n const ancestorCount = ancestors.length;\n\n // We can always indent if the ancestor count is 0\n if (ancestorCount === 0) {\n return true;\n }\n\n // Otherwise, we can only indent if the predecessor is NOT the last ancestor\n const lastAncestor:string = ancestors[ancestorCount - 1];\n const predecessorId:string = rendered[index - 1];\n\n return predecessorId !== lastAncestor;\n }\n\n /**\n * Returns whether the given work package can be outdented\n * @param workPackage\n */\n public canOutdent(workPackage:WorkPackageResource):boolean {\n if (!workPackage.changeParent || !this.applicable) {\n return false;\n }\n\n // We can always outdent if the work package has a parent\n return !!workPackage.parent;\n }\n\n /**\n * Try to indent the work package.\n * @return a Promise with the change parent result\n */\n public async indent(workPackage:WorkPackageResource):Promise {\n if (!this.canIndent(workPackage)) {\n return Promise.reject();\n }\n\n const rendered = this.renderedWorkPackageIds;\n const index = rendered.indexOf(workPackage.id!);\n const predecessorId:string = rendered[index - 1];\n\n // By default, assume we're going to insert under parent\n let newParentId = predecessorId;\n\n // If the predecessor is in an ancestor chain.\n // get the first element of the ancestor chain that workPackage is not in\n const predecessor = await this.apiV3Service.work_packages.id(predecessorId).get().toPromise();\n\n const difference = _.difference(predecessor.ancestorIds, workPackage.ancestorIds);\n if (difference && difference.length > 0) {\n newParentId = difference[0];\n }\n\n return this\n .wpRelationHierarchy\n .changeParent(workPackage, newParentId);\n }\n\n /**\n * Try to outdent the work package.\n * @return a Promise with the change parent result\n */\n public outdent(workPackage:WorkPackageResource):Promise {\n if (!this.canOutdent(workPackage)) {\n return Promise.reject();\n }\n\n let newParentId:string|null = null;\n\n // If we have more than one ancestor,\n // just drop the last one\n const { ancestorIds } = workPackage;\n const ancestorCount = ancestorIds.length;\n if (ancestorCount > 1) {\n newParentId = ancestorIds[ancestorCount - 2];\n }\n\n return this\n .wpRelationHierarchy\n .changeParent(workPackage, newParentId);\n }\n\n /**\n * Get the currently rendered work packages\n */\n private get renderedWorkPackageIds():string[] {\n return this.querySpace.renderedWorkPackageIds.getValueOr([]);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport class WorkPackageViewHierarchies {\n public isVisible = false;\n\n public last:string|null = null;\n\n public collapsed:{ [workPackageId:string]:boolean } = {};\n\n constructor(visible:boolean) {\n this.isVisible = visible;\n }\n}\n","import { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { Injectable } from '@angular/core';\nimport { WorkPackageViewHierarchies } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-hierarchies';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewHierarchiesService extends WorkPackageQueryStateService {\n public valueFromQuery(query:QueryResource):WorkPackageViewHierarchies {\n const value = new WorkPackageViewHierarchies(query.showHierarchies);\n const { current } = this;\n\n // Take over current collapsed values\n // which are not yet saved\n if (current) {\n value.collapsed = current.collapsed;\n }\n\n return value;\n }\n\n public hasChanged(query:QueryResource) {\n return query.showHierarchies !== this.isEnabled;\n }\n\n public applyToQuery(query:QueryResource) {\n query.showHierarchies = this.isEnabled;\n\n // We need to visibly load the ancestors when the mode is activated.\n return this.isEnabled;\n }\n\n /**\n * Return whether the current hierarchy mode is active\n */\n public get isEnabled():boolean {\n return !!(this.current && this.current.isVisible);\n }\n\n public setEnabled(active = true) {\n const state = { ...this.current, isVisible: active, last: null };\n this.update(state);\n }\n\n /**\n * Toggle the hierarchy state\n */\n public toggleState():boolean {\n this.setEnabled(!this.isEnabled);\n return this.isEnabled;\n }\n\n /**\n * Return whether the given wp ID is collapsed.\n */\n public collapsed(wpId:string):boolean {\n return this.current.collapsed[wpId];\n }\n\n /**\n * Collapse the hierarchy for this work package\n */\n public collapse(wpId:string):void {\n this.setState(wpId, true);\n }\n\n /**\n * Expand the hierarchy for this work package\n */\n public expand(wpId:string):void {\n this.setState(wpId, false);\n }\n\n /**\n * Toggle the hierarchy state\n */\n public toggle(wpId:string):void {\n this.setState(wpId, !this.collapsed(wpId));\n }\n\n /**\n * Set the collapse/expand state of the given work package id.\n */\n private setState(wpId:string, isCollapsed:boolean):void {\n const state = { ...this.current, last: wpId };\n state.collapsed[wpId] = isCollapsed;\n this.update(state);\n }\n\n /**\n * Get current selection state.\n */\n public get current():WorkPackageViewHierarchies {\n const state = this.lastUpdatedState.value;\n\n if (state === undefined) {\n return this.initialState;\n }\n\n if (!state.collapsed) {\n state.collapsed = {};\n }\n\n return state;\n }\n\n private get initialState():WorkPackageViewHierarchies {\n return new WorkPackageViewHierarchies(false);\n }\n}\n","import { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable } from '@angular/core';\nimport { States } from 'core-app/core/states/states.service';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { QuerySchemaResource } from 'core-app/features/hal/resources/query-schema-resource';\nimport { WorkPackageViewHighlight } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-highlight';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewHighlightingService extends WorkPackageQueryStateService {\n public constructor(readonly states:States,\n readonly Banners:BannersService,\n readonly querySpace:IsolatedQuerySpace) {\n super(querySpace);\n }\n\n initialize(query:QueryResource, results:WorkPackageCollectionResource, schema?:QuerySchemaResource) {\n super.initialize(query, results, schema);\n }\n\n /**\n * Decides whether we want to inline highlight the given field name.\n *\n * @param name A display field name such as 'status', 'priority'.\n */\n public shouldHighlightInline(name:string):boolean {\n // 1. Are we in inline mode or unable to render?\n if (!this.isInline || this.Banners.eeShowBanners) {\n return false;\n }\n\n // 2. Is selected attributes === undefined or empty Array?\n if (this.current.selectedAttributes?.length === 0) {\n return true;\n }\n\n // 3. Is name in selected attributes ?\n return !!_.find(this.current.selectedAttributes, (attr:HalResource) => attr.id === name);\n }\n\n public get current():WorkPackageViewHighlight {\n const value = this.lastUpdatedState.getValueOr({ mode: 'inline' } as WorkPackageViewHighlight);\n return this.filteredValue(value);\n }\n\n public get isInline() {\n return this.current.mode === 'inline';\n }\n\n public get isDisabled() {\n return this.current.mode === 'none';\n }\n\n public update(value:WorkPackageViewHighlight) {\n super.update(this.filteredValue(value));\n }\n\n public valueFromQuery(query:QueryResource):WorkPackageViewHighlight {\n const highlight = { mode: query.highlightingMode || 'inline', selectedAttributes: query.highlightedAttributes };\n return this.filteredValue(highlight);\n }\n\n public hasChanged(query:QueryResource) {\n return query.highlightingMode !== this.current.mode\n || !_.isEqual(query.highlightedAttributes, this.current.selectedAttributes);\n }\n\n public applyToQuery(query:QueryResource):boolean {\n const { current } = this;\n query.highlightingMode = current.mode;\n\n query.highlightedAttributes = current.selectedAttributes;\n\n return false;\n }\n\n private filteredValue(value:WorkPackageViewHighlight):WorkPackageViewHighlight {\n if (_.isEmpty(value.selectedAttributes)) {\n value.selectedAttributes = undefined;\n }\n\n this.Banners.conditional(() => {\n value.mode = 'none';\n value.selectedAttributes = undefined;\n });\n\n return value;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable } from '@angular/core';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewIncludeSubprojectsService extends WorkPackageQueryStateService {\n public constructor(\n readonly states:States,\n readonly querySpace:IsolatedQuerySpace,\n ) {\n super(querySpace);\n }\n\n public hasChanged(query:QueryResource):boolean {\n return this.current !== query.includeSubprojects;\n }\n\n valueFromQuery(query:QueryResource):boolean {\n return query.includeSubprojects || false;\n }\n\n public applyToQuery(query:QueryResource):boolean {\n const { current } = this;\n query.includeSubprojects = current; // eslint-disable-line no-param-reassign\n\n return true;\n }\n\n public get current():boolean {\n return this.lastUpdatedState.getValueOr(false);\n }\n\n public setIncludeSubprojects(include:boolean):void {\n this.update(include);\n }\n}\n","import { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { QueryOrder } from 'core-app/core/apiv3/endpoints/queries/apiv3-query-order';\n\n// min allowed position\nexport const MIN_ORDER = -2147483647;\n// max postgres 4-byte integer position\nexport const MAX_ORDER = 2147483647;\n// default position to insert\nexport const DEFAULT_ORDER = 0;\n// The distance to keep between each element\nexport const ORDER_DISTANCE = 16384;\n\n/**\n * Return either the delta position or the previous persisted position,\n * in that order.\n *\n * @param wpId\n */\nfunction livePosition(\n delta:QueryOrder,\n positions:QueryOrder,\n wpId:string,\n):number|undefined {\n // Explicitly check for undefined here as the delta might be 0 which is falsey.\n return delta[wpId] === undefined ? positions[wpId] : delta[wpId];\n}\n\n/**\n * Return the position number for the given index\n */\nfunction positionFor(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n index:number,\n):number|undefined {\n const wpId = order[index];\n return livePosition(delta, positions, wpId);\n}\n\n/**\n * Ensure +order+ is already ascending with the exception of +index+,\n * or otherwise reorder the positions starting from the first element.\n */\nfunction isAscendingOrder(\n order:string[],\n positions:QueryOrder,\n index:number,\n):boolean {\n let current:number|undefined;\n\n for (let i = 0, l = order.length; i < l; i += 1) {\n const id = order[i];\n const position = positions[id];\n\n // Skip our insertion point\n if (i === index) {\n continue;\n }\n\n // If neither position is set\n if (current === undefined || position === undefined) {\n current = position;\n continue;\n }\n\n // If the next position is not larger, rebuild positions\n if (position < current) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Since from and to index or only one apart,\n * we can swap the positions.\n *\n * TODO: This should not modify in-place and then return an unrelated value\n */\nfunction positionSwap(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n index:number,\n fromIndex:number|null,\n wpId:string,\n):QueryOrder {\n if (fromIndex === null) {\n return delta;\n }\n\n const myPosition = positionFor(delta, order, positions, index);\n const neighbor = order[fromIndex];\n const neighborPosition = positionFor(delta, order, positions, fromIndex);\n\n // If either the neighbor or wpid have no position yet,\n // go through the regular update flow\n if (myPosition === undefined || neighborPosition === undefined) {\n return delta;\n }\n\n return {\n ...delta,\n [`${wpId}`]: neighborPosition,\n [`${neighbor}`]: myPosition,\n };\n}\n\n/**\n * Insert wpId as the first element\n */\nfunction insertAsFirst(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n index:number,\n wpId:string,\n) {\n // Get the actual successor position, it might vary wildly from the optimal position\n const successorPosition = positionFor(delta, order, positions, index + 1);\n\n // If the successor also has no position yet, simply assign the default\n if (successorPosition === undefined) {\n return {\n ...delta,\n [wpId]: DEFAULT_ORDER,\n };\n }\n return {\n ...delta,\n [wpId]: successorPosition - (ORDER_DISTANCE / 2),\n };\n}\n\n/**\n * Builds any previous unset position from 0 .. index\n * so we can properly insert the wpId @ index.\n */\nfunction buildUpPredecessorPosition(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n index:number,\n) {\n let predecessorPosition:number = DEFAULT_ORDER - ORDER_DISTANCE;\n const newDelta = { ...delta };\n for (let i = 0; i < index; i += 1) {\n const id = order[i];\n const position = positions[id];\n\n // If this current ID has no position yet, assign the current one\n if (position === undefined) {\n newDelta[id] = predecessorPosition + ORDER_DISTANCE;\n predecessorPosition = newDelta[id];\n } else {\n predecessorPosition = position;\n }\n }\n\n return {\n predecessorPosition,\n delta: newDelta,\n };\n}\n\n/**\n * Returns the minimal position assigned currently\n */\nfunction firstPosition(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n):number {\n const wpId = order[0] || '';\n return livePosition(delta, positions, wpId) || 0;\n}\n\n/**\n * Returns the maximum position assigned currently.\n * Note that a list can be unpositioned at the beginning, so this may return undefined\n */\nfunction lastPosition(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n):number {\n for (let i = order.length - 1; i >= 0; i -= 1) {\n const wpId = order[i];\n const position = livePosition(delta, positions, wpId);\n\n // Return the first set position.\n if (position !== undefined) {\n return position;\n }\n }\n\n return 0;\n}\n\n/**\n * Distribute the items over a given min/max\n */\nfunction redistribute(\n delta:QueryOrder,\n order:string[],\n minIndex:number,\n maxIndex:number,\n) {\n const itemsToDistribute = order.length;\n\n let min = minIndex;\n let max = maxIndex;\n\n // We can keep min and max orders if distance/(items to distribute) >= 1\n let space = Math.floor((max - min) / (itemsToDistribute - 1));\n\n // If no space is left, first try to add to the max item\n // Or subtract from the min item\n if (space < 1) {\n if ((max + itemsToDistribute) <= MAX_ORDER) {\n max += itemsToDistribute;\n } else if ((min - itemsToDistribute) >= MIN_ORDER) {\n min -= itemsToDistribute;\n } else {\n // This should not happen in a 4-byte integer with our frontend\n throw new Error('Elements cannot be moved further and no space is left. Too many elements');\n }\n\n // Rebuild space\n space = Math.floor((max - min) / (itemsToDistribute - 1));\n }\n\n // Assign positions for all values in between min/max\n const newDelta = { ...delta };\n for (let i = 0; i < itemsToDistribute; i += 1) {\n const wpId = order[i];\n newDelta[wpId] = min + (i * space);\n }\n\n return newDelta;\n}\n\n/**\n * There was no space left at the desired insert position,\n * we're going to evenly distribute all items again\n */\nfunction reorderedInsert(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n) {\n // Get the current distance between orders\n // Both must be set by now due to +buildUpPredecessorPosition+ having run.\n const min = firstPosition(delta, order, positions);\n const max = lastPosition(delta, order, positions);\n\n return redistribute(delta, order, min, max);\n}\n\n/**\n * Insert +wpId+ at +index+ in a position that is determined either\n * by its neighbors, one of them in case both do not yet have a position\n */\nfunction buildInsertPosition(\n order:string[],\n positions:QueryOrder,\n wpId:string,\n index:number,\n fromIndex:number|null,\n):QueryOrder {\n const delta = {};\n // Special case, order is empty or only contains wpId\n // Then simply insert as the default position unless it already has a position\n if (order.length <= 1 && positions[wpId] === undefined) {\n return {\n ...delta,\n [wpId]: DEFAULT_ORDER,\n };\n }\n\n // Special case, shifted movement by one\n const newDelta = positionSwap(delta, order, positions, index, fromIndex, wpId);\n if (fromIndex !== null\n && Math.abs(fromIndex - index) === 1\n && delta !== newDelta\n ) {\n return newDelta;\n }\n\n // Special case, index is 0\n if (index === 0) {\n return insertAsFirst(newDelta, order, positions, index, wpId);\n }\n\n // Ensure previous positions exist so we can insert wpId @ index\n const { delta: rebuiltDelta, predecessorPosition } = buildUpPredecessorPosition(newDelta, order, positions, index);\n\n // Ensure we reorder when predecessor is at max already\n if (predecessorPosition >= MAX_ORDER) {\n debugLog('Predecessor position is at max order, need to reorder');\n return reorderedInsert(rebuiltDelta, order, positions);\n }\n\n // Get the actual successor position, it might vary wildly from the optimal position\n const successorPosition = positionFor(rebuiltDelta, order, positions, index + 1);\n\n if (successorPosition === undefined) {\n // Successor does not have a position yet (is NULL), any position will work\n // so let's use the optimal one which is halfway to a potential successor\n return {\n ...rebuiltDelta,\n [wpId]: predecessorPosition + (ORDER_DISTANCE / 2),\n };\n }\n\n // Ensure we reorder when successor is at max already\n if (successorPosition >= MAX_ORDER) {\n debugLog('Successor position is at max order, need to reorder');\n return reorderedInsert(rebuiltDelta, order, positions);\n }\n\n // successor exists and has a position\n // We will want to insert at the half way from predecessorPosition ... successorPosition\n const distance = Math.floor((successorPosition - predecessorPosition) / 2);\n\n // If there is no space to insert, we're going to optimize the available space\n if (distance < 1) {\n debugLog('Cannot insert at optimal position, no space left. Need to reorder');\n return reorderedInsert(rebuiltDelta, order, positions);\n }\n\n return {\n ...rebuiltDelta,\n [wpId]: predecessorPosition + distance,\n };\n}\n\n/**\n * Get the absolute minimum and maximum positions\n * currently assigned in the slot.\n *\n * If there is at least two positions assigned, returns the maximum\n * between them.\n *\n * Otherwise, returns the optimum min max for the given order length.\n */\nfunction minMaxPositions(\n delta:QueryOrder,\n order:string[],\n positions:QueryOrder,\n):[number, number] {\n let min:number = MAX_ORDER;\n let max:number = MIN_ORDER;\n let any = false;\n\n for (let i = order.length - 1; i >= 0; i -= 1) {\n const wpId = order[i];\n const position = livePosition(delta, positions, wpId);\n\n if (position !== undefined) {\n min = Math.min(position, min);\n max = Math.max(position, max);\n any = true;\n }\n }\n\n if (any && min !== max) {\n return [min, max];\n }\n return [DEFAULT_ORDER, order.length * ORDER_DISTANCE];\n}\n\n/**\n * Reassign mixed positions so that they are strictly ascending again,\n * but try to keep relative positions alive\n */\nfunction rebuildPositions(\n order:string[],\n positions:QueryOrder,\n) {\n const delta:QueryOrder = {};\n const [min, max] = minMaxPositions(delta, order, positions);\n return redistribute(delta, order, min, max);\n}\n\n/**\n * Build a delta\n * Computes the delta of positions for a given operation and order\n *\n * @param order The current order of work packages that contains the user movement\n * @param positions The current positions as loaded from backend / persisted from previous calls\n * @param wpId The work package that got moved\n * @param index The index a work package got moved into\n * @param fromIndex If moved within the order, the previous index used for movement optimzation\n */\nexport function buildDelta(\n order:string[],\n positions:QueryOrder,\n wpId:string,\n index:number,\n fromIndex:number|null,\n):QueryOrder {\n if (!isAscendingOrder(order, positions, index)) {\n return rebuildPositions(order, positions);\n }\n\n // Insert only the new element\n return buildInsertPosition(order, positions, wpId, index, fromIndex);\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { take } from 'rxjs/operators';\nimport { InputState } from 'reactivestates';\nimport { States } from 'core-app/core/states/states.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { QuerySchemaResource } from 'core-app/features/hal/resources/query-schema-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport isPersistedResource from 'core-app/features/hal/helpers/is-persisted-resource';\nimport { MAX_ORDER, buildDelta } from 'core-app/shared/helpers/drag-and-drop/reorder-delta-builder';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { CausedUpdatesService } from 'core-app/features/boards/board/caused-updates/caused-updates.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { QueryOrder } from 'core-app/core/apiv3/endpoints/queries/apiv3-query-order';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewOrderService extends WorkPackageQueryStateService {\n constructor(protected readonly querySpace:IsolatedQuerySpace,\n protected readonly apiV3Service:ApiV3Service,\n protected readonly states:States,\n protected readonly causedUpdates:CausedUpdatesService,\n protected readonly wpTableSortBy:WorkPackageViewSortByService,\n protected readonly pathHelper:PathHelperService) {\n super(querySpace);\n }\n\n public initialize(query:QueryResource, results:WorkPackageCollectionResource, schema?:QuerySchemaResource):Promise {\n // Take over our current value if the query is not saved\n if (!isPersistedResource(query) && this.positions.hasValue()) {\n this.applyToQuery(query);\n }\n\n if (this.wpTableSortBy.isManualSortingMode) {\n return this.withLoadedPositions();\n }\n\n return Promise.resolve();\n }\n\n /**\n * Move an item in the list\n */\n public async move(order:string[], wpId:string, toIndex:number):Promise {\n // Find index of the work package\n const fromIndex:number = order.findIndex((id) => id === wpId);\n\n order.splice(fromIndex, 1);\n order.splice(toIndex, 0, wpId);\n\n await this.assignPosition(order, wpId, toIndex, fromIndex);\n\n return order;\n }\n\n /**\n * Pull an item from the rendered list\n */\n public remove(order:string[], wpId:string):string[] {\n _.remove(order, (id) => id === wpId);\n this.update({ [wpId]: -1 });\n return order;\n }\n\n /**\n * Add an item to the list\n */\n public async add(order:string[], wpId:string, toIndex = -1):Promise {\n if (toIndex === -1) {\n order.push(wpId);\n toIndex = order.length - 1;\n } else {\n order.splice(toIndex, 0, wpId);\n }\n\n await this.assignPosition(order, wpId, toIndex);\n\n return order;\n }\n\n public get applicable() {\n return isPersistedResource(this.currentQuery);\n }\n\n protected get currentQuery():QueryResource {\n return this.querySpace.query.value!;\n }\n\n /**\n * Assign a position for the given work package and its index given the current order\n * @param order Current order the work package was inserted to\n * @param wpId The work package ID that was moved\n * @param toIndex The id of the work package in order\n */\n protected async assignPosition(order:string[], wpId:string, toIndex:number, fromIndex:number|null = null) {\n const positions = await this.withLoadedPositions();\n const delta = buildDelta(order, positions, wpId, toIndex, fromIndex);\n\n await this.update(delta);\n }\n\n protected get positions():InputState {\n return this.updatesState;\n }\n\n /**\n * Update the order state\n */\n public async update(delta:QueryOrder) {\n const current = this.positions.getValueOr({});\n this.positions.putValue({ ...current, ...delta });\n\n // Push the update if the query is saved\n if (isPersistedResource(this.currentQuery)) {\n const updatedAt = await this\n .apiV3Service\n .queries.id(this.currentQuery)\n .order\n .update(delta);\n\n this.currentQuery.updatedAt = updatedAt;\n\n // Remember that we caused this update\n this.causedUpdates.add(this.currentQuery);\n }\n\n // Push into the query object\n this.applyToQuery(this.currentQuery);\n\n // Update the query\n this.querySpace.query.putValue(this.currentQuery);\n }\n\n /**\n * Initialize (or load if persisted) the order for the query space\n */\n public withLoadedPositions():Promise {\n if (isPersistedResource(this.currentQuery)) {\n const { value } = this.positions;\n\n // Remove empty or stale values given we can reload them\n if ((_.isEmpty(value) || this.positions.isValueOlderThan(60000))) {\n this.positions.clear('Clearing old positions value');\n }\n\n // Load the current order from backend\n this.positions.putFromPromiseIfPristine(\n () => this\n .apiV3Service\n .queries.id(this.currentQuery)\n .order\n .get(),\n );\n } else if (this.positions.isPristine()) {\n // Insert an empty fallback in case we have no data yet\n this.positions.putValue({});\n }\n\n return this.positions\n .values$()\n .pipe(take(1))\n .toPromise();\n }\n\n public valueFromQuery(query:QueryResource) {\n return undefined;\n }\n\n /**\n * Return ordered work packages\n */\n orderedWorkPackages():WorkPackageResource[] {\n const upstreamOrder = this.querySpace\n .results\n .value!\n .elements\n .map((wp) => this.states.workPackages.get(wp.id!).getValueOr(wp));\n\n if (isPersistedResource(this.currentQuery) || this.positions.isPristine()) {\n return upstreamOrder;\n }\n const positions = this.positions.value!;\n return _.sortBy(upstreamOrder, (wp) => {\n const pos = positions[wp.id!];\n return pos !== undefined ? pos : MAX_ORDER;\n });\n }\n\n applyToQuery(query:QueryResource):boolean {\n query.orderedWorkPackages = this.positions.getValueOr({});\n return false;\n }\n\n hasChanged(query:QueryResource):boolean {\n return false;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { PaginationInstance } from 'core-app/shared/components/table-pagination/pagination-instance';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\n\nexport class WorkPackageViewPagination {\n public current:PaginationInstance;\n\n constructor(results:WorkPackageCollectionResource) {\n this.current = new PaginationInstance(results.offset, results.total, results.pageSize);\n }\n\n public get page() {\n return this.current.page;\n }\n\n public set page(val) {\n this.current.page = val;\n }\n\n public get perPage() {\n return this.current.perPage;\n }\n\n public set perPage(val) {\n this.current.perPage = val;\n }\n\n public get total() {\n return this.current.total;\n }\n\n public set total(val) {\n this.current.total = val;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageViewPagination } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-pagination';\nimport { WorkPackageViewBaseService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-base.service';\nimport { PaginationObject, PaginationService } from 'core-app/shared/components/table-pagination/pagination-service';\n\nexport interface PaginationUpdateObject {\n page?:number;\n perPage?:number;\n total?:number;\n count?:number;\n}\n\n@Injectable()\nexport class WorkPackageViewPaginationService extends WorkPackageViewBaseService {\n public constructor(querySpace:IsolatedQuerySpace,\n readonly paginationService:PaginationService) {\n super(querySpace);\n }\n\n public get paginationObject():PaginationObject {\n if (this.current) {\n return {\n pageSize: this.current.perPage,\n offset: this.current.page,\n };\n }\n return {\n pageSize: this.paginationService.getCachedPerPage([]),\n offset: 1,\n };\n }\n\n public valueFromQuery(query:QueryResource, results:WorkPackageCollectionResource) {\n return new WorkPackageViewPagination(results);\n }\n\n public updateFromObject(object:PaginationUpdateObject) {\n const currentState = this.current;\n\n if (object.page) {\n currentState.page = object.page;\n }\n if (object.perPage) {\n currentState.perPage = object.perPage;\n }\n if (object.total) {\n currentState.total = object.total;\n }\n\n this.updatesState.putValue(currentState);\n }\n\n public updateFromResults(results:WorkPackageCollectionResource) {\n const update = {\n page: results.offset,\n perPage: results.pageSize,\n total: results.total,\n count: results.count,\n };\n\n this.updateFromObject(update);\n }\n\n public get current():WorkPackageViewPagination {\n return this.lastUpdatedState.value!;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { WorkPackageViewRelationColumns } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-relation-columns';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { RelationsStateValue, WorkPackageRelationsService } from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { Injectable } from '@angular/core';\nimport {\n QueryColumn,\n queryColumnTypes,\n RelationQueryColumn,\n TypeRelationQueryColumn,\n} from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { WorkPackageViewBaseService } from './wp-view-base.service';\nimport { WorkPackageViewColumnsService } from './wp-view-columns.service';\n\nexport type RelationColumnType = 'toType'|'ofType';\n\n@Injectable()\nexport class WorkPackageViewRelationColumnsService extends WorkPackageViewBaseService {\n constructor(public querySpace:IsolatedQuerySpace,\n public wpTableColumns:WorkPackageViewColumnsService,\n public halResourceService:HalResourceService,\n public apiV3Service:ApiV3Service,\n public wpRelations:WorkPackageRelationsService) {\n super(querySpace);\n }\n\n public valueFromQuery(query:QueryResource):WorkPackageViewRelationColumns {\n // Take over current expanded values\n // which are not yet saved\n return this.current;\n }\n\n /**\n * Returns a subset of all relations that the user has currently expanded.\n *\n * @param workPackage\n * @param relation\n */\n public relationsToExtendFor(workPackage:WorkPackageResource,\n relations:RelationsStateValue|undefined,\n eachCallback:(relation:RelationResource, column:QueryColumn, type:RelationColumnType) => void) {\n // Only if any relation columns or stored expansion state exist\n if (!(this.wpTableColumns.hasRelationColumns() && this.lastUpdatedState.hasValue())) {\n return;\n }\n\n // Only if any relations exist for this work package\n if (_.isNil(relations)) {\n return;\n }\n\n // Only if the work package has anything expanded\n const expanded = this.getExpandFor(workPackage.id!);\n if (expanded === undefined) {\n return;\n }\n\n const column = this.wpTableColumns.findById(expanded)!;\n const type = this.relationColumnType(column);\n\n if (type !== null) {\n _.each(this.relationsForColumn(workPackage, relations, column),\n (relation) => eachCallback(relation, column, type));\n }\n }\n\n /**\n * Get the subset of relations for the work package that belong to this relation column\n *\n * @param workPackage A work package resource\n * @param relations The RelationStateValue of this work package\n * @param column The relation column to filter for\n * @return The filtered relations\n */\n public relationsForColumn(workPackage:WorkPackageResource, relations:RelationsStateValue|undefined, column:QueryColumn) {\n if (_.isNil(relations)) {\n return [];\n }\n\n // Get the type of TO work package\n const type = this.relationColumnType(column);\n if (type === 'toType') {\n const typeHref = (column as TypeRelationQueryColumn).type.href;\n\n return _.filter(relations, (relation:RelationResource) => {\n const denormalized = relation.denormalized(workPackage);\n const target = this.apiV3Service.work_packages.cache.state(denormalized.targetId).value;\n\n return _.get(target, 'type.href') === typeHref;\n });\n }\n\n // Get the relation types for OF relation columns\n if (type === 'ofType') {\n const { relationType } = column as RelationQueryColumn;\n\n return _.filter(relations, (relation:RelationResource) => relation.denormalized(workPackage).relationType === relationType);\n }\n\n return [];\n }\n\n public relationColumnType(column:QueryColumn):RelationColumnType|null {\n switch (column._type) {\n case queryColumnTypes.RELATION_TO_TYPE:\n return 'toType';\n case queryColumnTypes.RELATION_OF_TYPE:\n return 'ofType';\n default:\n return null;\n }\n }\n\n public getExpandFor(workPackageId:string):string|undefined {\n return this.current[workPackageId];\n }\n\n public setExpandFor(workPackageId:string, columnId:string) {\n const nextState = { ...this.current };\n nextState[workPackageId] = columnId;\n\n this.update(nextState);\n }\n\n public collapse(workPackageId:string) {\n const nextState = { ...this.current };\n delete nextState[workPackageId];\n\n this.update(nextState);\n }\n\n public get current():WorkPackageViewRelationColumns {\n return this.lastUpdatedState.getValueOr({});\n }\n}\n","import { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable, OnDestroy } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { States } from 'core-app/core/states/states.service';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { WorkPackageViewBaseService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-base.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport * as Mousetrap from 'mousetrap';\n\nexport interface WorkPackageViewSelectionState {\n // Map of selected rows\n selected:{ [workPackageId:string]:boolean };\n // Index of current selection\n // required for shift-offsets\n activeRowIndex:number|null;\n}\n\n@Injectable()\nexport class WorkPackageViewSelectionService extends WorkPackageViewBaseService implements OnDestroy {\n public constructor(readonly querySpace:IsolatedQuerySpace,\n readonly states:States,\n readonly opContextMenu:OPContextMenuService) {\n super(querySpace);\n this.reset();\n }\n\n ngOnDestroy():void {\n Mousetrap.unbind(['command+d', 'ctrl+d']);\n Mousetrap.unbind(['command+a', 'ctrl+a']);\n }\n\n public initializeSelection(selectedWorkPackageIds:string[]) {\n const state:WorkPackageViewSelectionState = {\n selected: {},\n activeRowIndex: null,\n };\n\n selectedWorkPackageIds.forEach((id) => state.selected[id] = true);\n\n this.updatesState.clear();\n this.pristineState.putValue(state);\n }\n\n public isSelected(workPackageId:string):boolean {\n return !!this.current?.selected[workPackageId];\n }\n\n /**\n * Select all work packages\n */\n public selectAll(rows:RenderedWorkPackage[]) {\n const state:WorkPackageViewSelectionState = this._emptyState;\n\n rows.forEach((row) => {\n if (row.workPackageId) {\n state.selected[row.workPackageId] = true;\n }\n });\n\n this.update(state);\n }\n\n /**\n * Get the current work package resource form the selection state.\n */\n public getSelectedWorkPackages():WorkPackageResource[] {\n const wpState = this.states.workPackages;\n return this.getSelectedWorkPackageIds().map((id) => wpState.get(id).value!);\n }\n\n public getSelectedWorkPackageIds():string[] {\n const selected:string[] = [];\n\n _.each(this.current?.selected, (isSelected:boolean, wpId:string) => {\n if (isSelected) {\n selected.push(wpId);\n }\n });\n\n return selected;\n }\n\n /**\n * Reset the selection state to an empty selection\n */\n public reset() {\n this.update(this._emptyState);\n }\n\n public get isEmpty() {\n return this.selectionCount === 0;\n }\n\n /**\n * Return the number of selected rows.\n */\n public get selectionCount():number {\n return _.size(this.current?.selected);\n }\n\n /**\n * Toggle a single row selection state and update the state.\n * @param workPackageId\n */\n public toggleRow(workPackageId:string) {\n const isSelected = this.current?.selected[workPackageId];\n this.setRowState(workPackageId, !isSelected);\n }\n\n /**\n * Force the given work package's selection state. Does not modify other states.\n * @param workPackageId\n * @param newState\n */\n public setRowState(workPackageId:string, newState:boolean) {\n const state = this.current || this._emptyState;\n state.selected[workPackageId] = newState;\n this.update(state);\n }\n\n /**\n * Override current selection with the given work package id.\n */\n public setSelection(wpId:string, position:number) {\n const current = this._emptyState;\n current.selected[wpId] = true;\n current.activeRowIndex = position;\n\n this.update(current);\n }\n\n /**\n * Select a number of rows from the current `activeRowIndex`\n * to the selected target.\n * (aka shift click expansion)\n */\n public setMultiSelectionFrom(rows:RenderedWorkPackage[], wpId:string, position:number) {\n const state = this.current || this._emptyState;\n\n // If there are no other selections, it does not matter what the index is\n if (this.selectionCount === 0 || state.activeRowIndex === null) {\n state.selected[wpId] = true;\n state.activeRowIndex = position;\n } else {\n const start = Math.min(position, state.activeRowIndex);\n const end = Math.max(position, state.activeRowIndex);\n\n rows.forEach((row, i) => {\n if (row.workPackageId) {\n state.selected[row.workPackageId] = i >= start && i <= end;\n }\n });\n }\n\n this.update(state);\n }\n\n public registerSelectAllListener(renderedElements:() => RenderedWorkPackage[]) {\n // Bind CTRL+A to select all work packages\n Mousetrap.bind(['command+a', 'ctrl+a'], (e) => {\n this.selectAll(renderedElements());\n e.preventDefault();\n\n this.opContextMenu.close();\n return false;\n });\n }\n\n public registerDeselectAllListener() {\n // Bind CTRL+D to deselect all work packages\n Mousetrap.bind(['command+d', 'ctrl+d'], (e) => {\n this.reset();\n e.preventDefault();\n\n this.opContextMenu.close();\n return false;\n });\n }\n\n private get _emptyState():WorkPackageViewSelectionState {\n return {\n selected: {},\n activeRowIndex: null,\n };\n }\n\n valueFromQuery(query:QueryResource, results:WorkPackageCollectionResource):WorkPackageViewSelectionState|undefined {\n return undefined;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { combine } from 'reactivestates';\nimport { mapTo } from 'rxjs/operators';\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { States } from 'core-app/core/states/states.service';\nimport { QuerySortByResource } from 'core-app/features/hal/resources/query-sort-by-resource';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewSortByService extends WorkPackageQueryStateService {\n constructor(protected readonly states:States,\n protected readonly querySpace:IsolatedQuerySpace,\n protected readonly pathHelper:PathHelperService) {\n super(querySpace);\n }\n\n public valueFromQuery(query:QueryResource) {\n return [...query.sortBy];\n }\n\n public onReadyWithAvailable():Observable {\n return combine(this.pristineState, this.querySpace.available.sortBy)\n .values$()\n .pipe(\n mapTo(null),\n );\n }\n\n public hasChanged(query:QueryResource) {\n const comparer = (sortBy:QuerySortByResource[]) => sortBy.map((el) => el.href);\n\n return !_.isEqual(\n comparer(query.sortBy),\n comparer(this.current),\n );\n }\n\n public applyToQuery(query:QueryResource) {\n const wasManuallySorted = this.isManuallySorted(query.sortBy);\n\n query.sortBy = [...this.current];\n\n // Reload every time unless we stayed in manual sort mode\n return !(wasManuallySorted && this.isManualSortingMode);\n }\n\n public isSortable(column:QueryColumn):boolean {\n return !!_.find(\n this.available,\n (candidate) => candidate.column.href === column.href,\n );\n }\n\n public addSortCriteria(column:QueryColumn, criteria:string) {\n const available = this.findAvailableDirection(column, criteria);\n\n if (available) {\n this.add(available);\n }\n }\n\n public setAsSingleSortCriteria(column:QueryColumn, criteria:string) {\n const available:QuerySortByResource = this.findAvailableDirection(column, criteria)!;\n\n if (available) {\n this.update([available]);\n }\n }\n\n public findAvailableDirection(column:QueryColumn, direction:string):QuerySortByResource | undefined {\n return _.find(\n this.available,\n (candidate) => (candidate.column.href === column.href\n && candidate.direction.href === direction),\n );\n }\n\n public add(sortBy:QuerySortByResource) {\n const newValue = _\n .uniqBy([sortBy, ...this.current], (sortBy) => sortBy.column.href)\n .slice(0, 3);\n\n this.update(newValue);\n }\n\n public get isManualSortingMode():boolean {\n return this.isManuallySorted(this.current);\n }\n\n public switchToManualSorting(query:QueryResource):boolean {\n const { manualSortObject } = this;\n if (manualSortObject && !this.isManualSortingMode) {\n query.setSortBy([manualSortObject]);\n return true;\n }\n\n return false;\n }\n\n public get current():QuerySortByResource[] {\n return this.lastUpdatedState.getValueOr([]);\n }\n\n private get availableState() {\n return this.querySpace.available.sortBy;\n }\n\n public get available():QuerySortByResource[] {\n return this.availableState.getValueOr([]);\n }\n\n private isManuallySorted(sortBy:QuerySortByResource[]):boolean {\n if (sortBy && sortBy.length > 0) {\n return sortBy[0].column.href!.endsWith('/manualSorting');\n }\n\n return false;\n }\n\n private get manualSortObject() {\n return _.find(this.available, (sort) => sort.column.href!.endsWith('/manualSorting'));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Injectable } from '@angular/core';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewSumService extends WorkPackageQueryStateService {\n public constructor(querySpace:IsolatedQuerySpace) {\n super(querySpace);\n }\n\n public valueFromQuery(query:QueryResource) {\n return !!query.sums;\n }\n\n public initialize(query:QueryResource) {\n this.pristineState.putValue(!!query.sums);\n }\n\n public hasChanged(query:QueryResource) {\n return query.sums !== this.isEnabled;\n }\n\n public applyToQuery(query:QueryResource) {\n query.sums = this.isEnabled;\n return true;\n }\n\n public toggle() {\n this.updatesState.putValue(!this.current);\n }\n\n public setEnabled(value:boolean) {\n this.updatesState.putValue(value);\n }\n\n public get isEnabled() {\n return this.current;\n }\n\n public get current():boolean {\n return this.lastUpdatedState.getValueOr(false);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { input } from 'reactivestates';\nimport { WorkPackageTimelineState } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-timeline';\nimport { zoomLevelOrder } from 'core-app/features/work-packages/components/wp-table/timeline/wp-timeline';\nimport { QueryResource, TimelineLabels, TimelineZoomLevel } from 'core-app/features/hal/resources/query-resource';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\n\n@Injectable()\nexport class WorkPackageViewTimelineService extends WorkPackageQueryStateService {\n /** Remember the computed zoom level to correct zooming after leaving autozoom */\n public appliedZoomLevel$ = input('auto');\n\n public constructor(protected readonly querySpace:IsolatedQuerySpace) {\n super(querySpace);\n }\n\n public valueFromQuery(query:QueryResource) {\n return {\n ...this.defaultState,\n visible: query.timelineVisible,\n zoomLevel: query.timelineZoomLevel,\n labels: query.timelineLabels,\n };\n }\n\n public set appliedZoomLevel(val:TimelineZoomLevel) {\n this.appliedZoomLevel$.putValue(val);\n }\n\n public get appliedZoomLevel() {\n return this.appliedZoomLevel$.value!;\n }\n\n public hasChanged(query:QueryResource) {\n const visibilityChanged = this.isVisible !== query.timelineVisible;\n const zoomLevelChanged = this.zoomLevel !== query.timelineZoomLevel;\n const labelsChanged = !_.isEqual(this.current.labels, query.timelineLabels);\n\n return visibilityChanged || zoomLevelChanged || labelsChanged;\n }\n\n public applyToQuery(query:QueryResource) {\n query.timelineVisible = this.isVisible;\n query.timelineZoomLevel = this.zoomLevel;\n query.timelineLabels = this.current.labels;\n\n return false;\n }\n\n public toggle() {\n const currentState = this.current;\n this.setVisible(!currentState.visible);\n }\n\n public setVisible(value:boolean) {\n this.updatesState.putValue({ ...this.current, visible: value });\n }\n\n public get isVisible() {\n return this.current.visible;\n }\n\n public get zoomLevel() {\n return this.current.zoomLevel;\n }\n\n public get labels() {\n if (_.isEmpty(this.current.labels)) {\n return this.defaultLabels;\n }\n\n return this.current.labels;\n }\n\n public updateLabels(labels:TimelineLabels) {\n this.modify({ labels });\n }\n\n public getNormalizedLabels(workPackage:WorkPackageResource) {\n const labels:TimelineLabels = this.defaultLabels;\n\n _.each(this.current.labels, (attribute:string | null, positionAsString:string) => {\n // RR: Lodash typings declare the position as string. However, it is save to cast\n // to `keyof TimelineLabels` because `this.current.labels` is of type TimelineLabels.\n const position:keyof TimelineLabels = positionAsString as keyof TimelineLabels;\n\n // Set to null to explicitly disable\n if (attribute === '') {\n labels[position] = null;\n } else {\n labels[position] = attribute;\n }\n });\n\n return labels;\n }\n\n public setZoomLevel(level:TimelineZoomLevel) {\n this.modify({ zoomLevel: level });\n }\n\n public updateZoomWithDelta(delta:number):void {\n const level = this.current.zoomLevel;\n if (level !== 'auto') {\n return this.applyZoomLevel(level, delta);\n }\n\n const applied = this.appliedZoomLevel;\n if (applied && applied !== 'auto') {\n // When we have a real zoom value, use delta on that one\n this.applyZoomLevel(applied, delta);\n } else {\n // Use the maximum zoom value\n const target = delta < 0 ? 'days' : 'years';\n this.setZoomLevel(target);\n }\n }\n\n public isAutoZoom():boolean {\n return this.current.zoomLevel === 'auto';\n }\n\n public enableAutozoom() {\n this.modify({ zoomLevel: 'auto' });\n }\n\n public get current():WorkPackageTimelineState {\n return this.lastUpdatedState.getValueOr(this.defaultState);\n }\n\n /**\n * Modify the state, updating with parts of properties\n * @param update\n */\n private modify(update:Partial) {\n this.update({ ...this.current, ...update } as WorkPackageTimelineState);\n }\n\n /**\n * Apply a zoom level\n *\n * @param level Any zoom level except auto.\n * @param delta The delta (e.g., 1, -1) to apply.\n */\n private applyZoomLevel(level:Exclude, delta:number) {\n let idx = zoomLevelOrder.indexOf(level);\n idx += delta;\n\n if (idx >= 0 && idx < zoomLevelOrder.length) {\n this.setZoomLevel(zoomLevelOrder[idx]);\n }\n }\n\n private get defaultLabels():TimelineLabels {\n return {\n left: '',\n right: '',\n farRight: 'subject',\n };\n }\n\n private get defaultState():WorkPackageTimelineState {\n return {\n zoomLevel: 'auto',\n visible: false,\n labels: this.defaultLabels,\n };\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ChangeDetectorRef, Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport {\n WorkPackageViewFocusService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { OpTitleService } from 'core-app/core/html/op-title.service';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { States } from 'core-app/core/states/states.service';\nimport {\n KeepTabService,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\nimport {\n HalResourceEditingService,\n} from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport {\n WorkPackageNotificationService,\n} from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport {\n switchMap, take,\n} from 'rxjs/operators';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { WpSingleViewService } from 'core-app/features/work-packages/routing/wp-view-base/state/wp-single-view.service';\nimport { Observable } from 'rxjs';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { AttachmentsResourceService } from 'core-app/core/state/attachments/attachments.service';\nimport { StoragesResourceService } from 'core-app/core/state/storages/storages.service';\nimport { FileLinksResourceService } from 'core-app/core/state/file-links/file-links.service';\nimport { ProjectsResourceService } from 'core-app/core/state/projects/projects.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { HttpErrorResponse } from '@angular/common/http';\n\nexport class WorkPackageSingleViewBase extends UntilDestroyedMixin {\n @InjectField() states:States;\n\n @InjectField() i18n:I18nService;\n\n @InjectField() keepTab:KeepTabService;\n\n @InjectField() PathHelper:PathHelperService;\n\n @InjectField() halEditing:HalResourceEditingService;\n\n @InjectField() wpTableFocus:WorkPackageViewFocusService;\n\n @InjectField() notificationService:WorkPackageNotificationService;\n\n @InjectField() authorisationService:AuthorisationService;\n\n @InjectField() private readonly attachmentsResourceService:AttachmentsResourceService;\n\n @InjectField() private readonly fileLinkResourceService:FileLinksResourceService;\n\n @InjectField() private readonly projectsResourceService:ProjectsResourceService;\n\n @InjectField() private readonly storages:StoragesResourceService;\n\n @InjectField() private readonly toastService:ToastService;\n\n @InjectField() cdRef:ChangeDetectorRef;\n\n @InjectField() readonly titleService:OpTitleService;\n\n @InjectField() readonly apiV3Service:ApiV3Service;\n\n @InjectField() readonly hooks:HookService;\n\n @InjectField() readonly actions$:ActionsService;\n\n @InjectField() readonly storeService:WpSingleViewService;\n\n // Work package resource to be loaded from the cache\n public workPackage:WorkPackageResource;\n\n public projectIdentifier:string;\n\n public focusAnchorLabel:string;\n\n public showStaticPagePath:string;\n\n public displayNotificationsButton$:Observable;\n\n constructor(\n public injector:Injector,\n protected workPackageId:string,\n ) {\n super();\n }\n\n /**\n * Observe changes of work package and re-run initialization.\n * Needs to be run explicitly by descendants.\n */\n protected observeWorkPackage():void {\n this\n .apiV3Service\n .work_packages\n .id(this.workPackageId)\n .requireAndStream()\n .pipe(this.untilDestroyed())\n .subscribe((wp:WorkPackageResource) => {\n if (!this.workPackage) {\n this.workPackage = wp;\n this.init();\n } else {\n this.workPackage = wp;\n }\n\n this.cdRef.detectChanges();\n }, (error) => {\n this.handleLoadingError(error);\n });\n }\n\n /**\n * Initialize controller after workPackage resource has been loaded.\n */\n protected init():void {\n // Set elements\n this\n .apiV3Service\n .projects\n .id(this.workPackage.project)\n .requireAndStream()\n .subscribe(() => {\n this.projectIdentifier = this.workPackage.project.identifier;\n this.cdRef.detectChanges();\n });\n\n // lazy load the work package's project, needed when initializing\n // the work package resource from split view.\n this.projectsResourceService\n .update((this.workPackage.$links.project as HalResource).href as string)\n .subscribe(\n () => {},\n (error:HttpErrorResponse) => {\n this.toastService.addError(error);\n },\n );\n\n this.displayNotificationsButton$ = this.storeService.hasNotifications$;\n this.storeService.setFilters(this.workPackage.id as string);\n\n // Set authorisation data\n this.authorisationService.initModelAuth('work_package', this.workPackage.$links);\n\n // Push the current title\n this.titleService.setFirstPart(this.workPackage.subjectWithType(-1));\n\n // Preselect this work package for future list operations\n this.showStaticPagePath = this.PathHelper.workPackagePath(this.workPackageId);\n\n // Fetch attachments of current work package\n const attachments = this.workPackage.attachments as unknown&{ href:string };\n this.attachmentsResourceService.fetchAttachments(attachments.href).subscribe();\n\n if (this.workPackage.$links.fileLinks) {\n this.fileLinkResourceService\n .updateCollectionsForWorkPackage(this.workPackage.$links.fileLinks.href as string)\n .pipe(\n this.untilDestroyed(),\n switchMap(() => this.projectsResourceService.lookup((this.workPackage.project as unknown&{ id:string }).id)),\n take(1),\n )\n .subscribe(\n (project) => {\n if (project._links.storages) {\n this.storages.updateCollection(project._links.self.href, project._links.storages).subscribe();\n }\n },\n (error:HttpErrorResponse) => {\n this.toastService.addError(error);\n },\n );\n }\n\n // Listen to tab changes to update the tab label\n this.keepTab.observable\n .pipe(this.untilDestroyed())\n .subscribe((tabs:{ active:string }) => {\n this.updateFocusAnchorLabel(tabs.active);\n });\n }\n\n protected handleLoadingError(error:unknown):void {\n this.notificationService.handleRawError(error);\n }\n\n /**\n * Recompute the current tab focus label\n */\n public updateFocusAnchorLabel(tabName:string):string {\n this.focusAnchorLabel = this.i18n.t('js.label_work_package_details_you_are_here', {\n tab: this.i18n.t(`js.work_packages.tabs.${tabName}`),\n type: this.workPackage.type.name,\n subject: this.workPackage.subject,\n });\n return this.focusAnchorLabel;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectorRef, Directive, Injector, OnDestroy, OnInit,\n} from '@angular/core';\nimport { StateService, TransitionService } from '@uirouter/core';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { filter, take, withLatestFrom } from 'rxjs/operators';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { StaticQueriesService } from 'core-app/shared/components/op-view-select/op-static-queries.service';\nimport { WorkPackageViewHighlightingService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-highlighting.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { WorkPackageViewSortByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { WorkPackageViewSumService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sum.service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { WorkPackageViewHierarchiesService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport { WorkPackageViewPaginationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-pagination.service';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { WorkPackagesListChecksumService } from 'core-app/features/work-packages/components/wp-list/wp-list-checksum.service';\nimport { WorkPackageQueryStateService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-base.service';\nimport { WorkPackageStatesInitializationService } from 'core-app/features/work-packages/components/wp-list/wp-states-initialization.service';\nimport { WorkPackageViewOrderService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-order.service';\nimport { WorkPackageViewDisplayRepresentationService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\nimport { WorkPackageViewIncludeSubprojectsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-include-subprojects.service';\nimport { HalEvent, HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\n@Directive()\nexport abstract class WorkPackagesViewBase extends UntilDestroyedMixin implements OnInit, OnDestroy {\n @InjectField() $state:StateService;\n\n @InjectField() states:States;\n\n @InjectField() querySpace:IsolatedQuerySpace;\n\n @InjectField() authorisationService:AuthorisationService;\n\n @InjectField() wpTableColumns:WorkPackageViewColumnsService;\n\n @InjectField() wpTableHighlighting:WorkPackageViewHighlightingService;\n\n @InjectField() wpTableSortBy:WorkPackageViewSortByService;\n\n @InjectField() wpTableGroupBy:WorkPackageViewGroupByService;\n\n @InjectField() wpTableFilters:WorkPackageViewFiltersService;\n\n @InjectField() wpTableSum:WorkPackageViewSumService;\n\n @InjectField() wpTableTimeline:WorkPackageViewTimelineService;\n\n @InjectField() wpTableHierarchies:WorkPackageViewHierarchiesService;\n\n @InjectField() wpTablePagination:WorkPackageViewPaginationService;\n\n @InjectField() wpTableOrder:WorkPackageViewOrderService;\n\n @InjectField() wpListService:WorkPackagesListService;\n\n @InjectField() wpListChecksumService:WorkPackagesListChecksumService;\n\n @InjectField() loadingIndicatorService:LoadingIndicatorService;\n\n @InjectField() $transitions:TransitionService;\n\n @InjectField() I18n!:I18nService;\n\n @InjectField() opStaticQueries:StaticQueriesService;\n\n @InjectField() wpStatesInitialization:WorkPackageStatesInitializationService;\n\n @InjectField() cdRef:ChangeDetectorRef;\n\n @InjectField() wpDisplayRepresentation:WorkPackageViewDisplayRepresentationService;\n\n @InjectField() wpIncludeSubprojects:WorkPackageViewIncludeSubprojectsService;\n\n @InjectField() halEvents:HalEventsService;\n\n @InjectField() deviceService:DeviceService;\n\n @InjectField() currentProject:CurrentProjectService;\n\n /** Determine when query is initially loaded */\n queryLoaded = false;\n\n /** Remember explicitly when this component was destroyed */\n destroyed = false;\n\n constructor(public injector:Injector) {\n super();\n }\n\n ngOnInit() {\n // Listen to changes on the query state objects\n this.setupQueryObservers();\n\n // Listen for refresh changes\n this.setupRefreshObserver();\n\n // Mark tableInformationLoaded when initially loading done\n this.setupQueryLoadedListener();\n }\n\n private setupQueryObservers() {\n this.wpTablePagination\n .updates$()\n .pipe(\n this.untilDestroyed(),\n withLatestFrom(this.querySpace.query.values$()),\n ).subscribe(([pagination, query]) => {\n if (this.wpListChecksumService.isQueryOutdated(query, pagination)) {\n this.wpListChecksumService.update(query, pagination);\n this.refresh(true, false);\n }\n });\n\n this.setupChangeObserver(this.wpTableFilters, true);\n this.setupChangeObserver(this.wpTableGroupBy);\n this.setupChangeObserver(this.wpTableSortBy);\n this.setupChangeObserver(this.wpTableSum);\n this.setupChangeObserver(this.wpTableTimeline);\n this.setupChangeObserver(this.wpTableHierarchies);\n this.setupChangeObserver(this.wpTableColumns);\n this.setupChangeObserver(this.wpTableHighlighting);\n this.setupChangeObserver(this.wpTableOrder);\n this.setupChangeObserver(this.wpDisplayRepresentation);\n this.setupChangeObserver(this.wpIncludeSubprojects);\n }\n\n /**\n * Listen to changes in the given service and reload the query / results if\n * the service requests that.\n *\n * @param service Work package query state service to listento\n * @param firstPage If the service requests a change, load the first page\n */\n protected setupChangeObserver(service:WorkPackageQueryStateService, firstPage = false) {\n const queryState = this.querySpace.query;\n\n service\n .updates$()\n .pipe(\n this.untilDestroyed(),\n filter(() => queryState.hasValue() && service.hasChanged(queryState.value!)),\n )\n .subscribe(() => {\n const newQuery = queryState.value!;\n const triggerUpdate = service.applyToQuery(newQuery);\n this.querySpace.query.putValue(newQuery);\n\n // Update the current checksum\n this.wpListChecksumService\n .updateIfDifferent(newQuery, this.wpTablePagination.current)\n .then(() => {\n // Update the page, if the change requires it\n if (triggerUpdate) {\n this.refresh(true, firstPage);\n }\n });\n });\n }\n\n public get projectIdentifier() {\n return this.currentProject.identifier || undefined;\n }\n\n /**\n * Setup the listener for members of the table to request a refresh of the entire table\n * through the refresh service.\n */\n protected setupRefreshObserver() {\n this.halEvents\n .aggregated$('WorkPackage')\n .pipe(\n this.untilDestroyed(),\n filter((events:HalEvent[]) => this.filterRefreshEvents(events)),\n )\n .subscribe((events:HalEvent[]) => {\n this.refresh(false, false);\n });\n }\n\n /**\n * Refresh the set of results,\n * showing the loading indicator if visibly is set.\n *\n * @param A refresh request\n */\n public abstract refresh(visibly:boolean, firstPage:boolean):void;\n\n /**\n * Set the loading indicator for this set instance\n * @param promise\n */\n protected abstract set loadingIndicator(promise:Promise);\n\n /**\n * Filter the given work package events for something interesting\n * @param events HalEvent[]\n *\n * @return {boolean} whether any of these events should trigger the view reloading\n */\n protected filterRefreshEvents(events:HalEvent[]):boolean {\n const source:string[] = this.querySpace.renderedWorkPackageIds.value\n || this.querySpace.results.value?.elements.map((el) => el.id as string)\n || [];\n\n const rendered = new Set(source);\n\n for (let i = 0; i < events.length; i++) {\n const item = events[i];\n if (rendered.has(item.id) || item.eventType === 'created') {\n return true;\n }\n }\n\n return false;\n }\n\n protected setupQueryLoadedListener() {\n this\n .querySpace\n .initialized\n .values$()\n .pipe(\n take(1),\n filter(() => !this.componentDestroyed),\n )\n .subscribe(() => {\n this.queryLoaded = true;\n this.cdRef.detectChanges();\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable, Injector } from '@angular/core';\nimport { IToast } from 'core-app/shared/components/toaster/toast.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Injectable()\nexport class WorkPackageNotificationService extends HalResourceNotificationService {\n constructor(readonly injector:Injector,\n readonly apiV3Service:ApiV3Service) {\n super(injector);\n }\n\n public showSave(resource:WorkPackageResource, isCreate = false) {\n const message:any = {\n message: this.I18n.t(`js.notice_successful_${isCreate ? 'create' : 'update'}`),\n };\n\n this.addWorkPackageFullscreenLink(message, resource as any);\n\n this.ToastService.addSuccess(message);\n }\n\n protected showCustomError(errorResource:any, resource:WorkPackageResource):boolean {\n if (errorResource.errorIdentifier === 'urn:openproject-org:api:v3:errors:UpdateConflict') {\n this.ToastService.addError({\n message: errorResource.message,\n type: 'error',\n link: {\n text: this.I18n.t('js.hal.error.update_conflict_refresh'),\n target: () => this.apiV3Service.work_packages.id(resource).refresh(),\n },\n });\n\n return true;\n }\n\n return super.showCustomError(errorResource, resource);\n }\n\n private addWorkPackageFullscreenLink(message:IToast, resource:WorkPackageResource) {\n // Don't show the 'Show in full screen' link if we're there already\n if (!this.$state.includes('work-packages.show')) {\n message.link = {\n target: () => this.$state.go('work-packages.show.tabs', { tabIdentifier: 'activity', workPackageId: resource.id }),\n text: this.I18n.t('js.work_packages.message_successful_show_in_fullscreen'),\n };\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { StateService } from '@uirouter/core';\nimport { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalDeletedEvent, HalEventsService } from 'core-app/features/hal/services/hal-events.service';\n\n@Injectable()\nexport class WorkPackageService {\n private text = {\n successful_delete: this.I18n.t('js.work_packages.message_successful_bulk_delete'),\n };\n\n constructor(private readonly http:HttpClient,\n private readonly $state:StateService,\n private readonly PathHelper:PathHelperService,\n private readonly UrlParamsHelper:UrlParamsHelperService,\n private readonly toastService:ToastService,\n private readonly I18n:I18nService,\n private readonly halEvents:HalEventsService) {\n }\n\n public performBulkDelete(ids:string[], defaultHandling:boolean) {\n const params = {\n 'ids[]': ids,\n };\n const promise = this.http\n .delete(\n this.PathHelper.workPackagesBulkDeletePath(),\n { params, withCredentials: true },\n )\n .toPromise();\n\n if (defaultHandling) {\n promise\n .then(() => {\n this.toastService.addSuccess(this.text.successful_delete);\n\n ids.forEach((id) => this.halEvents.push({ _type: 'WorkPackage', id }, { eventType: 'deleted' } as HalDeletedEvent));\n\n if (this.$state.includes('**.list.details.**')\n && ids.indexOf(this.$state.params.workPackageId) > -1) {\n this.$state.go('work-packages.partitioned.list', this.$state.params);\n }\n })\n .catch(() => {\n const urlParams = this.UrlParamsHelper.buildQueryString(params);\n window.location.href = `${this.PathHelper.workPackagesBulkDeletePath()}?${urlParams}`;\n });\n }\n\n return promise;\n }\n}\n","
    \n \n \n \n\n \n
    \n\n \n\n \n \n \n \n \n \n \n \n \n \n\n\n\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { BehaviorSubject, combineLatest, Observable } from 'rxjs';\nimport { distinctUntilChanged, first } from 'rxjs/operators';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IPrincipal } from 'core-app/core/state/principals/principal.model';\nimport { IAttachment } from 'core-app/core/state/attachments/attachment.model';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { PrincipalsResourceService } from 'core-app/core/state/principals/principals.service';\nimport { PrincipalRendererService } from 'core-app/shared/components/principal/principal-renderer.service';\nimport { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';\nimport { ConfirmDialogOptions } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.modal';\nimport { getIconForMimeType } from 'core-app/shared/components/storages/functions/storages.functions';\nimport { IFileIcon } from 'core-app/shared/components/storages/icons.mapping';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[op-attachment-list-item]',\n templateUrl: './attachment-list-item.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OpAttachmentListItemComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit {\n @Input() public attachment:IAttachment;\n\n @Input() public index:number;\n\n @Output() public removeAttachment = new EventEmitter();\n\n @ViewChild('avatar') avatar:ElementRef;\n\n static imageFileExtensions:string[] = ['jpeg', 'jpg', 'gif', 'bmp', 'png'];\n\n public text = {\n dragHint: this.I18n.t('js.attachments.draggable_hint'),\n deleteTitle: this.I18n.t('js.attachments.delete'),\n deleteConfirmation: this.I18n.t('js.attachments.delete_confirmation'),\n removeFile: (arg:unknown):string => this.I18n.t('js.label_remove_file', arg),\n };\n\n public get deleteIconTitle():string {\n return this.text.removeFile({ fileName: this.attachment.fileName });\n }\n\n public author$:Observable;\n\n public timestampText:string;\n\n public fileIcon:IFileIcon;\n\n private viewInitialized$ = new BehaviorSubject(false);\n\n constructor(\n private readonly I18n:I18nService,\n private readonly pathHelper:PathHelperService,\n private readonly timezoneService:TimezoneService,\n private readonly confirmDialogService:ConfirmDialogService,\n private readonly principalsResourceService:PrincipalsResourceService,\n private readonly principalRendererService:PrincipalRendererService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.fileIcon = getIconForMimeType(this.attachment.contentType);\n\n const authorId = idFromLink(this.attachment._links.author.href);\n\n if (!this.principalsResourceService.exists(authorId)) {\n this.principalsResourceService.fetchUser(authorId).subscribe();\n }\n\n this.timestampText = this.timezoneService.parseDatetime(this.attachment.createdAt).fromNow();\n\n this.author$ = this.principalsResourceService.lookup(authorId).pipe(first());\n\n combineLatest([\n this.author$,\n this.viewInitialized$.pipe(distinctUntilChanged()),\n ]).pipe(this.untilDestroyed())\n .subscribe(([user, initialized]) => {\n if (!initialized) {\n return;\n }\n\n this.principalRendererService.render(\n this.avatar.nativeElement,\n user,\n { hide: true, link: false },\n { hide: false, size: 'mini' },\n );\n });\n }\n\n ngAfterViewInit():void {\n this.viewInitialized$.next(true);\n }\n\n /**\n * Set the appropriate data for drag & drop of an attachment item.\n * @param evt DragEvent\n */\n public setDragData(evt:DragEvent):void {\n const url = this.downloadPath;\n const previewElement = this.draggableHTML(url);\n\n if (evt.dataTransfer == null) return;\n\n evt.dataTransfer.setData('text/plain', url);\n evt.dataTransfer.setData('text/html', previewElement.outerHTML);\n evt.dataTransfer.setData('text/uri-list', url);\n evt.dataTransfer.setDragImage(previewElement, 0, 0);\n }\n\n public draggableHTML(url:string):HTMLImageElement|HTMLAnchorElement {\n let el:HTMLImageElement|HTMLAnchorElement;\n\n if (this.isImage) {\n el = document.createElement('img');\n el.src = url;\n el.textContent = this.attachment.fileName;\n } else {\n el = document.createElement('a');\n el.href = url;\n el.textContent = this.attachment.fileName;\n }\n\n return el;\n }\n\n private get downloadPath():string {\n return this.pathHelper.attachmentDownloadPath(String(this.attachment.id), this.attachment.fileName);\n }\n\n private get isImage():boolean {\n const ext = this.attachment.fileName.split('.').pop() || '';\n return OpAttachmentListItemComponent.imageFileExtensions.indexOf(ext.toLowerCase()) > -1;\n }\n\n public confirmRemoveAttachment():void {\n const options:ConfirmDialogOptions = {\n text: {\n text: this.text.deleteConfirmation,\n title: this.text.deleteTitle,\n button_continue: this.text.deleteTitle,\n },\n icon: {\n continue: 'delete',\n },\n dangerHighlighting: true,\n };\n void this.confirmDialogService\n .confirm(options)\n .then(() => { this.removeAttachment.emit(); })\n .catch(() => { /* confirmation rejected */ });\n }\n}\n"," 0\"\n class=\"spot-list spot-list_compact op-file-list\"\n>\n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnInit,\n} from '@angular/core';\nimport { IAttachment } from 'core-app/core/state/attachments/attachment.model';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { AttachmentsResourceService } from 'core-app/core/state/attachments/attachments.service';\n\n@Component({\n selector: 'op-attachment-list',\n templateUrl: './attachment-list.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OpAttachmentListComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public attachments:IAttachment[] = [];\n\n @Input() public collectionKey:string;\n\n constructor(\n private readonly attachmentsResourceService:AttachmentsResourceService,\n ) {\n super();\n }\n\n ngOnInit():void {\n }\n\n public removeAttachment(attachment:IAttachment):void {\n this.attachmentsResourceService.removeAttachment(this.collectionKey, attachment).subscribe();\n }\n}\n"," 0\n }\"\n *ngIf=\"(attachments$ | async).length\"\n [attachments]=\"attachments$ | async\"\n [collectionKey]=\"collectionKey\"\n>\n\n\n\n 0,\n 'op-file-section--drop-box_dragging-over': draggingOverDropZone,\n 'op-file-section--drop-box_float': (attachments$ | async).length\n }\"\n type=\"button\"\n (click)=\"triggerFileInput()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDropFiles($event)\"\n>\n \n 0\"\n class=\"op-file-section--drop-box-text\"\n [textContent]=\"text.dropFiles\"\n >\n \n\n\n\n \n \n {{text.uploadLabel}}\n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n HostBinding,\n Input,\n OnDestroy,\n OnInit,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { filter, map, tap } from 'rxjs/operators';\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\nimport { UploadFile } from 'core-app/core/file-upload/op-file-upload.service';\nimport { AttachmentsResourceService } from 'core-app/core/state/attachments/attachments.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { IAttachment } from 'core-app/core/state/attachments/attachment.model';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\nfunction containsFiles(dataTransfer:DataTransfer):boolean {\n return dataTransfer.types.indexOf('Files') >= 0;\n}\n\nexport const attachmentsSelector = 'op-attachments';\n\n@Component({\n selector: attachmentsSelector,\n templateUrl: './attachments.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OpAttachmentsComponent extends UntilDestroyedMixin implements OnInit, OnDestroy {\n @HostBinding('attr.data-qa-selector') public qaSelector = 'op-attachments';\n\n @HostBinding('id.attachments_fields') public hostId = true;\n\n @HostBinding('class.op-file-section') public className = true;\n\n @Input() public resource:HalResource;\n\n @Input() public allowUploading = true;\n\n @Input() public destroyImmediately = true;\n\n public attachments$:Observable;\n\n public draggingOverDropZone = false;\n\n public dragging = 0;\n\n @ViewChild('hiddenFileInput') public filePicker:ElementRef;\n\n public text = {\n attachments: this.I18n.t('js.label_attachments'),\n uploadLabel: this.I18n.t('js.label_add_attachments'),\n dropFiles: this.I18n.t('js.label_drop_files'),\n dropClickFiles: this.I18n.t('js.label_drop_or_click_files'),\n foldersWarning: this.I18n.t('js.label_drop_folders_hint'),\n };\n\n private get attachmentsSelfLink():string {\n const attachments = this.resource.attachments as unknown & { href:string };\n return attachments.href;\n }\n\n public get collectionKey():string {\n return isNewResource(this.resource) ? 'new' : this.attachmentsSelfLink;\n }\n\n private onGlobalDragLeave:(_event:DragEvent) => void = (_event) => {\n this.dragging = Math.max(this.dragging - 1, 0);\n this.cdRef.detectChanges();\n };\n\n private onGlobalDragEnd:(_event:DragEvent) => void = (_event) => {\n this.dragging = 0;\n this.cdRef.detectChanges();\n };\n\n private onGlobalDragEnter:(_event:DragEvent) => void = (_event) => {\n this.dragging += 1;\n this.cdRef.detectChanges();\n };\n\n constructor(\n public elementRef:ElementRef,\n protected readonly I18n:I18nService,\n protected readonly states:States,\n protected readonly halResourceService:HalResourceService,\n protected readonly attachmentsResourceService:AttachmentsResourceService,\n protected readonly toastService:ToastService,\n protected readonly timezoneService:TimezoneService,\n protected readonly cdRef:ChangeDetectorRef,\n ) {\n super();\n\n populateInputsFromDataset(this);\n }\n\n ngOnInit():void {\n if (!(this.resource instanceof HalResource)) {\n // Parse the resource if any exists\n this.resource = this.halResourceService.createHalResource(this.resource, true);\n }\n\n this.states.forResource(this.resource)!.changes$()\n .pipe(\n this.untilDestroyed(),\n filter((newResource) => !!newResource),\n )\n .subscribe((newResource:HalResource) => {\n this.resource = newResource || this.resource;\n });\n\n // ensure collection is loaded to the store\n if (!isNewResource(this.resource)) {\n this.attachmentsResourceService.requireCollection(this.attachmentsSelfLink);\n }\n\n const compareCreatedAtTimestamps = (a:IAttachment, b:IAttachment):number => {\n const rightCreatedAt = this.timezoneService.parseDatetime(b.createdAt);\n const leftCreatedAt = this.timezoneService.parseDatetime(a.createdAt);\n return rightCreatedAt.isBefore(leftCreatedAt) ? -1 : 1;\n };\n\n this.attachments$ = this\n .attachmentsResourceService\n .collection(this.collectionKey)\n .pipe(\n this.untilDestroyed(),\n map((attachments) => attachments.sort(compareCreatedAtTimestamps)),\n // store attachments for new resources directly into the resource. This way, the POST request to create the\n // resource embeds the attachments and the backend reroutes the anonymous attachments to the resource.\n tap((attachments) => {\n if (isNewResource(this.resource)) {\n this.resource.attachments = { elements: attachments.map((a) => a._links.self) };\n }\n }),\n );\n\n document.body.addEventListener('dragenter', this.onGlobalDragEnter);\n document.body.addEventListener('dragleave', this.onGlobalDragLeave);\n document.body.addEventListener('dragend', this.onGlobalDragEnd);\n document.body.addEventListener('drop', this.onGlobalDragEnd);\n }\n\n ngOnDestroy():void {\n document.body.removeEventListener('dragenter', this.onGlobalDragEnter);\n document.body.removeEventListener('dragleave', this.onGlobalDragLeave);\n document.body.removeEventListener('dragend', this.onGlobalDragEnd);\n document.body.removeEventListener('drop', this.onGlobalDragEnd);\n }\n\n public triggerFileInput():void {\n this.filePicker.nativeElement.click();\n }\n\n public onFilePickerChanged():void {\n const fileList = this.filePicker.nativeElement.files;\n if (fileList === null) return;\n\n const files:UploadFile[] = Array.from(fileList);\n this.uploadFiles(files);\n // reset file input, so that selecting the same file again triggers a change\n this.filePicker.nativeElement.value = '';\n }\n\n public onDropFiles(event:DragEvent):void {\n if (event.dataTransfer === null) return;\n\n // eslint-disable-next-line no-param-reassign\n event.dataTransfer.dropEffect = 'copy';\n\n const dfFiles = event.dataTransfer.files;\n const length:number = dfFiles ? dfFiles.length : 0;\n\n const files:UploadFile[] = [];\n for (let i = 0; i < length; i++) {\n files.push(dfFiles[i]);\n }\n\n this.uploadFiles(files);\n this.draggingOverDropZone = false;\n this.dragging = 0;\n }\n\n public onDragOver(event:DragEvent):void {\n if (event.dataTransfer !== null && containsFiles(event.dataTransfer)) {\n // eslint-disable-next-line no-param-reassign\n event.dataTransfer.dropEffect = 'copy';\n this.draggingOverDropZone = true;\n }\n }\n\n public onDragLeave(_event:DragEvent):void {\n this.draggingOverDropZone = false;\n }\n\n protected uploadFiles(files:UploadFile[]):void {\n let uploadFiles = files || [];\n const countBefore = files.length;\n uploadFiles = this.filterFolders(uploadFiles);\n\n if (uploadFiles.length === 0) {\n // If we filtered all files as directories, show a notice\n if (countBefore > 0) {\n this.toastService.addNotice(this.text.foldersWarning);\n }\n\n return;\n }\n\n this\n .attachmentsResourceService\n .attachFiles(this.resource, uploadFiles)\n .subscribe();\n }\n\n /**\n * We try to detect folders by checking for either empty types\n * or empty file sizes.\n * @param files\n */\n protected filterFolders(files:UploadFile[]):UploadFile[] {\n return files.filter((file) => {\n // Folders never have a mime type\n if (file.type !== '') {\n return true;\n }\n\n // Files however MAY have no mime type as well\n // so fall back to checking zero or 4096 bytes\n if (file.size === 0 || file.size === 4096) {\n console.warn(`Skipping file because of file size (${file.size}) %O`, file);\n return false;\n }\n\n return true;\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\n\nimport { OpAttachmentsComponent } from './attachments.component';\nimport { OpAttachmentListComponent } from './attachment-list/attachment-list.component';\nimport { OpAttachmentListItemComponent } from './attachment-list/attachment-list-item.component';\n\n@NgModule({\n imports: [\n CommonModule,\n IconModule,\n ],\n declarations: [\n OpAttachmentsComponent,\n OpAttachmentListComponent,\n OpAttachmentListItemComponent,\n ],\n exports: [\n OpAttachmentListComponent,\n OpAttachmentsComponent,\n\n OpAttachmentListItemComponent,\n ],\n})\nexport class OpenprojectAttachmentsModule {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { input } from 'reactivestates';\nimport { Injectable } from '@angular/core';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { take } from 'rxjs/operators';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { HelpTextResource } from 'core-app/features/hal/resources/help-text-resource';\n\n@Injectable({ providedIn: 'root' })\nexport class AttributeHelpTextsService {\n private helpTexts = input();\n\n constructor(private apiV3Service:ApiV3Service) {\n }\n\n /**\n * Search for a given attribute help text\n *\n * @param attribute\n * @param scope\n */\n public require(attribute:string, scope:string):Promise {\n this.load();\n\n return new Promise((resolve, reject) => {\n this.helpTexts\n .valuesPromise()\n .then(() => resolve(this.find(attribute, scope)));\n });\n }\n\n /**\n * Search for a given attribute help text\n *\n */\n public requireById(id:string|number):Promise {\n this.load();\n\n return this\n .helpTexts\n .values$()\n .pipe(\n take(1),\n )\n .toPromise()\n .then(() => {\n const value = this.helpTexts.getValueOr([]);\n return _.find(value, (element) => element.id?.toString() === id.toString());\n });\n }\n\n private load():void {\n this.helpTexts.putFromPromiseIfPristine(() => this.apiV3Service\n .help_texts\n .get()\n .toPromise()\n .then((resources:CollectionResource) => resources.elements));\n }\n\n private find(attribute:string, scope:string):HelpTextResource|undefined {\n const value = this.helpTexts.getValueOr([]);\n return _.find(value, (element) => element.scope === scope && element.attribute === attribute);\n }\n}\n","\n \n \n \n \n\n
    \n
    \n\n
    0\">\n \n {{ text.attachments }}\n \n \n
    \n \n\n
    \n
    \n \n {{ text.close }}\n \n \n \n \n \n
    \n
    \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, OnInit,\n} from '@angular/core';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HelpTextResource } from 'core-app/features/hal/resources/help-text-resource';\n\n@Component({\n templateUrl: './help-text.modal.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AttributeHelpTextModalComponent extends OpModalComponent implements OnInit {\n readonly text = {\n attachments: this.I18n.t('js.label_attachments'),\n edit: this.I18n.t('js.button_edit'),\n close: this.I18n.t('js.button_close'),\n };\n\n public helpText:HelpTextResource = this.locals.helpText!;\n\n constructor(\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit() {\n super.ngOnInit();\n\n // Load the attachments\n this\n .helpText\n .attachments\n .$load()\n .then(() => this.cdRef.detectChanges());\n }\n\n public get helpTextLink() {\n if (this.helpText.editText) {\n return this.helpText.editText.$link.href;\n }\n\n return '';\n }\n}\n","\n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Injector,\n Input,\n OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\nimport { AttributeHelpTextsService } from './attribute-help-text.service';\nimport { AttributeHelpTextModalComponent } from './attribute-help-text.modal';\n\nexport const attributeHelpTextSelector = 'attribute-help-text';\n\n@Component({\n selector: attributeHelpTextSelector,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './attribute-help-text.component.html',\n})\nexport class AttributeHelpTextComponent implements OnInit {\n // Attribute to show help text for\n @Input() public attribute:string;\n\n @Input() public additionalLabel?:string;\n\n // Scope to search for\n @Input() public attributeScope:string;\n\n // Load single id entry if given\n @Input() public helpTextId?:string|number;\n\n public exists = false;\n\n readonly text = {\n open_dialog: this.I18n.t('js.help_texts.show_modal'),\n edit: this.I18n.t('js.button_edit'),\n close: this.I18n.t('js.button_close'),\n };\n\n constructor(\n readonly elementRef:ElementRef,\n protected attributeHelpTexts:AttributeHelpTextsService,\n protected opModalService:OpModalService,\n protected cdRef:ChangeDetectorRef,\n protected injector:Injector,\n protected I18n:I18nService,\n ) {\n populateInputsFromDataset(this);\n }\n\n ngOnInit() {\n if (this.helpTextId) {\n this.exists = true;\n } else {\n // Need to load the promise to find out if the attribute exists\n this.load().then((resource) => {\n this.exists = !!resource;\n this.cdRef.detectChanges();\n return resource;\n });\n }\n }\n\n public handleClick(event:Event):void {\n this.load().then((resource) => {\n this.opModalService.show(AttributeHelpTextModalComponent, this.injector, { helpText: resource });\n });\n\n event.preventDefault();\n }\n\n private load() {\n if (this.helpTextId) {\n return this.attributeHelpTexts.requireById(this.helpTextId);\n }\n return this.attributeHelpTexts.require(this.attribute, this.attributeScope);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport { OpenprojectAttachmentsModule } from 'core-app/shared/components/attachments/openproject-attachments.module';\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\n\nimport { AttributeHelpTextComponent } from './attribute-help-text.component';\nimport { AttributeHelpTextModalComponent } from './attribute-help-text.modal';\n\n@NgModule({\n imports: [\n CommonModule,\n OpenprojectModalModule,\n OpenprojectAttachmentsModule,\n IconModule,\n ],\n declarations: [\n AttributeHelpTextComponent,\n AttributeHelpTextModalComponent,\n ],\n providers: [\n ],\n exports: [\n AttributeHelpTextComponent,\n ],\n})\nexport class AttributeHelpTextModule {}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component, ElementRef, OnInit, ViewChild,\n} from '@angular/core';\nimport { NgSelectComponent } from '@ng-select/ng-select';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { IProjectAutocompleterData } from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocompleter.component';\nimport { IProjectAutocompleteItem } from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocomplete-item';\n\ntype SelectItem = { label:string, value:string, selected?:boolean };\n\nexport const autocompleteSelectDecorationSelector = 'autocomplete-select-decoration';\n\n@Component({\n template: `\n \n \n\n \n \n {{ item.label }}\n \n \n `,\n selector: autocompleteSelectDecorationSelector,\n})\nexport class AutocompleteSelectDecorationComponent implements OnInit {\n @ViewChild(NgSelectComponent) public ngSelectComponent:NgSelectComponent;\n\n public options:SelectItem[];\n\n /** Whether we're a multiselect */\n public multiselect = false;\n\n /** Get the selected options */\n public selected:SelectItem|SelectItem[];\n\n /** Get the selected options especially for the project autocompleter */\n public currentProjectSelection:{ id:string, name:string }|{ id:string, name:string }[];\n\n /** The input name we're syncing selections to */\n private syncInputFieldName:string;\n\n /** The input id used for label */\n public labelForId:string;\n\n /** The field key (e.g. status, type, or project) */\n public key:string;\n\n text = {\n placeholder: this.I18n.t('js.placeholders.selection'),\n };\n\n constructor(\n protected elementRef:ElementRef,\n readonly I18n:I18nService,\n ) {\n }\n\n ngOnInit():void {\n const element = this.elementRef.nativeElement as HTMLElement;\n\n // Set options\n this.multiselect = element.dataset.multiselect === 'true';\n this.labelForId = element.dataset.inputId!;\n this.key = element.dataset.key!;\n\n // Get the sync target\n this.syncInputFieldName = element.dataset.inputName!;\n // Add Rails multiple identifier if multiselect\n if (this.multiselect) {\n this.syncInputFieldName += '[]';\n }\n\n // Prepare and build the options\n // Expected array of objects with id, name, select\n const data:SelectItem[] = JSON.parse(element.dataset.options!);\n\n // Set initial selection\n this.setInitialSelection(data);\n if (this.isProjectField()) {\n this.setInitialProjectSelection();\n }\n\n if (!this.multiselect) {\n this.selected = (this.selected as SelectItem[])[0];\n }\n\n this.options = data;\n\n // Unhide the parent\n element.parentElement!.hidden = false;\n }\n\n setInitialSelection(data:SelectItem[]):void {\n this.updateSelection(data.filter((element) => element.selected));\n }\n\n updateSelection(items:SelectItem|SelectItem[]):void {\n this.selected = items;\n items = _.castArray(items);\n\n this.removeCurrentSyncedFields();\n items.forEach((el:SelectItem) => {\n this.createSyncedField(el.value);\n });\n }\n\n createSyncedField(value:string):void {\n const element = jQuery(this.elementRef.nativeElement);\n element\n .parent()\n .append(``);\n }\n\n removeCurrentSyncedFields():void {\n const element = jQuery(this.elementRef.nativeElement);\n element\n .parent()\n .find(`input[name=\"${this.syncInputFieldName}\"]`)\n .remove();\n }\n\n updateProjectSelection(items:IProjectAutocompleteItem|IProjectAutocompleteItem[]):void {\n items = _.castArray(items);\n const mappedItems = items.map(item => {\n const selectedItem:SelectItem = {\n label: item.name,\n value: item.id.toString(),\n selected: true,\n };\n\n return selectedItem;\n });\n\n this.updateSelection(mappedItems);\n }\n\n setInitialProjectSelection():void {\n const items = _.castArray(this.selected);\n if (items.length === 0) return;\n\n if (this.multiselect) {\n this.currentProjectSelection = items.map((item:SelectItem) => ({\n id: item.value,\n name: item.label,\n }));\n } else {\n this.currentProjectSelection = {\n id: items[0].value,\n name: items[0].label,\n };\n }\n }\n\n isProjectField():boolean {\n return this.key === 'project';\n }\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[op-autocompleter-footer-tmp]',\n})\n// A Directive to be used on the option template of\n// ng-select (what will be shown in each row of drop down)\n// it is used when you want to inject a different template\nexport class OpAutocompleterFooterTemplateDirective {\n\n}\n","\n \n : {{search}}\n \n\n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Injector,\n Input,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { NgSelectComponent } from '@ng-select/ng-select';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpInviteUserModalService } from 'core-app/features/invite-user-modal/invite-user-modal.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { AddTagFn } from '@ng-select/ng-select/lib/ng-select.component';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { Subject } from 'rxjs';\nimport { typeFromHref } from 'core-app/shared/components/principal/principal-helper';\nimport { compareByHref } from 'core-app/shared/helpers/angular/tracking-functions';\nimport { filter } from 'rxjs/operators';\n\nexport interface CreateAutocompleterValueOption {\n name:string;\n href:string|null;\n}\n\n@Component({\n templateUrl: './create-autocompleter.component.html',\n selector: 'create-autocompleter',\n styleUrls: ['./create-autocompleter.component.sass'],\n})\nexport class CreateAutocompleterComponent extends UntilDestroyedMixin implements AfterViewInit {\n @Input() public availableValues:CreateAutocompleterValueOption[];\n\n @Input() public appendTo:string;\n\n @Input() public resource:HalResource;\n\n @Input() public model:any;\n\n @Input() public required = false;\n\n @Input() public disabled = false;\n\n @Input() public finishedLoading = false;\n\n @Input() public id = '';\n\n @Input() public classes = '';\n\n @Input() public typeahead?:Subject;\n\n @Input() public hideSelected = false;\n\n @Output() public onChange = new EventEmitter();\n\n @Output() public onKeydown = new EventEmitter();\n\n @Output() public onOpen = new EventEmitter();\n\n @Output() public onClose = new EventEmitter();\n\n @Output() public onAfterViewInit = new EventEmitter();\n\n @Output() public onAddNew = new EventEmitter();\n\n @ViewChild(NgSelectComponent) public ngSelectComponent:NgSelectComponent;\n\n @InjectField() readonly I18n:I18nService;\n\n @InjectField() readonly cdRef:ChangeDetectorRef;\n\n @InjectField() readonly currentProject:CurrentProjectService;\n\n @InjectField() readonly pathHelper:PathHelperService;\n\n public compareByHref = compareByHref;\n\n public text:{ [key:string]:string } = {};\n\n public createAllowed:boolean|AddTagFn = false;\n\n private _openDirectly = false;\n\n constructor(readonly injector:Injector) {\n super();\n\n this.text.add_new_action = this.I18n.t('js.label_create');\n }\n\n ngAfterViewInit() {\n this.onAfterViewInit.emit(this);\n }\n\n public openSelect() {\n if (this.ngSelectComponent) {\n this.ngSelectComponent.open();\n } else {\n // In case the autocompleter was not loaded,\n // do not reset the variable\n return;\n }\n\n this.openDirectly = false;\n }\n\n public closeSelect() {\n this.ngSelectComponent && this.ngSelectComponent.close();\n }\n\n public changeModel(element:HalResource) {\n this.onChange.emit(element);\n }\n\n public opened() {\n // Force reposition as a workaround for BUG\n // https://github.com/ng-select/ng-select/issues/1259\n setTimeout(() => {\n const component = this.ngSelectComponent as any;\n if (this.appendTo && component && component.dropdownPanel) {\n component.dropdownPanel._updatePosition();\n }\n }, 25);\n\n this.onOpen.emit();\n }\n\n public closed() {\n this.openDirectly = false;\n this.onClose.emit();\n }\n\n public keyPressed(event:JQuery.TriggeredEvent) {\n this.onKeydown.emit(event);\n }\n\n public get openDirectly() {\n return this._openDirectly;\n }\n\n public set openDirectly(val:boolean) {\n this._openDirectly = val;\n if (val) {\n this.openSelect();\n }\n }\n\n public focusInputField() {\n this.ngSelectComponent && this.ngSelectComponent.focus();\n }\n}\n","
    \n \n
    \n \n \n
    \n
    \n\n \n\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { NgSelectComponent } from '@ng-select/ng-select';\nimport { DragulaService, Group } from 'ng2-dragula';\nimport { DomAutoscrollService } from 'core-app/shared/helpers/drag-and-drop/dom-autoscroll.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { merge } from 'rxjs';\nimport { setBodyCursor } from 'core-app/shared/helpers/dom/set-window-cursor.helper';\n\nexport interface DraggableOption {\n name:string;\n id:string;\n}\n\n@Component({\n selector: 'draggable-autocompleter',\n templateUrl: './draggable-autocomplete.component.html',\n styleUrls: ['./draggable-autocomplete.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DraggableAutocompleteComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit {\n /** Options to show in the autocompleter */\n @Input() options:DraggableOption[];\n\n /** Should we focus the autocompleter ? */\n @Input() autofocus = true;\n\n /** Order list of selected items */\n @Input('selected') _selected:DraggableOption[] = [];\n\n /** Output when autocompleter changes values or items removed */\n @Output() onChange = new EventEmitter();\n\n /** List of items still available for selection */\n availableOptions:DraggableOption[] = [];\n\n private autoscroll:any;\n\n private columnsGroup:Group;\n\n @ViewChild('ngSelectComponent') public ngSelectComponent:NgSelectComponent;\n\n text = {\n placeholder: this.I18n.t('js.label_add_columns'),\n };\n\n constructor(readonly I18n:I18nService,\n readonly dragula:DragulaService) {\n super();\n }\n\n ngOnInit():void {\n this.updateAvailableOptions();\n\n // Setup groups\n this.columnsGroup = this.dragula.createGroup('columns', {});\n\n // Set cursor when dragging\n this.dragula.drag('columns')\n .pipe(this.untilDestroyed())\n .subscribe(() => setBodyCursor('move', 'important'));\n\n // Reset cursor when cancel or dropped\n merge(\n this.dragula.drop('columns'),\n this.dragula.cancel('columns'),\n )\n .pipe(this.untilDestroyed())\n .subscribe(() => setBodyCursor('auto'));\n\n // Setup autoscroll\n const that = this;\n this.autoscroll = new DomAutoscrollService(\n [\n document.getElementById('content-wrapper')!,\n ],\n {\n margin: 25,\n maxSpeed: 10,\n scrollWhenOutside: true,\n autoScroll(this:any) {\n return this.down && that.columnsGroup.drake.dragging;\n },\n },\n );\n }\n\n ngAfterViewInit():void {\n if (this.autofocus) {\n this.ngSelectComponent.focus();\n }\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n\n this.dragula.destroy('columns');\n }\n\n select(item:DraggableOption|undefined) {\n if (!item) {\n return;\n }\n\n this.selected = [...this.selected, item];\n\n // Remove selection\n this.ngSelectComponent.clearModel();\n }\n\n remove(item:DraggableOption) {\n this.selected = this.selected.filter((selected) => selected.id !== item.id);\n }\n\n get selected() {\n return this._selected;\n }\n\n set selected(val:DraggableOption[]) {\n this._selected = val;\n this.updateAvailableOptions();\n\n this.onChange.emit(this.selected);\n }\n\n opened() {\n // Force reposition as a workaround for BUG\n // https://github.com/ng-select/ng-select/issues/1259\n setTimeout(() => {\n const component = this.ngSelectComponent as any;\n if (component && component.dropdownPanel) {\n component.dropdownPanel._updatePosition();\n }\n }, 25);\n }\n\n private updateAvailableOptions() {\n this.availableOptions = this.options\n .filter((item) => !this.selected.find((selected) => selected.id === item.id));\n }\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[op-autocompleter-header-tmp]',\n})\n// A Directive to be used on the option template of\n// ng-select (what will be shown in each row of drop down)\n// it is used when you want to inject a different template\nexport class OpAutocompleterHeaderTemplateDirective {\n\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[op-autocompleter-label-tmp]',\n})\n// A Directive to be used on the label template of\n// ng-select (what will be shown in the input box after selecting an item)\n// it is used when you want to inject a different template\nexport class OpAutocompleterLabelTemplateDirective {\n\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[op-autocompleter-option-tmp]',\n})\n// A Directive to be used on the option template of\n// ng-select (what will be shown in each row of drop down)\n// it is used when you want to inject a different template\nexport class OpAutocompleterOptionTemplateDirective {\n\n}\n","import { Injectable } from '@angular/core';\nimport { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { map } from 'rxjs/operators';\nimport { ApiV3ResourceCollection } from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { ApiV3UserPaths } from 'core-app/core/apiv3/endpoints/users/apiv3-user-paths';\nimport { ApiV3WorkPackagePaths } from 'core-app/core/apiv3/endpoints/work_packages/api-v3-work-package-paths';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { Observable } from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\n@Injectable()\n\nexport class OpAutocompleterService extends UntilDestroyedMixin {\n constructor(\n private apiV3Service:ApiV3Service,\n ) {\n super();\n }\n\n // A method for fetching data with different resource type and different filter\n public loadAvailable(matching:string, resource:resource, filters?:IAPIFilter[], searchKey?:string):Observable {\n const finalFilters:ApiV3FilterBuilder = this.createFilters(filters ?? [], matching, searchKey);\n\n const filteredData = (this.apiV3Service[resource] as\n ApiV3ResourceCollection)\n .filtered(finalFilters).get()\n .pipe(map((collection) => collection.elements));\n return filteredData;\n }\n\n // A method for building filters\n protected createFilters(filters:IAPIFilter[], matching:string, searchKey?:string) {\n const finalFilters = new ApiV3FilterBuilder();\n\n for (const filter of filters) {\n finalFilters.add(filter.name, filter.operator, filter.values);\n }\n if (matching) {\n finalFilters.add(searchKey ?? '', '**', [matching]);\n }\n return finalFilters;\n }\n\n // A method for returning data based on the resource type\n // If you need to fetch our default date sources like work_packages or users,\n // you should use the default method (loadAvailable), otherwise you should implement a function for\n // your desired resource\n public loadData(matching:string, resource:resource, filters?:IAPIFilter[], searchKey?:string) {\n switch (resource) {\n // in this case we can add more functions for fetching usual resources\n default: {\n return this.loadAvailable(matching, resource, filters, searchKey);\n }\n }\n }\n}\n","
    \n \n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n \n
    \n\n\n \n
    \n \n \n \n \n \n \n\n
    \n \n\n #{{item.id}}\n\n \n\n
    \n
    \n
    \n\n \n
    \n \n {{ item.name }}\n
    \n
    \n\n \n {{ item.name }}\n \n
    \n\n\n \n \n {{item.type?.name }} #{{ item.id }} {{ item.subject || item.name }}\n \n \n\n \n ×\n {{item.name}}\n \n\n","/* We just forward the ng-select outputs without renaming */\n/* eslint-disable @angular-eslint/no-output-native */\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n EventEmitter,\n HostBinding,\n Input,\n NgZone,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport {\n DropdownPosition,\n NgSelectComponent,\n} from '@ng-select/ng-select';\nimport {\n BehaviorSubject,\n merge,\n NEVER,\n Observable,\n of,\n timer,\n Subject,\n} from 'rxjs';\nimport {\n debounce,\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 initialDebounce = true;\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 tap(() => this.loading$.next(true)),\n debounce(() => timer(this.getDebounceTimeout())),\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 private getDebounceTimeout():number {\n if (this.initialDebounce) {\n this.initialDebounce = false;\n return 0;\n }\n return 250;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { NgSelectModule } from '@ng-select/ng-select';\nimport {\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { DynamicModule } from 'ng-dynamic-component';\nimport { CommonModule } from '@angular/common';\nimport { DragulaModule } from 'ng2-dragula';\n\nimport { InviteUserButtonModule } from 'core-app/features/invite-user-modal/button/invite-user-button.module';\nimport { OpenprojectPrincipalRenderingModule } from 'core-app/shared/components/principal/principal-rendering.module';\n\nimport { DraggableAutocompleteComponent } from 'core-app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component';\nimport { ColorsAutocompleterComponent } from 'core-app/shared/components/colors/colors-autocompleter.component';\nimport { WorkPackageAutocompleterComponent } from 'core-app/shared/components/autocompleter/work-package-autocompleter/wp-autocompleter.component';\nimport { TimeEntryWorkPackageAutocompleterComponent } from 'core-app/shared/components/autocompleter/te-work-package-autocompleter/te-work-package-autocompleter.component';\nimport { AutocompleteSelectDecorationComponent } from 'core-app/shared/components/autocompleter/autocomplete-select-decoration/autocomplete-select-decoration.component';\nimport { VersionAutocompleterComponent } from 'core-app/shared/components/autocompleter/version-autocompleter/version-autocompleter.component';\nimport { UserAutocompleterComponent } from 'core-app/shared/components/autocompleter/user-autocompleter/user-autocompleter.component';\nimport { ProjectAutocompleterComponent } from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocompleter.component';\nimport { OpAutocompleterComponent } from 'core-app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component';\nimport { OpAutocompleterOptionTemplateDirective } from 'core-app/shared/components/autocompleter/op-autocompleter/directives/op-autocompleter-option-template.directive';\nimport { OpAutocompleterLabelTemplateDirective } from 'core-app/shared/components/autocompleter/op-autocompleter/directives/op-autocompleter-label-template.directive';\nimport { OpAutocompleterHeaderTemplateDirective } from 'core-app/shared/components/autocompleter/op-autocompleter/directives/op-autocompleter-header-template.directive';\nimport { CreateAutocompleterComponent } from 'core-app/shared/components/autocompleter/create-autocompleter/create-autocompleter.component';\nimport { OpAutocompleterFooterTemplateDirective } from 'core-app/shared/components/autocompleter/autocompleter-footer-template/op-autocompleter-footer-template.directive';\nimport { OpSearchHighlightDirective } from 'core-app/shared/directives/search-highlight.directive';\n\nexport const OPENPROJECT_AUTOCOMPLETE_COMPONENTS = [\n CreateAutocompleterComponent,\n VersionAutocompleterComponent,\n WorkPackageAutocompleterComponent,\n TimeEntryWorkPackageAutocompleterComponent,\n DraggableAutocompleteComponent,\n UserAutocompleterComponent,\n ProjectAutocompleterComponent,\n ColorsAutocompleterComponent,\n AutocompleteSelectDecorationComponent,\n OpAutocompleterComponent,\n OpAutocompleterOptionTemplateDirective,\n OpAutocompleterLabelTemplateDirective,\n OpAutocompleterHeaderTemplateDirective,\n OpAutocompleterFooterTemplateDirective,\n OpSearchHighlightDirective,\n];\n\n@NgModule({\n imports: [\n CommonModule,\n NgSelectModule,\n DragulaModule,\n FormsModule,\n ReactiveFormsModule,\n\n DynamicModule.withComponents(OPENPROJECT_AUTOCOMPLETE_COMPONENTS),\n OpenprojectPrincipalRenderingModule,\n InviteUserButtonModule,\n ],\n exports: OPENPROJECT_AUTOCOMPLETE_COMPONENTS,\n declarations: OPENPROJECT_AUTOCOMPLETE_COMPONENTS,\n})\nexport class OpenprojectAutocompleterModule { }\n","import { IProjectAutocompleteItem, IProjectAutocompleteItemTree } from './project-autocomplete-item';\n\nexport const flattenProjectTree = (\n projectTreeItems:IProjectAutocompleteItemTree[],\n depth = 0,\n):IProjectAutocompleteItem[] => projectTreeItems.reduce(\n (fullList, projectTreeItem) => [\n ...fullList,\n {\n ...projectTreeItem,\n numberOfAncestors: depth,\n // The actual list of ancestors does not matter anymore from this point forward,\n // but to keep typing straightforward for consumers of this component that use mapResultsFn,\n // it is marked as required in the interface.\n ancestors: [],\n },\n ...flattenProjectTree(projectTreeItem.children, depth + 1),\n ],\n [],\n);\n","import { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport {\n IProjectAutocompleteItem,\n IProjectAutocompleteItemTree,\n} from './project-autocomplete-item';\n\nconst insertProjectWithAncestors = (\n tree:IProjectAutocompleteItemTree[],\n project:IProjectAutocompleteItem,\n ancestors:IHalResourceLink[],\n):IProjectAutocompleteItemTree[] => {\n // The project has no ancestors, thus it can become a part of the tree right away.\n if (!ancestors.length) {\n return [\n ...tree,\n {\n ...project,\n children: [],\n },\n ];\n }\n\n const ancestorToFind = ancestors[0];\n const ancestorInTree = tree.find((leaf) => leaf.href === ancestorToFind.href);\n\n if (ancestorInTree) {\n return tree.map((item) => (item === ancestorInTree\n ? { ...item, children: insertProjectWithAncestors(item.children, project, ancestors.slice(1)) }\n : { ...item }));\n }\n\n return [\n ...tree,\n {\n id: idFromLink(ancestorToFind.href),\n name: ancestorToFind.title,\n href: ancestorToFind.href,\n disabled: true,\n children: insertProjectWithAncestors([], project, ancestors.slice(1)),\n },\n ];\n};\n\nexport const buildTree = (\n projects:IProjectAutocompleteItem[],\n):IProjectAutocompleteItemTree[] => projects.reduce(\n // The ancestors are listed from direct parent up to root. We'll build a tree structure for these ancestors here.\n // Some might already exist from other children that added them to the tree, or because they were part of the result\n // list themselves. However, if they're not available yet we'll need to generate them.\n (tree, project) => insertProjectWithAncestors(tree, project, project.ancestors),\n [],\n);\n","import { IProjectAutocompleteItemTree } from './project-autocomplete-item';\n\n// Recursively sort project children and their children by name\nexport const recursiveSort = (projects:IProjectAutocompleteItemTree[]):IProjectAutocompleteItemTree[] => projects\n .map((project) => ({\n ...project,\n children: recursiveSort(project.children),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n","\n \n {{ item.name }}\n \n\n \n {{ item.name }}\n {{ item.disabledReason }}\n \n\n\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n Injector,\n Input,\n Output,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\nimport { HttpClient } from '@angular/common/http';\nimport { merge, Observable, of } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { ID } from '@datorama/akita';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport {\n ApiV3ListFilter,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\n\nimport { IProjectAutocompleteItem } from './project-autocomplete-item';\nimport { flattenProjectTree } from './flatten-project-tree';\nimport { getPaginatedResults } from 'core-app/core/apiv3/helpers/get-paginated-results';\nimport { IProject } from 'core-app/core/state/projects/project.model';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { buildTree } from 'core-app/shared/components/autocompleter/project-autocompleter/insert-in-list';\nimport { recursiveSort } from 'core-app/shared/components/autocompleter/project-autocompleter/recursive-sort';\n\nexport const projectsAutocompleterSelector = 'op-project-autocompleter';\n\nexport interface IProjectAutocompleterData {\n id:ID;\n href:string;\n name:string;\n}\n\n@Component({\n templateUrl: './project-autocompleter.component.html',\n styleUrls: ['./project-autocompleter.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n selector: projectsAutocompleterSelector,\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ProjectAutocompleterComponent),\n multi: true,\n }],\n})\nexport class ProjectAutocompleterComponent implements ControlValueAccessor {\n @HostBinding('class.op-project-autocompleter') public className = true;\n\n @HostBinding('class.op-project-autocompleter_inline')\n public get inlineClass():boolean {\n return this.isInlineContext;\n }\n\n projectTracker = (item:IProjectAutocompleteItem):ID => item.href || item.id;\n\n // Load all projects as default\n @Input() public url:string = this.apiV3Service.projects.path;\n\n @Input() public name = '';\n\n @Input() public focusDirectly = false;\n\n @Input() public openDirectly = false;\n\n @Input() public multiple = false;\n\n @Input() public dropdownPosition:'bottom'|'top'|'auto' = 'auto';\n\n // ID that should be set on the input HTML element. It is used with\n //