{"version":3,"file":"main.dab7ea8690a53afd.js","mappings":"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ED,iCAAkC,CACjC,MACA,oDACA,UAED,6BAA8B,CAC7B,MACA,oDACA,yDAED,uBAAwB,CACvB,KACA,oDACA,mDAED,eAAgB,CACf,MACA,oDACA,mDAED,qBAAsB,CACrB,MACA,oDACA,iDAED,WAAY,CACX,MACA,oDACA,uCAED,iBAAkB,CACjB,MACA,oDACA,sDACA,6CAED,iBAAkB,CACjB,MACA,oDACA,6CAED,qBAAsB,CACrB,MACA,oDACA,gEACA,kDACA,8DACA,SACA,iDAED,6BAA8B,CAC7B,MACA,oDACA,SACA,yDAED,eAAgB,CACf,MACA,oDACA,2CAED,mBAAoB,CACnB,MACA,oDACA,+CAED,iBAAkB,CACjB,KACA,oDACA,6CAED,eAAgB,CACf,MACA,oDACA,2CAED,qBAAsB,CACrB,MACA,oDACA,iDAED,eAAgB,CACf,MACA,oDACA,2CAED,qBAAsB,CACrB,MACA,oDACA,iDAED,qBAAsB,CACrB,MACA,oDACA,SACA,iDAED,eAAgB,CACf,KACA,oDACA,2CAED,mBAAoB,CACnB,MACA,oDACA,+CAED,uBAAwB,CACvB,MACA,oDACA,mDAED,eAAgB,CACf,MACA,oDACA,2CAED,eAAgB,CACf,MACA,oDACA,4DACA,SACA,2CAED,uBAAwB,CACvB,MACA,oDACA,mDAED,aAAc,CACb,MACA,oDACA,yCAED,qBAAsB,CACrB,MACA,oDACA,iDAED,iBAAkB,CACjB,MACA,oDACA,gEACA,kDACA,8DACA,SACA,6CAED,6BAA8B,CAC7B,MACA,oDACA,UAED,yCAA0C,CACzC,MACA,oDACA,SACA,qEAED,uBAAwB,CACvB,MACA,oDACA,UAED,iBAAkB,CACjB,MACA,oDACA,6CAED,iCAAkC,CACjC,MACA,oDACA,gEACA,kDACA,8DACA,SACA,6DAED,2BAA4B,CAC3B,MACA,oDACA,gEACA,kDACA,+DAED,iBAAkB,CACjB,MACA,oDACA,6CAED,eAAgB,CACf,MACA,oDACA,2CAED,6BAA8B,CAC7B,MACA,oDACA,iEAED,qBAAsB,CACrB,MACA,oDACA,iDAED,eAAgB,CACf,KACA,oDACA,gEACA,2CAED,mBAAoB,CACnB,MACA,oDACA,+CAED,6BAA8B,CAC7B,MACA,oDACA,yDAED,eAAgB,CACf,MACA,oDACA,2CAED,yBAA0B,CACzB,MACA,oDACA,6DAED,+BAAgC,CAC/B,MACA,oDACA,2DAED,iBAAkB,CACjB,MACA,oDACA,6CAED,iBAAkB,CACjB,MACA,oDACA,6CAED,qBAAsB,CACrB,MACA,oDACA,iDAED,yBAA0B,CACzB,MACA,oDACA,qDAED,qBAAsB,CACrB,MACA,oDACA,iDAED,mBAAoB,CACnB,IACA,oDACA,+CAED,mBAAoB,CACnB,MACA,oDACA,+CAED,iBAAkB,CACjB,MACA,oDACA,SACA,6CAED,yBAA0B,CACzB,MACA,oDACA,qDAED,qBAAsB,CACrB,MACA,oDACA,iDAED,aAAc,CACb,MACA,oDACA,yCAED,qBAAsB,CACrB,MACA,oDACA,iDAED,mBAAoB,CACnB,MACA,oDACA,gEACA,+CAED,iBAAkB,CACjB,MACA,oDACA,6CAED,eAAgB,CACf,MACA,oDACA,gEACA,kDACA,8DACA,sDACA,2CAED,eAAgB,CACf,MACA,oDACA,2CAED,6BAA8B,CAC7B,IACA,oDACA,yDAED,6BAA8B,CAC7B,MACA,oDACA,yDAED,yBAA0B,CACzB,MACA,oDACA,qDAED,eAAgB,CACf,MACA,oDACA,gEACA,kDACA,8DACA,UAED,qBAAsB,CACrB,KACA,oDACA,iDAED,qBAAsB,CACrB,MACA,oDACA,UAED,WAAY,CACX,MACA,oDACA,uCAED,WAAY,CACX,MACA,oDACA,uCAED,eAAgB,CACf,MACA,oDACA,2CAED,eAAgB,CACf,MACA,oDACA,SACA,2CAED,iBAAkB,CACjB,MACA,oDACA,UAED,iBAAkB,CACjB,MACA,oDACA,SACA,6CAED,eAAgB,CACf,MACA,oDACA,2CAED,iBAAkB,CACjB,MACA,oDACA,kDACA,UAED,qBAAsB,CACrB,MACA,oDACA,iDAED,mBAAoB,CACnB,MACA,oDACA,+CAED,mBAAoB,CACnB,MACA,oDACA,+CAED,iBAAkB,CACjB,IACA,oDACA,gEACA,kDACA,8DACA,SACA,6CAED,2BAA4B,CAC3B,MACA,oDACA,uDAED,qBAAsB,CACrB,MACA,oDACA,iDAED,iBAAkB,CACjB,MACA,oDACA,6CAED,eAAgB,CACf,MACA,oDACA,gEACA,kDACA,8DACA,2CAED,qBAAsB,CACrB,MACA,oDACA,iDAED,+BAAgC,CAC/B,MACA,oDACA,2DAED,eAAgB,CACf,MACA,oDACA,2CAED,iBAAkB,CACjB,MACA,oDACA,UAED,qBAAsB,CACrB,MACA,oDACA,yDAED,mBAAoB,CACnB,KACA,oDACA,+CAED,eAAgB,CACf,MACA,oDACA,2CAED,uBAAwB,CACvB,MACA,oDACA,mDAED,6BAA8B,CAC7B,MACA,oDACA,yDAED,iBAAkB,CACjB,KACA,oDACA,6CAED,iBAAkB,CACjB,KACA,oDACA,6CAED,uBAAwB,CACvB,MACA,oDACA,gEACA,kDACA,8DACA,SACA,mDAED,mBAAoB,CACnB,MACA,oDACA,+CAED,yBAA0B,CACzB,MACA,oDACA,qDAED,iBAAkB,CACjB,MACA,oDACA,6CAED,qBAAsB,CACrB,MACA,oDACA,iDAED,iBAAkB,CACjB,MACA,oDACA,SACA,6CAED,aAAc,CACb,MACA,oDACA,yCAED,yBAA0B,CACzB,MACA,oDACA,qDAED,yBAA0B,CACzB,MACA,oDACA,qDAED,uBAAwB,CACvB,MACA,oDACA,mDAED,iBAAkB,CACjB,MACA,oDACA,6CAED,eAAgB,CACf,MACA,oDACA,gEACA,kDACA,8DACA,wDACA,SACA,2CAED,iBAAkB,CACjB,MACA,oDACA,SACA,6CAED,qBAAsB,CACrB,MACA,oDACA,iDAED,eAAgB,CACf,MACA,oDACA,2CAED,qBAAsB,CACrB,MACA,oDACA,iDAED,mBAAoB,CACnB,MACA,oDACA,+CAED,yCAA0C,CACzC,MACA,oDACA,SACA,qEAED,iBAAkB,CACjB,MACA,oDACA,UAED,eAAgB,CACf,MACA,oDACA,4CAGF,SAAS6xV,oBAA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H/tN,CACP,CACA,OAAOhxB,EAAIo+D,EACZ,CACA4zR,eAAe3+U,KAAO,SAAS6+U,qBAC9B,OAAO9+U,OAAOC,KAAKrT,EACpB,EACAgyV,eAAezqV,QAAU0qV,sBACzB18O,EAAOhnE,QAAUyjT,eACjBA,eAAe/1V,GAAK,K,iBCnSpB,IAAI+D,EAAM,CACT,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,KACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,gBAAiB,CAChB,MACA,2BAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,eAAgB,CACf,MACA,0BAED,YAAa,CACZ,KACA,uBAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,gBAAiB,CAChB,MACA,2BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,KACA,0BAED,eAAgB,CACf,KACA,0BAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,KACA,uBAED,aAAc,CACb,MACA,wBAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,eAAgB,CACf,MACA,0BAED,YAAa,CACZ,IACA,uBAED,YAAa,CACZ,KACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,KACA,uBAED,eAAgB,CACf,MACA,0BAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,eAAgB,CACf,MACA,0BAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,KACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,IACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,eAAgB,CACf,MACA,0BAED,YAAa,CACZ,KACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,gBAAiB,CAChB,MACA,2BAED,gBAAiB,CAChB,MACA,2BAED,YAAa,CACZ,MACA,uBAED,eAAgB,CACf,MACA,0BAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uBAED,YAAa,CACZ,MACA,uB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ACV,MACA,0CAED,UAAW,CACV,KACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,aAAc,CACb,MACA,6CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,eAAgB,CACf,MACA,+CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,KACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,UAAW,CACV,MACA,0CAED,aAAc,CACb,MACA,6CAED,UAAW,CACV,MACA,2CAGF,SAAS6xV,oBAAoBzzR,GAC5B,IAAI0zR,EAAoBn1T,EAAE38B,EAAKo+D,GAC9B,OAAO92D,QAAQC,UAAUpI,MAAK,KAC7B,IAAI6xB,EAAI,IAAIuB,MAAM,uBAAyB6rC,EAAM,KAEjD,MADAptC,EAAE+tN,KAAO,mBACH/tN,CAAC,IAIT,IAAI3pB,EAAMrH,EAAIo+D,GAAMniE,EAAKoL,EAAI,GAC7B,OAAOyqV,EAAoB9gU,EAAE3pB,EAAI,IAAIlI,MAAK,IAClC2yV,EAAoB3vV,EAAElG,EAAI,KAEnC,CACA41V,oBAAoBx+U,KAAO,IAAOD,OAAOC,KAAKrT,GAC9C6xV,oBAAoB51V,GAAK,MACzBs5G,EAAOhnE,QAAUsjT,mB","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/api-v3-storages-paths.ts","./src/app/core/apiv3/endpoints/project-storages/api-v3-project-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/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-navigation.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/recent-items.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/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/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/project-storages/project-storages.store.ts","./src/app/core/state/project-storages/project-storages.service.ts","./src/app/core/state/projects/projects.store.ts","./src/app/core/state/projects/projects.service.ts","./src/app/core/state/resource-store.service.ts","./src/app/core/state/resource-store.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/core/upload/is-http-response.ts","./src/app/core/upload/upload.service.ts","./src/app/core/upload/wait-for-uploads-finished.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/bim/ifc_models/toolbar/import-export-bcf/bcf-export-button.component.ts","./src/app/features/bim/ifc_models/toolbar/import-export-bcf/bcf-import-button.component.ts","./src/app/features/bim/ifc_models/toolbar/import-export-bcf/refresh-button.component.ts","./src/app/features/boards/board/board.service.ts","./src/app/features/boards/board/caused-updates/caused-updates.service.ts","./src/app/features/boards/boards-sidebar/boards-menu.component.html","./src/app/features/boards/boards-sidebar/boards-menu.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/sidemenu/calendar-sidemenu.component.html","./src/app/features/calendar/sidemenu/calendar-sidemenu.component.ts","./src/app/features/calendar/te-calendar/te-calendar.template.html","./src/app/features/calendar/te-calendar/te-calendar.component.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/features/enterprise/enterprise-active-trial/ee-active-trial.component.html","./src/app/features/enterprise/enterprise-active-trial/ee-active-trial.component.ts","./src/app/shared/helpers/i18n/localized-link.ts","./src/app/features/enterprise/enterprise-modal/enterprise-trial-form/ee-trial-form.component.html","./src/app/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-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-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/schema-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/homescreen/blocks/new-features.component.ts","./src/app/features/bim/bcf/bcf-constants.const.ts","./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/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/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/in-app-notifications/center/menu/menu.component.html","./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/date-alert/in-app-notification-date-alert.component.html","./src/app/features/in-app-notifications/entry/in-app-notification-entry.component.html","./src/app/features/in-app-notifications/entry/in-app-notification-entry.component.ts","./src/app/features/in-app-notifications/center/in-app-notification-center.component.html","./src/app/features/in-app-notifications/center/in-app-notification-center.component.ts","./src/app/features/in-app-notifications/center/toolbar/settings/notification-settings-button.component.ts","./src/app/features/in-app-notifications/center/toolbar/settings/notification-settings-button.component.html","./src/app/features/in-app-notifications/center/toolbar/facet/activate-facet-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/center/empty-state/empty-state.component.html","./src/app/features/in-app-notifications/center/empty-state/empty-state.component.ts","./src/app/features/in-app-notifications/in-app-notifications.module.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/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/team-planner/team-planner/sidemenu/team-planner-sidemenu.component.html","./src/app/features/team-planner/team-planner/sidemenu/team-planner-sidemenu.component.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/abstract-filter-date-time-value/abstract-filter-date-time-value.controller.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-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-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-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/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-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-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/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-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/query-filter/query-filter.component.html","./src/app/features/work-packages/components/filters/query-filter/query-filter.component.ts","./src/app/features/work-packages/components/filters/query-filters/query-filters.component.html","./src/app/features/work-packages/components/filters/query-filters/query-filters.component.ts","./src/app/features/work-packages/components/filters/quick-filter-by-text-input/quick-filter-by-text-input.component.ts","./src/app/features/work-packages/components/filters/quick-filter-by-text-input/quick-filter-by-text-input.html","./src/app/features/work-packages/components/filters/wp-filters/wp-filters.service.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/fields/edit/field-types/formattable-edit-field/formattable-edit-field.component.html","./src/app/features/work-packages/components/work-package-comment/wp-comment-field.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-activity/activity-link.component.ts","./src/app/features/work-packages/components/wp-activity/comment-service.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/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-baseline/baseline-helpers.ts","./src/app/features/work-packages/components/wp-baseline/baseline-legends/baseline-legends.component.html","./src/app/features/work-packages/components/wp-baseline/baseline-legends/baseline-legends.component.ts","./src/app/features/work-packages/components/wp-baseline/baseline-loading/baseline-loading.component.ts","./src/app/features/work-packages/components/wp-baseline/baseline-loading/baseline-loading.component.html","./src/app/features/work-packages/components/wp-baseline/baseline-modal/baseline-modal.component.ts","./src/app/features/work-packages/components/wp-baseline/baseline-modal/baseline-modal.component.html","./src/app/features/work-packages/components/wp-baseline/baseline/baseline.component.html","./src/app/features/work-packages/components/wp-baseline/baseline/baseline.component.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/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-details-view-button/wp-details-view-button.component.ts","./src/app/features/work-packages/components/wp-buttons/wp-button.template.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-fold-toggle-button/wp-fold-toggle-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/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/features/work-packages/components/wp-buttons/wp-share-button/wp-share-button.component.ts","./src/app/features/work-packages/components/wp-buttons/wp-share-button/wp-share-button.html","./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/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/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/zen-mode-toggle-button/zen-mode-toggle-button.component.ts","./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-new/wp-new-full-view.html","./src/app/features/work-packages/components/wp-copy/wp-copy-full-view.component.ts","./src/app/features/work-packages/components/wp-new/wp-new-split-view.html","./src/app/features/work-packages/components/wp-copy/wp-copy-split-view.component.ts","./src/app/features/work-packages/components/wp-copy/wp-copy.controller.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/features/work-packages/components/wp-custom-actions/wp-custom-actions.component.html","./src/app/features/work-packages/components/wp-custom-actions/wp-custom-actions.component.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/wp-custom-action.component.html","./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/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/baseline/baseline-column-builder.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.component.ts","./src/app/features/work-packages/components/wp-new/wp-new-split-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-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/shared/components/autocompleter/op-autocompleter/op-autocompleter.component.html","./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-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-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-hierarchy/wp-relations-hierarchy.directive.ts","./src/app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.template.html","./src/app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service.ts","./src/app/features/work-packages/components/wp-relations/wp-relations.template.html","./src/app/features/work-packages/components/wp-relations/wp-relations.component.ts","./src/app/features/work-packages/components/wp-relations/wp-relations.service.ts","./src/app/features/work-packages/components/wp-share-modal/wp-share.modal.ts","./src/app/features/work-packages/components/wp-share-modal/wp-share.modal.html","./src/app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-base.controller.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/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/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/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-single-view-tabs/keep-tab/keep-tab.service.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/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/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-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/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/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/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/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/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/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/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/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/embedded-tables-macro.component.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/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/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/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/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/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.component.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-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-timer-button/time-formatter.helper.ts","./src/app/features/work-packages/components/wp-timer-button/wp-timer-button.component.html","./src/app/features/work-packages/components/wp-timer-button/wp-timer-button.component.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/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/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-full-view/wp-full-view.html","./src/app/features/work-packages/routing/wp-full-view/wp-full-view.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/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-baseline.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/routing/wp-view-page/wp-view-page.component.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/attribute-help-text.component.html","./src/app/shared/components/attribute-help-texts/attribute-help-text.component.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.module.ts","./src/app/shared/components/attribute-help-texts/static-attribute-help-text.component.ts","./src/app/shared/components/attribute-help-texts/static-attribute-help-text.component.html","./src/app/shared/components/attribute-help-texts/static-attribute-help-text.modal.ts","./src/app/shared/components/attribute-help-texts/static-attribute-help-text.modal.html","./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/autocompleter.helper.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.ts","./src/app/shared/components/autocompleter/openproject-autocompleter.module.ts","./src/app/shared/components/autocompleter/project-autocompleter/project-autocompleter-template.component.html","./src/app/shared/components/autocompleter/project-autocompleter/project-autocompleter-template.component.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.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/shared/components/autocompleter/user-autocompleter/user-autocompleter-template.component.html","./src/app/shared/components/autocompleter/user-autocompleter/user-autocompleter-template.component.ts","./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/collapsible-section/collapsible-section.component.ts","./src/app/shared/components/collapsible-section/collapsible-section.html","./src/app/shared/components/colors/colors-autocompleter.component.ts","./src/app/shared/components/colors/colors.service.ts","./src/app/shared/components/copy-to-clipboard/copy-to-clipboard.component.ts","./src/app/shared/components/copy-to-clipboard/copy-to-clipboard.service.ts","./src/app/shared/components/dataset-inputs.ts","./src/app/shared/components/date/op-date-time.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/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/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/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/services/date-modal-relations.service.ts","./src/app/shared/components/datepicker/services/date-modal-scheduling.service.ts","./src/app/shared/components/datepicker/sheet/date-picker-sheet.component.ts","./src/app/shared/components/datepicker/sheet/date-picker-sheet.component.html","./src/app/shared/components/datepicker/toggle/datepicker-working-days-toggle.component.ts","./src/app/shared/components/datepicker/toggle/datepicker-working-days-toggle.component.html","./src/app/shared/components/datepicker/wp-multi-date-form/wp-multi-date-form.component.ts","./src/app/shared/components/datepicker/wp-multi-date-form/wp-multi-date-form.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/dynamic-bootstrap/component/dynamic-bootstrap/dynamic-bootstrap.component.ts","./src/app/shared/components/dynamic-bootstrap/component/dynamic-bootstrap/dynamic-bootstrap.component.html","./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/integer-input/integer-input.component.html","./src/app/shared/components/dynamic-forms/components/dynamic-inputs/select-input/select-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-augmented-textarea/ckeditor-augmented-textarea.html","./src/app/shared/components/editor/components/ckeditor-augmented-textarea/ckeditor-augmented-textarea.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.component.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.component.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/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/attribute-model-loader.service.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/work-package-quickinfo-macro.html","./src/app/shared/components/fields/macros/work-package-quickinfo-macro.component.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/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/fields/edit/field-types/combined-date-edit-field.component.html","./src/app/shared/components/fields/edit/field-types/combined-date-edit-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/edit/edit-field.initializer.ts","./src/app/shared/components/fields/display/field-types/text-display-field.module.ts","./src/app/shared/components/fields/display/field-types/float-display-field.module.ts","./src/app/shared/components/fields/display/field-types/integer-display-field.module.ts","./src/app/shared/components/fields/display/field-types/resource-display-field.module.ts","./src/app/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/display-field.initializer.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/grids/widgets/widget-changeset.ts","./src/app/shared/components/grids/widgets/abstract-widget.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/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/hide-section.service.ts","./src/app/shared/components/hide-section/show-section-dropdown.component.ts","./src/app/shared/components/icon/icon.component.ts","./src/app/shared/components/icon/icon.module.ts","./src/app/shared/components/modal/modal-banner/modal-banner.component.html","./src/app/shared/components/modal/modal-banner/modal-banner.component.ts","./src/app/shared/components/modal/modal-overlay.component.ts","./src/app/shared/components/modal/modal-overlay.component.html","./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/editor-macros.service.ts","./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/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-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-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/export-modal/wp-table-export.modal.html","./src/app/shared/components/modals/export-modal/wp-table-export.modal.ts","./src/app/shared/components/modals/get-ical-url-modal/query-get-ical-url.modal.html","./src/app/shared/components/modals/get-ical-url-modal/query-get-ical-url.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/save-modal/save-query.modal.ts","./src/app/shared/components/modals/save-modal/save-query.modal.html","./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/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/op-principal-loading-skeleton/op-principal-loading-skeleton.component.ts","./src/app/shared/components/op-content-loader/op-principal-loading-skeleton/op-principal-loading-skeleton.component.html","./src/app/shared/components/op-content-loader/op-wp-loading-skeleton/op-wp-loading-skeleton.component.ts","./src/app/shared/components/op-content-loader/op-wp-loading-skeleton/op-wp-loading-skeleton.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/op-settings-dropdown-menu.directive.ts","./src/app/shared/components/op-context-menu/handlers/op-types-context-menu.directive.ts","./src/app/shared/components/op-context-menu/handlers/wp-create-settings-menu.directive.ts","./src/app/shared/components/op-context-menu/handlers/wp-group-toggle-dropdown-menu.directive.ts","./src/app/shared/components/op-context-menu/handlers/wp-status-dropdown-menu.directive.ts","./src/app/shared/components/op-context-menu/handlers/wp-view-dropdown-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-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/shared/components/op-view-select/op-static-queries.service.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/shared/components/option-list/option-list.component.html","./src/app/shared/components/option-list/option-list.component.ts","./src/app/shared/components/persistent-toggle/persistent-toggle.component.ts","./src/app/shared/components/principal/principal-helper.ts","./src/app/shared/components/principal/principal-renderer.service.ts","./src/app/shared/components/principal/principal-list.component.html","./src/app/shared/components/principal/principal-list.component.ts","./src/app/shared/components/principal/principal-rendering.module.ts","./src/app/shared/components/principal/principal.component.ts","./src/app/shared/components/project-include/insert-in-list.ts","./src/app/shared/components/project-include/list/project-include-list.component.html","./src/app/shared/components/project-include/list/project-include-list.component.ts","./src/app/shared/components/project-include/calculate-positions.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/remote-field-updater/remote-field-updater.component.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/sidemenu/sidemenu.component.html","./src/app/shared/components/sidemenu/sidemenu.component.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/spot/components/breadcrumbs/breadcrumbs-content.ts","./src/app/shared/components/storages/file-picker-base-modal/file-picker-base-modal.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/functions/storages.functions.ts","./src/app/shared/components/storages/icons.mapping.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/location-picker-modal/location-picker-modal.component.html","./src/app/shared/components/storages/location-picker-modal/location-picker-modal.component.ts","./src/app/shared/components/storages/pipes/sort-files.pipe.ts","./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/storage-file-list-item/storage-file-list-item.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-information/storage-information-box.ts","./src/app/shared/components/storages/storage-information/storage-information.service.ts","./src/app/shared/components/storages/storage-login-button/storage-login-button.component.ts","./src/app/shared/components/storages/storage-login-button/storage-login-button.component.html","./src/app/core/upload/convert-http-event.ts","./src/app/shared/components/storages/upload/nextcloud-upload.strategy.ts","./src/app/shared/components/storages/upload/one-drive-upload.strategy.ts","./src/app/shared/components/storages/upload/storage-upload.service.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/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/table-pagination/pagination-instance.ts","./src/app/shared/components/table-pagination/pagination-service.ts","./src/app/shared/components/table-pagination/table-pagination.component.ts","./src/app/shared/components/tabs/scrollable-tabs/scrollable-tabs.component.html","./src/app/shared/components/tabs/content-tabs/content-tabs.component.ts","./src/app/shared/components/tabs/openproject-tabs.module.ts","./src/app/shared/components/tabs/scrollable-tabs/scrollable-tabs.component.ts","./src/app/shared/components/tabs/tab-badges/tab-count.component.html","./src/app/shared/components/tabs/tab-badges/tab-count.component.ts","./src/app/shared/components/time_entries/shared/modal/base.modal.html","./src/app/shared/components/time_entries/create/create.modal.ts","./src/app/shared/components/time_entries/create/create.service.ts","./src/app/shared/components/time_entries/edit/edit.modal.ts","./src/app/shared/components/time_entries/edit/edit.service.ts","./src/app/shared/components/time_entries/edit/trigger-actions-entry.component.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/services/time-entry-timer.service.ts","./src/app/shared/components/time_entries/shared/modal/base.modal.ts","./src/app/shared/components/time_entries/timer/stop-existing-timer-modal.component.ts","./src/app/shared/components/time_entries/timer/stop-existing-timer-modal.component.html","./src/app/shared/components/time_entries/timer/timer-account-menu.component.html","./src/app/shared/components/time_entries/timer/timer-account-menu.component.ts","./src/app/shared/components/toaster/toast.component.html","./src/app/shared/components/toaster/toast.component.ts","./src/app/shared/components/toaster/toast.service.ts","./src/app/shared/components/toaster/toasts-container.component.ts","./src/app/shared/components/toaster/upload-progress.component.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/datepicker/multi-date-picker/multi-date-picker.component.ts","./src/app/shared/components/datepicker/multi-date-picker/multi-date-picker.component.html","./src/app/shared/components/dynamic-bootstrap/dynamic-bootstrap.module.ts","./src/app/shared/components/datepicker/basic-datepicker.module.ts","./src/app/shared/components/datepicker/datepicker.module.ts","./src/app/shared/shared.module.ts","./src/app/spot/components/breadcrumbs/breadcrumbs.component.html","./src/app/spot/components/breadcrumbs/breadcrumbs.component.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-portal.component.ts","./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-binding.directive.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/toggle/toggle.component.html","./src/app/spot/components/toggle/toggle.component.ts","./src/app/spot/components/tooltip/tooltip.component.html","./src/app/spot/components/tooltip/tooltip.component.ts","./src/app/spot/drop-alignment-options.ts","./src/app/spot/components/filter-chip/filter-chip.component.html","./src/app/spot/components/filter-chip/filter-chip.component.ts","./src/app/spot/spot.module.ts","./src/environments/environment.prod.ts","./src/app/shared/directives/op-drag-scroll/op-drag-scroll.directive.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/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/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/widgets/add/add.modal.html","./src/app/shared/components/grids/widgets/add/add.modal.ts","./src/app/shared/components/grids/grid/add-widget.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/grid/grid.component.html","./src/app/shared/components/grids/grid/grid.component.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/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/grid/initialization.service.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/overview/wp-overview-graph.template.html","./src/app/shared/components/work-package-graphs/overview/wp-overview-graph.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/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/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/input/global-search-input.component.html","./src/app/core/global_search/input/global-search-input.component.ts","./src/app/core/global_search/global-search-work-packages.component.ts","./src/app/core/global_search/tabs/global-search-tabs.component.ts","./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/global-search-work-packages-entry.component.ts","./src/app/core/global_search/openproject-global-search.module.ts","./src/app/shared/components/grids/grid/page/grid-page.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-autocompleter.component.ts","./src/app/shared/components/autocompleter/members-autocompleter/members.module.ts","./src/app/core/augmenting/openproject-augmenting.module.ts","./src/app/features/invite-user-modal/invite-user-modal-augment.service.ts","./src/app/features/invite-user-modal/project-selection/project-selection.component.html","./src/app/features/invite-user-modal/project-selection/project-selection.component.ts","./src/app/features/invite-user-modal/project-selection/project-allowed.validator.ts","./src/app/features/invite-user-modal/principal/principal-search.component.html","./src/app/features/invite-user-modal/principal/principal-search.component.ts","./src/app/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/enterprise-base.component.html","./src/app/features/enterprise/enterprise-base.component.ts","./src/app/features/enterprise/enterprise-active-trial/ee-active-saved-trial.component.ts","./src/app/features/enterprise/openproject-enterprise.module.ts","./src/app/core/top-menu/top-menu.service.ts","./src/app/core/main-menu/main-menu-toggle.component.ts","./src/app/core/main-menu/main-menu-toggle.component.html","./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/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/resizer/resizer/main-menu-resizer.component.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/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/editable-query-props/editable-query-props.component.ts","./src/app/features/admin/editable-query-props/editable-query-props.component.html","./src/app/features/admin/openproject-admin.module.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/core/setup/global-dynamic-components.const.ts","./src/app/core/html-sanitize/html-sanitize.service.ts","./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.service.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/state/github-pull-request.store.ts","./src/app/features/plugins/linked/openproject-github_integration/state/github-pull-request.service.ts","./src/app/features/plugins/linked/openproject-github_integration/pull-request/pull-request-state.component.ts","./src/app/features/plugins/linked/openproject-github_integration/pull-request/pull-request-state.component.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.component.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/pull-request/pull-request-macro.component.html","./src/app/features/plugins/linked/openproject-github_integration/pull-request/pull-request-macro.component.ts","./src/app/features/plugins/linked/openproject-github_integration/main.ts","./src/app/features/plugins/linked/openproject-gitlab_integration/git-actions/git-actions.service.ts","./src/app/features/plugins/linked/openproject-gitlab_integration/git-actions-menu/git-actions-menu.template.html","./src/app/features/plugins/linked/openproject-gitlab_integration/git-actions-menu/git-actions-menu.component.ts","./src/app/features/plugins/linked/openproject-gitlab_integration/git-actions-menu/git-actions-menu.directive.ts","./src/app/features/plugins/linked/openproject-gitlab_integration/tab-header-mr/tab-header-mr.component.ts","./src/app/features/plugins/linked/openproject-gitlab_integration/tab-header-mr/tab-header-mr.template.html","./src/app/features/plugins/linked/openproject-gitlab_integration/tab-header-issue/tab-header-issue.component.ts","./src/app/features/plugins/linked/openproject-gitlab_integration/tab-header-issue/tab-header-issue.template.html","./src/app/features/plugins/linked/openproject-gitlab_integration/merge-request/merge-request.component.html","./src/app/features/plugins/linked/openproject-gitlab_integration/merge-request/merge-request.component.ts","./src/app/features/plugins/linked/openproject-gitlab_integration/tab-mrs/tab-mrs.template.html","./src/app/features/plugins/linked/openproject-gitlab_integration/tab-mrs/tab-mrs.component.ts","./src/app/features/plugins/linked/openproject-gitlab_integration/issue/issue.component.html","./src/app/features/plugins/linked/openproject-gitlab_integration/issue/issue.component.ts","./src/app/features/plugins/linked/openproject-gitlab_integration/tab-issue/tab-issue.template.html","./src/app/features/plugins/linked/openproject-gitlab_integration/tab-issue/tab-issue.component.ts","./src/app/features/plugins/linked/openproject-gitlab_integration/gitlab-tab/gitlab-tab.component.ts","./src/app/features/plugins/linked/openproject-gitlab_integration/gitlab-tab/gitlab-tab.template.html","./src/app/features/plugins/linked/openproject-gitlab_integration/tab-mrs/wp-gitlab-mrs.service.ts","./src/app/features/plugins/linked/openproject-gitlab_integration/tab-issue/wp-gitlab-issue.service.ts","./src/app/features/plugins/linked/openproject-gitlab_integration/main.ts","./src/app/features/plugins/linked/openproject-meeting/meetings-tab/meetings-tab.component.ts","./src/app/features/plugins/linked/openproject-meeting/meetings-tab/meetings-tab.template.html","./src/app/features/plugins/linked/openproject-meeting/main.ts","./src/app/features/plugins/linked-plugins.module.ts","./src/app/core/state/openproject-state.module.ts","./src/app/core/upload/fog-upload.service.ts","./src/app/core/upload/local-upload.service.ts","./src/app/shared/helpers/angular/custom-elements.helper.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/link-hijacking.ts","./src/app/core/setup/globals/global-listeners.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/stimulus/controllers/dynamic/menus/main.controller.ts","./src/stimulus/controllers/op-application.controller.ts","./src/stimulus/controllers/disable-when-checked.controller.ts","./src/stimulus/controllers/print.controller.ts","./src/stimulus/controllers/refresh-on-form-changes.controller.ts","./src/stimulus/setup.ts","./src/turbo/setup.ts","./node_modules/codemirror/mode/ lazy ^\\.\\/.*\\/.*\\.js$ namespace object","./node_modules/dragula/dist/ sync","./node_modules/moment/locale/ sync ^\\.\\/.*$","./src/locales/ lazy ^\\.\\/.*\\.json$ namespace object","./src/stimulus/controllers/dynamic/ lazy ^\\.\\/.*\\.controller$ 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() as Promise;\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 '@openproject/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(\n protected apiRoot:ApiV3Service,\n protected basePath:string,\n ) {\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(\n queryData:object,\n queryId?:string|null,\n projectIdentifier?:string|null|undefined,\n ):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(this.apiRoot.queries.path, payload);\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 /**\n * Get the ical url of the given query for the requesting user with the ical token\n *\n * @param query\n * @param tokenName\n */\n public getIcalUrl(query:QueryResource, tokenName:string):Promise {\n return query.icalUrl({ token_name: tokenName });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 '@openproject/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 valid_subset: true,\n },\n )\n .toPromise() as Promise;\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 '@openproject/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.boardsPath(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 ApiV3ResourceCollection(this.apiRoot, this.path, 'week');\n\n // /api/v3/days/nonWorkingDays\n public readonly nonWorkingDays = new ApiV3ResourceCollection(this.apiRoot, this.path, 'non_working');\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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(\n protected apiRoot:ApiV3Service,\n protected basePath:string,\n ) {\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 ApiV3GettableResource,\n ApiV3ResourceCollection,\n} from 'core-app/core/apiv3/paths/apiv3-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { IProjectStorage } from 'core-app/core/state/project-storages/project-storage.model';\n\nexport class ApiV3ProjectStoragesPaths\n extends ApiV3ResourceCollection> {\n constructor(\n protected apiRoot:ApiV3Service,\n protected basePath:string,\n ) {\n super(apiRoot, basePath, 'project_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 {\n ApiV3PlaceholderUsersPaths,\n} 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/api-v3-storages-paths';\nimport {\n ApiV3ProjectStoragesPaths,\n} from 'core-app/core/apiv3/endpoints/project-storages/api-v3-project-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/github_pull_requests\n public readonly github_pull_requests = this.apiV3CollectionEndpoint('github_pull_requests');\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/project_storages\n public readonly projectStorages = this.apiV3CustomEndpoint(ApiV3ProjectStoragesPaths);\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(\n 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 // eslint-disable-next-line new-cap\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 {\n MultiInputState,\n State,\n} from '@openproject/reactivestates';\nimport {\n combineLatest,\n firstValueFrom,\n forkJoin,\n Observable,\n} from 'rxjs';\nimport {\n auditTime,\n map,\n share,\n startWith,\n 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(firstValueFrom(observable));\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 observeSome(ids:string[]):Observable {\n return combineLatest(\n ids.map(\n (id) => this.observe(id).pipe(startWith(null)),\n ),\n ).pipe(\n map((values) => values.filter((value) => !!value)),\n ) as Observable;\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 { Observable } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\n\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 { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3FilterBuilder } 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 { 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(\n protected apiRoot:ApiV3Service,\n readonly basePath:string,\n readonly id:string|number,\n protected parent?:ApiV3ResourcePath|ApiV3ResourceCollection>,\n ) {\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(\n protected apiRoot:ApiV3Service,\n protected basePath:string,\n segment:string,\n protected resource?:Constructor,\n ) {\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>(\n filters:ApiV3FilterBuilder,\n params:{ [key:string]:string } = {},\n resourceClass?:Constructor,\n ):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 = 544;\n public tabletWidthTreshold = 768;\n\n public get isMobile():boolean {\n return (window.innerWidth < this.mobileWidthTreshold);\n }\n\n public get isTablet():boolean {\n return (window.innerWidth < this.tabletWidthTreshold);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 * as moment from 'moment';\n\nimport { ConfigurationResource } from 'core-app/features/hal/resources/configuration-resource';\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 constructor(\n private readonly apiV3Service:ApiV3Service,\n ) { }\n\n public initialize():Promise {\n return this.loadConfiguration();\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 isDefaultTimezoneSet():boolean {\n return !!this.defaultTimezone();\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 defaultTimezone():string {\n return this.systemPreference('userDefaultTimezone');\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:ConfigurationResource) => {\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 { firstValueFrom } from 'rxjs';\n\nexport function bootstrapModule(injector:Injector):void {\n const currentUserService = injector.get(CurrentUserService);\n\n (window.ErrorReporter as ErrorReporterBase)\n .addHook(\n () => firstValueFrom(currentUserService.user$)\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.requireCollection(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\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 * Returns the user's configured timezone or guesses it through moment\n */\n public userTimezone():string {\n return this.configurationService.isTimezoneSet() ? this.configurationService.timezone() : moment.tz.guess();\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 return moment\n .utc(datetime, format)\n .tz(this.userTimezone());\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, format?:string):string {\n return this.parseDatetime(datetimeString).format(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';\nimport { Moment } from 'moment';\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:Moment|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 .requireCollection()\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 { 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';\nimport { NgSelectConfig } from '@ng-select/ng-select';\nimport { I18n } from 'i18n-js';\nimport { FormatNumberOptions, TranslateOptions } from 'i18n-js/src/typing';\n\n@Injectable({ providedIn: 'root' })\nexport class I18nService {\n private i18n:I18n = window.I18n;\n private instanceLocale:string;\n\n constructor(\n private config:NgSelectConfig,\n ) {\n const meta = document.querySelector('meta[name=openproject_initializer]');\n this.instanceLocale = meta?.dataset.instancelocale || 'en';\n\n this.config.addTagText = this.t('js.autocomplete_ng_select.add_tag');\n this.config.clearAllText = this.t('js.autocomplete_ng_select.clear_all');\n this.config.loadingText = this.t('js.autocomplete_ng_select.loading');\n this.config.notFoundText = this.t('js.autocomplete_ng_select.not_found');\n this.config.typeToSearchText = this.t('js.autocomplete_ng_select.type_to_search');\n }\n\n public get locale():string {\n return this.i18n.locale;\n }\n\n public t(input:string, options:Partial = {}) {\n return this.i18n.t(input, options);\n }\n\n public instance_locale_translate(input:string, options:Partial = {}) {\n const locale = this.i18n.locale;\n try {\n this.i18n.locale = this.instanceLocale;\n return this.t(input, options);\n } finally {\n this.i18n.locale = locale;\n }\n }\n\n public toTime = this.i18n.toTime.bind(this.i18n);\n\n public toNumber(val:string|number, options:Partial):string {\n return this.i18n.localize('number', val, options);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 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","import { BehaviorSubject } from 'rxjs';\nimport { filter, take } from 'rxjs/operators';\nimport { Injectable } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class MainMenuNavigationService {\n public navigationEvents$ = new BehaviorSubject('');\n\n public onActivate(...names:string[]) {\n return this\n .navigationEvents$\n .pipe(\n filter((evt) => names.indexOf(evt) !== -1),\n take(1),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 // tablet version default: hide menu on initialization\n this.closeWhenOnTablet();\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.isTablet) { // tablet 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 closeWhenOnTablet():void {\n if (this.deviceService.isTablet) {\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.isTablet ? 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 '@openproject/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(workPackageId: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('mentionable_on_work_package', '=', [workPackageId.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 boardsPath(projectIdentifier:string|null) {\n if (projectIdentifier) {\n return `${this.projectPath(projectIdentifier)}/boards`;\n }\n return `${this.staticBase}/boards`;\n }\n\n public newBoardsPath(projectIdentifier:string|null) {\n return `${this.boardsPath(projectIdentifier)}/new`;\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 workPackageShortPath(id:string|number) {\n return `${this.staticBase}/wp/${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 workPackageSharePath(workPackageId:string|number) {\n return `${this.workPackagePath(workPackageId)}/shares`;\n }\n\n // Work Package Bulk paths\n\n public workPackagesBulkEditPath() {\n return `${this.workPackagesPath()}/bulk/edit`;\n }\n\n public workPackagesBulkMovePath() {\n return `${this.workPackagesPath()}/move/new`;\n }\n\n public workPackagesBulkCopyPath() {\n return `${this.workPackagesBulkMovePath()}?copy=true`;\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';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable()\nexport class RecentItemsService {\n recentItems$ = new BehaviorSubject(this.getAll());\n\n add(id:string):void {\n let wps = this.getAll().filter((entry:string) => entry !== id);\n wps.unshift(id);\n if (wps.length > 5) {\n wps = wps.slice(0, 5);\n }\n window.localStorage.setItem('recent', JSON.stringify(wps));\n this.recentItems$.next(wps);\n }\n\n getAll():string[] {\n return JSON.parse(window.OpenProject.guardedLocalStorage('recent') || '[]') as 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 { 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 '@openproject/reactivestates';\nimport { Injectable } from '@angular/core';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport {\n firstValueFrom,\n Observable,\n} from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { States } from 'core-app/core/states/states.service';\nimport {\n ISchemaProxy,\n SchemaProxy,\n} 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\nexport const fallbackSchemaId = '__fallback';\n\n@Injectable()\nexport class SchemaCacheService extends StateCacheService {\n fallbackSchema = this.halResourceService.createHalResourceOfClass(SchemaResource, {}, true);\n\n constructor(\n readonly states:States,\n readonly halResourceService:HalResourceService,\n ) {\n super(states.schemas);\n this.putValue(fallbackSchemaId, this.fallbackSchema);\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 as SchemaResource;\n\n if (resource._type === 'WorkPackage') {\n return WorkPackageSchemaProxy.create(schema, resource);\n }\n\n return SchemaProxy.create(schema, resource);\n }\n\n public getSchemaHref(resource:HalResource):string|undefined {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return resource.$links.schema?.href as string|undefined;\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 return firstValueFrom(this.requireAndStream(href || fallbackSchemaId));\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) || fallbackSchemaId;\n }\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 onboardingTourStorageKey = 'openProject-onboardingTour';\nexport type OnboardingTourNames = 'prepareBacklogs'|'backlogs'|'taskboard'|'homescreen'|'main';\n\nexport enum ProjectName {\n demo = 'demo',\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 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/**\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 '@openproject/reactivestates';\nimport { take } from 'rxjs/operators';\nimport { GlobalHelpers } from 'core-app/core/setup/globals/global-helpers';\nimport { firstValueFrom } from 'rxjs';\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 firstValueFrom(this.pluginContext.values$());\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// eslint-disable-next-line import/extensions,import/no-extraneous-dependencies\nrequire('@openproject/primer-view-components/app/assets/javascripts/primer_view_components.js');\n\nrequire('expose-loader?URI!urijs');\nrequire('urijs/src/URITemplate');\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 { ResourceState, createInitialResourceState } from 'core-app/core/state/resource-store';\n\nexport interface AttachmentsState extends ResourceState {}\n\n@StoreConfig({ name: 'attachments' })\nexport class AttachmentsStore extends EntityStore {\n constructor() {\n super(createInitialResourceState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 HttpErrorResponse,\n HttpEvent,\n HttpHeaders,\n} from '@angular/common/http';\nimport { applyTransaction } from '@datorama/akita';\nimport { Observable } from 'rxjs';\nimport {\n catchError,\n map,\n tap,\n} from 'rxjs/operators';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalLink } from 'core-app/features/hal/hal-link/hal-link';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { AttachmentsStore } from 'core-app/core/state/attachments/attachments.store';\nimport { IAttachment } from 'core-app/core/state/attachments/attachment.model';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport {\n IUploadFile,\n OpUploadService,\n} from 'core-app/core/upload/upload.service';\nimport { removeEntityFromCollectionAndState } from 'core-app/core/state/resource-store';\nimport {\n ResourceStore,\n ResourceStoreService,\n} from 'core-app/core/state/resource-store.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport isNewResource, { HAL_NEW_RESOURCE_ID } from 'core-app/features/hal/helpers/is-new-resource';\nimport waitForUploadsFinished from 'core-app/core/upload/wait-for-uploads-finished';\nimport isNotNull from 'core-app/core/state/is-not-null';\n\n@Injectable()\nexport class AttachmentsResourceService extends ResourceStoreService {\n @InjectField() I18n:I18nService;\n\n @InjectField() uploadService:OpUploadService;\n\n @InjectField() configurationService:ConfigurationService;\n\n @InjectField() toastService:ToastService;\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:HttpErrorResponse) => {\n this.toastService.addError(error);\n throw new Error(error.message);\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:File[]):Observable {\n const identifier = AttachmentsResourceService.getAttachmentsSelfLink(resource) || HAL_NEW_RESOURCE_ID;\n const href = this.getUploadTarget(resource);\n const uploadFiles = files.map((file) => ({ file }));\n\n return this\n .addAttachments(\n identifier,\n href,\n uploadFiles,\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 */\n addAttachments(\n collectionKey:string,\n uploadHref:string,\n files:IUploadFile[],\n ):Observable {\n return this\n .uploadAttachments(uploadHref, files)\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:IUploadFile[]):Observable {\n const observables = this.uploadService.upload(href, files);\n const uploads = files.map((f, i):[File, Observable>] => [f.file, observables[i]]);\n\n this.toastService.addUpload(this.I18n.t('js.label_upload_notification'), uploads);\n\n return waitForUploadsFinished(observables)\n .pipe(\n map((responses) =>\n responses\n .map((response) => response.body)\n .filter(isNotNull)),\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():ResourceStore {\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 { ResourceState, createInitialResourceState } from 'core-app/core/state/resource-store';\nimport { ICapability } from 'core-app/core/state/capabilities/capability.model';\n\nexport interface CapabilitiesState extends ResourceState {\n}\n\n@StoreConfig({ name: 'capabilities' })\nexport class CapabilitiesStore extends EntityStore {\n constructor() {\n super(createInitialResourceState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n catchError,\n map,\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 { ICapability } from 'core-app/core/state/capabilities/capability.model';\nimport { CapabilitiesStore } from 'core-app/core/state/capabilities/capabilities.store';\nimport {\n ResourceStore,\n ResourceStoreService,\n} from 'core-app/core/state/resource-store.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Injectable()\nexport class CapabilitiesResourceService extends ResourceStoreService {\n @InjectField() toastService:ToastService;\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():ResourceStore {\n return new CapabilitiesStore();\n }\n\n protected basePath():string {\n return this.apiV3Service.capabilities.path;\n }\n}\n","import {\n EntityStore,\n StoreConfig,\n} from '@datorama/akita';\nimport {\n ResourceState,\n createInitialResourceState,\n} from 'core-app/core/state/resource-store';\nimport { IDay } from 'core-app/core/state/days/day.model';\n\nexport interface DayState extends ResourceState {\n}\n\n@StoreConfig({ name: 'days' })\nexport class DayStore extends EntityStore {\n constructor() {\n super(createInitialResourceState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport { map } from 'rxjs/operators';\nimport { firstValueFrom, Observable } from 'rxjs';\n\nimport { ApiV3ListFilter } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { DayStore } from 'core-app/core/state/days/day.store';\nimport { IDay } from 'core-app/core/state/days/day.model';\nimport {\n ResourceStore,\n ResourceStoreService,\n} from 'core-app/core/state/resource-store.service';\nimport * as moment from 'moment-timezone';\n\n@Injectable()\nexport class DayResourceService extends ResourceStoreService {\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 firstValueFrom(\n this\n .requireNonWorkingYear$(input)\n .pipe(\n map((days) => days.findIndex((day:IDay) => day.date === date) !== -1),\n ),\n );\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.requireCollection({ 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.requireCollection({ filters });\n }\n\n protected createStore():ResourceStore {\n return new DayStore();\n }\n}\n","import {\n EntityStore,\n StoreConfig,\n} from '@datorama/akita';\nimport {\n ResourceState,\n createInitialResourceState,\n} from 'core-app/core/state/resource-store';\nimport { IWeekday } from 'core-app/core/state/days/weekday.model';\n\nexport interface WeekdayState extends ResourceState {\n}\n\n@StoreConfig({ name: 'weekdays' })\nexport class WeekdayStore extends EntityStore {\n constructor() {\n super(createInitialResourceState());\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/resource-store';\nimport { WeekdayStore } from 'core-app/core/state/days/weekday.store';\nimport { IWeekday } from 'core-app/core/state/days/weekday.model';\nimport {\n ResourceStore,\n ResourceStoreService,\n} from 'core-app/core/state/resource-store.service';\n\n@Injectable()\nexport class WeekdayResourceService extends ResourceStoreService {\n requireCollection():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():ResourceStore {\n return new WeekdayStore();\n }\n\n protected basePath():string {\n return this.apiV3Service.days.week.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';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { Observable } from 'rxjs';\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\n\nconst EffectHandlers = Symbol('EffectHandlers');\n\ntype EffectHandlerItem = { callback:(action:Action) => void, action:ActionCreator };\n\ninterface DecoratedEffectClass {\n [EffectHandlers]:Map\n}\n\nexport function registerEffectCallbacks(instance:EffectClass, untilDestroyed:(source:Observable) => Observable):void {\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 = (instance as unknown as DecoratedEffectClass)[EffectHandlers];\n if (handlers) {\n handlers.forEach((item:EffectHandlerItem, key:string) => {\n debugLog(`[${instance.constructor.name}] Subscribing to effect ${key}`);\n\n // Subscribe to the specified action for the duration of this service's life.\n instance.actions$\n .ofType(item.action)\n .pipe(\n untilDestroyed,\n )\n .subscribe((action) => {\n // Wrap callback in a try-catch to avoid completing the subscription.\n try {\n item.callback.call(instance, action);\n } catch (e) {\n console.error(`Error thrown in effect callback ${key}: ${e as string}`);\n }\n });\n });\n }\n}\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 registerEffectCallbacks(this, takeWhile(() => !this.serviceDestroyed));\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 { ResourceState, createInitialResourceState } from 'core-app/core/state/resource-store';\nimport { EntityStore, StoreConfig } from '@datorama/akita';\nimport { IFileLink } from 'core-app/core/state/file-links/file-link.model';\n\nexport interface FileLinksState extends ResourceState {}\n\n@StoreConfig({ name: 'file_links' })\nexport class FileLinksStore extends EntityStore {\n constructor() {\n super(createInitialResourceState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 {\n from,\n Observable,\n of,\n} from 'rxjs';\nimport {\n groupBy,\n mergeMap,\n reduce,\n switchMap,\n tap,\n} from 'rxjs/operators';\n\nimport {\n IFileLink,\n IFileLinkOriginData,\n} 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 {\n insertCollectionIntoState,\n removeEntityFromCollectionAndState,\n} from 'core-app/core/state/resource-store';\nimport {\n ResourceStore,\n ResourceStoreService,\n} from 'core-app/core/state/resource-store.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 ResourceStoreService {\n protected createStore():ResourceStore {\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 { ResourceState, createInitialResourceState } from 'core-app/core/state/resource-store';\n\nexport interface InAppNotificationsState extends ResourceState {\n}\n\n@StoreConfig({ name: 'in-app-notifications' })\nexport class InAppNotificationsStore extends EntityStore {\n constructor() {\n super(createInitialResourceState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 {\n EffectCallback,\n EffectHandler,\n} from 'core-app/core/state/effects/effect-handler.decorator';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { 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 {\n ResourceStore,\n ResourceStoreService,\n} from 'core-app/core/state/resource-store.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@EffectHandler\n@Injectable()\nexport class InAppNotificationsResourceService extends ResourceStoreService {\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():ResourceStore {\n return new InAppNotificationsStore();\n }\n\n protected basePath():string {\n return this.apiV3Service.notifications.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 { ResourceState, createInitialResourceState } from 'core-app/core/state/resource-store';\n\nexport interface PrincipalsState extends ResourceState {\n}\n\n@StoreConfig({ name: 'principals' })\nexport class PrincipalsStore extends EntityStore {\n constructor() {\n super(createInitialResourceState());\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\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 {\n ResourceStore,\n ResourceStoreService,\n} from 'core-app/core/state/resource-store.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@EffectHandler\n@Injectable()\nexport class PrincipalsResourceService extends ResourceStoreService {\n @InjectField() actions$:ActionsService;\n\n @InjectField() toastService:ToastService;\n\n protected createStore():ResourceStore {\n return new PrincipalsStore();\n }\n\n protected basePath():string {\n return this.apiV3Service.principals.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 { EntityStore, StoreConfig } from '@datorama/akita';\n\nimport { IProjectStorage } from 'core-app/core/state/project-storages/project-storage.model';\nimport { createInitialResourceState, ResourceState } from 'core-app/core/state/resource-store';\n\nexport interface ProjectStoragesState extends ResourceState {}\n\n@StoreConfig({ name: 'project-storages' })\nexport class ProjectStoragesStore extends EntityStore {\n constructor() {\n super(createInitialResourceState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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\nimport { IProjectStorage } from 'core-app/core/state/project-storages/project-storage.model';\nimport { ProjectStoragesStore } from 'core-app/core/state/project-storages/project-storages.store';\nimport { ResourceStore, ResourceStoreService } from 'core-app/core/state/resource-store.service';\n\n@Injectable()\nexport class ProjectStoragesResourceService extends ResourceStoreService {\n protected createStore():ResourceStore {\n return new ProjectStoragesStore();\n }\n\n protected basePath():string {\n return this.apiV3Service.projectStorages.path;\n }\n}\n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { ResourceState, createInitialResourceState } from 'core-app/core/state/resource-store';\nimport { IProject } from './project.model';\n\nexport interface ProjectsState extends ResourceState {\n}\n\n@StoreConfig({ name: 'projects' })\nexport class ProjectsStore extends EntityStore {\n constructor() {\n super(createInitialResourceState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { IProject } from './project.model';\nimport {\n ResourceStore,\n ResourceStoreService,\n} from 'core-app/core/state/resource-store.service';\nimport { ProjectsStore } from 'core-app/core/state/projects/projects.store';\n\n@Injectable()\nexport class ProjectsResourceService extends ResourceStoreService {\n protected createStore():ResourceStore {\n return new ProjectsStore();\n }\n\n protected basePath():string {\n return this.apiV3Service.projects.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 shareReplay,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport {\n CollectionResponse,\n insertCollectionIntoState,\n removeResourceLoading,\n ResourceState,\n setResourceLoading,\n} from 'core-app/core/state/resource-store';\nimport { omit } from 'lodash';\nimport isDefinedEntity from 'core-app/core/state/is-defined-entity';\nimport {\n ApiV3ListParameters,\n listParamsString,\n} 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';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\nexport type ResourceStore = EntityStore>;\n\nexport interface ResourceStoreLoadOptions {\n handleErrors:boolean;\n}\n\nexport type ResourceKeyInput = ApiV3ListParameters|string;\n\n@Injectable()\nexport abstract class ResourceStoreService {\n protected store:ResourceStore = 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 input List params to require, or href of the resource\n * @private\n */\n public requireCollection(input:ResourceKeyInput):Observable {\n const href = this.buildResourceLink(input);\n if (this.collectionExists(href) || this.resourceLoading(href)) {\n return this.loadedCollection(href);\n }\n\n return this\n .fetchCollection(href)\n .pipe(\n switchMap(() => this.loadedCollection(href)),\n );\n }\n\n /**\n * Require a single entity to be loaded.\n * Returnes the cached entity if it was loaded already\n *\n * @param href {string}\n */\n public requireEntity(href:string):Observable {\n const id = idFromLink(href);\n if (this.query.hasEntity(id) || this.resourceLoading(href)) {\n return this.lookup(id);\n }\n\n return this.fetchEntity(href);\n }\n\n /**\n * Retrieve a collection from the store\n *\n * @param input List params to require, or href of the resource\n */\n collection(input:ResourceKeyInput):Observable {\n const href = this.buildResourceLink(input);\n\n return this\n .collectionState(href)\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 input List params to require, or href of the resource\n */\n loadedCollection(input:ResourceKeyInput):Observable {\n const href = this.buildResourceLink(input);\n\n return this\n .collectionState(href)\n .pipe(\n filter(isDefinedEntity),\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 input List params to require, or href of the resource\n */\n collectionState(input:ResourceKeyInput):Observable {\n const href = this.buildResourceLink(input);\n\n return this\n .query\n .select()\n .pipe(\n map((state) => state.collections[href]),\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 * @param input List params to require, or href of the resource\n */\n collectionExists(input:ResourceKeyInput):boolean {\n const href = this.buildResourceLink(input);\n\n return !!this\n .query\n .getValue()\n .collections[href];\n }\n\n /**\n * Checks, if the store already has a collection given the key\n *\n * @param input List params to require, or href of the resource\n */\n resourceLoading(input:ResourceKeyInput):boolean {\n const href = this.buildResourceLink(input);\n\n return this\n .query\n .getValue()\n .loadingResources[href] === true;\n }\n\n /**\n * Clear a collection key\n * @param input List params to require, or href of the resource\n */\n clear(input:ResourceKeyInput):void {\n const href = this.buildResourceLink(input);\n\n this\n .store\n .update(\n ({ collections }) => ({\n collections: omit(collections, href),\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:ResourceKeyInput):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 {ResourceKeyInput} collection key or list params to build collection key from\n * @param options {ResourceStoreLoadOptions} Handle collection loading errors within the resource service\n */\n fetchCollection(\n params:ResourceKeyInput,\n options:ResourceStoreLoadOptions = { handleErrors: true },\n ):Observable> {\n const href = this.buildResourceLink(params);\n\n setResourceLoading(this.store, href);\n\n return this\n .http\n .get>(href)\n .pipe(\n tap((collection) => insertCollectionIntoState(this.store, collection, href)),\n finalize(() => removeResourceLoading(this.store, href)),\n catchError((error:unknown) => {\n if (options.handleErrors) {\n this.handleResourceLoadingError(error as HttpErrorResponse, href);\n }\n\n throw error;\n }),\n shareReplay(1),\n );\n }\n\n /**\n * Fetch a single entity, ensuring it is being flagged as loaded\n *\n * @param href {string} of the resource to load\n * @param options {ResourceStoreLoadOptions} Handle loading errors within the resource service\n */\n fetchEntity(\n href:string,\n options:ResourceStoreLoadOptions = { handleErrors: true },\n ):Observable {\n setResourceLoading(this.store, href);\n\n return this\n .http\n .get(href)\n .pipe(\n tap((entity) => this.store.add(entity)),\n finalize(() => removeResourceLoading(this.store, href)),\n catchError((error:unknown) => {\n if (options.handleErrors) {\n this.handleResourceLoadingError(error as HttpErrorResponse, href);\n }\n\n throw error;\n }),\n shareReplay(1),\n );\n }\n\n protected buildResourceLink(input:ResourceKeyInput):string {\n if (typeof input === 'string') {\n return input;\n }\n\n return this.basePath() + listParamsString(input);\n }\n\n /**\n * Create a new instance of this resource service's underlying store.\n * @protected\n */\n protected abstract createStore():ResourceStore;\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 _path\n * @protected\n */\n protected handleResourceLoadingError(error:HttpErrorResponse, _path:string):void {\n this.toastService.addError(error);\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 { 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 ResourceState extends EntityState {\n /** Loaded notification collections */\n collections:Record;\n\n /** Loading resources, collections or singular entities */\n loadingResources: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 resource part of the entity store\n */\nexport function createInitialResourceState():ResourceState {\n return {\n collections: {},\n loadingResources: {},\n };\n}\n\n/**\n * Mark a resource path as being loaded\n *\n * @param store An entity store for the collection\n * @param url The resource path to mark as loading\n */\nexport function setResourceLoading(\n store:EntityStore>,\n url:string,\n):void {\n store.update(({ loadingResources }) => (\n {\n loadingResources: {\n ...loadingResources,\n [url]: true,\n },\n }\n ));\n}\n\n/**\n * Mark a resource path as no longer loading\n *\n * @param store An entity store for the collection\n * @param url The resource path to unmark as loading\n */\nexport function removeResourceLoading(\n store:EntityStore>,\n url:string,\n):void {\n store.update(({ loadingResources }) => (\n {\n loadingResources: filter(loadingResources, (_, key) => key !== url),\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 ancestors: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';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\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(\n private readonly httpClient:HttpClient,\n private readonly apiV3Service:ApiV3Service,\n ) {}\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), this.lookupMany(value.ancestors)])\n .pipe(\n map(([files, parent, ancestors]):IStorageFiles => ({\n files, parent, ancestors, _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 file(href:string):Observable {\n return this.httpClient.get(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, ...storageFiles.ancestors]);\n\n const fileIds = storageFiles.files.map((file) => file.id);\n const parentId = storageFiles.parent.id;\n const ancestorIds = storageFiles.ancestors.map((file) => file.id);\n\n this.store.update(({ files }) => ({\n files: {\n ...files,\n [link]: {\n files: fileIds,\n parent: parentId,\n ancestors: ancestorIds,\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 { ResourceState, createInitialResourceState } from 'core-app/core/state/resource-store';\nimport { IStorage } from 'core-app/core/state/storages/storage.model';\n\nexport interface StoragesState extends ResourceState {}\n\n@StoreConfig({ name: 'storages' })\nexport class StoragesStore extends EntityStore {\n constructor() {\n super(createInitialResourceState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 {\n forkJoin,\n Observable,\n} 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/resource-store';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport {\n ResourceStore,\n ResourceStoreService,\n} from 'core-app/core/state/resource-store.service';\n\n@Injectable()\nexport class StoragesResourceService extends ResourceStoreService {\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():ResourceStore {\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 { ResourceState, createInitialResourceState } from 'core-app/core/state/resource-store';\nimport { IView } from './view.model';\n\nexport interface ViewsState extends ResourceState {\n}\n\n@StoreConfig({ name: 'views' })\nexport class ViewsStore extends EntityStore {\n constructor() {\n super(createInitialResourceState());\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 ResourceStore,\n ResourceStoreService,\n} from 'core-app/core/state/resource-store.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@EffectHandler\n@Injectable()\nexport class ViewsResourceService extends ResourceStoreService {\n @InjectField() actions$:ActionsService;\n\n protected createStore():ResourceStore {\n return new ViewsStore();\n }\n\n protected basePath():string {\n return this.apiV3Service.views.path;\n }\n}\n","import {\n InputState,\n multiInput,\n MultiInputState,\n StatesGroup,\n} from '@openproject/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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HttpEvent, HttpEventType, HttpResponse } from '@angular/common/http';\n\nexport default function isHttpResponse(event:HttpEvent):event is HttpResponse {\n return event.type === HttpEventType.Response;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { HttpEvent } from '@angular/common/http';\n\nexport interface IUploadFile {\n file:File;\n overwrite?:boolean;\n}\n\nexport abstract class OpUploadService {\n public abstract upload(href:string, uploadFiles:IUploadFile[]):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 { forkJoin, Observable } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { HttpEvent, HttpResponse } from '@angular/common/http';\n\nimport isHttpResponse from 'core-app/core/upload/is-http-response';\n\nexport default function waitForUploadsFinished(uploads:Observable>[]):Observable[]> {\n return forkJoin(\n uploads.map((o) => o.pipe(filter(isHttpResponse))),\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 '@openproject/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 {\n firstValueFrom,\n Observable,\n} from 'rxjs';\nimport { map } 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(() => firstValueFrom(\n this.bcfApi\n .projects.id(projectIdentifier)\n .extensions\n .get(),\n ));\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 firstValueFrom(this.authorized$(projectIdentifier, extension, action))\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n Component, Injector, OnDestroy, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { BcfPathHelperService } from 'core-app/features/bim/bcf/helper/bcf-path-helper.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 { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { StateService } from '@uirouter/core';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { WpTableExportModalComponent } from 'core-app/shared/components/modals/export-modal/wp-table-export.modal';\n\n@Component({\n template: `\n \n \n {{text.export}} \n \n `,\n selector: 'bcf-export-button',\n})\nexport class BcfExportButtonComponent extends UntilDestroyedMixin implements OnInit, OnDestroy {\n public text = {\n export: this.I18n.t('js.bcf.export'),\n export_hover: this.I18n.t('js.bcf.export_bcf_xml_file'),\n };\n\n public query:QueryResource;\n\n public exportLink:string;\n\n constructor(readonly I18n:I18nService,\n readonly currentProject:CurrentProjectService,\n readonly bcfPathHelper:BcfPathHelperService,\n readonly querySpace:IsolatedQuerySpace,\n readonly queryUrlParamsHelper:UrlParamsHelperService,\n readonly opModalService:OpModalService,\n readonly injector:Injector,\n readonly state:StateService) {\n super();\n }\n\n ngOnInit() {\n this.querySpace.query\n .values$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((query) => {\n this.query = query;\n\n const projectIdentifier = this.currentProject.identifier;\n const filters = this.queryUrlParamsHelper.buildV3GetFilters(this.query.filters);\n this.exportLink = this.bcfPathHelper.projectExportIssuesPath(\n projectIdentifier!,\n JSON.stringify(filters),\n );\n });\n }\n\n public showDelayedExport(event:any) {\n this.opModalService.show(WpTableExportModalComponent, this.injector, { link: this.exportLink });\n event.preventDefault();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { BcfPathHelperService } from 'core-app/features/bim/bcf/helper/bcf-path-helper.service';\n\n@Component({\n template: `\n \n \n {{text.import}} \n \n `,\n selector: 'bcf-import-button',\n})\nexport class BcfImportButtonComponent {\n public text = {\n import: this.I18n.t('js.bcf.import'),\n import_hover: this.I18n.t('js.bcf.import_bcf_xml_file'),\n };\n\n constructor(readonly I18n:I18nService,\n readonly currentProject:CurrentProjectService,\n readonly bcfPathHelper:BcfPathHelperService) {\n }\n\n public handleClick() {\n const projectIdentifier = this.currentProject.identifier;\n if (projectIdentifier) {\n const url = this.bcfPathHelper.projectImportIssuePath(projectIdentifier);\n window.location.href = url;\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { StateService } from '@uirouter/core';\n\n@Component({\n template: `\n \n \n \n `,\n selector: 'op-refresh-button',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n\nexport class RefreshButtonComponent {\n public text = {\n refresh: this.I18n.t('js.bcf.refresh'),\n refresh_hover: this.I18n.t('js.bcf.refresh_work_package'),\n };\n\n constructor(readonly I18n:I18nService,\n readonly state:StateService) {\n }\n\n refresh() {\n void this.state.go('.', {}, { reload: true });\n }\n}\n","import { Injectable } from '@angular/core';\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 } 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 { BehaviorSubject, firstValueFrom, Observable } from 'rxjs';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\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(\n protected apiV3Service:ApiV3Service,\n protected PathHelper:PathHelperService,\n protected CurrentProject:CurrentProjectService,\n protected halResourceService:HalResourceService,\n protected I18n:I18nService,\n ) {\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 this.loadAllPromise = firstValueFrom(\n this\n .apiV3Service\n .boards\n .allInScope(projectIdentifier as string),\n );\n }\n\n return this.loadAllPromise;\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 public delete(board:Board):Promise {\n return firstValueFrom(\n this\n .apiV3Service\n .boards\n .id(board)\n .delete(),\n );\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\n
\n \n \n \n \n
\n","import {\n Component,\n HostBinding,\n Injector,\n OnInit,\n} from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { BoardService } from 'core-app/features/boards/board/board.service';\nimport { Board } from 'core-app/features/boards/board/board';\nimport { map } from 'rxjs/operators';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { MainMenuNavigationService } from 'core-app/core/main-menu/main-menu-navigation.service';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { IOpSidemenuItem } from 'core-app/shared/components/sidemenu/sidemenu.component';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\n\nexport const boardsMenuSelector = 'boards-menu';\n\n@Component({\n selector: boardsMenuSelector,\n templateUrl: './boards-menu.component.html',\n})\n\nexport class BoardsMenuComponent extends UntilDestroyedMixin implements OnInit {\n @HostBinding('class.op-sidebar') className = true;\n\n boardOptions$:Observable = this\n .apiV3Service\n .boards\n .observeAll()\n .pipe(\n map((boards:Board[]) => {\n const menuItems:IOpSidemenuItem[] = boards.map((board) => ({\n title: board.name,\n uiSref: 'boards.partitioned.show',\n uiParams: {\n board_id: board.id,\n query_props: '',\n projects: 'projects',\n projectPath: this.currentProject.identifier,\n },\n uiOptions: { reload: true },\n }));\n\n return menuItems.sort((a, b) => a.title.localeCompare(b.title));\n }),\n );\n\n canCreateBoards$ = this\n .currentUserService\n .hasCapabilities$(\n 'boards/create',\n this.currentProject.id || null,\n )\n .pipe(this.untilDestroyed());\n\n text = {\n board: this.I18n.t('js.label_board'),\n create_new_board: this.I18n.t('js.boards.create_new'),\n };\n\n constructor(\n readonly boardService:BoardService,\n readonly apiV3Service:ApiV3Service,\n readonly currentProject:CurrentProjectService,\n readonly mainMenuService:MainMenuNavigationService,\n readonly currentUserService:CurrentUserService,\n readonly I18n:I18nService,\n readonly pathHelper:PathHelperService\n ) {\n super();\n }\n\n ngOnInit():void {\n // When activating the boards submenu,\n // either initially or through click on the toggle, load the results\n this.mainMenuService\n .onActivate('boards')\n .subscribe(() => {\n this.focusBackArrow();\n void this.boardService.loadAllBoards();\n });\n }\n\n redirectToNewBoardForm():void {\n window.location.href = this.pathHelper.newBoardsPath(this.currentProject.identifier);\n }\n\n private focusBackArrow():void {\n const buttonArrowLeft = jQuery('*[data-name=\"boards\"] .main-menu--arrow-left-to-project');\n buttonArrowLeft.focus();\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';\nimport * as moment from 'moment-timezone';\n\n@Injectable()\nexport class OpCalendarService extends UntilDestroyedMixin {\n resize$ = new Subject();\n\n resizeObs:ResizeObserver;\n\n constructor(\n readonly weekdayService:WeekdayService,\n readonly dayService:DayResourceService,\n ) {\n super();\n }\n\n resizeObserver(v:ElementRef|undefined):void {\n if (!v) {\n return;\n }\n\n if (!this.resizeObs) {\n this.resizeObs = new ResizeObserver(() => this.resize$.next());\n }\n\n this.resizeObs.observe(v.nativeElement);\n }\n\n applyNonWorkingDay({ date }:{ date?:Date }, nonWorkingDays:IDay[]):string[] {\n const utcDate = moment(date).utc();\n const formatted = utcDate.format('YYYY-MM-DD');\n if (date && (this.weekdayService.isNonWorkingDay(utcDate) || nonWorkingDays.find((el) => el.date === formatted))) {\n return ['fc-non-working-day'];\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 {\n firstValueFrom,\n Observable,\n} 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 firstValueFrom(this.dayService.requireNonWorkingYear$(date));\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 firstValueFrom(this.apiV3Service.queries.find({ pageSize: 0 }, queryId));\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-tablet',\n inputs: {\n hideTableOptions: true,\n showCalendarSharingOption: 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 { ReactiveFormsModule } from '@angular/forms';\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';\nimport { QueryGetIcalUrlModalComponent } from 'core-app/shared/components/modals/get-ical-url-modal/query-get-ical-url.modal';\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 // Angular reactive forms, required for QueryGetIcalUrlModalComponent\n ReactiveFormsModule,\n ],\n declarations: [\n // Work package calendars\n WorkPackagesCalendarPageComponent,\n WorkPackagesCalendarComponent,\n TimeEntryCalendarComponent,\n CalendarSidemenuComponent,\n QueryGetIcalUrlModalComponent,\n ],\n exports: [\n WorkPackagesCalendarComponent,\n TimeEntryCalendarComponent,\n ],\n})\nexport class OpenprojectCalendarModule {\n}\n","\n\n\n\n
\n \n \n \n \n
\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n Input,\n} from '@angular/core';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\n\nexport const opCalendarSidemenuSelector = 'op-calendar-sidemenu';\n\n@Component({\n selector: opCalendarSidemenuSelector,\n templateUrl: './calendar-sidemenu.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CalendarSidemenuComponent extends UntilDestroyedMixin {\n @HostBinding('class.op-sidebar') className = true;\n\n @Input() menuItems:string[] = [];\n\n @Input() projectId:string|undefined;\n\n canCreateCalendar$ = this\n .currentUserService\n .hasCapabilities$(\n 'calendars/create',\n this.currentProjectService.id || null,\n )\n .pipe(this.untilDestroyed());\n\n text = {\n calendar: this.I18n.t('js.calendar.title'),\n create_new_calendar: this.I18n.t('js.calendar.create_new'),\n };\n\n createButton = {\n title: this.text.calendar,\n uiSref: 'calendar.page.show',\n uiParams: {\n query_id: null,\n query_props: '',\n },\n };\n\n constructor(\n readonly elementRef:ElementRef,\n readonly currentUserService:CurrentUserService,\n readonly currentProjectService:CurrentProjectService,\n readonly I18n:I18nService,\n ) {\n super();\n\n populateInputsFromDataset(this);\n }\n}\n","\n\n \n \n \n \n \n \n \n\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Injector,\n Input,\n Output,\n SecurityContext,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FullCalendarComponent } from '@fullcalendar/angular';\nimport { States } from 'core-app/core/states/states.service';\nimport * as moment from 'moment';\nimport { Moment } from 'moment';\nimport { StateService } from '@uirouter/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport timeGrid from '@fullcalendar/timegrid';\nimport {\n CalendarOptions,\n DayCellContentArg,\n DayCellMountArg,\n DayHeaderContentArg,\n Duration,\n EventApi,\n EventInput,\n EventSourceFuncArg,\n SlotLabelContentArg,\n SlotLaneContentArg,\n} from '@fullcalendar/core';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport interactionPlugin from '@fullcalendar/interaction';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { TimeEntryEditService } from 'core-app/shared/components/time_entries/edit/edit.service';\nimport { TimeEntryCreateService } from 'core-app/shared/components/time_entries/create/create.service';\nimport { ColorsService } from 'core-app/shared/components/colors/colors.service';\nimport { BrowserDetector } from 'core-app/core/browser/browser-detector.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { FilterOperator } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { OpCalendarService } from 'core-app/features/calendar/op-calendar.service';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { VerboseFormattingArg } from '@fullcalendar/common';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Subject, firstValueFrom } from 'rxjs';\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\ninterface TimeEntrySchema extends SchemaResource {\n activity:IFieldSchema;\n workPackage:IFieldSchema;\n project:IFieldSchema;\n hours:IFieldSchema;\n user:IFieldSchema;\n comment:IFieldSchema;\n}\n\ninterface CalendarViewEvent {\n el:HTMLElement;\n event:EventApi;\n}\n\ninterface CalendarMoveEvent {\n el:HTMLElement;\n event:EventApi;\n oldEvent:EventApi;\n delta:Duration;\n revert:() => void;\n}\ninterface CalendarOptionsWithDayGrid extends CalendarOptions {\n dayGridClassNames:(data:DayCellMountArg) => void;\n}\n// An array of all the days that are displayed. The zero index represents Monday.\nexport type DisplayedDays = [boolean, boolean, boolean, boolean, boolean, boolean, boolean];\n\nconst TIME_ENTRY_CLASS_NAME = 'te-calendar--time-entry';\nconst DAY_SUM_CLASS_NAME = 'te-calendar--day-sum';\nconst ADD_ENTRY_CLASS_NAME = 'te-calendar--add-entry';\nconst ADD_ICON_CLASS_NAME = 'te-calendar--add-icon';\nconst ADD_ENTRY_PROHIBITED_CLASS_NAME = '-prohibited';\n\n@Component({\n templateUrl: './te-calendar.template.html',\n styleUrls: ['./te-calendar.component.sass'],\n selector: 'op-time-entries-calendar',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n OpCalendarService,\n TimeEntryEditService,\n TimeEntryCreateService,\n HalResourceEditingService,\n ],\n})\nexport class TimeEntryCalendarComponent {\n @ViewChild(FullCalendarComponent) ucCalendar:FullCalendarComponent;\n\n @Input() projectIdentifier:string;\n\n @Input() static = false;\n\n @Input() set displayedDays(days:DisplayedDays) {\n this.initializeCalendar(days);\n }\n\n @Output() entries = new EventEmitter>();\n\n // Not used by the calendar but rather is the maximum/minimum of the graph.\n public minHour = 1;\n\n public maxHour = 12;\n\n public labelIntervalHours = 2;\n\n public scaleRatio = 1;\n\n protected memoizedTimeEntries:{ start:Moment, end:Moment, entries:Promise> };\n\n public memoizedCreateAllowed = false;\n\n public text = {\n logTime: this.i18n.t('js.button_log_time'),\n today: this.i18n.t('js.team_planner.today'),\n };\n\n calendarOptions$ = new Subject();\n\n public nonWorkingDays:IDay[] = [];\n\n public additionalOptions:CalendarOptionsWithDayGrid = {\n editable: false,\n locale: this.i18n.locale,\n fixedWeekCount: false,\n headerToolbar: {\n right: '',\n center: 'title',\n left: 'prev,next today',\n },\n buttonText: { today: this.text.today },\n initialView: 'timeGridWeek',\n firstDay: this.configuration.startOfWeek(),\n timeZone: this.configuration.isTimezoneSet() ? this.configuration.timezone() : 'local',\n hiddenDays: [],\n // This is a magic number that is derived by trial and error\n contentHeight: 550,\n slotEventOverlap: false,\n slotLabelInterval: `${this.labelIntervalHours}:00:00`,\n slotLabelFormat: (info:VerboseFormattingArg) => ((this.maxHour - info.date.hour) / this.scaleRatio).toString(),\n allDaySlot: false,\n displayEventTime: false,\n slotMinTime: `${this.minHour - 1}:00:00`,\n slotMaxTime: `${this.maxHour}:00:00`,\n events: this.calendarEventsFunction.bind(this),\n eventOverlap: (stillEvent:EventApi) => !stillEvent.classNames.includes(TIME_ENTRY_CLASS_NAME),\n plugins: [timeGrid, interactionPlugin],\n eventDidMount: this.alterEventEntry.bind(this),\n eventWillUnmount: this.beforeEventRemove.bind(this),\n eventClick: this.dispatchEventClick.bind(this),\n eventDrop: this.moveEvent.bind(this),\n dayHeaderClassNames: (data:DayHeaderContentArg) => this.calendar.applyNonWorkingDay(data, this.nonWorkingDays),\n dayCellClassNames: (data:DayCellContentArg) => this.calendar.applyNonWorkingDay(data, this.nonWorkingDays),\n dayGridClassNames: (data:DayCellContentArg) => this.calendar.applyNonWorkingDay(data, this.nonWorkingDays),\n slotLaneClassNames: (data:SlotLaneContentArg) => this.calendar.applyNonWorkingDay(data, this.nonWorkingDays),\n slotLabelClassNames: (data:SlotLabelContentArg) => this.calendar.applyNonWorkingDay(data, this.nonWorkingDays),\n };\n\n private initializeCalendar(displayedDayss:DisplayedDays) {\n void this.weekdayService.loadWeekdays()\n .toPromise()\n .then(async () => {\n const date = moment(new Date()).toString();\n await this.requireNonWorkingDays(date);\n this.additionalOptions.hiddenDays = this.setHiddenDays(displayedDayss);\n this.calendarOptions$.next(\n this.additionalOptions,\n );\n });\n }\n\n constructor(\n readonly states:States,\n readonly apiV3Service:ApiV3Service,\n readonly $state:StateService,\n private element:ElementRef,\n readonly i18n:I18nService,\n readonly injector:Injector,\n readonly notifications:HalResourceNotificationService,\n private sanitizer:DomSanitizer,\n private configuration:ConfigurationService,\n private timezone:TimezoneService,\n private timeEntryEdit:TimeEntryEditService,\n private timeEntryCreate:TimeEntryCreateService,\n private schemaCache:SchemaCacheService,\n private colors:ColorsService,\n private browserDetector:BrowserDetector,\n private calendar:OpCalendarService,\n readonly weekdayService:WeekdayService,\n readonly dayService:DayResourceService,\n ) {}\n\n async requireNonWorkingDays(date:Date|string) {\n this.nonWorkingDays = await firstValueFrom(this.dayService.requireNonWorkingYear$(date));\n }\n\n public calendarEventsFunction(\n fetchInfo:EventSourceFuncArg,\n successCallback:(events:EventInput[]) => void,\n failureCallback:(error:Error) => void,\n ):void|PromiseLike {\n const start = moment(fetchInfo.startStr);\n const end = moment(fetchInfo.endStr);\n void this.fetchTimeEntries(start, end)\n .then(async (collection) => {\n this.entries.emit(collection);\n\n successCallback(await this.buildEntries(collection.elements, fetchInfo));\n })\n .catch(failureCallback);\n }\n\n protected fetchTimeEntries(start:Moment, end:Moment):Promise> {\n if (!this.memoizedTimeEntries\n || this.memoizedTimeEntries.start.valueOf() !== start.valueOf()\n || this.memoizedTimeEntries.end.valueOf() !== end.valueOf()) {\n const promise = firstValueFrom(\n this\n .apiV3Service\n .time_entries\n .list({ filters: this.dmFilters(start, end), pageSize: 500 }),\n )\n .then((collection) => {\n this.memoizedCreateAllowed = !!collection.createTimeEntry;\n\n return collection;\n });\n\n this.memoizedTimeEntries = { start, end, entries: promise };\n }\n\n return this.memoizedTimeEntries.entries;\n }\n\n private async buildEntries(entries:TimeEntryResource[], fetchInfo:{ start:Date, end:Date }):Promise {\n this.setRatio(entries);\n await this.requireNonWorkingDays(fetchInfo.start);\n await this.requireNonWorkingDays(fetchInfo.end);\n return this.buildTimeEntryEntries(entries)\n .concat(this.buildAuxEntries(entries, fetchInfo));\n }\n\n private setRatio(entries:TimeEntryResource[]):void {\n const dateSums = this.calculateDateSums(entries);\n\n const maxHours = Math.max(...Object.values(dateSums), 0);\n\n const oldRatio = this.scaleRatio;\n\n if (maxHours > this.maxHour - this.minHour) {\n this.scaleRatio = this.smallerSuitableRatio((this.maxHour - this.minHour) / maxHours);\n } else {\n this.scaleRatio = 1;\n }\n\n if (oldRatio !== this.scaleRatio) {\n // This is a hack.\n // We already set the same function (different object) via angular.\n // But it will trigger repainting the calendar.\n // Weirdly, this.ucCalendar.getApi().rerender() does not.\n this.ucCalendar.getApi().setOption('slotLabelFormat', (info:VerboseFormattingArg) => {\n const val = (this.maxHour - info.date.hour) / this.scaleRatio;\n return val.toString();\n });\n }\n }\n\n private buildTimeEntryEntries(entries:TimeEntryResource[]):EventInput[] {\n const hoursDistribution:{ [key:string]:Moment } = {};\n\n return entries.map((entry) => {\n let start:Moment;\n let end:Moment;\n const hours = this.timezone.toHours(entry.hours) * this.scaleRatio;\n const spentOn = entry.spentOn as string;\n\n if (hoursDistribution[spentOn]) {\n start = hoursDistribution[spentOn].clone().subtract(hours, 'h');\n end = hoursDistribution[spentOn].clone();\n } else {\n start = moment(spentOn).add(this.maxHour - hours, 'h');\n end = moment(spentOn).add(this.maxHour, 'h');\n }\n\n hoursDistribution[spentOn] = start;\n\n return this.timeEntry(entry, hours, start, end);\n });\n }\n\n private buildAuxEntries(entries:TimeEntryResource[], fetchInfo:{ start:Date, end:Date }):EventInput[] {\n const dateSums = this.calculateDateSums(entries);\n\n const calendarEntries:EventInput[] = [];\n\n for (let m = moment(this.timezone.formattedISODate(fetchInfo.start)); m.diff(fetchInfo.end, 'days') <= 0; m.add(1, 'days')) {\n const duration = dateSums[m.format('YYYY-MM-DD')] || 0;\n\n calendarEntries.push(this.sumEntry(m, duration));\n\n if (this.memoizedCreateAllowed) {\n calendarEntries.push(this.addEntry(m, duration));\n }\n }\n\n return calendarEntries;\n }\n\n private calculateDateSums(entries:TimeEntryResource[]):{ [p:string]:number } {\n const dateSums:{ [key:string]:number } = {};\n\n entries.forEach((entry) => {\n const hours = this.timezone.toHours(entry.hours);\n const spentOn = entry.spentOn as string;\n\n if (dateSums[spentOn]) {\n dateSums[spentOn] += hours;\n } else {\n dateSums[spentOn] = hours;\n }\n });\n\n return dateSums;\n }\n\n protected timeEntry(entry:TimeEntryResource, hours:number, start:Moment, end:Moment):EventInput {\n const color = this.colors.toHsl(this.entryName(entry));\n\n const classNames = [TIME_ENTRY_CLASS_NAME];\n\n const span = end.diff(start, 'm');\n\n if (span < 40) {\n classNames.push('-no-fadeout');\n }\n\n return {\n title: span < 20 ? '' : this.entryName(entry),\n startEditable: !!entry.update,\n start: start.format(),\n end: end.format(),\n backgroundColor: color,\n borderColor: color,\n classNames,\n entry,\n };\n }\n\n protected sumEntry(date:Moment, duration:number):EventInput {\n return {\n start: date.clone().add(this.maxHour - Math.min(duration * this.scaleRatio, this.maxHour - 0.5) - 0.5, 'h').format(),\n end: date.clone().add(this.maxHour - Math.min(((duration + 0.05) * this.scaleRatio), this.maxHour - 0.5), 'h').format(),\n classNames: DAY_SUM_CLASS_NAME,\n rendering: 'background' as const,\n startEditable: false,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n sum: this.i18n.t('js.units.hour', { count: duration }),\n };\n }\n\n protected addEntry(date:Moment, duration:number):EventInput {\n const classNames = [ADD_ENTRY_CLASS_NAME];\n\n if (duration >= 24) {\n classNames.push(ADD_ENTRY_PROHIBITED_CLASS_NAME);\n }\n\n return {\n start: date.clone().format(),\n end: date.clone().add(this.maxHour - Math.min(duration * this.scaleRatio, this.maxHour - 1) - 0.5, 'h').format(),\n rendering: 'background' as const,\n classNames,\n };\n }\n\n protected dmFilters(start:Moment, end:Moment):Array<[string, FilterOperator, string[]]> {\n const startDate = start.format('YYYY-MM-DD');\n const endDate = end.subtract(1, 'd').format('YYYY-MM-DD');\n return [['spentOn', '<>d', [startDate, endDate]] as [string, FilterOperator, string[]],\n ['user_id', '=', ['me']] as [string, FilterOperator, [string]]];\n }\n\n private dispatchEventClick(event:CalendarViewEvent):void {\n if (event.event.extendedProps.entry) {\n this.editEvent(event.event.extendedProps.entry);\n } else if (event.el.classList.contains(ADD_ENTRY_CLASS_NAME) && !event.el.classList.contains(ADD_ENTRY_PROHIBITED_CLASS_NAME)) {\n this.addEvent(moment(event.event.startStr));\n }\n }\n\n private editEvent(entry:TimeEntryResource):void {\n this\n .timeEntryEdit\n .edit(entry, { showUserField: false })\n .then((modificationAction) => {\n this.updateEventSet(modificationAction.entry, modificationAction.action);\n })\n .catch(() => {\n // do nothing, the user closed without changes\n });\n }\n\n private moveEvent(event:CalendarMoveEvent):void {\n const entry = event.event.extendedProps.entry as TimeEntryResource;\n\n // Use end instead of start as when dragging, the event might be too long and would thus be start\n // on the day before by fullcalendar.\n entry.spentOn = moment(event.event.endStr).format('YYYY-MM-DD');\n\n void this\n .schemaCache\n .ensureLoaded(entry)\n .then((schema) => {\n this\n .apiV3Service\n .time_entries\n .id(entry)\n .patch(entry, schema)\n .subscribe(\n (updated) => this.updateEventSet(updated, 'update'),\n (e) => {\n this.notifications.handleRawError(e);\n event.revert();\n },\n );\n });\n }\n\n public addEventToday():void {\n this.addEvent(moment(new Date()));\n }\n\n private addEvent(date:Moment):void {\n if (!this.memoizedCreateAllowed) {\n return;\n }\n\n this\n .timeEntryCreate\n .create(date, undefined, { showUserField: false })\n .then((modificationAction) => {\n this.updateEventSet(modificationAction.entry, modificationAction.action);\n })\n .catch(() => {\n // do nothing, the user closed without changes\n });\n }\n\n private updateEventSet(event:TimeEntryResource, action:'update'|'destroy'|'create'|'unchanged'):void {\n void this.memoizedTimeEntries.entries.then((collection) => {\n const foundIndex = collection.elements.findIndex((x) => x.id === event.id);\n\n switch (action) {\n case 'update':\n case 'unchanged':\n collection.elements[foundIndex] = event;\n break;\n case 'destroy':\n collection.elements.splice(foundIndex, 1);\n break;\n case 'create':\n void this\n .apiV3Service\n .time_entries\n .cache\n .updateFor(event);\n\n collection.elements.push(event);\n break;\n default:\n throw new Error('Invalid action');\n }\n\n this.ucCalendar.getApi().refetchEvents();\n });\n }\n\n private alterEventEntry(event:CalendarViewEvent):void {\n this.appendAddIcon(event);\n this.appendSum(event);\n\n if (!event.event.extendedProps.entry) {\n return;\n }\n\n void this.addTooltip(event);\n this.prependDuration(event);\n this.appendFadeout(event);\n }\n\n private appendAddIcon(event:CalendarViewEvent):void {\n if (!event.el.classList.contains(ADD_ENTRY_CLASS_NAME)) {\n return;\n }\n\n const addIcon = document.createElement('div');\n addIcon.classList.add(ADD_ICON_CLASS_NAME);\n addIcon.innerText = '+';\n event.el.append(addIcon);\n }\n\n private appendSum(event:CalendarViewEvent):void {\n if (event.event.extendedProps.sum) {\n event.el.innerHTML = event.event.extendedProps.sum as string;\n }\n }\n\n private async addTooltip(event:CalendarViewEvent):Promise {\n if (this.browserDetector.isMobile) {\n return;\n }\n\n const { entry } = event.event.extendedProps;\n\n const schema = await this.schemaCache.ensureLoaded(entry as TimeEntryResource) as TimeEntrySchema;\n\n jQuery(event.el).tooltip({\n content: this.tooltipContentString(event.event.extendedProps.entry, schema),\n items: '.fc-event',\n close() {\n jQuery('.ui-helper-hidden-accessible').remove();\n },\n track: true,\n });\n }\n\n private removeTooltip(event:CalendarViewEvent):void {\n const target = jQuery(event.el);\n\n if (target.tooltip('instance')) {\n jQuery(event.el).tooltip('disable');\n }\n }\n\n private prependDuration(event:CalendarViewEvent):void {\n const timeEntry = event.event.extendedProps.entry as TimeEntryResource;\n\n if (this.timezone.toHours(timeEntry.hours) < 0.5) {\n return;\n }\n\n const formattedDuration = this.timezone.formattedDuration(timeEntry.hours);\n\n jQuery(event.el)\n .find('.fc-event-title')\n .prepend(`
${formattedDuration}
`);\n }\n\n /* Fade out event text to the bottom to avoid it being cut of weirdly.\n * Multiline ellipsis with an unknown height is not possible, hence we blur the text.\n * The gradient needs to take the background color of the element into account (hashed over the event\n * title) which is why the style is set in code.\n *\n * We do not print anything on short entries (< 0.5 hours),\n * which leads to the fc-short class not being applied by full calendar. For other short events, the css rules\n * need to deactivate the fc-fadeout.\n */\n private appendFadeout(event:CalendarViewEvent):void {\n const timeEntry = event.event.extendedProps.entry as TimeEntryResource;\n\n if (this.timezone.toHours(timeEntry.hours) < 0.5) {\n return;\n }\n\n const $element = jQuery(event.el);\n const fadeout = jQuery('
');\n\n const hslaStart = this.colors.toHsla(this.entryName(timeEntry), 0);\n const hslaEnd = this.colors.toHsla(this.entryName(timeEntry), 100);\n\n fadeout.css('background', `-webkit-linear-gradient(${hslaStart} 0%, ${hslaEnd} 100%`);\n\n ['-moz-linear-gradient', '-o-linear-gradient', 'linear-gradient', '-ms-linear-gradient'].forEach(((style) => {\n fadeout.css('background-image', `${style}(${hslaStart} 0%, ${hslaEnd} 100%`);\n }));\n\n $element\n .append(fadeout);\n }\n\n private beforeEventRemove(event:CalendarViewEvent):void {\n if (!event.event.extendedProps.entry) {\n return;\n }\n\n this.removeTooltip(event);\n }\n\n private entryName(entry:TimeEntryResource):string {\n let { name } = entry.project;\n if (entry.workPackage) {\n name += ` - ${this.workPackageName(entry)}`;\n }\n\n return name || '-';\n }\n\n private workPackageName(entry:TimeEntryResource):string {\n const workPackage = entry.workPackage as WorkPackageResource;\n return `#${idFromLink(workPackage.href)}: ${workPackage.name}`;\n }\n\n private tooltipContentString(entry:TimeEntryResource, schema:TimeEntrySchema):string {\n return `\n
    \n
  • \n ${schema.project.name}:\n ${this.sanitizedValue(entry.project.name)}\n
  • \n
  • \n ${schema.workPackage.name}:\n ${entry.workPackage ? this.sanitizedValue(this.workPackageName(entry)) : this.i18n.t('js.placeholders.default')}\n
  • \n
  • \n ${schema.activity.name}:\n ${this.sanitizedValue(entry.activity.name)}\n
  • \n
  • \n ${schema.hours.name}:\n ${this.timezone.formattedDuration(entry.hours)}\n
  • \n
  • \n ${schema.comment.name}:\n ${entry.comment.raw || this.i18n.t('js.placeholders.default')}\n
  • \n `;\n }\n\n private sanitizedValue(value:string):string {\n return this.sanitizer.sanitize(SecurityContext.HTML, value) || '';\n }\n\n protected formatNumber(value:number):string {\n return this.i18n.toNumber(value, { precision: 2 });\n }\n\n private smallerSuitableRatio(value:number):number {\n for (let divisor = this.labelIntervalHours + 1; divisor < 100; divisor++) {\n const candidate = this.labelIntervalHours / divisor;\n\n if (value >= candidate) {\n return candidate;\n }\n }\n\n return 1;\n }\n\n protected setHiddenDays(displayedDays:DisplayedDays) {\n return Array\n .from(displayedDays, (value, index) => {\n if (!value) {\n return (index + 1) % 7;\n }\n return null;\n })\n .filter((value) => value !== null) as number[];\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, ElementRef, Input, OnInit, ViewChild } 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 {\n WorkPackageViewFiltersService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.service';\nimport { StateService } from '@uirouter/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport interactionPlugin, { EventDragStartArg, EventDragStopArg, EventResizeDoneArg } from '@fullcalendar/interaction';\nimport {\n HalResourceEditingService,\n} from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { splitViewRoute } from 'core-app/features/work-packages/routing/split-view-routes.helper';\nimport {\n CalendarViewEvent,\n OpWorkPackagesCalendarService,\n} from 'core-app/features/calendar/op-work-packages-calendar.service';\nimport { OpCalendarService } from 'core-app/features/calendar/op-calendar.service';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\nimport { DayResourceService } from 'core-app/core/state/days/day.service';\nimport { EffectCallback, registerEffectCallbacks } 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@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 registerEffectCallbacks(this, this.untilDestroyed());\n\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 this.weekdayService.loadWeekdays()\n .toPromise()\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 this.reloadOnRefreshRequest();\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","
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \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","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

    {{ 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 {\n HTTPClientHeaders,\n HTTPSupportedMethods,\n} from 'core-app/features/hal/http/http.interfaces';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { firstValueFrom } from 'rxjs';\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:object, headers:HTTPClientHeaders) => firstValueFrom(halResourceService.request(method, href, data, headers)),\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\nexport const WikiPageResource = Attachable(WikiPageBaseResource);\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 '@openproject/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 ongoing:boolean;\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 '@openproject/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';\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 { 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';\nimport { SchemaAttributeObject } from 'core-app/features/hal/resources/schema-attribute-object';\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';\nexport const v3ErrorIdentifierOutboundRequestForbidden = 'urn:openproject-org:api:v3:errors:OutboundRequest:Forbidden';\nexport const v3ErrorIdentifierMissingEnterpriseToken = 'urn:openproject-org:api:v3:errors:MissingEnterpriseToken';\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 '@openproject/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 { 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';\nimport { HalLink } from 'core-app/features/hal/hal-link/hal-link';\n\n// eslint-disable-next-line\ntype Constructor = new (...args:any[]) => T;\n\nexport function Attachable>(Base:TBase) {\n return class extends Base {\n public attachments:AttachmentCollectionResource;\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 as HalResource).$links as unknown&{ addAttachment?:HalLink }).addAttachment || isNewResource(this);\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 = this.attachments.elements.find((res:HalResource) => res.name === file);\n return !match ? null : (match.staticDownloadLocation as HalLink)?.href;\n }\n\n public $initialize(source:unknown) {\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 timestamps:string[];\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 icalUrl(payload:unknown):Promise<{ icalUrl:{ href:string } }>;\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 '@openproject/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():string[] {\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 '@openproject/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 '@openproject/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 '@openproject/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 { 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';\nimport { IWorkPackageTimestamp } from 'core-app/features/hal/resources/work-package-timestamp-resource';\n\nexport interface WorkPackageResourceEmbedded {\n activities:CollectionResource;\n assignee:HalResource|any;\n attachments:AttachmentCollectionResource;\n fileLinks?:CollectionResource;\n author:HalResource|any;\n availableWatchers:HalResource|any;\n category:HalResource|any;\n // eslint-disable-next-line no-use-before-define\n children:WorkPackageResource[];\n // eslint-disable-next-line no-use-before-define\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 startTimer():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 // eslint-disable-next-line no-use-before-define\n private ancestors?:this[];\n\n public attributesByTimestamp?:IWorkPackageTimestamp[];\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 readonly attachmentsBackend = true;\n\n /**\n * Returns the list of ancestors, if any\n */\n public getAncestors():this[] {\n return this.ancestors || [];\n }\n\n /**\n * Return the ids of all its ancestors, if any\n */\n public get ancestorIds():string[] {\n return this.getAncestors().map((el:HalResource) => (el.id as string|number).toString());\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 mappedName(property:string):string;\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.t(i18nString, { default: '[not found]' }) === '[not found]') {\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { DomSanitizer } from '@angular/platform-browser';\nimport { BcfRestApi } from 'core-app/features/bim/bcf/bcf-constants.const';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { imagePath } from 'core-app/shared/helpers/images/path-helper';\n\nexport const homescreenNewFeaturesBlockSelector = 'homescreen-new-features-block';\n\n// The key used in the I18n files to distinguish between versions.\nconst OpVersionI18n = '13_1';\n\n/** Update the teaser image to the next version */\nconst featureTeaserImage = '13_1_features.svg';\n\n@Component({\n template: `\n
    \n

    \n {{ text.descriptionNewFeatures }}\n

    \n
    \n

    \n \n
    \n\n {{ text.learnAbout }}\n
    \n `,\n selector: homescreenNewFeaturesBlockSelector,\n styleUrls: ['./new-features.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n\n/**\n * Component for the homescreen block to promote new features.\n * When updating this for the next release, be sure to cleanup stuff is not needed any more:\n * Locals (js-en.yml), Styles (new-features.component.sass), HTML (above), TS (below)\n */\nexport class HomescreenNewFeaturesBlockComponent {\n public isStandardEdition:boolean;\n\n /** Set to true if BIM has it's own changes */\n hasBimChanges = false;\n\n /** Update the feature image appropriately */\n new_features_image = imagePath(featureTeaserImage);\n\n public text = {\n newFeatures: this.i18n.t('js.label_new_features'),\n descriptionNewFeatures: this.i18n.t('js.homescreen.blocks.new_features.text_new_features'),\n learnAbout: this.i18n.t('js.homescreen.blocks.new_features.learn_about'),\n };\n\n constructor(\n readonly i18n:I18nService,\n readonly domSanitizer:DomSanitizer,\n ) {\n this.isStandardEdition = window.OpenProject.isStandardEdition;\n }\n\n public get teaserWebsiteUrl() {\n const url = this.translated('learn_about_link');\n return this.domSanitizer.bypassSecurityTrustResourceUrl(url);\n }\n\n public get currentNewFeatureHtml():string {\n return this.translated('new_features_html');\n }\n\n private get translatedEdition():string {\n if (this.hasBimChanges && !this.isStandardEdition) {\n return 'bim';\n }\n\n return 'standard';\n }\n\n private translated(key:string):string {\n return this.i18n.t(\n `js.homescreen.blocks.new_features.${OpVersionI18n}.${this.translatedEdition}.${key}`,\n { list_styling_class: 'widget-box--arrow-links', bcf_api_link: BcfRestApi },\n );\n }\n}\n","export const BcfRestApi = 'https://github.com/opf/openproject/blob/dev/docs/api/bcf/bcf-rest-api.md';\n","\n \n \n \n \n\n","import { ChangeDetectionStrategy, Component, ElementRef, Input, OnInit } from '@angular/core';\nimport { combineLatest, merge, Observable, timer } from 'rxjs';\nimport { filter, map, shareReplay, switchMap, throttleTime } from 'rxjs/operators';\nimport { ActiveWindowService } from 'core-app/core/active-window/active-window.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { IanBellService } from 'core-app/features/in-app-notifications/bell/state/ian-bell.service';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\n\nexport const opInAppNotificationBellSelector = 'op-in-app-notification-bell';\n\n@Component({\n selector: opInAppNotificationBellSelector,\n templateUrl: './in-app-notification-bell.component.html',\n styleUrls: ['./in-app-notification-bell.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class InAppNotificationBellComponent implements OnInit {\n @Input() interval = 50000;\n\n polling$:Observable;\n\n unreadCount$:Observable;\n\n unreadCountText$:Observable;\n\n constructor(\n readonly elementRef:ElementRef,\n readonly storeService:IanBellService,\n readonly apiV3Service:ApiV3Service,\n readonly activeWindow:ActiveWindowService,\n readonly pathHelper:PathHelperService,\n ) {\n populateInputsFromDataset(this);\n }\n\n ngOnInit() {\n this.polling$ = merge(\n timer(10, this.interval).pipe(filter(() => this.activeWindow.isActive)),\n timer(10, this.interval * 10).pipe(filter(() => !this.activeWindow.isActive)),\n )\n .pipe(\n throttleTime(this.interval),\n switchMap(() => this.storeService.fetchUnread()),\n );\n\n this.unreadCount$ = combineLatest([\n this.storeService.unread$,\n this.polling$,\n ]).pipe(\n map(([count]) => count),\n shareReplay(1),\n );\n\n this.unreadCountText$ = this\n .unreadCount$\n .pipe(\n map((count) => {\n if (count > 99) {\n return '99+';\n }\n\n if (count <= 0) {\n return '';\n }\n\n return count;\n }),\n );\n }\n\n notificationsPath():string {\n return this.pathHelper.notificationsPath();\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 { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\n\nexport interface IanMenuGroupingData {\n value:string;\n count:number;\n projectHasParent?:boolean;\n _links:{\n valueLink:{\n href:string;\n }[];\n };\n}\n\nexport interface BaseMenuItemData {\n value:string;\n count:number;\n}\n\nexport interface IanMenuState {\n notificationsByProject:IanMenuGroupingData[],\n notificationsByReason:IanMenuGroupingData[],\n projectsFilter:ApiV3ListParameters,\n}\n\nexport const IAN_MENU_PROJECT_FILTERS:ApiV3ListParameters = {\n pageSize: 100,\n groupBy: 'project',\n filters: [['read_ian', '=', false]],\n};\n\nexport const IAN_MENU_REASON_FILTERS:ApiV3ListParameters = {\n pageSize: 100,\n groupBy: 'reason',\n filters: [['read_ian', '=', false]],\n};\n\nexport function createInitialState():IanMenuState {\n return {\n notificationsByProject: [],\n notificationsByReason: [],\n projectsFilter: {},\n };\n}\n\n@StoreConfig({ name: 'ian-menu' })\nexport class IanMenuStore extends Store {\n constructor() {\n super(createInitialState());\n }\n}\n","import {\n Injectable,\n Injector,\n} from '@angular/core';\nimport {\n notificationCountIncreased,\n notificationsMarkedRead,\n} from 'core-app/core/state/in-app-notifications/in-app-notifications.actions';\nimport {\n EffectCallback,\n EffectHandler,\n} from 'core-app/core/state/effects/effect-handler.decorator';\nimport { ActionsService } from 'core-app/core/state/actions/actions.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { InAppNotificationsResourceService } from 'core-app/core/state/in-app-notifications/in-app-notifications.service';\nimport { ProjectsResourceService } from 'core-app/core/state/projects/projects.service';\nimport {\n IAN_MENU_PROJECT_FILTERS,\n IAN_MENU_REASON_FILTERS,\n IanMenuStore,\n} from './ian-menu.store';\nimport { Query } from '@datorama/akita';\nimport {\n map,\n switchMap,\n} from 'rxjs/operators';\nimport { combineLatest } from 'rxjs';\n\n@Injectable()\n@EffectHandler\nexport class IanMenuService {\n readonly id = 'ian-center';\n\n readonly store = new IanMenuStore();\n\n readonly query = new Query(this.store);\n\n projectsFilter$ = this.query.select('projectsFilter');\n\n projectsForNotifications$ = this\n .projectsFilter$\n .pipe(\n switchMap((filterParams) => this.projectsResourceService.collection(filterParams)),\n );\n\n notificationsByProject$ = combineLatest([\n this.query.select('notificationsByProject'),\n this.projectsForNotifications$,\n ]).pipe(\n map(([notifications, projects]) => notifications.map((notification) => {\n const project = projects.find((p) => p.id.toString() === idFromLink(notification._links.valueLink[0].href));\n return {\n ...notification,\n projectHasParent: !!project?._links.parent.href,\n };\n })),\n );\n\n notificationsByReason$ = this.query.select('notificationsByReason');\n\n constructor(\n readonly injector:Injector,\n readonly ianResourceService:InAppNotificationsResourceService,\n readonly projectsResourceService:ProjectsResourceService,\n readonly actions$:ActionsService,\n readonly apiV3Service:ApiV3Service,\n ) {\n }\n\n /**\n * Check for updates after bell count increased\n */\n @EffectCallback(notificationCountIncreased)\n private checkForNewNotifications() {\n this.reload();\n }\n\n /**\n * Reload after notifications were successfully marked as read\n */\n @EffectCallback(notificationsMarkedRead)\n private reloadOnNotificationRead() {\n return this.reload();\n }\n\n public reload():void {\n this.ianResourceService.fetchCollection(IAN_MENU_PROJECT_FILTERS)\n .subscribe((data) => {\n const projectsFilter:ApiV3ListParameters = {\n pageSize: 100,\n filters: [],\n };\n\n if (data.groups) {\n projectsFilter.filters = [['id', '=', data.groups.map((group) => idFromLink(group._links.valueLink[0].href))]];\n }\n\n this.store.update({\n notificationsByProject: data.groups,\n projectsFilter,\n });\n\n // Only request if there are any groups\n if (data.groups && data.groups.length > 0) {\n this.projectsResourceService.fetchCollection(projectsFilter).subscribe();\n }\n });\n this.ianResourceService.fetchCollection(IAN_MENU_REASON_FILTERS)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n .subscribe((data) => this.store.update({ notificationsByReason: data.groups }));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 OnInit,\n HostBinding,\n} from '@angular/core';\nimport { combineLatest } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { StateService } from '@uirouter/core';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { INotificationPageQueryParameters } from '../../in-app-notifications.routes';\nimport { IanMenuService } from './state/ian-menu.service';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\n\nexport const ianMenuSelector = 'op-ian-menu';\n\nconst getUiLinkForFilters = (filters:INotificationPageQueryParameters = {}) => ({\n uiSref: 'notifications.center.show',\n uiParams: filters,\n});\n\n@Component({\n selector: ianMenuSelector,\n templateUrl: './menu.component.html',\n styleUrls: ['./menu.component.sass'],\n providers: [IanMenuService],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IanMenuComponent implements OnInit {\n @HostBinding('class.op-ian-menu') className = true;\n\n baseMenuItems = [\n {\n key: 'inbox',\n title: this.I18n.t('js.notifications.menu.inbox'),\n icon: 'inbox',\n ...getUiLinkForFilters({ filter: '', name: '' }),\n },\n ];\n\n reasonMenuItems = [\n {\n key: 'mentioned',\n title: this.I18n.t('js.notifications.menu.mentioned'),\n icon: 'mention',\n ...getUiLinkForFilters({ filter: 'reason', name: 'mentioned' }),\n },\n {\n key: 'assigned',\n title: this.I18n.t('js.label_assignee'),\n icon: 'assigned',\n ...getUiLinkForFilters({ filter: 'reason', name: 'assigned' }),\n },\n {\n key: 'responsible',\n title: this.I18n.t('js.notifications.menu.accountable'),\n icon: 'accountable',\n ...getUiLinkForFilters({ filter: 'reason', name: 'responsible' }),\n },\n {\n key: 'watched',\n title: this.I18n.t('js.notifications.menu.watched'),\n icon: 'watching',\n ...getUiLinkForFilters({ filter: 'reason', name: 'watched' }),\n },\n {\n key: 'dateAlert',\n title: this.I18n.t('js.notifications.menu.date_alert'),\n icon: 'date-alert',\n isEnterprise: true,\n ...this.eeGuardedDateAlertRoute,\n },\n {\n key: 'shared',\n title: this.I18n.t('js.notifications.menu.shared'),\n icon: 'share',\n ...getUiLinkForFilters({ filter: 'reason', name: 'shared' }),\n },\n ];\n\n notificationsByProject$ = this.ianMenuService.notificationsByProject$.pipe(\n map((items) => items\n .map((item) => ({\n ...item,\n title: (item.projectHasParent ? '... ' : '') + item.value,\n ...getUiLinkForFilters({ filter: 'project', name: idFromLink(item._links.valueLink[0].href) }),\n }))\n .sort((a, b) => {\n if (b.projectHasParent && !a.projectHasParent) {\n return -1;\n }\n\n return a.value.toLowerCase().localeCompare(b.value.toLowerCase());\n })),\n );\n\n notificationsByReason$ = this.ianMenuService.notificationsByReason$.pipe(\n map((items) => this.reasonMenuItems.map((reason) => ({\n ...items.find((item) => item.value === reason.key),\n ...reason,\n }))),\n );\n\n menuItems$ = combineLatest([\n this.notificationsByProject$,\n this.notificationsByReason$,\n ]).pipe(\n map(([byProject, byReason]) => [\n ...this.baseMenuItems.map((baseMenuItem) => ({\n ...baseMenuItem,\n count: byProject.reduce((a, b) => a + (b.count || 0), 0),\n })),\n {\n title: this.I18n.t('js.notifications.menu.by_reason'),\n collapsible: true,\n children: byReason,\n },\n {\n title: this.I18n.t('js.notifications.menu.by_project'),\n collapsible: true,\n children: byProject,\n },\n ]),\n );\n\n text = {\n title: this.I18n.t('js.notifications.title'),\n button_close: this.I18n.t('js.button_close'),\n no_results: {\n unread: this.I18n.t('js.notifications.no_unread'),\n all: this.I18n.t('js.notice_no_results_to_display'),\n },\n };\n\n constructor(\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n readonly ianMenuService:IanMenuService,\n readonly state:StateService,\n readonly bannersService:BannersService,\n readonly configurationService:ConfigurationService,\n ) { }\n\n ngOnInit():void {\n this.ianMenuService.reload();\n }\n\n private get eeGuardedDateAlertRoute() {\n if (this.bannersService.eeShowBanners) {\n return { uiSref: 'notifications.date_alerts_upsale', uiParams: null, uiOptions: { inherit: false } };\n }\n\n return getUiLinkForFilters({ filter: 'reason', name: 'dateAlert' });\n }\n}\n","\n","import { Store, StoreConfig } from '@datorama/akita';\nimport { CollectionResponse } from 'core-app/core/state/resource-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/resource-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(workPackageId: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, tabIdentifier },\n );\n }\n\n openFullView(workPackageId:string|null):void {\n void this.state.go('work-packages.show', { workPackageId });\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&ngsp;\n\n","\n \n \n
    \n \n
    \n\n \n \n \n - -\n \n\n \n \n {{ item.key }}, \n \n \n\n \n\n
    \n \n \n \n \n
    \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n \n
    \n \n
    \n \n \n \n \n \n\n \n
    \n \n \n
    \n
    \n
    \n\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n OnInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Observable } from 'rxjs';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport {\n map,\n shareReplay,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { take } from 'rxjs/internal/operators/take';\nimport { StateService } from '@uirouter/angular';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { INotification } from 'core-app/core/state/in-app-notifications/in-app-notification.model';\nimport { IanCenterService } from 'core-app/features/in-app-notifications/center/state/ian-center.service';\nimport { DeviceService } from 'core-app/core/browser/device.service';\n\n@Component({\n selector: 'op-in-app-notification-entry',\n templateUrl: './in-app-notification-entry.component.html',\n styleUrls: ['./in-app-notification-entry.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class InAppNotificationEntryComponent implements OnInit {\n @HostBinding('class.op-ian-item') className = true;\n\n @Input() notification:INotification;\n\n @Input() aggregatedNotifications:INotification[];\n\n workPackage$:Observable|null = null;\n\n showDateAlert$:Observable = this\n .storeService\n .activeReason$\n .pipe(\n map((reason) => reason === 'date_alert'),\n map((dateAlertFiltered) => {\n const dateAlerts = this.aggregatedNotifications.filter((notification) => notification.reason === 'dateAlert');\n return dateAlertFiltered || dateAlerts.length === this.aggregatedNotifications.length;\n }),\n shareReplay(1),\n );\n\n loading$ = this.storeService.query.selectLoading();\n\n stateChanged$ = this.storeService.stateChanged$;\n\n // The translated reason, if available\n translatedReasons:{ [reason:string]:number };\n\n project?:{ href:string, title:string, showUrl:string };\n\n text = {\n loading: this.I18n.t('js.ajax.loading'),\n placeholder: this.I18n.t('js.placeholders.default'),\n mark_as_read: this.I18n.t('js.notifications.center.mark_as_read'),\n };\n\n private clickTimer:ReturnType;\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 onClick():void {\n clearTimeout(this.clickTimer); // Clear timer from the any previous single click events.\n this.clickTimer = setTimeout(() => {\n // The single click logic is handled in a timeout, because\n // it needs to be canceled in case the event is a double click.\n this.showDetails();\n }, 250);\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 onDoubleClick():void {\n clearTimeout(this.clickTimer); // Clear timer from the single click event onClick.\n this.showFullView();\n }\n\n showFullView():void {\n const href = this.notification._links.resource?.href;\n const id = href && HalResource.matchFromLink(href, 'work_packages');\n\n this.storeService.openFullView(id);\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 key: 'shared',\n title: this.I18n.t('js.notifications.menu.shared'),\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 {{text.mySettings}}\n\n","\n \n \n \n \n\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IanCenterService } from 'core-app/features/in-app-notifications/center/state/ian-center.service';\nimport {\n IAN_FACET_FILTERS,\n InAppNotificationFacet,\n} from 'core-app/features/in-app-notifications/center/state/ian-center.store';\n\n@Component({\n selector: 'op-activate-facet',\n templateUrl: './activate-facet-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ActivateFacetButtonComponent {\n text = {\n facets: {\n unread: this.I18n.t('js.notifications.facets.unread'),\n all: this.I18n.t('js.notifications.facets.all'),\n },\n facet_titles: {\n unread: this.I18n.t('js.notifications.facets.unread_title'),\n all: this.I18n.t('js.notifications.facets.all_title'),\n },\n };\n\n availableFacets = Object.keys(IAN_FACET_FILTERS);\n\n activeFacet$ = this.storeService.activeFacet$;\n\n constructor(\n private I18n:I18nService,\n private storeService:IanCenterService,\n ) {\n }\n\n activateFacet(facet:InAppNotificationFacet):void {\n this.storeService.setFacet(facet);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IanCenterService } from 'core-app/features/in-app-notifications/center/state/ian-center.service';\n\n@Component({\n selector: 'op-mark-all-as-read-button',\n templateUrl: './mark-all-as-read-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MarkAllAsReadButtonComponent {\n text = {\n mark_all_read: this.I18n.t('js.notifications.center.mark_all_read'),\n };\n\n constructor(\n private I18n:I18nService,\n private storeService:IanCenterService,\n ) {\n }\n\n markAllRead():void {\n this.storeService.markAllAsRead();\n }\n}\n","\n \n {{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-tablet',\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","\n
    \n \n \n \n

    \n {{ text.no_selection }}\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} from '@angular/core';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IanCenterService } from '../state/ian-center.service';\nimport { imagePath } from 'core-app/shared/helpers/images/path-helper';\n\n@Component({\n templateUrl: './empty-state.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./empty-state.component.sass'],\n selector: 'op-empty-state',\n})\nexport class EmptyStateComponent {\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 text = {\n no_notification: this.I18n.t('js.notifications.center.empty_state.no_notification'),\n no_selection: this.I18n.t('js.notifications.center.empty_state.no_selection'),\n };\n\n hasNotifications$ = this.storeService.hasNotifications$;\n\n loading$ = this.storeService.query.selectLoading();\n\n constructor(\n readonly I18n:I18nService,\n readonly storeService:IanCenterService,\n ) {\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","\n \n \n {{text.button}}\n \n\n\n","import {\n Component,\n Input,\n} from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { OpInviteUserModalService } from 'core-app/features/invite-user-modal/invite-user-modal.service';\nimport { OpAutocompleterComponent } from 'core-app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component';\n\n@Component({\n selector: 'op-invite-user-button',\n templateUrl: './invite-user-button.component.html',\n styleUrls: ['./invite-user-button.component.sass'],\n})\nexport class InviteUserButtonComponent {\n @Input() projectId:string|null;\n\n /** This component does not provide an output, because both primary usecases were in places where the button was\n * destroyed before the modal closed, causing the data from the modal to never arrive at the parent.\n * If you want to do something with the output from the modal that is opened, use the OpInviteUserModalService\n * and subscribe to the `close` event there.\n */\n text = {\n button: this.I18n.t('js.invite_user_modal.invite'),\n };\n\n canInviteUsersToProject$:Observable;\n\n constructor(\n readonly I18n:I18nService,\n readonly opInviteUserModalService:OpInviteUserModalService,\n readonly currentProjectService:CurrentProjectService,\n readonly currentUserService:CurrentUserService,\n readonly autocompleter:OpAutocompleterComponent,\n ) {\n }\n\n public ngOnInit():void {\n this.projectId = this.projectId || this.currentProjectService.id;\n this.canInviteUsersToProject$ = this\n .currentUserService\n .hasCapabilities$(\n 'memberships/create',\n this.projectId || null,\n );\n }\n\n public onAddNewClick($event:Event):void {\n $event.stopPropagation();\n this.opInviteUserModalService.open(this.projectId);\n this.autocompleter.closeSelect();\n }\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 { HttpClient, HttpErrorResponse, HttpResponse } from '@angular/common/http';\nimport { Observable, retry, timer } from 'rxjs';\nimport { switchMap, takeWhile } from 'rxjs/operators';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { JobStatusEnum, JobStatusInterface } from 'core-app/features/job-status/job-status.interface';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { EXTERNAL_REQUEST_HEADER } from 'core-app/features/hal/http/openproject-header-interceptor';\nimport { DomSanitizer, SafeHtml } 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(\n @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 ) {\n super(locals, cdRef, elementRef);\n\n this.jobId = locals.jobId as string;\n }\n\n ngOnInit() {\n super.ngOnInit();\n this.listenOnJobStatus();\n }\n\n private listenOnJobStatus() {\n this.loadingIndicator.indicator('modal').start();\n timer(0, 2000)\n .pipe(\n switchMap(() => this.performRequest()),\n retry({\n count: 10,\n delay: (error:HttpErrorResponse) => {\n // Example for catching specific error code as well\n if ([502, 503, 504].includes(error.status)) {\n return timer(2000);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw error;\n },\n }),\n takeWhile((response) => !!response.body && this.continuedStatus(response.body), true),\n this.untilDestroyed(),\n )\n .subscribe({\n next: (response) => this.onResponse(response),\n error: (error:HttpErrorResponse) => this.handleError(error),\n complete: () => {\n this.loadingIndicator.indicator('modal').stop();\n this.isLoading = false;\n },\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?.statusText || 'Internal Error');\n }\n\n // eslint-disable-next-line no-multi-assign\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';\nimport { NgSelectModule } from '@ng-select/ng-select';\n\n@NgModule({\n imports: [\n // Commons\n OpSharedModule,\n ReactiveFormsModule,\n\n NgSelectModule,\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","\n\n\n
    \n \n \n \n \n
    \n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n Input,\n} from '@angular/core';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { map } from 'rxjs/operators';\n\nexport const opTeamPlannerSidemenuSelector = 'op-team-planner-sidemenu';\n\n@Component({\n selector: opTeamPlannerSidemenuSelector,\n templateUrl: './team-planner-sidemenu.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TeamPlannerSidemenuComponent extends UntilDestroyedMixin {\n @HostBinding('class.op-sidebar') className = true;\n\n @Input() menuItems:string[] = [];\n\n @Input() projectId:string|undefined;\n\n canAddTeamPlanner$ = this\n .currentUserService\n .hasCapabilities$(\n 'team_planners/create',\n this.currentProjectService.id || null,\n )\n .pipe(\n map((val) => val && !this.bannersService.eeShowBanners),\n );\n\n createButton = {\n text: this.I18n.t('js.team_planner.create_label'),\n title: this.I18n.t('js.team_planner.create_title'),\n uiSref: 'team_planner.page.show',\n uiParams: {\n query_id: null,\n query_props: '',\n },\n };\n\n constructor(\n readonly elementRef:ElementRef,\n readonly currentUserService:CurrentUserService,\n readonly currentProjectService:CurrentProjectService,\n readonly bannersService:BannersService,\n readonly I18n:I18nService,\n ) {\n super();\n\n populateInputsFromDataset(this);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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","\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} from '@angular/core';\nimport {\n WorkPackageViewFiltersService,\n} 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 { from, merge, Observable } from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport {\n WorkPackageFiltersService,\n} from 'core-app/features/work-packages/components/filters/wp-filters/wp-filters.service';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.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 readonly wpListService:WorkPackagesListService,\n ) {\n super();\n this.visible$ = this.wpFiltersService.observeUntil(componentDestroyed(this));\n }\n\n ngOnInit():void {\n merge(\n this.wpTableFilters.pristine$(),\n from(this.wpListService.conditionallyLoadForm()),\n )\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","\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 {\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 { 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';\nimport * as moment from 'moment-timezone';\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 { 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 {\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';\nimport { firstValueFrom } from 'rxjs';\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:IAPIFilter[] = [];\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({ name: 'ancestor', operator: '=', values: [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 firstValueFrom(\n this.apiV3Service.projects.list({\n filters: [\n ['id', '=', val.map((p:HalResource|IProjectAutocompleteItem) => String(p.id) || '')],\n ],\n }),\n );\n\n this.filter.values = projects.elements;\n this.filterChanged.emit(this.filter);\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { 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","\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,\n EventEmitter,\n HostBinding,\n Input,\n OnInit,\n Output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n compareByHref,\n halHref,\n} 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';\nimport { WorkPackageViewBaselineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-baseline.service';\n\n@Component({\n selector: '[query-filter]',\n styleUrls: ['./query-filter.component.sass'],\n templateUrl: './query-filter.component.html',\n encapsulation: ViewEncapsulation.None,\n})\nexport class QueryFilterComponent implements OnInit {\n @HostBinding('class.op-query-filter') className = true;\n\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 baselineIncompatibleFilter = 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 incompatible_filter: this.I18n.t('js.work_packages.filters.baseline_incompatible'),\n };\n\n constructor(\n readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly wpTableBaseline:WorkPackageViewBaselineService,\n readonly schemaCache:SchemaCacheService,\n readonly I18n:I18nService,\n readonly currentProject:CurrentProjectService,\n readonly bannerService:BannersService,\n ) {\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 this.baselineIncompatibleFilter = this.wpTableBaseline.isActive() && this.wpTableBaseline.isIncompatibleFilter(this.filter.id);\n }\n\n private showValues() {\n return this.filter.currentSchema!.isValueRequired() && this.filter.currentSchema!.values!.type !== '[1]Boolean';\n }\n}\n","
    \n \n\n \n \n\n
      \n
    • \n \n\n
      \n \n \n
      \n
    • \n\n
    • \n\n \n
    • \n
    • \n
      \n\n
    • \n\n
    • \n \n \n \n\n
      \n \n \n
      \n
    • \n
    \n\n 0\"\n class=\"op-toast -warning\">\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 OnChanges,\n OnInit,\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';\nimport { WorkPackageViewBaselineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-baseline.service';\nimport { combineLatestWith } from 'rxjs';\nimport { repositionDropdownBugfix } from 'core-app/shared/components/autocompleter/op-autocompleter/autocompleter.helper';\n\nconst ADD_FILTER_SELECT_INDEX = -1;\n\n@Component({\n selector: 'op-query-filters',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './query-filters.component.html',\n})\nexport class QueryFiltersComponent extends UntilDestroyedMixin implements OnInit, OnChanges {\n @ViewChild(NgSelectComponent) public ngSelectComponent:NgSelectComponent;\n\n @Input() public filters:QueryFilterInstanceResource[];\n\n @Input() public showCloseFilter = false;\n\n @Output() public filtersChanged = new DebouncedEventEmitter(\n componentDestroyed(this),\n 500,\n );\n\n public remainingFilters:any[] = [];\n\n public focusElementIndex = 0;\n\n public baselineIncompatibleFilters:string[] = [];\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 baseline_warning: this.I18n.t('js.work_packages.filters.baseline_warning'),\n };\n\n constructor(\n readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly wpTableBaseline:WorkPackageViewBaselineService,\n readonly wpFiltersService:WorkPackageFiltersService,\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.wpTableFilters.live$()\n .pipe(\n combineLatestWith(this.wpTableBaseline.live$()),\n this.untilDestroyed(),\n )\n .subscribe(([filters]) => {\n if (this.wpTableBaseline.isActive()) {\n this.baselineIncompatibleFilters = this.wpTableBaseline.detectIncompatibleFilters(filters);\n } else {\n this.baselineIncompatibleFilters = [];\n }\n this.cdRef.detectChanges();\n });\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n && !(this.wpTableFilters.hidden.includes(filter.id) || filter.isTemplated()));\n }\n\n public onOpen() {\n repositionDropdownBugfix(this.ngSelectComponent);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 '@openproject/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 if (!this.searchTerm.value || this.searchTerm.isValueOlderThan(500)) {\n this.searchTerm.putValue(upstreamTerm);\n }\n });\n\n this.searchTermChanged\n .pipe(\n this.untilDestroyed(),\n distinctUntilChanged(),\n tap((val) => this.searchTerm.putValue(val)),\n debounceTime(500),\n )\n .subscribe((term) => {\n if (term.length > 0) {\n this.wpTableFilters.replace('search', (filter) => {\n filter.operator = filter.findOperator('**')!;\n filter.values = [term];\n });\n } else {\n const filter = this.wpTableFilters.find('search');\n\n this.wpTableFilters.remove(filter!);\n\n this.deactivateFilter.emit(filter);\n }\n });\n }\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 '@openproject/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","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
    \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 { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { Component, OnInit } from '@angular/core';\nimport {\n FormattableEditFieldComponent,\n} from 'core-app/shared/components/fields/edit/field-types/formattable-edit-field/formattable-edit-field.component';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Component({\n templateUrl: '../../../../shared/components/fields/edit/field-types/formattable-edit-field/formattable-edit-field.component.html',\n})\nexport class WorkPackageCommentFieldComponent extends FormattableEditFieldComponent implements OnInit {\n public isBusy = false;\n\n public name = 'comment';\n\n @InjectField() public ConfigurationService:ConfigurationService;\n\n public get required() {\n return true;\n }\n\n ngOnInit() {\n super.ngOnInit();\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","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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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
    \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(\n 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 ) {\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:{ html:string }) => {\n this.details.push(this.sanitization.bypassSecurityTrustHtml(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 const userWrote = this.I18n.instance_locale_translate('js.text_user_wrote', { value: this.userName });\n return `${userWrote}\\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","import { IWorkPackageTimestamp } from 'core-app/features/hal/resources/work-package-timestamp-resource';\nimport { ISchemaProxy } from 'core-app/features/hal/schemas/schema-proxy';\nimport { DEFAULT_TIMESTAMP } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-baseline.service';\nimport * as moment from 'moment-timezone';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\n\nexport type BaselineOption = 'oneDayAgo'|'lastWorkingDay'|'oneWeekAgo'|'oneMonthAgo'|'aSpecificDate'|'betweenTwoSpecificDates';\n\nexport interface BaselineTimestamp {\n date:string;\n time:string;\n offset:string;\n}\n\nconst BASELINE_OPTIONS = ['oneDayAgo', 'lastWorkingDay', 'oneWeekAgo', 'oneMonthAgo', 'aSpecificDate', 'betweenTwoSpecificDates'];\n\nexport function baselineFilterFromValue(selectedDates:string[]):BaselineOption|null {\n if (selectedDates.length < 2) {\n return null;\n }\n\n const first = selectedDates[0].split('@')[0];\n if (BASELINE_OPTIONS.includes(first)) {\n return first as BaselineOption;\n }\n\n if (selectedDates[1] === DEFAULT_TIMESTAMP) {\n return 'aSpecificDate';\n }\n\n return 'betweenTwoSpecificDates';\n}\n\nexport function getPartsFromTimestamp(value:string):BaselineTimestamp|null {\n if (value.includes('@')) {\n const [date, timeWithZone] = value.split(/[@]/);\n const [time, offset] = timeWithZone.split(/(?=[+-])/);\n return { date, time, offset };\n }\n\n if (value !== 'PT0S') {\n const dateObj = moment.parseZone(value);\n const date = dateObj.format('YYYY-MM-DD');\n const time = dateObj.format('HH:mm');\n const offset = dateObj.format('Z');\n\n return { date, time, offset };\n }\n\n return null;\n}\n\nexport function attributeChanged(base:IWorkPackageTimestamp, schema:ISchemaProxy):boolean {\n return !!schema\n .availableAttributes\n .find((attribute) => {\n const name = schema.mappedName(attribute);\n return Object.prototype.hasOwnProperty.call(base, name) || Object.prototype.hasOwnProperty.call(base.$links, name);\n });\n}\n\nexport function getBaselineState(workPackage:WorkPackageResource, schemaService:SchemaCacheService):string {\n let state = '';\n const schema = schemaService.of(workPackage);\n const timestamps = workPackage.attributesByTimestamp || [];\n if (timestamps.length > 1) {\n const base = timestamps[0];\n const compare = timestamps[1];\n if ((!base._meta.exists && compare._meta.exists) || (!base._meta.matchesFilters && compare._meta.matchesFilters)) {\n state = 'added';\n } else if ((base._meta.exists && !compare._meta.exists) || (base._meta.matchesFilters && !compare._meta.matchesFilters)) {\n state = 'removed';\n } else if (attributeChanged(base, schema)) {\n state = 'updated';\n }\n } else {\n state = '';\n }\n return state;\n}\n\nexport function offsetToUtcString(offset:string) {\n const mappedOffset = offset\n .replace(/^([+-])0/, '$1')\n .replace(':00', '')\n .replace(':30', '.5');\n\n return `UTC${mappedOffset}`;\n}\n","\n \n &ngsp;\n \n\n
    \n \n {{text.now_meets_filter_criteria}}\n \n {{text.no_longer_meets_filter_criteria}}\n \n {{text.maintained_with_changes}}\n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 HostBinding,\n OnInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageViewBaselineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-baseline.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 { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport {\n baselineFilterFromValue,\n getPartsFromTimestamp,\n getBaselineState,\n offsetToUtcString,\n} from 'core-app/features/work-packages/components/wp-baseline/baseline-helpers';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport * as moment from 'moment-timezone';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { Moment } from 'moment';\nimport { filter } from 'rxjs/operators';\n\n@Component({\n templateUrl: './baseline-legends.component.html',\n styleUrls: ['./baseline-legends.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'op-baseline-legends',\n encapsulation: ViewEncapsulation.None,\n})\nexport class OpBaselineLegendsComponent extends UntilDestroyedMixin implements OnInit {\n @HostBinding('class.op-baseline-legends') className = true;\n\n public numAdded = 0;\n\n public numRemoved = 0;\n\n public numUpdated = 0;\n\n public offset:string|null;\n\n public userOffset:string;\n\n public userTimezone:string;\n\n public localDate:string;\n\n public legendDescription:string;\n\n public text = {\n now_meets_filter_criteria: this.I18n.t('js.baseline.legends.now_meets_filter_criteria'),\n no_longer_meets_filter_criteria: this.I18n.t('js.baseline.legends.no_longer_meets_filter_criteria'),\n maintained_with_changes: this.I18n.t('js.baseline.legends.maintained_with_changes'),\n in_your_timezone: this.I18n.t('js.baseline.legends.in_your_timezone'),\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly wpTableBaseline:WorkPackageViewBaselineService,\n readonly querySpace:IsolatedQuerySpace,\n readonly schemaCache:SchemaCacheService,\n readonly timezoneService:TimezoneService,\n readonly configuration:ConfigurationService,\n readonly cdRef:ChangeDetectorRef,\n ) {\n super();\n }\n\n ngOnInit() {\n this\n .wpTableBaseline\n .live$()\n .pipe(\n this.untilDestroyed(),\n filter(() => this.wpTableBaseline.isActive()),\n )\n .subscribe((timestamps) => {\n this.userTimezone = this.timezoneService.userTimezone();\n this.userOffset = moment.tz(this.userTimezone).format('Z');\n\n const parts = getPartsFromTimestamp(timestamps[0]);\n if (parts) {\n this.offset = parts.offset;\n }\n\n this.getBaselineDetails();\n this.getFilterName(timestamps);\n this.cdRef.detectChanges();\n });\n }\n\n public getFilterName(timestamps:string[]) {\n const datesAndTimes = timestamps.map((el) => el.split(/[@T]/));\n const baselineValue = baselineFilterFromValue(this.wpTableBaseline.current);\n const changesSinceOrBetween = this.deriveChangesSinceOrBetween(baselineValue);\n let description = '';\n let upstreamDate = '';\n let localDate = '';\n\n switch (baselineValue) {\n case 'oneDayAgo':\n [upstreamDate, localDate] = this.deriveSingleDate(this.wpTableBaseline.yesterdayDate(), datesAndTimes[0][1]);\n description = this.I18n.t('js.baseline.drop_down.yesterday');\n description += ` (${upstreamDate})`;\n break;\n case 'lastWorkingDay':\n [upstreamDate, localDate] = this.deriveSingleDate(this.wpTableBaseline.lastWorkingDate(), datesAndTimes[0][1]);\n description = this.I18n.t('js.baseline.drop_down.last_working_day');\n description += ` (${upstreamDate})`;\n break;\n case 'oneWeekAgo':\n [upstreamDate, localDate] = this.deriveSingleDate(this.wpTableBaseline.lastweekDate(), datesAndTimes[0][1]);\n description = this.I18n.t('js.baseline.drop_down.last_week');\n description += ` (${upstreamDate})`;\n break;\n case 'oneMonthAgo':\n [upstreamDate, localDate] = this.deriveSingleDate(this.wpTableBaseline.lastMonthDate(), datesAndTimes[0][1]);\n description = this.I18n.t('js.baseline.drop_down.last_month');\n description += ` (${upstreamDate})`;\n break;\n case 'aSpecificDate':\n [upstreamDate, localDate] = this.formatUpstreamAndLocal(moment.parseZone(timestamps[0]));\n description += upstreamDate;\n break;\n case 'betweenTwoSpecificDates':\n [upstreamDate, localDate] = this.deriveDateRange(moment.parseZone(timestamps[0]), moment.parseZone(timestamps[1]));\n description += upstreamDate;\n break;\n default:\n break;\n }\n description = `${changesSinceOrBetween} ${description}`;\n this.legendDescription = description;\n this.localDate = localDate;\n return description;\n }\n\n private deriveChangesSinceOrBetween(baselineValue:string|null) {\n if (baselineValue === 'betweenTwoSpecificDates') {\n return this.I18n.t('js.baseline.legends.changes_between');\n }\n\n return this.I18n.t('js.baseline.legends.changes_since');\n }\n\n private deriveSingleDate(date:string, timestamp:string):[string, string] {\n const parsedDate:Moment = moment.parseZone(`${date}T${timestamp}`);\n return this.formatUpstreamAndLocal(parsedDate);\n }\n\n private deriveDateRange(start:Moment, end:Moment):[string, string] {\n const startRange = this.formatUpstreamAndLocal(start);\n const endRange = this.formatUpstreamAndLocal(end);\n\n return [\n `${startRange[0]} ${this.I18n.t('js.label_and')} ${endRange[0]}`,\n `${startRange[1]} - ${endRange[1]}`,\n ];\n }\n\n private formatUpstreamAndLocal(date:Moment):[string, string] {\n return [\n this.formatDate(date),\n this.formatDate(date.tz(this.userTimezone)),\n ];\n }\n\n public getBaselineDetails() {\n this.numAdded = 0;\n this.numRemoved = 0;\n this.numUpdated = 0;\n let state = '';\n const baselineIsActive= this.wpTableBaseline.isActive();\n const results = this.querySpace.results.value;\n if (baselineIsActive && results && results.elements.length > 0) {\n results.elements.forEach((workPackage:WorkPackageResource) => {\n state = getBaselineState(workPackage, this.schemaCache);\n if (state === 'added') {\n this.numAdded += 1;\n } else if (state === 'removed') {\n this.numRemoved += 1;\n } else if (state === 'updated') {\n this.numUpdated += 1;\n }\n });\n this.text.maintained_with_changes = `${this.I18n.t('js.baseline.legends.maintained_with_changes')} (${this.numUpdated})`;\n this.text.no_longer_meets_filter_criteria = `${this.I18n.t('js.baseline.legends.no_longer_meets_filter_criteria')} (${this.numRemoved})`;\n this.text.now_meets_filter_criteria = `${this.I18n.t('js.baseline.legends.now_meets_filter_criteria')} (${this.numAdded})`;\n }\n }\n\n private formatDate(date:Moment):string {\n const formattedDate = date.format(this.timezoneService.getDateFormat());\n const formattedTime = date.format(this.timezoneService.getTimeFormat());\n const offset = offsetToUtcString(date.format('Z'));\n\n return `${formattedDate} ${formattedTime} ${offset}`;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n templateUrl: './baseline-loading.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'op-baseline-loading',\n encapsulation: ViewEncapsulation.None,\n})\nexport class OpBaselineLoadingComponent { }\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 HostBinding,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n@Component({\n selector: 'op-baseline-modal',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './baseline-modal.component.html',\n})\nexport class OpBaselineModalComponent {\n @HostBinding('class.op-baseline-modal') className = true;\n\n public opened = false;\n\n public text = {\n toggle_title: this.I18n.t('js.baseline.toggle_title'),\n header_description: this.I18n.t('js.baseline.header_description'),\n clear: this.I18n.t('js.baseline.clear'),\n apply: this.I18n.t('js.baseline.apply'),\n\n };\n\n constructor(\n readonly I18n:I18nService,\n ) {}\n\n public toggleOpen():void {\n this.opened = !this.opened;\n }\n}\n","\n \n \n {{ text.toggle_title }}\n \n \n \n \n\n","
    \n
    \n {{ text.baseline_comparison }}\n \n
    \n {{ eeShowBanners ? text.enterprise_header_description : text.header_description }}\n \n {{ text.more_info_text }}\n \n \n
    \n\n\n\n \n\n
    \n \n \n \n {{availableValue.title}}\n \n \n\n
    \n {{ mappedSelectedDate }} \n \n\n \n\n \n \n\n \n\n \n\n \n\n \n \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.help_description }}\n \n\n\n \n \n\n \n\n \n\n \n \n {{ text.help_description }}\n \n\n\n \n \n \n\n \n \n\n
    \n\n
    \n \n {{ text.clear }}\n \n \n {{ text.apply }}\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 EventEmitter,\n HostBinding,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport SpotDropAlignmentOption from 'core-app/spot/drop-alignment-options';\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';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { Observable } from 'rxjs';\nimport {\n DEFAULT_TIMESTAMP,\n WorkPackageViewBaselineService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-baseline.service';\nimport { validDate } from 'core-app/shared/components/datepicker/helpers/date-modal.helpers';\nimport {\n baselineFilterFromValue,\n getPartsFromTimestamp,\n offsetToUtcString,\n} from 'core-app/features/work-packages/components/wp-baseline/baseline-helpers';\nimport * as moment from 'moment-timezone';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { enterpriseDocsUrl } from 'core-app/core/setup/globals/constants.const';\nimport { DayElement } from 'flatpickr/dist/types/instance';\n\nconst DEFAULT_SELECTED_TIME = '08:00';\n\n@Component({\n selector: 'op-baseline',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './baseline.component.html',\n styleUrls: ['./baseline.component.sass'],\n})\nexport class OpBaselineComponent extends UntilDestroyedMixin implements OnInit {\n @HostBinding('class.op-baseline') className = true;\n\n @Output() submitted = new EventEmitter();\n\n @Input() showActionBar? = false;\n\n @Input() visible = true;\n\n public mappedSelectedDate:string|null;\n\n public nonWorkingDays$:Observable = this.wpTableBaseline.nonWorkingDays$;\n\n public selectedDates:string[];\n\n public selectedTimes:string[];\n\n public selectedOffsets:string[];\n\n public userTimezone:string;\n\n public userOffset:string;\n\n public selectedFilter:string|null;\n\n public selectedTimezoneFormattedTime:string[];\n\n public tooltipPosition = SpotDropAlignmentOption.TopRight;\n\n eeShowBanners = this.Banner.eeShowBanners;\n\n public text = {\n toggle_title: this.I18n.t('js.baseline.toggle_title'),\n drop_down_none_option: this.I18n.t('js.baseline.drop_down.none'),\n header_description: this.I18n.t('js.baseline.header_description'),\n enterprise_header_description: this.I18n.t('js.baseline.enterprise_header_description'),\n clear: this.I18n.t('js.baseline.clear'),\n apply: this.I18n.t('js.baseline.apply'),\n show_changes_since: this.I18n.t('js.baseline.show_changes_since'),\n from: this.I18n.t('js.baseline.from'),\n to: this.I18n.t('js.baseline.to'),\n date: this.I18n.t('js.label_date'),\n time: this.I18n.t('js.baseline.time'),\n today: this.I18n.t('js.label_today'),\n moreInfoLink: enterpriseDocsUrl.website,\n more_info_text: this.I18n.t('js.admin.enterprise.upsale.more_info'),\n help_description: this.I18n.t('js.baseline.help_description'),\n baseline_comparison: this.I18n.t('js.baseline.baseline_comparison'),\n time_description: (i:number) => {\n const date = this.selectedDates[i];\n const time = this.selectedTimes[i];\n const offset = this.selectedOffsets[i];\n\n if (!date || !time) {\n return '';\n }\n\n const formatted = moment(`${date}T${time}${offset}`)\n .tz(this.userTimezone);\n\n const formattedDate = formatted.format(this.timezoneService.getDateFormat());\n const formattedTime = formatted.format(this.timezoneService.getTimeFormat());\n return this.I18n.t('js.baseline.time_description', {\n datetime: `${formattedDate} ${formattedTime}`,\n });\n },\n };\n\n public baselineAvailableValues = [\n {\n value: 'oneDayAgo',\n title: this.I18n.t('js.baseline.drop_down.yesterday'),\n },\n {\n value: 'lastWorkingDay',\n title: this.I18n.t('js.baseline.drop_down.last_working_day'),\n },\n {\n value: 'oneWeekAgo',\n title: this.I18n.t('js.baseline.drop_down.last_week'),\n },\n {\n value: 'oneMonthAgo',\n title: this.I18n.t('js.baseline.drop_down.last_month'),\n },\n {\n value: 'aSpecificDate',\n title: this.I18n.t('js.baseline.drop_down.a_specific_date'),\n },\n {\n value: 'betweenTwoSpecificDates',\n title: this.I18n.t('js.baseline.drop_down.between_two_specific_dates'),\n },\n ];\n\n constructor(\n readonly I18n:I18nService,\n readonly wpTableBaseline:WorkPackageViewBaselineService,\n readonly halResourceService:HalResourceService,\n readonly weekdaysService:WeekdayService,\n readonly daysService:DayResourceService,\n readonly timezoneService:TimezoneService,\n readonly configuration:ConfigurationService,\n readonly Banner:BannersService,\n ) {\n super();\n }\n\n public ngOnInit():void {\n this.userTimezone = this.timezoneService.userTimezone();\n this.userOffset = moment().tz(this.userTimezone).format('Z');\n this.resetSelection();\n\n if (this.wpTableBaseline.isActive()) {\n this.filterChange(baselineFilterFromValue(this.wpTableBaseline.current));\n this.wpTableBaseline.current.forEach((value, i) => {\n const parts = getPartsFromTimestamp(value);\n if (parts) {\n this.selectedDates[i] = this.selectedDates[i] ? this.selectedDates[i] : parts.date;\n this.selectedTimes[i] = parts.time;\n this.selectedOffsets[i] = parts.offset;\n }\n });\n }\n\n this.wpTableBaseline\n .pristine$()\n .subscribe((timestamps) => {\n if (_.isEqual(timestamps, [DEFAULT_TIMESTAMP])) {\n this.resetSelection();\n this.wpTableBaseline.disable();\n }\n });\n }\n\n public resetSelection():void {\n this.selectedTimes = [DEFAULT_SELECTED_TIME, DEFAULT_SELECTED_TIME];\n this.selectedDates = ['', ''];\n this.selectedFilter = null;\n this.mappedSelectedDate = null;\n this.selectedOffsets = [this.userOffset, this.userOffset];\n }\n\n public setToday(key:string):void {\n const today = moment().format('YYYY-MM-DD');\n const from = key === 'from' ? today : this.selectedDates[0];\n // When setting the \"from\" date to today, the \"to\" date must also be set to today,\n // because we do not allow future dates, meaning \"to\" cannot be anything else but today.\n const to = today;\n this.dateChange([from, to]);\n }\n\n public onSubmit(e:Event):void {\n e.preventDefault();\n this.onSave();\n }\n\n public onSave() {\n this.wpTableBaseline.update(this.buildBaselineFilter());\n this.submitted.emit();\n }\n\n public mappedOffset(offset:string) {\n return offsetToUtcString(offset);\n }\n\n public timesChange(value:string[]):void {\n this.selectedTimes = value;\n }\n\n public dateChange(values:string[]):void {\n if (_.every(values, validDate)) {\n this.selectedDates = values;\n }\n }\n\n public filterChange(value:string|null):void {\n this.resetSelection();\n this.selectedFilter = value;\n switch (value) {\n case 'oneDayAgo':\n this.updateDateValues(this.wpTableBaseline.yesterdayDate());\n break;\n case 'lastWorkingDay':\n this.updateDateValues(this.wpTableBaseline.lastWorkingDate());\n break;\n case 'oneWeekAgo':\n this.updateDateValues(this.wpTableBaseline.lastweekDate());\n break;\n case 'oneMonthAgo':\n this.updateDateValues(this.wpTableBaseline.lastMonthDate());\n break;\n default:\n this.mappedSelectedDate = null;\n break;\n }\n }\n\n public futureDateComparer():(dayElem:DayElement) => boolean {\n const now = moment();\n return (dayElem:DayElement) => moment(dayElem.dateObj).isAfter(now, 'days');\n }\n\n private updateDateValues(date:string) {\n this.mappedSelectedDate = this.timezoneService.formattedDate(date);\n this.dateChange([date]);\n }\n\n private buildBaselineFilter():string[] {\n switch (this.selectedFilter) {\n case 'oneDayAgo':\n case 'oneWeekAgo':\n case 'oneMonthAgo':\n case 'lastWorkingDay':\n return [this.buildFilterString(0), DEFAULT_TIMESTAMP];\n case 'aSpecificDate':\n return [this.buildISOString(0), DEFAULT_TIMESTAMP];\n case 'betweenTwoSpecificDates':\n return [\n this.buildISOString(0),\n this.buildISOString(1),\n ];\n default:\n return [DEFAULT_TIMESTAMP];\n }\n }\n\n private buildISOString(i:number):string {\n return `${this.selectedDates[i]}T${this.selectedTimes[i]}${this.selectedOffsets[i]}`;\n }\n\n private buildFilterString(i:number):string {\n const timeWithOffset = `${this.selectedTimes[i]}${this.selectedOffsets[i]}`;\n return `${this.selectedFilter as string}@${timeWithOffset}`;\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.getAncestors().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 { 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WorkPackageViewFocusService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { StateService, TransitionService } from '@uirouter/core';\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy,\n} from '@angular/core';\nimport { AbstractWorkPackageButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-buttons.module';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { KeepTabService } from '../../wp-single-view-tabs/keep-tab/keep-tab.service';\n\n@Component({\n templateUrl: '../wp-button.template.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'wp-details-view-button',\n})\nexport class WorkPackageDetailsViewButtonComponent extends AbstractWorkPackageButtonComponent implements OnDestroy {\n public projectIdentifier:string;\n\n public accessKey = 8;\n\n public activeState = 'work-packages.partitioned.list.details';\n\n public listState = 'work-packages.partitioned.list';\n\n public buttonId = 'work-packages-details-view-button';\n\n public buttonClass = 'toolbar-icon';\n\n public iconClass = 'icon-info2';\n\n public activateLabel:string;\n\n public deactivateLabel:string;\n\n private transitionListener:Function;\n\n constructor(\n readonly $state:StateService,\n readonly I18n:I18nService,\n readonly transitions:TransitionService,\n readonly cdRef:ChangeDetectorRef,\n public states:States,\n public wpTableFocus:WorkPackageViewFocusService,\n public keepTab:KeepTabService,\n ) {\n super(I18n);\n\n this.activateLabel = I18n.t('js.button_open_details');\n this.deactivateLabel = I18n.t('js.button_close_details');\n\n this.transitionListener = this.transitions.onSuccess({}, () => {\n this.isActive = this.$state.includes(this.activeState);\n this.cdRef.detectChanges();\n });\n }\n\n public ngOnDestroy() {\n super.ngOnDestroy();\n this.transitionListener();\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 public performAction(event:Event) {\n if (this.isActive) {\n this.$state.go(this.listState);\n } else {\n this.openDetailsView();\n }\n }\n\n public openListView():void {\n }\n\n public openDetailsView():void {\n const params = {\n workPackageId: this.wpTableFocus.focusedWorkPackage,\n };\n\n this.keepTab.goCurrentDetailsState(params);\n }\n}\n","\n","\n \n \n {{ buttonText }}\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 { 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\n\n@Component({\n template: `\n \n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'wp-fold-toggle-view-button',\n})\nexport class WorkPackageFoldToggleButtonComponent {\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 @Input() showCalendarSharingOption = 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 { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\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 { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { WorkPackageShareModalComponent } from 'core-app/features/work-packages/components/wp-share-modal/wp-share.modal';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'wp-share-button',\n templateUrl: './wp-share-button.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageShareButtonComponent extends UntilDestroyedMixin {\n @Input() public workPackage:WorkPackageResource;\n\n public text = {\n share: this.I18n.t('js.work_packages.sharing.share'),\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly opModalService:OpModalService,\n readonly cdRef:ChangeDetectorRef,\n ) {\n super();\n }\n\n openModal():void {\n this.opModalService.show(WorkPackageShareModalComponent, 'global', { workPackage: this.workPackage });\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 { 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","
      \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, OnInit,\n} from '@angular/core';\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 { AbstractWorkPackageButtonComponent, ButtonControllerText } from '../wp-buttons.module';\n\nexport interface TimelineButtonText extends ButtonControllerText {\n zoomOut:string;\n zoomIn:string;\n zoomAuto:string;\n}\n\n@Component({\n templateUrl: './wp-timeline-toggle-button.html',\n styleUrls: ['./wp-timeline-toggle-button.sass'],\n selector: 'wp-timeline-toggle-button',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageTimelineButtonComponent extends AbstractWorkPackageButtonComponent implements OnInit {\n public buttonId = 'work-packages-timeline-toggle-button';\n\n public iconClass = 'icon-view-timeline';\n\n private activateLabel:string;\n\n private deactivateLabel:string;\n\n public text:TimelineButtonText;\n\n public minZoomLevel:TimelineZoomLevel = 'days';\n\n public maxZoomLevel:TimelineZoomLevel = 'years';\n\n public isAutoZoom = false;\n\n public isMaxLevel = false;\n\n public isMinLevel = false;\n\n constructor(readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n public wpTableTimeline:WorkPackageViewTimelineService) {\n super(I18n);\n\n this.activateLabel = I18n.t('js.gantt_chart.button_activate');\n this.deactivateLabel = I18n.t('js.gantt_chart.button_deactivate');\n\n this.text.zoomIn = I18n.t('js.gantt_chart.zoom.in');\n this.text.zoomOut = I18n.t('js.gantt_chart.zoom.out');\n this.text.zoomAuto = I18n.t('js.gantt_chart.zoom.auto');\n }\n\n ngOnInit():void {\n this.wpTableTimeline\n .live$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n this.isAutoZoom = this.wpTableTimeline.isAutoZoom();\n this.isActive = this.wpTableTimeline.isVisible;\n this.cdRef.detectChanges();\n });\n\n this.wpTableTimeline\n .appliedZoomLevel$\n .values$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((current) => {\n this.isMaxLevel = current === this.maxZoomLevel;\n this.isMinLevel = current === this.minZoomLevel;\n this.cdRef.detectChanges();\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 public updateZoomWithDelta(delta:number) {\n this.wpTableTimeline.updateZoomWithDelta(delta);\n }\n\n public performAction(event:Event) {\n this.toggleTimeline();\n }\n\n public toggleTimeline() {\n this.wpTableTimeline.toggle();\n }\n\n public enableAutoZoom() {\n this.wpTableTimeline.enableAutozoom();\n }\n\n public getAutoZoomToggleClass():string {\n return this.isAutoZoom ? '-disabled' : '';\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n WorkPackageViewDisplayRepresentationService,\n wpDisplayCardRepresentation,\n wpDisplayListRepresentation,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport { combineLatest } from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\n@Component({\n template: `\n \n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'wp-view-toggle-button',\n})\nexport class WorkPackageViewToggleButtonComponent extends UntilDestroyedMixin implements OnInit {\n public view:string;\n\n public text:any = {\n card: this.I18n.t('js.views.card'),\n list: this.I18n.t('js.views.list'),\n timeline: this.I18n.t('js.views.timeline'),\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n readonly wpDisplayRepresentationService:WorkPackageViewDisplayRepresentationService,\n readonly wpTableTimeline:WorkPackageViewTimelineService,\n ) {\n super();\n }\n\n ngOnInit() {\n const statesCombined = combineLatest([\n this.wpDisplayRepresentationService.live$(),\n this.wpTableTimeline.live$(),\n ]);\n\n statesCombined.pipe(\n this.untilDestroyed(),\n ).subscribe(([display, timelines]) => {\n this.detectView(display, timelines.visible);\n this.cdRef.detectChanges();\n });\n }\n\n public detectView(display:string|null, timelineVisible:boolean) {\n if (display === wpDisplayCardRepresentation) {\n this.view = wpDisplayCardRepresentation;\n return;\n }\n\n if (timelineVisible) {\n this.view = 'timeline';\n } else {\n this.view = wpDisplayListRepresentation;\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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","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-test-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-test-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-test-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';\nimport { firstValueFrom } from 'rxjs';\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 firstValueFrom(this.apiV3Service.work_packages.id(wpId).get());\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 \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\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';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport SpotDropAlignmentOption from 'core-app/spot/drop-alignment-options';\nimport {\n getBaselineState,\n} from 'core-app/features/work-packages/components/wp-baseline/baseline-helpers';\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 baselineMode = ''||'added'||'updated'||'removed';\n\n public text = {\n removeCard: this.I18n.t('js.card.remove_from_list'),\n detailsView: this.I18n.t('js.button_open_details'),\n baseLineIconAdded: this.I18n.t('js.baseline.icon_tooltip.added'),\n baseLineIconChanged: this.I18n.t('js.baseline.icon_tooltip.changed'),\n baseLineIconRemoved: this.I18n.t('js.baseline.icon_tooltip.removed'),\n };\n\n public isNewResource = isNewResource;\n\n public tooltipPosition = SpotDropAlignmentOption.BottomLeft;\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 readonly schemaCache:SchemaCacheService,\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 public baselineIcon(workPackage:WorkPackageResource) {\n this.baselineMode = getBaselineState(workPackage, this.schemaCache);\n return this.baselineMode;\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","\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 { 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-full-view',\n host: { class: 'work-packages-page--ui-view' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: '../wp-new/wp-new-full-view.html',\n})\nexport class WorkPackageCopyFullViewComponent extends WorkPackageCopyController {\n public successState = 'work-packages.show';\n}\n","\n \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 { 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 { 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","
    \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 ApplicationRef, ChangeDetectorRef, Component, ElementRef, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\nexport const customDateActionAdminSelector = 'custom-date-action-admin';\n\n@Component({\n selector: customDateActionAdminSelector,\n templateUrl: './custom-date-action-admin.html',\n})\nexport class CustomDateActionAdminComponent implements OnInit {\n public valueVisible = false;\n\n public fieldName:string = '';\n\n public fieldValue:string = '';\n\n public visibleValue:string = '';\n\n public selectedOperator:any;\n\n private onKey = 'on';\n\n private currentKey = 'current';\n\n private currentFieldValue = '%CURRENT_DATE%';\n\n public operators = [\n { key: this.onKey, label: this.I18n.t('js.custom_actions.date.specific') },\n { key: this.currentKey, label: this.I18n.t('js.custom_actions.date.current_date') },\n ];\n\n constructor(private elementRef:ElementRef,\n private cdRef:ChangeDetectorRef,\n public appRef:ApplicationRef,\n private I18n:I18nService) {\n }\n\n // cannot use $onInit as it would be called before the operators gets filled\n public ngOnInit() {\n const element = this.elementRef.nativeElement as HTMLElement;\n this.fieldName = element.dataset.fieldName! || '';\n this.fieldValue = element.dataset.fieldValue! || '';\n\n if (this.fieldValue === this.currentFieldValue) {\n this.selectedOperator = this.operators[1];\n } else {\n this.selectedOperator = this.operators[0];\n this.visibleValue = this.fieldValue;\n }\n\n this.toggleValueVisibility();\n }\n\n public toggleValueVisibility() {\n this.valueVisible = this.selectedOperator.key === this.onKey;\n if (this.fieldValue === this.currentFieldValue) {\n this.fieldValue = '';\n }\n\n this.updateDbValue();\n }\n\n private updateDbValue() {\n if (this.selectedOperator.key === this.currentKey) {\n this.fieldValue = this.currentFieldValue;\n }\n }\n\n public get fieldId() {\n // replace all square brackets by underscore\n // to match the label's for value\n return this.fieldName\n .replace(/\\[|\\]/g, '_')\n .replace('__', '_')\n .replace(/_$/, '');\n }\n\n updateField(val:string) {\n this.fieldValue = val;\n this.cdRef.detectChanges();\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 { 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';\nimport { trackByHref } from 'core-app/shared/helpers/angular/tracking-functions';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\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 trackByHref = trackByHref;\n\n actions:CustomActionResource[] = [];\n\n constructor(\n readonly apiV3Service:ApiV3Service,\n readonly cdRef:ChangeDetectorRef,\n readonly bannersService:BannersService,\n ) {\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 as CustomActionResource[];\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 {\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(\n 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\n private fetchAction() {\n if (this.action.href === null) return;\n\n void this.halResourceService\n .get(this.action.href)\n .subscribe((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.previewPath(),\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 {{action.name}}\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 HalResourceEditingService,\n} from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { Observable } from 'rxjs';\n\n@Component({\n selector: 'wp-details-toolbar',\n templateUrl: './wp-details-toolbar.html',\n})\nexport class WorkPackageSplitViewToolbarComponent implements OnInit {\n @Input() workPackage:WorkPackageResource;\n\n @Input() displayNotificationsButton:boolean;\n\n public displayShareButton$:false|Observable = false;\n\n public text = {\n button_more: this.I18n.t('js.button_more'),\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly halEditing:HalResourceEditingService,\n readonly configurationService:ConfigurationService,\n readonly currentUserService:CurrentUserService,\n ) {\n }\n\n ngOnInit() {\n this.displayShareButton$ = this.currentUserService.hasCapabilities$('work_package_shares/index', this.workPackage.project.id);\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|{ [id:string]:unknown }):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]:unknown }, 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 change changeset or resource\n * @param filter A none '!*' filter\n * @private\n */\n private setToNull(change:WorkPackageChangeset|{ [id:string]:unknown }, filter:QueryFilterInstanceResource):void {\n const attributeName = this.mapFilterToAttribute(filter);\n\n this.setValue(change, attributeName, { href: null });\n }\n\n private setValueFor(change:WorkPackageChangeset|{ [id:string]:unknown }, 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]:unknown }, field:string, value:unknown):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]:unknown }, filter:{ id:string, values:unknown[] }):boolean {\n const value:unknown = change instanceof WorkPackageChangeset ? change.projectedResource[filter.id] : change[filter.id];\n const current = _.castArray(value);\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 {\n WorkPackageResource,\n} 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';\nimport { IWorkPackageTimestamp } from 'core-app/features/hal/resources/work-package-timestamp-resource';\nimport { WorkPackageViewBaselineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-baseline.service';\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 @InjectField(WorkPackageViewBaselineService) wpTableBaseline:WorkPackageViewBaselineService;\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);\n const fieldSchema = schema.ofProperty(attribute);\n if (fieldSchema && fieldSchema.type === 'User') {\n td.classList.add('-contains-avatar');\n }\n\n const container = document.createElement('span');\n td.appendChild(container);\n this.render(container, workPackage, attribute);\n\n return td;\n }\n\n public refresh(container:HTMLElement, workPackage:WorkPackageResource, attribute:string) {\n container.innerHTML = '';\n this.render(container, workPackage, attribute);\n }\n\n private render(container:HTMLElement, workPackage:WorkPackageResource, attribute:string) {\n const schema = this.schemaCache.of(workPackage);\n const mappedName = schema.mappedName(attribute);\n const hasBaseline = attribute !== 'id' && this.wpTableBaseline.isChanged(workPackage, mappedName);\n container.classList.add(editCellContainer, editFieldContainerClass, attribute);\n\n const displayElement = this.fieldRenderer.render(workPackage, attribute, null);\n\n if (hasBaseline) {\n displayElement.classList.add('op-table-baseline--field', 'op-table-baseline--new-field');\n this.prependChanges(container, workPackage, mappedName);\n }\n\n container.appendChild(displayElement);\n }\n\n private prependChanges(\n container:HTMLElement,\n workPackage:WorkPackageResource,\n attribute:string,\n ):void {\n const base = (workPackage.attributesByTimestamp as IWorkPackageTimestamp[])[0];\n base.$links.schema = base.$links.schema || workPackage.$links.schema;\n const span = this.fieldRenderer.render(base, attribute, null);\n span.classList.add('op-table-baseline--field', 'op-table-baseline--old-field');\n container.classList.add('op-table-baseline--container');\n (container.parentElement as HTMLTableElement).classList.add('op-table-baseline--cell');\n container.classList.remove(editCellContainer);\n container.appendChild(span);\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\nexport const internalBaselineColumn = {\n id: '__internal-baseline',\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 const ancestors = workPackage.getAncestors();\n if (_.isArray(ancestors)) {\n 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 ancestors = workPackage.getAncestors();\n const hierarchyLevel = level === undefined || null ? 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 {\n WorkPackageResource,\n} from 'core-app/features/hal/resources/work-package-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageViewBaselineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-baseline.service';\nimport { tdClassName } from 'core-app/features/work-packages/components/wp-fast-table/builders/cell-builder';\nimport { QueryColumn } from 'core-app/features/work-packages/components/wp-query/query-column';\nimport { opIconElement } from 'core-app/shared/helpers/op-icon-builder';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { getBaselineState } from '../../../wp-baseline/baseline-helpers';\n\nexport const baselineCellName = 'op-table-baseline--column-cell';\n\nexport class BaselineColumnBuilder {\n @InjectField() states:States;\n\n @InjectField() wpTableBaseline:WorkPackageViewBaselineService;\n\n @InjectField() schemaCache:SchemaCacheService;\n\n @InjectField() I18n:I18nService;\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, baselineCellName, column.id);\n td.dataset.columnId = column.id;\n\n const timestamps = workPackage.attributesByTimestamp || [];\n\n // Nothing to render if we don't have a comparison\n if (timestamps.length <= 1) {\n return td;\n }\n\n // Check if added\n const icon = this.changeIcon(workPackage);\n if (icon) {\n td.appendChild(icon);\n }\n\n return td;\n }\n\n private changeIcon(\n workPackage:WorkPackageResource,\n ):HTMLElement|null {\n const state = getBaselineState(workPackage, this.schemaCache);\n if (state === 'added') {\n const icon = opIconElement('spot-icon', 'spot-icon_1', 'spot-icon_flex', 'spot-icon_arrow-in', 'op-table-baseline--icon-added');\n icon.title = this.I18n.t('js.work_packages.baseline.addition_label');\n return icon;\n }\n\n if (state === 'removed') {\n const icon = opIconElement('spot-icon', 'spot-icon_1', 'spot-icon_flex', 'spot-icon_arrow-out', 'op-table-baseline--icon-removed');\n icon.title = this.I18n.t('js.work_packages.baseline.removal_label');\n return icon;\n }\n\n if (state === 'updated') {\n const icon = opIconElement('spot-icon', 'spot-icon_1', 'spot-icon_flex', 'spot-icon_delta-triangle', 'op-table-baseline--icon-changed');\n icon.title = this.I18n.t('js.work_packages.baseline.modification_label');\n return icon;\n }\n\n return null;\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 internalBaselineColumn,\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 {\n CellBuilder,\n tdClassName,\n} from '../cell-builder';\nimport {\n isRelationColumn,\n QueryColumn,\n} from '../../../wp-query/query-column';\nimport { WorkPackageTable } from 'core-app/features/work-packages/components/wp-fast-table/wp-fast-table';\nimport { WorkPackageViewBaselineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-baseline.service';\nimport { BaselineColumnBuilder } from 'core-app/features/work-packages/components/wp-fast-table/builders/baseline/baseline-column-builder';\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() wpTableBaseline:WorkPackageViewBaselineService;\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 // Baseline column builder\n protected baselineColumnBuilder = new BaselineColumnBuilder(this.injector);\n\n // Build the augmented columns set to render with\n protected readonly augmentedColumns:QueryColumn[] = this.buildAugmentedColumns();\n\n constructor(\n public readonly injector:Injector,\n protected workPackageTable:WorkPackageTable,\n ) {\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.wpTableBaseline.isActive()) {\n columns.unshift(internalBaselineColumn);\n }\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 }\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 case internalBaselineColumn.id:\n return this.baselineColumnBuilder.build(workPackage, column);\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 {\n groupClassNameFor,\n GroupHeaderBuilder,\n} from './group-header-builder';\nimport {\n groupByProperty,\n groupedRowClassName,\n} 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 ) {\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 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.workPackageTable.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.workPackageTable.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.getAncestors().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.getAncestors().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.getAncestors();\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.getAncestors();\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 {\n WorkPackageViewColumnsService,\n} 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 {\n CellBuilder,\n tdClassName,\n} 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';\nimport { editFieldContainerClass } from 'core-app/shared/components/fields/display/display-field-renderer';\nimport { WorkPackagesListService } from 'core-app/features/work-packages/components/wp-list/wp-list.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 @InjectField() wpListService:WorkPackagesListService;\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(\n public injector:Injector,\n public table:WorkPackageTable,\n public workPackageId:string,\n public classIdentifier:string,\n ) {\n super(injector);\n }\n\n destroy() {\n _.each(this.activeFields, (field) => {\n field.deactivate(false);\n });\n this.resourceSubscription.unsubscribe();\n }\n\n public findContainer(fieldName:string):JQuery {\n return this.rowContainer.find(`.${tdClassName}.${fieldName} .${editFieldContainerClass}`).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 // Ensure the query form is loaded before trying to set fields\n // as we require new columns to be present\n return this.wpListService\n .conditionallyLoadForm()\n .then(() => {\n this.wpTableColumns.addColumn(fieldName);\n return this.waitForContainer(fieldName);\n });\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 colspan:number;\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(\n 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\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.replaceChildren();\n this.timelineBody.replaceChildren();\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() colspan:number;\n\n @Input() table:WorkPackageTable;\n\n @Input() projectIdentifier:string;\n\n @Output() 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 { firstValueFrom, from, Observable, of } from 'rxjs';\nimport { input } from '@openproject/reactivestates';\nimport { catchError, mapTo, mergeMap, share, switchMap, take } 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 // 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 firstValueFrom(this.fromQueryParams({}, projectIdentifier));\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):Promise {\n return firstValueFrom(this.fromQueryParams(this.$state.params as { query_id?:string|null, query_props?:string }, projectIdentifier));\n }\n\n public loadForm(query:QueryResource):Promise {\n return firstValueFrom(\n this\n .apiV3Service\n .queries\n .form\n .load(query),\n )\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 = firstValueFrom(this.createQueryAndView(query, form))\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 public conditionallyLoadForm(query = this.currentQuery):Promise {\n const currentForm = this.querySpace.queryForm.value;\n\n if (!query) {\n return firstValueFrom(this.queryLoading)\n .then((loaded) => this.conditionallyLoadForm(loaded));\n }\n\n if (!currentForm || query.$links.update.href !== currentForm.href) {\n return this.loadForm(query);\n }\n\n return Promise.resolve(currentForm);\n }\n\n public get currentQuery() {\n return this.querySpace.query.value!;\n }\n\n private handleQueryLoadingError(\n error:ErrorResource,\n queryProps:{ [key:string]:unknown },\n queryId?:string|null,\n projectIdentifier?:string|null,\n ):Promise {\n this.toastService.addError(this.I18n.t('js.work_packages.faulty_query.description'), error.message);\n\n return new Promise((resolve, reject) => {\n firstValueFrom(\n this\n .apiV3Service\n .queries\n .form\n .loadWithParams(queryProps, queryId, projectIdentifier),\n )\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 as number;\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 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';\nimport { WorkPackageViewBaselineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-baseline.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 protected wpTimestamps:WorkPackageViewBaselineService,\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.wpTimestamps.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 { HalResource, 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';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\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(\n 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 const type = idFromLink(this.change.value('type')?.href);\n void this.$state.go('work-packages.new', { ...this.$state.params, type });\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 firstValueFrom,\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 = firstValueFrom(\n this\n .apiV3Service\n .withOptionalProject(projectIdentifier)\n .work_packages\n .form\n .post({}),\n );\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 // The defaults should be applied to the customFields only, hence we ignore the other filters.\n const ignoreFiltersFn = (id:string):boolean => /customField\\d+/.exec(id) === null;\n this.defaultsFromFilters(change, defaults, ignoreFiltersFn);\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(\n object:HalSource|WorkPackageChangeset,\n defaults?:HalSource,\n ignoreFiltersFn?:(id:string) => boolean,\n ):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 let except = defaults?._links ? Object.keys(defaults._links) : [];\n\n if (ignoreFiltersFn !== undefined) {\n except = except.concat(query.filters.map((f) => f.id).filter(ignoreFiltersFn));\n }\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() as object&{ _links:{ schema:{ href:string } } };\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 = (data:object) => firstValueFrom(this.apiV3Service.work_packages.post(data));\n wp.$links.updateImmediately = (data:object) => firstValueFrom(this.apiV3Service.work_packages.post(data));\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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","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 { ApiV3Filter, ApiV3FilterBuilder, FilterOperator } 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 // Timestamps options\n ts?:string;\n}\n\nexport interface QueryRequestParams {\n page?:string|number;\n pageSize:string|number;\n offset:string|number;\n 'columns[]':string[];\n showSums:boolean;\n timelineVisible:boolean;\n timelineLabels:string;\n timelineZoomLevel:string;\n displayRepresentation:string;\n includeSubprojects:boolean;\n highlightingMode:string;\n 'highlightedAttributes[]':string[];\n showHierarchies:boolean;\n groupBy:string|null;\n filters:string;\n sortBy:string;\n timestamps:string;\n valid_subset?:boolean;\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 ...this.encodeTimestamps(query),\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 private encodeTimestamps(query:QueryResource):Partial {\n if (query.timestamps) {\n return { ts: query.timestamps.join(',') };\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:Partial = {\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 if (properties.ts) {\n queryData.timestamps = properties.ts;\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(\n query:QueryResource,\n additionalParams:object = {},\n contextual:object = {},\n ):Partial {\n const queryData:Partial = {};\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 as string);\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 queryData.timestamps = query.timestamps.join(',');\n\n return _.extend(additionalParams, queryData) as Partial;\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):string[] {\n if (query.columns) {\n return query.columns.map((column:any) => column.id || idFromLink(column.href)) as string[];\n }\n if (query._links.columns) {\n return query._links.columns.map((column:HalLink) => idFromLink(column.href as string)) as string[];\n }\n\n return [];\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 {\n Component,\n Inject,\n} 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 { 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:IAPIFilter[] = this.buildQueryFilters();\n\n public text = {\n abort: this.I18n.t('js.relation_buttons.abort'),\n };\n\n constructor(\n 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 void 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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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():IAPIFilter[] {\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 const iApiFilters:IAPIFilter[] = [];\n\n filters.forEach((filter) => {\n iApiFilters.push({\n name: filter.id,\n operator: filter.operator.id,\n values: filter.values.map((f) => (typeof f === 'string' ? f : f.id)),\n });\n });\n\n return iApiFilters;\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","\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\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 HostListener,\n Input,\n} from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport {\n from,\n Observable,\n of,\n} from 'rxjs';\nimport {\n catchError,\n map,\n} from 'rxjs/operators';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { OpAutocompleterComponent } from 'core-app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport {\n ApiV3Filter,\n ApiV3FilterBuilder,\n} from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\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 { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport interface IWorkPackageAutocompleteItem extends WorkPackageResource {\n id:string,\n}\n\n@Component({\n selector: 'wp-relations-autocomplete',\n templateUrl: '../../../../../../shared/components/autocompleter/op-autocompleter/op-autocompleter.component.html',\n styleUrls: ['../../../../../../shared/components/autocompleter/op-autocompleter/op-autocompleter.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageRelationsAutocompleteComponent extends OpAutocompleterComponent {\n @Input() workPackage:WorkPackageResource;\n\n @Input() selectedRelationType:string;\n\n @Input() filterCandidatesFor:string;\n\n @Input() hiddenOverflowContainer = 'body';\n\n @InjectField(WorkPackageNotificationService) notificationService:WorkPackageNotificationService;\n\n @InjectField(SchemaCacheService) schemaCacheService:SchemaCacheService;\n\n resource:TOpAutocompleterResource = 'work_packages';\n\n appendTo = 'body';\n\n placeholder = this.I18n.t('js.relations_autocomplete.placeholder');\n\n getOptionsFn = this.getAutocompleterData.bind(this);\n\n @HostListener('keydown.escape')\n public reset() {\n this.cancel.emit();\n }\n\n changed(workPackage:IWorkPackageAutocompleteItem|null) {\n if (workPackage) {\n void this.schemaCacheService\n .ensureLoaded(workPackage)\n .then(() => {\n this.change.emit(workPackage);\n this.ngSelectInstance.close();\n });\n }\n }\n\n opened() {\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.ngSelectInstance.dropdownPanel.adjustPosition();\n jQuery(this.hiddenOverflowContainer).one('scroll', () => {\n this.ngSelectInstance.close();\n });\n }, 25);\n });\n }\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.createFilters()),\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 private createFilters():ApiV3Filter[] {\n const finalFilters = new ApiV3FilterBuilder();\n\n if (this.filters) {\n this.filters.forEach((filter) => {\n finalFilters.add(filter.name, filter.operator, filter.values);\n });\n }\n\n return finalFilters.filters;\n }\n}\n","
    \n
    \n
    \n
    \n \n \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n","import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Component, Input } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { RelationResource } from 'core-app/features/hal/resources/relation-resource';\nimport { WorkPackageRelationsService } from '../wp-relations.service';\n\n@Component({\n selector: 'wp-relations-create',\n templateUrl: './wp-relation-create.template.html',\n})\nexport class WorkPackageRelationsCreateComponent {\n @Input() readonly workPackage:WorkPackageResource;\n\n public showRelationsCreateForm = false;\n\n public selectedRelationType:string = RelationResource.DEFAULT();\n\n public selectedWpId:string;\n\n public relationTypes = RelationResource.LOCALIZED_RELATION_TYPES(false);\n\n public isDisabled = false;\n\n public text = {\n abort: this.I18n.t('js.relation_buttons.abort'),\n relationType: this.I18n.t('js.relation_buttons.relation_type'),\n addNewRelation: this.I18n.t('js.relation_buttons.add_new_relation'),\n };\n\n constructor(readonly I18n:I18nService,\n protected wpRelations:WorkPackageRelationsService,\n protected notificationService:WorkPackageNotificationService,\n protected halEvents:HalEventsService) {\n }\n\n public createRelation() {\n if (!this.selectedRelationType || !this.selectedWpId) {\n return;\n }\n\n this.isDisabled = true;\n this.createCommonRelation()\n .catch(() => this.isDisabled = false)\n .then(() => this.isDisabled = false);\n }\n\n public onSelected(workPackage?:WorkPackageResource) {\n if (workPackage) {\n this.selectedWpId = workPackage.id!;\n this.createCommonRelation();\n }\n }\n\n protected createCommonRelation() {\n return this.wpRelations.addCommonRelation(this.workPackage.id!,\n this.selectedRelationType,\n this.selectedWpId)\n .then((relation) => {\n this.halEvents.push(this.workPackage, {\n eventType: 'association',\n relatedWorkPackage: relation.id!,\n relationType: this.selectedRelationType,\n });\n this.notificationService.showSave(this.workPackage);\n this.toggleRelationsCreateForm();\n })\n .catch((err) => {\n this.notificationService.handleRawError(err, this.workPackage);\n this.toggleRelationsCreateForm();\n });\n }\n\n public toggleRelationsCreateForm() {\n this.showRelationsCreateForm = !this.showRelationsCreateForm;\n // Reset value\n this.selectedWpId = '';\n }\n}\n","
    \n
    \n \n
    \n \n \n \n \n
    \n\n\n\n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 {\n WorkPackageRelationsHierarchyService,\n} 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';\nimport {\n WorkPackageIsolatedQuerySpaceDirective,\n} from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\n\n@Component({\n selector: 'wp-relations-hierarchy',\n templateUrl: './wp-relations-hierarchy.template.html',\n hostDirectives: [WorkPackageIsolatedQuerySpaceDirective],\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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","\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","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 '@openproject/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 {\n firstValueFrom,\n Observable,\n} 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 firstValueFrom(this.requireAndStream(id, force));\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","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Inject,\n OnInit,\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 { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\n\n@Component({\n templateUrl: './wp-share.modal.html',\n styleUrls: ['./wp-share.modal.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageShareModalComponent extends OpModalComponent implements OnInit {\n private workPackage:WorkPackageResource;\n public frameSrc:string;\n\n text = {\n title: this.I18n.t('js.work_packages.sharing.title'),\n button_close: this.I18n.t('js.button_close'),\n };\n\n constructor(\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n readonly elementRef:ElementRef,\n protected pathHelper:PathHelperService,\n ) {\n super(locals, cdRef, elementRef);\n\n this.workPackage = this.locals.workPackage as WorkPackageResource;\n this.frameSrc = this.pathHelper.workPackageSharePath(this.workPackage.id as string);\n }\n\n ngOnInit() {\n super.ngOnInit();\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 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","\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
    \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 { 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 @Input() 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\nimport * as moment from 'moment-timezone';\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","\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 OnInit,\n} 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 { 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 { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ProjectStoragesResourceService } from 'core-app/core/state/project-storages/project-storages.service';\nimport { IProjectStorage } from 'core-app/core/state/project-storages/project-storage.model';\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 @Input() workPackage:WorkPackageResource;\n\n text = {\n attachments: {\n label: this.i18n.t('js.label_attachments'),\n },\n };\n\n showAttachmentHeader$:Observable;\n\n projectStorages: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 storagesResourceService:StoragesResourceService,\n private readonly projectStoragesResourceService:ProjectStoragesResourceService,\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.projectStorages = this\n .projectStoragesResourceService\n .requireCollection({ filters: [['projectId', '=', [project.id]]] });\n\n this.allowManageFileLinks$ = this\n .currentUserService\n .hasCapabilities$('file_links/manage', project.id);\n\n this.showAttachmentHeader$ = combineLatest(\n [\n this.projectStorages,\n canViewFileLinks,\n ],\n ).pipe(\n map(([storages, viewPermission]) => storages.length > 0 && viewPermission),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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} 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 @Input() public workPackage:WorkPackageResource;\n\n public workPackageId:string;\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 @Input() 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","
    \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 Input,\n 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 @Input() public workPackage:WorkPackageResource;\n\n public workPackageId:string;\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 '@openproject/reactivestates';\nimport {\n filter,\n map,\n take,\n} from 'rxjs/operators';\nimport {\n firstValueFrom,\n Observable,\n of,\n} 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 firstValueFrom(this.requireAndStream(workPackage, force));\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","
    \n
    \n \n
    \n\n
    \n \n \n \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 } from 'rxjs';\nimport { distinctUntilChanged, first, map } 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 { 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 { ProjectStoragesResourceService } from 'core-app/core/state/project-storages/project-storages.service';\nimport { IProjectStorage } from 'core-app/core/state/project-storages/project-storage.model';\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 projectStorages = 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 displayFieldService:DisplayFieldService,\n private readonly projectsResourceService:ProjectsResourceService,\n private readonly projectStoragesService:ProjectStoragesResourceService,\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.projectStorages.next([]);\n } else {\n const project = resource.project as unknown&{ href:string, id:string };\n combineLatest([\n this.projectsResourceService.requireEntity(project.href),\n this.projectStoragesService.requireCollection({ filters: [['projectId', '=', [project.id]]] }),\n this.currentUserService.hasCapabilities$('file_links/manage', project.id),\n ])\n .pipe(\n map(([p, projectStorages, manageFileLinks]) => {\n if (!p._links.storages || !manageFileLinks) {\n return [];\n }\n\n return projectStorages;\n }),\n first(),\n )\n .subscribe((ps) => {\n this.projectStorages.next(ps);\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 \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
    \n

    \n
    \n
    \n \n
    \n
    \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 selector: 'op-wp-table-configuration-settings-tab',\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(\n 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 void this.wpTableGroupBy\n .onReady()\n .then(() => {\n this.availableGroups = _.sortBy(this.wpTableGroupBy.available, 'name');\n this.currentGroup = this.wpTableGroupBy.current || this.availableGroups[0];\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 { 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
    \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';\nimport { repositionDropdownBugfix } from 'core-app/shared/components/autocompleter/op-autocompleter/autocompleter.helper';\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:unknown) {\n repositionDropdownBugfix(component);\n }\n\n private setSelectedValues() {\n const currentValues = this.wpTableHighlight.current.selectedAttributes;\n\n if (currentValues) {\n this.selectedAttributes = currentValues;\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.gantt_chart.label'),\n display_timelines: this.I18n.t('js.gantt_chart.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.gantt_chart.zoom.description'),\n days: this.I18n.t('js.gantt_chart.zoom.days'),\n weeks: this.I18n.t('js.gantt_chart.zoom.weeks'),\n months: this.I18n.t('js.gantt_chart.zoom.months'),\n quarters: this.I18n.t('js.gantt_chart.zoom.quarters'),\n years: this.I18n.t('js.gantt_chart.zoom.years'),\n auto: this.I18n.t('js.gantt_chart.zoom.auto'),\n },\n labels: {\n title: this.I18n.t('js.gantt_chart.labels.title'),\n description: this.I18n.t('js.gantt_chart.labels.description'),\n bar: this.I18n.t('js.gantt_chart.labels.bar'),\n none: this.I18n.t('js.gantt_chart.filter.noneSelection'),\n left: this.I18n.t('js.gantt_chart.labels.left'),\n right: this.I18n.t('js.gantt_chart.labels.right'),\n farRight: this.I18n.t('js.gantt_chart.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 &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","\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';\nimport { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\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, _]:[QueryFormResource, QueryResource]) => {\n this.wpStatesInitialization.updateStatesFromForm(query, form);\n\n return form;\n })\n .catch((error) => this.notificationService.handleRawError(error));\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';\nimport { OpBaselineComponent } from 'core-app/features/work-packages/components/wp-baseline/baseline/baseline.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: 'baseline',\n name: this.I18n.t('js.baseline.toggle_title'),\n componentClass: OpBaselineComponent,\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.gantt_chart.label'),\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 { HalLink } from 'core-app/features/hal/hal-link/hal-link';\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.workPackagesBulkEditPath(),\n },\n {\n text: I18n.t('js.work_packages.bulk_actions.move'),\n key: 'move',\n link: 'move',\n href: this.PathHelper.workPackagesBulkMovePath(),\n },\n {\n text: I18n.t('js.work_packages.bulk_actions.copy'),\n key: 'copy',\n link: 'copy',\n href: this.PathHelper.workPackagesBulkCopyPath(),\n },\n {\n text: I18n.t('js.work_packages.bulk_actions.delete'),\n key: 'delete',\n link: 'delete',\n href: this.PathHelper.workPackagesBulkDeletePath(),\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: this.linkForAction(workPackage, allowedAction),\n });\n });\n\n return singularPermittedActions;\n }\n\n public linkForAction(workPackage:WorkPackageResource, action:WorkPackageAction):string|undefined {\n let link:string|undefined;\n switch (action.key) {\n case 'copy_link_to_clipboard':\n link = this.PathHelper.workPackageShortPath(workPackage.id as string);\n break;\n default:\n link = action.link ? (workPackage[action.link] as HalLink).href as string : undefined;\n }\n\n return link;\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[action.link] !== undefined) {\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:WorkPackageAction) => {\n if (workPackage[action.link as string] !== undefined) {\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n// ++ Ng1FieldControlsWrapper,\n\nimport { Component, ElementRef, Input } from '@angular/core';\nimport {\n WorkPackageTableConfigurationObject,\n} from 'core-app/features/work-packages/components/wp-table/wp-table-configuration';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\n\n@Component({\n template: `\n \n \n `,\n})\nexport class EmbeddedTablesMacroComponent {\n @Input() public queryProps:object;\n\n public configuration:WorkPackageTableConfigurationObject = {\n actionsColumnEnabled: false,\n columnMenuEnabled: false,\n contextMenuEnabled: false,\n };\n\n constructor(\n readonly elementRef:ElementRef,\n ) {\n populateInputsFromDataset(this);\n }\n}\n","import {\n Component, ElementRef, Input,\n} from '@angular/core';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\nimport {\n WorkPackageIsolatedQuerySpaceDirective,\n} from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\n\nexport const wpTableEntrySelector = 'wp-embedded-table-entry';\n\n@Component({\n selector: wpTableEntrySelector,\n hostDirectives: [WorkPackageIsolatedQuerySpaceDirective],\n template: `\n \n \n `,\n})\nexport class WorkPackageEmbeddedTableEntryComponent {\n @Input() public queryProps:unknown;\n\n @Input() public configuration:unknown;\n\n @Input() public initialLoadingIndicator = true;\n\n constructor(readonly elementRef:ElementRef) {\n populateInputsFromDataset(this);\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Directive,\n Input,\n 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';\nimport { firstValueFrom } from 'rxjs';\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 void this.loadQuery(true, false);\n }\n\n ngOnChanges(changes:SimpleChanges) {\n if (this.initialized && (changes.queryId || changes.queryProps)) {\n void 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():object {\n const query = this.querySpace.query.value as QueryResource;\n this.wpStatesInitialization.applyToQuery(query);\n\n return this.urlParamsHelper.buildV3GetQueryFromQueryResource(query) as object;\n }\n\n public buildUrlParams() {\n const query = this.querySpace.query.value as QueryResource;\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 as QueryResource;\n const pagination = this.wpTablePagination.paginationObject;\n\n if (firstPage) {\n pagination.offset = 1;\n }\n\n const params = this.urlParamsHelper.buildV3GetQueryFromQueryResource(query, pagination) as object;\n const promise = firstValueFrom(\n this\n .wpListService\n .loadQueryFromExisting(query, params, this.queryProjectScope),\n )\n .then((updated) => this.wpStatesInitialization.updateQuerySpace(updated, updated.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 { AfterViewInit, Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport {\n WorkPackageViewTimelineService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport {\n WorkPackageViewPaginationService,\n} 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 {\n OpTableActionsService,\n} 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 {\n WpTableConfigurationModalComponent,\n} 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 {\n WorkPackageEmbeddedBaseComponent,\n} 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 { distinctUntilChanged, map, take, withLatestFrom } from 'rxjs/operators';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport {\n KeepTabService,\n} 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';\nimport { firstValueFrom } from 'rxjs';\nimport { QueryRequestParams } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\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:Partial = {};\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 = firstValueFrom(\n this\n .wpListService\n .loadQueryFromExisting(query, params, this.queryProjectScope),\n )\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 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 public loadQuery(visible = true, firstPage = false):Promise {\n\n if (this.loadedQuery) {\n const query = this.loadedQuery;\n this.loadedQuery = undefined;\n this.initializeStates(query);\n return Promise.resolve(query);\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 // Also use a valid subset to ensure we get a valid response.\n this.queryProps.valid_subset = true;\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 as 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';\nimport {\n WorkPackageIsolatedQuerySpaceDirective,\n} from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\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 hostDirectives: [WorkPackageIsolatedQuerySpaceDirective],\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|object;\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 as string;\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","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","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';\nimport {\n WorkPackageIsolatedQuerySpaceDirective,\n} from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\n\n@Component({\n templateUrl: './external-query-configuration.template.html',\n hostDirectives: [WorkPackageIsolatedQuerySpaceDirective],\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","
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 Input,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n QueryColumn,\n RelationQueryColumn,\n TypeRelationQueryColumn,\n} 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 {\n QUERY_SORT_BY_ASC,\n QUERY_SORT_BY_DESC,\n} 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';\nimport { WorkPackageViewBaselineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-baseline.service';\n\n@Component({\n selector: 'sortHeader',\n templateUrl: './sort-header.directive.html',\n})\nexport class SortHeaderDirective extends UntilDestroyedMixin implements AfterViewInit {\n @Input() headerColumn:QueryColumn;\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 baselineIncompatible: this.I18n.t('js.work_packages.baseline.column_incompatible'),\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 baselineIncompatible = false;\n\n private currentSortDirection:any;\n\n constructor(\n private wpTableHierarchies:WorkPackageViewHierarchiesService,\n private wpTableSortBy:WorkPackageViewSortByService,\n private wpTableGroupBy:WorkPackageViewGroupByService,\n private wpTableBaseline:WorkPackageViewBaselineService,\n private wpTableRelationColumns:WorkPackageViewRelationColumnsService,\n private elementRef:ElementRef,\n private cdRef:ChangeDetectorRef,\n private I18n:I18nService,\n ) {\n super();\n }\n\n ngAfterViewInit() {\n setTimeout(() => this.initialize());\n }\n\n private initialize():void {\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\n .wpTableBaseline\n .live$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n this.baselineIncompatible = this.wpTableBaseline.isActive() && this.wpTableBaseline.isIncompatibleColumn(this.headerColumn.id);\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 if (this.currentSortDirection) {\n this.elementRef.nativeElement.classList.add('active-column');\n } else {\n this.elementRef.nativeElement.classList.remove('active-column');\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 OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { combineLatest } from 'rxjs';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n WorkPackageViewPaginationService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-pagination.service';\nimport {\n WorkPackageViewPagination,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-table-pagination';\nimport {\n WorkPackageViewSortByService,\n} 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 { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { TablePaginationComponent } from 'core-app/shared/components/table-pagination/table-pagination.component';\nimport { 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(\n protected paginationService:PaginationService,\n protected cdRef:ChangeDetectorRef,\n protected wpTablePagination:WorkPackageViewPaginationService,\n readonly querySpace:IsolatedQuerySpace,\n readonly wpTableSortBy:WorkPackageViewSortByService,\n readonly I18n:I18nService,\n ) {\n super(paginationService, cdRef, I18n);\n }\n\n ngOnInit() {\n super.ngOnInit();\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 '@openproject/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 visibleBeforeTodayInZoomLevel:number = 2;\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';\nimport { firstValueFrom } from 'rxjs';\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 // eslint-disable-next-line @typescript-eslint/no-misused-promises\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 firstValueFrom(this.apiV3Service.work_packages.id(wpId).get());\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 firstValueFrom(this.apiV3Service.work_packages.id(wpId).get());\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 // eslint-disable-next-line @typescript-eslint/no-misused-promises\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 firstValueFrom(this.apiV3Service.work_packages.id(wpId).get());\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) => firstValueFrom(this.apiV3Service.work_packages.id(wpId).get()),\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 {{text.tableSummary}}\n \n {{text.tableSummaryHints}}\n \n \n \n \n
    \n \n
    \n \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.noResults.title}}\n {{text.noResults.description}}\n \n \n \n \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 EventEmitter,\n Injector,\n Input,\n NgZone,\n OnInit,\n 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 {\n TableEventComponent,\n TableHandlerRegistry,\n} 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';\nimport { WorkPackageViewBaselineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-baseline.service';\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.component.html',\n styleUrls: ['./wp-table.component.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 baselineEnabled: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(\n 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 readonly wpTableBaseline:WorkPackageViewBaselineService,\n ) {\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 this.wpTableBaseline.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\n this.timelineVisible = timelines.visible;\n\n this.manualSortEnabled = this.wpTableSortBy.isManualSortingMode;\n this.baselineEnabled = this.wpTableBaseline.isActive();\n this.limitedResults = this.manualSortEnabled && results.total > results.count;\n\n // Total columns = all available columns + id + context menu\n this.numTableColumns = this.columns.length + 2;\n\n if (this.manualSortEnabled) {\n this.numTableColumns += 1;\n }\n\n if (this.baselineEnabled) {\n this.numTableColumns += 1;\n }\n\n if (this.workPackageTable) {\n this.workPackageTable.colspan = this.numTableColumns;\n }\n\n if (this.scrollSyncUpdate && this.timelineVisible !== timelines.visible) {\n this.scrollSyncUpdate(timelines.visible);\n }\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.workPackageTable.colspan = this.numTableColumns;\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","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","import * as moment from 'moment/moment';\n\nfunction paddedNumber(input:number):string {\n return input.toString().padStart(2, '0');\n}\n\nexport function formatElapsedTime(startTime:string):string {\n const start = moment(startTime);\n const now = moment();\n const duration = now.diff(start, 'seconds');\n\n const hours = Math.floor(duration / 3600);\n const minutes = Math.floor((duration - (hours * 3600)) / 60);\n const seconds = duration - (hours * 3600) - (minutes * 60);\n\n return [\n paddedNumber(hours),\n paddedNumber(minutes),\n paddedNumber(seconds),\n ].join(':');\n}\n","\n \n \n \n \n {{ elapsed$ | async }}\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 ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Injector,\n Input,\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 { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { TimeEntryCreateService } from 'core-app/shared/components/time_entries/create/create.service';\nimport {\n filter,\n map,\n switchMap,\n} from 'rxjs/operators';\nimport {\n firstValueFrom,\n from,\n Observable,\n timer,\n} from 'rxjs';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport * as moment from 'moment';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { TimeEntryTimerService } from 'core-app/shared/components/time_entries/services/time-entry-timer.service';\nimport { formatElapsedTime } from 'core-app/features/work-packages/components/wp-timer-button/time-formatter.helper';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { StopExistingTimerModalComponent } from 'core-app/shared/components/time_entries/timer/stop-existing-timer-modal.component';\nimport { TimeEntryEditService } from 'core-app/shared/components/time_entries/edit/edit.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\n\n@Component({\n selector: 'op-wp-timer-button',\n templateUrl: './wp-timer-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkPackageTimerButtonComponent extends UntilDestroyedMixin {\n @Input() public workPackage:WorkPackageResource;\n\n timer$ = this.timeEntryService.activeTimer$;\n\n elapsed$:Observable = timer(0, 1000)\n .pipe(\n switchMap(() => this.timer$),\n filter((timeEntry) => timeEntry !== null),\n map((timeEntry:TimeEntryResource) => formatElapsedTime(timeEntry.createdAt as string)),\n );\n\n text = {\n workPackage: this.I18n.t('js.label_work_package'),\n start_timer: this.I18n.t('js.timer.start_new_timer'),\n stop_timer: this.I18n.t('js.timer.button_stop'),\n timer_already_stopped: this.I18n.t('js.timer.timer_already_stopped'),\n };\n\n constructor(\n readonly injector:Injector,\n readonly I18n:I18nService,\n readonly apiV3Service:ApiV3Service,\n readonly timeEntryService:TimeEntryTimerService,\n readonly timeEntryEditService:TimeEntryEditService,\n readonly timeEntryCreateService:TimeEntryCreateService,\n readonly halEditing:HalResourceEditingService,\n readonly modalService:OpModalService,\n readonly schemaCache:SchemaCacheService,\n readonly timezoneService:TimezoneService,\n readonly toastService:ToastService,\n readonly cdRef:ChangeDetectorRef,\n ) {\n super();\n }\n\n activeForWorkPackage(entry:TimeEntryResource|null):boolean {\n return !!entry && entry.workPackage.href === this.workPackage.href;\n }\n\n clear():void {\n this.timeEntryService.timer$.next(null);\n }\n\n async stop():Promise {\n const active = await firstValueFrom(this.timeEntryService.refresh());\n if (!active) {\n return this.toastService.addWarning(this.text.timer_already_stopped);\n }\n\n return this.timeEntryEditService.stopTimerAndEdit(active);\n }\n\n start():void {\n this\n .timeEntryService\n .refresh()\n .subscribe((active) => {\n if (active) {\n this.showStopModal(active)\n .then(() => this.stop().then(() => this.startTimer()))\n .catch(() => undefined);\n } else {\n this.startTimer();\n }\n });\n }\n\n private startTimer():void {\n this.timeEntryCreateService\n .createNewTimeEntry(moment(), this.workPackage, true)\n .pipe(\n switchMap((changeset) => from(this.halEditing.save(changeset))),\n map((result) => result.resource as TimeEntryResource),\n )\n .subscribe((active) => {\n this.timeEntryService.timer$.next(active);\n });\n }\n\n private showStopModal(active:TimeEntryResource):Promise {\n return new Promise((resolve, reject) => {\n this\n .modalService\n .show(StopExistingTimerModalComponent, this.injector, { timer: active })\n .subscribe((modal) => modal.closingEvent.subscribe(() => {\n if (modal.confirmed) {\n resolve();\n } else {\n reject();\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 { 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 '@openproject/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 } from '@angular/core';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport {\n OpTableActionsService,\n} from 'core-app/features/work-packages/components/wp-table/table-actions/table-actions.service';\nimport {\n WorkPackageViewRelationColumnsService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-relation-columns.service';\nimport {\n WorkPackageViewPaginationService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-pagination.service';\nimport {\n WorkPackageViewGroupByService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport {\n WorkPackageViewHierarchiesService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-hierarchy.service';\nimport {\n WorkPackageViewSortByService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sort-by.service';\nimport {\n WorkPackageViewColumnsService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport {\n WorkPackageViewFiltersService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport {\n WorkPackageViewTimelineService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\nimport {\n WorkPackageViewSelectionService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-selection.service';\nimport {\n WorkPackageViewSumService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-sum.service';\nimport {\n WorkPackageViewAdditionalElementsService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-additional-elements.service';\nimport {\n WorkPackageViewHighlightingService,\n} 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 {\n WorkPackageStatesInitializationService,\n} from 'core-app/features/work-packages/components/wp-list/wp-states-initialization.service';\nimport {\n WorkPackageViewFocusService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport {\n HalResourceEditingService,\n} 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 {\n WorkPackageRelationsHierarchyService,\n} from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service';\nimport {\n WorkPackageFiltersService,\n} from 'core-app/features/work-packages/components/filters/wp-filters/wp-filters.service';\nimport {\n WorkPackageContextMenuHelperService,\n} from 'core-app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service';\nimport {\n WorkPackageInlineCreateService,\n} from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.service';\nimport {\n WpChildrenInlineCreateService,\n} from 'core-app/features/work-packages/components/wp-relations/embedded/children/wp-children-inline-create.service';\nimport {\n WpRelationInlineCreateService,\n} from 'core-app/features/work-packages/components/wp-relations/embedded/relations/wp-relation-inline-create.service';\nimport {\n WorkPackagesListChecksumService,\n} from 'core-app/features/work-packages/components/wp-list/wp-list-checksum.service';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport {\n TableDragActionsRegistryService,\n} from 'core-app/features/work-packages/components/wp-table/drag-and-drop/actions/table-drag-actions-registry.service';\nimport {\n WorkPackageViewOrderService,\n} 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 {\n WorkPackageCardViewService,\n} from 'core-app/features/work-packages/components/wp-card-view/services/wp-card-view.service';\nimport {\n WorkPackageViewDisplayRepresentationService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\nimport {\n WorkPackageViewIncludeSubprojectsService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-include-subprojects.service';\nimport {\n WorkPackageViewHierarchyIdentationService,\n} 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 {\n WorkPackageNotificationService,\n} 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 {\n WorkPackageViewCollapsedGroupsService,\n} 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';\nimport {\n WorkPackageViewBaselineService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-baseline.service';\nimport { TimeEntryEditService } from 'core-app/shared/components/time_entries/edit/edit.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 standalone: true,\n selector: '[opWorkPackageIsolatedQuerySpace]',\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 WorkPackageViewBaselineService,\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 TimeEntryEditService,\n WorkPackageCreateService,\n\n WorkPackageStatesInitializationService,\n\n // Table Drag & Drop actions\n TableDragActionsRegistryService,\n ],\n})\nexport class WorkPackageIsolatedQuerySpaceDirective {\n constructor(\n public querySpace:IsolatedQuerySpace,\n elementRef:ElementRef,\n ) {\n debugLog('Opening isolated query space in %O', 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,\n Component,\n ElementRef,\n Injector,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n IToast,\n ToastService,\n} 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 {\n filter,\n takeUntil,\n take,\n} from 'rxjs/operators';\nimport {\n input,\n InputState,\n} from '@openproject/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 {\n debugLog,\n timeOutput,\n} from 'core-app/shared/helpers/debug_output';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport {\n combineLatest,\n firstValueFrom,\n Observable,\n} 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.gantt_chart.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 firstValueFrom(\n this\n .daysService\n .requireNonWorkingYears$(start, end)\n .pipe(take(1)),\n );\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.gantt_chart.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.gantt_chart.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 '@openproject/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 { calculatePositionValueForDayCountingPx, 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 const timelineSide = document.querySelector('.work-packages-tabletimeline--timeline-side');\n if (timelineSide !== null && vp.settings.zoomLevel !== 'auto') {\n const visibleMomentBeforeToday = vp.now.clone().subtract(vp.settings.visibleBeforeTodayInZoomLevel, vp.settings.zoomLevel)\n const visibleDaysBeforeToday = visibleMomentBeforeToday.diff(vp.dateDisplayStart, 'days');\n const visibleDaysBeforeTodayPositionPixels = calculatePositionValueForDayCountingPx(vp, visibleDaysBeforeToday);\n timelineSide.scrollLeft = visibleDaysBeforeTodayPositionPixels;\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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.testSelector = `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 @HostBinding('class.attributes-group--attributes') parentClassName = 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';\nimport {\n StorageInformationService,\n} from 'core-app/shared/components/storages/storage-information/storage-information.service';\nimport {\n StorageLoginButtonComponent,\n} from 'core-app/shared/components/storages/storage-login-button/storage-login-button.component';\n\n@NgModule({\n imports: [\n CommonModule,\n IconModule,\n OpSpotModule,\n OpSharedModule,\n ],\n declarations: [\n StorageComponent,\n StorageLoginButtonComponent,\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 StorageInformationService,\n ],\n})\nexport class OpenprojectStoragesModule {}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { CUSTOM_ELEMENTS_SCHEMA, Injector, NgModule } from '@angular/core';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { OpenprojectFieldsModule } from 'core-app/shared/components/fields/openproject-fields.module';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport {\n WorkPackageEmbeddedTableComponent,\n} from 'core-app/features/work-packages/components/wp-table/embedded/wp-embedded-table.component';\nimport {\n WorkPackageEmbeddedTableEntryComponent,\n} from 'core-app/features/work-packages/components/wp-table/embedded/wp-embedded-table-entry.component';\nimport {\n WorkPackageTablePaginationComponent,\n} from 'core-app/features/work-packages/components/wp-table/table-pagination/wp-table-pagination.component';\nimport {\n WorkPackageTimelineTableController,\n} from 'core-app/features/work-packages/components/wp-table/timeline/container/wp-timeline-container.directive';\nimport {\n WorkPackageInlineCreateComponent,\n} from 'core-app/features/work-packages/components/wp-inline-create/wp-inline-create.component';\nimport {\n OpTypesContextMenuDirective,\n} from 'core-app/shared/components/op-context-menu/handlers/op-types-context-menu.directive';\nimport {\n OpColumnsContextMenu,\n} from 'core-app/shared/components/op-context-menu/handlers/op-columns-context-menu.directive';\nimport {\n OpSettingsMenuDirective,\n} from 'core-app/shared/components/op-context-menu/handlers/op-settings-dropdown-menu.directive';\nimport {\n WorkPackageStatusDropdownDirective,\n} from 'core-app/shared/components/op-context-menu/handlers/wp-status-dropdown-menu.directive';\nimport {\n WorkPackageCreateSettingsMenuDirective,\n} from 'core-app/shared/components/op-context-menu/handlers/wp-create-settings-menu.directive';\nimport {\n WorkPackageSingleContextMenuDirective,\n} from 'core-app/shared/components/op-context-menu/wp-context-menu/wp-single-context-menu';\nimport {\n WorkPackageTimelineHeaderController,\n} from 'core-app/features/work-packages/components/wp-table/timeline/header/wp-timeline-header.directive';\nimport {\n WorkPackageTableTimelineRelations,\n} from 'core-app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-relations.directive';\nimport {\n WorkPackageTableTimelineStaticElements,\n} from 'core-app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-static-elements.directive';\nimport {\n WorkPackageTableTimelineGrid,\n} from 'core-app/features/work-packages/components/wp-table/timeline/grid/wp-timeline-grid.directive';\nimport {\n WorkPackageTimelineButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-timeline-toggle-button/wp-timeline-toggle-button.component';\nimport {\n WorkPackageOverviewTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/overview-tab/overview-tab.component';\nimport {\n WorkPackageStatusButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-status-button/wp-status-button.component';\nimport {\n WorkPackageReplacementLabelComponent,\n} from 'core-app/features/work-packages/components/wp-edit/wp-edit-field/wp-replacement-label.component';\nimport {\n NewestActivityOnOverviewComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-on-overview.component';\nimport {\n WorkPackageActivityTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/activity-tab.component';\nimport { OpenprojectAttachmentsModule } from 'core-app/shared/components/attachments/openproject-attachments.module';\nimport {\n WpCustomActionComponent,\n} from 'core-app/features/work-packages/components/wp-custom-actions/wp-custom-actions/wp-custom-action.component';\nimport {\n WpCustomActionsComponent,\n} from 'core-app/features/work-packages/components/wp-custom-actions/wp-custom-actions.component';\nimport {\n WorkPackageRelationsTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/relations-tab/relations-tab.component';\nimport {\n WorkPackageRelationsComponent,\n} from 'core-app/features/work-packages/components/wp-relations/wp-relations.component';\nimport {\n WorkPackageRelationsGroupComponent,\n} from 'core-app/features/work-packages/components/wp-relations/wp-relations-group/wp-relations-group.component';\nimport {\n WorkPackageRelationRowComponent,\n} from 'core-app/features/work-packages/components/wp-relations/wp-relation-row/wp-relation-row.component';\nimport {\n WorkPackageRelationsCreateComponent,\n} from 'core-app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-create.component';\nimport {\n WorkPackageRelationsHierarchyComponent,\n} from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.directive';\nimport {\n WorkPackageCreateButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-create-button/wp-create-button.component';\nimport {\n WorkPackageFilterButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-filter-button/wp-filter-button.component';\nimport {\n WorkPackageDetailsViewButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-details-view-button/wp-details-view-button.component';\nimport {\n WorkPackageFoldToggleButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-fold-toggle-button/wp-fold-toggle-button.component';\nimport {\n WpTableConfigurationModalComponent,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\nimport {\n WpTableConfigurationColumnsTabComponent,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/columns-tab.component';\nimport {\n WpTableConfigurationDisplaySettingsTabComponent,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/display-settings-tab.component';\nimport {\n WpTableConfigurationFiltersTab,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/filters-tab.component';\nimport {\n WpTableConfigurationSortByTabComponent,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/sort-by-tab.component';\nimport {\n WpTableConfigurationTimelinesTabComponent,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/timelines-tab.component';\nimport {\n WpTableConfigurationHighlightingTabComponent,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/tabs/highlighting-tab.component';\nimport {\n WpTableConfigurationRelationSelectorComponent,\n} from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration-relation-selector';\nimport {\n WorkPackageWatchersTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/watchers-tab.component';\nimport {\n WorkPackageWatcherEntryComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watcher-entry.component';\nimport {\n WorkPackageNewSplitViewComponent,\n} from 'core-app/features/work-packages/components/wp-new/wp-new-split-view.component';\nimport {\n WorkPackageNewFullViewComponent,\n} from 'core-app/features/work-packages/components/wp-new/wp-new-full-view.component';\nimport {\n EmbeddedTablesMacroComponent,\n} from 'core-app/features/work-packages/components/wp-table/embedded/embedded-tables-macro.component';\nimport { OpenprojectEditorModule } from 'core-app/shared/components/editor/openproject-editor.module';\nimport {\n WorkPackageTableSumsRowController,\n} from 'core-app/features/work-packages/components/wp-table/wp-table-sums-row/wp-table-sums-row.directive';\nimport {\n ExternalQueryConfigurationComponent,\n} from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.component';\nimport {\n ExternalQueryConfigurationService,\n} from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.service';\nimport {\n ExternalRelationQueryConfigurationComponent,\n} from 'core-app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.component';\nimport {\n ExternalRelationQueryConfigurationService,\n} from 'core-app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.service';\nimport {\n WorkPackagesListInvalidQueryService,\n} from 'core-app/features/work-packages/components/wp-list/wp-list-invalid-query.service';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport {\n WorkPackageWatchersService,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/watchers-tab/wp-watchers.service';\nimport {\n WorkPackagesActivityService,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/activity-panel/wp-activity.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport {\n WorkPackageChildrenQueryComponent,\n} from 'core-app/features/work-packages/components/wp-relations/embedded/children/wp-children-query.component';\nimport {\n WpRelationInlineAddExistingComponent,\n} from 'core-app/features/work-packages/components/wp-relations/embedded/inline/add-existing/wp-relation-inline-add-existing.component';\nimport {\n WorkPackageRelationQueryComponent,\n} from 'core-app/features/work-packages/components/wp-relations/embedded/relations/wp-relation-query.component';\nimport { WorkPackagesBaseComponent } from 'core-app/features/work-packages/routing/wp-base/wp--base.component';\nimport {\n WorkPackageSplitViewComponent,\n} from 'core-app/features/work-packages/routing/wp-split-view/wp-split-view.component';\nimport {\n WorkPackagesFullViewComponent,\n} from 'core-app/features/work-packages/routing/wp-full-view/wp-full-view.component';\nimport { QueryFiltersService } from 'core-app/features/work-packages/components/wp-query/query-filters.service';\nimport {\n WorkPackageCardViewComponent,\n} from 'core-app/features/work-packages/components/wp-card-view/wp-card-view.component';\nimport {\n WorkPackageRelationsService,\n} from 'core-app/features/work-packages/components/wp-relations/wp-relations.service';\nimport { OpenprojectBcfModule } from 'core-app/features/bim/bcf/openproject-bcf.module';\nimport {\n WorkPackageRelationsAutocompleteComponent,\n} from 'core-app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-autocomplete/wp-relations-autocomplete.component';\nimport {\n CustomDateActionAdminComponent,\n} from 'core-app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.component';\nimport {\n WorkPackagesTableConfigMenuComponent,\n} from 'core-app/features/work-packages/components/wp-table/config-menu/config-menu.component';\nimport {\n WorkPackageViewToggleButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-view-toggle-button/work-package-view-toggle-button.component';\nimport {\n WorkPackageViewDropdownMenuDirective,\n} from 'core-app/shared/components/op-context-menu/handlers/wp-view-dropdown-menu.directive';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { OpenprojectProjectsModule } from 'core-app/features/projects/openproject-projects.module';\nimport {\n WorkPackageNotificationService,\n} from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport {\n WorkPackageEditActionsBarComponent,\n} from 'core-app/features/work-packages/components/edit-actions-bar/wp-edit-actions-bar.component';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport {\n WorkPackageSingleCardComponent,\n} from 'core-app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component';\nimport {\n WorkPackageListViewComponent,\n} from 'core-app/features/work-packages/routing/wp-list-view/wp-list-view.component';\nimport {\n PartitionedQuerySpacePageComponent,\n} from 'core-app/features/work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component';\nimport {\n WorkPackageViewPageComponent,\n} from 'core-app/features/work-packages/routing/wp-view-page/wp-view-page.component';\nimport {\n WorkPackageSettingsButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-settings-button/wp-settings-button.component';\nimport { BackButtonComponent } from 'core-app/features/work-packages/components/back-routing/back-button.component';\nimport { WorkPackagesTableComponent } from 'core-app/features/work-packages/components/wp-table/wp-table.component';\nimport {\n WorkPackageGroupToggleDropdownMenuDirective,\n} from 'core-app/shared/components/op-context-menu/handlers/wp-group-toggle-dropdown-menu.directive';\nimport {\n OpenprojectAutocompleterModule,\n} from 'core-app/shared/components/autocompleter/openproject-autocompleter.module';\nimport { OpWpTabsModule } from 'core-app/features/work-packages/components/wp-tabs/wp-tabs.module';\nimport {\n EditFieldControlsModule,\n} from 'core-app/shared/components/fields/edit/field-controls/edit-field-controls.module';\nimport { WpTableExportModalComponent } from 'core-app/shared/components/modals/export-modal/wp-table-export.modal';\nimport {\n WpButtonMacroModalComponent,\n} from 'core-app/shared/components/modals/editor/macro-wp-button-modal/wp-button-macro.modal';\nimport { QuerySharingModalComponent } from 'core-app/shared/components/modals/share-modal/query-sharing.modal';\nimport { SaveQueryModalComponent } from 'core-app/shared/components/modals/save-modal/save-query.modal';\nimport { QuerySharingFormComponent } from 'core-app/shared/components/modals/share-modal/query-sharing-form.component';\nimport { WpDestroyModalComponent } from 'core-app/shared/components/modals/wp-destroy-modal/wp-destroy.modal';\nimport {\n WorkPackageTypeStatusComponent,\n} from 'core-app/features/work-packages/components/wp-type-status/wp-type-status.component';\nimport {\n WorkPackageIsolatedQuerySpaceDirective,\n} from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\nimport {\n WorkPackageBreadcrumbParentComponent,\n} from 'core-app/features/work-packages/components/wp-breadcrumb/wp-breadcrumb-parent.component';\nimport {\n WorkPackageSubjectComponent,\n} from 'core-app/features/work-packages/components/wp-subject/wp-subject.component';\nimport {\n WorkPackageBreadcrumbComponent,\n} from 'core-app/features/work-packages/components/wp-breadcrumb/wp-breadcrumb.component';\nimport { UserLinkComponent } from 'core-app/shared/components/user-link/user-link.component';\nimport {\n WorkPackageCommentComponent,\n} from 'core-app/features/work-packages/components/work-package-comment/work-package-comment.component';\nimport {\n WorkPackageWatcherButtonComponent,\n} from 'core-app/features/work-packages/components/wp-watcher-button/wp-watcher-button.component';\nimport {\n WorkPackageCommentFieldComponent,\n} from 'core-app/features/work-packages/components/work-package-comment/wp-comment-field.component';\nimport { WpResizerDirective } from 'core-app/shared/components/resizer/resizer/wp-resizer.component';\nimport {\n GroupDescriptor,\n WorkPackageSingleViewComponent,\n} from 'core-app/features/work-packages/components/wp-single-view/wp-single-view.component';\nimport {\n RevisionActivityComponent,\n} from 'core-app/features/work-packages/components/wp-activity/revision/revision-activity.component';\nimport {\n WorkPackageCopySplitViewComponent,\n} from 'core-app/features/work-packages/components/wp-copy/wp-copy-split-view.component';\nimport {\n WorkPackageFormAttributeGroupComponent,\n} from 'core-app/features/work-packages/components/wp-form-group/wp-attribute-group.component';\nimport { WorkPackagesGridComponent } from 'core-app/features/work-packages/components/wp-grid/wp-grid.component';\nimport {\n ActivityEntryComponent,\n} from 'core-app/features/work-packages/components/wp-activity/activity-entry.component';\nimport { ActivityLinkComponent } from 'core-app/features/work-packages/components/wp-activity/activity-link.component';\nimport {\n UserActivityComponent,\n} from 'core-app/features/work-packages/components/wp-activity/user/user-activity.component';\nimport {\n WorkPackageSplitViewToolbarComponent,\n} from 'core-app/features/work-packages/components/wp-details/wp-details-toolbar.component';\nimport {\n WorkPackageCopyFullViewComponent,\n} from 'core-app/features/work-packages/components/wp-copy/wp-copy-full-view.component';\nimport { OpenprojectTabsModule } from 'core-app/shared/components/tabs/openproject-tabs.module';\nimport { TimeEntryChangeset } from 'core-app/features/work-packages/helpers/time-entries/time-entry-changeset';\n\nimport { OpAttachmentsComponent } from 'core-app/shared/components/attachments/attachments.component';\nimport {\n QueryFiltersComponent,\n} from 'core-app/features/work-packages/components/filters/query-filters/query-filters.component';\nimport {\n FilterDateTimesValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-date-times-value/filter-date-times-value.component';\nimport {\n FilterSearchableMultiselectValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-searchable-multiselect-value/filter-searchable-multiselect-value.component';\nimport {\n QueryFilterComponent,\n} from 'core-app/features/work-packages/components/filters/query-filter/query-filter.component';\nimport {\n FilterDatesValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-dates-value/filter-dates-value.component';\nimport {\n FilterStringValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-string-value/filter-string-value.component';\nimport {\n FilterProjectComponent,\n} from 'core-app/features/work-packages/components/filters/filter-project/filter-project.component';\nimport {\n FilterDateValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-date-value/filter-date-value.component';\nimport {\n FilterDateTimeValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-date-time-value/filter-date-time-value.component';\nimport {\n FilterToggledMultiselectValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-toggled-multiselect-value/filter-toggled-multiselect-value.component';\nimport {\n WorkPackageFilterByTextInputComponent,\n} from 'core-app/features/work-packages/components/filters/quick-filter-by-text-input/quick-filter-by-text-input.component';\nimport {\n FilterIntegerValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-integer-value/filter-integer-value.component';\nimport {\n WorkPackageFilterContainerComponent,\n} from 'core-app/features/work-packages/components/filters/filter-container/filter-container.directive';\nimport {\n FilterBooleanValueComponent,\n} from 'core-app/features/work-packages/components/filters/filter-boolean-value/filter-boolean-value.component';\nimport {\n WorkPackageMarkNotificationButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-mark-notification-button/work-package-mark-notification-button.component';\nimport {\n WorkPackageFilesTabComponent,\n} from 'core-app/features/work-packages/components/wp-single-view-tabs/files-tab/op-files-tab.component';\nimport { WorkPackagesQueryViewService } from 'core-app/features/work-packages/components/wp-list/wp-query-view.service';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { 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';\nimport { ProjectStoragesResourceService } from 'core-app/core/state/project-storages/project-storages.service';\nimport {\n OpBaselineModalComponent,\n} from 'core-app/features/work-packages/components/wp-baseline/baseline-modal/baseline-modal.component';\nimport {\n OpBaselineComponent,\n} from 'core-app/features/work-packages/components/wp-baseline/baseline/baseline.component';\nimport {\n OpBaselineLoadingComponent,\n} from 'core-app/features/work-packages/components/wp-baseline/baseline-loading/baseline-loading.component';\nimport {\n OpBaselineLegendsComponent,\n} from 'core-app/features/work-packages/components/wp-baseline/baseline-legends/baseline-legends.component';\nimport { NgSelectModule } from '@ng-select/ng-select';\nimport {\n WorkPackageTimerButtonComponent,\n} from 'core-app/features/work-packages/components/wp-timer-button/wp-timer-button.component';\nimport { OpenprojectTimeEntriesModule } from 'core-app/shared/components/time_entries/openproject-time-entries.module';\nimport { RecentItemsService } from 'core-app/core/recent-items.service';\nimport {\n WorkPackageShareButtonComponent,\n} from 'core-app/features/work-packages/components/wp-buttons/wp-share-button/wp-share-button.component';\nimport {\n WorkPackageShareModalComponent,\n} from 'core-app/features/work-packages/components/wp-share-modal/wp-share.modal';\n\n@NgModule({\n imports: [\n // Commons\n OpSharedModule,\n NgSelectModule,\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 OpenprojectTimeEntriesModule,\n\n OpWpTabsModule,\n\n EditFieldControlsModule,\n OpenprojectTabsModule,\n OpenprojectStoragesModule,\n\n WorkPackageIsolatedQuerySpaceDirective,\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 ProjectStoragesResourceService,\n\n RecentItemsService,\n ],\n declarations: [\n // Routing\n WorkPackagesBaseComponent,\n PartitionedQuerySpacePageComponent,\n WorkPackageViewPageComponent,\n\n // WP list side\n WorkPackageListViewComponent,\n WorkPackageSettingsButtonComponent,\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 WorkPackageTimerButtonComponent,\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 WorkPackageShareButtonComponent,\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 WorkPackageShareModalComponent,\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 // Timestamps\n OpBaselineModalComponent,\n OpBaselineComponent,\n OpBaselineLoadingComponent,\n OpBaselineLegendsComponent,\n ],\n exports: [\n WorkPackagesTableComponent,\n WorkPackageTablePaginationComponent,\n WorkPackageEmbeddedTableComponent,\n WorkPackageEmbeddedTableEntryComponent,\n WorkPackageCardViewComponent,\n WorkPackageSingleCardComponent,\n WorkPackageFilterButtonComponent,\n WorkPackageFilterContainerComponent,\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 schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class OpenprojectWorkPackagesModule {\n static bootstrapAttributeGroupsCalled = false;\n\n constructor(private 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';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { firstValueFrom } from 'rxjs';\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 @InjectField() configuration:ConfigurationService;\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 = firstValueFrom(this.wpListService.loadQueryFromExisting(query, pagination, this.projectIdentifier));\n }\n\n return promise;\n }\n\n protected loadFirstPage():Promise {\n if (this.currentQuery) {\n return firstValueFrom(this.wpListService.reloadQuery(this.currentQuery, this.projectIdentifier));\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\nimport {\n WorkPackageIsolatedQuerySpaceDirective,\n} from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\n\nexport const wpBaseSelector = 'work-packages-base';\n\n@Component({\n selector: wpBaseSelector,\n hostDirectives: [WorkPackageIsolatedQuerySpaceDirective],\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
    \n
    \n
      \n
    • \n \n \n
    • \n
    • \n \n \n
    • \n
    • \n \n \n
    • \n
    • \n \n \n
    • \n
    • \n \n
    • \n
    • \n \n \n
    • \n
    • \n \n
    • \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 { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { StateService } from '@uirouter/core';\nimport {\n Component,\n Injector,\n OnInit,\n} from '@angular/core';\nimport { Observable, of } from 'rxjs';\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 { 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';\nimport { RecentItemsService } from 'core-app/core/recent-items.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\n\n@Component({\n templateUrl: './wp-full-view.html',\n selector: 'wp-full-view-entry',\n // Required class to support inner scrolling on page\n host: { class: 'work-packages-page--ui-view' },\n providers: [\n WpSingleViewService,\n CommentService,\n { provide: HalResourceNotificationService, useExisting: WorkPackageNotificationService },\n ],\n})\nexport class WorkPackagesFullViewComponent extends WorkPackageSingleViewBase implements OnInit {\n // Watcher properties\n public isWatched:boolean;\n\n public displayWatchButton = false;\n\n public displayTimerButton = false;\n\n public displayShareButton$:false|Observable = false;\n\n public watchers:any;\n\n public text = {\n fullView: {\n buttonMore: this.i18n.t('js.button_more'),\n },\n };\n\n stateName$ = of('work-packages.new');\n\n constructor(\n public injector:Injector,\n public wpTableSelection:WorkPackageViewSelectionService,\n public recentItemsService:RecentItemsService,\n readonly $state:StateService,\n readonly currentUserService:CurrentUserService,\n private readonly configurationService:ConfigurationService,\n ) {\n super(injector, $state.params.workPackageId);\n }\n\n ngOnInit():void {\n this.observeWorkPackage();\n }\n\n protected init() {\n super.init();\n\n if (this.workPackage.id) {\n this.recentItemsService.add(this.workPackage.id);\n\n // Set Focused WP\n this.wpTableFocus.updateFocus(this.workPackage.id);\n }\n\n this.setWorkPackageScopeProperties(this.workPackage);\n }\n\n private setWorkPackageScopeProperties(wp:WorkPackageResource) {\n this.isWatched = Object.prototype.hasOwnProperty.call(wp, 'unwatch');\n this.displayWatchButton = Object.prototype.hasOwnProperty.call(wp, 'unwatch') || Object.prototype.hasOwnProperty.call(wp, 'watch');\n this.displayTimerButton = Object.prototype.hasOwnProperty.call(wp, 'logTime');\n this.displayShareButton$ = this.currentUserService.hasCapabilities$('work_package_shares/index', wp.project.id);\n\n // watchers\n if (wp.watchers) {\n this.watchers = (wp.watchers as any).elements;\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 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';\nimport { WorkPackageViewBaselineService } from '../wp-view-base/view-services/wp-view-baseline.service';\nimport { combineLatest } from 'rxjs';\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 public baselineEnabled:boolean;\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 readonly wpTableBaseline:WorkPackageViewBaselineService,\n ) {\n super();\n }\n\n ngOnInit() {\n // Mark tableInformationLoaded when initially loading done\n this.setupInformationLoadedListener();\n const statesCombined = combineLatest([\n this.querySpace.query.values$(),\n this.wpTableBaseline.live$(),\n ]);\n statesCombined.pipe(\n this.untilDestroyed(),\n ).subscribe(([query]) => {\n // Update the visible representation\n this.updateViewRepresentation(query);\n this.baselineEnabled = this.wpTableBaseline.isActive();\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-test-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 \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';\nimport { RecentItemsService } from 'core-app/core/recent-items.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 public recentItemsService:RecentItemsService,\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 as string;\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 this.recentItemsService.add(wpId);\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 { 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({ 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 this\n .resourceService\n .collection({ filters: this.store.getValue().notifications.filters })\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 {\n RelationsStateValue,\n WorkPackageRelationsService,\n} 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(\n 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\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 resultIds = rows.map((el:WorkPackageResource) => (el.id as string|number).toString());\n const ids = _.flatten(rows.map((el) => el.ancestorIds))\n .filter((id) => !resultIds.includes(id));\n\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 '@openproject/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 { Injectable } from '@angular/core';\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 { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { WorkPackageQueryStateService } from './wp-view-base.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { Observable } from 'rxjs';\nimport { IDay } from 'core-app/core/state/days/day.model';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\nimport { DayResourceService } from 'core-app/core/state/days/day.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport * as moment from 'moment-timezone';\nimport { Moment } from 'moment';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\n\nexport const DEFAULT_TIMESTAMP = 'PT0S';\nexport const BASELINE_INCOMPATIBLE_FILTERS = [\n 'attachmentContent',\n 'attachmentFileName',\n 'watcher',\n 'comment',\n];\n\nexport const BASELINE_INCOMPATIBLE_COLUMNS = [\n 'category',\n 'updatedAt',\n 'estimatedTime',\n 'remainingTime',\n 'spentTime',\n 'percentageDone',\n 'duration',\n 'budget',\n 'materialCosts',\n 'laborCosts',\n 'overallCosts',\n];\n\n@Injectable()\nexport class WorkPackageViewBaselineService extends WorkPackageQueryStateService {\n constructor(\n protected readonly states:States,\n protected readonly querySpace:IsolatedQuerySpace,\n protected readonly pathHelper:PathHelperService,\n protected readonly configurationService:ConfigurationService,\n protected readonly timezoneService:TimezoneService,\n protected readonly weekdaysService:WeekdayService,\n protected readonly daysService:DayResourceService,\n ) {\n super(querySpace);\n }\n\n public nonWorkingDays:IDay[] = [];\n\n public nonWorkingDays$:Observable = this.requireNonWorkingDaysOfTwoYears();\n\n public detectIncompatibleFilters(filters:QueryFilterInstanceResource[]):string[] {\n return BASELINE_INCOMPATIBLE_FILTERS\n .filter((el) => !!filters.find((filter) => filter.id === el));\n }\n\n public isIncompatibleFilter(filter:string):boolean {\n return BASELINE_INCOMPATIBLE_FILTERS.includes(filter);\n }\n\n public isIncompatibleColumn(column:string):boolean {\n return BASELINE_INCOMPATIBLE_COLUMNS.includes(column);\n }\n\n public yesterdayDate():string {\n return moment().subtract(1, 'days').format('YYYY-MM-DD');\n }\n\n public lastMonthDate():string {\n return moment().subtract(1, 'month').format('YYYY-MM-DD');\n }\n\n public lastweekDate():string {\n return moment().subtract(1, 'week').format('YYYY-MM-DD');\n }\n\n requireNonWorkingDaysOfTwoYears() {\n const today = new Date();\n const lastYear = new Date(today);\n lastYear.setFullYear(today.getFullYear() - 1);\n const nonWorkingDays$= this\n .daysService\n .requireNonWorkingYears$(lastYear, today);\n\n nonWorkingDays$.subscribe((nonWorkingDays) => {\n this.nonWorkingDays =nonWorkingDays;\n });\n\n return nonWorkingDays$;\n }\n\n isNonWorkingDay(date:Moment|string):boolean {\n const formatted = moment(date).format('YYYY-MM-DD');\n return (this.nonWorkingDays.findIndex((el) => el.date === formatted) !== -1);\n }\n\n public lastWorkingDate():string {\n const date = moment().subtract(1, 'days');\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (this.isNonWorkingDay(date) || this.weekdaysService.isNonWorkingDay(date)) {\n date.subtract(1, 'days');\n } else {\n return date.format('YYYY-MM-DD');\n }\n }\n }\n\n public isActive():boolean {\n return this.current.length >= 1 && this.current[0] !== DEFAULT_TIMESTAMP;\n }\n\n public isChanged(workPackage:WorkPackageResource, attribute:string):boolean {\n const timestamps = workPackage.attributesByTimestamp || [];\n return this.isActive()\n && timestamps.length >= 1\n && Object.prototype.hasOwnProperty.call(timestamps[0], attribute);\n }\n\n public valueFromQuery(query:QueryResource):string[] {\n return query.timestamps;\n }\n\n public hasChanged(query:QueryResource) {\n return !_.isEqual(query.timestamps, this.current);\n }\n\n public applyToQuery(query:QueryResource):boolean {\n query.timestamps = [...this.current];\n\n return true;\n }\n\n public disable() {\n this.update([DEFAULT_TIMESTAMP]);\n }\n\n public get current():string[] {\n return this.lastUpdatedState.getValueOr([DEFAULT_TIMESTAMP]);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 '@openproject/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 '@openproject/reactivestates';\nimport { States } from 'core-app/core/states/states.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\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';\nimport { firstValueFrom } from 'rxjs';\nimport { map } from 'rxjs/operators';\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 firstValueFrom(\n combine(this.pristineState, this.availableState)\n .values$()\n .pipe(map(() => null)),\n );\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';\nimport { firstValueFrom } from 'rxjs';\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 firstValueFrom(this.apiV3Service.work_packages.id(predecessorId).get());\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 '@openproject/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';\nimport { firstValueFrom } from 'rxjs';\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 firstValueFrom(this.positions.values$());\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 '@openproject/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 '@openproject/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 .requireEntity((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.fetchCollection(attachments.href).subscribe();\n\n if (this.workPackage.$links.fileLinks) {\n this.fileLinkResourceService\n .updateCollectionsForWorkPackage(this.workPackage.$links.fileLinks.href as string)\n .pipe(take(1))\n .subscribe(\n () => { /* Do nothing */ },\n (error:HttpErrorResponse) => { this.toastService.addError(error); },\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';\nimport { WorkPackageViewBaselineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-baseline.service';\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() wpTableBaseline:WorkPackageViewBaselineService;\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 this.setupChangeObserver(this.wpTableBaseline);\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 { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\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 {\n PartitionedQuerySpacePageComponent,\n ToolbarButtonComponentDefinition,\n} from 'core-app/features/work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component';\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 { WorkPackageViewToggleButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-view-toggle-button/work-package-view-toggle-button.component';\nimport { WorkPackageDetailsViewButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-details-view-button/wp-details-view-button.component';\nimport { WorkPackageTimelineButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-timeline-toggle-button/wp-timeline-toggle-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 { of } from 'rxjs';\nimport { WorkPackageFoldToggleButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/wp-fold-toggle-button/wp-fold-toggle-button.component';\nimport { OpProjectIncludeComponent } from 'core-app/shared/components/project-include/project-include.component';\nimport { OpBaselineModalComponent } from 'core-app/features/work-packages/components/wp-baseline/baseline-modal/baseline-modal.component';\n\n@Component({\n selector: 'wp-view-page',\n templateUrl: '../partitioned-query-space-page/partitioned-query-space-page.component.html',\n styleUrls: [\n // Absolute paths do not work for styleURLs :-(\n '../partitioned-query-space-page/partitioned-query-space-page.component.sass',\n ],\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 WorkPackageViewPageComponent extends PartitionedQuerySpacePageComponent implements OnInit {\n toolbarButtonComponents:ToolbarButtonComponentDefinition[] = [\n {\n component: WorkPackageCreateButtonComponent,\n inputs: {\n stateName$: of('work-packages.partitioned.list.new'),\n allowed: ['work_packages.createWorkPackage'],\n },\n },\n {\n component: OpProjectIncludeComponent,\n },\n {\n component: OpBaselineModalComponent,\n containerClasses: 'hidden-for-tablet',\n },\n {\n component: WorkPackageFilterButtonComponent,\n },\n {\n component: WorkPackageViewToggleButtonComponent,\n containerClasses: 'hidden-for-tablet',\n },\n {\n component: WorkPackageFoldToggleButtonComponent,\n show: () => !!(this.currentQuery && this.currentQuery.groupBy),\n },\n {\n component: WorkPackageDetailsViewButtonComponent,\n containerClasses: 'hidden-for-tablet',\n },\n {\n component: WorkPackageTimelineButtonComponent,\n containerClasses: 'hidden-for-tablet -no-spacing',\n },\n {\n component: ZenModeButtonComponent,\n containerClasses: 'hidden-for-tablet',\n },\n {\n component: WorkPackageSettingsButtonComponent,\n },\n ];\n\n ngOnInit() {\n super.ngOnInit();\n this.wpTableFilters.hidden.push(\n 'project',\n );\n this.text.button_settings = this.I18n.t('js.button_settings');\n }\n\n protected additionalLoadingTime():Promise {\n if (this.wpTableTimeline.isVisible) {\n return this.querySpace.timelineRendered.pipe(take(1)).toPromise();\n }\n return this.querySpace.tableRendered.valuesPromise() as Promise;\n }\n\n protected shouldUpdateHtmlTitle():boolean {\n return this.$state.current.name === 'work-packages.partitioned.list';\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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:object):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 href = this.attachment._links.author.href;\n this.author$ = this.principalsResourceService.requireEntity(href);\n\n this.timestampText = this.timezoneService.parseDatetime(this.attachment.createdAt).fromNow();\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 \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 { States } from 'core-app/core/states/states.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\nimport { AttachmentsResourceService } from 'core-app/core/state/attachments/attachments.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { OpUploadService } from 'core-app/core/upload/upload.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';\nimport { HttpErrorResponse } from '@angular/common/http';\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-test-selector') public testSelector = 'op-attachments';\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 // When the global drag and drop is active and the dragging happens over the DOM\n // elements, the dragenter and dragleave events are always fired in pairs.\n // On dragenter the this.dragging is set to 2 and on dragleave we deduct it to 1,\n // meaning the drag and drop remains active. When the drag and drop action is canceled\n // i.e. by the \"Escape\" key, an extra dragleave event is fired.\n // In this case this.dragging will be deducted to 0, disabling the active drop areas.\n this.dragging = 2;\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 toastService:ToastService,\n private readonly uploadService:OpUploadService,\n protected readonly halResourceService:HalResourceService,\n protected readonly attachmentsResourceService:AttachmentsResourceService,\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).subscribe();\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 this.uploadFiles(Array.from(fileList));\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 this.uploadFiles(Array.from(event.dataTransfer.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:File[]):void {\n let filesWithoutFolders = files || [];\n const countBefore = files.length;\n filesWithoutFolders = this.filterFolders(filesWithoutFolders);\n\n if (filesWithoutFolders.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, filesWithoutFolders)\n .subscribe({\n next: () => {},\n error: (error:HttpErrorResponse) => this.toastService.addError(error),\n });\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:File[]):File[] {\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 '@openproject/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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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","\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","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { OpenprojectAttachmentsModule } from 'core-app/shared/components/attachments/openproject-attachments.module';\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\n\nimport { AttributeHelpTextComponent } from './attribute-help-text.component';\nimport { AttributeHelpTextModalComponent } from './attribute-help-text.modal';\nimport { StaticAttributeHelpTextComponent } from './static-attribute-help-text.component';\nimport { StaticAttributeHelpTextModalComponent } from './static-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 StaticAttributeHelpTextComponent,\n StaticAttributeHelpTextModalComponent,\n ],\n providers: [\n ],\n exports: [\n AttributeHelpTextComponent,\n StaticAttributeHelpTextComponent,\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 ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n HostBinding,\n Injector,\n Input,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { StaticAttributeHelpTextModalComponent } from './static-attribute-help-text.modal';\n\nexport const staticAttributeHelpTextSelector = 'op-static-attribute-help-text';\n\n@Component({\n selector: staticAttributeHelpTextSelector,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './static-attribute-help-text.component.html',\n})\nexport class StaticAttributeHelpTextComponent {\n // Attribute pass the modal title and content\n @Input() public title:string;\n\n @Input() public content:string;\n\n @HostBinding('class.form--field-inline-buttons-container') className = true;\n\n readonly text = {\n open_dialog: this.I18n.t('js.help_texts.show_modal'),\n };\n\n constructor(\n readonly elementRef:ElementRef,\n protected opModalService:OpModalService,\n protected cdRef:ChangeDetectorRef,\n protected injector:Injector,\n protected I18n:I18nService,\n ) {\n populateInputsFromDataset(this);\n }\n\n public handleClick(event:Event):void {\n this.opModalService.show(StaticAttributeHelpTextModalComponent, this.injector, { title: this.title, content: this.content });\n\n event.preventDefault();\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 { I18nService } from 'core-app/core/i18n/i18n.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';\n\n@Component({\n templateUrl: './static-attribute-help-text.modal.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StaticAttributeHelpTextModalComponent extends OpModalComponent implements OnInit {\n readonly text = {\n close: this.I18n.t('js.button_close'),\n };\n\n public title:string = this.locals.title as string;\n\n public content:string = this.locals.content as string;\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}\n","\n \n {{ title }}\n \n\n
\n\n
\n {{ content }}\n
\n\n
\n
\n \n {{ text.close }}\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, 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';\nimport { repositionDropdownBugfix } from 'core-app/shared/components/autocompleter/op-autocompleter/autocompleter.helper';\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 repositionDropdownBugfix(this.ngSelectComponent);\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';\nimport { repositionDropdownBugfix } from 'core-app/shared/components/autocompleter/op-autocompleter/autocompleter.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 repositionDropdownBugfix(this.ngSelectComponent);\n }\n\n private updateAvailableOptions() {\n this.availableOptions = this.options\n .filter((item) => !this.selected.find((selected) => selected.id === item.id));\n }\n}\n","interface NgSelectShim {\n appendTo?:string;\n dropdownPanel?:{\n _updateXPosition():void;\n _updateYPosition():void;\n }\n}\n\n// Force reposition as a workaround for BUG\n// https://github.com/ng-select/ng-select/issues/1259\nexport function repositionDropdownBugfix(component?:unknown) {\n const instance = component as NgSelectShim;\n if (instance?.appendTo && instance?.dropdownPanel) {\n setTimeout(() => {\n // eslint-disable-next-line no-underscore-dangle\n instance.dropdownPanel?._updateXPosition();\n // eslint-disable-next-line no-underscore-dangle\n instance.dropdownPanel?._updateYPosition();\n }, 25);\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:TOpAutocompleterResource, 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 fetching the object for a provided value using the API\n public loadValue(id:string, resource:TOpAutocompleterResource):Observable {\n return (this.apiV3Service[resource] as\n ApiV3ResourceCollection)\n .id(id)\n .get();\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:TOpAutocompleterResource, 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","/* 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 ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n Injector,\n Input,\n NgZone,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n Type,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { DropdownPosition, NgSelectComponent } from '@ng-select/ng-select';\nimport { BehaviorSubject, merge, NEVER, Observable, of, Subject, timer } from 'rxjs';\nimport { debounce, distinctUntilChanged, filter, switchMap, tap } from 'rxjs/operators';\nimport { AddTagFn, GroupValueFn } from '@ng-select/ng-select/lib/ng-select.component';\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport {\n Highlighting,\n} 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 {\n OpAutocompleterFooterTemplateDirective,\n} 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';\nimport {\n repositionDropdownBugfix,\n} from 'core-app/shared/components/autocompleter/op-autocompleter/autocompleter.helper';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { ID } from '@datorama/akita';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\nexport interface IAutocompleteItem {\n id:ID;\n href:string|null;\n}\n\nexport interface IAutocompleterTemplateComponent {\n optionTemplate?:TemplateRef;\n headerTemplate?:TemplateRef;\n labelTemplate?:TemplateRef;\n footerTemplate?:TemplateRef;\n}\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: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OpAutocompleterComponent),\n multi: true,\n },\n ],\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\n extends UntilDestroyedMixin\n implements OnInit, AfterViewInit, OnChanges, ControlValueAccessor {\n @HostBinding('class.op-autocompleter') className = true;\n\n @Input() public filters?:IAPIFilter[] = [];\n\n @Input() public resource:TOpAutocompleterResource;\n\n @Input() public model?:T|T[]|null;\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 inputName?:string;\n\n @Input() public inputValue?:string;\n\n @Input() public inputBindValue = 'id';\n\n @Input() public hiddenFieldAction = '';\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() set addTag(val:boolean|AddTagFn) {\n this._addTag = val === true ? this.addNewObjectFn.bind(this) : val;\n this.cdRef.detectChanges();\n }\n\n get addTag():boolean|AddTagFn {\n return this._addTag;\n }\n\n private _addTag:boolean|AddTagFn = 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 @Input() public notFoundText:string = this.I18n.t('js.autocompleter.notFoundText');\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 @Input() public url:string;\n\n @Output() public open = new EventEmitter();\n\n @Output() public close = new EventEmitter();\n\n @Output() public cancel = 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 @ViewChild('syncedInput') syncedInput:ElementRef;\n\n @ContentChild(OpAutocompleterOptionTemplateDirective, { read: TemplateRef })\n projectedOptionTemplate:TemplateRef;\n\n optionTemplate:TemplateRef;\n\n @ContentChild(OpAutocompleterLabelTemplateDirective, { read: TemplateRef })\n projectedLabelTemplate:TemplateRef;\n\n labelTemplate:TemplateRef;\n\n @ContentChild(OpAutocompleterHeaderTemplateDirective, { read: TemplateRef })\n projectedHeaderTemplate:TemplateRef;\n\n headerTemplate:TemplateRef;\n\n @ContentChild(OpAutocompleterFooterTemplateDirective, { read: TemplateRef })\n projectedFooterTemplate:TemplateRef;\n\n footerTemplate:TemplateRef;\n\n initialDebounce = true;\n\n private opAutocompleterService = new OpAutocompleterService(this.apiV3Service);\n\n constructor(\n readonly injector:Injector,\n readonly elementRef:ElementRef,\n readonly http:HttpClient,\n readonly apiV3Service:ApiV3Service,\n readonly cdRef:ChangeDetectorRef,\n readonly ngZone:NgZone,\n readonly vcRef:ViewContainerRef,\n readonly I18n:I18nService,\n ) {\n super();\n }\n\n ngOnInit() {\n populateInputsFromDataset(this);\n\n if (!!this.getOptionsFn || this.defaultData) {\n this.typeahead = new BehaviorSubject('');\n }\n\n if (this.inputValue && !this.model) {\n this\n .opAutocompleterService\n .loadValue(this.inputValue, this.resource)\n .subscribe((resource) => {\n this.model = resource as unknown as T;\n this.syncHiddenField(this.mappedInputValue);\n this.cdRef.detectChanges();\n });\n }\n }\n\n ngOnChanges(changes:SimpleChanges):void {\n if (changes.items) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this.items$.next(changes.items.currentValue);\n }\n }\n\n ngAfterViewInit():void {\n if (this.inputName && this.model) {\n this.syncHiddenField(this.mappedInputValue);\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 get mappedInputValue():string {\n if (!this.model) {\n return '';\n }\n\n if (Array.isArray(this.model)) {\n return this.model.map((el) => el[this.inputBindValue as 'id']).join(',');\n }\n\n return this.model[this.inputBindValue as 'id'] as string;\n }\n\n public repositionDropdown() {\n repositionDropdownBugfix(this.ngSelectInstance);\n }\n\n public opened():void { // eslint-disable-line no-unused-vars\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:T|T[]|null):void {\n this.writeValue(val);\n this.onTouched(val);\n this.onChange(val);\n this.syncHiddenField(this.mappedInputValue);\n this.change.emit(val);\n this.cdRef.detectChanges();\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 canceled(val:unknown):void {\n this.cancel.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 // tap(() => console.log('Debounce is ', this.getDebounceTimeout())),\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 50;\n }\n\n writeValue(value:T|T[]|null):void {\n this.model = value;\n }\n\n onChange = (_:T|T[]|null):void => {\n };\n\n onTouched = (_:T|T[]|null):void => {\n };\n\n registerOnChange(fn:(_:T|T[]|null) => void):void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn:(_:T|T[]|null) => void):void {\n this.onTouched = fn;\n }\n\n /**\n * Instantiate the given template component and apply any given TemplateRef to this component\n * so they can be passed to ng-select.\n *\n * @param component A templating component defining any combination of the header, option, label, or footer templates.\n * @param inputs Initial inputs to the templating component\n * @protected\n */\n protected applyTemplates(component:Type, inputs:{ [key:string]:unknown } = {}) {\n const componentRef = this.vcRef.createComponent(component, { injector: this.templateInjector });\n Object.keys(inputs).forEach((key) => {\n const value = inputs[key];\n componentRef.setInput(key, value);\n });\n\n componentRef.changeDetectorRef.detectChanges();\n\n ['optionTemplate', 'headerTemplate', 'labelTemplate', 'footerTemplate'].forEach((name:keyof IAutocompleterTemplateComponent) => {\n const template = componentRef.instance[name];\n if (template) {\n this[name] = template;\n }\n });\n }\n\n protected get templateInjector() {\n return Injector.create(\n {\n providers: [{ provide: OpAutocompleterComponent, useValue: this }],\n parent: this.injector,\n },\n );\n }\n\n protected syncHiddenField(mappedInputValue:string) {\n const input = this.syncedInput?.nativeElement;\n if (input) {\n input.value = mappedInputValue;\n const event = new Event('change');\n input.dispatchEvent(event);\n }\n }\n\n public addNewObjectFn(searchTerm:string):unknown {\n return this.bindLabel ? { [this.bindLabel]: searchTerm } : searchTerm;\n }\n}\n","import { Injector, NgModule } from '@angular/core';\nimport { NgSelectModule } from '@ng-select/ng-select';\nimport { FormsModule, ReactiveFormsModule } 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 {\n DraggableAutocompleteComponent,\n} from 'core-app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component';\nimport { ColorsAutocompleterComponent } from 'core-app/shared/components/colors/colors-autocompleter.component';\nimport {\n WorkPackageAutocompleterComponent,\n} from 'core-app/shared/components/autocompleter/work-package-autocompleter/wp-autocompleter.component';\nimport {\n TimeEntryWorkPackageAutocompleterComponent,\n} from 'core-app/shared/components/autocompleter/te-work-package-autocompleter/te-work-package-autocompleter.component';\nimport {\n AutocompleteSelectDecorationComponent,\n} from 'core-app/shared/components/autocompleter/autocomplete-select-decoration/autocomplete-select-decoration.component';\nimport {\n VersionAutocompleterComponent,\n} from 'core-app/shared/components/autocompleter/version-autocompleter/version-autocompleter.component';\nimport {\n UserAutocompleterComponent,\n} from 'core-app/shared/components/autocompleter/user-autocompleter/user-autocompleter.component';\nimport {\n ProjectAutocompleterComponent,\n} from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocompleter.component';\nimport {\n OpAutocompleterComponent,\n} from 'core-app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component';\nimport {\n OpAutocompleterOptionTemplateDirective,\n} from 'core-app/shared/components/autocompleter/op-autocompleter/directives/op-autocompleter-option-template.directive';\nimport {\n OpAutocompleterLabelTemplateDirective,\n} from 'core-app/shared/components/autocompleter/op-autocompleter/directives/op-autocompleter-label-template.directive';\nimport {\n OpAutocompleterHeaderTemplateDirective,\n} from 'core-app/shared/components/autocompleter/op-autocompleter/directives/op-autocompleter-header-template.directive';\nimport {\n CreateAutocompleterComponent,\n} from 'core-app/shared/components/autocompleter/create-autocompleter/create-autocompleter.component';\nimport {\n OpAutocompleterFooterTemplateDirective,\n} from 'core-app/shared/components/autocompleter/autocompleter-footer-template/op-autocompleter-footer-template.directive';\nimport { OpSearchHighlightDirective } from 'core-app/shared/directives/search-highlight.directive';\nimport {\n UserAutocompleterTemplateComponent,\n} from 'core-app/shared/components/autocompleter/user-autocompleter/user-autocompleter-template.component';\nimport {\n ProjectAutocompleterTemplateComponent,\n} from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocompleter-template.component';\n\nexport const OPENPROJECT_AUTOCOMPLETE_COMPONENTS = [\n CreateAutocompleterComponent,\n VersionAutocompleterComponent,\n WorkPackageAutocompleterComponent,\n TimeEntryWorkPackageAutocompleterComponent,\n DraggableAutocompleteComponent,\n UserAutocompleterComponent,\n UserAutocompleterTemplateComponent,\n ProjectAutocompleterComponent,\n ProjectAutocompleterTemplateComponent,\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,\n OpenprojectPrincipalRenderingModule,\n InviteUserButtonModule,\n ],\n exports: OPENPROJECT_AUTOCOMPLETE_COMPONENTS,\n declarations: OPENPROJECT_AUTOCOMPLETE_COMPONENTS,\n})\nexport class OpenprojectAutocompleterModule {\n constructor(injector:Injector) {\n }\n}\n","\n {{ item.name }}\n\n\n\n {{ item.name }}\n {{ item.disabledReason }}\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { IAutocompleterTemplateComponent } from 'core-app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component';\n\n@Component({\n templateUrl: './project-autocompleter-template.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ProjectAutocompleterTemplateComponent implements IAutocompleterTemplateComponent {\n @ViewChild('optionTemplate') optionTemplate:TemplateRef;\n @ViewChild('labelTemplate') labelTemplate?:TemplateRef;\n}\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n forwardRef,\n HostBinding,\n Input,\n OnInit,\n Output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { merge, Observable, of } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { ID } from '@datorama/akita';\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';\nimport {\n OpAutocompleterComponent,\n} from 'core-app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component';\nimport { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport {\n ProjectAutocompleterTemplateComponent,\n} from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocompleter-template.component';\nimport { addFiltersToPath } from 'core-app/core/apiv3/helpers/add-filters-to-path';\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: '../op-autocompleter/op-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 extends OpAutocompleterComponent implements OnInit, 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 // Load all projects as default\n @Input() public url:string = this.apiV3Service.projects.path;\n\n @Input() public isInlineContext = false;\n\n // This function allows mapping of the results before they are fed to the tree\n // structuring and destructuring algorithms used internally the this component\n // to show the tree structure. By default it does not do much, but it is\n // overwritable so additional filtering or transforming can be done on the\n // API result set.\n @Input()\n public mapResultsFn:(projects:IProjectAutocompleteItem[]) => IProjectAutocompleteItem[] = (projects) => projects;\n\n /* eslint-disable-next-line @angular-eslint/no-output-rename */\n @Output('valueChange') valueChange = new EventEmitter();\n\n projectTracker = (item:IProjectAutocompleteItem):ID => item.href || item.id;\n\n getOptionsFn = this.getAvailableProjects.bind(this);\n\n dataLoaded = false;\n\n projects:IProjectAutocompleteItem[];\n\n ngOnInit() {\n super.ngOnInit();\n\n this.applyTemplates(ProjectAutocompleterTemplateComponent, {});\n }\n\n private matchingItems(elements:IProjectAutocompleteItem[], matching:string):Observable {\n let filtered:IProjectAutocompleteItem[];\n\n if (matching === '' || !matching) {\n filtered = elements;\n } else {\n const lowered = matching.toLowerCase();\n filtered = elements.filter((el) => el.name.toLowerCase().includes(lowered));\n }\n\n return of(filtered);\n }\n\n private disableSelectedItems(\n projects:IProjectAutocompleteItem[],\n value:IProjectAutocompleterData|IProjectAutocompleterData[]|null|undefined,\n ) {\n if (!this.multiple) {\n return projects;\n }\n\n const normalizedValue = (value || []);\n const arrayedValue = (Array.isArray(normalizedValue) ? normalizedValue : [normalizedValue]).map((p) => p.href || p.id);\n return projects.map((project) => {\n const isSelected = !!arrayedValue.find((selected) => selected === this.projectTracker(project));\n return {\n ...project,\n disabled: isSelected || project.disabled,\n };\n });\n }\n\n public getAvailableProjects(searchTerm:string):Observable {\n if (this.dataLoaded) {\n return this.matchingItems(this.projects, searchTerm).pipe(\n map(this.mapResultsFn),\n map((projects) => projects.sort((a, b) => a.ancestors.length - b.ancestors.length)),\n map((projects) => buildTree(projects)),\n map((projects) => recursiveSort(projects)),\n map((projectTreeItems) => flattenProjectTree(projectTreeItems)),\n switchMap(\n (projects) => merge(of([]), this.valueChange).pipe(\n map(() => this.disableSelectedItems(projects, this.model)),\n ),\n ),\n );\n }\n return getPaginatedResults(\n (params) => {\n const filteredURL = this.buildFilteredURL(searchTerm);\n\n filteredURL.searchParams.set('pageSize', params.pageSize?.toString() || '-1');\n filteredURL.searchParams.set('offset', params.offset?.toString() || '1');\n filteredURL.searchParams.set('select', 'elements/id,elements/name,elements/identifier,elements/self,elements/ancestors,total,count,pageSize');\n\n return this\n .http\n .get>(filteredURL.toString());\n },\n )\n .pipe(\n map((projects) => projects.map((project) => ({\n id: project.id,\n href: project._links.self.href,\n name: project.name,\n disabled: false,\n ancestors: project._links.ancestors,\n children: [],\n }))),\n map(this.mapResultsFn),\n map((projects) => {\n this.dataLoaded = true;\n this.projects = projects;\n return projects.sort((a, b) => a.ancestors.length - b.ancestors.length);\n }),\n map((projects) => buildTree(projects)),\n map((projects) => recursiveSort(projects)),\n map((projectTreeItems) => flattenProjectTree(projectTreeItems)),\n switchMap(\n (projects) => merge(of([]), this.valueChange).pipe(\n map(() => this.disableSelectedItems(projects, this.model)),\n ),\n ),\n );\n }\n\n // Todo: Reduce duplication with method from user-autocompleter\n protected buildFilteredURL(searchTerm?:string):URL {\n const filterObject = _.keyBy(this.filters, 'name');\n const searchFilters = ApiV3FilterBuilder.fromFilterObject(filterObject);\n\n if (searchTerm?.length) {\n searchFilters.add('typeahead', '**', [searchTerm]);\n }\n\n return addFiltersToPath(this.url, searchFilters);\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 Component,\n EventEmitter,\n Injector,\n Output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { WorkPackageAutocompleterComponent } from 'core-app/shared/components/autocompleter/work-package-autocompleter/wp-autocompleter.component';\n\nexport type TimeEntryWorkPackageAutocompleterMode = 'all'|'recent';\n\n@Component({\n templateUrl: './te-work-package-autocompleter.component.html',\n styleUrls: [\n './te-work-package-autocompleter.component.sass',\n ],\n selector: 'te-work-package-autocompleter',\n encapsulation: ViewEncapsulation.None,\n})\nexport class TimeEntryWorkPackageAutocompleterComponent extends WorkPackageAutocompleterComponent implements AfterViewInit {\n @Output() modeSwitch = new EventEmitter();\n\n constructor(\n readonly injector:Injector,\n ) {\n super(injector);\n\n this.text.all = this.I18n.t('js.label_all');\n this.text.recent = this.I18n.t('js.label_recent');\n }\n\n public mode:TimeEntryWorkPackageAutocompleterMode = 'all';\n\n public setMode(value:TimeEntryWorkPackageAutocompleterMode) {\n if (value !== this.mode) {\n this.modeSwitch.emit(value);\n }\n this.mode = value;\n }\n}\n","\n \n \n {{ item.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 ChangeDetectionStrategy,\n Component,\n Input,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { IAutocompleterTemplateComponent } from 'core-app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component';\n\n@Component({\n templateUrl: './user-autocompleter-template.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UserAutocompleterTemplateComponent implements IAutocompleterTemplateComponent {\n @Input() public inviteUserToProject:string|undefined;\n\n @ViewChild('optionTemplate') optionTemplate:TemplateRef;\n @ViewChild('footerTemplate') footerTemplate?:TemplateRef;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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, forwardRef, Input, OnInit, Output } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { ID } from '@datorama/akita';\nimport { OpInviteUserModalService } from 'core-app/features/invite-user-modal/invite-user-modal.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport {\n OpAutocompleterComponent,\n} from 'core-app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component';\nimport { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { addFiltersToPath } from 'core-app/core/apiv3/helpers/add-filters-to-path';\nimport {\n UserAutocompleterTemplateComponent,\n} from 'core-app/shared/components/autocompleter/user-autocompleter/user-autocompleter-template.component';\nimport { IUser } from 'core-app/core/state/principals/user.model';\n\nexport const usersAutocompleterSelector = 'op-user-autocompleter';\n\nexport interface IUserAutocompleteItem {\n id:ID;\n name:string;\n href:string|null;\n avatar?:string|null;\n}\n\n@Component({\n templateUrl: '../op-autocompleter/op-autocompleter.component.html',\n selector: usersAutocompleterSelector,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => UserAutocompleterComponent),\n multi: true,\n },\n // Provide a new version of the modal invite service,\n // as otherwise the close event will be shared across all instances\n OpInviteUserModalService,\n ],\n})\nexport class UserAutocompleterComponent extends OpAutocompleterComponent implements OnInit, ControlValueAccessor {\n @Input() public inviteUserToProject:string|undefined;\n\n @Input() public url:string = this.apiV3Service.users.path;\n\n @Output() public userInvited = new EventEmitter();\n\n @InjectField(OpInviteUserModalService) opInviteUserModalService:OpInviteUserModalService;\n\n getOptionsFn = this.getAvailableUsers.bind(this);\n\n ngOnInit():void {\n super.ngOnInit();\n\n this.applyTemplates(UserAutocompleterTemplateComponent, { inviteUserToProject: this.inviteUserToProject });\n\n this\n .opInviteUserModalService\n .close\n .pipe(\n this.untilDestroyed(),\n filter((user) => !!user),\n )\n .subscribe((user:HalResource) => {\n this.userInvited.emit(user);\n });\n }\n\n public getAvailableUsers(searchTerm?:string):Observable {\n const filteredURL = this.buildFilteredURL(searchTerm);\n\n filteredURL.searchParams.set('pageSize', '-1');\n filteredURL.searchParams.set('select', 'elements/id,elements/name,elements/self,total,count,pageSize');\n\n return this\n .http\n .get>(filteredURL.toString())\n .pipe(\n map((res) => _.uniqBy(res._embedded.elements, (el) => el._links.self?.href || el.id)),\n map((users) => {\n return users.map((user) => {\n return { id: user.id, name: user.name, href: user._links.self?.href };\n });\n }),\n );\n }\n\n protected buildFilteredURL(searchTerm?:string):URL {\n const filterObject = _.keyBy(this.filters, 'name');\n const searchFilters = ApiV3FilterBuilder.fromFilterObject(filterObject);\n\n if (searchTerm?.length) {\n searchFilters.add(this.searchKey || 'name', '~', [searchTerm]);\n }\n\n return addFiltersToPath(this.url, searchFilters);\n }\n\n public addNewObjectFn(searchString:string):IUserAutocompleteItem {\n return {\n id: searchString,\n name: searchString,\n href: null,\n avatar: 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 AfterViewInit,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Injector,\n Output,\n} from '@angular/core';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { CreateAutocompleterComponent } from 'core-app/shared/components/autocompleter/create-autocompleter/create-autocompleter.component';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { VersionResource } from 'core-app/features/hal/resources/version-resource';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { firstValueFrom } from 'rxjs';\n\n@Component({\n templateUrl: '../create-autocompleter/create-autocompleter.component.html',\n selector: 'version-autocompleter',\n})\nexport class VersionAutocompleterComponent extends CreateAutocompleterComponent implements AfterViewInit {\n @Output() public onCreate = new EventEmitter();\n\n constructor(\n readonly injector:Injector,\n readonly I18n:I18nService,\n readonly currentProject:CurrentProjectService,\n readonly cdRef:ChangeDetectorRef,\n readonly pathHelper:PathHelperService,\n readonly apiV3Service:ApiV3Service,\n readonly halNotification:HalResourceNotificationService,\n ) {\n super(injector);\n }\n\n ngAfterViewInit() {\n super.ngAfterViewInit();\n\n this.canCreateNewActionElements().then((val) => {\n if (val) {\n this.createAllowed = (input:string) => this.createNewVersion(input);\n this.cdRef.detectChanges();\n }\n });\n }\n\n /**\n * Checks for correct permissions\n * (whether the current project is in the list of allowed values in the version create form)\n * @returns {Promise}\n */\n public canCreateNewActionElements():Promise {\n if (!this.currentProject.id) {\n return Promise.resolve(false);\n }\n\n return firstValueFrom(\n this\n .apiV3Service\n .versions\n .available_projects\n .exists(this.currentProject.id),\n )\n .catch(() => false);\n }\n\n protected createNewVersion(name:string) {\n this\n .apiV3Service\n .versions\n .post(this.getVersionPayload(name))\n .subscribe(\n (version) => this.onCreate.emit(version),\n (error) => {\n this.closeSelect();\n this.halNotification.handleRawError(error);\n },\n );\n }\n\n private getVersionPayload(name:string) {\n const payload:any = {};\n payload.name = name;\n payload._links = {\n definingProject: {\n href: this.apiV3Service.projects.id(this.currentProject.id!).path,\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 { AfterViewInit, Component } from '@angular/core';\nimport { CreateAutocompleterComponent } from 'core-app/shared/components/autocompleter/create-autocompleter/create-autocompleter.component';\n\n@Component({\n templateUrl: '../create-autocompleter/create-autocompleter.component.html',\n selector: 'wp-autocompleter',\n})\nexport class WorkPackageAutocompleterComponent extends CreateAutocompleterComponent implements AfterViewInit {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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';\n\nexport const collapsibleSectionAugmentSelector = 'collapsible-section-augment';\n\n@Component({\n selector: collapsibleSectionAugmentSelector,\n templateUrl: './collapsible-section.html',\n})\nexport class CollapsibleSectionComponent implements OnInit {\n public expanded = false;\n\n public sectionTitle:string;\n\n @ViewChild('sectionBody', { static: true }) public sectionBody:ElementRef;\n\n constructor(public elementRef:ElementRef) {\n }\n\n ngOnInit():void {\n const element:HTMLElement = this.elementRef.nativeElement;\n\n this.sectionTitle = element.getAttribute('section-title')!;\n if (element.getAttribute('initially-expanded') === 'true') {\n this.expanded = true;\n }\n\n const target:HTMLElement = element.nextElementSibling as HTMLElement;\n this.sectionBody.nativeElement.appendChild(target);\n target.removeAttribute('hidden');\n }\n\n public toggle(event:Event) {\n this.expanded = !this.expanded;\n event.preventDefault();\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, ElementRef, OnInit } from '@angular/core';\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';\n\nexport const colorsAutocompleterSelector = 'colors-autocompleter';\n\n@Component({\n template: `\n \n \n {{item.name}}\n \n \n {{item.name}}\n \n \n `,\n selector: colorsAutocompleterSelector,\n})\nexport class ColorsAutocompleterComponent implements OnInit {\n public options:any[];\n\n public selectedOption:any;\n\n private highlightTextInline = false;\n\n private updateInputField:HTMLInputElement|undefined;\n\n private selectedColorId:string;\n\n constructor(protected elementRef:ElementRef,\n protected readonly I18n:I18nService) {\n }\n\n ngOnInit() {\n this.setColorOptions();\n\n this.updateInputField = document.getElementsByName(this.elementRef.nativeElement.dataset.updateInput)[0] as HTMLInputElement|undefined;\n this.highlightTextInline = JSON.parse(this.elementRef.nativeElement.dataset.highlightTextInline);\n }\n\n public onModelChange(color:any) {\n if (color && this.updateInputField) {\n this.updateInputField.value = color.value;\n }\n }\n\n private setColorOptions() {\n this.options = JSON.parse(this.elementRef.nativeElement.dataset.colors);\n this.options.unshift({ name: this.I18n.t('js.label_no_color'), value: '' });\n\n this.selectedOption = this.options.find((item) => item.selected === true);\n\n if (this.selectedOption) {\n this.selectedOption = this.selectedOption.value;\n } else {\n // Differentiate between \"No color\" and a color that is now not selectable any more\n this.selectedColorId = this.elementRef.nativeElement.dataset.selectedColor;\n this.selectedOption = this.selectedColorId ? this.selectedColorId : '';\n }\n }\n\n private highlightColor(item:any) {\n if (item.value === '') {\n return;\n }\n\n let highlightingClass;\n if (this.highlightTextInline) {\n highlightingClass = '__hl_inline_type_ ';\n } else {\n highlightingClass = '__hl_inline_ ';\n }\n return highlightingClass + Highlighting.colorClass(this.highlightTextInline, item.value);\n }\n}\n","import { Injectable } from '@angular/core';\n\nexport const colorModes = {\n lightHighContrast: 'lightHighContrast',\n light: 'light',\n};\n\n@Injectable({ providedIn: 'root' })\nexport class ColorsService {\n public toHsl(value:string, colorMode?:string):string {\n return `hsl(${this.valueHash(value)}, 50%, ${colorMode === colorModes.lightHighContrast ? '30%' : '50%'})`;\n }\n\n public toHsla(value:string, opacity:number) {\n return `hsla(${this.valueHash(value)}, 50%, 30%, ${opacity}%)`;\n }\n\n protected valueHash(value:string) {\n let hash = 0;\n for (let i = 0; i < value.length; i++) {\n hash = value.charCodeAt(i) + ((hash << 5) - hash);\n }\n\n return hash % 360;\n }\n\n public colorMode():string {\n return document.body.getAttribute('data-light-theme') === 'light_high_contrast' ? colorModes.lightHighContrast : colorModes.light;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 ChangeDetectionStrategy,\n ElementRef,\n OnInit,\n} from '@angular/core';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\nimport { CopyToClipboardService } from './copy-to-clipboard.service';\n\nexport const copyToClipboardSelector = 'copy-to-clipboard';\n\n@Component({\n template: '',\n selector: copyToClipboardSelector,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n\nexport class CopyToClipboardComponent implements OnInit {\n public clickTarget:string;\n\n public clipboardTarget:string;\n\n private target:JQuery;\n\n constructor(\n readonly toastService:ToastService,\n readonly elementRef:ElementRef,\n readonly I18n:I18nService,\n protected copyToClipboardService:CopyToClipboardService,\n ) { }\n\n ngOnInit() {\n const element = this.elementRef.nativeElement;\n // Get inputs as attributes since this is a bootstrapped directive\n this.clickTarget = element.getAttribute('click-target');\n this.clipboardTarget = element.getAttribute('clipboard-target');\n\n jQuery(this.clickTarget).on('click', (evt:JQuery.TriggeredEvent) => this.onClick(evt));\n\n element.classList.add('copy-to-clipboard');\n this.target = jQuery(this.clipboardTarget ? this.clipboardTarget : element);\n }\n\n onClick($event:JQuery.TriggeredEvent) {\n $event.preventDefault();\n // Select the text in case the clipboard is not supported by the browser\n this.target.select().focus();\n this.copyToClipboardService.copy(String(this.target.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 { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n@Injectable({\n providedIn: 'root',\n})\n\nexport class CopyToClipboardService {\n constructor(\n readonly toastService:ToastService,\n readonly I18n:I18nService,\n ) { }\n\n copy(content:string, successMessage?:string) {\n if (!navigator.clipboard) {\n // fallback for browsers that don't support clipboard API at all\n this.addNotification('addError', this.I18n.t('js.clipboard.browser_error', { content }));\n } else {\n void navigator.clipboard.writeText(content)\n .then(() => {\n this.addNotification('addSuccess', successMessage || this.I18n.t('js.clipboard.copied_successful'));\n })\n .catch(() => {\n // fallback when running into e.g. browser permission errors\n this.addNotification('addError', this.I18n.t('js.clipboard.browser_error', { content }));\n });\n }\n }\n\n addNotification(type:'addSuccess'|'addError', message:string) {\n const notification = this.toastService[type](message);\n\n // Remove the notification some time later\n setTimeout(() => this.toastService.remove(notification), 5000);\n }\n}\n","import 'reflect-metadata';\nimport {\n Component,\n ElementRef,\n ɵDirectiveDef,\n} from '@angular/core';\n\n/** We expect an ElementRef to be present on the target class */\nexport interface DatasetInputsDecorated extends Component {\n elementRef:ElementRef;\n}\n\nexport interface DatasetInputsComponent extends DatasetInputsDecorated {\n elementRef:ElementRef;\n [key:string]:unknown;\n}\n\n/**\n * The populateInputsFromDataset function automatically sets input values from `data` attributes set on a component tag.\n * This is useful if you're rendering the tag in the backend but want to provide data to the component via its inputs.\n *\n * Usage:\n *\n * ```\n * @Component({ selector: 'my-component' })\n * export class MyComponent {\n * @Input() someInput:string[] = [];\n *\n * constructor(\n * elementRef:ElementRef,\n * ) {\n * populateInputsFromDataset(this);\n * }\n * }\n * ```\n *\n * Now you can send data from the backend to the component by JSON:\n *\n * <%= content_tag 'my-component',\n * '',\n * data: {\n * 'some-input': ['a', 'b'].to_json\n * }\n * %>\n * Warning: this is only checked during the constructor phase once. Changes to the dataset\n * will not be reflected in the inputs. If you need inputs that update, use normal Angular bindings.\n */\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\nexport function populateInputsFromDataset(instance:DatasetInputsDecorated):any {\n // TypeScript won't allow us to do the necessary metaprogramming here since it does not\n // know about these keys (probably because we should not touch them)\n const cstr = instance.constructor as unknown as DatasetInputsComponent;\n\n // Here we find the declared input names of the component.\n // With them way we can make sure we don't overwrite any non-input values.\n // This seems to always be ɵcmp, but we don't want to depend on that knowledge.\n // FIXME: Is there a better way to get to this information? It does not seem to be part of Reflect metadata\n const declaredInputsParentKey = Object.keys(cstr)\n .find((key:string) => typeof (cstr[key] as ɵDirectiveDef).declaredInputs === 'object');\n\n if (!declaredInputsParentKey) {\n console.warn('Could not find declared inputs for component');\n return;\n }\n\n const input = cstr[declaredInputsParentKey] as ɵDirectiveDef;\n const inputs = input.declaredInputs as { [key:string]:string };\n\n Object.keys(inputs)\n .forEach((outsideName) => {\n const insideName = inputs[outsideName];\n\n const { dataset } = (instance as unknown as DatasetInputsComponent).elementRef.nativeElement;\n\n if (!dataset[outsideName]) {\n return;\n }\n\n try {\n (instance as unknown as DatasetInputsComponent)[insideName] = JSON.parse(dataset[outsideName] || '');\n } catch (err) {\n console.error(\"Couldn't parse input: \", outsideName, instance.elementRef.nativeElement.dataset);\n console.error(`\nMake sure to make all data attributes you want to use as input JSON parseable.\nThis means that plain strings have to be wrapped in double quotes, and the attribute value is easiest to set with single quotes.\nAn example:\n\n\n`);\n\n // Rethrow since an error at this point is basically a syntax error and should be fixed\n throw err;\n }\n });\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { TimezoneService } from 'core-app/core/datetime/timezone.service';\n\n@Component({\n selector: 'op-date-time',\n template: `\n \n \n  \n \n \n `,\n})\nexport class OpDateTimeComponent {\n @Input('dateTimeValue') dateTimeValue:any;\n\n public date:any;\n\n public time:any;\n\n constructor(readonly timezoneService:TimezoneService) {\n }\n\n ngOnInit() {\n const c = this.timezoneService.formattedDatetimeComponents(this.dateTimeValue);\n this.date = c[0];\n this.time = c[1];\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 Input,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n map,\n take,\n} from 'rxjs/operators';\nimport { StateService } from '@uirouter/core';\nimport { DateModalRelationsService } from 'core-app/shared/components/datepicker/services/date-modal-relations.service';\n\n@Component({\n selector: 'op-datepicker-banner',\n templateUrl: './datepicker-banner.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OpDatePickerBannerComponent {\n @Input() scheduleManually = false;\n\n hasRelations$ = this.dateModalRelations.hasRelations$;\n\n hasPrecedingRelations$ = this\n .dateModalRelations\n .precedingWorkPackages$\n .pipe(\n map((relations) => relations?.length > 0),\n );\n\n hasFollowingRelations$ = this\n .dateModalRelations\n .followingWorkPackages$\n .pipe(\n map((relations) => relations?.length > 0),\n );\n\n get isParent() {\n return this.dateModalRelations.isParent;\n }\n\n get isChild() {\n return this.dateModalRelations.isChild;\n }\n\n text = {\n automatically_scheduled_parent: this.I18n.t('js.work_packages.datepicker_modal.automatically_scheduled_parent'),\n manually_scheduled: this.I18n.t('js.work_packages.datepicker_modal.manually_scheduled'),\n start_date_limited_by_relations: this.I18n.t('js.work_packages.datepicker_modal.start_date_limited_by_relations'),\n changing_dates_affects_follow_relations: this.I18n.t('js.work_packages.datepicker_modal.changing_dates_affects_follow_relations'),\n click_on_show_relations_to_open_gantt: this.I18n.t(\n 'js.work_packages.datepicker_modal.click_on_show_relations_to_open_gantt',\n { button_name: this.I18n.t('js.work_packages.datepicker_modal.show_relations') },\n ),\n show_relations_button: this.I18n.t('js.work_packages.datepicker_modal.show_relations'),\n };\n\n constructor(\n readonly dateModalRelations:DateModalRelationsService,\n readonly injector:Injector,\n readonly I18n:I18nService,\n readonly state:StateService,\n ) {}\n\n openGantt(evt:MouseEvent):void {\n evt.preventDefault();\n\n this\n .dateModalRelations\n .getInvolvedWorkPackageIds()\n .pipe(\n take(1),\n )\n .subscribe((ids) => {\n const props = {\n c: ['id', 'subject', 'type', 'status', 'assignee', 'project', 'startDate', 'dueDate'],\n t: 'id:asc',\n tv: true,\n hi: true,\n f: [{ n: 'id', o: '=', v: ids }],\n };\n\n const href = this.state.href(\n 'work-packages.partitioned.list',\n {\n query_id: null,\n projects: null,\n projectPath: null,\n query_props: JSON.stringify(props),\n },\n );\n window.open(href, '_blank');\n });\n }\n}\n","\n\n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 EventEmitter,\n forwardRef,\n HostBinding,\n Injector,\n Input,\n OnInit,\n Output,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\nimport {\n onDayCreate,\n validDate,\n} from 'core-app/shared/components/datepicker/helpers/date-modal.helpers';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { DatePicker } from '../datepicker';\nimport flatpickr from 'flatpickr';\nimport { DayElement } from 'flatpickr/dist/types/instance';\nimport { populateInputsFromDataset } from '../../dataset-inputs';\nimport { debounce } from 'lodash';\nimport { DeviceService } from 'core-app/core/browser/device.service';\n\nexport const rangeSeparator = '-';\n\nexport const opBasicRangeDatePickerSelector = 'op-basic-range-date-picker';\n\n@Component({\n selector: opBasicRangeDatePickerSelector,\n templateUrl: './basic-range-date-picker.component.html',\n styleUrls: [\n '../styles/datepicker.modal.sass',\n './basic-range-date-picker.component.sass',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OpBasicRangeDatePickerComponent),\n multi: true,\n },\n ],\n})\nexport class OpBasicRangeDatePickerComponent implements OnInit, ControlValueAccessor, AfterViewInit {\n @HostBinding('class.op-basic-range-datepicker') className = true;\n\n @HostBinding('class.op-basic-range-datepicker_mobile') mobile = false;\n\n @Output() valueChange = new EventEmitter();\n\n private _value:string[] = [];\n\n @Input() set value(newValue:string|string[]) {\n if (typeof newValue === 'string') {\n this._value = newValue.split(/\\s-\\s/);\n } else {\n this._value = newValue;\n }\n\n this.stringValue = this.resolveDateArrayToString(this._value);\n }\n\n get value() {\n return this._value;\n }\n\n @Input() id = `flatpickr-input-${+(new Date())}`;\n\n @Input() name = '';\n\n @Input() required = false;\n\n @Input() disabled = false;\n\n @Input() minimalDate:Date|null = null;\n\n @Input() inputClassNames = '';\n\n @ViewChild('input') input:ElementRef;\n\n stringValue = '';\n\n datePickerInstance:DatePicker;\n\n text = {\n date: this.I18n.t('js.work_packages.properties.date'),\n placeholder: this.I18n.t('js.placeholders.default'),\n spacer: this.I18n.t('js.filter.value_spacer'),\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly timezoneService:TimezoneService,\n readonly injector:Injector,\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef,\n readonly deviceService:DeviceService,\n ) {\n populateInputsFromDataset(this);\n }\n\n ngOnInit() {\n this.mobile = this.deviceService.isMobile;\n }\n\n ngAfterViewInit():void {\n if (!this.mobile) {\n this.initializeDatePicker();\n }\n }\n\n changeValueFromInputDebounced = debounce(this.changeValueFromInput.bind(this), 16);\n\n changeValueFromInput(value:string|string[]) {\n const newDates = (typeof value === 'string') ? this.resolveDateStringToArray(value) : value;\n\n this.onChange(newDates);\n this.onTouched(newDates);\n this.writeValue(newDates);\n this.cdRef.detectChanges();\n\n if (newDates.find((el) => !validDate(el))) {\n return;\n }\n\n this.valueChange.emit(newDates);\n }\n\n showDatePicker():void {\n this.datePickerInstance?.show();\n }\n\n private initializeDatePicker() {\n this.datePickerInstance = new DatePicker(\n this.injector,\n this.id,\n this.value || '',\n {\n allowInput: true,\n mode: 'range',\n showMonths: 2,\n onReady: (_date:Date[], _datestr:string, instance:flatpickr.Instance) => {\n instance.calendarContainer.classList.add('op-datepicker-modal--flatpickr-instance');\n },\n onChange: (dates:Date[], dateStr:string) => {\n if (dates.length === 2) {\n const value = this.resolveDateStringToArray(dateStr);\n this.writeValue(value);\n this.onChange(value);\n this.onTouched(value);\n }\n\n this.cdRef.detectChanges();\n },\n onDayCreate: async (dObj:Date[], dStr:string, fp:flatpickr.Instance, dayElem:DayElement) => {\n onDayCreate(\n dayElem,\n true,\n await this.datePickerInstance?.isNonWorkingDay(dayElem.dateObj),\n !!this.minimalDate && dayElem.dateObj <= this.minimalDate,\n );\n },\n },\n this.input.nativeElement as HTMLInputElement,\n );\n }\n\n writeValue(value:string[]):void {\n this.value = value;\n }\n\n onChange = (_:string[]):void => {};\n\n onTouched = (_:string[]):void => {};\n\n registerOnChange(fn:(_:string[]) => void):void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn:(_:string[]) => void):void {\n this.onTouched = fn;\n }\n\n // eslint-disable-next-line class-methods-use-this\n private resolveDateStringToArray(dates:string):string[] {\n return dates.split(` ${rangeSeparator} `).map((date) => date.trim());\n }\n\n // eslint-disable-next-line class-methods-use-this\n private resolveDateArrayToString(dates:string[]):string {\n return dates.join(` ${rangeSeparator} `);\n }\n}\n","\n\n\n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n Injector,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\nimport {\n onDayCreate,\n validDate,\n} from 'core-app/shared/components/datepicker/helpers/date-modal.helpers';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { DatePicker } from '../datepicker';\nimport flatpickr from 'flatpickr';\nimport { DayElement } from 'flatpickr/dist/types/instance';\nimport { populateInputsFromDataset } from '../../dataset-inputs';\nimport { DeviceService } from 'core-app/core/browser/device.service';\n\nexport const opBasicSingleDatePickerSelector = 'op-basic-single-date-picker';\n\n@Component({\n selector: opBasicSingleDatePickerSelector,\n templateUrl: './basic-single-date-picker.component.html',\n styleUrls: ['../styles/datepicker.modal.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OpBasicSingleDatePickerComponent),\n multi: true,\n },\n ],\n})\nexport class OpBasicSingleDatePickerComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnDestroy {\n @Output() valueChange = new EventEmitter();\n\n @Output() picked = new EventEmitter();\n\n private _value = '';\n\n @Input() set value(newValue:string) {\n this._value = newValue;\n }\n\n get value() {\n return this._value;\n }\n\n @Input() id = `flatpickr-input-${+(new Date())}`;\n\n @Input() name = '';\n\n @Input() required = false;\n\n @Input() disabled = false;\n\n @Input() minimalDate:Date|null = null;\n\n @Input() inputClassNames = '';\n\n @Input() remoteFieldKey = null;\n\n @ViewChild('input') input:ElementRef;\n\n mobile = false;\n\n text = {\n date: this.I18n.t('js.work_packages.properties.date'),\n placeholder: this.I18n.t('js.placeholders.default'),\n };\n\n public datePickerInstance:DatePicker;\n\n constructor(\n readonly I18n:I18nService,\n readonly timezoneService:TimezoneService,\n readonly injector:Injector,\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef,\n readonly deviceService:DeviceService,\n ) {\n populateInputsFromDataset(this);\n }\n\n ngOnInit() {\n this.mobile = this.deviceService.isMobile;\n }\n\n ngAfterViewInit():void {\n if (!this.mobile) {\n this.initializeDatePicker();\n }\n }\n\n ngOnDestroy():void {\n this.datePickerInstance?.destroy();\n }\n\n changeValueFromInput(value:string) {\n if (validDate(value)) {\n this.onTouched(value);\n this.onChange(value);\n this.writeValue(value);\n this.datePickerInstance?.setDates(value);\n this.valueChange.emit(value);\n }\n }\n\n showDatePicker():void {\n this.datePickerInstance?.show();\n }\n\n private initializeDatePicker() {\n this.datePickerInstance = new DatePicker(\n this.injector,\n this.id,\n this.value || '',\n {\n allowInput: true,\n mode: 'single',\n showMonths: 1,\n onReady: (_date:Date[], _datestr:string, instance:flatpickr.Instance) => {\n instance.calendarContainer.classList.add('op-datepicker-modal--flatpickr-instance');\n },\n onChange: (_:Date[], dateStr:string) => {\n this.writeValue(dateStr);\n if (dateStr.length > 0) {\n const dateString = this.timezoneService.formattedISODate(dateStr);\n this.valueChange.emit(dateString);\n this.onTouched(dateString);\n this.onChange(dateString);\n this.writeValue(dateString);\n this.picked.emit();\n }\n\n this.cdRef.detectChanges();\n },\n onDayCreate: async (_dObj:Date[], _dStr:string, _fp:flatpickr.Instance, dayElem:DayElement) => {\n onDayCreate(\n dayElem,\n true,\n await this.datePickerInstance?.isNonWorkingDay(dayElem.dateObj),\n !!this.minimalDate && dayElem.dateObj <= this.minimalDate,\n );\n },\n },\n this.input.nativeElement as HTMLInputElement,\n );\n }\n\n writeValue(value:string):void {\n this.value = value;\n this.datePickerInstance?.setDates(this.value);\n }\n\n onChange = (_:string):void => {};\n\n onTouched = (_:string):void => {};\n\n registerOnChange(fn:(_:string) => void):void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn:(_:string) => void):void {\n this.onTouched = fn;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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 flatpickr from 'flatpickr';\nimport { Instance } from 'flatpickr/dist/types/instance';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { Injector } from '@angular/core';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\nimport { rangeSeparator } from './constants';\n\nimport Options = flatpickr.Options;\nimport FlatpickrOptions = flatpickr.Options.Options;\nimport DateOption = Options.DateOption;\nimport { DayResourceService } from 'core-app/core/state/days/day.service';\n\nexport class DatePicker {\n private datepickerFormat = 'Y-m-d';\n\n public datepickerInstance:Instance;\n\n @InjectField() configurationService:ConfigurationService;\n\n @InjectField() weekdaysService:WeekdayService;\n\n @InjectField() daysService:DayResourceService;\n\n @InjectField() I18n:I18nService;\n\n private weekdaysPromise:Promise;\n\n constructor(\n readonly injector:Injector,\n private datepickerElemIdentifier:string,\n private date:Date|Date[]|string[]|string,\n private options:flatpickr.Options.Options,\n private datepickerTarget:HTMLElement|null,\n ) {\n void this.initialize(options);\n }\n\n private initialize(options:flatpickr.Options.Options) {\n this.weekdaysPromise = this\n .weekdaysService\n .loadWeekdays()\n .toPromise()\n .then(() => {\n if (this.datepickerInstance) {\n this.datepickerInstance.redraw();\n }\n });\n\n const mergedOptions = _.extend({}, this.defaultOptions, options);\n\n let datePickerInstances:Instance|Instance[];\n if (this.datepickerTarget) {\n datePickerInstances = flatpickr(this.datepickerTarget as Node, mergedOptions);\n } else {\n datePickerInstances = flatpickr(this.datepickerElemIdentifier, mergedOptions);\n }\n\n this.datepickerInstance = Array.isArray(datePickerInstances) ? datePickerInstances[0] : datePickerInstances;\n }\n\n public async isNonWorkingDay(day:Date):Promise {\n return this.weekdaysService.isNonWorkingDay(day) || await this.daysService.isNonWorkingDay$(day);\n }\n\n public clear():void {\n this.datepickerInstance.clear();\n }\n\n public destroy():void {\n this.hide();\n this.datepickerInstance?.destroy();\n }\n\n public hide():void {\n if (this.isOpen) {\n this.datepickerInstance.close();\n }\n }\n\n public show():void {\n this.datepickerInstance.open();\n }\n\n public setDates(dates:DateOption|DateOption[]):void {\n this.datepickerInstance.setDate(dates);\n }\n\n public setOption(\n option:keyof FlatpickrOptions|{ [k in keyof FlatpickrOptions]?:FlatpickrOptions[k] },\n value:unknown,\n ):void {\n this.datepickerInstance.set(option, value);\n }\n\n public get isOpen():boolean {\n return this.datepickerInstance.isOpen;\n }\n\n private get defaultOptions() {\n const firstDayOfWeek = this.configurationService.startOfWeek();\n\n return {\n weekNumbers: true,\n getWeek(dateObj:Date) {\n return moment(dateObj).format('W');\n },\n dateFormat: this.datepickerFormat,\n defaultDate: this.date,\n locale: {\n weekdays: {\n shorthand: this.I18n.t('date.abbr_day_names'),\n longhand: this.I18n.t('date.day_names'),\n },\n months: {\n shorthand: this.I18n.t('date.abbr_month_names').slice(1),\n longhand: this.I18n.t('date.month_names').slice(1),\n },\n firstDayOfWeek,\n weekAbbreviation: this.I18n.t('date.abbr_week'),\n rangeSeparator: ` ${rangeSeparator} `,\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 { DatePicker } from 'core-app/shared/components/datepicker/datepicker';\nimport { DateOption } from 'flatpickr/dist/types/options';\nimport { DayElement } from 'flatpickr/dist/types/instance';\nimport * as moment from 'moment-timezone';\n\n/**\n * Map the date to the internal format,\n * setting to null if it's empty.\n * @param date\n */\n// eslint-disable-next-line class-methods-use-this\nexport function mappedDate(date:string|null):string|null {\n return (date === '') ? null : date;\n}\n\n// eslint-disable-next-line class-methods-use-this\nexport function parseDate(date:Date|string):Date|'' {\n if (date instanceof Date) {\n return new Date(date.setHours(0, 0, 0, 0));\n }\n if (date === '') {\n return '';\n }\n return new Date(moment(date).toDate().setHours(0, 0, 0, 0));\n}\n\nexport function validDate(date:Date|string):boolean {\n return (date instanceof Date)\n || (date === '')\n || !!/^\\d{4}-\\d{2}-\\d{2}$/.exec(date);\n}\n\nexport function areDatesEqual(firstDate:Date|string, secondDate:Date|string):boolean {\n const parsedDate1 = parseDate(firstDate);\n const parsedDate2 = parseDate(secondDate);\n\n if ((typeof (parsedDate1) === 'string') || (typeof (parsedDate2) === 'string')) {\n return false;\n }\n return parsedDate1.getTime() === parsedDate2.getTime();\n}\n\nexport function keepCurrentlyActiveMonth(datePicker:DatePicker, currentMonth:number, currentYear:number):void {\n // Keep currently active month and avoid jump because of two-month layout\n datePicker.datepickerInstance.currentMonth = currentMonth;\n datePicker.datepickerInstance.currentYear = currentYear;\n}\n\nexport function comparableDate(date?:DateOption):number|null {\n if (!date || typeof date === 'string') {\n return null;\n }\n\n if (typeof date === 'number') {\n return date;\n }\n\n return date.getTime();\n}\n\nexport function setDates(dates:DateOption|DateOption[], datePicker:DatePicker, enforceDate?:Date):void {\n const { currentMonth, currentYear, selectedDates } = datePicker.datepickerInstance;\n\n const [newStart, newEnd] = _.castArray(dates);\n const [selectedStart, selectedEnd] = selectedDates;\n\n // In case the new times match the current times, do not try to update\n // the current selected months (Regression #46488)\n if (selectedDates.length > 0\n && comparableDate(newStart) === comparableDate(selectedStart)\n && comparableDate(newEnd) === comparableDate(selectedEnd)\n ) {\n return;\n }\n\n datePicker.setDates(dates);\n\n if (enforceDate) {\n const enforcedMonth = enforceDate.getMonth();\n const enforcedYear = enforceDate.getFullYear();\n const monthDiff = enforcedMonth - currentMonth + 12 * (enforcedYear - currentYear);\n\n // Because of the two-month layout we only have to update the calendar\n // if the month is further in the past/future than the one additional month that is shown anyway\n if (Math.abs(monthDiff) > 1) {\n datePicker.datepickerInstance.currentMonth = enforcedMonth;\n datePicker.datepickerInstance.currentYear = enforcedYear;\n } else {\n keepCurrentlyActiveMonth(datePicker, currentMonth, currentYear);\n }\n } else {\n keepCurrentlyActiveMonth(datePicker, currentMonth, currentYear);\n }\n\n datePicker.datepickerInstance.redraw();\n}\n\nexport function onDayCreate(\n dayElem:DayElement,\n ignoreNonWorkingDays:boolean,\n isNonWorkingDay:boolean,\n isDayDisabled:boolean,\n):void {\n dayElem.setAttribute('data-iso-date', dayElem.dateObj.toISOString());\n\n if (isDayDisabled) {\n dayElem.classList.add('flatpickr-disabled');\n return;\n }\n\n if (ignoreNonWorkingDays && isNonWorkingDay) {\n dayElem.classList.add('flatpickr-non-working-day_enabled');\n } else if (!ignoreNonWorkingDays && isNonWorkingDay) {\n dayElem.classList.add('flatpickr-non-working-day');\n }\n}\n","\n \n \n \n \n\n \n \n \n \n \n\n \n\n \n \n \n \n \n\n
\n\n
\n
\n \n \n
\n
\n \n
\n\n\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n Injector,\n Input,\n OnInit,\n Output,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\nimport {\n onDayCreate,\n parseDate,\n setDates,\n} from 'core-app/shared/components/datepicker/helpers/date-modal.helpers';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { DatePicker } from '../datepicker';\nimport flatpickr from 'flatpickr';\nimport { DayElement } from 'flatpickr/dist/types/instance';\nimport { populateInputsFromDataset } from '../../dataset-inputs';\nimport { debounce } from 'lodash';\nimport { SpotDropModalTeleportationService } from 'core-app/spot/components/drop-modal/drop-modal-teleportation.service';\n\nexport const opModalSingleDatePickerSelector = 'op-modal-single-date-picker';\n\n@Component({\n selector: opModalSingleDatePickerSelector,\n templateUrl: './modal-single-date-picker.component.html',\n styleUrls: ['../styles/datepicker.modal.sass', './modal-single-date-picker.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OpModalSingleDatePickerComponent),\n multi: true,\n },\n ],\n})\nexport class OpModalSingleDatePickerComponent implements ControlValueAccessor, OnInit, AfterContentInit {\n @Output('closed') closed = new EventEmitter();\n\n @Output('valueChange') valueChange = new EventEmitter();\n\n private _value = '';\n\n @Input() set value(newValue:string) {\n this._value = newValue;\n this.writeWorkingValue(newValue);\n }\n\n get value() {\n return this._value;\n }\n\n @Input() id = `flatpickr-input-${+(new Date())}`;\n\n @Input() name = '';\n\n @Input() remoteFieldKey = '';\n\n @Input() required = false;\n\n @Input() minimalDate:Date|null = null;\n\n @Input() applyLabel:string;\n\n private _opened = false;\n\n @Input() set opened(opened:boolean) {\n if (this._opened === !!opened) {\n return;\n }\n\n this._opened = !!opened;\n\n if (this._opened) {\n this.initializeDatepickerAfterOpen();\n } else {\n this.closed.emit();\n }\n }\n\n get opened() {\n return this._opened;\n }\n\n @Input() showIgnoreNonWorkingDays = false;\n\n @Input() ignoreNonWorkingDays = false;\n\n @ViewChild('flatpickrTarget') flatpickrTarget:ElementRef;\n\n public workingValue = '';\n\n public workingDate:Date|null = null;\n\n public datePickerInstance:DatePicker;\n\n public useDefaultTrigger = false;\n\n text = {\n apply: this.I18n.t('js.modals.button_apply'),\n cancel: this.I18n.t('js.button_cancel'),\n date: this.I18n.t('js.work_packages.properties.date'),\n placeholder: this.I18n.t('js.placeholders.default'),\n today: this.I18n.t('js.label_today'),\n ignoreNonWorkingDays: {\n title: this.I18n.t('js.work_packages.datepicker_modal.ignore_non_working_days.title'),\n },\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly timezoneService:TimezoneService,\n readonly injector:Injector,\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef,\n readonly spotDropModalTeleportationService:SpotDropModalTeleportationService,\n ) {\n populateInputsFromDataset(this);\n }\n\n ngOnInit() {\n this.applyLabel = this.applyLabel || this.text.apply;\n }\n\n ngAfterContentInit() {\n const trigger = (this.elementRef.nativeElement as HTMLElement).querySelector(\"[slot='trigger']\");\n this.useDefaultTrigger = trigger === null;\n }\n\n onInputClick(event:MouseEvent) {\n event.stopPropagation();\n }\n\n save($event:Event) {\n const form = $event.target as HTMLFormElement;\n\n if (form.reportValidity()) {\n $event.preventDefault();\n this.valueChange.emit(this.workingValue);\n this.onChange(this.workingValue);\n this.writeValue(this.workingValue);\n this.opened = false;\n this.workingValue = '';\n this.cdRef.detectChanges();\n }\n }\n\n setToday():void {\n const today = parseDate(new Date()) as Date;\n this.writeWorkingValue(this.timezoneService.formattedISODate(today));\n this.enforceManualChangesToDatepicker(today);\n }\n\n changeNonWorkingDays():void {\n this.initializeDatepickerAfterOpen();\n this.cdRef.detectChanges();\n }\n\n changeValueFromInputDebounced = debounce(this.changeValueFromInput.bind(this), 16);\n\n changeValueFromInput(value:string) {\n this.valueChange.emit(value);\n this.onChange(value);\n this.writeValue(value);\n\n const date = parseDate(value || '');\n\n if (date !== '') {\n const dateString = this.timezoneService.formattedISODate(date);\n this.writeWorkingValue(dateString);\n this.enforceManualChangesToDatepicker(date);\n this.onTouched(dateString);\n }\n this.cdRef.detectChanges();\n }\n\n private enforceManualChangesToDatepicker(enforceDate?:Date) {\n const date = parseDate(this.workingDate || '');\n setDates(date, this.datePickerInstance, enforceDate);\n }\n\n private initializeDatepickerAfterOpen():void {\n this.spotDropModalTeleportationService\n .afterRenderOnce$(true)\n .subscribe(() => {\n this.initializeDatepicker();\n });\n }\n\n private initializeDatepicker() {\n this.datePickerInstance?.destroy();\n\n // Initialize the working values.\n const initialDate = parseDate(this.value || new Date()) as Date;\n this.writeWorkingValue(this.timezoneService.formattedISODate(initialDate));\n\n this.datePickerInstance = new DatePicker(\n this.injector,\n this.id,\n this.workingDate || '',\n {\n mode: 'single',\n showMonths: 1,\n inline: true,\n onReady: (_date:Date[], _datestr:string, instance:flatpickr.Instance) => {\n instance.calendarContainer.classList.add('op-datepicker-modal--flatpickr-instance');\n },\n onChange: (dates:Date[]) => {\n if (dates.length > 0) {\n const dateString = this.timezoneService.formattedISODate(dates[0]);\n this.writeWorkingValue(dateString);\n this.enforceManualChangesToDatepicker(dates[0]);\n this.onTouched(dateString);\n }\n\n this.cdRef.detectChanges();\n },\n onDayCreate: async (dObj:Date[], dStr:string, fp:flatpickr.Instance, dayElem:DayElement) => {\n onDayCreate(\n dayElem,\n !this.ignoreNonWorkingDays,\n await this.datePickerInstance?.isNonWorkingDay(dayElem.dateObj),\n !!this.minimalDate && dayElem.dateObj <= this.minimalDate,\n );\n },\n },\n this.flatpickrTarget.nativeElement as HTMLElement,\n );\n }\n\n writeWorkingValue(value:string):void {\n const date = new Date(value);\n // since new Date() returns a date in our local timezone, we need to find the UTC date\n const utcDate = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds());\n this.workingValue = value;\n this.workingDate = utcDate;\n }\n\n writeValue(value:string):void {\n this.writeWorkingValue(value);\n this.value = value;\n }\n\n onChange = (_:string):void => {};\n\n onTouched = (_:string):void => {};\n\n registerOnChange(fn:(_:string) => void):void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn:(_:string) => void):void {\n this.onTouched = fn;\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n forwardRef,\n Input,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\n@Component({\n selector: 'op-datepicker-scheduling-toggle',\n templateUrl: './datepicker-scheduling-toggle.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OpDatePickerSchedulingToggleComponent),\n multi: true,\n }],\n})\nexport class OpDatePickerSchedulingToggleComponent implements ControlValueAccessor {\n text = {\n scheduling: {\n title: this.I18n.t('js.scheduling.manual'),\n },\n };\n\n @Input() scheduleManually:boolean;\n\n constructor(\n private I18n:I18nService,\n private cdRef:ChangeDetectorRef,\n ) { }\n\n onChange = (_:boolean):void => {};\n\n onTouched = (_:boolean):void => {};\n\n registerOnChange(fn:(_:boolean) => void):void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn:(_:boolean) => void):void {\n this.onTouched = fn;\n }\n\n writeValue(val:boolean):void {\n this.scheduleManually = val;\n this.cdRef.markForCheck();\n }\n\n onToggle(value:boolean):void {\n this.writeValue(value);\n this.onChange(value);\n this.onTouched(value);\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 Injectable,\n} from '@angular/core';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3Filter } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport {\n defaultIfEmpty,\n filter,\n map,\n shareReplay,\n switchMap,\n take,\n tap,\n} from 'rxjs/operators';\nimport {\n combineLatest,\n Observable,\n ReplaySubject,\n Subject,\n} from 'rxjs';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { parseDate } from 'core-app/shared/components/datepicker/helpers/date-modal.helpers';\n\n@Injectable()\nexport class DateModalRelationsService {\n private changeset$:Subject = new ReplaySubject();\n private changeset:WorkPackageChangeset;\n\n setChangeset(changeset:WorkPackageChangeset) {\n this.changeset$.next(changeset);\n this.changeset = changeset;\n }\n\n precedingWorkPackages$:Observable<{ id:string, dueDate?:string, date?:string }[]> = this.changeset$\n .pipe(\n filter((changeset) => !isNewResource(changeset.pristineResource)),\n switchMap((changeset) => this\n .apiV3Service\n .work_packages\n .signalled(\n ApiV3Filter('precedes', '=', [changeset.id]),\n [\n 'elements/id',\n 'elements/dueDate',\n 'elements/date',\n ],\n )),\n map((collection:IHALCollection<{ id:string }>) => collection._embedded.elements || []),\n defaultIfEmpty([]),\n shareReplay(1),\n );\n\n followingWorkPackages$:Observable<{ id:string }[]> = this.changeset$\n .pipe(\n filter((changeset) => !isNewResource(changeset.pristineResource)),\n switchMap((changeset) => this\n .apiV3Service\n .work_packages\n .signalled(\n ApiV3Filter('follows', '=', [changeset.id]),\n ['elements/id'],\n )),\n map((collection:IHALCollection<{ id:string }>) => collection._embedded.elements || []),\n defaultIfEmpty([]),\n shareReplay(1),\n );\n\n hasRelations$ = combineLatest([\n this.precedingWorkPackages$,\n this.followingWorkPackages$,\n ])\n .pipe(\n map(([precedes, follows]) => precedes.length > 0 || follows.length > 0 || this.isParent || this.isChild),\n );\n\n constructor(\n private apiV3Service:ApiV3Service,\n ) {}\n\n getMinimalDateFromPreceeding():Observable {\n return this\n .precedingWorkPackages$\n .pipe(\n take(1),\n map((relation) => this.minimalDateFromPrecedingRelationship(relation)),\n );\n }\n\n private minimalDateFromPrecedingRelationship(relations:{ id:string, dueDate?:string, date?:string }[]):Date|null {\n if (relations.length === 0) {\n return null;\n }\n\n let minimalDate:Date|null = null;\n\n relations.forEach((relation) => {\n if (!relation.dueDate && !relation.date) {\n return;\n }\n\n const relationDate = relation.dueDate || relation.date;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const parsedRelationDate = parseDate(relationDate!);\n\n if (!minimalDate || minimalDate < parsedRelationDate) {\n minimalDate = parsedRelationDate === '' ? null : parsedRelationDate;\n }\n });\n\n return minimalDate;\n }\n\n /**\n * Determines whether the work package is a child. It does so\n * by checking the ancestors links.\n */\n get isChild():boolean {\n return this.ancestors.length > 0;\n }\n\n get ancestors():HalResource[] {\n const wp = this.changeset.projectedResource;\n return wp.getAncestors() || [];\n }\n\n /**\n * Determines whether the work package is a parent. It does so\n * by checking the children links.\n */\n get isParent():boolean {\n return this.children.length > 0;\n }\n\n get children():HalResource[] {\n const wp = this.changeset.projectedResource;\n return wp.children || [];\n }\n\n getInvolvedWorkPackageIds():Observable {\n return combineLatest([\n this.precedingWorkPackages$,\n this.followingWorkPackages$,\n ])\n .pipe(\n map(\n ([preceding, following]) => [\n this.changeset.pristineResource,\n ...preceding,\n ...following,\n ...this.children,\n ...this.ancestors,\n ].map((el) => el.id as string),\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 Injectable,\n} from '@angular/core';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { DateModalRelationsService } from 'core-app/shared/components/datepicker/services/date-modal-relations.service';\nimport { DayElement } from 'flatpickr/dist/types/instance';\n\n@Injectable()\nexport class DateModalSchedulingService {\n private changeset:WorkPackageChangeset;\n\n scheduleManually = false;\n\n constructor(\n readonly dateModalRelations:DateModalRelationsService,\n ) {}\n\n setChangeset(changeset:WorkPackageChangeset) {\n this.changeset = changeset;\n this.scheduleManually = !!this.changeset.value('scheduleManually');\n }\n\n /**\n * Returns whether the user can alter the dates of the work package.\n */\n get isSchedulable():boolean {\n return this.scheduleManually || !this.dateModalRelations.isParent;\n }\n\n isDayDisabled(dayElement:DayElement, minimalDate?:Date|null):boolean {\n return !this.isSchedulable || (!this.scheduleManually && !!minimalDate && dayElement.dateObj <= minimalDate);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 EventEmitter,\n HostBinding,\n Injector,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { onDayCreate } from 'core-app/shared/components/datepicker/helpers/date-modal.helpers';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { DatePicker } from '../datepicker';\nimport flatpickr from 'flatpickr';\nimport { DayElement } from 'flatpickr/dist/types/instance';\nimport { DeviceService } from 'core-app/core/browser/device.service';\n\n@Component({\n selector: 'op-datepicker-sheet',\n templateUrl: './date-picker-sheet.component.html',\n styleUrls: [\n '../styles/datepicker.modal.sass',\n './date-picker-sheet.component.sass',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class OpDatePickerSheetComponent implements AfterViewInit, OnChanges {\n @HostBinding('class.op-datepicker-sheet') className = true;\n\n @Input() dates:string[];\n\n @Input() mode:'range'|'single';\n\n @Input() ignoreNonWorkingDays = true;\n\n @Input() isDisabled = (_dayElem:DayElement) => false;\n\n @Output() datesSelected = new EventEmitter();\n\n @ViewChild('flatpickrTarget') flatpickrTarget:ElementRef;\n\n datePickerInstance:DatePicker;\n\n constructor(\n readonly I18n:I18nService,\n readonly timezoneService:TimezoneService,\n readonly injector:Injector,\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef,\n readonly deviceService:DeviceService,\n ) {\n }\n\n ngAfterViewInit():void {\n this.initializeDatepicker();\n }\n\n ngOnChanges(changes:SimpleChanges) {\n if (changes.dates && !changes.dates.isFirstChange()) {\n this.datePickerInstance.setDates(changes.dates.currentValue as string[]);\n }\n\n if (changes.mode && !changes.mode.isFirstChange()) {\n this.initializeDatepicker();\n }\n }\n\n private initializeDatepicker() {\n this.datePickerInstance?.destroy();\n this.datePickerInstance = new DatePicker(\n this.injector,\n '#flatpickr-input',\n this.dates,\n {\n mode: this.mode,\n showMonths: (this.deviceService.isMobile || this.mode === 'single') ? 1 : 2,\n inline: true,\n onChange: (dates:Date[]) => {\n const formatted = dates.map((el:Date) => this.timezoneService.formattedISODate(el));\n this.datesSelected.emit(formatted);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n onDayCreate: async (dObj:Date[], dStr:string, fp:flatpickr.Instance, dayElem:DayElement) => {\n onDayCreate(\n dayElem,\n this.ignoreNonWorkingDays,\n await this.datePickerInstance?.isNonWorkingDay(dayElem.dateObj),\n this.isDisabled(dayElem),\n );\n },\n },\n this.flatpickrTarget.nativeElement,\n );\n }\n}\n","\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n forwardRef,\n Input,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\n@Component({\n selector: 'op-datepicker-working-days-toggle',\n templateUrl: './datepicker-working-days-toggle.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OpDatePickerWorkingDaysToggleComponent),\n multi: true,\n }],\n})\nexport class OpDatePickerWorkingDaysToggleComponent implements ControlValueAccessor {\n @Input() ignoreNonWorkingDays:boolean;\n\n @Input() disabled = false;\n\n text = {\n ignoreNonWorkingDays: {\n title: this.I18n.t('js.work_packages.datepicker_modal.ignore_non_working_days.title'),\n },\n };\n\n constructor(\n private I18n:I18nService,\n private cdRef:ChangeDetectorRef,\n ) {}\n\n onChange = (_:boolean):void => {};\n\n onTouched = (_:boolean):void => {};\n\n registerOnChange(fn:(_:boolean) => void):void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn:(_:boolean) => void):void {\n this.onTouched = fn;\n }\n\n onToggle(value:boolean):void {\n const ignoreNonWorkingDays = !value;\n this.writeValue(ignoreNonWorkingDays);\n this.onChange(ignoreNonWorkingDays);\n this.onTouched(ignoreNonWorkingDays);\n }\n\n writeValue(val:boolean):void {\n this.ignoreNonWorkingDays = val;\n this.cdRef.markForCheck();\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 EventEmitter,\n Input,\n Injector,\n ViewChild,\n ViewEncapsulation,\n OnInit,\n Output,\n HostBinding,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\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 { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { DayElement } from 'flatpickr/dist/types/instance';\nimport flatpickr from 'flatpickr';\nimport {\n debounce,\n debounceTime,\n filter,\n map,\n switchMap,\n} from 'rxjs/operators';\nimport {\n fromEvent,\n merge,\n Observable,\n Subject,\n timer,\n} from 'rxjs';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { FormResource } from 'core-app/features/hal/resources/form-resource';\nimport { DateModalRelationsService } from 'core-app/shared/components/datepicker/services/date-modal-relations.service';\nimport {\n areDatesEqual,\n mappedDate,\n onDayCreate,\n parseDate,\n setDates,\n validDate,\n} from 'core-app/shared/components/datepicker/helpers/date-modal.helpers';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\nimport { FocusHelperService } from 'core-app/shared/directives/focus/focus-helper';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport { DatePicker } from '../datepicker';\n\nimport DateOption = flatpickr.Options.DateOption;\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { DateModalSchedulingService } from '../services/date-modal-scheduling.service';\n\nexport type DateKeys = 'start'|'end';\nexport type DateFields = DateKeys|'duration';\n\nexport type StartUpdate = { startDate:string };\nexport type EndUpdate = { dueDate:string };\nexport type DurationUpdate = { duration:string|number|null };\nexport type DateUpdate = { date:string };\nexport type ActiveDateChange = [DateFields, null|Date|Date];\n\nexport type FieldUpdates =\n StartUpdate\n |EndUpdate\n |(StartUpdate&EndUpdate)\n |(StartUpdate&DurationUpdate)\n |(EndUpdate&DurationUpdate)\n |DateUpdate;\n\n@Component({\n selector: 'op-wp-multi-date-form',\n templateUrl: './wp-multi-date-form.component.html',\n styleUrls: [\n '../styles/datepicker.modal.sass',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n DateModalRelationsService,\n DateModalSchedulingService,\n ],\n})\nexport class OpWpMultiDateFormComponent extends UntilDestroyedMixin implements AfterViewInit, OnInit {\n @HostBinding('class.op-datepicker-modal') className = true;\n\n @HostBinding('class.op-datepicker-modal_wide') classNameWide = true;\n\n @ViewChild('modalContainer') modalContainer:ElementRef;\n\n @ViewChild('durationField', { read: ElementRef }) durationField:ElementRef;\n\n @ViewChild('flatpickrTarget') flatpickrTarget:ElementRef;\n\n @Input() changeset:ResourceChangeset;\n\n @Input() fieldName:string = '';\n\n @Output() cancel = new EventEmitter();\n\n @Output() save = new EventEmitter();\n\n text = {\n save: this.I18n.t('js.button_save'),\n cancel: this.I18n.t('js.button_cancel'),\n startDate: this.I18n.t('js.work_packages.properties.startDate'),\n endDate: this.I18n.t('js.work_packages.properties.dueDate'),\n duration: this.I18n.t('js.work_packages.properties.duration'),\n placeholder: this.I18n.t('js.placeholders.default'),\n today: this.I18n.t('js.label_today'),\n days: (count:number):string => this.I18n.t('js.units.day', { count }),\n };\n\n scheduleManually = false;\n\n ignoreNonWorkingDays = false;\n\n duration:number|null;\n\n currentlyActivatedDateField:DateFields;\n\n htmlId = '';\n\n dates:{ [key in DateKeys]:string|null } = {\n start: null,\n end: null,\n };\n\n // Manual changes from the inputs to start and end dates\n startDateChanged$ = new Subject();\n\n startDateDebounced$:Observable = this.debouncedInput(this.startDateChanged$, 'start');\n\n endDateChanged$ = new Subject();\n\n endDateDebounced$:Observable = this.debouncedInput(this.endDateChanged$, 'end');\n\n // Manual changes to the datepicker, with information which field was active\n datepickerChanged$ = new Subject();\n\n // We want to position the modal as soon as the datepicker gets initialized\n // But if we destroy and recreate the datepicker (e.g., when toggling switches), keep current position\n modalPositioned = false;\n\n // Date updates from the datepicker or a manual change\n dateUpdates$ = merge(\n this.startDateDebounced$,\n this.endDateDebounced$,\n this.datepickerChanged$,\n )\n .pipe(\n this.untilDestroyed(),\n filter(() => !!this.datePickerInstance),\n )\n .subscribe(([field, update]) => {\n // When clearing the one date, clear the others as well\n if (update !== null) {\n this.handleSingleDateUpdate(field, update);\n }\n\n // Clear active field and duration\n // when the active field was cleared\n if (update === null && field !== 'duration') {\n this.clearWithDuration(field);\n }\n\n // The duration field is special in how it handles focus transitions\n // For start/due we just toggle here\n if (update !== null && field !== 'duration') {\n this.toggleCurrentActivatedField();\n }\n\n this.cdRef.detectChanges();\n });\n\n // Duration changes\n durationChanges$ = new Subject();\n\n durationDebounced$ = this\n .durationChanges$\n .pipe(\n this.untilDestroyed(),\n debounce((value) => (value ? timer(500) : timer(0))),\n map((value) => (value === '' ? null : Math.abs(parseInt(value, 10)))),\n filter((val) => val === null || !Number.isNaN(val)),\n filter((val) => val !== this.duration),\n )\n .subscribe((value) => this.applyDurationChange(value));\n\n // Duration is a special field as it changes its value based on its focus state\n // which is different from the highlight state...\n durationFocused = false;\n\n ignoreNonWorkingDaysWritable = true;\n\n private datePickerInstance:DatePicker;\n\n private formUpdates$ = new Subject();\n\n private minimalSchedulingDate:Date|null = null;\n\n constructor(\n readonly injector:Injector,\n readonly cdRef:ChangeDetectorRef,\n readonly apiV3Service:ApiV3Service,\n readonly I18n:I18nService,\n readonly timezoneService:TimezoneService,\n readonly halEditing:HalResourceEditingService,\n readonly dateModalScheduling:DateModalSchedulingService,\n readonly dateModalRelations:DateModalRelationsService,\n readonly deviceService:DeviceService,\n readonly weekdayService:WeekdayService,\n readonly focusHelper:FocusHelperService,\n ) {\n super();\n\n this\n .formUpdates$\n .pipe(\n this.untilDestroyed(),\n switchMap((fieldsToUpdate:FieldUpdates) => this\n .apiV3Service\n .work_packages\n .withOptionalId(this.changeset.id === 'new' ? null : this.changeset.id)\n .form\n .forPayload({\n ...fieldsToUpdate,\n lockVersion: this.changeset.value('lockVersion'),\n ignoreNonWorkingDays: this.ignoreNonWorkingDays,\n scheduleManually: this.scheduleManually,\n })),\n )\n .subscribe((form) => this.updateDatesFromForm(form));\n }\n\n ngOnInit(): void {\n this.htmlId = `wp-datepicker-${this.fieldName as string}`;\n\n this.dateModalScheduling.setChangeset(this.changeset as WorkPackageChangeset);\n this.dateModalRelations.setChangeset(this.changeset as WorkPackageChangeset);\n\n this.scheduleManually = !!this.changeset.value('scheduleManually');\n this.ignoreNonWorkingDays = !!this.changeset.value('ignoreNonWorkingDays');\n\n // Ensure we get the writable values from the loaded form\n void this\n .changeset\n .getForm()\n .then((form) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n this.ignoreNonWorkingDaysWritable = !!form.schema.ignoreNonWorkingDays.writable;\n this.cdRef.detectChanges();\n });\n\n this.setDurationDaysFromUpstream(this.changeset.value('duration'));\n\n this.dates.start = this.changeset.value('startDate');\n this.dates.end = this.changeset.value('dueDate');\n this.setCurrentActivatedField(this.initialActivatedField);\n }\n\n ngAfterViewInit():void {\n const init = () => {\n this.initializeDatepicker();\n\n // Autofocus duration if that's what activated us\n if (this.initialActivatedField === 'duration') {\n this.focusHelper.focus(this.durationField.nativeElement);\n }\n };\n\n if (isNewResource(this.changeset.pristineResource)) {\n init();\n return;\n }\n\n this\n .dateModalRelations\n .getMinimalDateFromPreceeding()\n .subscribe((date) => {\n this.minimalSchedulingDate = date;\n init();\n });\n }\n\n changeSchedulingMode():void {\n // If removing manual scheduling on parent, reset ignoreNWD to original value\n if (this.scheduleManually === false && !this.ignoreNonWorkingDaysWritable) {\n this.ignoreNonWorkingDays = !!this.changeset.value('ignoreNonWorkingDays');\n }\n\n this.datePickerInstance?.datepickerInstance.redraw();\n this.cdRef.detectChanges();\n }\n\n changeNonWorkingDays():void {\n this.datePickerInstance?.datepickerInstance.redraw();\n\n // Resent the current start and duration so that the end date is calculated\n if (!!this.dates.start && !!this.duration) {\n this.formUpdates$.next({ startDate: this.dates.start, duration: this.durationAsIso8601 });\n }\n\n // If only one of the dates is set, sent that\n // Resent the current start and duration so that the end date is calculated\n if (!!this.dates.start && !this.dates.end) {\n this.formUpdates$.next({ startDate: this.dates.start });\n }\n\n if (!!this.dates.end && !this.dates.start) {\n this.formUpdates$.next({ dueDate: this.dates.end });\n }\n\n this.cdRef.detectChanges();\n }\n\n doSave($event:Event):void {\n $event.preventDefault();\n // Apply the changed scheduling mode if any\n this.changeset.setValue('scheduleManually', this.scheduleManually);\n\n // Apply include NWD\n this.changeset.setValue('ignoreNonWorkingDays', this.ignoreNonWorkingDays);\n\n // Apply the dates if they could be changed\n if (this.isSchedulable) {\n this.changeset.setValue('startDate', mappedDate(this.dates.start));\n this.changeset.setValue('dueDate', mappedDate(this.dates.end));\n this.changeset.setValue('duration', this.durationAsIso8601);\n }\n\n this.save.emit();\n }\n\n doCancel():void {\n this.cancel.emit();\n }\n\n updateDate(key:DateKeys, val:string|null):void {\n if ((val === null || validDate(val)) && this.datePickerInstance) {\n this.dates[key] = mappedDate(val);\n const dateValue = parseDate(val || '') || undefined;\n this.enforceManualChangesToDatepicker(dateValue);\n this.cdRef.detectChanges();\n }\n }\n\n setCurrentActivatedField(val:DateFields):void {\n this.currentlyActivatedDateField = val;\n }\n\n toggleCurrentActivatedField():void {\n this.currentlyActivatedDateField = this.currentlyActivatedDateField === 'start' ? 'end' : 'start';\n }\n\n isStateOfCurrentActivatedField(val:DateFields):boolean {\n return this.currentlyActivatedDateField === val;\n }\n\n setToday(key:DateKeys):void {\n this.datepickerChanged$.next([key, new Date()]);\n }\n\n showTodayLink():boolean {\n return this.isSchedulable;\n }\n\n /**\n * Returns whether the user can alter the dates of the work package.\n */\n get isSchedulable():boolean {\n return this.scheduleManually || !this.dateModalRelations.isParent;\n }\n\n showFieldAsActive(field:DateFields):boolean {\n return this.isStateOfCurrentActivatedField(field) && this.isSchedulable;\n }\n\n handleDurationFocusIn():void {\n this.durationFocused = true;\n this.setCurrentActivatedField('duration');\n }\n\n handleDurationFocusOut():void {\n setTimeout(() => {\n this.durationFocused = false;\n this.cdRef.detectChanges();\n });\n }\n\n get displayedDuration():string {\n if (!this.duration) {\n return '';\n }\n\n return this.text.days(this.duration);\n }\n\n private applyDurationChange(newValue:number|null):void {\n this.duration = newValue;\n this.cdRef.detectChanges();\n\n // If we cleared duration or left it empty\n // reset the value and the due date\n if (newValue === null) {\n this.updateDate('end', null);\n return;\n }\n\n if (this.dates.start) {\n this.formUpdates$.next({\n startDate: this.dates.start,\n duration: this.durationAsIso8601,\n });\n } else if (this.dates.end) {\n this.formUpdates$.next({\n dueDate: this.dates.end,\n duration: this.durationAsIso8601,\n });\n }\n }\n\n private get durationAsIso8601():string|null {\n if (this.duration) {\n return this.timezoneService.toISODuration(this.duration, 'days');\n }\n\n return null;\n }\n\n private clearWithDuration(field:DateKeys) {\n this.duration = null;\n this.dates[field] = null;\n this.enforceManualChangesToDatepicker();\n }\n\n private initializeDatepicker() {\n this.datePickerInstance?.destroy();\n this.datePickerInstance = new DatePicker(\n this.injector,\n '#flatpickr-input',\n [this.dates.start || '', this.dates.end || ''],\n {\n mode: 'range',\n showMonths: this.deviceService.isMobile ? 1 : 2,\n inline: true,\n onReady: (_date, _datestr, instance) => {\n instance.calendarContainer.classList.add('op-datepicker-modal--flatpickr-instance');\n\n if (!this.modalPositioned) {\n this.modalPositioned = true;\n }\n\n this.ensureHoveredSelection(instance.calendarContainer);\n },\n onChange: (dates:Date[], _datestr, instance) => {\n const activeField = this.currentlyActivatedDateField;\n\n // When two values are passed from datepicker and we don't have duration set,\n // just take the range provided by them\n if (dates.length === 2 && !this.duration) {\n this.setDatesAndDeriveDuration(dates[0], dates[1]);\n this.toggleCurrentActivatedField();\n return;\n }\n\n // Update with the same flow as entering a value\n const { latestSelectedDateObj } = instance as { latestSelectedDateObj:Date };\n this.datepickerChanged$.next([activeField, latestSelectedDateObj]);\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n onDayCreate: async (dObj:Date[], dStr:string, fp:flatpickr.Instance, dayElem:DayElement) => {\n onDayCreate(\n dayElem,\n this.ignoreNonWorkingDays,\n await this.datePickerInstance?.isNonWorkingDay(dayElem.dateObj),\n this.isDayDisabled(dayElem, this.minimalSchedulingDate),\n );\n },\n },\n this.flatpickrTarget.nativeElement,\n );\n }\n\n private enforceManualChangesToDatepicker(enforceDate?:Date) {\n let startDate = parseDate(this.dates.start || '');\n let endDate = parseDate(this.dates.end || '');\n\n if (startDate && endDate) {\n // If the start date is manually changed to be after the end date,\n // we adjust the end date to be at least the same as the newly entered start date.\n // Same applies if the end date is set manually before the current start date\n if (startDate > endDate && this.isStateOfCurrentActivatedField('start')) {\n endDate = startDate;\n this.dates.end = this.timezoneService.formattedISODate(endDate);\n } else if (endDate < startDate && this.isStateOfCurrentActivatedField('end')) {\n startDate = endDate;\n this.dates.start = this.timezoneService.formattedISODate(startDate);\n }\n }\n\n const dates = [startDate, endDate];\n setDates(dates, this.datePickerInstance, enforceDate);\n }\n\n private setDatesAndDeriveDuration(newStart:Date, newEnd:Date) {\n this.dates.start = this.timezoneService.formattedISODate(newStart);\n this.dates.end = this.timezoneService.formattedISODate(newEnd);\n\n // Derive duration\n this.formUpdates$.next({ startDate: this.dates.start, dueDate: this.dates.end });\n }\n\n private handleSingleDateUpdate(activeField:DateFields, selectedDate:Date) {\n if (activeField === 'duration') {\n this.durationActiveDateSelected(selectedDate);\n return;\n }\n\n // If both dates are now set, ensure we update it accordingly\n if (this.dates.start && this.dates.end) {\n this.replaceDatesWithNewSelection(activeField, selectedDate);\n return;\n }\n\n // Set the current date field\n this.moveActiveDate(activeField, selectedDate);\n\n // We may or may not have both fields set now\n // If we have duration set, we derive the other field\n if (this.duration) {\n this.deriveMissingDateFromDuration(activeField);\n } else if (this.dates.start && this.dates.end) {\n this.formUpdates$.next({ startDate: this.dates.start, dueDate: this.dates.end });\n }\n\n // Set the selected date on the datepicker\n this.enforceManualChangesToDatepicker(selectedDate);\n }\n\n /**\n * The duration field is active and a date was clicked in the datepicker.\n *\n * If the duration field has a value:\n * - start date is updated, derive end date, set end date active\n * If the duration field has no value:\n * - If start date has a value, finish date is set\n * - Otherwise, start date is set\n * - Focus is set to the finish date\n *\n * @param selectedDate The date selected\n * @private\n */\n private durationActiveDateSelected(selectedDate:Date) {\n const selectedIsoDate = this.timezoneService.formattedISODate(selectedDate);\n\n if (!this.duration && this.dates.start) {\n // When duration is empty and start is set, update finish\n this.setDaysInOrder(this.dates.start, selectedIsoDate);\n\n // Focus moves to start date\n this.setCurrentActivatedField('start');\n } else {\n // Otherwise, the start date always gets updated\n this.setDaysInOrder(selectedIsoDate, this.dates.end);\n\n // Focus moves to finish date\n this.setCurrentActivatedField('end');\n }\n\n if (this.dates.start && this.duration) {\n // If duration has value, derive end date from start and duration\n this.formUpdates$.next({ startDate: this.dates.start, duration: this.durationAsIso8601 });\n } else if (this.dates.start && this.dates.end) {\n // If start and due now have values, derive duration again\n this.formUpdates$.next({ startDate: this.dates.start, dueDate: this.dates.end });\n }\n }\n\n private setDaysInOrder(start:string|null, end:string|null) {\n const parsedStartDate = start ? parseDate(start) as Date : null;\n const parsedEndDate = end ? parseDate(end) as Date : null;\n\n if (parsedStartDate && parsedEndDate && parsedStartDate > parsedEndDate) {\n this.dates.start = end;\n this.dates.end = start;\n } else {\n this.dates.start = start;\n this.dates.end = end;\n }\n }\n\n /**\n * The active field was updated in the datepicker, while the other date was not set\n *\n * This means we want to derive the non-active field using the duration, if that is set.\n *\n * @param activeField The active field that was changed\n * @private\n */\n private deriveMissingDateFromDuration(activeField:'start'|'end') {\n if (activeField === 'start' && !!this.dates.start) {\n this.formUpdates$.next({ startDate: this.dates.start, duration: this.durationAsIso8601 });\n }\n\n if (activeField === 'end' && !!this.dates.end) {\n this.formUpdates$.next({ dueDate: this.dates.end, duration: this.durationAsIso8601 });\n }\n }\n\n /**\n * Moves the active date to the given selected date.\n *\n * This is different from replaceDatesWithNewSelection as duration is prioritized higher in our case.\n * @param activeField\n * @param selectedDate\n * @private\n */\n private moveActiveDate(activeField:DateKeys, selectedDate:Date) {\n const parsedStartDate = this.dates.start ? parseDate(this.dates.start) as Date : null;\n const parsedEndDate = this.dates.end ? parseDate(this.dates.end) as Date : null;\n\n // Set the given field\n this.dates[activeField] = this.timezoneService.formattedISODate(selectedDate);\n\n // Special handling, moving finish date to before start date\n if (activeField === 'end' && parsedStartDate && parsedStartDate > selectedDate) {\n // Reset duration and start date\n this.duration = null;\n this.dates.start = null;\n // Update finish date and mark as active in datepicker\n this.enforceManualChangesToDatepicker(selectedDate);\n }\n\n // Special handling, moving start date to after finish date\n if (activeField === 'start' && parsedEndDate && parsedEndDate < selectedDate) {\n // Reset duration and start date\n this.duration = null;\n this.dates.end = null;\n // Update finish date and mark as active in datepicker\n this.enforceManualChangesToDatepicker(selectedDate);\n }\n }\n\n private replaceDatesWithNewSelection(activeField:DateFields, selectedDate:Date) {\n /**\n Overwrite flatpickr default behavior by not starting a new date range everytime but preserving either start or end date.\n There are three cases to cover.\n 1. Everything before the current start date will become the new start date (independent of the active field)\n 2. Everything after the current end date will become the new end date if that is the currently active field.\n If the active field is the start date, the selected date becomes the new start date and the end date is cleared.\n 3. Everything in between the current start and end date is dependent on the currently activated field.\n * */\n\n const parsedStartDate = parseDate(this.dates.start || '') as Date;\n const parsedEndDate = parseDate(this.dates.end || '') as Date;\n\n if (selectedDate < parsedStartDate) {\n if (activeField === 'start') {\n // Set start, derive end from duration\n this.applyNewDates([selectedDate]);\n } else {\n // Reset duration and end date\n this.duration = null;\n this.applyNewDates(['', selectedDate]);\n }\n } else if (selectedDate > parsedEndDate) {\n if (activeField === 'end') {\n this.applyNewDates([parsedStartDate, selectedDate]);\n } else {\n // Reset duration and end date\n this.duration = null;\n this.applyNewDates([selectedDate]);\n }\n } else if (areDatesEqual(selectedDate, parsedStartDate) || areDatesEqual(selectedDate, parsedEndDate)) {\n this.applyNewDates([selectedDate, selectedDate]);\n } else {\n const newDates = activeField === 'start' ? [selectedDate, parsedEndDate] : [parsedStartDate, selectedDate];\n this.applyNewDates(newDates);\n }\n }\n\n private applyNewDates([start, end]:DateOption[]) {\n this.dates.start = start ? this.timezoneService.formattedISODate(start) : null;\n this.dates.end = end ? this.timezoneService.formattedISODate(end) : null;\n\n // Apply the dates to the datepicker\n setDates([start, end], this.datePickerInstance);\n\n // We updated either start, end, or both fields\n // If both are now set, we want to derive duration from them\n if (this.dates.start && this.dates.end) {\n this.formUpdates$.next({ startDate: this.dates.start, dueDate: this.dates.end });\n }\n\n // If only one is set, derive from duration\n if (this.dates.start && !this.dates.end && !!this.duration) {\n this.formUpdates$.next({ startDate: this.dates.start, duration: this.durationAsIso8601 });\n }\n\n if (this.dates.end && !this.dates.start && !!this.duration) {\n this.formUpdates$.next({ dueDate: this.dates.end, duration: this.durationAsIso8601 });\n }\n }\n\n private get initialActivatedField():DateFields {\n switch (this.fieldName) {\n case 'startDate':\n return 'start';\n case 'dueDate':\n return 'end';\n case 'duration':\n return 'duration';\n default:\n return (this.dates.start && !this.dates.end) ? 'end' : 'start';\n }\n }\n\n private isDayDisabled(dayElement:DayElement, minimalDate?:Date|null):boolean {\n return !this.isSchedulable || (!this.scheduleManually && !!minimalDate && dayElement.dateObj <= minimalDate);\n }\n\n /**\n * Update the datepicker dates and properties from a form response\n * that includes derived/calculated values.\n *\n * @param form\n * @private\n */\n private updateDatesFromForm(form:FormResource):void {\n const payload = form.payload as { startDate:string, dueDate:string, duration:string, ignoreNonWorkingDays:boolean };\n this.dates.start = payload.startDate;\n this.dates.end = payload.dueDate;\n this.ignoreNonWorkingDays = payload.ignoreNonWorkingDays;\n\n this.setDurationDaysFromUpstream(payload.duration);\n\n const parsedStartDate = parseDate(this.dates.start) as Date;\n this.enforceManualChangesToDatepicker(parsedStartDate);\n this.cdRef.detectChanges();\n }\n\n /**\n * Updates the duration property and the displayed value\n * @param value a ISO8601 duration string or null\n * @private\n */\n private setDurationDaysFromUpstream(value:string|null) {\n const durationDays = value ? this.timezoneService.toDays(value) : null;\n\n if (!durationDays || durationDays === 0) {\n this.duration = null;\n } else {\n this.duration = durationDays;\n }\n }\n\n private debouncedInput(input$:Subject, key:DateKeys):Observable {\n return input$\n .pipe(\n this.untilDestroyed(),\n // Skip values that are already set as the current model\n filter((value) => value !== this.dates[key]),\n // Avoid that the manual changes are moved to the datepicker too early.\n // The debounce is chosen quite large on purpose to catch the following case:\n // 1. Start date is for example 2022-07-15. The user wants to set the end date to the 19th.\n // 2. So he/she starts entering the finish date 2022-07-1 .\n // 3. This is already a valid date. Since it is before the start date,the start date would be changed automatically to the first without the debounce.\n // 4. The debounce gives the user enough time to type the last number \"9\" before the changes are converted to the datepicker and the start date would be affected.\n debounceTime(500),\n filter((date) => validDate(date)),\n map((date) => {\n if (date === '') {\n return null;\n }\n\n return parseDate(date) as Date;\n }),\n map((date) => [key, date]),\n );\n }\n\n /**\n * When hovering selections in the range datepicker, the range usually\n * stays active no matter where the cursor is.\n *\n * We want to hide any hovered selection preview when we leave the datepicker.\n * @param calendarContainer\n * @private\n */\n private ensureHoveredSelection(calendarContainer:HTMLDivElement) {\n fromEvent(calendarContainer, 'mouseenter')\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => calendarContainer.classList.remove('flatpickr-container-suppress-hover'));\n\n fromEvent(calendarContainer, 'mouseleave')\n .pipe(\n this.untilDestroyed(),\n filter(() => !(!!this.dates.start && !!this.dates.end)),\n )\n .subscribe(() => calendarContainer.classList.add('flatpickr-container-suppress-hover'));\n }\n}\n","\n \n\n
\n
\n \n \n
\n\n
\n \n \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 EventEmitter,\n OnInit,\n Injector,\n Input,\n Output,\n ViewChild,\n ViewEncapsulation,\n HostBinding,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { DatePicker } from 'core-app/shared/components/datepicker/datepicker';\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 { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { DayElement } from 'flatpickr/dist/types/instance';\nimport flatpickr from 'flatpickr';\nimport { debounce } from 'rxjs/operators';\nimport {\n Subject,\n timer,\n} from 'rxjs';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { FormResource } from 'core-app/features/hal/resources/form-resource';\nimport { DateModalRelationsService } from 'core-app/shared/components/datepicker/services/date-modal-relations.service';\nimport {\n mappedDate,\n onDayCreate,\n parseDate,\n setDates,\n validDate,\n} from 'core-app/shared/components/datepicker/helpers/date-modal.helpers';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { WorkPackageChangeset } from 'core-app/features/work-packages/components/wp-edit/work-package-changeset';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { DateModalSchedulingService } from '../services/date-modal-scheduling.service';\nimport * as moment from 'moment-timezone';\n\n\n@Component({\n selector: 'op-wp-single-date-form',\n templateUrl: './wp-single-date-form.component.html',\n styleUrls: [\n './wp-single-date-form.component.sass',\n '../styles/datepicker.modal.sass',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n DateModalRelationsService,\n DateModalSchedulingService,\n ],\n})\nexport class OpWpSingleDateFormComponent extends UntilDestroyedMixin implements AfterViewInit, OnInit {\n @HostBinding('class.op-wp-single-date-form') className = true;\n\n @Input('value') value = '';\n\n @Input() changeset:ResourceChangeset;\n\n @Output() cancel = new EventEmitter();\n\n @Output() save = new EventEmitter();\n\n @ViewChild('flatpickrTarget') flatpickrTarget:ElementRef;\n\n @ViewChild('modalContainer') modalContainer:ElementRef;\n\n text = {\n save: this.I18n.t('js.button_save'),\n cancel: this.I18n.t('js.button_cancel'),\n date: this.I18n.t('js.work_packages.properties.date'),\n placeholder: this.I18n.t('js.placeholders.default'),\n today: this.I18n.t('js.label_today'),\n };\n\n scheduleManually = false;\n\n ignoreNonWorkingDays = false;\n\n htmlId = '';\n\n date:string|null = null;\n\n dateChangedManually$ = new Subject();\n\n private debounceDelay = 0; // will change after initial render\n\n private datePickerInstance:DatePicker;\n\n constructor(\n readonly configurationService:ConfigurationService,\n readonly apiV3Service:ApiV3Service,\n readonly cdRef:ChangeDetectorRef,\n readonly injector:Injector,\n readonly I18n:I18nService,\n readonly timezoneService:TimezoneService,\n readonly halEditing:HalResourceEditingService,\n readonly dateModalScheduling:DateModalSchedulingService,\n readonly dateModalRelations:DateModalRelationsService,\n ) {\n super();\n }\n \n ngOnInit():void {\n this.dateModalRelations.setChangeset(this.changeset as WorkPackageChangeset);\n this.dateModalScheduling.setChangeset(this.changeset as WorkPackageChangeset);\n this.scheduleManually = !!this.changeset.value('scheduleManually');\n this.ignoreNonWorkingDays = !!this.changeset.value('ignoreNonWorkingDays');\n\n if (!moment(this.value).isValid()) {\n this.value = '';\n this.date = '';\n return;\n }\n this.date = this.timezoneService.formattedISODate(this.value);\n }\n\n ngAfterViewInit():void {\n if (isNewResource(this.changeset.pristineResource)) {\n this.initializeDatepicker(null);\n } else {\n this\n .dateModalRelations\n .getMinimalDateFromPreceeding()\n .subscribe((date) => {\n this.initializeDatepicker(date);\n });\n }\n\n this\n .dateChangedManually$\n .pipe(\n // Avoid that the manual changes are moved to the datepicker too early.\n // The debounce is chosen quite large on purpose to catch the following case:\n // 1. date is for example 2022-07-15. The user wants to set the day value to the 19th.\n // 2. So he/she starts entering the finish date 2022-07-1 .\n // 3. This is already a valid date. Since it is before the date,the date would be changed automatically to the first without the debounce.\n // 4. The debounce gives the user enough time to type the last number \"9\" before the changes are converted to the datepicker and the start date would be affected.\n //\n // Debounce delay is 0 for initial display, and then set to 800\n debounce(() => timer(this.debounceDelay)),\n )\n .subscribe(() => {\n // set debounce delay to its real value\n this.debounceDelay = 800;\n\n // Always update the whole form to ensure that no values are lost/inconsistent\n this.updateDate(this.date);\n });\n }\n\n changeSchedulingMode():void {\n this.datePickerInstance?.datepickerInstance.redraw();\n this.cdRef.detectChanges();\n }\n\n /**\n * Returns whether the user can alter the dates of the work package.\n */\n get isSchedulable():boolean {\n return this.scheduleManually || !this.dateModalRelations.isParent;\n }\n\n isDayDisabled(dayElement:DayElement, minimalDate?:Date|null):boolean {\n return !this.isSchedulable || (!this.scheduleManually && !!minimalDate && dayElement.dateObj <= minimalDate);\n }\n\n changeNonWorkingDays():void {\n this.datePickerInstance?.datepickerInstance.redraw();\n this.cdRef.detectChanges();\n }\n\n doSave($event:Event):void {\n $event.preventDefault();\n // Apply the changed scheduling mode if any\n this.changeset.setValue('scheduleManually', this.scheduleManually);\n\n // Apply include NWD\n this.changeset.setValue('ignoreNonWorkingDays', this.ignoreNonWorkingDays);\n\n // Apply the dates if they could be changed\n if (this.isSchedulable) {\n this.changeset.setValue('date', mappedDate(this.date));\n }\n\n this.save.emit();\n }\n\n doCancel():void {\n this.cancel.emit();\n }\n\n updateDate(val:string|null):void {\n // Expected minimal format YYYY-M-D => 8 characters OR empty\n if (val !== null && (val.length >= 8 || val.length === 0)) {\n if (validDate(val) && this.datePickerInstance) {\n const dateValue = parseDate(val) || undefined;\n this.enforceManualChangesToDatepicker(dateValue);\n }\n }\n }\n\n setToday():void {\n const today = parseDate(new Date()) as Date;\n this.date = this.timezoneService.formattedISODate(today);\n this.enforceManualChangesToDatepicker(today);\n }\n\n private initializeDatepicker(minimalDate?:Date|null) {\n this.datePickerInstance?.destroy();\n this.datePickerInstance = new DatePicker(\n this.injector,\n '#flatpickr-input',\n this.date || '',\n {\n mode: 'single',\n showMonths: 1,\n inline: true,\n onReady: (_date:Date[], _datestr:string, instance:flatpickr.Instance) => {\n instance.calendarContainer.classList.add('op-datepicker-modal--flatpickr-instance');\n },\n onChange: (dates:Date[]) => {\n if (dates.length > 0) {\n this.date = this.timezoneService.formattedISODate(dates[0]);\n this.enforceManualChangesToDatepicker(dates[0]);\n }\n\n this.cdRef.detectChanges();\n },\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n onDayCreate: async (dObj:Date[], dStr:string, fp:flatpickr.Instance, dayElem:DayElement) => {\n onDayCreate(\n dayElem,\n this.ignoreNonWorkingDays,\n await this.datePickerInstance?.isNonWorkingDay(dayElem.dateObj),\n this.isDayDisabled(dayElem, minimalDate),\n );\n },\n },\n this.flatpickrTarget.nativeElement,\n );\n }\n\n private enforceManualChangesToDatepicker(enforceDate?:Date) {\n const date = parseDate(this.date || '');\n setDates(date, this.datePickerInstance, enforceDate);\n\n if (date) {\n this.date = this.timezoneService.formattedISODate(date);\n }\n }\n\n /**\n * Update the datepicker dates and properties from a form response\n * that includes derived/calculated values.\n *\n * @param form\n * @private\n */\n private updateDatesFromForm(form:FormResource):void {\n const payload = form.payload as { date:string, ignoreNonWorkingDays:boolean };\n\n this.date = payload.date;\n this.ignoreNonWorkingDays = payload.ignoreNonWorkingDays;\n\n const parsedDate = parseDate(payload.date) as Date;\n this.enforceManualChangesToDatepicker(parsedDate);\n }\n}\n","\n \n\n
\n \n\n \n\n \n \n \n \n \n\n \n
\n\n
\n
\n \n \n
\n
\n\n","/**\n * Allows to dynamically render an HTML string into any HTML node, dynamically\n * bootstrapping all its Angular components and directives.\n *\n * ```\n * \">\n * \n * ```\n * @module\n * @public\n */\nimport {\n ApplicationRef, Component, ElementRef, Input,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { DynamicBootstrapper } from 'core-app/core/setup/globals/dynamic-bootstrapper';\n\n@Component({\n selector: 'op-dynamic-bootstrap',\n templateUrl: './dynamic-bootstrap.component.html',\n})\nexport class DynamicBootstrapComponent {\n /*\n * HTML string to be rendered.\n */\n @Input()\n set HTML(templateString:string) {\n this.innerHtml = this.domSanitizer.bypassSecurityTrustHtml(templateString);\n this.dynamicBootstrapper.bootstrapOptionalEmbeddable(this.appRef, this.elementRef.nativeElement);\n }\n\n innerHtml:SafeHtml;\n\n dynamicBootstrapper = DynamicBootstrapper;\n\n constructor(\n readonly domSanitizer:DomSanitizer,\n readonly elementRef:ElementRef,\n readonly appRef:ApplicationRef,\n ) { }\n}\n","","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { UntypedFormGroup } from '@angular/forms';\nimport { catchError, map } from 'rxjs/operators';\nimport { Observable } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FormsService {\n constructor(\n private _httpClient:HttpClient,\n ) { }\n\n submit$(form:UntypedFormGroup, resourceEndpoint:string, resourceId?:string, formHttpMethod?:'post' | 'patch', formSchema?:IOPFormSchema):Observable {\n const modelToSubmit = this.formatModelToSubmit(form.getRawValue(), formSchema);\n const httpMethod = resourceId ? 'patch' : (formHttpMethod || 'post');\n const url = resourceId ? `${resourceEndpoint}/${resourceId}` : resourceEndpoint;\n\n return this._httpClient\n [httpMethod](\n url,\n modelToSubmit,\n {\n withCredentials: true,\n responseType: 'json',\n },\n )\n .pipe(\n catchError((error:HttpErrorResponse) => {\n if (error.status == 422) {\n this.handleBackendFormValidationErrors(error, form);\n }\n\n throw error;\n }),\n );\n }\n\n validateForm$(form:UntypedFormGroup, resourceEndpoint:string, formSchema?:IOPFormSchema):Observable {\n const modelToSubmit = this.formatModelToSubmit(form.value, formSchema);\n\n return this._httpClient\n .post(\n `${resourceEndpoint}/form`,\n modelToSubmit,\n {\n withCredentials: true,\n responseType: 'json',\n },\n )\n .pipe(\n map((response:HalSource) => this.getFormattedErrors(Object.values(response?._embedded?.validationErrors))),\n map((formattedErrors:IFormattedValidationError[]) => this.setFormValidationErrors(formattedErrors, form)),\n );\n }\n\n /** HAL resources formatting\n * The backend form model/payload contains HAL resources nested in the '_links' property.\n * In order to simplify its use, the model is flatted and HAL resources are placed at\n * the first level of the model with the 'formatModelToEdit' method.\n * 'formatModelToSubmit' places HAL resources model back to the '_links' property and formats them\n * in the shape of '{href:hrefValue}' in order to fit the backend expectations.\n * */\n private formatModelToSubmit(formModel:IOPFormModel, formSchema:IOPFormSchema = {}):IOPFormModel {\n let { _links: linksModel, ...mainModel } = formModel;\n const resourcesModel = linksModel || Object.keys(formSchema)\n .filter((formSchemaKey) => !!formSchema[formSchemaKey]?.type && formSchema[formSchemaKey]?.location === '_links')\n .reduce((result, formSchemaKey) => {\n const { [formSchemaKey]: keyToRemove, ...mainModelWithoutResource } = mainModel;\n mainModel = mainModelWithoutResource;\n\n return { ...result, [formSchemaKey]: formModel[formSchemaKey] };\n }, {});\n\n const formattedResourcesModel = Object\n .keys(resourcesModel)\n .reduce((result, resourceKey) => {\n const resourceModel = resourcesModel[resourceKey];\n // Form.payload resources have a HalLinkSource interface while\n // API resource options have a IAllowedValue interface\n const formattedResourceModel = Array.isArray(resourceModel)\n ? resourceModel.map((resourceElement) => ({ href: resourceElement?.href || resourceElement?._links?.self?.href || null }))\n : { href: resourceModel?.href || resourceModel?._links?.self?.href || null };\n\n return {\n ...result,\n [resourceKey]: formattedResourceModel,\n };\n }, {});\n\n return {\n ...mainModel,\n _links: formattedResourcesModel,\n };\n }\n\n /** HAL resources formatting\n * The backend form model/payload contains HAL resources nested in the '_links' property.\n * In order to simplify its use, the model is flatted and HAL resources are placed at\n * the first level of the model. 'NonValue' values are also removed from the model so\n * default values from the DynamicForm are set.\n */\n formatModelToEdit(formModel:IOPFormModel = {}):IOPFormModel {\n const { _links: resourcesModel, _meta: metaModel, ...otherElements } = formModel;\n const otherElementsModel = Object.keys(otherElements)\n .filter((key) => this.isValue(otherElements[key]))\n .reduce((model, key) => ({ ...model, [key]: otherElements[key] }), {});\n\n const model = {\n ...otherElementsModel,\n _meta: metaModel,\n ...this.getFormattedResourcesModel(resourcesModel),\n };\n\n return model;\n }\n\n private handleBackendFormValidationErrors(error:HttpErrorResponse, form:UntypedFormGroup):void {\n const errors:IOPFormError[] = error?.error?._embedded?.errors\n ? error?.error?._embedded?.errors : [error.error];\n const formErrors = this.getFormattedErrors(errors);\n\n this.setFormValidationErrors(formErrors, form);\n }\n\n private setFormValidationErrors(errors:IFormattedValidationError[], form:UntypedFormGroup) {\n errors.forEach((err:any) => {\n const formControl = form.get(err.key) || form.get('_links')?.get(err.key);\n\n formControl?.setErrors({ [err.key]: { message: err.message } });\n });\n }\n\n private getAllFormValidationErrors(validationErrors:IOPValidationErrors, formControlKeys?:string | string[]):{ [key:string]:{ message:string } } {\n const errors = Object.values(validationErrors);\n const keysToValidate = Array.isArray(formControlKeys) ? formControlKeys : [formControlKeys];\n const formErrors = this.getFormattedErrors(errors)\n .filter((error) => {\n if (!formControlKeys) {\n return true;\n }\n return keysToValidate.includes(error.key);\n })\n .reduce((result, { key, message }) => ({\n ...result,\n [key]: { message },\n }), {});\n\n return formErrors;\n }\n\n private getFormattedErrors(errors:IOPFormError[]):IFormattedValidationError[] {\n const formattedErrors = errors.map((err) => ({\n key: err._embedded.details.attribute,\n message: err.message,\n }));\n\n return formattedErrors;\n }\n\n private getFormattedResourcesModel(resourcesModel:IOPFormModel['_links'] = {}):IOPFormModel['_links'] {\n return Object.keys(resourcesModel).reduce((result, resourceKey) => {\n const resource = resourcesModel[resourceKey];\n // ng-select needs a 'name' in order to show the label\n // We need to add it in case of the form payload (HalLinkSource)\n const resourceModel = Array.isArray(resource)\n ? resource.map((resourceElement) => ({ ...resourceElement, name: resourceElement?.name || resourceElement?.title }))\n : { ...resource, name: resource?.name || resource?.title };\n\n result = {\n ...result,\n ...(this.isValue(resourceModel) && { [resourceKey]: resourceModel }),\n };\n\n return result;\n }, {});\n }\n\n private isValue(value:any) {\n return ![null, undefined, ''].includes(value);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FormlyFieldConfig } from '@ngx-formly/core';\nimport { Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { HttpClient } from '@angular/common/http';\nimport { HalLink } from 'core-app/features/hal/hal-link/hal-link';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { FormsService } from 'core-app/core/forms/forms.service';\nimport { IDynamicFieldGroupConfig, IOPDynamicInputTypeSettings, IOPFormlyFieldSettings } from '../../typings';\nimport { addParamToHref } from 'core-app/shared/helpers/url-helpers';\n\n@Injectable()\nexport class DynamicFieldsService {\n readonly selectDefaultValue = { name: '-', _links: { self: { href: null } } };\n\n readonly inputsCatalogue:IOPDynamicInputTypeSettings[] = [\n {\n config: {\n type: 'textInput',\n templateOptions: {\n type: 'text',\n },\n },\n useForFields: ['String'],\n },\n {\n config: {\n type: 'textInput',\n templateOptions: {\n type: 'password',\n },\n },\n useForFields: ['Password'],\n },\n {\n config: {\n type: 'integerInput',\n templateOptions: {\n type: 'number',\n locale: this.I18n.locale,\n },\n },\n useForFields: ['Integer', 'Float'],\n },\n {\n config: {\n type: 'booleanInput',\n templateOptions: {\n type: 'checkbox',\n },\n },\n useForFields: ['Boolean'],\n },\n {\n config: {\n type: 'dateInput',\n },\n useForFields: ['Date', 'DateTime'],\n },\n {\n config: {\n type: 'userInput',\n },\n useForFields: ['User'],\n },\n {\n config: {\n type: 'formattableInput',\n className: '',\n templateOptions: {\n editorType: 'full',\n noWrapLabel: true,\n },\n },\n useForFields: ['Formattable'],\n },\n {\n config: {\n type: 'selectInput',\n defaultValue: this.selectDefaultValue,\n templateOptions: {\n locale: this.I18n.locale,\n bindLabel: 'name',\n searchable: true,\n virtualScroll: true,\n clearOnBackspace: false,\n clearSearchOnAdd: false,\n hideSelected: false,\n text: {\n add_new_action: this.I18n.t('js.label_create'),\n },\n },\n expressionProperties: {\n 'templateOptions.clearable': (model:any, formState:any, field:FormlyFieldConfig) => !field.templateOptions?.required,\n },\n },\n useForFields: [\n 'Priority', 'Status', 'Type', 'Version', 'TimeEntriesActivity',\n 'Category', 'CustomOption',\n ],\n },\n {\n config: {\n type: 'projectInput',\n defaultValue: this.selectDefaultValue,\n templateOptions: {\n locale: this.I18n.locale,\n bindLabel: 'name',\n },\n expressionProperties: {\n 'templateOptions.clearable': (model:any, formState:any, field:FormlyFieldConfig) => !field.templateOptions?.required,\n },\n },\n useForFields: [\n 'Project',\n ],\n },\n {\n config: {\n type: 'selectProjectStatusInput',\n defaultValue: this.selectDefaultValue,\n templateOptions: {\n locale: this.I18n.locale,\n bindLabel: 'name',\n searchable: true,\n },\n expressionProperties: {\n 'templateOptions.clearable': (model:any, formState:any, field:FormlyFieldConfig) => !field.templateOptions?.required,\n },\n },\n useForFields: [\n 'ProjectStatus',\n ],\n },\n ];\n\n constructor(\n private httpClient:HttpClient,\n private I18n:I18nService,\n private formsService:FormsService,\n ) {\n }\n\n getConfig(formSchema:IOPFormSchema, formPayload:IOPFormModel):IOPFormlyFieldSettings[] {\n const formFieldGroups = formSchema._attributeGroups?.map((fieldGroup) => ({\n name: fieldGroup.name,\n fieldsFilter: (field:IOPFormlyFieldSettings) => fieldGroup.attributes?.includes(field.templateOptions?.property!),\n }));\n const fieldSchemas = this.getFieldsSchemasWithKey(formSchema);\n const formlyFields = fieldSchemas\n .map((fieldSchema) => this.getFormlyFieldConfig(fieldSchema, formPayload))\n .filter((f) => f !== null) as IOPFormlyFieldSettings[];\n const formlyFormWithFieldGroups = this.getFormlyFormWithFieldGroups(formFieldGroups, formlyFields);\n\n return formlyFormWithFieldGroups;\n }\n\n getModel(formPayload:IOPFormModel):IOPFormModel {\n return this.formsService.formatModelToEdit(formPayload);\n }\n\n getFormlyFormWithFieldGroups(fieldGroups:IDynamicFieldGroupConfig[] = [], formFields:IOPFormlyFieldSettings[] = []):IOPFormlyFieldSettings[] {\n // Remove previous grouping\n formFields = formFields.reduce((result:IOPFormlyFieldSettings[], formField) => (formField.fieldGroup ? [...result, ...formField.fieldGroup] : [...result, formField]), []);\n const formFieldsWithoutGroup = formFields.filter((formField) => fieldGroups.every((fieldGroup) => !fieldGroup.fieldsFilter || !fieldGroup.fieldsFilter(formField)));\n const formFieldGroups = this.getDynamicFormFieldGroups(fieldGroups, formFields);\n\n return [...formFieldsWithoutGroup, ...formFieldGroups];\n }\n\n private getFieldsSchemasWithKey(formSchema:IOPFormSchema):IOPFieldSchemaWithKey[] {\n return Object.keys(formSchema)\n .map((fieldSchemaKey) => {\n const fieldSchema = {\n ...formSchema[fieldSchemaKey],\n key: this.getAttributeKey(formSchema[fieldSchemaKey], fieldSchemaKey),\n };\n\n return fieldSchema;\n })\n .filter((fieldSchema) => this.isFieldSchema(fieldSchema) && fieldSchema.writable);\n }\n\n private getAttributeKey(fieldSchema:IOPFieldSchema, key:string):string {\n switch (fieldSchema.location) {\n case '_meta':\n return `${fieldSchema.location}.${key}`;\n default:\n return key;\n }\n }\n\n private isFieldSchema(schemaValue:IOPFieldSchemaWithKey|any):boolean {\n return !!schemaValue?.type;\n }\n\n private getFormlyFieldConfig(fieldSchema:IOPFieldSchemaWithKey, formPayload:IOPFormModel):IOPFormlyFieldSettings|null {\n const {\n key, name: label, required, hasDefault, minLength, maxLength,\n } = fieldSchema;\n const fieldTypeConfigSearch = this.getFieldTypeConfig(fieldSchema);\n if (!fieldTypeConfigSearch) {\n return null;\n }\n const { templateOptions, ...fieldTypeConfig } = fieldTypeConfigSearch;\n const property = this.getFieldProperty(key);\n const payloadValue = property && (formPayload[property] || formPayload._links && formPayload._links[property]);\n const fieldOptions = this.getFieldOptions(fieldSchema, payloadValue);\n const formlyFieldConfig = {\n ...fieldTypeConfig,\n key,\n wrappers: ['op-dynamic-field-wrapper'],\n className: `op-form--field ${fieldTypeConfig?.className || ''}`,\n templateOptions: {\n property,\n required,\n label,\n hasDefault,\n ...(payloadValue != null && { payloadValue }),\n ...(minLength && { minLength }),\n ...(maxLength && { maxLength }),\n ...templateOptions,\n ...(fieldOptions && { options: fieldOptions }),\n allowedValuesHref: fieldSchema?._links?.allowedValues?.href,\n },\n };\n\n return formlyFieldConfig;\n }\n\n private getFieldTypeConfig(field:IOPFieldSchemaWithKey):IOPFormlyFieldSettings|null {\n const fieldType = field.type.replace('[]', '') as OPFieldType;\n const inputType = this.inputsCatalogue.find((inputType) => inputType.useForFields.includes(fieldType))!;\n\n if (!inputType) {\n console.warn(\n `Could not find a input definition for a field with the following type: ${fieldType}. The full field configuration is`, field,\n );\n return null;\n }\n\n const inputConfig = inputType.config;\n let configCustomizations;\n\n if (\n inputConfig.type === 'integerInput'\n || inputConfig.type === 'selectInput'\n || inputConfig.type === 'selectProjectStatusInput'\n || inputConfig.type === 'userInput'\n ) {\n configCustomizations = {\n className: field.name,\n templateOptions: {\n ...inputConfig.templateOptions,\n ...(this.isMultiSelectField(field) && { multiple: true }),\n },\n };\n } else if (inputConfig.type === 'formattableInput') {\n configCustomizations = {\n templateOptions: {\n ...inputConfig.templateOptions,\n rtl: field.options?.rtl,\n name: field.name,\n },\n };\n }\n\n return { ...inputConfig, ...configCustomizations };\n }\n\n private getFieldOptions(field:IOPFieldSchemaWithKey, currentValue:HalLink|null):Observable|undefined {\n const allowedValues = field._embedded?.allowedValues || field._links?.allowedValues;\n let options;\n\n if (!allowedValues) {\n return;\n }\n\n if (Array.isArray(allowedValues)) {\n const optionsValues = allowedValues[0]?._links?.self?.title\n ? this.formatAllowedValues(allowedValues)\n : allowedValues;\n\n options = of(optionsValues);\n } else if (allowedValues.href) {\n options = this.httpClient\n // The page size value of '-1' is a magic number that will result in the maximum allowed page size.\n .get(addParamToHref(allowedValues.href, { pageSize: '-1' }))\n .pipe(\n map((response:api.v3.Result) => response._embedded.elements),\n map((options) => this.formatAllowedValues(options)),\n );\n }\n\n return options?.pipe(\n map((options) => this.prependCurrentValue(options, currentValue)),\n map((options) => this.prependDefaultValue(options, field)),\n );\n }\n\n // ng-select needs a 'name' in order to show the label\n // We need to add it in case of the form payload (HalLinkSource)\n private formatAllowedValues(options:IOPAllowedValue[]):IOPAllowedValue[] {\n return options.map((option:IOPFieldSchema['options']) => ({ ...option, name: option._links?.self?.title }));\n }\n\n // Map a field key that may be a _links.property to the property name\n private getFieldProperty(key:string) {\n return key.split('.').pop();\n }\n\n private getDynamicFormFieldGroups(fieldGroups:IDynamicFieldGroupConfig[] = [], formFields:IOPFormlyFieldSettings[] = []) {\n return fieldGroups.reduce((formWithFieldGroups:IOPFormlyFieldSettings[], fieldGroup) => {\n let newFormFieldGroup = this.getDefaultFieldGroupSettings(fieldGroup, formFields);\n\n if (fieldGroup.settings) {\n newFormFieldGroup = {\n ...newFormFieldGroup,\n templateOptions: {\n ...newFormFieldGroup.templateOptions,\n ...(fieldGroup.settings.templateOptions && fieldGroup.settings.templateOptions),\n },\n expressionProperties: {\n ...newFormFieldGroup.expressionProperties,\n ...(fieldGroup.settings.expressionProperties && fieldGroup.settings.expressionProperties),\n },\n };\n }\n\n if (newFormFieldGroup?.fieldGroup?.length) {\n formWithFieldGroups = [...formWithFieldGroups, newFormFieldGroup];\n }\n\n return formWithFieldGroups;\n }, []);\n }\n\n private getDefaultFieldGroupSettings(fieldGroupConfig:IDynamicFieldGroupConfig, formFields:IOPFormlyFieldSettings[]):IOPFormlyFieldSettings {\n const defaultFieldGroupSettings = {\n wrappers: ['op-dynamic-field-group-wrapper'],\n fieldGroupClassName: 'op-form--fieldset',\n templateOptions: {\n label: fieldGroupConfig.name,\n isFieldGroup: true,\n collapsibleFieldGroups: true,\n collapsibleFieldGroupsCollapsed: true,\n },\n fieldGroup: this.getGroupFields(fieldGroupConfig, formFields),\n expressionProperties: {\n 'templateOptions.collapsibleFieldGroupsCollapsed': this.collapsibleFieldGroupsCollapsedExpressionProperty,\n },\n };\n\n return defaultFieldGroupSettings;\n }\n\n private getGroupFields(fieldGroupConfig:IDynamicFieldGroupConfig, formFields:IOPFormlyFieldSettings[]) {\n return formFields.filter((formField) => {\n const formFieldKey = formField.key && this.getFieldProperty(formField.key);\n\n if (!formFieldKey) {\n return false;\n } if (fieldGroupConfig.fieldsFilter) {\n return fieldGroupConfig.fieldsFilter(formField);\n }\n return true;\n });\n }\n\n private collapsibleFieldGroupsCollapsedExpressionProperty(model:any, formState:any, field:FormlyFieldConfig) {\n // Uncollapse field groups when the form has errors and is submitted\n if (\n field.type !== 'formly-group'\n || !field.templateOptions?.collapsibleFieldGroups\n || !field.templateOptions?.collapsibleFieldGroupsCollapsed\n ) {\n return false;\n }\n\n return !(\n field.fieldGroup?.some((groupField:IOPFormlyFieldSettings) => groupField.formControl?.errors\n && !groupField.hide\n && field.options?.parentForm?.submitted));\n }\n\n // Invalid values, ones that are not in the list of allowedValues (Array or backend fetched) do occur, e.g.\n // if constraints change or in case a value is undisclosed as for a project's parent.\n private prependCurrentValue(options:IOPAllowedValue[], currentValue:HalLink|null):IOPAllowedValue[] {\n if (!currentValue?.href || options.some((option) => option?._links?.self?.href === currentValue.href)) {\n return options;\n }\n return [\n { name: currentValue.title, _links: { self: currentValue } },\n ...options,\n ];\n }\n\n // So select properties that are not required always get a default ('-'/'none') option.\n // This way, the user can more easily deselect a value.\n // Multi seleccts do not have the same behaviour since the x next to each option is quite clear.\n private prependDefaultValue(options:IOPAllowedValue[], field:IOPFieldSchemaWithKey):IOPAllowedValue[] {\n if (field.required || this.isMultiSelectField(field)) {\n return options;\n }\n return [this.selectDefaultValue, ...options];\n }\n\n private isMultiSelectField(field:IOPFieldSchemaWithKey) {\n return field?.type?.startsWith('[]');\n }\n}\n","/**\n * Capitalize\n */\nexport function addParamToHref(href:string, params:Record):string {\n const url = new URL(href, window.location.origin);\n\n Object\n .keys(params)\n .forEach((key) => {\n url.searchParams.set(key, params[key]);\n });\n\n return url.pathname + url.search;\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { UntypedFormGroup } from '@angular/forms';\nimport { FormlyForm } from '@ngx-formly/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { DynamicFieldsService } from 'core-app/shared/components/dynamic-forms/services/dynamic-fields/dynamic-fields.service';\nimport { FormsService } from 'core-app/core/forms/forms.service';\nimport { IOPDynamicFormSettings } from '../../typings';\n\n@Injectable()\nexport class DynamicFormService {\n dynamicForm:FormlyForm;\n\n formSchema:IOPFormSchema;\n\n constructor(\n private _httpClient:HttpClient,\n private _dynamicFieldsService:DynamicFieldsService,\n private _formsService:FormsService,\n ) {}\n\n registerForm(dynamicForm:FormlyForm) {\n this.dynamicForm = dynamicForm;\n }\n\n getSettingsFromBackend$(formEndpoint?:string, resourceId?:string, payload:Object = {}):Observable {\n const resourcePath = resourceId ? `/${resourceId}` : '';\n const formPath = formEndpoint?.endsWith('/form') ? '' : '/form';\n const url = `${formEndpoint}${resourcePath}${formPath}`;\n\n return this._httpClient\n .post(\n url,\n payload,\n {\n withCredentials: true,\n responseType: 'json',\n },\n )\n .pipe(\n map(((formConfig) => this.getSettings(formConfig))),\n );\n }\n\n getSettings(formConfig:IOPFormSettingsResource):IOPDynamicFormSettings {\n this.formSchema = formConfig._embedded?.schema;\n const formPayload = formConfig._embedded?.payload;\n const dynamicForm = {\n form: new UntypedFormGroup({}),\n fields: this._dynamicFieldsService.getConfig(this.formSchema, formPayload),\n model: this._dynamicFieldsService.getModel(formPayload),\n };\n\n return dynamicForm;\n }\n\n formatModelToEdit(formModel:IOPFormModel):IOPFormModel {\n return this._formsService.formatModelToEdit(formModel);\n }\n\n validateForm$(form:UntypedFormGroup, resourceEndpoint:string) {\n return this._formsService.validateForm$(form, resourceEndpoint, this.formSchema);\n }\n\n submit$(form:UntypedFormGroup, resourceEndpoint:string, resourceId?:string, formHttpMethod?:'post' | 'patch') {\n return this._formsService.submit$(form, resourceEndpoint, resourceId, formHttpMethod, this.formSchema);\n }\n}\n","\n \n\n
\n \n \n
\n\n\n\n\n\n","import {\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { FormlyForm } from '@ngx-formly/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport {\n catchError,\n finalize,\n} from 'rxjs/operators';\nimport { HalSource } from 'core-app/features/hal/resources/hal-resource';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { DynamicFieldsService } from 'core-app/shared/components/dynamic-forms/services/dynamic-fields/dynamic-fields.service';\nimport { UntypedFormGroup } from '@angular/forms';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';\nimport {\n IDynamicFieldGroupConfig,\n IOPDynamicFormSettings,\n IOPFormlyFieldSettings,\n} from '../../typings';\nimport { DynamicFormService } from '../../services/dynamic-form/dynamic-form.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n/**\n* SETTINGS:\n* The DynamicFormComponent can get its settings (payload and fields) in two ways:\n*\n* - @Input settings:\n* Passing down an object that mimics a backend form configuration (IOPFormSettings),\n* with and easier format (not _embedded) through the 'settings' @Input.\n*\n* ```\n* \n* \n* ```\n*\n* - Backend settings:\n* In order to fetch its settings from the backend, the DynamicFormComponent will\n* always need a backend endpoint to target. It can be provided in two ways:\n* - Through the 'resourcePath' @Input and, optionally, the 'resourceId' @Input if\n* we are editing an existing form.\n*\n* ```\n* \n* \n* ```\n*\n* - Through the the 'formUrl' @Input. In this case we'll need to also provide the\n* formHttpMethod @Input if it is not POST.\n*\n* ```\n* \n* \n* ```\n*\n* USE CASES:\n* The DynamicFormComponent can be used in two ways:\n*\n* - Standalone Form:\n* In order to work as an standalone form, handling the submit operation,\n* the DynamicFormComponent will need a backend endpoint to target as explained above.\n *\n* ```\n* \n* \n* ```\n*\n* - FormGroup:\n* In order to use the DynamicFormComponent as a formGroup, it will need a\n* FormGroup to be passed through the dynamicFormGroup @Input.\n*\n* ```\n* \n* `\n* ```\n*\n* FORM SETTINGS CUSTOMIZATIONS:\n* The form settings can be customized in different ways:\n*\n* - initialPayload @Input:\n* Allows to provide and initial payload to the form settings request. Checkout\n* the [forms documentation](https://www.openproject.org/docs/api/forms/).\n*\n* - model @Input:\n* Allows to change model of the form.\n*\n* - fieldsSettingsPipe:\n* Allows to modify the dynamicFormFields settings before the form is rendered.\n *\n* ```\n* \n* \n* ```\n*\n* - fieldGroups:\n* Allows to create field groups programmatically. For example, the following group would\n* create an 'Advanced settings' field group with all the fields that are not 'name'\n* or 'parent' overriding the default collapsibleFieldGroupsCollapsed (showing them\n* uncollapsed).\n*\n* ```\n* const fieldGroups = [{\n* name: 'Advanced settings',\n* fieldsFilter: (field) => !['name', 'parent'].includes(field.templateOptions?.property!),\n * settings: {\n * templateOptions: {\n * collapsibleFieldGroupsCollapsed: false\n * }\n * }\n* }];\n* ```\n*/\n\n@Component({\n selector: 'op-dynamic-form',\n templateUrl: './dynamic-form.component.html',\n styleUrls: ['./dynamic-form.component.scss'],\n providers: [\n DynamicFormService,\n DynamicFieldsService,\n ],\n})\nexport class DynamicFormComponent extends UntilDestroyedMixin implements OnChanges {\n /** Backend form URL (e.g. https://community.openproject.org/api/v3/projects/dev-large/form) */\n @Input() formUrl?:string;\n\n /** When using the formUrl @Input(), set the http method to use if it is not 'POST' */\n @Input() formHttpMethod?:'post'|'patch' = 'post';\n\n /** Part of the URL that belongs to the resource type (e.g. '/projects' in the previous example)\n * Use this option when you don't have a form URL, the DynamicForm will build it from the resourcePath\n * for you (⌐■_■).\n */\n @Input() resourcePath?:string;\n\n /** Pass the resourceId in case you are editing an existing resource and you don't have the Form URL. */\n @Input() resourceId?:string;\n\n @Input() settings?:IOPFormSettings;\n\n @Input() dynamicFormGroup?:UntypedFormGroup;\n\n /** Initial payload to POST to the form */\n @Input() initialPayload:Object = {};\n\n @Input() set model(payload:IOPFormModel) {\n if (!this.innerModel && !payload) {\n return;\n }\n\n const formattedModel = this.dynamicFormService.formatModelToEdit(payload);\n\n this.form.patchValue(formattedModel);\n }\n\n /** Chance to modify the dynamicFormFields settings before the form is rendered */\n @Input() fieldsSettingsPipe?:(dynamicFieldsSettings:IOPFormlyFieldSettings[]) => IOPFormlyFieldSettings[];\n\n /** Create fieldGroups programmatically */\n @Input() fieldGroups?:IDynamicFieldGroupConfig[];\n\n @Input() showNotifications = true;\n\n @Input() showValidationErrorsOn:'change'|'blur'|'submit'|'never' = 'submit';\n\n @Input() handleSubmit = true;\n\n @Input() helpTextAttributeScope?:string;\n\n @Output() modelChange = new EventEmitter();\n\n @Output() submitted = new EventEmitter();\n\n @Output() errored = new EventEmitter();\n\n form:UntypedFormGroup;\n\n fields:IOPFormlyFieldSettings[];\n\n formEndpoint?:string;\n\n inFlight:boolean;\n\n text = {\n save: this.I18n.t('js.button_save'),\n cancel: this.I18n.t('js.button_cancel'),\n load_error_message: this.I18n.t('js.forms.load_error_message'),\n successful_update: this.I18n.t('js.notice_successful_update'),\n successful_create: this.I18n.t('js.notice_successful_create'),\n job_started: this.I18n.t('js.notice_job_started'),\n };\n\n noSettingsSourceErrorMessage = `DynamicFormComponent needs a settings, formUrl or resourcePath @Input\n in order to fetch its setting. Please provide one.`;\n\n noPathToSubmitToError = `DynamicForm needs a resourcePath or formUrl @Input in order to be submitted \n and validated. Please provide one.`;\n\n innerModel:IOPFormModel;\n\n get model() {\n return this.form.getRawValue();\n }\n\n @ViewChild(FormlyForm)\n set dynamicForm(dynamicForm:FormlyForm) {\n this.dynamicFormService.registerForm(dynamicForm);\n }\n\n constructor(\n private dynamicFormService:DynamicFormService,\n private dynamicFieldsService:DynamicFieldsService,\n private I18n:I18nService,\n private pathHelperService:PathHelperService,\n private toastService:ToastService,\n private changeDetectorRef:ChangeDetectorRef,\n private confirmDialogService:ConfirmDialogService,\n ) {\n super();\n }\n\n setDisabledState(disabled:boolean):void {\n disabled ? this.form.disable() : this.form.enable();\n }\n\n ngOnChanges(changes:SimpleChanges) {\n if (\n changes.settings\n || changes.resourcePath\n || changes.resourceId\n || changes.formUrl\n || changes.formHttpMethod\n || changes.dynamicFormGroup\n || changes.initialPayload\n || changes.fieldsSettingsPipe\n || changes.fieldGroups\n ) {\n this.initializeDynamicForm(\n this.settings,\n this.resourcePath,\n this.resourceId,\n this.formUrl,\n this.initialPayload,\n );\n }\n }\n\n onModelChange(changes:any) {\n this.modelChange.emit(changes);\n }\n\n submitForm(form:UntypedFormGroup) {\n if (!this.handleSubmit) {\n return;\n }\n\n if (!this.formEndpoint) {\n throw new Error(this.noPathToSubmitToError);\n }\n\n this.inFlight = true;\n this.dynamicFormService\n .submit$(form, this.formEndpoint, this.resourceId, this.formHttpMethod)\n .pipe(\n finalize(() => this.inFlight = false),\n )\n .subscribe(\n (formResponse:HalSource|any) => {\n this.submitted.emit(formResponse);\n this.showNotifications && this.showSuccessNotification(formResponse);\n },\n (error:HttpErrorResponse) => {\n this.errored.emit(error?.error || error);\n this.showNotifications && this.toastService.addError(error?.error?.message || error?.message);\n },\n );\n }\n\n validateForm() {\n if (!this.formEndpoint) {\n throw new Error(this.noPathToSubmitToError);\n }\n\n return this.dynamicFormService.validateForm$(this.form, this.formEndpoint);\n }\n\n handleCancel() {\n if (this.form.dirty) {\n this.confirmDialogService.confirm({\n text: {\n title: this.I18n.t('js.text_are_you_sure'),\n text: this.I18n.t('js.text_data_lost'),\n },\n }).then(() => {\n this.goBack();\n })\n .catch(() => {});\n } else {\n this.goBack();\n }\n }\n\n private goBack() {\n window.history.back();\n }\n\n private initializeDynamicForm(\n settings?:IOPFormSettings,\n resourcePath?:string,\n resourceId?:string,\n formUrl?:string,\n payload?:Object,\n ) {\n const formEndPoint = this.getFormEndPoint(formUrl, resourcePath);\n if (!formEndPoint) {\n throw new Error(this.noSettingsSourceErrorMessage);\n }\n\n const isNewEndpoint = formEndPoint !== this.formEndpoint;\n if (isNewEndpoint) {\n this.formEndpoint = formEndPoint;\n }\n\n if (settings) {\n this.setupDynamicFormFromSettings(settings);\n } else {\n this.setupDynamicFormFromBackend(this.formEndpoint, resourceId, payload);\n }\n }\n\n private getFormEndPoint(formUrl?:string, resourcePath?:string):string {\n if (formUrl) {\n return formUrl.endsWith('/form')\n ? formUrl.replace('/form', '')\n : formUrl;\n }\n\n if (resourcePath) {\n return resourcePath;\n }\n\n return '';\n }\n\n private setupDynamicFormFromBackend(formEndpoint?:string, resourceId?:string, payload?:Object) {\n this.dynamicFormService\n .getSettingsFromBackend$(formEndpoint, resourceId, payload)\n .pipe(\n catchError((error) => {\n this.toastService.addError(this.text.load_error_message);\n throw error;\n }),\n )\n .subscribe((dynamicFormSettings) => this.setupDynamicForm(dynamicFormSettings));\n }\n\n private setupDynamicFormFromSettings(settings:IOPFormSettings) {\n const formattedSettings:IOPFormSettingsResource = {\n _embedded: {\n payload: settings?.payload,\n schema: settings?.schema,\n },\n };\n const dynamicFormSettings = this.dynamicFormService.getSettings(formattedSettings);\n\n this.setupDynamicForm(dynamicFormSettings);\n }\n\n private setupDynamicForm({ fields, model, form }:IOPDynamicFormSettings) {\n if (this.fieldsSettingsPipe) {\n fields = this.fieldsSettingsPipe(fields);\n }\n\n if (this.fieldGroups) {\n fields = this.dynamicFieldsService.getFormlyFormWithFieldGroups(this.fieldGroups, fields);\n }\n\n // We pass the resourceId through because some of the inputComponents need it to pass to their subcomponents\n // (e.g. the userInputComponent)\n const id = this.resourceId || idFromLink(this.resourcePath || null);\n model.id = id;\n\n this.fields = fields;\n this.innerModel = model;\n this.form = this.dynamicFormGroup || form;\n\n this.changeDetectorRef.detectChanges();\n }\n\n private showSuccessNotification(formResponse:HalSource|any):void {\n const submitMessage = (() => {\n if (formResponse?.jobId) {\n const title = formResponse?.payload?.title;\n\n return `${title || ''} ${this.text.job_started}`;\n } else {\n return this.formHttpMethod === 'patch' ? this.text.successful_update : this.text.successful_create;\n }\n })();\n\n this.toastService.addSuccess(submitMessage);\n }\n}\n","import { Component } from '@angular/core';\nimport { FieldType } from '@ngx-formly/core';\n\n@Component({\n selector: 'op-text-input',\n templateUrl: './text-input.component.html',\n styleUrls: ['./text-input.component.scss'],\n})\nexport class TextInputComponent extends FieldType {\n}\n","\n","import { Component } from '@angular/core';\nimport { FieldType } from '@ngx-formly/core';\n\n@Component({\n selector: 'op-integer-input',\n templateUrl: './integer-input.component.html',\n styleUrls: ['./integer-input.component.scss'],\n})\nexport class IntegerInputComponent extends FieldType {\n}\n","","\n \n : {{search}}\n \n\n \n
{{ item.name }}
\n
\n\n","import { Component, OnInit } from '@angular/core';\nimport { FieldType } from '@ngx-formly/core';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Component({\n selector: 'op-select-input',\n templateUrl: './select-input.component.html',\n styleUrls: ['./select-input.component.scss'],\n})\nexport class SelectInputComponent extends FieldType {\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n} from '@angular/core';\nimport { FieldType } from '@ngx-formly/core';\n\n@Component({\n selector: 'op-project-input',\n templateUrl: './project-input.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ProjectInputComponent extends FieldType {\n}\n","\n","\n \n \n {{item.name}}\n \n \n \n {{item.name}}\n \n","import { Component } from '@angular/core';\nimport { FieldType } from '@ngx-formly/core';\nimport { projectStatusCodeCssClass } from 'core-app/shared/components/fields/helpers/project-status-helper';\n\n@Component({\n selector: 'op-select-project-status-input',\n templateUrl: './select-project-status-input.component.html',\n})\nexport class SelectProjectStatusInputComponent extends FieldType {\n cssClass(item:any) {\n return projectStatusCodeCssClass(item.id);\n }\n}\n","import { Component } from '@angular/core';\nimport { FieldType } from '@ngx-formly/core';\n\n@Component({\n selector: 'op-boolean-input',\n templateUrl: './boolean-input.component.html',\n styleUrls: ['./boolean-input.component.scss'],\n})\nexport class BooleanInputComponent extends FieldType {\n}\n","\n","import {\n Component, forwardRef, Input, OnInit, ViewChild,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { FormlyTemplateOptions } from '@ngx-formly/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { OpCkeditorComponent } from 'core-app/shared/components/editor/components/ckeditor/op-ckeditor.component';\nimport {\n ICKEditorContext,\n ICKEditorInstance,\n} from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';\n\n@Component({\n selector: 'op-formattable-control',\n templateUrl: './formattable-control.component.html',\n styleUrls: ['./formattable-control.component.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FormattableControlComponent),\n multi: true,\n },\n ],\n})\nexport class FormattableControlComponent implements ControlValueAccessor, OnInit {\n @Input() templateOptions:FormlyTemplateOptions;\n\n @ViewChild(OpCkeditorComponent, { static: true }) editor:OpCkeditorComponent;\n\n text:{ [key:string]:string };\n\n value:{ raw:string };\n\n disabled = false;\n\n touched:boolean;\n\n // Detect when inner component could not be initialized\n initializationError = false;\n\n onChange:(_any:unknown) => void = () => undefined;\n\n onTouch:() => void = () => undefined;\n\n public get ckEditorContext():ICKEditorContext {\n return {\n type: this.templateOptions.editorType,\n macros: 'none',\n options: { rtl: this.templateOptions?.rtl },\n };\n }\n\n constructor(\n readonly I18n:I18nService,\n ) {\n }\n\n ngOnInit():void {\n this.text = {\n attachmentLabel: this.I18n.t('js.label_formattable_attachment_hint'),\n save: this.I18n.t('js.inplace.button_save', { attribute: this.templateOptions?.name }),\n cancel: this.I18n.t('js.inplace.button_cancel', { attribute: this.templateOptions?.name }),\n };\n }\n\n writeValue(value:{ raw:string }):void {\n this.value = value;\n }\n\n registerOnChange(fn:(_:unknown) => void):void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn:() => void):void {\n this.onTouch = fn;\n }\n\n setDisabledState(disabled:boolean):void {\n this.disabled = disabled;\n\n this.syncCKEditorReadonlyMode();\n }\n\n onContentChange(value:string) {\n const valueToEmit = { raw: value };\n\n this.onTouch();\n this.onChange(valueToEmit);\n }\n\n syncCKEditorReadonlyMode() {\n const { ckEditorInstance } = this.editor;\n if (!ckEditorInstance) {\n return;\n }\n\n if (this.disabled) {\n ckEditorInstance.enableReadOnlyMode('formattable-control');\n } else {\n ckEditorInstance.disableReadOnlyMode('formattable-control');\n }\n }\n\n onCkeditorSetup(_editor:ICKEditorInstance) {\n this.syncCKEditorReadonlyMode();\n this.editor.ckEditorInstance.ui.focusTracker.on(\n 'change:isFocused',\n (evt:unknown, name:unknown, isFocused:unknown) => {\n if (!isFocused && !this.touched) {\n this.touched = true;\n this.onTouch();\n }\n },\n );\n }\n}\n","
\n \n \n
\n","import { Component } from '@angular/core';\nimport { FieldType } from '@ngx-formly/core';\n\n@Component({\n selector: 'op-formattable-textarea-input',\n templateUrl: './formattable-textarea-input.component.html',\n styleUrls: ['./formattable-textarea-input.component.scss'],\n})\nexport class FormattableTextareaInputComponent extends FieldType {\n}\n","\n","\n \n\n \n\n \n\n\n\n \n \n\n \n\n","import { ChangeDetectionStrategy, Component, Optional } from '@angular/core';\nimport { FieldWrapper } from '@ngx-formly/core';\nimport { DynamicFormComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-form/dynamic-form.component';\n\n@Component({\n selector: 'op-dynamic-field-wrapper',\n templateUrl: './dynamic-field-wrapper.component.html',\n styleUrls: ['./dynamic-field-wrapper.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DynamicFieldWrapperComponent extends FieldWrapper {\n constructor(\n @Optional() public dynamicFormComponent:DynamicFormComponent,\n ) {\n super();\n }\n}\n","import { ChangeDetectionStrategy, Component, HostBinding } from '@angular/core';\nimport { FieldType } from '@ngx-formly/core';\n\n@Component({\n selector: 'op-date-input',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './date-input.component.html',\n styleUrls: ['./date-input.component.scss'],\n})\nexport class DateInputComponent extends FieldType {\n @HostBinding('class') get class() {\n return (this.model?.id === 'projects' && this.key.toString().startsWith('customField'))\n ? 'form--date-picker-container -xslim'\n : null;\n }\n}\n","\n","\n \n \n {{ to.label }}\n \n \n\n
\n \n
\n\n\n\n {{ to.label }}\n\n
\n \n
\n","import { Component } from '@angular/core';\nimport { FieldWrapper } from '@ngx-formly/core';\n\n@Component({\n selector: 'op-dynamic-field-group-wrapper',\n templateUrl: './dynamic-field-group-wrapper.component.html',\n styleUrls: ['./dynamic-field-group-wrapper.component.scss'],\n})\nexport class DynamicFieldGroupWrapperComponent extends FieldWrapper {\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormattableControlComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-inputs/formattable-textarea-input/components/formattable-control/formattable-control.component';\nimport { OpenprojectEditorModule } from 'core-app/shared/components/editor/openproject-editor.module';\nimport { FormattableEditFieldModule } from 'core-app/shared/components/fields/edit/field-types/formattable-edit-field/formattable-edit-field.module';\n\n@NgModule({\n declarations: [\n FormattableControlComponent,\n ],\n imports: [\n CommonModule,\n OpenprojectEditorModule,\n FormattableEditFieldModule,\n ],\n exports: [\n FormattableControlComponent,\n ],\n})\nexport class FormattableControlModule { }\n","import {\n ChangeDetectionStrategy,\n Component,\n OnInit,\n} from '@angular/core';\nimport { FieldType } from '@ngx-formly/core';\n\n@Component({\n selector: 'op-user-input',\n templateUrl: './user-input.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UserInputComponent extends FieldType implements OnInit {\n projectId:string|undefined;\n\n public ngOnInit():void {\n this.projectId = this.model?.id;\n }\n}\n","\n\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormlyModule } from '@ngx-formly/core';\nimport { NgOptionHighlightModule } from '@ng-select/ng-option-highlight';\nimport { NgSelectModule } from '@ng-select/ng-select';\nimport {\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { TextInputComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-inputs/text-input/text-input.component';\nimport { IntegerInputComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-inputs/integer-input/integer-input.component';\nimport { SelectInputComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-inputs/select-input/select-input.component';\nimport { ProjectInputComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-inputs/project-input/project-input.component';\nimport { SelectProjectStatusInputComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-inputs/select-project-status-input/select-project-status-input.component';\nimport { BooleanInputComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-inputs/boolean-input/boolean-input.component';\nimport { DynamicFormComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-form/dynamic-form.component';\nimport { FormattableTextareaInputComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-inputs/formattable-textarea-input/formattable-textarea-input.component';\nimport { DynamicFieldWrapperComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-field-wrapper/dynamic-field-wrapper.component';\nimport { InviteUserButtonModule } from 'core-app/features/invite-user-modal/button/invite-user-button.module';\nimport { DateInputComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-inputs/date-input/date-input.component';\nimport { DynamicFieldGroupWrapperComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-field-group-wrapper/dynamic-field-group-wrapper.component';\nimport { FormattableControlModule } from 'core-app/shared/components/dynamic-forms/components/dynamic-inputs/formattable-textarea-input/components/formattable-control/formattable-control.module';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { UserInputComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-inputs/user-input/user-input.component';\nimport { AttributeHelpTextModule } from 'core-app/shared/components/attribute-help-texts/attribute-help-text.module';\nimport { OpSpotModule } from 'core-app/spot/spot.module';\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n AttributeHelpTextModule,\n OpSpotModule,\n FormlyModule.forRoot({\n types: [\n { name: 'booleanInput', component: BooleanInputComponent },\n { name: 'integerInput', component: IntegerInputComponent },\n { name: 'textInput', component: TextInputComponent },\n { name: 'dateInput', component: DateInputComponent },\n { name: 'selectInput', component: SelectInputComponent },\n { name: 'projectInput', component: ProjectInputComponent },\n { name: 'selectProjectStatusInput', component: SelectProjectStatusInputComponent },\n { name: 'formattableInput', component: FormattableTextareaInputComponent },\n { name: 'userInput', component: UserInputComponent },\n ],\n wrappers: [\n {\n name: 'op-dynamic-field-group-wrapper',\n component: DynamicFieldGroupWrapperComponent,\n },\n {\n name: 'op-dynamic-field-wrapper',\n component: DynamicFieldWrapperComponent,\n },\n ],\n }),\n OpSharedModule,\n\n // Input dependencies\n FormsModule,\n NgSelectModule,\n NgOptionHighlightModule,\n InviteUserButtonModule,\n FormattableControlModule,\n ],\n declarations: [\n DynamicFormComponent,\n DynamicFieldGroupWrapperComponent,\n DynamicFieldWrapperComponent,\n // Input Types\n BooleanInputComponent,\n IntegerInputComponent,\n TextInputComponent,\n SelectInputComponent,\n ProjectInputComponent,\n SelectProjectStatusInputComponent,\n DateInputComponent,\n FormattableTextareaInputComponent,\n UserInputComponent,\n ],\n exports: [\n DynamicFormComponent,\n ],\n})\nexport class DynamicFormsModule {}\n","
\n \n \n \n \n \n {{ selectedTitle || text.input_placeholder }}{{ selectedTitle ? '  ' : ''}}\n
\n

{{ selectedTitle }}\n

\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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 EventEmitter,\n HostBinding,\n Injector,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { whenOutside } from 'core-app/shared/directives/focus/contain-helpers';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport const triggerEditingEvent = 'op:selectableTitle:trigger';\nexport const selectableTitleIdentifier = 'editable-toolbar-title';\n\n@Component({\n selector: 'editable-toolbar-title',\n templateUrl: './editable-toolbar-title.html',\n styleUrls: ['./editable-toolbar-title.sass'],\n})\nexport class EditableToolbarTitleComponent implements OnInit, OnChanges {\n @Input('title') public inputTitle:string;\n\n @Input() public editable = true;\n\n @Input() public inFlight = false;\n\n @Input() public showSaveCondition = false;\n\n @Input() public initialFocus = false;\n\n @Input() public smallHeader = false;\n\n @Output() public onSave = new EventEmitter();\n\n @Output() public onEmptySubmit = new EventEmitter();\n\n @HostBinding('class.title-container') baseClass = true;\n\n @HostBinding('class.title-container_editable')\n public get editableClass():boolean {\n return this.editable;\n }\n\n @ViewChild('editableTitleInput') inputField?:ElementRef;\n\n public selectedTitle:string;\n\n public selectableTitleIdentifier = selectableTitleIdentifier;\n\n @InjectField() protected readonly elementRef:ElementRef;\n\n @InjectField() I18n!:I18nService;\n\n public text = {\n click_to_edit: this.I18n.t('js.work_packages.query.click_to_edit_query_name'),\n press_enter_to_save: this.I18n.t('js.label_press_enter_to_save'),\n query_has_changed_click_to_save: this.I18n.t('js.label_view_has_changed'),\n input_title: '',\n input_placeholder: this.I18n.t('js.work_packages.query.rename_query_placeholder'),\n confirm_edit_cancel: this.I18n.t('js.work_packages.query.confirm_edit_cancel'),\n duplicate_query_title: this.I18n.t('js.work_packages.query.errors.duplicate_query_title'),\n };\n\n constructor(readonly injector:Injector) {\n }\n\n ngOnInit():void {\n this.text.input_title = `${this.text.click_to_edit} ${this.text.press_enter_to_save}`;\n\n jQuery(this.elementRef.nativeElement).on(triggerEditingEvent, (evt:Event, val = '') => {\n // In case we're not editable, ignore request\n if (!this.inputField) {\n return;\n }\n\n this.selectedTitle = val;\n setTimeout(() => {\n const field:HTMLInputElement = this.inputField!.nativeElement;\n field.focus();\n }, 20);\n\n evt.stopPropagation();\n });\n }\n\n ngOnChanges(changes:SimpleChanges):void {\n if (changes.inputTitle) {\n this.selectedTitle = changes.inputTitle.currentValue;\n }\n\n if (changes.initialFocus && changes.initialFocus.firstChange && this.inputField!) {\n const field:HTMLInputElement = this.inputField.nativeElement;\n this.selectInputOnInitalFocus(field);\n }\n }\n\n public onFocus(event:FocusEvent):void {\n this.toggleToolbarButtonVisibility(true);\n this.selectInputOnInitalFocus(event.target as HTMLInputElement);\n }\n\n public onBlur():void {\n this.toggleToolbarButtonVisibility(false);\n }\n\n public selectInputOnInitalFocus(input:HTMLInputElement):void {\n if (this.initialFocus) {\n input.select();\n this.initialFocus = false;\n }\n }\n\n public saveWhenFocusOutside($event:FocusEvent):void {\n whenOutside(this.elementRef.nativeElement, () => this.save($event));\n }\n\n public reset():void {\n this.resetInputField();\n this.selectedTitle = this.inputTitle;\n }\n\n public get showSave():boolean {\n return this.editable && this.showSaveCondition;\n }\n\n public save($event:Event, force = false):void {\n $event.preventDefault();\n\n this.resetInputField();\n this.selectedTitle = this.selectedTitle.trim();\n\n // If the title is empty, show an error\n if (this.isEmpty) {\n this.onEmptyError();\n return;\n }\n\n if (!force && this.inputTitle === this.selectedTitle) {\n return; // Nothing changed\n }\n\n // Blur this element\n if (this.inputField) {\n (this.inputField.nativeElement as HTMLInputElement).blur();\n }\n\n // Avoid double saving\n if (this.inFlight) {\n return;\n }\n\n this.inFlight = true;\n\n this.emitSave(this.selectedTitle);\n\n // Unset in-flight after some delay not to trigger the blur\n setTimeout(() => this.inFlight = false, 100);\n }\n\n public get isEmpty():boolean {\n return this.selectedTitle === '';\n }\n\n /**\n * Called when saving the changed title\n */\n private emitSave(title:string):void {\n this.onSave.emit(title);\n }\n\n /**\n * Called when trying to save an empty text\n */\n private onEmptyError():void {\n // this.updateItemInMenu(); // Throws an error message, when name is empty\n this.onEmptySubmit.emit();\n this.focusInputOnError();\n }\n\n private focusInputOnError():void {\n if (this.inputField) {\n const el = this.inputField.nativeElement;\n el.classList.add('-error');\n el.focus();\n }\n }\n\n private resetInputField():void {\n if (this.inputField) {\n const el = this.inputField.nativeElement;\n el.classList.remove('-error');\n }\n }\n\n private toggleToolbarButtonVisibility(hidden:boolean):void {\n jQuery('.toolbar-items').toggleClass('hidden-for-mobile', hidden);\n }\n}\n","
\n \n
\n\n\n \n {{ text.attachments }}\n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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, ElementRef, Input, OnInit, ViewChild } from '@angular/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n ICKEditorMacroType,\n ICKEditorType,\n} from 'core-app/shared/components/editor/components/ckeditor/ckeditor-setup.service';\nimport { OpCkeditorComponent } from 'core-app/shared/components/editor/components/ckeditor/op-ckeditor.component';\nimport { componentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport {\n ICKEditorContext,\n ICKEditorInstance,\n} from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';\nimport { fromEvent } from 'rxjs';\nimport { AttachmentCollectionResource } from 'core-app/features/hal/resources/attachment-collection-resource';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\nimport { navigator } from '@hotwired/turbo';\n\nexport const ckeditorAugmentedTextareaSelector = 'ckeditor-augmented-textarea';\n\n@Component({\n selector: ckeditorAugmentedTextareaSelector,\n templateUrl: './ckeditor-augmented-textarea.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CkeditorAugmentedTextareaComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public textareaSelector:string;\n\n @Input() public previewContext:string;\n\n @Input() public macros:ICKEditorMacroType;\n\n @Input() public resource?:object;\n\n @Input() public turboMode = false;\n\n @Input() public editorType:ICKEditorType = 'full';\n\n // Which template to include\n public element:HTMLElement;\n\n public formElement:HTMLFormElement;\n\n public wrappedTextArea:HTMLTextAreaElement;\n\n // Remember if the user changed\n public changed = false;\n\n public inFlight = false;\n\n public initialContent:string;\n\n public readOnly = false;\n\n public halResource?:HalResource&{ attachments:AttachmentCollectionResource };\n\n public context:ICKEditorContext;\n\n public text = {\n attachments: this.I18n.t('js.label_attachments'),\n };\n\n // Reference to the actual ckeditor instance component\n @ViewChild(OpCkeditorComponent, { static: true }) private ckEditorInstance:OpCkeditorComponent;\n\n private attachments:HalResource[];\n\n constructor(\n readonly elementRef:ElementRef,\n protected pathHelper:PathHelperService,\n protected halResourceService:HalResourceService,\n protected Notifications:ToastService,\n protected I18n:I18nService,\n protected states:States,\n ) {\n super();\n populateInputsFromDataset(this);\n }\n\n ngOnInit() {\n this.element = this.elementRef.nativeElement;\n\n // Parse the resource if any exists\n this.halResource = this.resource ? this.halResourceService.createHalResource(this.resource, true) : undefined;\n\n this.formElement = this.element.closest('form') as HTMLFormElement;\n this.wrappedTextArea = this.formElement.querySelector(this.textareaSelector) as HTMLTextAreaElement;\n this.wrappedTextArea.style.display = 'none';\n this.wrappedTextArea.required = false;\n this.initialContent = this.wrappedTextArea.value;\n this.readOnly = this.wrappedTextArea.disabled;\n\n this.context = {\n type: this.editorType,\n resource: this.halResource,\n previewContext: this.previewContext,\n };\n if (this.readOnly) {\n this.context.macros = 'none';\n } else if (this.macros) {\n this.context.macros = this.macros;\n }\n\n this.registerFormSubmitListener();\n }\n\n private registerFormSubmitListener():void {\n fromEvent(this.formElement, 'submit')\n .pipe(\n filter(() => !this.inFlight),\n this.untilDestroyed(),\n )\n .subscribe((evt:SubmitEvent) => {\n evt.preventDefault();\n this.saveForm(evt);\n });\n }\n\n public markEdited() {\n window.OpenProject.pageWasEdited = true;\n }\n\n public saveForm(evt?:SubmitEvent):void {\n this.syncToTextarea();\n this.inFlight = true;\n window.OpenProject.pageIsSubmitted = true;\n\n setTimeout(() => {\n if (evt?.submitter) {\n (evt.submitter as HTMLInputElement).disabled = false;\n }\n\n if (this.turboMode) {\n navigator.submitForm(this.formElement, evt?.submitter || undefined);\n } else {\n this.formElement.requestSubmit(evt?.submitter);\n }\n });\n }\n\n public setup(editor:ICKEditorInstance) {\n // Have a hacky way to access the editor from outside of angular.\n // This is e.g. employed to set the text from outside to reuse the same editor for different languages.\n jQuery(this.element).data('editor', editor);\n\n if (this.readOnly) {\n editor.enableReadOnlyMode('wrapped-text-area-disabled');\n }\n\n if (this.halResource?.attachments) {\n this.setupAttachmentAddedCallback(editor);\n this.setupAttachmentRemovalSignal(editor);\n }\n\n this.setLabel();\n return editor;\n }\n\n private syncToTextarea() {\n try {\n this.wrappedTextArea.value = this.ckEditorInstance.getRawData();\n } catch (e) {\n const message = (e as Error)?.message || (e as object).toString();\n console.error(`Failed to save CKEditor body to textarea: ${message}.`);\n this.Notifications.addError(message || this.I18n.t('js.error.internal'));\n throw e;\n }\n }\n\n private setupAttachmentAddedCallback(editor:ICKEditorInstance) {\n editor.model.on('op:attachment-added', () => {\n this.states.forResource(this.halResource as HalResource)?.putValue(this.halResource);\n });\n }\n\n private setupAttachmentRemovalSignal(editor:ICKEditorInstance) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access\n this.attachments = _.clone((this.halResource as HalResource).attachments.elements);\n\n this\n .states\n .forResource(this.halResource as HalResource)\n ?.changes$()\n .pipe(\n takeUntil(componentDestroyed(this)),\n filter((resource) => !!resource),\n )\n .subscribe((resource:HalResource&{ attachments:AttachmentCollectionResource }) => {\n const missingAttachments = _.differenceBy(\n this.attachments,\n resource.attachments.elements,\n (attachment:HalResource) => attachment.id,\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-return\n const removedUrls = missingAttachments.map((attachment) => attachment.downloadLocation.href);\n\n if (removedUrls.length) {\n editor.model.fire('op:attachment-removed', removedUrls);\n }\n\n this.attachments = _.clone(resource.attachments.elements);\n });\n }\n\n private setLabel() {\n const textareaId = this.textareaSelector.substring(1);\n const label = jQuery(`label[for=${textareaId}]`);\n\n const ckContent = this.element.querySelector('.ck-content') as HTMLElement;\n\n ckContent.removeAttribute('aria-label');\n ckContent.setAttribute('aria-labelledby', textareaId);\n\n fromEvent(label, 'click')\n .pipe(this.untilDestroyed())\n .subscribe(() => ckContent.focus());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ApplicationRef, ComponentFactoryResolver, ComponentRef, Injectable, Injector,\n} from '@angular/core';\nimport { DynamicBootstrapper } from 'core-app/core/setup/globals/dynamic-bootstrapper';\n\n@Injectable()\nexport class CKEditorPreviewService {\n constructor(private readonly componentFactoryResolver:ComponentFactoryResolver,\n private readonly appRef:ApplicationRef,\n private readonly injector:Injector) {\n }\n\n /**\n * Render preview into the given element, return a remover function to disconnect all\n * dynamic components (if any).\n *\n * @param {HTMLElement} hostElement\n * @param {string} preview\n * @returns {() => void}\n */\n public render(hostElement:HTMLElement, preview:string):() => void {\n hostElement.innerHTML = preview;\n const refs:ComponentRef[] = [];\n\n DynamicBootstrapper\n .getEmbeddable()\n .forEach((entry) => {\n const matchedElements = hostElement.querySelectorAll(entry.selector);\n\n for (let i = 0, l = matchedElements.length; i < l; i++) {\n const factory = this.componentFactoryResolver.resolveComponentFactory(entry.cls);\n const componentRef = factory.create(this.injector, [], matchedElements[i]);\n\n refs.push(componentRef);\n this.appRef.attachView(componentRef.hostView);\n componentRef.changeDetectorRef.detectChanges();\n }\n });\n\n return () => {\n refs.forEach((ref) => {\n this.appRef.detachView(ref.hostView);\n ref.destroy();\n });\n refs.length = 0;\n hostElement.innerHTML = '';\n };\n }\n}\n","import { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { Injectable } from '@angular/core';\nimport {\n ICKEditorContext,\n ICKEditorStatic,\n ICKEditorWatchdog,\n} from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';\nimport { Constructor } from '@angular/cdk/schematics';\n\nexport type ICKEditorType = 'full'|'constrained';\nexport type ICKEditorMacroType = 'none'|'resource'|'full'|boolean|string[];\n\ndeclare global {\n interface Window {\n OPConstrainedEditor:ICKEditorStatic;\n OPClassicEditor:ICKEditorStatic;\n OPEditorWatchdog:Constructor;\n }\n}\n\n@Injectable()\nexport class CKEditorSetupService {\n /** The language CKEditor was able to load, falls back to 'en' */\n private loadedLocale = 'en';\n\n /** Prefetch ckeditor when browser is idle */\n private prefetch:Promise;\n\n constructor(private PathHelper:PathHelperService) {\n }\n\n public initialize() {\n this.prefetch = this.load();\n }\n\n /**\n * Create a CKEditor instance of the given type on the wrapper element.\n * Pass a ICKEditorContext object that will be used to decide active plugins.\n *\n * Returns a Watchdog instance that has access to the editor and monitors its state.\n *\n * @param {HTMLElement} wrapper\n * @param {ICKEditorContext} context\n * @param {string|null} initialData\n * @returns {Promise}\n */\n public async create(\n wrapper:HTMLElement, context:ICKEditorContext,\n initialData:string|null = null,\n ):Promise {\n // Load the bundle and the matching locale, if found.\n await this.prefetch;\n\n const { type } = context;\n const editorClass = type === 'constrained' ? window.OPConstrainedEditor : window.OPClassicEditor;\n wrapper.classList.add(`ckeditor-type-${type}`);\n\n const toolbarWrapper = wrapper.querySelector('.document-editor__toolbar') as HTMLElement;\n const contentWrapper = wrapper.querySelector('.document-editor__editable') as HTMLElement;\n const uiLocale = this.loadedLocale;\n const contentLanguage = context.options && context.options.rtl ? 'ar' : 'en';\n\n const config = {\n openProject: this.createConfig(context),\n initialData,\n language: {\n ui: uiLocale,\n content: contentLanguage,\n },\n };\n\n return this\n .createWatchdog(editorClass, contentWrapper, config)\n .then((watchdog:ICKEditorWatchdog) => {\n const { editor } = watchdog;\n toolbarWrapper.appendChild(editor.ui.view.toolbar.element);\n\n // Allow custom events on wrapper to set/get data for debugging\n jQuery(wrapper)\n .on('op:ckeditor:setData', (event:unknown, data:string) => editor.setData(data))\n .on('op:ckeditor:clear', () => editor.setData(' '))\n .on('op:ckeditor:getData', (event:unknown, cb:(data:string) => void) => cb(editor.getData({ trim: false })));\n\n return watchdog;\n });\n }\n\n /**\n * Build the given editor class with a watchdog around it, returning the watchdog.\n *\n * @param editorClass\n * @param contentWrapper\n * @param config\n * @private\n */\n private createWatchdog(\n editorClass:ICKEditorStatic,\n contentWrapper:HTMLElement,\n config:unknown,\n ):Promise {\n const watchdog = new window.OPEditorWatchdog();\n\n watchdog.setCreator(() => editorClass.createCustomized(contentWrapper, config));\n watchdog.setDestructor((editor) => editor.destroy());\n\n return watchdog\n .create(contentWrapper, {})\n .then(() => watchdog);\n }\n\n /**\n * Load the ckeditor asset\n */\n private async load():Promise {\n // untyped module cannot be dynamically imported\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n await import(/* webpackPrefetch: true; webpackChunkName: \"ckeditor\" */ 'core-vendor/ckeditor/ckeditor');\n\n try {\n await import(\n /* webpackPrefetch: true; webpackChunkName: \"ckeditor-translation\" */ `../../../../../../vendor/ckeditor/translations/${I18n.locale}.js`\n ) as unknown;\n this.loadedLocale = I18n.locale;\n } catch (e:unknown) {\n console.warn(`Failed to load translation for CKEditor: ${e as string}`);\n }\n }\n\n private createConfig(context:ICKEditorContext):unknown {\n if (context.macros === 'none') {\n context.macros = false;\n } else if (context.macros === 'resource') {\n context.macros = [\n 'OPMacroToc',\n 'OPMacroEmbeddedTable',\n 'OPMacroWpButton',\n ];\n }\n\n return {\n context,\n helpURL: this.PathHelper.textFormattingHelp(),\n pluginContext: window.OpenProject.pluginContext.value,\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,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport {\n ICKEditorContext,\n ICKEditorInstance,\n ICKEditorWatchdog,\n} from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';\nimport { CKEditorSetupService } from 'core-app/shared/components/editor/components/ckeditor/ckeditor-setup.service';\nimport { KeyCodes } from 'core-app/shared/helpers/keyCodes.enum';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\n\ndeclare module 'codemirror';\n\n@Component({\n selector: 'op-ckeditor',\n templateUrl: './op-ckeditor.html',\n styleUrls: ['./op-ckeditor.sass'],\n})\nexport class OpCkeditorComponent implements OnInit, OnDestroy {\n @Input() context:ICKEditorContext;\n\n @Input()\n public set content(newVal:string) {\n this._content = newVal || '';\n\n if (this.initialized) {\n this.ckEditorInstance.setData(this._content);\n }\n }\n\n // Output notification once ready\n @Output() initializeDone = new EventEmitter();\n\n // Output notification at max once/s for data changes\n @Output() contentChanged = new EventEmitter();\n\n // Output notification when editor cannot be initialized\n @Output() initializationFailed = new EventEmitter();\n\n // Output save requests (ctrl+enter and cmd+enter)\n @Output() saveRequested = new EventEmitter();\n\n // View container of the replacement used to initialize CKEditor5\n @ViewChild('opCkeditorReplacementContainer', { static: true }) opCkeditorReplacementContainer:ElementRef;\n\n @ViewChild('codeMirrorPane') codeMirrorPane:ElementRef;\n\n // CKEditor instance once initialized\n public watchdog:ICKEditorWatchdog;\n\n public ckEditorInstance:ICKEditorInstance;\n\n public error:string|null = null;\n\n public allowManualMode = false;\n\n public manualMode = false;\n\n private _content = '';\n\n public text = {\n errorTitle: this.I18n.t('js.editor.ckeditor_error'),\n };\n\n // Codemirror instance, initialized lazily when running source mode\n public codeMirrorInstance:undefined|any;\n\n // Debounce change listener for both CKE and codemirror\n // to read back changes as they happen\n private debouncedEmitter = _.debounce(\n () => {\n void this.getTransformedContent(false)\n .then((val) => {\n this.contentChanged.emit(val);\n });\n },\n 1000,\n { leading: true },\n );\n\n private $element:JQuery;\n\n constructor(\n private readonly elementRef:ElementRef,\n private readonly Notifications:ToastService,\n private readonly I18n:I18nService,\n private readonly configurationService:ConfigurationService,\n private readonly ckEditorSetup:CKEditorSetupService,\n ) {\n }\n\n /**\n * Get the current live data from CKEditor. This may raise in cases\n * the data cannot be loaded (MS Edge!)\n */\n public getRawData():string {\n if (this.manualMode) {\n return this._content = this.codeMirrorInstance.getValue();\n }\n return this._content = this.ckEditorInstance.getData({ trim: false });\n }\n\n /**\n * Get a promise with the transformed content, will wrap errors in the promise.\n * @param notificationOnError\n */\n public getTransformedContent(notificationOnError = true):Promise {\n if (!this.initialized) {\n throw new Error('Tried to access CKEditor instance before initialization.');\n }\n\n return new Promise((resolve, reject) => {\n try {\n resolve(this.getRawData());\n } catch (e) {\n console.error(`Failed to save CKEditor content: ${e}.`);\n const error = this.I18n.t(\n 'js.editor.error_saving_failed',\n { error: e || this.I18n.t('js.error.internal') },\n );\n\n if (notificationOnError) {\n this.Notifications.addError(error);\n }\n\n reject(error);\n }\n });\n }\n\n /**\n * Return the current content. This may be outdated a tiny bit.\n */\n public get content() {\n return this._content;\n }\n\n public get initialized():boolean {\n return this.ckEditorInstance !== undefined;\n }\n\n ngOnInit() {\n try {\n this.initializeEditor();\n } catch (error:unknown) {\n // We will run into this error if, among others, the browser does not fully support\n // CKEditor's requirements on ES6.\n\n const message = (error as Error).toString();\n console.error('Failed to setup CKEditor instance: %O', error);\n this.error = message;\n this.initializationFailed.emit(message);\n }\n }\n\n ngOnDestroy() {\n try {\n this.watchdog?.destroy();\n } catch (e) {\n console.error('Failed to destroy CKEditor instance:', e);\n }\n }\n\n private initializeEditor() {\n this.$element = jQuery(this.elementRef.nativeElement);\n\n const editorPromise = this.ckEditorSetup\n .create(\n this.opCkeditorReplacementContainer.nativeElement,\n this.context,\n this.content,\n )\n .catch((error:string) => {\n throw (error);\n })\n .then((watchdog:ICKEditorWatchdog) => {\n this.setupWatchdog(watchdog);\n const editor = watchdog.editor;\n this.ckEditorInstance = editor;\n\n\n // Switch mode\n editor.on('op:source-code-enabled', () => this.enableManualMode());\n editor.on('op:source-code-disabled', () => this.disableManualMode());\n\n // Capture CTRL+ENTER commands\n this.interceptModifiedEnterKeystrokes(editor);\n\n // Emit global dragend events for other drop zones to react.\n // This is needed, as CKEditor does not bubble any drag events\n const model = watchdog.editor.model;\n model.document.on('change', this.debouncedEmitter);\n model.on('op:attachment-added', () => document.body.dispatchEvent(new DragEvent('dragend')));\n model.on('op:attachment-removed', () => document.body.dispatchEvent(new DragEvent('dragend')));\n\n this.initializeDone.emit(watchdog.editor);\n return watchdog.editor;\n });\n\n this.$element.data('editor', editorPromise);\n }\n\n private interceptModifiedEnterKeystrokes(editor:ICKEditorInstance) {\n editor.listenTo(\n editor.editing.view.document,\n 'keydown',\n (evt, data) => {\n if ((data.ctrlKey || data.metaKey) && data.keyCode === KeyCodes.ENTER) {\n debugLog('Sending save request from CKEditor.');\n this.saveRequested.emit();\n evt.stop();\n }\n },\n { priority: 'highest' },\n );\n }\n\n /**\n * Disable the manual mode, kill the codeMirror instance and switch back to CKEditor\n */\n private disableManualMode() {\n const current = this.getRawData();\n\n // Apply content to ckeditor\n this.ckEditorInstance.setData(current);\n this.codeMirrorInstance = null;\n this.manualMode = false;\n }\n\n /**\n * Enable manual mode, get data from WYSIWYG and show CodeMirror instance.\n */\n private enableManualMode() {\n const current = this.getRawData();\n const cmMode = 'gfm';\n\n Promise\n .all([\n import('codemirror'),\n import(/* webpackChunkName: \"codemirror-mode\" */ `codemirror/mode/${cmMode}/${cmMode}.js`),\n ])\n .then((imported:any[]) => {\n const CodeMirror = imported[0].default;\n this.codeMirrorInstance = CodeMirror(\n this.$element.find('.ck-editor__source')[0],\n {\n lineNumbers: true,\n smartIndent: true,\n value: current,\n mode: '',\n },\n );\n\n this.codeMirrorInstance.on('change', this.debouncedEmitter);\n setTimeout(() => this.codeMirrorInstance.refresh(), 100);\n this.manualMode = true;\n });\n }\n\n /**\n * Listen to some of the error events of the watchdog to provide the\n * user with some information on what went wrong.\n *\n * @param watchdog\n * @private\n */\n private setupWatchdog(watchdog:ICKEditorWatchdog) {\n this.watchdog = watchdog;\n\n watchdog.on('error', (_, { error }) => {\n this.error = error.message;\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { APP_INITIALIZER, Injector, NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { OpenprojectAttachmentsModule } from 'core-app/shared/components/attachments/openproject-attachments.module';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport {\n CkeditorAugmentedTextareaComponent,\n} from 'core-app/shared/components/editor/components/ckeditor-augmented-textarea/ckeditor-augmented-textarea.component';\nimport { OpCkeditorComponent } from 'core-app/shared/components/editor/components/ckeditor/op-ckeditor.component';\nimport { CKEditorSetupService } from 'core-app/shared/components/editor/components/ckeditor/ckeditor-setup.service';\nimport { CKEditorPreviewService } from 'core-app/shared/components/editor/components/ckeditor/ckeditor-preview.service';\nimport { EditorMacrosService } from 'core-app/shared/components/modals/editor/editor-macros.service';\nimport {\n WikiIncludePageMacroModalComponent,\n} from 'core-app/shared/components/modals/editor/macro-wiki-include-page-modal/wiki-include-page-macro.modal';\nimport {\n ChildPagesMacroModalComponent,\n} from 'core-app/shared/components/modals/editor/macro-child-pages-modal/child-pages-macro.modal';\nimport {\n CodeBlockMacroModalComponent,\n} from 'core-app/shared/components/modals/editor/macro-code-block-modal/code-block-macro.modal';\n\nexport function initializeServices(injector:Injector) {\n return () => {\n const ckeditorService = injector.get(CKEditorSetupService);\n ckeditorService.initialize();\n };\n}\n\n@NgModule({\n imports: [\n FormsModule,\n CommonModule,\n OpenprojectAttachmentsModule,\n OpenprojectModalModule,\n ],\n providers: [\n // CKEditor\n EditorMacrosService,\n CKEditorSetupService,\n CKEditorPreviewService,\n {\n provide: APP_INITIALIZER, useFactory: initializeServices, deps: [Injector], multi: true,\n },\n ],\n exports: [\n CkeditorAugmentedTextareaComponent,\n OpCkeditorComponent,\n ],\n declarations: [\n // CKEditor and Macros\n CkeditorAugmentedTextareaComponent,\n OpCkeditorComponent,\n WikiIncludePageMacroModalComponent,\n CodeBlockMacroModalComponent,\n ChildPagesMacroModalComponent,\n ],\n})\nexport class OpenprojectEditorModule {\n constructor(injector:Injector) {\n }\n}\n","\n
\n\n \n
\n
\n \n \n \n \n \n \n
\n
\n\n \n\n \n {{text.you_contribute}}\n \n\n
\n \n \n {{ text.more_info_text }}\n \n\n \n \n {{ text.upgrade }}\n \n\n \n {{ text.button_trial }}\n \n\n
\n
\n
\n\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n Input,\n OnInit,\n} from '@angular/core';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { imagePath } from 'core-app/shared/helpers/images/path-helper';\nimport { OpModalService } from '../modal/modal.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\nimport { pricingUrl } from 'core-app/core/setup/globals/constants.const';\n\nexport const enterpriseBannerSelector = 'op-enterprise-banner';\n\n@Component({\n selector: enterpriseBannerSelector,\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./enterprise-banner.component.sass'],\n templateUrl: './enterprise-banner.component.html',\n})\nexport class EnterpriseBannerComponent implements OnInit {\n @Input() public leftMargin = false;\n\n @Input() public textMessage:string;\n\n @Input() public linkMessage:string;\n\n @Input() public opReferrer:string;\n\n @Input() public moreInfoLink:string;\n\n @Input() public collapsible:boolean;\n\n public collapsed = false;\n\n link:string;\n\n pricingUrl = pricingUrl;\n\n text = {\n enterpriseFeature: this.I18n.t('js.upsale.ee_only'),\n become_hero: this.I18n.t('js.admin.enterprise.upsale.become_hero'),\n you_contribute: this.I18n.t('js.admin.enterprise.upsale.you_contribute'),\n button_trial: this.I18n.t('js.admin.enterprise.upsale.button_start_trial'),\n upgrade: this.I18n.t('js.admin.enterprise.upsale.button_upgrade'),\n more_info_link: `${this.pathHelper.appBasePath}/admin/enterprise`,\n more_info_text: this.I18n.t('js.admin.enterprise.upsale.more_info'),\n };\n\n image = {\n enterprise_edition: imagePath('enterprise-add-on.svg'),\n };\n\n constructor(\n readonly elementRef:ElementRef,\n protected I18n:I18nService,\n protected bannersService:BannersService,\n protected opModalService:OpModalService,\n readonly injector:Injector,\n readonly pathHelper:PathHelperService,\n ) {\n populateInputsFromDataset(this);\n }\n\n ngOnInit():void {\n this.link = this.bannersService.getEnterPriseEditionUrl({ referrer: this.opReferrer });\n this.collapsed = this.collapsible;\n }\n\n toggleCollapse():void {\n this.collapsed = !this.collapsed;\n }\n}\n","
\n

\n

{{feature_description}}

\n

\n {{text.benefits_description}}\n
\n {{text.premium_features_text}}\n
\n {{text.professional_support_text}}\n

\n\n

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

\n

{{text.upgrade_info}}

\n\n \n {{ text.button_contact_us }}\n \n\n \n \n {{ text.upgrade }}\n \n \n
\n\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { imagePath } from 'core-app/shared/helpers/images/path-helper';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { pricingUrl, contactUrl } from 'core-app/core/setup/globals/constants.const';\n\nexport const enterprisePageSelector = 'op-enterprise-page';\n\n@Component({\n selector: enterprisePageSelector,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './enterprise-page.component.html',\n})\nexport class EnterprisePageComponent {\n @Input() public feature_more_info:string;\n\n @Input() public feature_video:string;\n\n @Input() public feature_image:string;\n\n @Input() public feature_title:string;\n\n @Input() public feature_description:string;\n\n @Input() public more_info:string;\n\n @Input() public hide_breadcrumb = false;\n\n text = {\n button_contact_us: this.I18n.t('js.admin.enterprise.upsale.button_contact_us'),\n upgrade: this.I18n.t('js.admin.enterprise.upsale.button_upgrade'),\n upgrade_link: pricingUrl,\n contact_link: contactUrl.en,\n benefits_description: this.I18n.t('js.admin.enterprise.upsale.benefits.description'),\n premium_features_text: this.I18n.t('js.admin.enterprise.upsale.benefits.premium_features_text'),\n professional_support_text: this.I18n.t('js.admin.enterprise.upsale.benefits.professional_support_text'),\n enterprise_info_html: (feature_title:string):string => this.I18n.t('js.admin.enterprise.upsale.enterprise_info_html', {\n feature_title,\n }),\n upgrade_info: this.I18n.t('js.admin.enterprise.upsale.upgrade_info'),\n button_contact: this.I18n.t('js.admin.enterprise.upsale.buttons.contact'),\n button_upgrade: this.I18n.t('js.admin.enterprise.upsale.buttons.upgrade'),\n };\n\n image = {\n enterprise_edition: imagePath('enterprise-add-on.svg'),\n };\n\n constructor(\n readonly elementRef:ElementRef,\n protected I18n:I18nService,\n readonly pathHelper:PathHelperService,\n ) {\n\n }\n}\n","export type ChangeItem = {\n from:unknown;\n to:unknown;\n};\nexport type ChangeMap = { [attribute:string]:ChangeItem };\n\nexport class Changeset {\n private changes:ChangeMap = {};\n\n /**\n * Return whether a change value exist for the given attribute key.\n * @param {string} key\n * @return {boolean}\n */\n public contains(key:string) {\n return this.changes.hasOwnProperty(key);\n }\n\n /**\n * Get changed attribute names\n * @returns {string[]}\n */\n public get changed():string[] {\n return _.keys(this.changes);\n }\n\n /**\n * Returns the live set of the changes.\n */\n public get all():ChangeMap {\n return this.changes;\n }\n\n /**\n * Reset one or multiple changes\n * @param key\n */\n public reset(...keys:string[]) {\n keys.forEach((k) => {\n delete this.changes[k];\n });\n }\n\n /**\n * Reset the entire changeset\n */\n public clear():void {\n this.changes = {};\n }\n\n public set(key:string, value:unknown, pristineValue:unknown):void {\n this.changes[key] = {\n from: pristineValue,\n to: value,\n };\n }\n\n /**\n * Get a change item for the given key, if any\n * @param key\n */\n public getItem(key:string):ChangeItem|undefined {\n return this.changes[key];\n }\n\n /**\n * Get a single value from the changeset\n * @param key\n */\n public getValue(key:string):unknown|undefined {\n return this.getItem(key)?.to;\n }\n\n /**\n * Get a single pristine value from the changeset\n * @param key\n */\n public getPristine(key:string):unknown|undefined {\n return this.changes[key]?.from;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n input,\n InputState,\n} from '@openproject/reactivestates';\nimport { take } from 'rxjs/operators';\n\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { FormResource } from 'core-app/features/hal/resources/form-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport {\n ChangeItem,\n ChangeMap,\n Changeset,\n} from 'core-app/shared/components/fields/changeset/changeset';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { SchemaProxy } from 'core-app/features/hal/schemas/schema-proxy';\nimport { IHalOptionalTitledLink } from 'core-app/core/state/hal-resource';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { firstValueFrom } from 'rxjs';\n\nexport const PROXY_IDENTIFIER = '__is_changeset_proxy';\n\n/**\n * Temporary class living while a resource is being edited\n * Maintains references to:\n * - The source resource (a pristine base)\n * - The open set of changes (a changeset object)\n * - The current form (due to temporary type/project changes)\n *\n * Provides access to:\n * - The projected resource with all changes applied as properties\n */\nexport class ResourceChangeset {\n /** Maintain a single change set while editing */\n protected changeset = new Changeset();\n\n /** Reference and load promise for the current form */\n protected form$ = input();\n\n /** Request cache for objects within the changeset for the current form */\n protected cache:{ [key:string]:Promise } = {};\n\n /** Flag whether this is currently being saved */\n public inFlight = false;\n\n /** Keep a reference to the original resource */\n protected _pristineResource:T;\n\n /** The projected resource, which will proxy values from the changeset */\n public projectedResource:T;\n\n /** The cache to all the schemas. Used to maintain the schema of the projectedResource which does not stem from a form.\n * The schema of the form is kept inside the changeset.\n * */\n protected schemaCache:SchemaCacheService;\n\n constructor(\n pristineResource:T,\n public readonly state?:InputState>,\n loadedForm:FormResource|null = null,\n ) {\n this.updatePristineResource(pristineResource);\n\n this.schemaCache = (pristineResource.injector).get(SchemaCacheService);\n\n if (loadedForm) {\n this.form$.putValue(loadedForm);\n }\n }\n\n /**\n * Push the change to the editing state to notify others.\n * This will happen internally on resource wide changes\n */\n public push() {\n if (this.state) {\n this.state.putValue(this);\n }\n }\n\n /**\n * Build the request attributes against the fresh form\n */\n public buildRequestPayload():Promise {\n return this\n .getForm()\n .then(() => this.buildPayloadFromChanges());\n }\n\n /**\n * Update the pristine resource in case it changed\n *\n * @param attribute\n */\n public updatePristineResource(resource:T) {\n // Ensure we're not passing in a proxy\n if ((resource as any)[PROXY_IDENTIFIER]) {\n throw new Error(\"You're trying to pass proxy object as a pristine resource. This will cause errors\");\n }\n\n this._pristineResource = resource;\n this.projectedResource = new Proxy(\n this._pristineResource,\n {\n get: (_, key:string) => this.proxyGet(key),\n set: (_, key:string, val:any) => {\n this.setValue(key, val);\n return true;\n },\n },\n );\n }\n\n public get pristineResource():T {\n return this._pristineResource;\n }\n\n /**\n * Returns the cached form or loads it if necessary.\n */\n public getForm(reload = false):Promise {\n if ((this.form$.isPristine() || reload) && !this.form$.hasActivePromiseRequest()) {\n return this.updateForm();\n }\n\n return firstValueFrom(this.form$.values$());\n }\n\n /**\n * Cache some promised value in the course of this changeset.\n * Will get cleared automatically by the changeset on destroy/submission\n */\n\n /**\n * Posts to the form with the current changes\n * to get the up to date projected object.\n */\n protected updateForm():Promise {\n const payload = this.buildPayloadFromChanges();\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!this.pristineResource.$links.update) {\n return Promise.reject();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n const promise = this.pristineResource\n .$links\n .update(payload)\n .then((form:FormResource) => {\n this.cache = {};\n this.form$.putValue(form);\n this.setNewDefaults(form);\n this.push();\n return form;\n }) as Promise;\n\n this.form$.putFromPromiseIfPristine(() => promise);\n return promise;\n }\n\n /**\n * Return whether no changes were made to the work package\n */\n public isEmpty() {\n return this.changeset.changed.length === 0;\n }\n\n /**\n * Return the ID of the resource we're editing\n */\n public get id():string {\n return this.pristineResource.id!.toString();\n }\n\n /**\n * Return the HAL href of the resource we're editing\n */\n public get href():string {\n return this.pristineResource.href as string;\n }\n\n /**\n * Returns the changed `to` values of the ChangeMap\n */\n public get changes():{ [key:string]:unknown } {\n const changes:{ [key:string]:unknown } = {};\n\n _.each(this.changeset.all, (item, key) => {\n changes[key] = item.to;\n });\n\n return changes;\n }\n\n /**\n * Returns the change map with from and to values\n */\n public get changeMap():ChangeMap {\n return { ...this.changeset.all };\n }\n\n /**\n * Return the changed attributes in this change;\n */\n public get changedAttributes():string[] {\n return this.changeset.changed;\n }\n\n /**\n * Return whether the element is writable\n * given the current best schema.\n *\n * @param key\n */\n public isWritable(key:string):boolean {\n const fieldSchema = this.schema.ofProperty(key) as IFieldSchema|null;\n return !!(fieldSchema && fieldSchema.writable);\n }\n\n /**\n * Return the best humanized name for this attribute\n * @param attribute\n */\n public humanName(attribute:string):string {\n return _.get(this.schema, `${attribute}.name`, attribute);\n }\n\n /**\n * Returns whether the given attribute was changed\n */\n public contains(key:string) {\n return this.changeset.contains(key);\n }\n\n /**\n * Proxy getters to base or changeset.\n * @param key\n */\n private proxyGet(key:string) {\n if (key === '__is_proxy') {\n return true;\n }\n\n return this.value(key);\n }\n\n /**\n * Retrieve the editing value for the given attribute\n *\n * @param {string} key The attribute to read\n * @return {any} Either the value from the overridden change, or the default value\n */\n public value(key:string):R {\n // Overridden value by user?\n if (this.changeset.contains(key)) {\n return this.changeset.getValue(key) as R;\n }\n\n // Return whatever is on the base.\n // TODO this needs to be typed\n return this.pristineResource[key] as R;\n }\n\n /**\n * Return whether the given value exists,\n * even if its undefined.\n *\n * @param key\n */\n public valueExists(key:string):boolean {\n return this.changeset.contains(key) || this.pristineResource.hasOwnProperty(key);\n }\n\n /**\n * Change the value of the projected resource to some value\n *\n * @param key\n * @param val\n */\n public setValue(key:string, val:any) {\n this.changeset.set(key, val, this.pristineResource[key]);\n }\n\n /**\n * Clear the changed value of the projected resource\n *\n * @param keys A set of keys to reset\n */\n public clearValue(...keys:string[]) {\n this.changeset.reset(...keys);\n }\n\n public clear() {\n this.state && this.state.clear();\n this.changeset.clear();\n this.cache = {};\n this.form$.clear();\n }\n\n /**\n * Reset the given changed attribute\n * @param key\n */\n public reset(key:string) {\n this.changeset.reset(key);\n }\n\n /**\n * Return whether a change value exist for the given attribute key.\n * @param {string} key\n * @return {boolean}\n */\n public isOverridden(key:string) {\n return this.changes.hasOwnProperty(key);\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 SchemaProxy.create(this.form$.value!.schema, this.projectedResource);\n }\n return this.schemaCache.of(this.pristineResource);\n }\n\n /**\n * Access some promised value\n * that should be cached for the lifetime duration of the form.\n */\n public cacheValue(key:string, request:() => Promise):Promise {\n if (this.cache[key] !== undefined) {\n return this.cache[key] as Promise;\n }\n\n return this.cache[key] = request();\n }\n\n protected get minimalPayload() {\n return { lockVersion: this.pristineResource.lockVersion, _links: {} };\n }\n\n /**\n * Merge the current changes into the payload resource.\n *\n * @param {plainPayload:unknown} A set of attributes to merge into the payload\n * @return {any}\n */\n protected applyChanges(plainPayload:any) {\n // Fall back to the last known state of the HalResource should the form not be loaded.\n let reference = this.pristineResource.$source;\n if (this.form$.value) {\n reference = this.form$.value.payload.$source;\n }\n\n _.each(this.changeset.all, (val:ChangeItem, key:string) => {\n if (!this.schema.isAttributeEditable(key)) {\n debugLog(`Trying to write ${key} but is not writable in schema`);\n return;\n }\n\n const fieldSchema:IFieldSchema|null = this.schema.ofProperty(key);\n // Override in _links if it is a linked property\n if (fieldSchema && reference._links[key]) {\n plainPayload._links[key] = this.getLinkedValue(val.to, fieldSchema);\n } else {\n plainPayload[key] = val.to;\n }\n });\n\n return plainPayload;\n }\n\n /**\n * Create the payload from the current changes, and extend it with the current lock version.\n * -- This is the place to add additional logic when the lockVersion changed in between --\n */\n protected buildPayloadFromChanges() {\n let payload:unknown&{ _links:{ attachments?:IHalOptionalTitledLink[], fileLinks?:IHalOptionalTitledLink[] } };\n\n if (isNewResource(this.pristineResource)) {\n // If the resource is new, we need to pass the entire form payload\n // to let all default values be transmitted (type, status, etc.)\n // We clone the object to avoid later manipulations to affect the original resource.\n if (this.form$.value) {\n payload = _.cloneDeep(this.form$.value.payload.$source);\n } else {\n payload = _.cloneDeep(this.pristineResource.$source);\n }\n\n // Add attachments to be assigned.\n // They will already be created on the server, but now\n // we need to claim them for the newly created work package.\n if (this.pristineResource.attachments) {\n payload._links.attachments = (this.pristineResource.attachments as unknown&{ elements:IHalOptionalTitledLink[] })\n .elements\n .map((a) => ({ href: a.href }));\n }\n\n // Add file links to be assigned.\n if (this.pristineResource.fileLinks) {\n payload._links.fileLinks = (this.pristineResource.fileLinks as unknown&{ elements:IHalOptionalTitledLink[] })\n .elements\n .map((fl) => ({ href: fl.href }));\n }\n } else {\n // Otherwise, simply use the bare minimum\n payload = this.minimalPayload;\n }\n\n return this.applyChanges(payload);\n }\n\n /**\n * Extract the link(s) in the given changed value\n */\n protected getLinkedValue(val:any, fieldSchema:IFieldSchema) {\n // Links should always be nullified as { href: null }, but\n // this wasn't always the case, so ensure null values are returned as such.\n if (_.isNil(val)) {\n return { href: null };\n }\n\n // Test if we either have a CollectionResource or a HAL array,\n // or a single hal value.\n const isArrayType = (fieldSchema.type || '').startsWith('[]');\n let isArray = false;\n\n if (val.forEach || val.elements) {\n isArray = true;\n }\n\n if (isArray && isArrayType) {\n const links:{ href:string }[] = [];\n\n if (val) {\n const elements = (val.forEach && val) || val.elements;\n\n elements.forEach((link:{ href:string }) => {\n if (link.href) {\n links.push({ href: link.href });\n }\n });\n }\n\n return links;\n }\n return { href: _.get(val, 'href', null) };\n }\n\n /**\n * When changing type or project, new custom fields may be present\n * that we need to set.\n */\n protected setNewDefaults(form:FormResource) {\n _.each(form.payload, (val:unknown, key:string) => {\n const fieldSchema:IFieldSchema|null = this.schema.ofProperty(key);\n if (!fieldSchema?.writable) {\n return;\n }\n\n this.setNewDefaultFor(key, val);\n });\n }\n\n /**\n * Set the default for the given attribute\n */\n protected setNewDefaultFor(key:string, val:unknown) {\n if (!this.valueExists(key)) {\n debugLog(`Taking over default value from form for ${key}`);\n this.setValue(key, val);\n }\n }\n}\n","import { Injector } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport {\n DisplayFieldContext,\n DisplayFieldService,\n} from 'core-app/shared/components/fields/display/display-field.service';\nimport { DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\nimport { MultipleLinesCustomOptionsDisplayField } from 'core-app/shared/components/fields/display/field-types/multiple-lines-custom-options-display-field.module';\nimport { ProgressTextDisplayField } from 'core-app/shared/components/fields/display/field-types/progress-text-display-field.module';\nimport { MultipleLinesUserFieldModule } from 'core-app/shared/components/fields/display/field-types/multiple-lines-user-display-field.module';\nimport { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\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 { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { DateDisplayField } from 'core-app/shared/components/fields/display/field-types/date-display-field.module';\n\nexport const editableClassName = '-editable';\nexport const requiredClassName = '-required';\nexport const readOnlyClassName = '-read-only';\nexport const placeholderClassName = '-placeholder';\nexport const displayClassName = 'inline-edit--display-field';\nexport const editFieldContainerClass = 'inline-edit--container';\n\nexport class DisplayFieldRenderer {\n @InjectField() displayFieldService:DisplayFieldService;\n\n @InjectField() schemaCache:SchemaCacheService;\n\n @InjectField() halEditing:HalResourceEditingService;\n\n @InjectField() I18n!:I18nService;\n\n /** We cache the previously used fields to avoid reinitialization */\n private fieldCache:{ [key:string]:DisplayField } = {};\n\n constructor(\n public readonly injector:Injector,\n public readonly container:'table'|'single-view'|'timeline',\n public readonly options:{ [key:string]:unknown } = {},\n ) {\n }\n\n public render(\n resource:T,\n name:string,\n change:ResourceChangeset|null,\n ):HTMLSpanElement {\n const [field, span] = this.renderFieldValue(resource, name, change);\n\n if (field === null) {\n return span;\n }\n\n this.setSpanAttributes(span, field, name, resource, change);\n\n return span;\n }\n\n public renderFieldValue(\n resource:T,\n requestedAttribute:string,\n change:ResourceChangeset|null,\n ):[DisplayField|null, HTMLSpanElement] {\n const span = document.createElement('span');\n const schema = this.schema(resource, change);\n const attributeName = this.attributeName(requestedAttribute, schema);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n const fieldSchema = schema.ofProperty(attributeName) as IFieldSchema;\n\n // If the resource does not have that field, return an empty\n // span (e.g., for the table).\n if (!fieldSchema) {\n return [null, span];\n }\n\n const field = this.getField(resource, fieldSchema, attributeName, change);\n field.render(span, this.getText(field), fieldSchema.options);\n\n const { title } = field;\n if (title) {\n span.setAttribute('title', title);\n }\n span.setAttribute('aria-label', this.getAriaLabel(field, schema));\n\n return [field, span];\n }\n\n public getField(\n resource:T,\n fieldSchema:IFieldSchema,\n attributeName:string,\n change:ResourceChangeset|null,\n ):DisplayField {\n let field = this.fieldCache[attributeName];\n\n if (!field) {\n // eslint-disable-next-line no-multi-assign\n field = this.fieldCache[attributeName] = this.getFieldForCurrentContext(resource, attributeName, fieldSchema);\n }\n\n field.apply(resource, fieldSchema);\n field.activeChange = change;\n\n return field;\n }\n\n private getFieldForCurrentContext(resource:T, attributeName:string, fieldSchema:IFieldSchema):DisplayField {\n const context:DisplayFieldContext = { container: this.container, injector: this.injector, options: this.options };\n return this.displayFieldService.getField(resource, attributeName, fieldSchema, context);\n }\n\n private getText(field:DisplayField):string {\n if (field.isEmpty()) {\n return field.placeholder;\n }\n\n return field.valueString;\n }\n\n private setSpanAttributes(span:HTMLElement, field:DisplayField, name:string, resource:T, change:ResourceChangeset|null):void {\n span.classList.add(displayClassName, name);\n span.dataset.fieldName = name;\n\n // Make span tabbable unless it's an id field\n span.setAttribute('tabindex', name === 'id' ? '-1' : '0');\n\n if (field.required) {\n span.classList.add(requiredClassName);\n }\n\n if (field.isEmpty()) {\n span.classList.add(placeholderClassName);\n }\n\n const schema = this.schema(resource, change);\n if (this.isAttributeEditable(schema, name)) {\n span.classList.add(editableClassName);\n span.setAttribute('role', 'button');\n } else {\n span.classList.add(readOnlyClassName);\n }\n }\n\n private isAttributeEditable(schema:SchemaResource, fieldName:string):boolean {\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 // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n return schema.isAttributeEditable(fieldName) as boolean;\n }\n\n private getAriaLabel(field:DisplayField, schema:SchemaResource):string {\n let titleContent;\n const labelContent = this.getLabelContent(field);\n\n if (field.isFormattable && !field.isEmpty()) {\n try {\n titleContent = _.escape(jQuery(`
${labelContent}
`).text());\n } catch (e) {\n console.error('Failed to parse formattable labelContent');\n titleContent = `Label for ${field.displayName}`;\n }\n } else {\n titleContent = labelContent;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n if (field.writable && !!schema.isAttributeEditable(field.name)) {\n return this.I18n.t('js.inplace.button_edit', { attribute: `${field.displayName} ${titleContent}` });\n }\n return `${field.displayName} ${titleContent}`;\n }\n\n private getLabelContent(field:DisplayField):string {\n if (field.isEmpty()) {\n return this.I18n.t('js.inplace.null_value_label');\n }\n return field.valueString;\n }\n\n /**\n * Get the attribute name from either the schema if the mappedName method is implemented or\n * return the attribute itself.\n *\n * @param schema\n * @param attribute\n */\n private attributeName(attribute:string, schema:SchemaResource):string {\n if (schema.mappedName) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n return schema.mappedName(attribute) as string;\n }\n\n return attribute;\n }\n\n private schema(resource:T, change:ResourceChangeset|null):SchemaResource {\n if (change) {\n return change.schema;\n }\n\n if (this.halEditing.typedState(resource).hasValue()) {\n const val = this.halEditing.typedState(resource).value as { schema:SchemaResource };\n return val.schema;\n }\n\n return this.schemaCache.of(resource);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n Input,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { DisplayFieldService } from 'core-app/shared/components/fields/display/display-field.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { Constructor } from '@angular/cdk/table';\nimport { DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\n\n@Component({\n selector: 'display-field',\n template: '',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DisplayFieldComponent implements OnInit {\n @Input() resource:HalResource;\n\n @Input() fieldName:string;\n\n @Input() displayClass?:Constructor;\n\n @Input() containerType:'table'|'single-view'|'timeline' = 'table';\n\n @Input() displayFieldOptions:{ [key:string]:unknown } = {};\n\n @ViewChild('displayFieldContainer') container:ElementRef;\n\n constructor(private injector:Injector,\n private displayFieldService:DisplayFieldService,\n private schemaCache:SchemaCacheService) {\n }\n\n ngOnInit():void {\n void this.schemaCache\n .ensureLoaded(this.resource)\n .then((schema) => {\n this.render(schema[this.fieldName]);\n });\n }\n\n render(fieldSchema:IFieldSchema):void {\n const field = this.getDisplayFieldInstance(fieldSchema);\n field.apply(this.resource, fieldSchema);\n\n const container = this.container.nativeElement;\n container.hidden = false;\n\n // Default the field to a placeholder when rendering\n if (field.isEmpty()) {\n container.textContent = '-';\n } else {\n field.render(container, field.valueString);\n }\n }\n\n private getDisplayFieldInstance(fieldSchema:IFieldSchema) {\n if (this.displayClass) {\n // eslint-disable-next-line new-cap\n const instance = new this.displayClass(this.fieldName, this.displayFieldContext);\n instance.apply(this.resource, fieldSchema);\n return instance;\n }\n\n return this.displayFieldService.getField(\n this.resource,\n this.fieldName,\n fieldSchema,\n this.displayFieldContext,\n );\n }\n\n private get displayFieldContext() {\n return { injector: this.injector, container: this.containerType, options: this.displayFieldOptions };\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Field, IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { DisplayFieldContext } from 'core-app/shared/components/fields/display/display-field.service';\nimport { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport const cssClassCustomOption = 'custom-option';\n\nexport class DisplayField extends Field {\n public static type:string;\n\n public mode:string | null = null;\n\n public activeChange:ResourceChangeset|null = null;\n\n @InjectField() I18n!:I18nService;\n\n constructor(public name:string, public context:DisplayFieldContext) {\n super();\n }\n\n /**\n * Apply the display field to the given resource and schema\n * @param resource\n * @param schema\n */\n public apply(resource:T, schema:IFieldSchema) {\n this.resource = resource;\n this.schema = schema;\n }\n\n public texts = {\n empty: this.I18n.t('js.label_no_value'),\n placeholder: this.I18n.t('js.placeholders.default'),\n };\n\n public get isFormattable():boolean {\n return false;\n }\n\n /**\n * Return the provided local injector,\n * which is relevant to provide the display field\n * the current space context.\n */\n public get injector() {\n return this.context.injector;\n }\n\n public get value() {\n if (!this.schema) {\n return null;\n }\n\n if (this.activeChange) {\n return this.activeChange.projectedResource[this.name];\n }\n return this.attribute;\n }\n\n protected get attribute() {\n return this.resource[this.name];\n }\n\n public get type():string {\n return (this.constructor as typeof DisplayField).type;\n }\n\n public get valueString():string {\n return this.value;\n }\n\n public get placeholder():string {\n return '-';\n }\n\n public get label() {\n return (this.schema.name || this.name);\n }\n\n public get title():string|null {\n // Don't return a value for long text fields,\n // since they shouldn't / won't be truncated.\n if (this.isFormattable) {\n return null;\n }\n\n return this.valueString;\n }\n\n public render(element:HTMLElement, displayText:string, options:any = {}):void {\n element.textContent = displayText;\n }\n\n /**\n * Render an empty placeholder if no values are present\n */\n public renderEmpty(element:HTMLElement) {\n const emptyDiv = document.createElement('div');\n emptyDiv.setAttribute('title', this.texts.empty);\n emptyDiv.textContent = this.texts.placeholder;\n emptyDiv.classList.add(cssClassCustomOption, '-empty');\n\n element.appendChild(emptyDiv);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { cssClassCustomOption } from 'core-app/shared/components/fields/display/display-field.module';\nimport { ResourcesDisplayField } from './resources-display-field.module';\n\nexport class MultipleLinesCustomOptionsDisplayField extends ResourcesDisplayField {\n public render(element:HTMLElement, displayText:string):void {\n const values = this.value;\n element.setAttribute('title', displayText);\n element.textContent = displayText;\n\n element.innerHTML = '';\n\n if (values.length === 0) {\n this.renderEmpty(element);\n } else {\n this.renderValues(values, element);\n }\n }\n\n protected renderValues(values:string[], element:HTMLElement) {\n values.forEach((value) => {\n const div = document.createElement('div');\n div.classList.add(cssClassCustomOption, '-multiple-lines');\n div.setAttribute('title', value);\n div.textContent = value;\n\n element.appendChild(div);\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { PrincipalRendererService } from 'core-app/shared/components/principal/principal-renderer.service';\nimport { ResourcesDisplayField } from './resources-display-field.module';\n\nexport class MultipleLinesUserFieldModule extends ResourcesDisplayField {\n @InjectField() principalRenderer:PrincipalRendererService;\n\n public render(element:HTMLElement, displayText:string):void {\n const values = this.attribute;\n element.setAttribute('title', displayText);\n element.textContent = displayText;\n\n element.innerHTML = '';\n\n if (values.length === 0) {\n this.renderEmpty(element);\n } else {\n this.renderValues(values, element);\n }\n }\n\n protected renderValues(values:UserResource[], element:HTMLElement) {\n this.principalRenderer.renderMultiple(\n element,\n values,\n { hide: false, link: false },\n { hide: false, size: 'medium' },\n 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 { ProgressDisplayField } from './progress-display-field.module';\n\nexport class ProgressTextDisplayField extends ProgressDisplayField {\n public render(element:HTMLElement, displayText:string):void {\n const label = this.percentLabel;\n element.setAttribute('title', label);\n element.innerHTML = '';\n element.textContent = label;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { AbstractFieldService, IFieldType } from 'core-app/shared/components/fields/field.service';\nimport { DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { MultipleLinesCustomOptionsDisplayField } from 'core-app/shared/components/fields/display/field-types/multiple-lines-custom-options-display-field.module';\nimport { MultipleLinesUserFieldModule } from 'core-app/shared/components/fields/display/field-types/multiple-lines-user-display-field.module';\nimport { ProgressTextDisplayField } from 'core-app/shared/components/fields/display/field-types/progress-text-display-field.module';\nimport { DateDisplayField } from 'core-app/shared/components/fields/display/field-types/date-display-field.module';\n\nexport interface IDisplayFieldType extends IFieldType {\n new(resource:HalResource, attributeType:string, schema:IFieldSchema, context:DisplayFieldContext):DisplayField;\n}\n\nexport interface DisplayFieldContext {\n /** The injector to use for the context of this field. Relevant for embedded service injection */\n injector:Injector;\n\n /** Where will the field be rendered? This may result in different styles (Multi select field, e.g.,) */\n container:'table'|'single-view'|'timeline';\n\n /** Options passed to the display field */\n options:{ [key:string]:any };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class DisplayFieldService extends AbstractFieldService {\n /**\n * Create an instance of the field type T given the required arguments\n * with either in descending order:\n *\n * 1. The registered field name (most specific)\n * 2. The registered field for the schema attribute type\n * 3. The default field type\n *\n * @param resource\n * @param {string} fieldName\n * @param {IFieldSchema} schema\n * @param {string} context\n * @returns {T}\n */\n public getField(resource:HalResource, fieldName:string, schema:IFieldSchema, context:DisplayFieldContext):DisplayField {\n // We handle multi value fields differently in the single view context\n const instance = this.getFieldForContext(resource, fieldName, schema, context);\n instance.apply(resource, schema);\n return instance;\n }\n\n private getFieldForContext(resource:HalResource, fieldName:string, schema:IFieldSchema, context:DisplayFieldContext):DisplayField {\n // We handle multi value fields differently in the single view context\n const isCustomMultiLinesField = ['[]CustomOption'].indexOf(schema.type) >= 0;\n if (context.container === 'single-view' && isCustomMultiLinesField) {\n return new MultipleLinesCustomOptionsDisplayField(fieldName, context) as DisplayField;\n }\n // Separate class seems not needed (merge with []CustomOption above?)\n const isVersionMultiLinesField = ['[]Version'].indexOf(schema.type) >= 0;\n if (context.container === 'single-view' && isVersionMultiLinesField) {\n return new MultipleLinesCustomOptionsDisplayField(fieldName, context) as DisplayField;\n }\n const isUserMultiLinesField = ['[]User'].indexOf(schema.type) >= 0;\n if (context.container === 'single-view' && isUserMultiLinesField) {\n return new MultipleLinesUserFieldModule(fieldName, context) as DisplayField;\n }\n\n // We handle progress differently in the timeline\n if (context.container === 'timeline' && fieldName === 'percentageDone') {\n return new ProgressTextDisplayField(fieldName, context);\n }\n\n // We want to render an combined edit field but the display field must\n // show the original attribute\n if (context.container === 'table' && ['startDate', 'dueDate', 'date'].includes(fieldName)) {\n return new DateDisplayField(fieldName, context);\n }\n\n const cls = this.getSpecificClassFor(resource._type, fieldName, schema.type);\n\n // eslint-disable-next-line new-cap\n return new cls(fieldName, context) as DisplayField;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { DateDisplayField } from 'core-app/shared/components/fields/display/field-types/date-display-field.module';\n\nexport class CombinedDateDisplayField extends DateDisplayField {\n text = {\n placeholder: {\n startDate: this.I18n.t('js.label_no_start_date'),\n dueDate: this.I18n.t('js.label_no_due_date'),\n },\n };\n\n public render(element:HTMLElement, displayText:string):void {\n element.innerHTML = '';\n\n const startDateElement = this.createDateDisplayField('startDate');\n const dueDateElement = this.createDateDisplayField('dueDate');\n\n const separator = document.createElement('span');\n separator.textContent = ' - ';\n\n element.appendChild(startDateElement);\n element.appendChild(separator);\n element.appendChild(dueDateElement);\n }\n\n private createDateDisplayField(date:'dueDate'|'startDate'):HTMLElement {\n const dateElement = document.createElement('span');\n const dateDisplayField = new DateDisplayField(date, this.context);\n const text = this.resource[date]\n ? this.timezoneService.formattedDate(this.resource[date])\n : this.text.placeholder[date];\n\n dateDisplayField.apply(this.resource, this.schema);\n dateDisplayField.render(dateElement, text);\n\n return dateElement;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\nimport { HighlightableDisplayField } from 'core-app/shared/components/fields/display/field-types/highlightable-display-field.module';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\n\nexport class DateDisplayField extends HighlightableDisplayField {\n @InjectField() timezoneService:TimezoneService;\n\n @InjectField() apiV3Service:ApiV3Service;\n\n public render(element:HTMLElement, displayText:string):void {\n super.render(element, displayText);\n\n // Show scheduling mode in front of the start date field\n if (this.showSchedulingMode()) {\n const schedulingIcon = document.createElement('span');\n schedulingIcon.classList.add('icon-context');\n\n if (this.resource.scheduleManually) {\n schedulingIcon.classList.add('icon-pin');\n }\n\n element.prepend(schedulingIcon);\n }\n\n // Highlight overdue tasks\n if (this.shouldHighlight && this.canOverdue && !!this.resource.status) {\n const diff = this.timezoneService.daysFromToday(this.value);\n\n this\n .apiV3Service\n .statuses\n .id(this.resource.status.id)\n .get()\n .subscribe((status) => {\n if (!status.isClosed) {\n element.classList.add(Highlighting.overdueDate(diff));\n }\n });\n }\n }\n\n public get canOverdue():boolean {\n return ['dueDate', 'date'].indexOf(this.name) !== -1;\n }\n\n public get valueString() {\n if (this.value) {\n return this.timezoneService.formattedDate(this.value);\n }\n return '';\n }\n\n private showSchedulingMode():boolean {\n return this.name === 'startDate' || this.name === '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 { DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\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';\n\nexport class HighlightableDisplayField extends DisplayField {\n /** Optionally test if we can inject highlighting service */\n @InjectField(WorkPackageViewHighlightingService, null) viewHighlighting:WorkPackageViewHighlightingService;\n\n // DisplayFieldRenderer.attributeName returns the 'date' name for the\n // 'dueDate' field because it is its schema.mappedName (that allows to display\n // the correct input type). In the query.highlightedAttributes (used to decide\n // if a field is highlighted) the attribute has the name 'dueDate', so we need\n // to return the original name to get it highlighted.\n get highlightName() {\n if (this.name === 'date') {\n return 'dueDate';\n }\n return this.name;\n }\n\n public get shouldHighlight() {\n if (this.context.options.colorize === false) {\n return false;\n }\n\n const shouldHighlight = !!this.viewHighlighting && this.viewHighlighting.shouldHighlightInline(this.highlightName);\n\n return this.context.container !== 'table' || shouldHighlight;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\n\nexport class ProgressDisplayField extends DisplayField {\n public get value() {\n if (this.schema) {\n return this.resource[this.name] || 0;\n }\n return null;\n }\n\n public get percentLabel() {\n return `${this.roundedProgress}%`;\n }\n\n public get roundedProgress() {\n return Math.round(Number(this.value)) || 0;\n }\n\n public render(element:HTMLElement, displayText:string):void {\n element.setAttribute('title', displayText);\n element.innerHTML = `\n \n \n \n \n \n ${this.percentLabel}\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 { cssClassCustomOption, DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\n\nexport class ResourcesDisplayField extends DisplayField {\n public isEmpty():boolean {\n return _.isEmpty(this.value);\n }\n\n public get value() {\n const cf = this.resource[this.name];\n if (this.schema && cf) {\n if (cf.elements) {\n return cf.elements.map((e:any) => e.name);\n } if (cf.map) {\n return cf.map((e:any) => e.name);\n } if (cf.name) {\n return [cf.name];\n }\n return [`error: ${JSON.stringify(cf)}`];\n }\n\n return [];\n }\n\n public render(element:HTMLElement, displayText:string):void {\n const values = this.value;\n element.innerHTML = '';\n element.setAttribute('title', values.join(', '));\n\n if (values.length === 0) {\n this.renderEmpty(element);\n } else {\n this.renderValues(values, element);\n }\n }\n\n /**\n * Renders at most the first two values, followed by a badge indicating\n * the total count.\n */\n protected renderValues(values:any[], element:HTMLElement) {\n const content = document.createDocumentFragment();\n const abridged = this.optionDiv(this.valueAbridged(values));\n\n content.appendChild(abridged);\n\n if (values.length > 2) {\n const badge = this.optionDiv(values.length.toString(), 'badge', '-secondary');\n content.appendChild(badge);\n }\n\n element.appendChild(content);\n }\n\n /**\n * Build .custom-option div/span nodes with the given text\n */\n protected optionDiv(text:string, ...classes:string[]) {\n const div = document.createElement('div');\n const span = document.createElement('span');\n div.classList.add(cssClassCustomOption);\n span.classList.add(...classes);\n span.textContent = text;\n\n div.appendChild(span);\n\n return div;\n }\n\n /**\n * Return the first two joined values, if any.\n */\n protected valueAbridged(values:any[]) {\n const valueForDisplay = _.take(values, 2);\n\n if (values.length > 2) {\n valueForDisplay.push('... ');\n }\n\n return valueForDisplay.join(', ');\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 ElementRef,\n Inject,\n InjectionToken,\n Injector,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { Field, IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport const OpEditingPortalSchemaToken = new InjectionToken('editing-portal--schema');\nexport const OpEditingPortalHandlerToken = new InjectionToken('editing-portal--handler');\nexport const OpEditingPortalChangesetToken = new InjectionToken('editing-portal--changeset');\n\nexport const overflowingContainerSelector = '.__overflowing_element_container';\nexport const overflowingContainerAttribute = 'overflowingIdentifier';\n\nexport const editModeClassName = '-editing';\n\n@Directive()\nexport abstract class EditFieldComponent extends Field implements OnInit, OnDestroy {\n /** Self reference */\n public self = this;\n\n /** JQuery accessor to element ref */\n protected $element:JQuery;\n\n constructor(\n readonly I18n:I18nService,\n readonly elementRef:ElementRef,\n @Inject(OpEditingPortalChangesetToken) protected change:ResourceChangeset,\n @Inject(OpEditingPortalSchemaToken) public schema:IFieldSchema,\n @Inject(OpEditingPortalHandlerToken) readonly handler:EditFieldHandler,\n readonly cdRef:ChangeDetectorRef,\n readonly injector:Injector,\n ) {\n super();\n\n this.updateFromChangeset(change);\n }\n\n ngOnInit():void {\n this.$element = jQuery(this.elementRef.nativeElement as HTMLElement);\n this.initialize();\n\n if (this.change.state) {\n this.change.state\n .values$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((change) => {\n const fieldSchema = change.schema.ofProperty(this.name);\n\n if (!fieldSchema) {\n return this.handler.deactivate(false);\n }\n\n this.updateFromChangeset(change);\n this.initialize();\n this.cdRef.markForCheck();\n });\n }\n }\n\n public get overflowingSelector() {\n if (this.$element) {\n return this.$element\n .closest(overflowingContainerSelector)\n .data(overflowingContainerAttribute);\n }\n return null;\n }\n\n public get inFlight() {\n return this.handler.inFlight;\n }\n\n public get value() {\n return this.resource[this.name];\n }\n\n public set value(value:any) {\n this.resource[this.name] = this.parseValue(value);\n }\n\n public get placeholder() {\n if (this.name === 'subject') {\n return this.I18n.t('js.placeholders.subject');\n }\n\n return '';\n }\n\n /**\n * Initialize the field after constructor was called.\n */\n protected initialize() {\n }\n\n /**\n * Update resource and properties from changeset\n */\n private updateFromChangeset(change:ResourceChangeset) {\n this.change = change;\n this.resource = this.change.projectedResource;\n this.schema = this.change.schema.ofProperty(this.handler.fieldName) || this.schema;\n\n // Get the mapped schema name, as this is not always the attribute\n // e.g., startDate in table for milestone => date attribute\n this.name = this.change.schema.mappedName(this.handler.fieldName);\n }\n\n /**\n * Parse the value from the model for setting\n */\n protected parseValue(val:any) {\n return 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 { AbstractFieldService, IFieldType } from 'core-app/shared/components/fields/field.service';\nimport { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-field.component';\n\nexport interface IEditFieldType extends IFieldType {\n new():EditFieldComponent;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class EditFieldService extends AbstractFieldService {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\n\n@Injectable()\nexport class 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 // By default, don't allow any transitions to continue\n return true;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { EditFormComponent } from 'core-app/shared/components/fields/edit/edit-form/edit-form.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GlobalEditFormChangesTrackerService {\n private activeForms = new Map();\n\n get thereAreFormsWithUnsavedChanges() {\n return Array.from(this.activeForms.keys()).some((form) => !form.change.isEmpty());\n }\n\n constructor(\n private i18nService:I18nService,\n ) {\n // Global beforeunload hook to show a data loss warn\n // when the user clicks on a link out of the Angular app\n window.addEventListener('beforeunload', (event) => {\n if (this.thereAreFormsWithUnsavedChanges) {\n event.preventDefault();\n event.returnValue = this.i18nService.t('js.work_packages.confirm_edit_cancel');\n }\n });\n }\n\n public addToActiveForms(form:EditFormComponent) {\n this.activeForms.set(form, true);\n }\n\n public removeFromActiveForms(form:EditFormComponent) {\n this.activeForms.delete(form);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 EventEmitter,\n Injector,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n} from '@angular/core';\nimport { StateService, Transition, TransitionService } from '@uirouter/core';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { EditableAttributeFieldComponent } from 'core-app/shared/components/fields/edit/field/editable-attribute-field.component';\nimport { input } from '@openproject/reactivestates';\nimport { filter, map, take } from 'rxjs/operators';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n activeFieldClassName,\n activeFieldContainerClassName,\n EditForm,\n} from 'core-app/shared/components/fields/edit/edit-form/edit-form';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport { EditingPortalService } from 'core-app/shared/components/fields/edit/editing-portal/editing-portal-service';\nimport { EditFormRoutingService } from 'core-app/shared/components/fields/edit/edit-form/edit-form-routing.service';\nimport { ResourceChangesetCommit } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { GlobalEditFormChangesTrackerService } from 'core-app/shared/components/fields/edit/services/global-edit-form-changes-tracker/global-edit-form-changes-tracker.service';\nimport { firstValueFrom } from 'rxjs';\n\n@Component({\n selector: 'edit-form,[edit-form]',\n template: '',\n})\nexport class EditFormComponent extends EditForm implements OnInit, OnDestroy {\n @Input('resource') resource:HalResource;\n\n @Input('inEditMode') initializeEditMode = false;\n\n @Input('skippedFields') skippedFields:string[] = [];\n\n @Output('onSaved') onSavedEmitter = new EventEmitter<{ savedResource:HalResource, isInitial:boolean }>();\n\n public fields:{ [attribute:string]:EditableAttributeFieldComponent } = {};\n\n private registeredFields = input();\n\n private unregisterListener:Function;\n\n constructor(public readonly injector:Injector,\n protected readonly elementRef:ElementRef,\n protected readonly $transitions:TransitionService,\n protected readonly ConfigurationService:ConfigurationService,\n protected readonly editingPortalService:EditingPortalService,\n protected readonly $state:StateService,\n protected readonly I18n:I18nService,\n @Optional() protected readonly editFormRouting:EditFormRoutingService,\n private globalEditFormChangesTrackerService:GlobalEditFormChangesTrackerService) {\n super(injector);\n\n const confirmText = I18n.t('js.work_packages.confirm_edit_cancel');\n const requiresConfirmation = ConfigurationService.warnOnLeavingUnsaved();\n\n this.unregisterListener = $transitions.onBefore({}, (transition:Transition) => {\n if (!this.editing) {\n return undefined;\n }\n\n // Show confirmation message when transitioning to a new state\n // that's not within the edit mode.\n if (!this.editFormRouting || this.editFormRouting.blockedTransition(transition)) {\n if (requiresConfirmation && !window.confirm(confirmText)) {\n return false;\n }\n\n this.cancel(false);\n }\n\n return true;\n });\n }\n\n ngOnInit() {\n this.editMode = this.initializeEditMode;\n this.globalEditFormChangesTrackerService.addToActiveForms(this);\n\n if (this.initializeEditMode) {\n this.start();\n }\n }\n\n ngOnDestroy() {\n this.unregisterListener();\n this.globalEditFormChangesTrackerService.removeFromActiveForms(this);\n }\n\n public async activateField(form:EditForm, schema:IFieldSchema, fieldName:string, errors:string[]):Promise {\n return this.waitForField(fieldName).then((ctrl) => {\n ctrl.setActive(true);\n const container = ctrl.editContainer.nativeElement;\n return this.editingPortalService.create(\n container,\n this.injector,\n form,\n schema,\n fieldName,\n errors,\n );\n });\n }\n\n public async reset(fieldName:string, focus = false) {\n const ctrl = await this.waitForField(fieldName);\n ctrl.reset();\n ctrl.deactivate(focus);\n }\n\n public onSaved(commit:ResourceChangesetCommit) {\n this.cancel(false);\n this.onSavedEmitter.emit({ savedResource: commit.resource, isInitial: commit.wasNew });\n }\n\n public cancel(reset = false) {\n this.editMode = false;\n this.closeEditFields('all', reset);\n\n if (reset) {\n this.halEditing.reset(this.change);\n }\n }\n\n public requireVisible(fieldName:string):Promise {\n return new Promise((resolve, _) => {\n const interval = setInterval(() => {\n const field = this.fields[fieldName];\n\n if (field !== undefined) {\n clearInterval(interval);\n resolve();\n }\n }, 50);\n });\n }\n\n public get editing():boolean {\n return this.editMode || this.hasActiveFields();\n }\n\n public register(field:EditableAttributeFieldComponent) {\n this.fields[field.fieldName] = field;\n this.registeredFields.putValue(_.keys(this.fields));\n\n const shouldActivate = (this.editMode && !this.skipField(field) || this.activeFields[field.fieldName]);\n\n if (shouldActivate) {\n field.activateOnForm(true);\n }\n }\n\n public waitForField(name:string):Promise {\n return firstValueFrom(this.registeredFields\n .values$()\n .pipe(\n filter((keys) => keys.indexOf(name) >= 0),\n take(1),\n map(() => this.fields[name]),\n ));\n }\n\n public start() {\n _.each(this.fields, (ctrl) => this.activate(ctrl.fieldName));\n }\n\n protected focusOnFirstError():void {\n // Focus the first field that is erroneous\n jQuery(this.elementRef.nativeElement)\n .find(`.${activeFieldContainerClassName}.-error .${activeFieldClassName}`)\n .first()\n .trigger('focus');\n }\n\n private skipField(field:EditableAttributeFieldComponent) {\n const { fieldName } = field;\n\n const isSkipField = this.skippedFields.indexOf(fieldName) !== -1;\n\n // Only skip status or type\n if (!isSkipField) {\n return false;\n }\n\n // Only skip if value present and not changed in changeset\n const hasDefault = this.resource[fieldName];\n const changed = this.change.changes[fieldName];\n\n return hasDefault && !changed;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport {\n HalResourceEditingService,\n ResourceChangesetCommit,\n} from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { ErrorResource } from 'core-app/features/hal/resources/error-resource';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { HalError } from 'core-app/features/hal/services/hal-error';\n\nexport const activeFieldContainerClassName = 'inline-edit--active-field';\nexport const activeFieldClassName = 'inline-edit--field';\n\nexport abstract class EditForm {\n // Injections\n @InjectField() states:States;\n\n @InjectField() halEditing:HalResourceEditingService;\n\n @InjectField() halNotification:HalResourceNotificationService;\n\n @InjectField() halEvents:HalEventsService;\n\n // All current active (open) edit fields\n public activeFields:{ [fieldName:string]:EditFieldHandler } = {};\n\n // Errors of the last operation (required when adding opening fields afterwards)\n public errorsPerAttribute:{ [fieldName:string]:string[] } = {};\n\n // Reference to the changeset used in this form\n public resource:T;\n\n // Whether this form exists in edit mode\n public editMode = false;\n\n protected constructor(public injector:Injector) {\n }\n\n /**\n * Activate the field, returning the element and associated field handler\n */\n protected abstract activateField(form:EditForm, schema:IFieldSchema, fieldName:string, errors:string[]):Promise;\n\n /**\n * Show this required field. E.g., add the necessary column\n */\n protected abstract requireVisible(fieldName:string):Promise;\n\n /**\n * Reset the field and re-render the current resource's value\n */\n abstract reset(fieldName:string, focus?:boolean):void;\n\n /**\n * Optional callback when the form is being saved\n */\n protected onSaved(commit:ResourceChangesetCommit):void {\n // Does nothing by default\n }\n\n protected abstract focusOnFirstError():void;\n\n /**\n * Return whether this form has any active fields\n */\n public hasActiveFields():boolean {\n return !_.isEmpty(this.activeFields);\n }\n\n /**\n * Return the current or a new change object for the given resource.\n * This will always return a valid (potentially empty) change.\n *\n * @return {ResourceChangeset}\n */\n public get change():ResourceChangeset {\n return this.halEditing.changeFor(this.resource);\n }\n\n /**\n * Active the edit field upon user's request.\n * @param fieldName\n * @param noWarnings Ignore warnings if the field cannot be opened\n */\n public activate(fieldName:string, noWarnings = false):Promise {\n return this.loadFieldSchema(fieldName, noWarnings)\n .then((schema:IFieldSchema) => {\n if (!schema.writable && !noWarnings) {\n this.halNotification.showEditingBlockedError(schema.name || fieldName);\n return Promise.reject();\n }\n\n return this.renderField(fieldName, schema);\n });\n }\n\n /**\n * Activate the field unless it is marked active already\n * (e.g., already being activated).\n */\n public activateWhenNeeded(fieldName:string):Promise {\n const activeField = this.activeFields[fieldName];\n if (activeField) {\n return Promise.resolve();\n }\n\n return this.requireVisible(fieldName).then(() => this.activate(fieldName, true));\n }\n\n /**\n * Activate all fields that are returned in validation errors\n */\n public activateMissingFields() {\n this.change.getForm().then((form:any) => {\n _.each(form.validationErrors, (val:any, key:string) => {\n if (key === 'id') {\n return;\n }\n this.activateWhenNeeded(key);\n });\n });\n }\n\n /**\n * Save the active changeset.\n * @return {any}\n */\n public async submit():Promise {\n if (this.change.isEmpty() && !isNewResource(this.resource)) {\n this.closeEditFields();\n return Promise.resolve(this.resource);\n }\n\n // Mark changeset as in flight\n this.change.inFlight = true;\n\n // Reset old error notifications\n this.errorsPerAttribute = {};\n\n // Notify all fields of upcoming save\n const openFields = _.keys(this.activeFields);\n\n // Call onSubmit handlers\n await Promise.all(_.map(this.activeFields, (handler:EditFieldHandler) => handler.onSubmit()));\n\n return new Promise((resolve, reject) => {\n this.halEditing.save>(this.change)\n .then((result) => {\n // Close all current fields\n this.closeEditFields(openFields);\n\n resolve(result.resource);\n\n this.halNotification.showSave(result.resource, result.wasNew);\n this.editMode = false;\n this.onSaved(result);\n this.change.inFlight = false;\n })\n .catch((error:ErrorResource|unknown) => {\n this.halNotification.handleRawError(error, this.resource);\n\n if (error instanceof HalError && error.resource) {\n this.handleSubmissionErrors(error.resource);\n reject();\n }\n\n this.change.inFlight = false;\n\n return Promise.reject(error);\n });\n });\n }\n\n /**\n * Close the given or all open fields.\n *\n * @param {string[]} fields\n * @param resetChange whether to undo any changes made\n */\n public closeEditFields(fields:string[]|'all' = 'all', resetChange = true) {\n if (fields === 'all') {\n fields = _.keys(this.activeFields);\n }\n\n fields.forEach((name:string) => {\n const handler = this.activeFields[name];\n handler && handler.deactivate(false);\n\n if (resetChange) {\n this.change.reset(name);\n }\n });\n }\n\n protected handleSubmissionErrors(error:ErrorResource):void {\n // Process single API errors\n this.handleErroneousAttributes(error);\n }\n\n protected handleErroneousAttributes(error:ErrorResource):void {\n // Get attributes with errors\n const erroneousAttributes = error.getInvolvedAttributes();\n\n // Save erroneous fields for when new fields appear\n this.errorsPerAttribute = error.getMessagesPerAttribute();\n if (erroneousAttributes.length === 0) {\n return;\n }\n\n this.setErrorsForFields(erroneousAttributes);\n }\n\n private setErrorsForFields(erroneousFields:string[]) {\n // Accumulate errors for the given response\n const promises:Promise[] = erroneousFields.map((fieldName:string) => this.requireVisible(fieldName).then(() => {\n if (this.activeFields[fieldName]) {\n this.activeFields[fieldName].setErrors(this.errorsPerAttribute[fieldName] || []);\n }\n\n return this.activateWhenNeeded(fieldName) as any;\n }));\n\n Promise.all(promises)\n .then(() => {\n setTimeout(() => this.focusOnFirstError());\n })\n .catch(() => {\n console.error('Failed to activate all erroneous fields.');\n });\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 return new Promise((resolve, reject) => {\n this.loadFormAndCheck(fieldName, noWarnings);\n const fieldSchema:IFieldSchema = this.change.schema.ofProperty(fieldName);\n\n if (!fieldSchema) {\n throw new Error();\n }\n\n resolve(fieldSchema);\n });\n }\n\n /**\n * Ensure the form gets loaded and we show an error when the field cannot be opened\n * @param fieldName\n * @param noWarnings\n */\n private loadFormAndCheck(fieldName:string, noWarnings = false) {\n // Ensure the form is being loaded if necessary\n this.change\n .getForm()\n .then(() => {\n // Look up whether we're actually editable\n const fieldSchema = this.change.schema.ofProperty(fieldName);\n if (!fieldSchema.writable && !noWarnings) {\n this.halNotification.showEditingBlockedError(fieldSchema.name || fieldName);\n this.closeEditFields([fieldName]);\n }\n })\n .catch((error:any) => {\n console.error('Failed to build edit field: %o', error);\n this.halNotification.handleRawError(error, this.resource);\n this.closeEditFields([fieldName]);\n });\n }\n\n private renderField(fieldName:string, schema:IFieldSchema):Promise {\n const promise:Promise = this.activateField(this,\n schema,\n fieldName,\n this.errorsPerAttribute[fieldName] || []);\n\n return promise\n .then((fieldHandler:EditFieldHandler) => {\n this.activeFields[fieldName] = fieldHandler;\n return fieldHandler;\n })\n .catch((error) => {\n console.error(`Failed to render edit field:${error}`);\n this.halNotification.handleRawError(error);\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Subject } from 'rxjs';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\nexport abstract class EditFieldHandler extends UntilDestroyedMixin {\n /**\n * Whether the handler belongs to a larger edit mode form\n * e.g., WP-create\n */\n abstract get inEditMode():boolean;\n\n /** Whether the field is being saved */\n abstract get inFlight():boolean;\n\n /**\n * Return a unique ID for this edit field\n */\n htmlId:string;\n\n /**\n * The name of the attribute\n */\n fieldName:string;\n\n /**\n * Activation handler firing upon user requesting activation.\n */\n $onUserActivate:Subject;\n\n /**\n * Accessibility label for the field\n */\n fieldLabel:string;\n\n /**\n * Error messages on the field, if any.\n */\n public errorMessageOnLabel():string|undefined {\n return undefined;\n }\n\n /**\n * On destroy observable\n */\n public onDestroy = new Subject();\n\n // OnSubmit callbacks that may register from fields\n protected _onSubmitHandlers:Array<() => Promise> = [];\n\n // OnPreSubmit callbacks that may register from fields\n protected _onBeforeSubmitHandlers:Array<() => void> = [];\n\n /**\n * Call field submission callback handlers\n */\n public onSubmit():Promise {\n return Promise.all(this._onSubmitHandlers.map((cb) => cb()));\n }\n\n public registerOnSubmit(callback:() => Promise) {\n this._onSubmitHandlers.push(callback);\n }\n\n /**\n * Call field before-submission callback handlers\n */\n public onBeforeSubmit():any {\n return this._onBeforeSubmitHandlers.map((cb) => cb());\n }\n\n public registerOnBeforeSubmit(callback:() => void) {\n this._onBeforeSubmitHandlers.push(callback);\n }\n\n /**\n * Stop event propagation\n */\n public abstract stopPropagation(evt:JQuery.TriggeredEvent):boolean;\n\n /**\n * Focus on the active field.\n * Optionally, try to set the click position to the given offset if the field is an input element.\n */\n public abstract focus(setClickOffset?:number):void;\n\n /**\n * Handle a user submitting the field (e.g, ng-change)\n */\n public abstract handleUserSubmit():Promise;\n\n /**\n * Handle users pressing enter inside an edit mode.\n * Outside an edit mode, the regular save event is captured by handleUserSubmit (submit event).\n * In an edit mode, we can't derive from a submit event whether the user pressed enter\n * (and on what field he did that).\n */\n public abstract handleUserKeydown(event:JQuery.TriggeredEvent, onlyCancel?:boolean):void;\n\n /**\n * Cancel edit\n */\n public abstract handleUserCancel():void;\n\n /**\n * Cancel any pending changes\n */\n public abstract reset():void;\n\n /**\n * Close the field, resetting it with its display value.\n */\n public abstract deactivate(focus:boolean):void;\n\n /**\n * Returns whether the field has been changed\n */\n public abstract isChanged():boolean;\n\n /**\n * Handle focus loss\n */\n public abstract onFocusOut():void;\n\n public abstract setErrors(newErrors:string[]):void;\n\n public previewContext(resource:HalResource):string|undefined {\n return undefined;\n }\n}\n","
\n
\n\n \n \n
\n
\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n Injector,\n Input,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport {\n OpEditingPortalChangesetToken,\n OpEditingPortalHandlerToken,\n OpEditingPortalSchemaToken,\n} from 'core-app/shared/components/fields/edit/edit-field.component';\nimport { createLocalInjector } from 'core-app/shared/components/fields/edit/editing-portal/edit-form-portal.injector';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { EditFieldService, IEditFieldType } from 'core-app/shared/components/fields/edit/edit-field.service';\nimport { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\n\n@Component({\n selector: 'edit-form-portal',\n templateUrl: './edit-form-portal.component.html',\n})\nexport class EditFormPortalComponent implements OnInit, OnDestroy, AfterViewInit {\n @Input() schemaInput:IFieldSchema;\n\n @Input() changeInput:ResourceChangeset;\n\n @Input() editFieldHandler:EditFieldHandler;\n\n @Output() public onEditFieldReady = new EventEmitter();\n\n public handler:EditFieldHandler;\n\n public schema:IFieldSchema;\n\n public change:ResourceChangeset;\n\n public fieldInjector:Injector;\n\n public componentClass:IEditFieldType;\n\n public htmlId:string;\n\n public label:string;\n\n constructor(\n readonly injector:Injector,\n readonly editField:EditFieldService,\n readonly elementRef:ElementRef,\n ) { }\n\n ngOnInit() {\n if (this.editFieldHandler && this.schemaInput) {\n this.handler = this.editFieldHandler;\n this.schema = this.schemaInput;\n this.change = this.changeInput;\n } else {\n this.handler = this.injector.get(OpEditingPortalHandlerToken);\n this.schema = this.injector.get(OpEditingPortalSchemaToken);\n this.change = this.injector.get(OpEditingPortalChangesetToken);\n }\n\n this.componentClass = this.editField.getSpecificClassFor(this.change.pristineResource._type, this.handler.fieldName, this.schema.type);\n this.fieldInjector = createLocalInjector(this.injector, this.change, this.handler, this.schema);\n }\n\n ngOnDestroy() {\n this.onEditFieldReady.complete();\n }\n\n ngAfterViewInit() {\n // Fire in a timeout to avoid same execution context in AfterViewInit\n setTimeout(() => {\n this.onEditFieldReady.emit();\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport {\n OpEditingPortalChangesetToken,\n OpEditingPortalHandlerToken,\n OpEditingPortalSchemaToken,\n} from 'core-app/shared/components/fields/edit/edit-field.component';\nimport { PortalInjector } from '@angular/cdk/portal';\nimport { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\n\n/**\n * Creates an injector for the edit field portal to pass data into.\n *\n * @returns {PortalInjector}\n */\nexport function createLocalInjector(\n injector:Injector,\n change:ResourceChangeset,\n fieldHandler:EditFieldHandler,\n schema:IFieldSchema,\n):Injector {\n const injectorTokens = new WeakMap();\n\n injectorTokens.set(OpEditingPortalChangesetToken, change);\n injectorTokens.set(OpEditingPortalHandlerToken, fieldHandler);\n injectorTokens.set(OpEditingPortalSchemaToken, schema);\n\n return new PortalInjector(injector, injectorTokens);\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { KeyCodes } from 'core-app/shared/helpers/keyCodes.enum';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { Injector } from '@angular/core';\nimport { FocusHelperService } from 'core-app/shared/directives/focus/focus-helper';\nimport { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport { setPosition } from 'core-app/shared/helpers/set-click-position/set-click-position';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { Subject } from 'rxjs';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { EditForm } from 'core-app/shared/components/fields/edit/edit-form/edit-form';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class HalResourceEditFieldHandler extends EditFieldHandler {\n // Injections\n @InjectField() FocusHelper:FocusHelperService;\n\n @InjectField() ConfigurationService:ConfigurationService;\n\n @InjectField() I18n!:I18nService;\n\n // Subject to fire when user demanded activation\n public $onUserActivate = new Subject();\n\n // Current errors of the field\n public errors:string[];\n\n constructor(\n public injector:Injector,\n public form:EditForm,\n public fieldName:string,\n public schema:IFieldSchema,\n public element:HTMLElement,\n protected pathHelper:PathHelperService,\n protected withErrors?:string[],\n ) {\n super();\n\n if (withErrors !== undefined) {\n this.setErrors(withErrors);\n }\n\n this.htmlId = `wp-${this.resource.id}-inline-edit--field-${this.fieldName}`;\n this.fieldLabel = this.schema.name || this.fieldName;\n }\n\n /**\n * Stop this event from propagating out of the edit field context.\n */\n public stopPropagation(evt:JQuery.TriggeredEvent) {\n evt.stopPropagation();\n return false;\n }\n\n public get inEditMode() {\n return this.form.editMode;\n }\n\n public get inFlight() {\n return this.form.change.inFlight;\n }\n\n public focus(setClickOffset?:number) {\n const target = this.element.querySelector('.inline-edit--field') as HTMLElement;\n\n if (!target) {\n debugLog(`Tried to focus on ${this.fieldName}, but element does not (yet) exist.`);\n return;\n }\n\n // Focus the input\n target.focus();\n\n // Set selection state if input element\n if (setClickOffset && target.tagName === 'INPUT') {\n setPosition(target as HTMLInputElement, setClickOffset);\n }\n }\n\n public async onFocusOut() {\n // In case of inline create or erroneous forms: do not save on focus loss\n // const specialField = this.resource.shouldCloseOnFocusOut(this.fieldName);\n if (this.resource.subject && this.withErrors && this.withErrors.length === 0) {\n await this.handleUserSubmit();\n }\n }\n\n public setErrors(newErrors:string[]) {\n this.errors = newErrors;\n this.element.classList.toggle('-error', this.isErrorenous);\n }\n\n /**\n * Handle a user submitting the field (e.g, ng-change)\n */\n public handleUserSubmit():Promise {\n this.onBeforeSubmit();\n\n if (this.inFlight || this.form.editMode) {\n return Promise.resolve();\n }\n\n return this\n .onSubmit()\n .then(() => this.form.submit())\n .then(() => {\n this.blurActiveField();\n });\n }\n\n /**\n * Handle users pressing enter inside an edit mode.\n * Outside an edit mode, the regular save event is captured by handleUserSubmit (submit event).\n * In an edit mode, we can't derive from a submit event whether the user pressed enter\n * (and on what field he did that).\n */\n public async handleUserKeydown(event:JQuery.TriggeredEvent, onlyCancel = false) {\n // Only handle submission in edit mode\n if (this.inEditMode && !onlyCancel) {\n if (event.which === KeyCodes.ENTER) {\n await this.form.submit();\n return false;\n }\n return true;\n }\n\n // Escape editing when not in edit mode\n if (event.which === KeyCodes.ESCAPE) {\n this.handleUserCancel();\n return false;\n }\n\n // If enter is pressed here, it will continue to handleUserSubmit()\n // due to the form submission event.\n return true;\n }\n\n /**\n * Cancel edit\n */\n public handleUserCancel() {\n this.reset();\n }\n\n /**\n * Cancel any pending changes\n */\n public reset() {\n this.form.change.reset(this.fieldName);\n if (!this.inEditMode) {\n this.deactivate(true);\n }\n }\n\n /**\n * Close the field, resetting it with its display value.\n */\n public deactivate(focus = false) {\n this.blurActiveField();\n delete this.form.activeFields[this.fieldName];\n this.onDestroy.next();\n this.onDestroy.complete();\n this.form.reset(this.fieldName, focus);\n }\n\n /**\n * Safari scrolls around like crazy if you have a focused\n * field that is about to be destroyed. So we blur it beforehand.\n * @private\n */\n public blurActiveField() {\n if (document.activeElement instanceof HTMLElement) {\n document.activeElement.blur();\n }\n }\n\n /**\n * Returns whether the field has any errors set.\n */\n public get isErrorenous():boolean {\n return this.errors.length > 0;\n }\n\n /**\n * Returns whether the field has been changed\n */\n public isChanged():boolean {\n return this.form.change.contains(this.fieldName);\n }\n\n /**\n * Reference the form's resource\n */\n public get resource():HalResource {\n return this.form.resource;\n }\n\n /**\n * Reference the current set project\n */\n public get project() {\n return this.form.change.projectedResource.project;\n }\n\n public errorMessageOnLabel() {\n if (!this.isErrorenous) {\n return '';\n }\n return this.I18n.t(\n 'js.inplace.errors.messages_on_field',\n { messages: this.errors.join(' ') },\n );\n }\n\n public previewContext(resource:HalResource) {\n return resource.previewPath();\n }\n}\n","/**\n * A CDK portal implementation to wrap edit-fields in non-angular contexts.\n */\nimport {\n ApplicationRef, ComponentFactoryResolver, Injectable, Injector,\n} from '@angular/core';\nimport { ComponentPortal, DomPortalOutlet } from '@angular/cdk/portal';\nimport { EditFormPortalComponent } from 'core-app/shared/components/fields/edit/editing-portal/edit-form-portal.component';\nimport { createLocalInjector } from 'core-app/shared/components/fields/edit/editing-portal/edit-form-portal.injector';\nimport { take } from 'rxjs/operators';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { EditForm } from 'core-app/shared/components/fields/edit/edit-form/edit-form';\nimport { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport { HalResourceEditFieldHandler } from 'core-app/shared/components/fields/edit/field-handler/hal-resource-edit-field-handler';\n\n@Injectable({ providedIn: 'root' })\nexport class EditingPortalService {\n constructor(private readonly appRef:ApplicationRef,\n private readonly componentFactoryResolver:ComponentFactoryResolver,\n private readonly pathHelper:PathHelperService) {\n\n }\n\n public create(container:HTMLElement,\n injector:Injector,\n form:EditForm,\n schema:IFieldSchema,\n fieldName:string,\n errors:string[]):Promise {\n // Create the portal outlet\n const outlet = this.createDomOutlet(container, injector);\n\n // Create a field handler for the newly active field\n const fieldHandler = new HalResourceEditFieldHandler(\n injector,\n form,\n fieldName,\n schema,\n container,\n this.pathHelper,\n errors,\n );\n\n fieldHandler\n .onDestroy\n .pipe(take(1))\n // Don't call .dispose() on the outlet, it destroys the DOM element\n .subscribe(() => outlet.detach());\n\n // Create an injector that contains injectable reference to the edit field and handler\n const localInjector = createLocalInjector(injector, form.change, fieldHandler, schema);\n\n // Create a portal for the edit-form/field\n const portal = new ComponentPortal(EditFormPortalComponent, null, localInjector);\n\n // Clear the container\n container.innerHTML = '';\n\n // Attach the portal to the outlet\n const ref = outlet.attachComponentPortal(portal);\n\n // Wait until the content is initialized\n return ref\n .instance\n .onEditFieldReady\n .pipe(\n take(1),\n )\n .toPromise()\n .then(() => fieldHandler);\n }\n\n /**\n * Creates a dom outlet for attaching the portal.\n *\n * @param {HTMLElement} hostElement The element where the portal will be attached into\n * @returns {DomPortalOutlet}\n */\n private createDomOutlet(hostElement:HTMLElement, injector:Injector) {\n return new DomPortalOutlet(\n hostElement,\n this.componentFactoryResolver,\n this.appRef,\n injector,\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-field.component';\n\n@Component({\n selector: 'edit-field-controls',\n templateUrl: './edit-field-controls.component.html',\n})\nexport class EditFieldControlsComponent {\n @Input() public cancelTitle:string;\n\n @Input() public saveTitle:string;\n\n @Input('fieldController') public field:EditFieldComponent;\n\n @Output() public onSave = new EventEmitter();\n\n @Output() public onCancel = new EventEmitter();\n\n public save() {\n this.onSave.emit();\n }\n\n public cancel() {\n this.onCancel.emit();\n }\n}\n","
\n
\n \n \n \n \n \n \n
\n
\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { EditFieldControlsComponent } from 'core-app/shared/components/fields/edit/field-controls/edit-field-controls.component';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\n\n@NgModule({\n declarations: [\n EditFieldControlsComponent,\n ],\n imports: [\n CommonModule,\n OpSharedModule,\n ],\n exports: [\n EditFieldControlsComponent,\n ],\n})\nexport class EditFieldControlsModule { }\n","// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 ViewChild,\n} from '@angular/core';\nimport { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-field.component';\nimport { OpCkeditorComponent } from 'core-app/shared/components/editor/components/ckeditor/op-ckeditor.component';\nimport {\n ICKEditorContext,\n ICKEditorInstance,\n} from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\n@Component({\n templateUrl: './formattable-edit-field.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormattableEditFieldComponent extends EditFieldComponent implements OnInit, OnDestroy {\n public readonly field = this;\n\n // Detect when inner component could not be initialized\n public initializationError = false;\n\n @ViewChild(OpCkeditorComponent, { static: true }) editor:OpCkeditorComponent;\n\n // Values used in template\n public isPreview = false;\n\n public previewHtml = '';\n\n private cancelled = false;\n\n public text:Record = {};\n\n public initialContent:string;\n\n public ckEditorContext:ICKEditorContext = {\n resource: this.change.pristineResource,\n macros: 'none' as const,\n previewContext: this.previewContext,\n options: { rtl: this.schema.options && this.schema.options.rtl },\n type: 'constrained',\n ...this.resource.getEditorContext(this.field.name),\n };\n\n ngOnInit():void {\n super.ngOnInit();\n\n this.handler.registerOnSubmit(() => this.getCurrentValue());\n this.text = {\n attachmentLabel: this.I18n.t('js.label_formattable_attachment_hint'),\n save: this.I18n.t('js.inplace.button_save', { attribute: this.schema.name }),\n cancel: this.I18n.t('js.inplace.button_cancel', { attribute: this.schema.name }),\n };\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n\n if (!this.cancelled) {\n try {\n this.rawValue = this.editor?.getRawData();\n } catch (e) {\n console.error(`Failed to save CKEditor state on destroy: ${e as string}.`);\n }\n }\n }\n\n public onCkeditorSetup(editor:ICKEditorInstance):void {\n if (!isNewResource(this.resource)) {\n setTimeout(() => editor.editing.view.focus());\n }\n }\n\n public getCurrentValue():Promise {\n return this.editor\n .getTransformedContent()\n .then((val) => {\n this.rawValue = val;\n });\n }\n\n public onContentChange(value:string):void {\n // Have the guard clause to avoid the text being set\n // in the changeset when no actual change has taken place.\n if (this.rawValue !== value) {\n this.rawValue = value;\n }\n }\n\n public handleUserSubmit():boolean {\n this.getCurrentValue()\n .then(() => {\n this.handler.handleUserSubmit();\n });\n\n return false;\n }\n\n public handleUserCancel():void {\n this.cancelled = true;\n this.handler.handleUserCancel();\n }\n\n private get previewContext() {\n return this.handler.previewContext(this.resource);\n }\n\n public reset():void {\n if (this.editor && this.editor.initialized) {\n this.editor.content = this.rawValue;\n\n this.cdRef.markForCheck();\n }\n }\n\n public get rawValue():string {\n if (this.value && this.value.raw) {\n return this.value.raw;\n }\n return '';\n }\n\n public set rawValue(val:string) {\n this.value = { raw: val };\n }\n\n public isEmpty():boolean {\n return !(this.value && this.value.raw);\n }\n\n protected initialize():void {\n this.initialContent = this.rawValue;\n\n if (isNewResource(this.resource) && this.editor) {\n // Reset CKEditor when reloading after type/form changes\n this.reset();\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormattableEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/formattable-edit-field/formattable-edit-field.component';\nimport { OpenprojectEditorModule } from 'core-app/shared/components/editor/openproject-editor.module';\nimport { EditFieldControlsModule } from 'core-app/shared/components/fields/edit/field-controls/edit-field-controls.module';\n\n@NgModule({\n declarations: [\n FormattableEditFieldComponent,\n ],\n imports: [\n CommonModule,\n OpenprojectEditorModule,\n EditFieldControlsModule,\n ],\n exports: [\n FormattableEditFieldComponent,\n ],\n})\nexport class FormattableEditFieldModule { }\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Injector,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n ViewChild,\n} from '@angular/core';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { getPosition } from 'core-app/shared/helpers/set-click-position/set-click-position';\nimport { EditFormComponent } from 'core-app/shared/components/fields/edit/edit-form/edit-form.component';\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';\nimport {\n displayClassName,\n DisplayFieldRenderer,\n editFieldContainerClass,\n} from 'core-app/shared/components/fields/display/display-field-renderer';\nimport { States } from 'core-app/core/states/states.service';\nimport { debugLog } from '../../../../helpers/debug_output';\nimport { hasSelectionWithin } from '../../../../helpers/selection-helpers';\nimport { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\n\n@Component({\n selector: 'op-editable-attribute-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './editable-attribute-field.component.html',\n})\nexport class EditableAttributeFieldComponent extends UntilDestroyedMixin implements OnInit, OnDestroy {\n @Input() public fieldName:string;\n\n @Input() public resource:HalResource;\n\n @Input() public wrapperClasses?:string;\n\n @Input() public displayFieldOptions:{ [key:string]:unknown } = {};\n\n @Input() public isDropTarget?:boolean = false;\n\n @ViewChild('displayContainer', { static: true }) readonly displayContainer:ElementRef;\n\n @ViewChild('editContainer', { static: true }) readonly editContainer:ElementRef;\n\n public fieldRenderer:DisplayFieldRenderer;\n\n public editFieldContainerClass = editFieldContainerClass;\n\n public active = false;\n\n private $element:JQuery;\n\n public destroyed = false;\n\n constructor(\n protected states:States,\n protected injector:Injector,\n protected elementRef:ElementRef,\n protected opContextMenu:OPContextMenuService,\n protected halEditing:HalResourceEditingService,\n protected schemaCache:SchemaCacheService,\n // Get parent field group from injector if we're in a form\n @Optional() protected editForm:EditFormComponent,\n protected cdRef:ChangeDetectorRef,\n protected I18n:I18nService,\n ) {\n super();\n }\n\n public setActive(active = true):void {\n this.active = active;\n if (!this.componentDestroyed) {\n this.cdRef.detectChanges();\n }\n }\n\n public ngOnInit():void {\n this.fieldRenderer = new DisplayFieldRenderer(this.injector, 'single-view', this.displayFieldOptions);\n this.$element = jQuery(this.elementRef.nativeElement);\n\n // Register on the form if we're in an editable context\n this.editForm?.register(this);\n\n this.halEditing\n .temporaryEditResource(this.resource)\n .values$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((resource) => {\n this.resource = resource;\n this.render();\n });\n }\n\n // Open the field when its closed and relay drag & drop events to it.\n public startDragActivation(event:DragEvent):void {\n if (!this.isDropTarget || !this.isEditable || this.active) {\n return;\n }\n\n this.handleUserActivate(null);\n event.preventDefault();\n }\n\n public render():void {\n const el = this.fieldRenderer.render(this.resource, this.fieldName, null);\n this.displayContainer.nativeElement.innerHTML = '';\n this.displayContainer.nativeElement.appendChild(el);\n }\n\n public deactivate(focus = false):void {\n this.editContainer.nativeElement.innerHTML = '';\n this.editContainer.nativeElement.hidden = true;\n this.setActive(false);\n\n if (focus) {\n setTimeout(() => this.$element.find(`.${displayClassName}`).focus(), 20);\n }\n }\n\n public get isEditable():boolean {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n return !!(this.editForm && this.schema.isAttributeEditable(this.fieldName));\n }\n\n public activateIfEditable(event:MouseEvent|KeyboardEvent):boolean {\n // Ignore selections\n if (hasSelectionWithin(event.target as HTMLElement)) {\n debugLog(`Not activating ${this.fieldName} because of active selection within`);\n return true;\n }\n\n // Skip activation if the user clicked on a link or within a macro\n const target = jQuery(event.target as HTMLElement);\n if (target.closest('a,macro', this.displayContainer.nativeElement).length > 0) {\n return true;\n }\n\n this.handleUserActivate(event);\n\n this.opContextMenu.close();\n event.preventDefault();\n event.stopImmediatePropagation();\n\n return false;\n }\n\n public activateOnForm(noWarnings = false):Promise {\n // Activate the field\n this.setActive(true);\n\n return this.editForm\n .activate(this.fieldName, noWarnings)\n .catch(() => this.deactivate(true));\n }\n\n public handleUserActivate(evt:MouseEvent|KeyboardEvent|null):boolean {\n if (!this.isEditable) {\n return false;\n }\n\n let positionOffset = 0;\n\n // This can be both a direct click as well as a \"click\" via keyboard, e.g. the key.\n if (evt?.type === 'click') {\n // Get the position where the user clicked.\n positionOffset = getPosition(evt);\n }\n\n void this.activateOnForm()\n .then((handler) => {\n if (!handler) {\n return;\n }\n\n handler.$onUserActivate.next();\n handler.focus(positionOffset);\n });\n\n return false;\n }\n\n public reset():void {\n this.render();\n this.deactivate();\n }\n\n private get schema() {\n if (this.halEditing.typedState(this.resource).hasValue()) {\n const val = this.halEditing.typedState(this.resource).value as { schema:SchemaResource };\n return val.schema;\n }\n\n return this.schemaCache.of(this.resource);\n }\n}\n","/**\n * Test whether we currently have a selection within.\n * @param {HTMLElement} target\n * @return {boolean}\n */\nexport function hasSelectionWithin(target:Element):boolean {\n try {\n const selection = window.getSelection()!;\n const hasSelection = selection.toString().length > 0;\n const isWithin = target.contains(selection.anchorNode);\n\n return hasSelection && isWithin;\n } catch (e) {\n console.error('Failed to test whether in selection ', e);\n return false;\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 combine, deriveRaw, InputState, multiInput, State, StatesGroup,\n} from '@openproject/reactivestates';\nimport { filter, map } from 'rxjs/operators';\nimport { Injectable, Injector } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { FormResource } from 'core-app/features/hal/resources/form-resource';\nimport { ChangeMap } from 'core-app/shared/components/fields/changeset/changeset';\nimport { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { HalEventsService } from 'core-app/features/hal/services/hal-events.service';\nimport { StateCacheService } from 'core-app/core/apiv3/cache/state-cache.service';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\nclass ChangesetStates extends StatesGroup {\n name = 'Changesets';\n\n changesets = multiInput();\n\n constructor() {\n super();\n this.initializeMembers();\n }\n}\n\n/**\n * Wrapper class for the saved change of a work package,\n * used to access the previous save and or previous state\n * of the work package (e.g., whether it was new).\n */\nexport class ResourceChangesetCommit {\n /**\n * The work package id of the change\n * (This is the new work package ID if +wasNew+ is true.\n */\n public readonly id:string;\n\n /**\n * The resulting, saved work package.\n */\n public readonly resource:T;\n\n /** Whether the commit saved an initial work package */\n public readonly wasNew:boolean = false;\n\n /** The previous changes */\n public readonly changes:ChangeMap;\n\n /**\n * Create a change commit from the change object\n * @param change The change object that resulted in the save\n * @param saved The returned work package\n */\n constructor(change:ResourceChangeset, saved:T) {\n this.id = saved.id!.toString();\n this.wasNew = isNewResource(change.pristineResource);\n this.resource = saved;\n this.changes = change.changeMap;\n }\n}\n\nexport interface ResourceChangesetClass {\n new(...args:any[]):ResourceChangeset;\n}\n\n@Injectable()\nexport class HalResourceEditingService extends StateCacheService {\n /** Committed / saved changes to work packages observable */\n public committedChanges = new Subject();\n\n constructor(protected readonly injector:Injector,\n protected readonly halEvents:HalEventsService,\n protected readonly hook:HookService) {\n super(new ChangesetStates().changesets);\n }\n\n public async save>(change:T):Promise> {\n // Form the payload we're going to save\n const payload = await change.buildRequestPayload();\n const savedResource = await change.pristineResource.$links.updateImmediately(payload);\n\n // Initialize any potentially new HAL values\n savedResource.retainFrom(change.pristineResource);\n\n await this.onSaved(savedResource);\n\n // Complete the change\n return this.complete(change, savedResource);\n }\n\n /**\n * Mark the given change as completed, notify changes\n * and reset it.\n */\n private complete>(change:T, saved:V):ResourceChangesetCommit {\n const commit = new ResourceChangesetCommit(change, saved);\n this.committedChanges.next(commit);\n this.reset(change);\n\n const eventType = commit.wasNew ? 'created' : 'updated';\n this.halEvents.push(commit.resource, { eventType, commit });\n\n return commit;\n }\n\n /**\n * Reset the given change, either due to cancelling or successful submission.\n * @param change\n */\n public reset>(change:T) {\n change.clear();\n this.clearSome(change.href);\n }\n\n /**\n * Returns the typed state value. Use this to get a changeset\n * for a subtype of ResourceChangeset.\n * @param resource\n */\n public typedState>(resource:V):State {\n return this.multiState.get(resource.href!) as InputState;\n }\n\n /**\n * Create a new changeset for the given work package, discarding any previous changeset that might exist.\n *\n * @param resource\n * @param form\n *\n * @return The state for the created changeset\n */\n public edit>(resource:V, form?:FormResource):T {\n const state = this.multiState.get(resource.href!) as InputState;\n const changeset = this.newChangeset(resource, state, form);\n\n state.putValue(changeset);\n\n return changeset;\n }\n\n protected newChangeset>(resource:V, state:InputState, form?:FormResource):T {\n // we take the last registered group component which means that\n // plugins will have their say if they register for it.\n const cls = this.hook.call('halResourceChangesetClass', resource).pop() || ResourceChangeset;\n return new cls(resource, state, form) as T;\n }\n\n /**\n * Start or continue editing the work package with a given edit context\n * @param fallback Fallback resource to use\n * @return {ResourceChangeset} Change object to work on\n */\n public changeFor>(fallback:V):T {\n const state = this.multiState.get(fallback.href!) as InputState;\n let resource = fallback;\n if (fallback.state) {\n resource = fallback.state.getValueOr(fallback);\n }\n const changeset = state.value;\n\n // If there is no changeset, or\n // If there is an empty one for a older work package reference\n // build a new changeset\n if (changeset && !changeset.isEmpty()) {\n return changeset;\n }\n\n if (!changeset) {\n return this.edit(resource);\n }\n\n if (resource.hasOwnProperty('lockVersion') && changeset.pristineResource.lockVersion < resource.lockVersion) {\n return this.edit(resource);\n }\n\n changeset.updatePristineResource(resource);\n return changeset;\n }\n\n /**\n * Get a temporary view on the resource being edited.\n * IF there is a changeset:\n * - Merge the changeset, including its form, into the work package resource\n * IF there is no changeset:\n * - The work package itself is returned.\n *\n * This resource has a read only index signature to make it clear it is NOT\n * meant for editing.\n *\n * @return {State}\n */\n public temporaryEditResource>(resource:V):State {\n const combined = combine(resource.state! as State, this.typedState(resource));\n\n return deriveRaw(combined,\n ($) => $\n .pipe(\n filter(([resource, _]) => !!resource),\n map(([resource, change]) => {\n if (change) {\n change.updatePristineResource(resource as V);\n return change.projectedResource;\n }\n\n return resource;\n }),\n ));\n }\n\n public stopEditing(resource:HalResource|{ href:string }) {\n this.multiState.get(resource.href!).clear();\n }\n\n protected onSaved(saved:HalResource):Promise {\n if (saved.state) {\n return saved.push(saved);\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 { DisplayFieldContext } from 'core-app/shared/components/fields/display/display-field.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\nexport interface IFieldSchema {\n type:string;\n writable:boolean;\n allowedValues?:any;\n required?:boolean;\n hasDefault:boolean;\n name:string;\n options?:any;\n}\n\nexport class Field extends UntilDestroyedMixin {\n public static type:string;\n\n public resource:any;\n\n public name:string;\n\n public schema:IFieldSchema;\n\n public context:DisplayFieldContext;\n\n public get displayName():string {\n return this.schema.name || this.name;\n }\n\n public get value() {\n return this.resource[this.name];\n }\n\n public get type():string {\n return (this.constructor as typeof Field).type;\n }\n\n public get required():boolean {\n return !!this.schema.required;\n }\n\n public get writable():boolean {\n return this.schema.writable && this.context.options.writable !== false;\n }\n\n public get hasDefault():boolean {\n return this.schema.hasDefault;\n }\n\n public get options():boolean {\n return this.schema.options;\n }\n\n public isEmpty():boolean {\n return this.value === undefined || this.value === null || this.value === '';\n }\n\n public get unknownAttribute():boolean {\n return this.isEmpty() && !this.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 { Injector } from '@angular/core';\nimport { Field } from 'core-app/shared/components/fields/field.base';\n\nexport interface IFieldType {\n fieldType:string;\n $injector:Injector;\n new(...args:any[]):T;\n}\n\nexport abstract class AbstractFieldService> {\n /** Default field type to fall back to */\n public defaultFieldType:string;\n\n /** Registered attribute types => field identifier */\n protected fields:{ [attributeType:string]:string } = {};\n\n /** Registered field classes */\n protected classes:{ [type:string]:C } = {};\n\n /**\n * Get the field type for the given attribute type.\n * If no registered type exists for the field, returns the default type.\n *\n * @param {string} attributeType\n * @returns {string}\n */\n public fieldType(attributeType:string):string|undefined {\n return this.fields[attributeType];\n }\n\n /**\n * Get the Field class for the given field name.\n * Returns the default class if no registered type exists\n * @param {string} fieldName\n * @returns {C}\n */\n public getClassFor(fieldName:string, type = 'unknown'):C {\n const key = this.fieldType(fieldName) || this.fieldType(type) || this.defaultFieldType;\n return this.classes[key];\n }\n\n public getSpecificClassFor(resourceType:string, fieldName:string, type = 'unknown'):C {\n const key = this.fieldType(`${resourceType}-${fieldName}`)\n || this.fieldType(`${resourceType}-${type}`);\n\n if (key) {\n return this.classes[key];\n }\n\n return this.getClassFor(fieldName, type);\n }\n\n /**\n * Add a field class for the given attribute names.\n *\n * @param fieldClass The field class\n * @param {string} fieldType the field type identifier (e.g., 'progress')\n * @param {string[]} attributes The schema attribute names to register for (e.g., 'Progress')\n *\n * @returns {this}\n */\n public addFieldType(fieldClass:any, fieldType:string, attributes:string[]) {\n fieldClass.fieldType = fieldType;\n this.register(fieldClass, attributes);\n\n return this;\n }\n\n /**\n * Add a field class for the given attribute names and a specify resource.\n *\n * @param resourceType The resource type (e.g Work Package)\n * @param fieldClass The field class\n * @param {string} fieldType the field type identifier (e.g., 'progress')\n * @param {string[]} attributes The schema attribute names to register for (e.g., 'Progress')\n *\n * @returns {this}\n */\n public addSpecificFieldType(resourceType:string, fieldClass:any, fieldType:string, attributes:string[]) {\n fieldClass.fieldType = `${resourceType}-${fieldType}`;\n attributes = attributes.map((attribute) => `${resourceType}-${attribute}`);\n this.register(fieldClass, attributes);\n\n return this;\n }\n\n /**\n * Register new schema attribute names for an existing field type\n *\n * @param {string} fieldType The field type to extend (e.g., 'select')\n * @param {string[]} attributes The attribute schema names to register to the existing fieldType (e.g., 'budget')\n *\n * @returns {this}\n */\n public extendFieldType(fieldType:string, attributes:string[]) {\n const fieldClass = this.classes[fieldType] || this.getClassFor(fieldType);\n return this.addFieldType(fieldClass, fieldType, attributes);\n }\n\n /**\n * Register the\n * @param {C} fieldClass\n * @param {string[]} fields\n */\n protected register(fieldClass:C, fields:string[] = []) {\n const type = fieldClass.fieldType;\n fields.forEach((field:string) => this.fields[field] = type);\n this.classes[type] = fieldClass;\n }\n}\n","import { I18nService } from 'core-app/core/i18n/i18n.service';\n\nexport function projectStatusCodeCssClass(code:string|null|undefined):string {\n code = ensureDefaultCode(code);\n\n return `-${code.replace('_', '-')}`;\n}\n\nexport function projectStatusI18n(code:string|null|undefined, I18n:I18nService):string {\n code = ensureDefaultCode(code);\n\n return I18n.t(`js.grid.widgets.project_status.${code.replace('-', '_')}`);\n}\n\nfunction ensureDefaultCode(code:string|null|undefined):string {\n return code || 'not-set';\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// ++ Ng1FieldControlsWrapper,\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n HostBinding,\n Injector,\n OnInit,\n} from '@angular/core';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\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 { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n AttributeModelLoaderService,\n SupportedAttributeModels,\n} from 'core-app/shared/components/fields/macros/attribute-model-loader.service';\nimport { capitalize } from 'core-app/shared/helpers/string-helpers';\nimport { firstValueFrom } from 'rxjs';\n\n@Component({\n templateUrl: './attribute-label-macro.html',\n styleUrls: ['./attribute-macro.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n HalResourceEditingService,\n ],\n})\nexport class AttributeLabelMacroComponent implements OnInit {\n // Whether the value could not be loaded\n error:string|null = null;\n\n text = {\n help: this.I18n.t('js.editor.macro.attribute_reference.macro_help_tooltip'),\n not_found: this.I18n.t('js.editor.macro.attribute_reference.not_found'),\n invalid_attribute: (attr:string) => this.I18n.t('js.editor.macro.attribute_reference.invalid_attribute', { name: attr }),\n };\n\n @HostBinding('title') hostTitle = this.text.help;\n\n // The loaded resource, required for help text\n resource:HalResource|null = null;\n\n // The scope to load for attribute help text\n attributeScope:string;\n\n // The attribute name, normalized from schema\n attribute:string;\n\n // The label to render\n label:string|undefined;\n\n constructor(\n readonly elementRef:ElementRef,\n readonly injector:Injector,\n readonly resourceLoader:AttributeModelLoaderService,\n readonly schemaCache:SchemaCacheService,\n readonly displayField:DisplayFieldService,\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n ) {\n }\n\n ngOnInit():void {\n const element = this.elementRef.nativeElement as HTMLElement;\n const model = element.dataset.model as SupportedAttributeModels;\n const id = element.dataset.id as string;\n const attributeName = element.dataset.attribute as string;\n this.attributeScope = capitalize(model);\n\n void this.loadResourceAttribute(model, id, attributeName);\n }\n\n private async loadResourceAttribute(model:SupportedAttributeModels, id:string, attributeName:string):Promise {\n try {\n this.resource = await firstValueFrom(this.resourceLoader.require(model, id));\n } catch (e) {\n console.error('Failed to render macro %O', e);\n this.markError(this.text.not_found);\n return;\n }\n\n if (!this.resource) {\n this.markError(this.text.not_found);\n return;\n }\n\n const schema = await this.schemaCache.ensureLoaded(this.resource);\n this.attribute = schema.attributeFromLocalizedName(attributeName) || attributeName;\n this.label = (schema[this.attribute] as IOPFieldSchema|undefined)?.name;\n\n if (!this.label) {\n this.markError(this.text.invalid_attribute(attributeName));\n }\n\n this.cdRef.detectChanges();\n }\n\n markError(message:string) {\n this.error = this.I18n.t('js.editor.macro.error', { message });\n this.cdRef.detectChanges();\n }\n}\n","/**\n * Capitalize\n * @param value\n */\nexport function capitalize(value:string):string {\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n// ++ Ng1FieldControlsWrapper,\n\nimport { Injectable } from '@angular/core';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport {\n firstValueFrom,\n NEVER,\n Observable,\n throwError,\n} from 'rxjs';\nimport {\n filter,\n map,\n shareReplay,\n take,\n tap,\n} from 'rxjs/operators';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { multiInput } from '@openproject/reactivestates';\nimport { TransitionService } from '@uirouter/core';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport type SupportedAttributeModels = 'project'|'workPackage';\n\n@Injectable({ providedIn: 'root' })\nexport class AttributeModelLoaderService {\n text = {\n not_found: this.I18n.t('js.editor.macro.attribute_reference.not_found'),\n };\n\n // Cache the required model/id values because\n // we may need to expensively filter for them\n private cache$ = multiInput();\n\n constructor(readonly apiV3Service:ApiV3Service,\n readonly transitions:TransitionService,\n readonly currentProject:CurrentProjectService,\n readonly I18n:I18nService) {\n // Clear cached values whenever leaving the page\n transitions.onStart({}, () => {\n this.cache$.clear();\n return true;\n });\n }\n\n /**\n * Require a given model with an id reference to be loaded.\n * This might be a singular resource identified by an actual integer ID or\n * another (e.g., work package subject) reference.\n *\n * @param model\n * @param id\n */\n require(model:SupportedAttributeModels, id:string):Observable {\n const identifier = `${model}-${id}`;\n const state = this.cache$.get(identifier);\n\n if (state.isPristine()) {\n const observable = this\n .load(model, id)\n .pipe(\n filter((response) => !!response),\n shareReplay(1),\n );\n\n state.clearAndPutFromPromise(firstValueFrom(observable) as PromiseLike);\n\n return observable;\n }\n\n return state\n .values$()\n .pipe(\n take(1),\n tap((val) => console.log(`VAL ${val}`), (err) => console.error(`ERR ${err}`)),\n );\n }\n\n private load(model:SupportedAttributeModels, id?:string|undefined|null):Observable {\n switch (model) {\n case 'workPackage':\n return this.loadWorkPackage(id);\n case 'project':\n return this.loadProject(id);\n default:\n return NEVER;\n }\n }\n\n private loadProject(id:string|undefined|null) {\n id = id || this.currentProject.id;\n\n if (!id) {\n return throwError(this.text.not_found);\n }\n\n return this\n .apiV3Service\n .projects\n .id(id)\n .get()\n .pipe(\n take(1),\n );\n }\n\n private loadWorkPackage(id?:string|undefined|null) {\n if (!id) {\n return throwError(this.text.not_found);\n }\n\n // Return global reference to the subject\n if (/^[1-9]\\d*$/.test(id)) {\n return this\n .apiV3Service\n .work_packages\n .id(id)\n .get()\n .pipe(\n take(1),\n );\n }\n\n // Otherwise, look for subject IN the current project (if we're in project context)\n return this\n .apiV3Service\n .withOptionalProject(this.currentProject.id)\n .work_packages\n .filterByTypeaheadOrId(id, false, { pageSize: '1' })\n .get()\n .pipe(\n take(1),\n map((collection) => collection.elements[0] || null),\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// ++ Ng1FieldControlsWrapper,\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n HostBinding,\n Injector,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\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 { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n AttributeModelLoaderService,\n SupportedAttributeModels,\n} from 'core-app/shared/components/fields/macros/attribute-model-loader.service';\nimport { firstValueFrom } from 'rxjs';\n\n@Component({\n templateUrl: './attribute-value-macro.html',\n styleUrls: ['./attribute-macro.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n HalResourceEditingService,\n ],\n})\nexport class AttributeValueMacroComponent implements OnInit {\n @ViewChild('displayContainer') private displayContainer:ElementRef;\n\n // Whether the value could not be loaded\n error:string|null = null;\n\n text = {\n help: this.I18n.t('js.editor.macro.attribute_reference.macro_help_tooltip'),\n placeholder: this.I18n.t('js.placeholders.default'),\n not_found: this.I18n.t('js.editor.macro.attribute_reference.not_found'),\n invalid_attribute: (attr:string) => this.I18n.t('js.editor.macro.attribute_reference.invalid_attribute', { name: attr }),\n };\n\n @HostBinding('title') hostTitle = this.text.help;\n\n resource:HalResource;\n\n fieldName:string;\n\n constructor(\n readonly elementRef:ElementRef,\n readonly injector:Injector,\n readonly resourceLoader:AttributeModelLoaderService,\n readonly schemaCache:SchemaCacheService,\n readonly displayField:DisplayFieldService,\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n ) {\n }\n\n ngOnInit():void {\n const element = this.elementRef.nativeElement as HTMLElement;\n const model = element.dataset.model as SupportedAttributeModels;\n const id = element.dataset.id as string;\n const attributeName = element.dataset.attribute as string;\n\n void this.loadAndRender(model, id, attributeName);\n }\n\n private async loadAndRender(model:SupportedAttributeModels, id:string, attributeName:string):Promise {\n let resource:HalResource|null;\n\n try {\n resource = await firstValueFrom(this.resourceLoader.require(model, id));\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n console.error(`Failed to render macro ${e}`);\n this.markError(this.text.not_found);\n return;\n }\n\n if (!resource) {\n this.markError(this.text.not_found);\n return;\n }\n\n const schema = await this.schemaCache.ensureLoaded(resource);\n const attribute = schema.attributeFromLocalizedName(attributeName) || attributeName;\n const fieldSchema = schema[attribute] as IFieldSchema|undefined;\n\n if (fieldSchema) {\n this.resource = resource;\n this.fieldName = attribute;\n } else {\n this.markError(this.text.invalid_attribute(attributeName));\n }\n\n this.cdRef.detectChanges();\n }\n\n markError(message:string) {\n this.error = this.I18n.t('js.editor.macro.error', { message });\n this.cdRef.detectChanges();\n }\n}\n","\n \n \n \n \n \n #{{workPackage.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// ++ Ng1FieldControlsWrapper,\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n HostBinding,\n Injector,\n} from '@angular/core';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\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 { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport {\n CombinedDateDisplayField,\n} from 'core-app/shared/components/fields/display/field-types/combined-date-display.field';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\n\n@Component({\n templateUrl: './work-package-quickinfo-macro.html',\n styleUrls: ['./work-package-quickinfo-macro.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n HalResourceEditingService,\n ],\n})\nexport class WorkPackageQuickinfoMacroComponent {\n // Whether the value could not be loaded\n error:string|null = null;\n\n text = {\n not_found: this.I18n.t('js.editor.macro.attribute_reference.not_found'),\n help: this.I18n.t('js.editor.macro.attribute_reference.macro_help_tooltip'),\n };\n\n @HostBinding('title') hostTitle = this.text.help;\n\n /** Work package to be shown */\n workPackage$:Observable;\n\n combinedDateDisplayField = CombinedDateDisplayField;\n\n workPackageLink:string;\n\n detailed = false;\n\n constructor(readonly elementRef:ElementRef,\n readonly injector:Injector,\n readonly apiV3Service:ApiV3Service,\n readonly schemaCache:SchemaCacheService,\n readonly displayField:DisplayFieldService,\n readonly pathHelper:PathHelperService,\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n ) {\n }\n\n ngOnInit() {\n const element = this.elementRef.nativeElement as HTMLElement;\n const id:string = element.dataset.id!;\n this.detailed = element.dataset.detailed === 'true';\n this.workPackageLink = this.pathHelper.workPackagePath(id);\n\n this.workPackage$ = this\n .apiV3Service\n .work_packages\n .id(id)\n .get()\n .pipe(\n tap({ error: (_e) => this.markError(this.text.not_found) }),\n );\n }\n\n markError(message:string) {\n console.error(`Failed to render macro ${message}`);\n this.error = this.I18n.t('js.editor.macro.error', { message });\n this.cdRef.detectChanges();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-field.component';\n\n@Component({\n templateUrl: '../text-edit-field.component.html',\n})\nexport class TextEditFieldComponent extends EditFieldComponent {\n // ToDo: Work package specific\n public shouldFocus = this.name === 'subject';\n}\n","\n","// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-field.component';\n\n@Component({\n template: `\n \n `,\n})\nexport class IntegerEditFieldComponent extends EditFieldComponent {\n public locale = I18n.locale;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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\ninterface SelectAutocompleterAssignment {\n attribute:string;\n component:string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SelectAutocompleterRegisterService {\n private _fields:SelectAutocompleterAssignment[] = [];\n\n public register(component:any, attribute:string) {\n this._fields.push({ attribute, component });\n }\n\n public getAutocompleterOfAttribute(attribute:string) {\n const assignment = _.find(this._fields, (field) => field.attribute === attribute);\n return assignment ? assignment.component : 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 Component,\n InjectFlags,\n OnInit,\n} from '@angular/core';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { SelectAutocompleterRegisterService } from 'core-app/shared/components/fields/edit/field-types/select-edit-field/select-autocompleter-register.service';\nimport {\n from,\n Observable,\n} from 'rxjs';\nimport {\n map,\n tap,\n} from 'rxjs/operators';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { CreateAutocompleterComponent } from 'core-app/shared/components/autocompleter/create-autocompleter/create-autocompleter.component';\nimport { EditFormComponent } from 'core-app/shared/components/fields/edit/edit-form/edit-form.component';\nimport { StateService } from '@uirouter/core';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { HalResourceSortingService } from 'core-app/features/hal/services/hal-resource-sorting.service';\nimport { EditFieldComponent } from '../../edit-field.component';\nimport { HalLink } from 'core-app/features/hal/hal-link/hal-link';\n\nexport interface ValueOption {\n name:string;\n href:string|null;\n}\n\n@Component({\n templateUrl: './select-edit-field.component.html',\n})\nexport class SelectEditFieldComponent extends EditFieldComponent implements OnInit {\n @InjectField() selectAutocompleterRegister:SelectAutocompleterRegisterService;\n\n @InjectField() halNotification:HalResourceNotificationService;\n\n @InjectField() halSorting:HalResourceSortingService;\n\n @InjectField() $state:StateService;\n\n @InjectField(EditFormComponent, null, InjectFlags.Optional) editFormComponent:EditFormComponent;\n\n public availableOptions:any[];\n\n public text:{ [key:string]:string };\n\n public appendTo:any = null;\n\n public referenceOutputs:{ [key:string]:Function } = {\n onCreate: (newElement:HalResource) => this.onCreate(newElement),\n onChange: (value:HalResource) => this.onChange(value),\n onAddNew: (value:HalResource) => this.onNewValueAdded(value),\n onKeydown: (event:JQuery.TriggeredEvent) => this.handler.handleUserKeydown(event, true),\n onOpen: () => this.onOpen(),\n onClose: () => this.onClose(),\n onAfterViewInit: (component:CreateAutocompleterComponent) => this._autocompleterComponent = component,\n };\n\n public get selectedOption() {\n const href = this.value ? this.value.href : null;\n return _.find(this.availableOptions, (o) => o.href === href)!;\n }\n\n public set selectedOption(val:ValueOption|HalResource) {\n const option = _.find(this.availableOptions, (o) => o.href === val.href);\n\n // Special case 'null' value, which angular\n // only understands in ng-options as an empty string.\n if (option && option.href === '') {\n option.href = null;\n }\n\n this.value = option || val;\n }\n\n protected valuesLoaded = false;\n\n protected _autocompleterComponent:CreateAutocompleterComponent;\n\n private hiddenOverflowContainer = '.__hidden_overflow_container';\n\n /** Remember the values loading promise which changes as soon as the changeset is updated\n * (e.g., project or type is changed).\n */\n private valuesLoadingPromise:Promise;\n\n public ngOnInit() {\n super.ngOnInit();\n this.appendTo = this.overflowingSelector;\n\n this.handler\n .$onUserActivate\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n void this.valuesLoadingPromise\n .then(() => {\n this._autocompleterComponent.openDirectly = true;\n });\n });\n\n this._syncUrlParamsOnChangeIfNeeded(this.handler.fieldName, this.editFormComponent?.editMode);\n }\n\n protected initialize() {\n this.text = {\n requiredPlaceholder: this.I18n.t('js.placeholders.selection'),\n placeholder: this.I18n.t('js.placeholders.default'),\n };\n\n this.valuesLoadingPromise = this.change.getForm()\n .then(() => this.initialValueLoading())\n .catch(() => console.error('Failed to load default form'));\n }\n\n protected initialValueLoading() {\n this.valuesLoaded = false;\n return this.loadValues().toPromise();\n }\n\n public autocompleterComponent() {\n const { type } = this.schema;\n return this.selectAutocompleterRegister.getAutocompleterOfAttribute(type) || CreateAutocompleterComponent;\n }\n\n private setValues(availableValues:HalResource[]) {\n this.availableOptions = this.sortValues(availableValues);\n this.addEmptyOption();\n }\n\n protected loadValues(query?:string):Observable {\n const { allowedValues } = this.schema;\n\n if (Array.isArray(allowedValues)) {\n this.setValues(allowedValues);\n this.valuesLoaded = true;\n } else if (allowedValues && !this.valuesLoaded) {\n return this.loadValuesFromBackend(query);\n } else {\n this.setValues([]);\n }\n\n return from(Promise.resolve(this.availableOptions));\n }\n\n protected loadValuesFromBackend(query?:string) {\n return from(\n this.loadAllowedValues(query),\n ).pipe(\n map((collection) => {\n if (collection.count === undefined || collection.total === undefined || (!query && collection.total === collection.count) || !this.value) {\n return collection.elements;\n }\n return collection.elements.concat([this.value]);\n }),\n tap((elements) => this.setValues(elements)),\n map(() => this.availableOptions),\n );\n }\n\n protected loadAllowedValues(query?:string):Promise {\n // Cache the search without any params\n if (!query) {\n const cacheKey = this.schema.allowedValues.$link.href;\n return this.change.cacheValue(cacheKey, this.fetchAllowedValueQuery.bind(this));\n }\n\n return this.fetchAllowedValueQuery(query);\n }\n\n protected fetchAllowedValueQuery(query?:string):Promise {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const link = this.schema.allowedValues?.$link as HalLink|undefined;\n\n // Race condition: Field was under edit but is no longer editable / values not loadable\n // which means the schema switched during the period it opened / updated after saved.\n if (!link) {\n return new Promise(() => {});\n }\n\n return link.$fetch(this.allowedValuesFilter(query)) as Promise;\n }\n\n private addValue(val:HalResource) {\n this.availableOptions.push(val);\n }\n\n public get currentValueInvalid():boolean {\n return !!(\n (this.value && !_.some(this.availableOptions, (option:HalResource) => (option.href === this.value.href)))\n || (!this.value && this.schema.required)\n );\n }\n\n public onCreate(newElement:HalResource) {\n this.addValue(newElement);\n this.selectedOption = { name: newElement.name, href: newElement.href };\n this.handler.handleUserSubmit();\n }\n\n public onOpen() {\n jQuery(this.hiddenOverflowContainer).one('scroll', () => {\n this._autocompleterComponent.closeSelect();\n });\n }\n\n public onClose() {\n // Nothing to do\n }\n\n public onChange(value:HalResource|undefined|null) {\n if (value) {\n this.selectedOption = value;\n this.handler.handleUserSubmit();\n return;\n }\n\n const emptyOption = this.getEmptyOption();\n\n if (emptyOption) {\n this.selectedOption = emptyOption;\n this.handler.handleUserSubmit();\n }\n }\n\n private async onNewValueAdded(value:HalResource|undefined|null) {\n if (!value) {\n return;\n }\n\n await this.change.getForm(true);\n\n this.onChange(value);\n }\n\n private addEmptyOption() {\n // Empty options are not available for required fields\n if (this.isRequired()) {\n return;\n }\n\n // Since we use the original schema values, avoid adding\n // the option if one is returned / exists already.\n const emptyOption = this.getEmptyOption();\n if (emptyOption === undefined) {\n this.availableOptions.unshift({\n name: this.text.placeholder,\n href: '',\n });\n }\n }\n\n protected isRequired() {\n return this.schema.required;\n }\n\n protected sortValues(availableValues:HalResource[]) {\n return this.halSorting.sort(availableValues);\n }\n\n // Subclasses shall be able to override the filters with which the\n // allowed values are reduced in the backend.\n protected allowedValuesFilter(query?:string) {\n return {};\n }\n\n private getEmptyOption():undefined {\n return _.find(this.availableOptions, (el) => el.name === this.text.placeholder);\n }\n\n private _syncUrlParamsOnChangeIfNeeded(fieldName:string, editMode:boolean) {\n // Work package type changes need to be synced with the type url param\n // in order to keep the form changes (changeset) between route/state changes\n if (fieldName === 'type' && editMode) {\n this.handler.registerOnBeforeSubmit(() => {\n const newType = this.value?.$source?.id;\n\n if (newType) {\n this.$state.go('.', { type: newType }, { notify: false });\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 { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { Component, OnInit, ViewChild } from '@angular/core';\nimport { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-field.component';\nimport { ValueOption } from 'core-app/shared/components/fields/edit/field-types/select-edit-field/select-edit-field.component';\nimport { NgSelectComponent } from '@ng-select/ng-select';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Component({\n templateUrl: './multi-select-edit-field.component.html',\n})\nexport class MultiSelectEditFieldComponent extends EditFieldComponent implements OnInit {\n @ViewChild(NgSelectComponent, { static: true }) public ngSelectComponent:NgSelectComponent;\n\n @InjectField() I18n!:I18nService;\n\n public availableOptions:any[] = [];\n\n public text = {\n requiredPlaceholder: this.I18n.t('js.placeholders.selection'),\n placeholder: this.I18n.t('js.placeholders.default'),\n save: this.I18n.t('js.inplace.button_save', { attribute: this.schema.name }),\n cancel: this.I18n.t('js.inplace.button_cancel', { attribute: this.schema.name }),\n };\n\n public appendTo:any = null;\n\n public currentValueInvalid = false;\n\n public showAddNewUserButton:boolean;\n\n private hiddenOverflowContainer = '.__hidden_overflow_container';\n\n private nullOption:ValueOption;\n\n private _selectedOption:ValueOption[];\n\n /** Since we need to wait for values to be loaded, remember if the user activated this field */\n private requestFocus = false;\n\n ngOnInit() {\n this.nullOption = { name: this.text.placeholder, href: null };\n this.showAddNewUserButton = this.schema.type === 'User';\n\n this.handler\n .$onUserActivate\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n this.requestFocus = this.availableOptions.length === 0;\n\n // If we already have all values loaded, open now.\n if (!this.requestFocus) {\n this.openAutocompleteSelectField();\n }\n });\n\n super.ngOnInit();\n this.appendTo = this.overflowingSelector;\n }\n\n public get value() {\n const val = this.resource[this.name];\n return val ? val[0] : val;\n }\n\n /**\n * Map the selected hal resource(s) to the value options so that ngOptions will track them.\n * We cannot pass the HalResources themselves as angular will copy them on every digest due to trackBy\n * @returns {any}\n */\n public buildSelectedOption() {\n const value:HalResource[] = this.resource[this.name];\n return value ? _.castArray(value).map((val) => this.findValueOption(val)) : [];\n }\n\n public get selectedOption() {\n return this._selectedOption;\n }\n\n /**\n * Map the ValueOption to the actual HalResource option\n * @param val\n */\n public set selectedOption(val:ValueOption[]) {\n this._selectedOption = val;\n const mapper = (val:ValueOption) => {\n const option = _.find(this.availableOptions, (o) => o.href === val.href) || this.nullOption;\n\n // Special case 'null' value, which angular\n // only understands in ng-options as an empty string.\n if (option && option.href === '') {\n option.href = null;\n }\n\n return option;\n };\n\n this.resource[this.name] = _.castArray(val).map((el) => mapper(el));\n }\n\n public onOpen() {\n jQuery(this.hiddenOverflowContainer).one('scroll', () => {\n this.ngSelectComponent.close();\n });\n }\n\n public onClose() {\n // Nothing to do\n }\n\n public repositionDropdown() {\n if (this.ngSelectComponent && this.ngSelectComponent.dropdownPanel) {\n setTimeout(() => this.ngSelectComponent.dropdownPanel.adjustPosition(), 0);\n }\n }\n\n private openAutocompleteSelectField() {\n // The timeout takes care that the opening is added to the end of the current call stack.\n // Thus we can be sure that the autocompleter is rendered and ready to be opened.\n const that = this;\n window.setTimeout(() => {\n that.ngSelectComponent.open();\n }, 0);\n }\n\n private findValueOption(option?:HalResource):ValueOption {\n let result;\n\n if (option) {\n result = _.find(this.availableOptions, (valueOption) => valueOption.href === option.href)!;\n }\n\n return result || this.nullOption;\n }\n\n private setValues(availableValues:any[], sortValuesByName = false) {\n if (sortValuesByName) {\n availableValues.sort((a:any, b:any) => {\n const nameA = a.name.toLowerCase();\n const nameB = b.name.toLowerCase();\n return nameA < nameB ? -1 : nameA > nameB ? 1 : 0;\n });\n }\n\n this.availableOptions = availableValues || [];\n this._selectedOption = this.buildSelectedOption();\n this.checkCurrentValueValidity();\n\n if (this.availableOptions.length > 0 && this.requestFocus) {\n this.openAutocompleteSelectField();\n this.requestFocus = false;\n }\n }\n\n protected initialize() {\n super.initialize();\n this.loadValues();\n }\n\n private loadValues() {\n const { allowedValues } = this.schema;\n if (Array.isArray(allowedValues)) {\n this.setValues(allowedValues);\n } else if (this.schema.allowedValues) {\n return this.schema.allowedValues.$load().then((values:CollectionResource) => {\n // The select options of the project shall be sorted\n if (values.count > 0 && (values.elements[0] as any)._type === 'Project') {\n this.setValues(values.elements, true);\n } else {\n this.setValues(values.elements);\n }\n });\n } else {\n this.setValues([]);\n }\n return Promise.resolve();\n }\n\n private checkCurrentValueValidity() {\n if (this.value) {\n this.currentValueInvalid = !!(\n // (If value AND)\n // MultiSelect AND there is no value which href is not in the options hrefs\n (!_.some(this.value, (value:HalResource) => _.some(this.availableOptions, (option) => (option.href === value.href))))\n );\n } else {\n // If no value but required\n this.currentValueInvalid = !!this.schema.required;\n }\n }\n}\n","// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-field.component';\n\n@Component({\n template: `\n \n `,\n})\nexport class FloatEditFieldComponent extends EditFieldComponent {\n public locale = I18n.locale;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-field.component';\n\n@Component({\n template: `\n \n `,\n})\nexport class BooleanEditFieldComponent extends EditFieldComponent {\n public updateValue(newValue:boolean) {\n this.value = newValue;\n this.handler.handleUserSubmit();\n }\n}\n","import {\n concat, Observable, of, Subject,\n} from 'rxjs';\nimport {\n catchError,\n debounceTime,\n distinctUntilChanged,\n filter,\n shareReplay,\n switchMap,\n takeUntil,\n tap,\n} from 'rxjs/operators';\nimport { RequestSwitchmapHandler } from 'core-app/shared/helpers/rxjs/request-switchmap';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport type RequestErrorHandler = (error:unknown) => void;\n\nexport function errorNotificationHandler(service:HalResourceNotificationService):RequestErrorHandler {\n return (error:unknown) => service.handleRawError(error);\n}\n\nexport class DebouncedRequestSwitchmap {\n /** Input request state */\n public input$ = new Subject();\n\n /** Output results observable */\n public output$:Observable;\n\n /** Loading flag */\n public loading$ = new Subject();\n\n /** Whether results were returned */\n public lastResult:R[] = [];\n\n /** Last requested value */\n public lastRequestedValue:T|undefined;\n\n /**\n * @param handler switch map handler function to output a response observable\n * @param debounceTime {number} Time to debounce in ms.\n * @param preFilterNull {boolean} Whether to exclude null and undefined searches\n * @param emptyValue {R} The empty fall back value before first response or on errors\n */\n constructor(\n readonly requestHandler:RequestSwitchmapHandler,\n readonly errorHandler:RequestErrorHandler,\n readonly preFilterNull:boolean = false,\n readonly debounceMs = 250,\n ) {\n /** Output switchmap observable */\n this.output$ = concat(\n of([]),\n this.input$.pipe(\n filter((val) => !preFilterNull || (val !== undefined && val !== null)),\n distinctUntilChanged(),\n debounceTime(debounceMs),\n tap((val:T) => {\n this.lastRequestedValue = val;\n this.lastResult = [];\n this.loading$.next(true);\n }),\n switchMap((term) => this.requestHandler(term)\n .pipe(\n catchError((error) => {\n this.errorHandler(error);\n return of([]);\n }),\n tap((results) => {\n this.loading$.next(false);\n this.lastResult = results;\n }),\n )),\n shareReplay(1),\n ),\n );\n }\n\n /**\n * Append a new request for the given request value and pass\n * that to the switchmap handler\n * @param newValue\n */\n public request(newValue:T) {\n this.input$.next(newValue);\n }\n\n /**\n * Returns whether the last results returned anything\n */\n public get hasResults() {\n return this.lastResult.length > 0;\n }\n\n /**\n * Observe the switched response\n */\n public observe(until:Observable) {\n return this\n .output$\n .pipe(\n takeUntil(until),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport {\n DebouncedRequestSwitchmap,\n errorNotificationHandler,\n} from 'core-app/shared/helpers/rxjs/debounced-input-switchmap';\nimport { take } from 'rxjs/operators';\nimport { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { SelectEditFieldComponent } from './select-edit-field/select-edit-field.component';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\n\n@Component({\n templateUrl: './work-package-edit-field.component.html',\n})\nexport class WorkPackageEditFieldComponent extends SelectEditFieldComponent {\n /** Keep a switchmap for search term and loading state */\n public requests = new DebouncedRequestSwitchmap(\n (searchTerm:string) => this.loadValues(searchTerm),\n errorNotificationHandler(this.halNotification),\n );\n\n protected initialValueLoading() {\n this.valuesLoaded = false;\n\n // Using this hack with the empty value to have the values loaded initially\n // while avoiding loading it multiple times.\n return new Promise((resolve) => {\n this.requests.output$.pipe(take(1)).subscribe((options) => {\n resolve(options);\n });\n\n this.requests.input$.next('');\n });\n }\n\n public get typeahead() {\n return this.requests.input$;\n }\n\n protected fetchAllowedValueQuery(query?:string):Promise {\n if (this.name === 'parent') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access\n return this.schema.allowedValues.$link.$fetch({ query }) as Promise;\n }\n\n return super.fetchAllowedValueQuery(query);\n }\n\n protected allowedValuesFilter(query?:string):{} {\n let filterParams = super.allowedValuesFilter(query);\n\n if (query) {\n const filters:ApiV3FilterBuilder = new ApiV3FilterBuilder();\n\n filters.add('subjectOrId', '**', [query]);\n\n filterParams = { filters: filters.toJson() };\n }\n\n return filterParams;\n }\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport * as moment from 'moment';\nimport { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-field.component';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\n\n@Component({\n template: `\n \n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DateEditFieldComponent extends EditFieldComponent implements OnInit {\n @InjectField() readonly timezoneService:TimezoneService;\n\n autofocus = false;\n\n ngOnInit():void {\n super.ngOnInit();\n // Open the datepicker when the field is not part of an editing form.\n this.autofocus = !this.handler.inEditMode;\n }\n\n public get value():string {\n return this.formatter(this.resource[this.name]) || '';\n }\n\n public set value(value:string) {\n this.resource[this.name] = this.parseValue(value);\n }\n\n public parseValue(data:string) {\n if (moment(data, 'YYYY-MM-DD', true).isValid()) {\n return data;\n }\n return null;\n }\n\n public onCancel():void {\n this.handler.handleUserCancel();\n this.onModalClosed();\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 public onModalClosed():void {\n if (!this.handler.inEditMode) {\n this.handler.deactivate(false);\n }\n }\n}\n","\n \n \n {{item.name}}\n \n \n \n {{item.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 { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { Component, OnInit, ViewChild } from '@angular/core';\nimport { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-field.component';\nimport { NgSelectComponent } from '@ng-select/ng-select';\nimport {\n projectStatusCodeCssClass,\n projectStatusI18n,\n} from 'core-app/shared/components/fields/helpers/project-status-helper';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { repositionDropdownBugfix } from 'core-app/shared/components/autocompleter/op-autocompleter/autocompleter.helper';\n\ninterface ProjectStatusOption {\n href:string\n name:string\n colorClass:string\n}\n\n@Component({\n templateUrl: './project-status-edit-field.component.html',\n styleUrls: ['./project-status-edit-field.component.sass'],\n})\nexport class ProjectStatusEditFieldComponent extends EditFieldComponent implements OnInit {\n @ViewChild(NgSelectComponent, { static: true }) public ngSelectComponent:NgSelectComponent;\n\n @InjectField() I18n!:I18nService;\n\n public availableStatuses:ProjectStatusOption[] = [{\n href: 'not_set',\n name: projectStatusI18n('not_set', this.I18n),\n colorClass: projectStatusCodeCssClass('not_set'),\n }];\n\n public currentStatusCode:string;\n\n public hiddenOverflowContainer = '#content-wrapper';\n\n public appendToContainer = 'body';\n\n ngOnInit() {\n this.currentStatusCode = this.resource.status === null ? this.availableStatuses[0].href : this.resource.status.href;\n\n this.change.getForm().then((form) => {\n form.schema.status.allowedValues.forEach((status:HalResource) => {\n this.availableStatuses = [...this.availableStatuses,\n {\n href: status.href!,\n name: status.name,\n colorClass: projectStatusCodeCssClass(status.id),\n }];\n });\n\n // The timeout takes care that the opening is added to the end of the current call stack.\n // Thus we can be sure that the select box is rendered and ready to be opened.\n const that = this;\n window.setTimeout(() => {\n that.ngSelectComponent.open();\n }, 0);\n });\n }\n\n public onChange() {\n this.resource.status = this.currentStatusCode === this.availableStatuses[0].href ? null : { href: this.currentStatusCode };\n this.handler.handleUserSubmit();\n }\n\n public onOpen() {\n repositionDropdownBugfix(this.ngSelectComponent);\n\n jQuery(this.hiddenOverflowContainer).one('scroll.autocompleteContainer', () => {\n this.ngSelectComponent.close();\n });\n }\n\n public onClose() {\n jQuery(this.hiddenOverflowContainer).off('scroll.autocompleteContainer');\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-field.component';\n\n@Component({\n templateUrl: './text-edit-field.component.html',\n})\nexport class PlainFormattableEditFieldComponent extends EditFieldComponent {\n // only exists because the template is reused and the property is required there.\n public shouldFocus = false;\n\n public get value() {\n if (!this.schema) {\n return '';\n }\n const element = this.resource[this.name];\n\n return element && element.raw || '';\n }\n\n public set value(newValue:string) {\n this.resource[this.name] = { raw: newValue };\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { WorkPackageEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/work-package-edit-field.component';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport {\n TimeEntryWorkPackageAutocompleterComponent,\n TimeEntryWorkPackageAutocompleterMode,\n} from 'core-app/shared/components/autocompleter/te-work-package-autocompleter/te-work-package-autocompleter.component';\nimport { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { firstValueFrom } from 'rxjs';\n\nconst RECENT_TIME_ENTRIES_MAGIC_NUMBER = 30;\n\n@Component({\n templateUrl: './work-package-edit-field.component.html',\n})\nexport class TimeEntryWorkPackageEditFieldComponent extends WorkPackageEditFieldComponent {\n @InjectField() apiV3Service:ApiV3Service;\n\n private recentWorkPackageIds:string[];\n\n protected initialize() {\n super.initialize();\n\n // For reasons beyond me, the referenceOutputs variable is not defined at first when editing\n // existing values.\n if (this.referenceOutputs) {\n this.referenceOutputs.modeSwitch = (mode:TimeEntryWorkPackageAutocompleterMode) => {\n this.valuesLoaded = false;\n const lastValue = this.requests.lastRequestedValue!;\n\n // Hack to provide a new value to \"reset\" the input.\n // Only the second input is actually processed as the input is debounced.\n this.requests.input$.next('_/&\"()____');\n this.requests.input$.next(lastValue);\n };\n }\n }\n\n public autocompleterComponent() {\n return TimeEntryWorkPackageAutocompleterComponent;\n }\n\n // Although the schema states the work packages to not be required,\n // as time entries can also be assigned to a project, we want to only assign\n // time entries to work packages and thus require a value.\n // The back end will have to be changed in due time but not as long as there is still a rails based\n // time entry view in the application.\n protected isRequired() {\n return true;\n }\n\n // We fetch the last RECENT_TIME_ENTRIES_MAGIC_NUMBER time entries by that user. We then use it to fetch the work packages\n // associated with the time entries so that we have the most recent work packages the user logged time on.\n // As a worst case, the user logged RECENT_TIME_ENTRIES_MAGIC_NUMBER times on one work package so we can not guarantee to actually have\n // a fixed number returned.\n protected loadAllowedValues(query?:string) {\n if (!this.recentWorkPackageIds) {\n return firstValueFrom(\n this\n .apiV3Service\n .time_entries\n .list({\n filters: [['user_id', '=', ['me']]],\n sortBy: [['updated_at', 'desc']],\n pageSize: RECENT_TIME_ENTRIES_MAGIC_NUMBER,\n }),\n ).then((collection) => {\n this.recentWorkPackageIds = collection\n .elements\n .filter((timeEntry) => timeEntry.workPackage?.href)\n .map((timeEntry) => idFromLink(timeEntry.workPackage.href))\n .filter((v, i, a) => a.indexOf(v) === i);\n\n return this.fetchAllowedValueQuery(query);\n });\n }\n return this.fetchAllowedValueQuery(query);\n }\n\n protected allowedValuesFilter(query?:string):{} {\n const filters:ApiV3FilterBuilder = new ApiV3FilterBuilder();\n\n const isRecent = (this._autocompleterComponent as TimeEntryWorkPackageAutocompleterComponent).mode === 'recent';\n if (isRecent && this.recentWorkPackageIds.length > 0) {\n filters.add('id', '=', this.recentWorkPackageIds);\n }\n\n if (query) {\n filters.add('subjectOrId', '**', [query]);\n }\n\n return { filters: filters.toJson() };\n }\n\n protected sortValues(availableValues:HalResource[]) {\n if ((this._autocompleterComponent as TimeEntryWorkPackageAutocompleterComponent).mode === 'recent') {\n return this.sortValuesByRecentIds(availableValues);\n }\n return super.sortValues(availableValues);\n }\n\n protected sortValuesByRecentIds(availableValues:HalResource[]) {\n return availableValues\n .sort((a, b) => this.recentWorkPackageIds.indexOf(a.id!) - this.recentWorkPackageIds.indexOf(b.id!));\n }\n}\n","/*\n * OpenProject is an open source project management software.\n * Copyright (C) 2010-2022 the OpenProject GmbH\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License version 3.\n *\n * OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n * Copyright (C) 2006-2013 Jean-Philippe Lang\n * Copyright (C) 2010-2013 the ChiliProject Team\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 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,\n OnDestroy,\n OnInit,\n Injector,\n} from '@angular/core';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-field.component';\nimport { DeviceService } from 'core-app/core/browser/device.service';\n\n@Directive()\nexport abstract class DatePickerEditFieldComponent extends EditFieldComponent implements OnInit, OnDestroy {\n @InjectField() readonly timezoneService:TimezoneService;\n\n @InjectField() deviceService:DeviceService;\n\n @InjectField() injector:Injector;\n\n ngOnInit():void {\n super.ngOnInit();\n\n this.handler\n .$onUserActivate\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => {\n this.showDatePickerModal();\n });\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n }\n\n public showDatePickerModal():void { }\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 { DatePickerEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/date-picker-edit-field.component';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\n\n@Component({\n templateUrl: './combined-date-edit-field.component.html',\n})\nexport class CombinedDateEditFieldComponent extends DatePickerEditFieldComponent {\n dates = '';\n\n opened = false;\n\n text = {\n placeholder: {\n startDate: this.I18n.t('js.label_no_start_date'),\n dueDate: this.I18n.t('js.label_no_due_date'),\n date: this.I18n.t('js.label_no_date'),\n },\n };\n\n get isMultiDate():boolean {\n return !this.change.schema.isMilestone;\n }\n\n public onInputClick(event:MouseEvent) {\n event.stopPropagation();\n }\n\n public showDatePickerModal():void {\n this.opened = true;\n }\n\n public onModalClosed():void {\n this.opened = false;\n\n if (!this.handler.inEditMode) {\n this.handler.deactivate(false);\n }\n this.resetDates();\n }\n\n public save():void {\n this.handler.handleUserSubmit();\n this.onModalClosed();\n }\n\n public cancel():void {\n this.handler.reset();\n this.onModalClosed();\n }\n\n // Overwrite super in order to set the initial dates.\n protected initialize():void {\n super.initialize();\n this.resetDates();\n }\n\n protected resetDates():void {\n switch (this.name) {\n case 'combinedDate':\n this.dates = `${this.current('startDate')} - ${this.current('dueDate')}`;\n break;\n\n case 'startDate':\n this.dates = `${this.current('startDate')}`;\n break;\n\n case 'dueDate':\n this.dates = `${this.current('dueDate')}`;\n break;\n\n case 'date':\n this.dates = `${this.current('date')}`;\n break;\n\n default:\n break;\n }\n }\n\n protected current(dateAttribute:'startDate' | 'dueDate' | 'date'):string {\n const value = (this.resource && (this.resource as WorkPackageResource)[dateAttribute]) as string|null;\n return (value || this.text.placeholder[dateAttribute]);\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 Inject,\n Injector,\n OnInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { from } from 'rxjs';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n EditFieldComponent,\n OpEditingPortalChangesetToken,\n OpEditingPortalHandlerToken,\n OpEditingPortalSchemaToken,\n} from 'core-app/shared/components/fields/edit/edit-field.component';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { IProject } from 'core-app/core/state/projects/project.model';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ResourceChangeset } from '../../changeset/resource-changeset';\nimport { IFieldSchema } from '../../field.base';\nimport { EditFieldHandler } from '../editing-portal/edit-field-handler';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport {\n take,\n tap,\n} from 'rxjs/operators';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Component({\n templateUrl: './project-edit-field.component.html',\n styleUrls: ['./project-edit-field.component.sass'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ProjectEditFieldComponent extends EditFieldComponent implements OnInit {\n isNew = isNewResource(this.resource);\n\n url:string;\n\n constructor(\n readonly I18n:I18nService,\n readonly elementRef:ElementRef,\n @Inject(OpEditingPortalChangesetToken) protected change:ResourceChangeset,\n @Inject(OpEditingPortalSchemaToken) public schema:IFieldSchema,\n @Inject(OpEditingPortalHandlerToken) readonly handler:EditFieldHandler,\n readonly cdRef:ChangeDetectorRef,\n readonly injector:Injector,\n readonly apiV3Service:ApiV3Service,\n readonly http:HttpClient,\n readonly halResourceService:HalResourceService,\n ) {\n super(\n I18n,\n elementRef,\n change,\n schema,\n handler,\n cdRef,\n injector,\n );\n }\n\n initialize():void {\n if (this.schema.allowedValues) {\n this.setUrl();\n } else {\n this.loadFormAndSetUrl();\n }\n }\n\n public onModelChange(project?:IProject):unknown {\n if (project) {\n // We fake a HalResource here because we're using a plain JS object, but the schema loading and editing\n // is part of the older HalResource stack\n const newProject = { ...project };\n const fakeProjectHal = this.halResourceService.createHalResourceOfType('project', newProject);\n this.value = fakeProjectHal;\n } else {\n this.value = null;\n }\n\n return this.handler.handleUserSubmit();\n }\n\n public get APIFilters():IAPIFilter[] {\n const filters = [\n { name: 'active', operator: '=', values: ['t'] },\n ];\n\n if (isNewResource(this.resource) && this.change.value('type')) {\n const typeId = idFromLink((this.change.value('type') as HalResource).href);\n filters.push({ name: 'type_id', operator: '=', values: [typeId] });\n }\n\n return filters;\n }\n\n private loadFormAndSetUrl():void {\n from(this.change.getForm())\n .pipe(\n tap(() => this.setUrl()),\n take(1),\n ).subscribe();\n }\n\n private setUrl():void {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n this.url = this.schema.allowedValues.$link.href as 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 * as moment from 'moment';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { EditFieldComponent } from 'core-app/shared/components/fields/edit/edit-field.component';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\n\n@Component({\n template: `\n \n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HoursDurationEditFieldComponent extends EditFieldComponent {\n @InjectField() TimezoneService:TimezoneService;\n\n inputValue:null|string;\n\n public parser(value:null|string, input:HTMLInputElement):moment.Duration {\n // Managing decimal separators in a multi-language app is a complex topic:\n // https://www.ctrl.blog/entry/html5-input-number-localization.html\n // Depending on the locale of the OS, the browser or the app itself,\n // a decimal separator could be considered valid or invalid.\n // When a decimal operator is considered invalid (e.g: 1. in Chrome with\n // 'en' locale), the input emits null as a value and its state is marked\n // not valid, but the value remains in the input. Adding a value after the\n // 'invalid' separator (e.g: 1.2) emits a valid value.\n // In order to allow both decimal separator (period and comma) in any\n // context, we check the validity of the input and, if it's not valid, we\n // default to the previous value, emulating the way the browsers work with\n // valid separators (e.g: introducing 1. would set 1 as a value).\n this.inputValue = input.value;\n if (!input.validity.valid) {\n if (value === null || input.value === '') {\n value = null;\n } else {\n value = this.value as string;\n }\n }\n return moment.duration(value, 'hours');\n }\n\n public formatter(value:null|string):number|null {\n if (value === null) {\n return null;\n }\n return Number(moment.duration(value).asHours().toFixed(2));\n }\n\n protected parseValue(val:moment.Moment | null) {\n if (val === null || this.inputValue === '') {\n return null;\n }\n\n let parsedValue;\n if (val.isValid()) {\n parsedValue = val.toISOString();\n } else {\n parsedValue = null;\n }\n\n return parsedValue;\n }\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Inject,\n Injector,\n OnInit,\n} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n EditFieldComponent,\n OpEditingPortalChangesetToken,\n OpEditingPortalHandlerToken,\n OpEditingPortalSchemaToken,\n} from 'core-app/shared/components/fields/edit/edit-field.component';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n// import { IProject } from 'core-app/core/state/projects/project.model';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ResourceChangeset } from '../../changeset/resource-changeset';\nimport { IFieldSchema } from '../../field.base';\nimport { EditFieldHandler } from '../editing-portal/edit-field-handler';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { IUserAutocompleteItem } from 'core-app/shared/components/autocompleter/user-autocompleter/user-autocompleter.component';\nimport { CallableHalLink } from 'core-app/features/hal/hal-link/hal-link';\n\n@Component({\n templateUrl: './user-edit-field.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UserEditFieldComponent extends EditFieldComponent implements OnInit {\n isNew = isNewResource(this.resource);\n\n url:string;\n\n constructor(\n readonly I18n:I18nService,\n readonly elementRef:ElementRef,\n @Inject(OpEditingPortalChangesetToken) protected change:ResourceChangeset,\n @Inject(OpEditingPortalSchemaToken) public schema:IFieldSchema,\n @Inject(OpEditingPortalHandlerToken) readonly handler:EditFieldHandler,\n readonly cdRef:ChangeDetectorRef,\n readonly injector:Injector,\n readonly apiV3Service:ApiV3Service,\n readonly http:HttpClient,\n readonly halResourceService:HalResourceService,\n ) {\n super(\n I18n,\n elementRef,\n change,\n schema,\n handler,\n cdRef,\n injector,\n );\n }\n\n initialize():void {\n const link = this.schema.allowedValues as CallableHalLink|undefined;\n if (link) {\n this.url = link.$link.href as string;\n }\n }\n\n public onModelChange(user?:IUserAutocompleteItem):unknown {\n if (user) {\n // We fake a HalResource here because we're using a plain JS object, but the schema loading and editing\n // is part of the older HalResource stack\n const newUser = { ...user };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n this.value = this.halResourceService.createHalResourceOfType('user', newUser);\n } else {\n this.value = null;\n }\n\n return this.handler.handleUserSubmit();\n }\n}\n","/*\n * OpenProject is an open source project management software.\n * Copyright (C) 2010-2022 the OpenProject GmbH\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License version 3.\n *\n * OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n * Copyright (C) 2006-2013 Jean-Philippe Lang\n * Copyright (C) 2010-2013 the ChiliProject Team\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 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} from '@angular/core';\nimport { DatePickerEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/date-picker-edit-field.component';\nimport * as moment from 'moment-timezone';\n\n@Component({\n templateUrl: './days-duration-edit-field.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DaysDurationEditFieldComponent extends DatePickerEditFieldComponent {\n opened = false;\n\n public get formattedValue():number {\n return Number(moment.duration(this.value).asDays().toFixed(0));\n }\n\n ngOnInit():void {\n super.ngOnInit();\n }\n\n onInputClick(event:MouseEvent) {\n event.stopPropagation();\n }\n\n showDatePickerModal() {\n this.opened = true;\n }\n\n save() {\n this.handler.handleUserSubmit();\n this.opened = false;\n }\n\n cancel():void {\n this.handler.reset();\n this.opened = false;\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 { EditFieldService } from 'core-app/shared/components/fields/edit/edit-field.service';\nimport { TextEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/text-edit-field/text-edit-field.component';\nimport { IntegerEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/integer-edit-field/integer-edit-field.component';\nimport { SelectEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/select-edit-field/select-edit-field.component';\nimport { MultiSelectEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/multi-select-edit-field.component';\nimport { FloatEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/float-edit-field.component';\nimport { BooleanEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/boolean-edit-field/boolean-edit-field.component';\nimport { WorkPackageEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/work-package-edit-field.component';\nimport { DateEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/date-edit-field/date-edit-field.component';\nimport { FormattableEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/formattable-edit-field/formattable-edit-field.component';\nimport { SelectAutocompleterRegisterService } from 'core-app/shared/components/fields/edit/field-types/select-edit-field/select-autocompleter-register.service';\nimport { ProjectStatusEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/project-status-edit-field.component';\nimport { PlainFormattableEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/plain-formattable-edit-field.component';\nimport { TimeEntryWorkPackageEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/te-work-package-edit-field.component';\nimport { CombinedDateEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/combined-date-edit-field.component';\nimport { VersionAutocompleterComponent } from 'core-app/shared/components/autocompleter/version-autocompleter/version-autocompleter.component';\nimport { WorkPackageAutocompleterComponent } from 'core-app/shared/components/autocompleter/work-package-autocompleter/wp-autocompleter.component';\nimport { WorkPackageCommentFieldComponent } from 'core-app/features/work-packages/components/work-package-comment/wp-comment-field.component';\nimport { ProjectEditFieldComponent } from './field-types/project-edit-field.component';\nimport { HoursDurationEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/hours-duration-edit-field.component';\nimport { UserEditFieldComponent } from './field-types/user-edit-field.component';\nimport { DaysDurationEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/days-duration-edit-field.component';\n\nexport function initializeCoreEditFields(editFieldService:EditFieldService, selectAutocompleterRegisterService:SelectAutocompleterRegisterService) {\n return ():void => {\n editFieldService.defaultFieldType = 'text';\n editFieldService\n .addFieldType(TextEditFieldComponent, 'text', ['String'])\n .addFieldType(IntegerEditFieldComponent, 'integer', ['Integer'])\n .addFieldType(HoursDurationEditFieldComponent, 'estimatedTime', ['estimatedTime'])\n .addFieldType(ProjectEditFieldComponent, 'project', ['Project'])\n .addFieldType(UserEditFieldComponent, 'user', ['User'])\n .addFieldType(SelectEditFieldComponent, 'select', [\n 'Priority',\n 'Status',\n 'Type',\n 'Version',\n 'TimeEntriesActivity',\n 'Category',\n 'CustomOption',\n ])\n .addFieldType(MultiSelectEditFieldComponent, 'multi-select', [\n '[]CustomOption',\n '[]User',\n '[]Version',\n ])\n .addFieldType(FloatEditFieldComponent, 'float', ['Float'])\n .addFieldType(WorkPackageEditFieldComponent, 'workPackage', ['WorkPackage'])\n .addFieldType(BooleanEditFieldComponent, 'boolean', ['Boolean'])\n .addFieldType(DateEditFieldComponent, 'date', ['Date'])\n .addFieldType(FormattableEditFieldComponent, 'wiki-textarea', ['Formattable'])\n .addFieldType(WorkPackageCommentFieldComponent, '_comment', ['comment']);\n\n editFieldService\n .addSpecificFieldType('WorkPackage', CombinedDateEditFieldComponent,\n 'date',\n ['combinedDate', 'startDate', 'dueDate', 'date'])\n .addSpecificFieldType('WorkPackage', DaysDurationEditFieldComponent,\n 'duration',\n ['duration'])\n .addSpecificFieldType('Project', ProjectStatusEditFieldComponent, 'status', ['status'])\n .addSpecificFieldType('TimeEntry', PlainFormattableEditFieldComponent, 'comment', ['comment'])\n .addSpecificFieldType('TimeEntry', TimeEntryWorkPackageEditFieldComponent, 'workPackage', ['WorkPackage'])\n .addSpecificFieldType('TimeEntry', HoursDurationEditFieldComponent, 'hours', ['hours'])\n .addSpecificFieldType('WorkPackage', HoursDurationEditFieldComponent, 'remainingTime', ['remainingTime']);\n\n selectAutocompleterRegisterService.register(VersionAutocompleterComponent, 'Version');\n selectAutocompleterRegisterService.register(WorkPackageAutocompleterComponent, '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 { DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\n\nexport class TextDisplayField extends DisplayField {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\n\nexport class FloatDisplayField extends DisplayField {\n public get valueString():string {\n if (this.value == null) {\n return '';\n }\n\n return this.value.toLocaleString(\n this.I18n.locale,\n { useGrouping: true, maximumFractionDigits: 20 },\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\n\nexport class IntegerDisplayField extends DisplayField {\n public get value() {\n return parseInt(this.resource[this.name]);\n }\n\n public isEmpty():boolean {\n return isNaN(this.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 { DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\n\nexport class ResourceDisplayField extends DisplayField {\n public get value() {\n if (this.schema) {\n return this.attribute && this.attribute.name;\n }\n return 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\nexport class ExpressionService {\n // This is what returned by rails-angular-xss when it discovers double open curly braces\n // See https://github.com/opf/rails-angular-xss for more information.\n public static get UNESCAPED_EXPRESSION() {\n return '{{';\n }\n\n public static get ESCAPED_EXPRESSION() {\n return '{{ \\\\$root\\\\.DOUBLE_LEFT_CURLY_BRACE }}';\n }\n\n public static escape(input:string) {\n return input.replace(new RegExp(this.UNESCAPED_EXPRESSION, 'g'), this.ESCAPED_EXPRESSION);\n }\n\n public static unescape(input:string) {\n return input.replace(new RegExp(this.ESCAPED_EXPRESSION, 'g'), this.UNESCAPED_EXPRESSION);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { ApplicationRef } from '@angular/core';\nimport { DynamicBootstrapper } from 'core-app/core/setup/globals/dynamic-bootstrapper';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ExpressionService } from 'core-app/core/expression/expression.service';\n\nexport class FormattableDisplayField extends DisplayField {\n @InjectField() readonly appRef:ApplicationRef;\n\n public render(element:HTMLElement, displayText:string, options:any = {}):void {\n const div = document.createElement('div');\n\n div.classList.add(\n 'read-value--html',\n 'highlight',\n 'op-uc-container',\n 'op-uc-container_reduced-headings',\n '-multiline',\n );\n if (options.rtl) {\n div.classList.add('-rtl');\n }\n\n div.innerHTML = displayText;\n\n element.innerHTML = '';\n element.appendChild(div);\n\n // Allow embeddable rendered content\n DynamicBootstrapper.bootstrapOptionalEmbeddable(this.appRef, div);\n }\n\n get placeholder():string {\n if (this.name === 'description') {\n return this.I18n.t('js.placeholders.description');\n }\n\n return super.placeholder;\n }\n\n public get isFormattable():boolean {\n return true;\n }\n\n public get value() {\n if (!this.schema) {\n return null;\n }\n const element = this.resource[this.name];\n if (!(element && element.html)) {\n return '';\n }\n\n return this.unescape(element.html);\n }\n\n // Escape the given HTML string from the backend, which contains escaped Angular expressions.\n // Since formattable fields are only binded to but never evaluated, we can safely remove these expressions.\n protected unescape(html:string) {\n if (html) {\n return ExpressionService.unescape(html);\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 { DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\n\nexport class DateTimeDisplayField extends DisplayField {\n @InjectField() timezoneService:TimezoneService;\n\n public get valueString() {\n if (this.value) {\n return this.timezoneService.formattedDatetime(this.value);\n }\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 { DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\n\nexport class BooleanDisplayField extends DisplayField {\n public get valueString() {\n return this.translatedValue();\n }\n\n public get placeholder() {\n return this.translatedValue();\n }\n\n public translatedValue() {\n if (this.value) {\n return this.I18n.t('js.general_text_yes');\n }\n return this.I18n.t('js.general_text_no');\n }\n\n public isEmpty():boolean {\n // We treat an empty value the same as if the user had set\n // the value to false;\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 { DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\n\nexport class WorkPackageDisplayField extends DisplayField {\n public text = {\n none: this.I18n.t('js.filter.noneElement'),\n };\n\n public get value() {\n return this.resource[this.name];\n }\n\n public get title() {\n if (this.isEmpty()) {\n return this.text.none;\n }\n return this.value.name;\n }\n\n public get wpId() {\n if (this.isEmpty()) {\n return null;\n }\n\n if (this.value.$loaded) {\n return this.value.id;\n }\n\n // Read WP ID from href\n return this.value.href.match(/(\\d+)$/)[0];\n }\n\n public get valueString() {\n // cannot display the type name easily here as it may not be loaded\n return `#${this.wpId} ${this.title}`;\n }\n\n public isEmpty():boolean {\n return !this.value;\n }\n\n public get unknownAttribute():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 { DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\n\nexport class EstimatedTimeDisplayField extends DisplayField {\n @InjectField() timezoneService:TimezoneService;\n\n private derivedText = this.I18n.t('js.label_value_derived_from_children');\n\n public get valueString():string {\n return this.timezoneService.formattedDuration(this.value);\n }\n\n /**\n * Duration fields may have an additional derived value\n */\n public get derivedPropertyName():string {\n return `derived${this.name.charAt(0).toUpperCase()}${this.name.slice(1)}`;\n }\n\n public get derivedValue():string|null {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return this.resource[this.derivedPropertyName] as string|null;\n }\n\n public get derivedValueString():string {\n const value = this.derivedValue;\n\n if (value) {\n return this.timezoneService.formattedDuration(value);\n }\n return this.placeholder;\n }\n\n public render(element:HTMLElement, displayText:string):void {\n if (this.isEmpty()) {\n element.textContent = this.placeholder;\n return;\n }\n\n element.classList.add('split-time-field');\n if (this.value) {\n this.renderActual(element, displayText);\n }\n\n const derived = this.derivedValue;\n if (derived && this.timezoneService.toHours(derived) !== 0) {\n this.renderDerived(element, this.derivedValueString, !!this.value);\n }\n }\n\n public renderActual(element:HTMLElement, displayText:string):void {\n const span = document.createElement('span');\n\n span.textContent = displayText;\n span.title = this.valueString;\n span.classList.add('-actual-value');\n\n element.appendChild(span);\n }\n\n public renderDerived(element:HTMLElement, displayText:string, actualPresent:boolean):void {\n const span = document.createElement('span');\n\n span.setAttribute('title', this.texts.empty);\n span.textContent = `(${actualPresent ? '+' : ''}${displayText})`;\n span.title = `${this.derivedValueString} ${this.derivedText}`;\n span.classList.add('-derived-value');\n\n if (actualPresent) {\n span.classList.add('-with-actual-value');\n }\n\n element.appendChild(span);\n }\n\n public get title():string|null {\n return null; // we want to render separate titles ourselves\n }\n\n public isEmpty():boolean {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { value } = this;\n const derived = this.derivedValue;\n\n return !value && !derived;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport * as URI from 'urijs';\nimport { TimeEntryCreateService } from 'core-app/shared/components/time_entries/create/create.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { EstimatedTimeDisplayField } from 'core-app/shared/components/fields/display/field-types/estimated-time-display-field.module';\nimport * as moment from 'moment-timezone';\n\nexport class WorkPackageSpentTimeDisplayField extends EstimatedTimeDisplayField {\n public text = {\n linkTitle: this.I18n.t('js.work_packages.message_view_spent_time'),\n logTime: this.I18n.t('js.button_log_time'),\n };\n\n @InjectField() PathHelper:PathHelperService;\n\n @InjectField(TimeEntryCreateService, null) timeEntryCreateService:TimeEntryCreateService;\n\n @InjectField() apiV3Service:ApiV3Service;\n\n public render(element:HTMLElement, displayText:string):void {\n if (!this.value) {\n return;\n }\n\n const link = document.createElement('a');\n link.textContent = displayText;\n link.setAttribute('title', this.text.linkTitle);\n\n if (displayText === this.placeholder) {\n link.setAttribute('class', 'time-logging--value time-logging--value_empty');\n } else {\n link.setAttribute('class', 'time-logging--value');\n }\n\n if (this.resource.project) {\n const wpID = this.resource.id.toString();\n this\n .apiV3Service\n .projects\n .id(this.resource.project)\n .get()\n .subscribe((project:ProjectResource) => {\n // Link to the cost report having the work package filter preselected. No grouping.\n const href = URI(this.PathHelper.projectTimeEntriesPath(project.identifier))\n .search(`fields[]=WorkPackageId&operators[WorkPackageId]=%3D&values[WorkPackageId]=${wpID}&set_filter=1`)\n .toString();\n\n link.href = href;\n });\n }\n\n element.innerHTML = '';\n element.appendChild(link);\n\n this.appendTimelogLink(element);\n }\n\n private appendTimelogLink(element:HTMLElement) {\n if (this.timeEntryCreateService && this.resource.logTime) {\n const timelogElement = document.createElement('a');\n timelogElement.setAttribute('class', 'icon icon-time');\n timelogElement.setAttribute('href', '');\n timelogElement.setAttribute('title', this.text.logTime);\n\n element.appendChild(timelogElement);\n\n timelogElement.addEventListener('click', this.showTimelogWidget.bind(this, this.resource));\n }\n }\n\n private showTimelogWidget(wp:WorkPackageResource) {\n this.timeEntryCreateService\n .create(moment(new Date()), wp, { showWorkPackageField: false })\n .catch(() => {\n // do nothing, the user closed without changes\n });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 isNewResource from 'core-app/features/hal/helpers/is-new-resource';\n\nexport class IdDisplayField extends DisplayField {\n public text = {\n linkTitle: this.I18n.t('js.work_packages.message_successful_show_in_fullscreen'),\n };\n\n public get value() {\n if (isNewResource(this.resource)) {\n return null;\n }\n return this.resource[this.name];\n }\n\n public render(element:HTMLElement, displayText:string):void {\n if (!this.value) {\n return;\n }\n element.textContent = displayText;\n }\n\n public isEmpty():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 { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\nimport { HighlightableDisplayField } from 'core-app/shared/components/fields/display/field-types/highlightable-display-field.module';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport class HighlightedResourceDisplayField extends HighlightableDisplayField {\n public render(element:HTMLElement, displayText:string):void {\n super.render(element, displayText);\n\n if (this.shouldHighlight) {\n this.addHighlight(element);\n }\n }\n\n public get value() {\n if (this.schema) {\n return this.attribute && this.attribute.name;\n }\n return null;\n }\n\n private addHighlight(element:HTMLElement):void {\n if (this.attribute instanceof HalResource) {\n const hlClass = Highlighting.inlineClass(this.name, this.attribute.id!);\n element.classList.add(hlClass);\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HighlightedResourceDisplayField } from 'core-app/shared/components/fields/display/field-types/highlighted-resource-display-field.module';\n\nexport class TypeDisplayField extends HighlightedResourceDisplayField {\n // Type will always be highlighted\n public get shouldHighlight() {\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 { DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { PrincipalRendererService } from 'core-app/shared/components/principal/principal-renderer.service';\n\nexport class UserDisplayField extends DisplayField {\n @InjectField() principalRenderer:PrincipalRendererService;\n\n public get value() {\n if (this.schema) {\n return this.attribute && this.attribute.name;\n }\n return null;\n }\n\n public render(element:HTMLElement, displayText:string):void {\n if (this.placeholder === displayText) {\n this.renderEmpty(element);\n } else {\n this.principalRenderer.render(\n element,\n this.attribute,\n { hide: false, link: false },\n { hide: false, size: 'medium' },\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 { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { PrincipalRendererService } from 'core-app/shared/components/principal/principal-renderer.service';\nimport { cssClassCustomOption } from 'core-app/shared/components/fields/display/display-field.module';\nimport { ResourcesDisplayField } from './resources-display-field.module';\n\nexport class MultipleUserFieldModule extends ResourcesDisplayField {\n @InjectField() principalRenderer:PrincipalRendererService;\n\n public render(element:HTMLElement, displayText:string):void {\n const names = this.value;\n element.innerHTML = '';\n element.setAttribute('title', names.join(', '));\n\n if (names.length === 0) {\n this.renderEmpty(element);\n } else {\n this.renderValues(this.attribute, element);\n }\n }\n\n /**\n * Renders at most the first two values, followed by a badge indicating\n * the total count.\n */\n protected renderValues(values:UserResource[], element:HTMLElement) {\n const content = document.createDocumentFragment();\n const divContainer = document.createElement('div');\n divContainer.classList.add(cssClassCustomOption);\n content.appendChild(divContainer);\n\n this.renderAbridgedValues(divContainer, values);\n\n if (values.length > 2) {\n const dots = document.createElement('span');\n dots.innerHTML = '... ';\n divContainer.appendChild(dots);\n\n const badge = this.optionDiv(values.length.toString(), 'badge', '-secondary');\n content.appendChild(badge);\n }\n\n element.appendChild(content);\n }\n\n public renderAbridgedValues(element:HTMLElement, values:UserResource[]) {\n const valueForDisplay = _.take(values, 2);\n this.principalRenderer.renderMultiple(\n element,\n valueForDisplay,\n { hide: false, link: false },\n { hide: false, size: 'medium' },\n 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 { KeepTabService } from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\nimport { StateService } from '@uirouter/core';\nimport { UiStateLinkBuilder } from 'core-app/features/work-packages/components/wp-fast-table/builders/ui-state-link-builder';\nimport { IdDisplayField } from 'core-app/shared/components/fields/display/field-types/id-display-field.module';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class WorkPackageIdDisplayField extends IdDisplayField {\n @InjectField() $state!:StateService;\n\n @InjectField() keepTab!:KeepTabService;\n\n private uiStateBuilder:UiStateLinkBuilder = new UiStateLinkBuilder(this.$state, this.keepTab);\n\n public render(element:HTMLElement, displayText:string):void {\n if (!this.value) {\n return;\n }\n const link = this.uiStateBuilder.linkToShow(\n this.value,\n displayText,\n this.value,\n );\n\n element.appendChild(link);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 {\n projectStatusCodeCssClass,\n projectStatusI18n,\n} from 'core-app/shared/components/fields/helpers/project-status-helper';\n\nexport class ProjectStatusDisplayField extends DisplayField {\n public render(element:HTMLElement, displayText:string):void {\n const code = this.value && this.value.id;\n\n const bulb = document.createElement('span');\n bulb.classList.add('project-status--bulb', projectStatusCodeCssClass(code));\n\n const name = document.createElement('span');\n name.classList.add('project-status--name', projectStatusCodeCssClass(code));\n name.textContent = projectStatusI18n(code, this.I18n);\n\n element.innerHTML = '';\n element.appendChild(bulb);\n element.appendChild(name);\n\n if (this.writable) {\n const pulldown = document.createElement('span');\n pulldown.classList.add('project-status--pulldown-icon', 'icon', 'icon-pulldown');\n\n element.appendChild(pulldown);\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\n\nexport class PlainFormattableDisplayField extends DisplayField {\n public get value() {\n if (!this.schema) {\n return null;\n }\n const element = this.resource[this.name];\n\n return element && element.raw || '';\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { 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 { WorkPackageDisplayField } from 'core-app/shared/components/fields/display/field-types/work-package-display-field.module';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\nexport class LinkedWorkPackageDisplayField extends WorkPackageDisplayField {\n public text = {\n linkTitle: this.I18n.t('js.work_packages.message_successful_show_in_fullscreen'),\n none: this.I18n.t('js.filter.noneElement'),\n };\n\n @InjectField() $state!:StateService;\n\n @InjectField() keepTab!:KeepTabService;\n\n private uiStateBuilder:UiStateLinkBuilder = new UiStateLinkBuilder(this.$state, this.keepTab);\n\n public render(element:HTMLElement, displayText:string):void {\n if (this.isEmpty()) {\n element.innerText = this.placeholder;\n return;\n }\n\n const link = this.uiStateBuilder.linkToShow(\n this.wpId,\n this.text.linkTitle,\n this.valueString,\n );\n\n const title = document.createElement('span');\n title.textContent = ` ${_.truncate(this.title, { length: 40 })}`;\n\n element.innerHTML = '';\n element.appendChild(link);\n element.appendChild(title);\n }\n\n public get writable():boolean {\n return false;\n }\n\n public get valueString() {\n return `#${this.wpId}`;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { TimezoneService } from 'core-app/core/datetime/timezone.service';\n\nexport class DaysDurationDisplayField extends DisplayField {\n @InjectField() timezoneService:TimezoneService;\n\n public get valueString() {\n return this.timezoneService.formattedDuration(this.value, 'days');\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { DisplayFieldService } from 'core-app/shared/components/fields/display/display-field.service';\nimport { TextDisplayField } from 'core-app/shared/components/fields/display/field-types/text-display-field.module';\nimport { FloatDisplayField } from 'core-app/shared/components/fields/display/field-types/float-display-field.module';\nimport { IntegerDisplayField } from 'core-app/shared/components/fields/display/field-types/integer-display-field.module';\nimport { ResourceDisplayField } from 'core-app/shared/components/fields/display/field-types/resource-display-field.module';\nimport { ResourcesDisplayField } from 'core-app/shared/components/fields/display/field-types/resources-display-field.module';\nimport { FormattableDisplayField } from 'core-app/shared/components/fields/display/field-types/formattable-display-field.module';\nimport { DateDisplayField } from 'core-app/shared/components/fields/display/field-types/date-display-field.module';\nimport { DateTimeDisplayField } from 'core-app/shared/components/fields/display/field-types/datetime-display-field.module';\nimport { BooleanDisplayField } from 'core-app/shared/components/fields/display/field-types/boolean-display-field.module';\nimport { ProgressDisplayField } from 'core-app/shared/components/fields/display/field-types/progress-display-field.module';\nimport { WorkPackageDisplayField } from 'core-app/shared/components/fields/display/field-types/work-package-display-field.module';\nimport { WorkPackageSpentTimeDisplayField } from 'core-app/shared/components/fields/display/field-types/wp-spent-time-display-field.module';\nimport { IdDisplayField } from 'core-app/shared/components/fields/display/field-types/id-display-field.module';\nimport { HighlightedResourceDisplayField } from 'core-app/shared/components/fields/display/field-types/highlighted-resource-display-field.module';\nimport { TypeDisplayField } from 'core-app/shared/components/fields/display/field-types/type-display-field.module';\nimport { UserDisplayField } from 'core-app/shared/components/fields/display/field-types/user-display-field.module';\nimport { MultipleUserFieldModule } from 'core-app/shared/components/fields/display/field-types/multiple-user-display-field.module';\nimport { WorkPackageIdDisplayField } from 'core-app/shared/components/fields/display/field-types/wp-id-display-field.module';\nimport { ProjectStatusDisplayField } from 'core-app/shared/components/fields/display/field-types/project-status-display-field.module';\nimport { PlainFormattableDisplayField } from 'core-app/shared/components/fields/display/field-types/plain-formattable-display-field.module';\nimport { LinkedWorkPackageDisplayField } from 'core-app/shared/components/fields/display/field-types/linked-work-package-display-field.module';\nimport { CombinedDateDisplayField } from 'core-app/shared/components/fields/display/field-types/combined-date-display.field';\nimport { EstimatedTimeDisplayField } from 'core-app/shared/components/fields/display/field-types/estimated-time-display-field.module';\nimport { DaysDurationDisplayField } from 'core-app/shared/components/fields/display/field-types/days-duration-display-field.module';\n\nexport function initializeCoreDisplayFields(displayFieldService:DisplayFieldService) {\n return () => {\n displayFieldService.defaultFieldType = 'text';\n displayFieldService\n .addFieldType(TextDisplayField, 'text', ['String'])\n .addFieldType(FloatDisplayField, 'float', ['Float'])\n .addFieldType(IntegerDisplayField, 'integer', ['Integer'])\n .addFieldType(HighlightedResourceDisplayField, 'highlight', [\n 'Status',\n 'Priority',\n ])\n .addFieldType(TypeDisplayField, 'type', ['Type'])\n .addFieldType(ResourceDisplayField, 'resource', [\n 'Project',\n 'TimeEntriesActivity',\n 'Version',\n 'Category',\n 'CustomOption'])\n .addFieldType(ResourcesDisplayField, 'resources', ['[]CustomOption'])\n .addFieldType(ResourcesDisplayField, 'resources', ['[]Version'])\n .addFieldType(MultipleUserFieldModule, 'users', ['[]User'])\n .addFieldType(FormattableDisplayField, 'formattable', ['Formattable'])\n .addFieldType(DaysDurationDisplayField, 'duration', ['duration'])\n .addFieldType(EstimatedTimeDisplayField, 'remainingTime', ['remainingTime'])\n .addFieldType(EstimatedTimeDisplayField, 'estimatedTime', ['estimatedTime'])\n .addFieldType(DateDisplayField, 'date', ['Date'])\n .addFieldType(DateTimeDisplayField, 'datetime', ['DateTime'])\n .addFieldType(BooleanDisplayField, 'boolean', ['Boolean'])\n .addFieldType(ProgressDisplayField, 'progress', ['percentageDone'])\n .addFieldType(LinkedWorkPackageDisplayField, 'work_package', ['WorkPackage'])\n .addFieldType(IdDisplayField, 'id', ['id'])\n .addFieldType(UserDisplayField, 'user', ['User']);\n\n displayFieldService\n .addSpecificFieldType('WorkPackage', WorkPackageIdDisplayField, 'id', ['id'])\n .addSpecificFieldType('WorkPackage', WorkPackageSpentTimeDisplayField, 'spentTime', ['spentTime'])\n .addSpecificFieldType('WorkPackage', CombinedDateDisplayField, 'combinedDate', ['combinedDate'])\n .addSpecificFieldType('TimeEntry', PlainFormattableDisplayField, 'comment', ['comment'])\n .addSpecificFieldType('Project', ProjectStatusDisplayField, 'status', ['status'])\n .addSpecificFieldType('TimeEntry', WorkPackageDisplayField, 'work_package', ['workPackage']);\n };\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BooleanEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/boolean-edit-field/boolean-edit-field.component';\n\n@NgModule({\n declarations: [\n BooleanEditFieldComponent,\n ],\n imports: [\n CommonModule,\n ],\n exports: [\n BooleanEditFieldComponent,\n ],\n})\nexport class BooleanEditFieldModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IntegerEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/integer-edit-field/integer-edit-field.component';\nimport { FormsModule } from '@angular/forms';\n\n@NgModule({\n declarations: [\n IntegerEditFieldComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n ],\n exports: [\n IntegerEditFieldComponent,\n ],\n})\nexport class IntegerEditFieldModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { TextEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/text-edit-field/text-edit-field.component';\nimport { FocusModule } from 'core-app/shared/directives/focus/focus.module';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n FocusModule,\n ],\n declarations: [\n TextEditFieldComponent,\n ],\n exports: [\n TextEditFieldComponent,\n ],\n})\nexport class TextEditFieldModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DateEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/date-edit-field/date-edit-field.component';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\n\n@NgModule({\n imports: [\n CommonModule,\n OpSharedModule,\n ],\n declarations: [\n DateEditFieldComponent,\n ],\n exports: [\n DateEditFieldComponent,\n ],\n})\nexport class DateEditFieldModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SelectEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/select-edit-field/select-edit-field.component';\nimport { DynamicModule } from 'ng-dynamic-component';\n\n@NgModule({\n imports: [\n CommonModule,\n DynamicModule,\n ],\n declarations: [\n SelectEditFieldComponent,\n ],\n exports: [\n SelectEditFieldComponent,\n ],\n})\nexport class SelectEditFieldModule { }\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { APP_INITIALIZER, Injector, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport { OpenprojectEditorModule } from 'core-app/shared/components/editor/openproject-editor.module';\nimport { OpenprojectAttachmentsModule } from 'core-app/shared/components/attachments/openproject-attachments.module';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { OpSpotModule } from 'core-app/spot/spot.module';\nimport { AttributeHelpTextModule } from 'core-app/shared/components/attribute-help-texts/attribute-help-text.module';\nimport { EditFieldService } from 'core-app/shared/components/fields/edit/edit-field.service';\nimport { DisplayFieldService } from 'core-app/shared/components/fields/display/display-field.service';\nimport { initializeCoreEditFields } from 'core-app/shared/components/fields/edit/edit-field.initializer';\nimport { initializeCoreDisplayFields } from 'core-app/shared/components/fields/display/display-field.initializer';\nimport { FloatEditFieldComponent } from 'core-app/shared/components/fields/edit/field-types/float-edit-field.component';\nimport {\n MultiSelectEditFieldComponent,\n} from 'core-app/shared/components/fields/edit/field-types/multi-select-edit-field.component';\nimport {\n EditFormPortalComponent,\n} from 'core-app/shared/components/fields/edit/editing-portal/edit-form-portal.component';\nimport {\n SelectAutocompleterRegisterService,\n} from 'core-app/shared/components/fields/edit/field-types/select-edit-field/select-autocompleter-register.service';\nimport { EditFormComponent } from 'core-app/shared/components/fields/edit/edit-form/edit-form.component';\nimport {\n WorkPackageEditFieldComponent,\n} from 'core-app/shared/components/fields/edit/field-types/work-package-edit-field.component';\nimport {\n EditableAttributeFieldComponent,\n} from 'core-app/shared/components/fields/edit/field/editable-attribute-field.component';\nimport {\n ProjectStatusEditFieldComponent,\n} from 'core-app/shared/components/fields/edit/field-types/project-status-edit-field.component';\nimport {\n PlainFormattableEditFieldComponent,\n} from 'core-app/shared/components/fields/edit/field-types/plain-formattable-edit-field.component';\nimport {\n TimeEntryWorkPackageEditFieldComponent,\n} from 'core-app/shared/components/fields/edit/field-types/te-work-package-edit-field.component';\nimport { AttributeValueMacroComponent } from 'core-app/shared/components/fields/macros/attribute-value-macro.component';\nimport { AttributeLabelMacroComponent } from 'core-app/shared/components/fields/macros/attribute-label-macro.component';\nimport {\n WorkPackageQuickinfoMacroComponent,\n} from 'core-app/shared/components/fields/macros/work-package-quickinfo-macro.component';\nimport { DisplayFieldComponent } from 'core-app/shared/components/fields/display/display-field.component';\nimport {\n OpenprojectAutocompleterModule,\n} from 'core-app/shared/components/autocompleter/openproject-autocompleter.module';\nimport {\n BooleanEditFieldModule,\n} from 'core-app/shared/components/fields/edit/field-types/boolean-edit-field/boolean-edit-field.module';\nimport {\n IntegerEditFieldModule,\n} from 'core-app/shared/components/fields/edit/field-types/integer-edit-field/integer-edit-field.module';\nimport {\n TextEditFieldModule,\n} from 'core-app/shared/components/fields/edit/field-types/text-edit-field/text-edit-field.module';\nimport {\n DateEditFieldModule,\n} from 'core-app/shared/components/fields/edit/field-types/date-edit-field/date-edit-field.module';\nimport {\n SelectEditFieldModule,\n} from 'core-app/shared/components/fields/edit/field-types/select-edit-field/select-edit-field.module';\nimport {\n FormattableEditFieldModule,\n} from 'core-app/shared/components/fields/edit/field-types/formattable-edit-field/formattable-edit-field.module';\nimport {\n EditFieldControlsModule,\n} from 'core-app/shared/components/fields/edit/field-controls/edit-field-controls.module';\nimport { ProjectEditFieldComponent } from './edit/field-types/project-edit-field.component';\nimport {\n HoursDurationEditFieldComponent,\n} from 'core-app/shared/components/fields/edit/field-types/hours-duration-edit-field.component';\nimport { UserEditFieldComponent } from './edit/field-types/user-edit-field.component';\nimport {\n DaysDurationEditFieldComponent,\n} from 'core-app/shared/components/fields/edit/field-types/days-duration-edit-field.component';\nimport { CombinedDateEditFieldComponent } from './edit/field-types/combined-date-edit-field.component';\nimport { NgSelectModule } from '@ng-select/ng-select';\nimport { FormsModule } from '@angular/forms';\n\n@NgModule({\n imports: [\n CommonModule,\n OpSharedModule,\n OpSpotModule,\n FormsModule,\n NgSelectModule,\n OpenprojectAttachmentsModule,\n OpenprojectEditorModule,\n OpenprojectModalModule,\n OpenprojectAutocompleterModule,\n AttributeHelpTextModule,\n // Input Modules\n BooleanEditFieldModule,\n IntegerEditFieldModule,\n TextEditFieldModule,\n DateEditFieldModule,\n SelectEditFieldModule,\n FormattableEditFieldModule,\n EditFieldControlsModule,\n ],\n exports: [\n EditFormPortalComponent,\n EditFormComponent,\n EditableAttributeFieldComponent,\n ],\n providers: [\n {\n provide: APP_INITIALIZER,\n useFactory: initializeCoreEditFields,\n deps: [EditFieldService, SelectAutocompleterRegisterService],\n multi: true,\n },\n {\n provide: APP_INITIALIZER,\n useFactory: initializeCoreDisplayFields,\n deps: [DisplayFieldService],\n multi: true,\n },\n ],\n declarations: [\n EditFormPortalComponent,\n HoursDurationEditFieldComponent,\n DaysDurationEditFieldComponent,\n FloatEditFieldComponent,\n PlainFormattableEditFieldComponent,\n MultiSelectEditFieldComponent,\n CombinedDateEditFieldComponent,\n ProjectEditFieldComponent,\n UserEditFieldComponent,\n WorkPackageEditFieldComponent,\n TimeEntryWorkPackageEditFieldComponent,\n EditFormComponent,\n DisplayFieldComponent,\n EditableAttributeFieldComponent,\n ProjectStatusEditFieldComponent,\n AttributeValueMacroComponent,\n AttributeLabelMacroComponent,\n\n WorkPackageQuickinfoMacroComponent,\n ],\n})\nexport class OpenprojectFieldsModule {\n constructor(injector:Injector) {\n }\n}\n","import { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\nimport { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\n\nexport class WidgetChangeset extends ResourceChangeset {\n\n}\n","import {\n Directive, EventEmitter, HostBinding, Injector, Input, Output,\n} from '@angular/core';\nimport { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WidgetChangeset } from 'core-app/shared/components/grids/widgets/widget-changeset';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\n@Directive()\nexport abstract class AbstractWidgetComponent extends UntilDestroyedMixin {\n @HostBinding('style.grid-column-start') gridColumnStart:number;\n\n @HostBinding('style.grid-column-end') gridColumnEnd:number;\n\n @HostBinding('style.grid-row-start') gridRowStart:number;\n\n @HostBinding('style.grid-row-end') gridRowEnd:number;\n\n @Input() resource:GridWidgetResource;\n\n @Output() resourceChanged = new EventEmitter();\n\n public get widgetName():string {\n const editableName = this.resource?.options.name as string;\n const widgetIdentifier = this.resource?.identifier;\n\n if (this.isEditable) {\n return editableName;\n }\n return this.i18n.t(\n `js.grid.widgets.${widgetIdentifier}.title`,\n { defaultValue: editableName },\n );\n }\n\n public renameWidget(name:string) {\n const changeset = this.setChangesetOptions({ name });\n\n this.resourceChanged.emit(changeset);\n }\n\n /**\n * By default, all widget titles are editable by the user.\n * We arbitrarily restrict this for some resources however,\n * whose component classes will set this to false.\n */\n public get isEditable() {\n return true;\n }\n\n constructor(protected i18n:I18nService,\n protected injector:Injector) {\n super();\n }\n\n protected setChangesetOptions(values:{ [key:string]:unknown; }) {\n const changeset = new WidgetChangeset(this.resource);\n\n changeset.setValue('options', { ...this.resource.options, ...values });\n\n return changeset;\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 { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n Component, ElementRef, OnInit, ViewChild,\n} from '@angular/core';\nimport {\n HideSectionDefinition,\n HideSectionService,\n} from 'core-app/shared/components/hide-section/hide-section.service';\nimport { trackByProperty } from 'core-app/shared/helpers/angular/tracking-functions';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\nexport const addSectionDropdownSelector = 'add-section-dropdown';\n\n@Component({\n selector: addSectionDropdownSelector,\n templateUrl: './add-section-dropdown.component.html',\n})\nexport class AddSectionDropdownComponent extends UntilDestroyedMixin implements OnInit {\n @ViewChild('fallbackOption', { static: true }) private option:ElementRef;\n\n trackByKey = trackByProperty('key');\n\n selectable:HideSectionDefinition[] = [];\n\n active:string[] = [];\n\n public htmlId:string;\n\n public placeholder = this.I18n.t('js.placeholders.selection');\n\n constructor(protected hideSectionService:HideSectionService,\n protected elementRef:ElementRef,\n protected I18n:I18nService) {\n super();\n }\n\n ngOnInit():void {\n this.htmlId = this.elementRef.nativeElement.dataset.htmlId;\n\n this.hideSectionService\n .displayed\n .values$()\n .pipe(\n this.untilDestroyed(),\n ).subscribe((displayed) => {\n this.selectable = this.hideSectionService.all\n .filter((el) => displayed.indexOf(el.key) === -1)\n .sort((a, b) => a.label.localeCompare(b.label));\n\n (this.option.nativeElement as HTMLOptionElement).selected = true;\n });\n }\n\n show(value:string) {\n this.hideSectionService.show(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 { Component, ElementRef, OnInit } from '@angular/core';\nimport { HideSectionService } from 'core-app/shared/components/hide-section/hide-section.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\nexport const hideSectionLinkSelector = 'hide-section-link';\n\n@Component({\n selector: hideSectionLinkSelector,\n templateUrl: './hide-section-link.component.html',\n})\nexport class HideSectionLinkComponent implements OnInit {\n displayed = true;\n\n public sectionName:string;\n\n text = {\n remove: this.I18n.t('js.label_remove'),\n };\n\n constructor(protected elementRef:ElementRef,\n protected hideSectionService:HideSectionService,\n protected I18n:I18nService) {}\n\n ngOnInit():void {\n this.sectionName = this.elementRef.nativeElement.dataset.sectionName;\n }\n\n hideSection() {\n this.hideSectionService.hide(this.sectionName);\n return false;\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 { GonService } from 'core-app/core/gon/gon.service';\nimport { Injectable } from '@angular/core';\nimport { input } from '@openproject/reactivestates';\n\nexport interface HideSectionDefinition {\n key:string;\n label:string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class HideSectionService {\n public displayed = input();\n\n public all:HideSectionDefinition[] = [];\n\n constructor(Gon:GonService) {\n const sections:any = Gon.get('hideSections');\n this.all = sections.all;\n this.displayed.putValue(sections.active.map((el:HideSectionDefinition) => {\n this.toggleVisibility(el.key, true);\n return el.key;\n }));\n\n this.removeHiddenOnSubmit();\n }\n\n section(key:string):HTMLElement|null {\n return document.querySelector(`section.hide-section[data-section-name=\"${key}\"]`);\n }\n\n hide(key:string) {\n this.displayed.doModify((displayed) => displayed.filter((el) => el !== key));\n this.toggleVisibility(key, false);\n }\n\n show(key:string) {\n this.displayed.doModify((displayed) => [...displayed, key]);\n this.toggleVisibility(key, true);\n }\n\n private toggleVisibility(key:string, visible:boolean) {\n const section = this.section(key);\n\n if (section) {\n section.hidden = !visible;\n }\n }\n\n private removeHiddenOnSubmit() {\n jQuery(document.body)\n .on('submit', 'form', function (evt:any) {\n const form = jQuery(this);\n const sections = form.find('section.hide-section:hidden');\n\n if (form.data('hideSectionRemoved') || sections.length === 0) {\n return true;\n }\n\n form.data('hideSectionRemoved', true);\n sections.remove();\n form.trigger('submit');\n evt.preventDefault();\n return 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 { Component, ElementRef, OnInit } from '@angular/core';\nimport { HideSectionService } from './hide-section.service';\n\nexport const showSectionDropdownSelector = 'show-section-dropdown';\n\n@Component({\n selector: showSectionDropdownSelector,\n template: '',\n})\nexport class ShowSectionDropdownComponent implements OnInit {\n public optValue:string; // value of option for which hide-section should be visible\n\n public hideSecWithName:string; // section-name of hide-section\n\n constructor(private HideSection:HideSectionService,\n private elementRef:ElementRef) {\n }\n\n ngOnInit() {\n const element = jQuery(this.elementRef.nativeElement);\n this.optValue = element.data('optValue');\n this.hideSecWithName = element.data('hideSecWithName');\n\n const target = jQuery(this.elementRef.nativeElement).prev();\n target.on('change', (event) => {\n const selectedOption = jQuery('option:selected', event.target);\n\n if (selectedOption.val() !== this.optValue) {\n this.HideSection.hide(this.hideSecWithName);\n } else {\n this.HideSection.show(this.hideSecWithName);\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';\n\n@Component({\n selector: 'op-icon',\n host: { class: 'op-icon--wrapper' },\n template: `\n \n \n `,\n})\nexport class OpIconComponent {\n @Input('icon-classes') iconClasses:string;\n\n @Input('icon-title') iconTitle = '';\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { OpIconComponent } from './icon.component';\nimport {\n ShareAndroidIconComponent,\n XIconComponent,\n} from '@openproject/octicons-angular';\n\n@NgModule({\n imports: [\n CommonModule,\n\n ShareAndroidIconComponent,\n XIconComponent,\n ],\n declarations: [\n OpIconComponent,\n ],\n providers: [\n ],\n exports: [\n OpIconComponent,\n\n ShareAndroidIconComponent,\n XIconComponent,\n ],\n})\nexport class IconModule {}\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 EventEmitter,\n Input,\n Output,\n} from '@angular/core';\n\n@Component({\n selector: 'op-modal-banner',\n templateUrl: './modal-banner.component.html',\n styleUrls: ['./modal-banner.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OpModalBannerComponent {\n @Input() type:'info'|'warning' = 'info';\n\n @Input() title:string;\n\n @Input() subtitle:string;\n\n @Input() actionButton?:string;\n\n @Input() actionButtonClasses?:string;\n\n @Output() buttonClicked = new EventEmitter();\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 ComponentRef,\n ElementRef,\n ViewChild,\n} from '@angular/core';\nimport {\n CdkPortalOutlet,\n ComponentPortal,\n} from '@angular/cdk/portal';\nimport { combineLatest } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { ModalData, OpModalService } from 'core-app/shared/components/modal/modal.service';\n\nexport const opModalOverlaySelector = 'op-modal-overlay';\n\n@Component({\n selector: opModalOverlaySelector,\n templateUrl: './modal-overlay.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OpModalOverlayComponent {\n public notFullscreen = false;\n\n public portalOutlet:CdkPortalOutlet;\n\n @ViewChild(CdkPortalOutlet) set portalOutletContainer(v:CdkPortalOutlet) {\n // ViewChild reference may be undefined initially\n // due to ngIf\n if (v !== undefined) {\n this.portalOutlet = v;\n this.setupListener();\n }\n }\n\n @ViewChild('overlay', { static: true }) overlay:ElementRef;\n\n activeModalData$ = this.modalService.activeModalData$;\n\n activeModalInstance$ = this.modalService.activeModalInstance$;\n\n constructor(\n readonly modalService:OpModalService,\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n ) {}\n\n setupListener():void {\n combineLatest([\n this.activeModalInstance$,\n // multiple 'closing' events in a row are squashed\n this.activeModalData$.pipe(distinctUntilChanged()),\n ])\n .subscribe(([instance, data]) => {\n if (instance === null && data === null) {\n // do nothing\n return;\n }\n\n if (instance !== null && data === null) {\n this.detachPortalInstance();\n return;\n }\n\n if (instance === null && data !== null) {\n this.createAndAttachPortalInstance(data);\n }\n });\n }\n\n public close($event:MouseEvent, includeChildClicks = true):void {\n if (!includeChildClicks && $event.currentTarget !== $event.target) {\n return;\n }\n this.modalService.close();\n }\n\n private detachPortalInstance():void {\n const ref = (this.portalOutlet.attachedRef as ComponentRef);\n if (!ref) {\n return;\n }\n\n if (!ref.instance.onClose()) {\n return;\n }\n\n ref.instance.closingEvent.emit(ref.instance);\n this.portalOutlet.detach();\n this.modalService.activeModalInstance$.next(null);\n }\n\n private createAndAttachPortalInstance(data:ModalData):void {\n const { modal, injector, notFullscreen } = data;\n this.notFullscreen = notFullscreen;\n const portal = new ComponentPortal(modal, null, injector);\n const ref = this.portalOutlet.attach(portal);\n const instance = ref.instance;\n\n this.modalService.activeModalInstance$.next(instance);\n this.cdRef.detectChanges();\n\n // Focus on wrapper by default\n (this.overlay.nativeElement as HTMLElement).focus();\n\n // Focus on the first element\n instance && instance.onOpen();\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 { Inject, Injectable, Injector } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { DynamicContentModalComponent } from 'core-app/shared/components/modals/modal-wrapper/dynamic-content.modal';\n\nconst iframeSelector = '.iframe-target-wrapper';\n\n/**\n * This service takes modals that are rendered by the rails backend,\n * and re-renders them with the angular op-modal service\n */\n@Injectable({ providedIn: 'root' })\nexport class OpModalWrapperAugmentService {\n constructor(\n @Inject(DOCUMENT) protected documentElement:Document,\n protected injector:Injector,\n protected opModalService:OpModalService,\n ) {}\n\n /**\n * Create initial listeners for Rails-rendered modals\n */\n public setupListener() {\n const matches = this.documentElement.querySelectorAll('[data-augmented-model-wrapper]');\n for (let i = 0; i < matches.length; ++i) {\n this.wrapElement(jQuery(matches[i]) as JQuery);\n }\n }\n\n /**\n * Wrap a section[data-augmented-modal-wrapper] element\n */\n public wrapElement(element:JQuery) {\n // Find activation link\n const activationSelector = element.data('activationSelector') || '.modal-delivery-element--activation-link';\n const activationLink = jQuery(activationSelector);\n\n const initializeNow = element.data('modalInitializeNow');\n\n if (initializeNow) {\n this.show(element);\n } else {\n activationLink.click((evt:JQuery.TriggeredEvent) => {\n this.show(element);\n evt.preventDefault();\n });\n }\n }\n\n private show(element:JQuery) {\n // Set modal class name\n const modalClassName = element.data('modalClassName');\n // Append CSP-whitelisted IFrame for onboarding\n const iframeUrl = element.data('modalIframeUrl');\n\n // Set template from wrapped element\n const wrappedElement = element.find('.modal-delivery-element');\n let modalBody = wrappedElement.html();\n\n if (iframeUrl) {\n modalBody = this.appendIframe(wrappedElement, iframeUrl);\n }\n\n this.opModalService.show(\n DynamicContentModalComponent,\n this.injector,\n {\n modalBody,\n modalClassName,\n },\n );\n }\n\n private appendIframe(body:JQuery, url:string) {\n const iframe = jQuery('');\n iframe.attr('src', url);\n\n const iframeParent = body.find(iframeSelector);\n if (iframeParent.find('iframe').length > 0) {\n // Make sure we don't initialize the iframe multiple times\n return body.html();\n }\n\n iframeParent.append(iframe);\n\n return body.html();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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, ElementRef, EventEmitter, Inject, OnDestroy, OnInit,\n} from '@angular/core';\n\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { OpModalLocalsToken, OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { debounce } from 'lodash';\n\n@Directive()\nexport abstract class OpModalComponent extends UntilDestroyedMixin implements OnInit, OnDestroy {\n /* Reference to service */\n protected service:OpModalService = this.locals.service;\n\n public $element:HTMLElement;\n\n /** Closing event called from the service when closing this modal */\n public closingEvent = new EventEmitter();\n\n public openingEvent = new EventEmitter();\n\n /* Data to be return from this modal instance */\n public data:unknown;\n\n protected constructor(\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.$element = this.elementRef.nativeElement as HTMLElement;\n }\n\n ngOnDestroy():void {\n this.closingEvent.complete();\n this.openingEvent.complete();\n window.removeEventListener('resize', this.onResize);\n window.removeEventListener('orientationchange', this.onResize);\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 && this.afterFocusOn.focus();\n return true;\n }\n\n public closeMe(evt?:Event):void {\n this.service.close();\n\n if (evt) {\n evt.stopPropagation();\n evt.preventDefault();\n }\n }\n\n public onOpen():void {\n this.openingEvent.emit();\n this.updateAppHeight();\n this.cdRef.detectChanges();\n\n window.addEventListener('resize', this.onResize);\n window.addEventListener('orientationchange', this.onResize);\n }\n\n protected get afterFocusOn():HTMLElement {\n return this.$element;\n }\n\n private onResize = debounce(() => this.updateAppHeight(), 10);\n\n private updateAppHeight = () =>\n document\n .documentElement\n .style\n .setProperty('--app-height', `${window.innerHeight}px`);\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PortalModule } from '@angular/cdk/portal';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { FocusModule } from 'core-app/shared/directives/focus/focus.module';\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\nimport { OpModalWrapperAugmentService } from './modal-wrapper-augment.service';\nimport { OpModalBannerComponent } from 'core-app/shared/components/modal/modal-banner/modal-banner.component';\nimport { OpModalOverlayComponent } from 'core-app/shared/components/modal/modal-overlay.component';\n\n@NgModule({\n imports: [\n CommonModule,\n FocusModule,\n IconModule,\n PortalModule,\n A11yModule,\n ],\n exports: [\n OpModalOverlayComponent,\n OpModalBannerComponent,\n ],\n providers: [\n OpModalWrapperAugmentService,\n ],\n declarations: [\n OpModalBannerComponent,\n OpModalOverlayComponent,\n ],\n})\nexport class OpenprojectModalModule { }\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 InjectionToken,\n Injector,\n} from '@angular/core';\nimport { ComponentType, PortalInjector } from '@angular/cdk/portal';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { filter, take } from 'rxjs/operators';\n\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\n\nexport const OpModalLocalsToken = new InjectionToken('OP_MODAL_LOCALS');\n\nexport interface ModalData {\n modal:ComponentType;\n injector:Injector;\n notFullscreen:boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class OpModalService {\n public activeModalInstance$ = new BehaviorSubject(null);\n\n public activeModalData$ = new BehaviorSubject(null);\n\n constructor(\n private readonly injector:Injector,\n ) {\n // Listen to keystrokes on window to close context menus\n window.addEventListener('keydown', (evt:KeyboardEvent) => {\n if (evt.key !== 'Escape' || evt.defaultPrevented) {\n return;\n }\n\n this.close();\n });\n }\n\n /**\n * Open a Modal reference and append it to the portal\n *\n * @param modal The modal component class to show\n * @param injector The injector to pass into the component. Ensure this is the hierarchical injector if needed.\n * Can be passed 'global' to take the default (global!) injector of this service.\n * @param locals A map to be injected via token into the component.\n * @param notFullscreen\n */\n public show(\n modal:ComponentType,\n injector:Injector|'global',\n locals:Record = {},\n notFullscreen = false,\n ):Observable {\n this.close();\n\n // Allow users to pass the global injector when deliberately requested.\n if (injector === 'global') {\n injector = this.injector;\n }\n\n this.activeModalData$.next({\n modal,\n injector: this.injectorFor(injector, locals),\n notFullscreen,\n });\n\n return this.activeModalInstance$\n .pipe(\n filter((m) => m instanceof modal),\n take(1),\n ) as Observable;\n }\n\n /**\n * Closes currently open modal window\n */\n public close():void {\n this.activeModalData$.next(null);\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 private injectorFor(injector:Injector, data:Record) {\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(OpModalLocalsToken, data);\n\n return new PortalInjector(injector, injectorTokens);\n }\n}\n","\n
{{text.title}}
\n\n
\n\n
\n \n\n \n \n
    \n
  • \n {{data}}\n
  • \n
\n
\n\n \n \n
\n {{data}}\n \n
\n\n \n\n
\n\n
\n
\n \n \n {{text.button_cancel}}\n \n \n \n {{text.button_continue}}\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 Inject,\n} from '@angular/core';\n\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';\n\nexport interface ConfirmDialogOptions {\n text:{\n title:string;\n text:string;\n button_continue?:string;\n button_cancel?:string;\n };\n icon?:{\n continue?:string;\n cancel?:string;\n };\n closeByEscape?:boolean;\n showClose?:boolean;\n closeByDocument?:boolean;\n showListData?:boolean;\n refreshOnCancel?:boolean;\n listTitle?:string;\n warningText?:string;\n passedData?:string[];\n dangerHighlighting?:boolean;\n divideContent?:boolean;\n}\n\n@Component({\n templateUrl: './confirm-dialog.modal.html',\n styleUrls: ['./confirm-dialog.modal.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ConfirmDialogModalComponent extends OpModalComponent {\n public showClose:boolean;\n\n public showListData:boolean;\n\n public refreshOnCancel:boolean;\n\n public listTitle:string;\n\n public warningText:string;\n\n public divideContent:boolean;\n\n public confirmed = false;\n\n private options:ConfirmDialogOptions;\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 button_continue: this.I18n.t('js.button_continue'),\n button_cancel: this.I18n.t('js.button_cancel'),\n close_popup: this.I18n.t('js.close_popup_title'),\n };\n\n public icon = {\n continue: undefined,\n cancel: undefined,\n };\n\n public passedData:string[];\n\n public dangerHighlighting:boolean;\n\n constructor(\n readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n ) {\n super(locals, cdRef, elementRef);\n this.options = (locals.options || {}) as ConfirmDialogOptions;\n\n this.dangerHighlighting = _.defaultTo(this.options.dangerHighlighting, false);\n this.showListData = _.defaultTo(this.options.showListData, false);\n this.refreshOnCancel = _.defaultTo(this.options.refreshOnCancel, false);\n this.listTitle = _.defaultTo(this.options.listTitle, '');\n this.warningText = _.defaultTo(this.options.warningText, '');\n this.passedData = _.defaultTo(this.options.passedData, []);\n this.showClose = _.defaultTo(this.options.showClose, true);\n this.divideContent = _.defaultTo(this.options.divideContent, false);\n // override default texts and icons if any\n this.text = _.defaults(this.options.text, this.text);\n this.icon = _.defaults(this.options.icon, this.icon);\n }\n\n public confirmAndClose(evt:Event):void {\n this.confirmed = true;\n this.closeMe(evt);\n }\n\n public close(evt:Event):void {\n this.closeMe(evt);\n if (this.refreshOnCancel) {\n window.location.reload();\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ConfirmDialogModalComponent,\n ConfirmDialogOptions,\n} from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.modal';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport {\n Injectable,\n Injector,\n} from '@angular/core';\n\n@Injectable()\nexport class ConfirmDialogService {\n constructor(\n readonly opModalService:OpModalService,\n readonly injector:Injector,\n ) {\n document.addEventListener('submit', (evt:Event) => {\n const target = evt.target as HTMLFormElement;\n const options = target.dataset.augmentedConfirmDialog;\n if (options) {\n this.augmentFormSubmit(target, JSON.parse(options));\n\n evt.preventDefault();\n return false;\n }\n\n return true;\n });\n }\n\n /**\n * Confirm an action with an ng dialog with the given options\n */\n public confirm(options:ConfirmDialogOptions):Promise {\n return new Promise((resolve, reject) => {\n this.opModalService.show(\n ConfirmDialogModalComponent,\n this.injector,\n { options },\n ).subscribe((modal) => modal.closingEvent.subscribe(() => {\n if (modal.confirmed) {\n resolve();\n } else {\n reject();\n }\n }));\n });\n }\n\n /**\n * Augment a Rails form submit with a confirmation dialog\n *\n * @param target\n * @param options\n * @private\n */\n private augmentFormSubmit(target:HTMLFormElement, options:ConfirmDialogOptions) {\n void this\n .confirm(options)\n .then(() => {\n target.removeAttribute('data-augmented-confirm-dialog');\n target.submit();\n })\n .catch(() => undefined /* Dialog cancelled, nothing to do */);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { Injectable, Injector } from '@angular/core';\nimport { WpButtonMacroModalComponent } from 'core-app/shared/components/modals/editor/macro-wp-button-modal/wp-button-macro.modal';\nimport { WikiIncludePageMacroModalComponent } from 'core-app/shared/components/modals/editor/macro-wiki-include-page-modal/wiki-include-page-macro.modal';\nimport { CodeBlockMacroModalComponent } from 'core-app/shared/components/modals/editor/macro-code-block-modal/code-block-macro.modal';\nimport { ChildPagesMacroModalComponent } from 'core-app/shared/components/modals/editor/macro-child-pages-modal/child-pages-macro.modal';\n\n@Injectable()\nexport class EditorMacrosService {\n constructor(readonly opModalService:OpModalService,\n readonly injector:Injector) {\n }\n\n /**\n * Show a modal to edit the work package button macro settings.\n * Used from within ckeditor-augmented-textarea.\n */\n public configureWorkPackageButton(typeName?:string, classes?:string):Promise<{ type:string, classes:string }> {\n return new Promise<{ type:string, classes:string }>((resolve, reject) => {\n this.opModalService.show(\n WpButtonMacroModalComponent,\n this.injector,\n { type: typeName, classes },\n ).subscribe((modal) => modal.closingEvent.subscribe(() => {\n if (modal.changed) {\n resolve({ type: modal.type, classes: modal.classes });\n }\n }));\n });\n }\n\n /**\n * Show a modal to edit the wiki include macro.\n * Used from within ckeditor-augmented-textarea.\n */\n public configureWikiPageInclude(page:string):Promise {\n return new Promise((resolve, _) => {\n const pageValue = page || '';\n this.opModalService.show(\n WikiIncludePageMacroModalComponent,\n this.injector,\n { page: pageValue },\n ).subscribe((modal) => modal.closingEvent.subscribe(() => {\n if (modal.changed) {\n resolve(modal.page);\n }\n }));\n });\n }\n\n /**\n * Show a modal to show an enhanced code editor for editing code blocks.\n * Used from within ckeditor-augmented-textarea.\n */\n public editCodeBlock(content:string, languageClass:string):Promise<{ content:string, languageClass:string }> {\n return new Promise<{ content:string, languageClass:string }>((resolve, _) => {\n this.opModalService.show(\n CodeBlockMacroModalComponent,\n this.injector,\n { content, languageClass },\n ).subscribe((modal) => modal.closingEvent.subscribe(() => {\n if (modal.changed) {\n resolve({ languageClass: modal.languageClass, content: modal.content });\n }\n }));\n });\n }\n\n /**\n * Show a modal to edit the child pages macro.\n * Used from within ckeditor-augmented-textarea.\n */\n public configureChildPages(page:string, includeParent:string):Promise {\n return new Promise((resolve, _) => {\n this.opModalService.show(\n ChildPagesMacroModalComponent,\n this.injector,\n { page, includeParent },\n ).subscribe((modal) => modal.closingEvent.subscribe(() => {\n if (modal.changed) {\n resolve({\n page: modal.page,\n includeParent: modal.includeParent,\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, ChangeDetectorRef, Component, ElementRef, Inject, 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';\n\n@Component({\n templateUrl: './child-pages-macro.modal.html',\n})\nexport class ChildPagesMacroModalComponent extends OpModalComponent implements AfterViewInit {\n public changed = false;\n\n public showClose = true;\n\n public selectedPage:string;\n\n public selectedIncludeParent:boolean;\n\n public page = '';\n\n public includeParent = false;\n\n @ViewChild('selectedPageInput', { static: true }) selectedPageInput:ElementRef;\n\n public text:any = {\n title: this.I18n.t('js.editor.macro.child_pages.button'),\n hint: this.I18n.t('js.editor.macro.child_pages.hint'),\n page: this.I18n.t('js.editor.macro.child_pages.page'),\n include_parent: this.I18n.t('js.editor.macro.child_pages.include_parent'),\n button_save: this.I18n.t('js.button_save'),\n button_cancel: this.I18n.t('js.button_cancel'),\n close_popup: this.I18n.t('js.close_popup_title'),\n };\n\n constructor(readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService) {\n super(locals, cdRef, elementRef);\n this.selectedPage = this.page = this.locals.page;\n this.selectedIncludeParent = this.includeParent = this.locals.includeParent;\n\n // We could provide an autocompleter here to get correct page names\n }\n\n public applyAndClose(evt:Event):void {\n this.changed = true;\n this.page = this.selectedPage;\n this.includeParent = this.selectedIncludeParent;\n this.closeMe(evt);\n }\n\n ngAfterViewInit():void {\n this.selectedPageInput.nativeElement.focus();\n }\n\n updateIncludeParent(val:boolean):void {\n this.selectedIncludeParent = val;\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
\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, ChangeDetectorRef, Component, ElementRef, Inject, 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';\n\n@Component({\n templateUrl: './code-block-macro.modal.html',\n})\nexport class CodeBlockMacroModalComponent extends OpModalComponent implements AfterViewInit {\n public changed = false;\n\n public showClose = true;\n\n // Language class from markdown, something like 'language-ruby'\n public languageClass:string;\n\n // Language string, e.g, 'ruby'\n public _language = '';\n\n public content:string;\n\n // Codemirror instance\n public codeMirrorInstance:undefined|any;\n\n public debouncedLanguageLoader = _.debounce(() => this.loadLanguageAsMode(this.language), 300);\n\n @ViewChild('codeMirrorPane', { static: true }) codeMirrorPane:ElementRef;\n\n public text:any = {\n title: this.I18n.t('js.editor.macro.code_block.title'),\n language: this.I18n.t('js.editor.macro.code_block.language'),\n language_hint: this.I18n.t('js.editor.macro.code_block.language_hint'),\n button_save: this.I18n.t('js.button_save'),\n button_cancel: this.I18n.t('js.button_cancel'),\n close_popup: this.I18n.t('js.close_popup_title'),\n };\n\n constructor(readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService) {\n super(locals, cdRef, elementRef);\n this.languageClass = locals.languageClass || 'language-text';\n this.content = locals.content;\n\n const match = /language-(\\w+)/.exec(this.languageClass);\n if (match) {\n this.language = match[1];\n } else {\n this.language = 'text';\n }\n }\n\n public applyAndClose(evt:Event):void {\n this.content = this.codeMirrorInstance.getValue();\n const lang = this.language || 'text';\n this.languageClass = `language-${lang}`;\n\n this.changed = true;\n this.closeMe(evt);\n }\n\n ngAfterViewInit():void {\n import('codemirror').then((imported:any) => {\n const CodeMirror = imported.default;\n this.codeMirrorInstance = CodeMirror.fromTextArea(\n this.codeMirrorPane.nativeElement,\n {\n lineNumbers: true,\n smartIndent: true,\n autofocus: true,\n value: this.content,\n mode: '',\n },\n );\n });\n }\n\n get language() {\n return this._language;\n }\n\n set language(val:string) {\n this._language = val;\n this.debouncedLanguageLoader();\n }\n\n loadLanguageAsMode(language:string) {\n // For the special language 'text', don't try to load anything\n if (!language || language === 'text') {\n return this.updateCodeMirrorMode('');\n }\n\n import(/* webpackChunkName: \"codemirror-mode\" */ `codemirror/mode/${language}/${language}.js`)\n .then(() => {\n this.updateCodeMirrorMode(language);\n })\n .catch((e) => {\n console.error(`Failed to load language ${language}: ${e}`);\n this.updateCodeMirrorMode('');\n });\n }\n\n updateCodeMirrorMode(newLanguage:string) {\n const editor = this.codeMirrorInstance;\n editor && editor.setOption('mode', newLanguage);\n }\n\n updateLanguage(newValue?:string) {\n if (!newValue) {\n this.language = '';\n return;\n }\n\n if (/^\\w+$/.exec(newValue)) {\n this.language = newValue;\n } else {\n console.error(`Not updating non-matching language: ${newValue}`);\n }\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
\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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, Inject, 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';\n\n@Component({\n templateUrl: './wiki-include-page-macro.modal.html',\n})\nexport class WikiIncludePageMacroModalComponent extends OpModalComponent implements AfterViewInit {\n public changed = false;\n\n public showClose = true;\n\n public selectedPage:string;\n\n public page = '';\n\n @ViewChild('selectedPageInput', { static: true }) selectedPageInput:ElementRef;\n\n public text:any = {\n title: this.I18n.t('js.editor.macro.wiki_page_include.button'),\n hint: this.I18n.t('js.editor.macro.wiki_page_include.hint'),\n page: this.I18n.t('js.editor.macro.wiki_page_include.page'),\n button_save: this.I18n.t('js.button_save'),\n button_cancel: this.I18n.t('js.button_cancel'),\n close_popup: this.I18n.t('js.close_popup_title'),\n };\n\n constructor(readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService) {\n super(locals, cdRef, elementRef);\n this.selectedPage = this.page = this.locals.page;\n\n // We could provide an autocompleter here to get correct page names\n }\n\n public applyAndClose(evt:Event):void {\n this.changed = true;\n this.page = this.selectedPage;\n this.closeMe(evt);\n }\n\n ngAfterViewInit():void {\n this.selectedPageInput.nativeElement.focus();\n }\n}\n","\n
{{text.title}}
\n\n
\n\n
\n
\n \n
\n \n \n
\n
\n \n
\n
\n

\n

project-identifier:my-wiki-page

\n
\n
\n
\n
\n
\n \n \n
\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
\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 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 { TypeResource } from 'core-app/features/hal/resources/type-resource';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { FormResource } from 'core-app/features/hal/resources/form-resource';\n\n@Component({\n templateUrl: './wp-button-macro.modal.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WpButtonMacroModalComponent extends OpModalComponent implements AfterViewInit {\n public changed = false;\n\n public showClose = true;\n\n public selectedType:string;\n\n public buttonStyle:boolean;\n\n public availableTypes:TypeResource[];\n\n public type = '';\n\n public classes = '';\n\n @ViewChild('typeSelect', { static: true }) typeSelect:ElementRef;\n\n public text:any = {\n title: this.I18n.t('js.editor.macro.work_package_button.button'),\n none: this.I18n.t('js.label_none'),\n selected_type: this.I18n.t('js.editor.macro.work_package_button.type'),\n button_style: this.I18n.t('js.editor.macro.work_package_button.button_style'),\n button_style_hint: this.I18n.t('js.editor.macro.work_package_button.button_style_hint'),\n button_save: this.I18n.t('js.button_save'),\n button_cancel: this.I18n.t('js.button_cancel'),\n close_popup: this.I18n.t('js.close_popup_title'),\n };\n\n constructor(readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n protected currentProject:CurrentProjectService,\n protected apiV3Service:ApiV3Service,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService) {\n super(locals, cdRef, elementRef);\n this.selectedType = this.type = this.locals.type;\n this.classes = this.locals.classes;\n this.buttonStyle = this.classes === 'button';\n\n this\n .apiV3Service\n .withOptionalProject(this.currentProject.identifier)\n .work_packages\n .form\n .post({})\n .subscribe((form:FormResource) => {\n this.availableTypes = form.schema.type.allowedValues;\n this.cdRef.detectChanges();\n });\n }\n\n public applyAndClose(evt:Event):void {\n this.changed = true;\n this.classes = this.buttonStyle ? 'button' : '';\n this.type = this.selectedType;\n this.closeMe(evt);\n }\n\n ngAfterViewInit():void {\n this.typeSelect.nativeElement.focus();\n }\n}\n","
\n\n
{{text.title}}
\n\n
\n\n
\n
    \n \n \n \n \n \n \n
\n
\n
\n
\n \n {{ text.cancelButton }}\n \n
\n
\n
\n","import {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, OnInit,\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 { WorkPackageViewColumnsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-columns.service';\nimport { WorkPackageCollectionResource } from 'core-app/features/hal/resources/wp-collection-resource';\nimport { HalLink } from 'core-app/features/hal/hal-link/hal-link';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport * as URI from 'urijs';\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { JobStatusModalComponent } from 'core-app/features/job-status/job-status-modal/job-status.modal';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { StaticQueriesService } from 'core-app/shared/components/op-view-select/op-static-queries.service';\nimport isPersistedResource from 'core-app/features/hal/helpers/is-persisted-resource';\n\ninterface ExportLink extends HalLink {\n identifier:string;\n}\n\n/**\n Modal for exporting work packages to different formats. The user may choose from a variety of formats (e.g. PDF and CSV).\n The modal might also be used to only display the progress of an export. This will happen if a link for exporting is provided via the locals.\n */\n@Component({\n templateUrl: './wp-table-export.modal.html',\n styleUrls: ['./wp-table-export.modal.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WpTableExportModalComponent extends OpModalComponent implements OnInit {\n public $element:HTMLElement;\n\n public exportOptions:{ identifier:string, label:string, url:string }[];\n\n public text = {\n title: this.I18n.t('js.label_export'),\n closePopup: this.I18n.t('js.close_popup_title'),\n exportPreparing: this.I18n.t('js.label_export_preparing'),\n cancelButton: this.I18n.t('js.button_cancel'),\n };\n\n constructor(\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly I18n:I18nService,\n readonly elementRef:ElementRef,\n readonly querySpace:IsolatedQuerySpace,\n readonly cdRef:ChangeDetectorRef,\n readonly httpClient:HttpClient,\n readonly wpTableColumns:WorkPackageViewColumnsService,\n readonly opStaticQueries:StaticQueriesService,\n readonly loadingIndicator:LoadingIndicatorService,\n readonly toastService:ToastService,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit():void {\n super.ngOnInit();\n\n if (this.locals.link) {\n this.requestExport(this.locals.link);\n } else {\n void this.querySpace.results\n .valuesPromise()\n .then((results:WorkPackageCollectionResource) => {\n this.exportOptions = this.buildExportOptions(results);\n this.cdRef.detectChanges();\n });\n }\n }\n\n private buildExportOptions(results:WorkPackageCollectionResource) {\n return results.representations.map((format) => {\n const link = format.$link as ExportLink;\n\n return {\n identifier: link.identifier,\n label: link.title,\n url: this.addColumnsAndTitleToHref(format.href as string),\n };\n });\n }\n\n triggerByLink(url:string, event:MouseEvent):void {\n event.preventDefault();\n this.requestExport(url);\n }\n\n /**\n * Request the export link and return the job ID to observe\n *\n * @param url\n */\n private requestExport(url:string):void {\n this\n .httpClient\n .get(url, { observe: 'body', responseType: 'json' })\n .subscribe(\n (json:{ job_id:string }) => this.replaceWithJobModal(json.job_id),\n (error) => this.handleError(error),\n );\n }\n\n private replaceWithJobModal(jobId:string) {\n this.service.show(JobStatusModalComponent, 'global', { jobId });\n }\n\n private handleError(error:HttpErrorResponse) {\n // There was an error but the status code is actually a 200.\n // If that is the case the response's content-type probably does not match\n // the expected type (json).\n // Currently this happens e.g. when exporting Atom which actually is not an export\n // but rather a feed to follow.\n if (error.status === 200 && error.url) {\n window.open(error.url);\n } else {\n this.showError(error);\n }\n }\n\n private showError(error:HttpErrorResponse) {\n this.toastService.addError(error.message || this.I18n.t('js.error.internal'));\n }\n\n private addColumnsAndTitleToHref(href:string) {\n const columns = this.wpTableColumns.getColumns();\n\n const columnIds = columns.map((column) => column.id);\n\n const url = URI(href);\n // Remove current columns\n url.removeSearch('columns[]');\n url.addSearch('columns[]', columnIds);\n\n // Add the query title for the export\n const query = this.querySpace.query.value;\n if (query) {\n url.removeSearch('title');\n url.addSearch('title', this.queryTitle(query));\n }\n\n return url.toString();\n }\n\n private queryTitle(query:QueryResource):string {\n return isPersistedResource(query) ? query.name : this.staticQueryName(query);\n }\n\n protected staticQueryName(query:QueryResource):string {\n return this.opStaticQueries.getStaticName(query);\n }\n\n protected get afterFocusOn():HTMLElement {\n return document.getElementById('work-packages-settings-button') as HTMLElement;\n }\n}\n","\n
{{text.label_ical_sharing}}
\n\n
\n\n
\n
\n
\n

\n {{text.ical_sharing_warning}}\n

\n
\n
\n\n

\n {{text.description_ical_sharing}}\n

\n\n \n\n \n\n \n {{nameControl?.errors?.rails}}\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 { 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 ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, OnInit,\n} from '@angular/core';\nimport {\n UntypedFormGroup,\n UntypedFormControl,\n Validators,\n AbstractControl,\n} from '@angular/forms';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { CopyToClipboardService } from 'core-app/shared/components/copy-to-clipboard/copy-to-clipboard.service';\n\ninterface TokenNameFormValue {\n name:string;\n}\n\n@Component({\n templateUrl: './query-get-ical-url.modal.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n\nexport class QueryGetIcalUrlModalComponent extends OpModalComponent implements OnInit {\n public tokenName = '';\n\n public query:QueryResource;\n\n public isBusy = false;\n\n public text = {\n label_ical_sharing: this.I18n.t('js.ical_sharing_modal.title'),\n description_ical_sharing: this.I18n.t('js.ical_sharing_modal.description'),\n ical_sharing_warning: this.I18n.t('js.ical_sharing_modal.warning'),\n token_name: this.I18n.t('js.ical_sharing_modal.token_name_label'),\n token_name_placeholder: this.I18n.t('js.ical_sharing_modal.token_name_placeholder'),\n token_name_description_text: this.I18n.t('js.ical_sharing_modal.token_name_description_text'),\n token_name_already_in_use_error_text: this.I18n.t('js.ical_sharing_modal.token_name_already_in_use_error_text'),\n button_copy: this.I18n.t('js.ical_sharing_modal.copy_url_label'),\n button_cancel: this.I18n.t('js.button_cancel'),\n close_popup: this.I18n.t('js.close_popup_title'),\n };\n\n public tokenNameForm = new UntypedFormGroup({\n // eslint-disable-next-line @typescript-eslint/unbound-method\n name: new UntypedFormControl(null, [Validators.required]),\n });\n\n get nameControl():AbstractControl|null {\n return this.tokenNameForm.get('name');\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 protected apiV3Service:ApiV3Service,\n protected copyToClipboardService:CopyToClipboardService,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit():void {\n super.ngOnInit();\n\n if (this.querySpace.query.value) {\n this.query = this.querySpace.query.value!;\n } else {\n this.toastService.addError(\n this.I18n.t('js.ical_sharing_modal.inital_setup_error_message'),\n );\n // without timeout the modal backdrop is not removed\n setTimeout(() => {\n this.closeMe();\n }, 10);\n }\n }\n\n public generateAndCopyUrl():void {\n if (this.isBusy) {\n return;\n }\n\n\n const tokenName = (this.tokenNameForm.value as TokenNameFormValue)?.name;\n\n this.isBusy = true;\n\n const promise = this\n .apiV3Service\n .queries\n .getIcalUrl(this.query, tokenName);\n\n void promise\n .then((response:{ icalUrl:{ href:string } }) => {\n this.copyToClipboardService.copy(String(response.icalUrl.href), this.I18n.t('js.ical_sharing_modal.success_message', { name: tokenName }));\n this.closeMe();\n })\n .catch((error:{ message:string }) => {\n this.nameControl?.markAsDirty();\n this.nameControl?.setErrors({ rails: error.message });\n\n this.cdRef.detectChanges();\n })\n .then(() => {\n this.isBusy = 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 {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Inject,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n@Component({\n templateUrl: './dynamic-content.modal.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DynamicContentModalComponent extends OpModalComponent implements OnInit, OnDestroy {\n constructor(\n readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit():void {\n super.ngOnInit();\n\n // Append the dynamic body\n const wrapper = this.$element.children[0];\n const classes = (this.locals.modalClassName as string) || '';\n wrapper.classList.add(...classes.split(' '));\n wrapper.innerHTML = this.locals.modalBody as string;\n\n const modal = document.querySelector('.spot-modal') as HTMLElement;\n const closeButton = modal.querySelector('[dynamic-content-modal-close-button]');\n closeButton?.addEventListener('click', () => this.closeMe());\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n }\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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","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","\n
{{text.title}}
\n\n
\n \n

\n \n {{ singleWorkPackage.subject }} #{{ singleWorkPackage.id }}\n ?\n

\n
0\">\n

\n \n :\n \n

\n
    \n
  • \n #\n \n
  • \n
\n

\n \n

\n
\n
\n 1\">\n

\n \n \n

\n
    \n
  • \n #\n &ngsp;\n \n 0\">\n (+ {{ text.childCount(wp) }})\n \n
  • \n
\n
\n
\n \n
\n
\n\n
\n
\n \n \n \n {{ text.confirm }}\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 {\n ChangeDetectorRef, Component, ElementRef, Inject, OnInit,\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 { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport {\n WorkPackageViewFocusService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-focus.service';\nimport { StateService } from '@uirouter/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { BackRoutingService } from 'core-app/features/work-packages/components/back-routing/back-routing.service';\nimport {\n WorkPackageNotificationService,\n} from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\nimport { WorkPackageService } from 'core-app/features/work-packages/services/work-package.service';\nimport isNotNull from 'core-app/core/state/is-not-null';\n\n@Component({\n templateUrl: './wp-destroy.modal.html',\n})\nexport class WpDestroyModalComponent extends OpModalComponent implements OnInit {\n // When deleting multiple\n public workPackages:WorkPackageResource[];\n\n public workPackageLabel:string;\n\n // Single work package\n public singleWorkPackage:WorkPackageResource;\n\n public singleWorkPackageChildren:WorkPackageResource[];\n\n public busy = false;\n\n // Need to confirm deletion when children are involved\n public childrenDeletionConfirmed = false;\n\n public text = {\n label_visibility_settings: this.I18n.t('js.label_visibility_settings'),\n button_save: this.I18n.t('js.modals.button_save'),\n confirm: this.I18n.t('js.modals.button_delete'),\n warning: this.I18n.t('js.label_warning'),\n cancel: this.I18n.t('js.button_cancel'),\n close: this.I18n.t('js.close_popup_title'),\n label_confirm_children_deletion: this.I18n.t('js.modals.destroy_work_package.confirm_deletion_children'),\n title: '',\n bulk_text: '',\n single_text: this.I18n.t('js.modals.destroy_work_package.single_text'),\n childCount: (_wp:WorkPackageResource):string => '',\n hasChildren: (_wp:WorkPackageResource):string => '',\n deletesChildren: '',\n };\n\n constructor(readonly elementRef:ElementRef,\n readonly workPackageService:WorkPackageService,\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly I18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n readonly $state:StateService,\n readonly states:States,\n readonly wpTableFocus:WorkPackageViewFocusService,\n readonly wpListService:WorkPackagesListService,\n readonly notificationService:WorkPackageNotificationService,\n readonly backRoutingService:BackRoutingService) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit():void {\n super.ngOnInit();\n\n this.workPackages = this.locals.workPackages;\n this.workPackageLabel = this.I18n.t('js.units.workPackage', { count: this.workPackages.length });\n\n // Ugly way to provide the same view bindings as the ng-init in the previous template.\n if (this.workPackages.length === 1) {\n this.singleWorkPackage = this.workPackages[0];\n this.singleWorkPackageChildren = this.singleWorkPackage.children;\n }\n\n this.text.title = this.I18n.t('js.modals.destroy_work_package.title', { label: this.workPackageLabel });\n this.text.bulk_text = this.I18n.t('js.modals.destroy_work_package.bulk_text', {\n label: this.workPackageLabel,\n count: this.workPackages.length,\n });\n\n this.text.childCount = (wp:WorkPackageResource) => {\n const count = this.children(wp).length;\n return this.I18n.t('js.units.child_work_packages', { count });\n };\n\n this.text.hasChildren = (wp:WorkPackageResource) => {\n const childUnits = this.text.childCount(wp);\n return this.I18n.t('js.modals.destroy_work_package.has_children', { childUnits });\n };\n this.text.deletesChildren = this.I18n.t('js.modals.destroy_work_package.deletes_children');\n }\n\n public get blockedDueToUnconfirmedChildren():boolean {\n return this.mustConfirmChildren && !this.childrenDeletionConfirmed;\n }\n\n public get mustConfirmChildren():boolean {\n let result = false;\n\n if (this.singleWorkPackage && this.singleWorkPackageChildren) {\n result = this.singleWorkPackageChildren.length > 0;\n }\n\n return result || !!_.find(this.workPackages, (wp) => wp.children && wp.children.length > 0);\n }\n\n public confirmDeletion($event:Event):boolean {\n if (this.busy || this.blockedDueToUnconfirmedChildren) {\n return false;\n }\n\n this.busy = true;\n const ids = this.workPackages\n .map((el) => el.id)\n .filter(isNotNull);\n this.workPackageService.performBulkDelete(ids, true)\n .then(() => {\n this.busy = false;\n this.closeMe($event);\n this.wpTableFocus.clear('Clearing after destroying work packages');\n\n // Go back to a previous list state if we're in a split or full view\n if (this.$state.current.data.baseRoute) {\n this.backRoutingService.goBack(true);\n }\n })\n .catch(() => {\n this.busy = false;\n });\n\n return false;\n }\n\n public children(workPackage:WorkPackageResource) {\n if (workPackage.hasOwnProperty('children')) {\n return workPackage.children;\n }\n return [];\n }\n}\n","\n\n {{ title }}\n
\n
\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 HostBinding,\n Input,\n} from '@angular/core';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\n\nexport const noResultsSelector = 'op-no-results';\n\n@Component({\n templateUrl: './no-results.component.html',\n selector: noResultsSelector,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n\nexport class NoResultsComponent {\n @Input() title:string;\n\n @Input() description:string;\n\n @Input() showIcon = true;\n\n @HostBinding('class.generic-table--no-results-container') setHostClass = true;\n\n constructor(\n readonly elementRef:ElementRef,\n ) {\n populateInputsFromDataset(this);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnInit,\n} from '@angular/core';\n\n@Component({\n selector: 'op-content-loader',\n templateUrl: './op-content-loader.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OpContentLoaderComponent implements OnInit {\n @Input() public viewBox = '0 0 400 130';\n\n baseUrl:string;\n\n ngOnInit():void {\n this.baseUrl = window.appBasePath;\n }\n}\n","\n \n\n","import {\n ChangeDetectionStrategy,\n Component,\n} from '@angular/core';\n\n@Component({\n selector: 'op-principal-loading-skeleton',\n templateUrl: './op-principal-loading-skeleton.component.html',\n styleUrls: ['./op-principal-loading-skeleton.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OpPrincipalLoadingComponent {\n\n}\n","
\n \n \n \n \n
","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n} from '@angular/core';\n\n@Component({\n selector: 'op-wp-loading-skeleton',\n templateUrl: './op-wp-loading-skeleton.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./op-wp-loading-skeleton.component.sass'],\n})\nexport class OpWPLoadingComponent {\n @Input() public viewBox?:string = '0 0 800 80';\n}\n","
\n \n \n \n \n
","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { OpContentLoaderComponent } from 'core-app/shared/components/op-content-loader/op-content-loader.component';\nimport { OpPrincipalLoadingComponent } from 'core-app/shared/components/op-content-loader/op-principal-loading-skeleton/op-principal-loading-skeleton.component';\nimport { OpWPLoadingComponent } from 'core-app/shared/components/op-content-loader/op-wp-loading-skeleton/op-wp-loading-skeleton.component';\nimport { ContentLoaderModule } from '@ngneat/content-loader';\n\n@NgModule({\n declarations: [\n OpContentLoaderComponent,\n OpPrincipalLoadingComponent,\n OpWPLoadingComponent,\n ],\n exports: [\n OpContentLoaderComponent,\n OpPrincipalLoadingComponent,\n OpWPLoadingComponent,\n ],\n imports: [\n CommonModule,\n ContentLoaderModule,\n ],\n})\nexport class OpenprojectContentLoaderModule {\n}\n","import { AfterViewInit, Directive, ElementRef } from '@angular/core';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { OpContextMenuHandler } from 'core-app/shared/components/op-context-menu/op-context-menu-handler';\nimport { OpContextMenuItem } from 'core-app/shared/components/op-context-menu/op-context-menu.types';\nimport * as Mousetrap from 'mousetrap';\n\n@Directive({\n selector: '[opContextMenuTrigger]',\n})\nexport class OpContextMenuTrigger extends OpContextMenuHandler implements AfterViewInit {\n protected $element:JQuery;\n\n protected items:OpContextMenuItem[] = [];\n\n constructor(\n readonly elementRef:ElementRef,\n readonly opContextMenu:OPContextMenuService,\n ) {\n super(opContextMenu);\n }\n\n ngAfterViewInit():void {\n this.$element = jQuery(this.elementRef.nativeElement);\n\n // Open by clicking the element\n this.$element.on('click', (evt:JQuery.TriggeredEvent) => {\n evt.preventDefault();\n\n // When clicking the same trigger twice, close the element instead.\n if (this.opContextMenu.isActive(this)) {\n this.opContextMenu.close();\n } else {\n this.open(evt);\n }\n });\n\n // Open with keyboard combination as well\n Mousetrap(this.$element[0]).bind('shift+alt+f10', (evt:any) => {\n this.open(evt);\n });\n }\n\n /**\n * Positioning args for jquery-ui position.\n *\n * @param {Event} openerEvent\n */\n public positionArgs(openerEvent:JQuery.TriggeredEvent) {\n return {\n my: 'left top',\n at: 'left bottom',\n of: this.$element,\n collision: 'flipfit',\n };\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 { QueryGetIcalUrlModalComponent } from 'core-app/shared/components/modals/get-ical-url-modal/query-get-ical-url.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 @Input() public showCalendarSharingOption:boolean;\n\n private form:QueryFormResource;\n\n private loadingPromise:PromiseLike;\n\n constructor(\n 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 ) {\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 // Calendar sharing modal\n hidden: !this.showCalendarSharingOption,\n disabled: this.authorisationService.cannot('query', 'icalUrl'),\n linkText: this.I18n.t('js.toolbar.settings.share_calendar'),\n icon: 'icon-link', // TODO: find sharing icons\n onClick: () => {\n if (this.authorisationService.can('query', 'icalUrl')) {\n this.opModalService.show(QueryGetIcalUrlModalComponent, this.injector);\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 { 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 public isOpen = false;\n\n constructor(\n readonly elementRef:ElementRef,\n readonly opContextMenu:OPContextMenuService,\n readonly browserDetector:BrowserDetector,\n readonly wpCreate:WorkPackageCreateService,\n readonly $state:StateService,\n ) {\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.isOpen = !this.isOpen;\n if (this.isOpen) {\n void this\n .wpCreate\n .getEmptyForm(this.projectIdentifier)\n .then((form) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n this.buildItems(form.schema.type.allowedValues as TypeResource[]);\n this.opContextMenu.show(this, evt);\n });\n } else {\n this.opContextMenu.close();\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 this.isOpen = false;\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 { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { Directive, ElementRef } from '@angular/core';\nimport { OpContextMenuTrigger } from 'core-app/shared/components/op-context-menu/handlers/op-context-menu-trigger.directive';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { FormResource } from 'core-app/features/hal/resources/form-resource';\n\n@Directive({\n selector: '[wpCreateSettingsMenu]',\n})\nexport class WorkPackageCreateSettingsMenuDirective extends OpContextMenuTrigger {\n constructor(readonly elementRef:ElementRef,\n readonly opContextMenu:OPContextMenuService,\n readonly states:States,\n readonly halEditing:HalResourceEditingService) {\n super(elementRef, opContextMenu);\n }\n\n protected open(evt:JQuery.TriggeredEvent) {\n const wp = this.states.workPackages.get('new').value;\n\n if (wp) {\n const change = this.halEditing.changeFor(wp);\n change.getForm().then(\n (loadedForm:FormResource) => {\n this.buildItems(loadedForm);\n this.opContextMenu.show(this, evt);\n },\n );\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 private buildItems(form:FormResource) {\n this.items = [];\n const configureFormLink = form.configureForm;\n const queryCustomFields = form.customFields;\n\n if (queryCustomFields) {\n this.items.push({\n href: queryCustomFields.href,\n icon: 'icon-custom-fields',\n linkText: queryCustomFields.name,\n onClick: () => false,\n });\n }\n\n if (configureFormLink) {\n this.items.push({\n href: configureFormLink.href,\n icon: 'icon-settings3',\n linkText: configureFormLink.name,\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 { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { Directive, ElementRef } from '@angular/core';\nimport { OpContextMenuTrigger } from 'core-app/shared/components/op-context-menu/handlers/op-context-menu-trigger.directive';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageViewCollapsedGroupsService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-collapsed-groups.service';\n\n@Directive({\n selector: '[wpGroupToggleDropdown]',\n})\nexport class WorkPackageGroupToggleDropdownMenuDirective extends OpContextMenuTrigger {\n constructor(readonly elementRef:ElementRef,\n readonly opContextMenu:OPContextMenuService,\n readonly I18n:I18nService,\n readonly wpViewCollapsedGroups:WorkPackageViewCollapsedGroupsService) {\n super(elementRef, opContextMenu);\n }\n\n protected open(evt:JQuery.TriggeredEvent) {\n this.buildItems();\n this.opContextMenu.show(this, evt);\n }\n\n public get locals() {\n return {\n items: this.items,\n contextMenuId: 'wp-group-fold-context-menu',\n };\n }\n\n private buildItems() {\n this.items = [\n {\n disabled: this.wpViewCollapsedGroups.allGroupsAreCollapsed,\n linkText: this.I18n.t('js.button_collapse_all'),\n icon: 'icon-minus2',\n onClick: (evt:JQuery.TriggeredEvent) => {\n this.wpViewCollapsedGroups.setAllGroupsCollapseStateTo(true);\n\n return true;\n },\n },\n {\n disabled: this.wpViewCollapsedGroups.allGroupsAreExpanded,\n linkText: this.I18n.t('js.button_expand_all'),\n icon: 'icon-plus',\n onClick: (evt:JQuery.TriggeredEvent) => {\n this.wpViewCollapsedGroups.setAllGroupsCollapseStateTo(false);\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 { 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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { Directive, ElementRef } from '@angular/core';\nimport { OpContextMenuTrigger } from 'core-app/shared/components/op-context-menu/handlers/op-context-menu-trigger.directive';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n WorkPackageViewDisplayRepresentationService,\n wpDisplayCardRepresentation,\n wpDisplayListRepresentation,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-display-representation.service';\nimport { WorkPackageViewTimelineService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-timeline.service';\n\n@Directive({\n selector: '[wpViewDropdown]',\n})\nexport class WorkPackageViewDropdownMenuDirective extends OpContextMenuTrigger {\n constructor(\n readonly elementRef:ElementRef,\n readonly opContextMenu:OPContextMenuService,\n readonly I18n:I18nService,\n readonly wpDisplayRepresentationService:WorkPackageViewDisplayRepresentationService,\n readonly wpTableTimeline:WorkPackageViewTimelineService,\n ) {\n super(elementRef, opContextMenu);\n }\n\n public isOpen = false;\n\n protected open(evt:JQuery.TriggeredEvent) {\n this.isOpen = !this.isOpen;\n if (this.isOpen) {\n this.buildItems();\n this.opContextMenu.show(this, evt);\n } else {\n this.opContextMenu.close();\n }\n }\n\n public get locals() {\n return {\n items: this.items,\n contextMenuId: 'wp-view-context-menu',\n };\n }\n\n private buildItems() {\n this.items = [];\n\n if (this.wpDisplayRepresentationService.current !== wpDisplayCardRepresentation) {\n this.items.push(\n {\n // Card View\n linkText: this.I18n.t('js.views.card'),\n title: this.I18n.t('js.button_show_cards'),\n icon: 'icon-view-card',\n onClick: (evt:any) => {\n this.isOpen = false;\n this.wpDisplayRepresentationService.setDisplayRepresentation(wpDisplayCardRepresentation);\n if (this.wpTableTimeline.isVisible) {\n // Necessary for the timeline buttons to disappear\n this.wpTableTimeline.toggle();\n }\n return true;\n },\n },\n );\n }\n\n if (this.wpTableTimeline.isVisible || this.wpDisplayRepresentationService.current === wpDisplayCardRepresentation) {\n this.items.push(\n {\n // List View\n linkText: this.I18n.t('js.views.list'),\n title: this.I18n.t('js.button_show_table'),\n icon: 'icon-view-list',\n onClick: (evt:any) => {\n this.isOpen = false;\n this.wpDisplayRepresentationService.setDisplayRepresentation(wpDisplayListRepresentation);\n if (this.wpTableTimeline.isVisible) {\n this.wpTableTimeline.toggle();\n }\n return true;\n },\n },\n );\n }\n\n if (!this.wpTableTimeline.isVisible || this.wpDisplayRepresentationService.current === wpDisplayCardRepresentation) {\n this.items.push(\n {\n // List View with enabled Gantt\n linkText: this.I18n.t('js.views.timeline'),\n title: this.I18n.t('js.button_show_gantt'),\n icon: 'icon-view-timeline',\n onClick: (evt:any) => {\n this.isOpen = false;\n if (!this.wpTableTimeline.isVisible) {\n this.wpTableTimeline.toggle();\n }\n this.wpDisplayRepresentationService.setDisplayRepresentation(wpDisplayListRepresentation);\n return true;\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, Injector, Input,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.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 { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { OpContextMenuItem } from 'core-app/shared/components/op-context-menu/op-context-menu.types';\n\n@Component({\n selector: 'icon-triggered-context-menu',\n templateUrl: './icon-triggered-context-menu.component.html',\n styleUrls: ['./icon-triggered-context-menu.component.sass'],\n})\nexport class IconTriggeredContextMenuComponent extends OpContextMenuTrigger {\n constructor(readonly elementRef:ElementRef,\n readonly opContextMenu:OPContextMenuService,\n readonly opModalService:OpModalService,\n readonly injector:Injector,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService) {\n super(elementRef, opContextMenu);\n }\n\n @Input('menu-items') menuItems:Function;\n\n protected async open(evt:JQuery.TriggeredEvent) {\n this.items = await this.buildItems();\n this.opContextMenu.show(this, evt);\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 private async buildItems() {\n const items:OpContextMenuItem[] = [];\n\n // Add action specific menu entries\n if (this.menuItems) {\n const additional = await this.menuItems();\n return items.concat(additional);\n }\n\n return items;\n }\n}\n","\n \n\n","import { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport { OpContextMenuItem } from 'core-app/shared/components/op-context-menu/op-context-menu.types';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\n/**\n * Interface passed to CM service to open a particular context menu.\n * This will often be a trigger component, but does not have to be.\n */\nexport abstract class OpContextMenuHandler extends UntilDestroyedMixin {\n protected $element:JQuery;\n\n protected items:OpContextMenuItem[] = [];\n\n constructor(readonly opContextMenu:OPContextMenuService) {\n super();\n }\n\n /**\n * Called when the service closes this context menu\n *\n * @param focus Focus on the trigger again\n */\n public onClose(focus = false) {\n if (focus) {\n this.afterFocusOn.trigger('focus');\n }\n }\n\n public onOpen(menu:JQuery) {\n menu.find('.menu-item').first().trigger('focus');\n }\n\n /**\n * Positioning args for jquery-ui position.\n *\n * @param {Event} openerEvent\n */\n public positionArgs(openerEvent:JQuery.TriggeredEvent|Event):JQueryUI.JQueryPositionOptions {\n return {\n my: 'left top',\n at: 'right bottom',\n of: openerEvent,\n collision: 'flipfit',\n };\n }\n\n /**\n * Get the locals passed to the op-context-menu component\n */\n public get locals():{ showAnchorRight?:boolean, contextMenuId?:string, items:OpContextMenuItem[] } {\n return {\n items: this.items,\n };\n }\n\n /**\n * Open this context menu\n */\n protected open(evt:JQuery.TriggeredEvent):void {\n this.opContextMenu.show(this, evt);\n }\n\n protected get afterFocusOn():JQuery {\n return this.$element;\n }\n}\n","
\n
    \n \n
  • \n
  • \n \n \n \n \n \n \n \n \n \n \n
  • \n
    \n
\n
\n","import { Component, Inject } from '@angular/core';\nimport {\n OpContextMenuItem,\n OpContextMenuLocalsMap,\n OpContextMenuLocalsToken,\n} from 'core-app/shared/components/op-context-menu/op-context-menu.types';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\n\n@Component({\n templateUrl: './op-context-menu.html',\n})\nexport class OPContextMenuComponent {\n public items:OpContextMenuItem[];\n\n public service:OPContextMenuService;\n\n constructor(@Inject(OpContextMenuLocalsToken) public locals:OpContextMenuLocalsMap) {\n this.items = this.locals.items.filter((item) => !item?.hidden);\n this.service = this.locals.service;\n }\n\n public handleClick(item:OpContextMenuItem, event:MouseEvent) {\n if (item.disabled || item.divider) {\n return false;\n }\n\n if (item.onClick!(event)) {\n this.locals.service.close();\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n return true;\n }\n}\n","import {\n ApplicationRef,\n ComponentFactoryResolver,\n Injectable,\n Injector,\n} from '@angular/core';\nimport {\n ComponentPortal,\n ComponentType,\n DomPortalOutlet,\n PortalInjector,\n} from '@angular/cdk/portal';\nimport { TransitionService } from '@uirouter/core';\nimport { OpContextMenuHandler } from 'core-app/shared/components/op-context-menu/op-context-menu-handler';\nimport {\n OpContextMenuLocalsMap,\n OpContextMenuLocalsToken,\n} from 'core-app/shared/components/op-context-menu/op-context-menu.types';\nimport { OPContextMenuComponent } from 'core-app/shared/components/op-context-menu/op-context-menu.component';\nimport { KeyCodes } from 'core-app/shared/helpers/keyCodes.enum';\nimport { FocusHelperService } from 'core-app/shared/directives/focus/focus-helper';\n\n@Injectable({ providedIn: 'root' })\nexport class OPContextMenuService {\n public active:OpContextMenuHandler|null = null;\n\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 // Allow temporarily disabling the close handler\n private isOpening = false;\n\n constructor(private componentFactoryResolver:ComponentFactoryResolver,\n readonly FocusHelper:FocusHelperService,\n private appRef:ApplicationRef,\n private $transitions:TransitionService,\n private injector:Injector) {\n const hostElement = this.portalHostElement = document.createElement('div');\n hostElement.classList.add('op-context-menu--overlay');\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 // Close context menus on state change\n $transitions.onStart({}, () => this.close());\n\n // Listen to keyups on window to close context menus\n jQuery(window).on('keydown', (evt:JQuery.TriggeredEvent) => {\n if (this.active && evt.which === KeyCodes.ESCAPE) {\n this.close(true);\n }\n\n return true;\n });\n\n // Listen to any click and close the active context menu\n const that = this;\n document.getElementById('wrapper')!.addEventListener('click', (evt:Event) => {\n if (that.active && !that.portalHostElement.contains(evt.target as Element)) {\n that.close();\n }\n }, true);\n }\n\n /**\n * Open a ContextMenu reference and append it to the portal\n * @param menu A reference to a context menu handler\n * @param event The event that triggered the context menu for positioning\n * @param component The context menu component to mount\n *\n */\n public show(menu:OpContextMenuHandler, event:JQuery.TriggeredEvent|Event, component:ComponentType = OPContextMenuComponent):void {\n this.close();\n\n // Create a portal for the given component class and render it\n this.isOpening = true;\n const portal = new ComponentPortal(component, null, this.injectorFor(menu.locals));\n this.bodyPortalHost.attach(portal);\n this.portalHostElement.style.display = 'block';\n this.active = menu;\n\n setTimeout(() => {\n this.reposition(event);\n // Focus on the first element\n this.active?.onOpen(this.activeMenu);\n this.isOpening = false;\n });\n }\n\n public isActive(menu:OpContextMenuHandler):boolean {\n return !!this.active && this.active === menu;\n }\n\n /**\n * Closes all currently open context menus.\n */\n public close(focus = false):void {\n if (this.isOpening) {\n return;\n }\n\n // Detach any component currently in the portal\n this.bodyPortalHost.detach();\n this.portalHostElement.style.display = 'none';\n this.active?.onClose(focus);\n this.active = null;\n }\n\n public reposition(event:JQuery.TriggeredEvent|Event):void {\n if (!this.active) {\n return;\n }\n\n this.activeMenu\n .position(this.active.positionArgs(event))\n .css('visibility', 'visible');\n }\n\n public get activeMenu():JQuery {\n return jQuery(this.portalHostElement).find('.dropdown');\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 context menu component.\n *\n * @param {OpContextMenuLocalsMap} data\n * @returns {PortalInjector}\n */\n private injectorFor(data:OpContextMenuLocalsMap) {\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(OpContextMenuLocalsToken, data);\n\n return new PortalInjector(this.injector, injectorTokens);\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const OpContextMenuLocalsToken = new InjectionToken('CONTEXT_MENU_LOCALS');\n\nexport interface OpContextMenuLocalsMap {\n items:OpContextMenuItem[];\n contextMenuId?:string;\n [key:string]:any;\n}\n\nexport interface OpContextMenuItem {\n disabled?:boolean;\n hidden?:boolean;\n icon?:string;\n href?:string;\n class?:string;\n ariaLabel?:string;\n linkText?:string;\n title?:string;\n divider?:boolean;\n onClick?:($event:JQuery.TriggeredEvent|MouseEvent) => 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 { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { StateService } from '@uirouter/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { WorkPackageAction } from 'core-app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service';\nimport { HalLink } from 'core-app/features/hal/hal-link/hal-link';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\n\nexport class WorkPackageAuthorization {\n public project:ProjectResource;\n\n constructor(public workPackage:WorkPackageResource,\n readonly PathHelper:PathHelperService,\n readonly $state:StateService) {\n this.project = workPackage.project as ProjectResource;\n }\n\n public linkForAction(action:WorkPackageAction):WorkPackageAction {\n let link:string;\n switch (action.key) {\n case 'copy':\n link = this.copyLink();\n break;\n case 'copy_link_to_clipboard':\n link = this.shortLink();\n break;\n case 'copy_to_other_project':\n link = this.bulkCopyLink();\n break;\n default:\n link = (this.workPackage[action.link as string] as HalLink).href as string;\n }\n\n return { ...action, link };\n }\n\n public isPermitted(action:WorkPackageAction):boolean {\n return this.workPackage[action.link as string] !== undefined;\n }\n\n public permittedActionKeys(allowedActions:WorkPackageAction[]):string[] {\n return allowedActions\n .filter((action) => this.isPermitted(action))\n .map((action) => action.key);\n }\n\n public permittedActionsWithLinks(allowedActions:WorkPackageAction[]):WorkPackageAction[] {\n return allowedActions\n .filter((action) => this.isPermitted(action))\n .map((action) => this.linkForAction(action));\n }\n\n private copyLink() {\n const stateName = this.$state.current.name as string;\n if (stateName.indexOf('work-packages.partitioned.list.details') === 0) {\n return this.PathHelper.workPackageDetailsCopyPath(this.project.identifier, this.workPackage.id as string);\n }\n return this.PathHelper.workPackageCopyPath(this.workPackage.id as string);\n }\n\n private shortLink() {\n return this.PathHelper.workPackageShortPath(this.workPackage.id as string);\n }\n\n private bulkCopyLink():string {\n return `${this.PathHelper.staticBase}/work_packages/move/new?copy=true&ids[]=${this.workPackage.id as string}`;\n }\n}\n","import {\n Directive, ElementRef, Injector, Input,\n} from '@angular/core';\nimport { StateService } from '@uirouter/core';\nimport { isClickedWithModifier } from 'core-app/shared/helpers/link-handling/link-handling';\nimport { AuthorisationService } from 'core-app/core/model-auth/model-auth.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HookService } from 'core-app/features/plugins/hook-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 { OpContextMenuItem } from 'core-app/shared/components/op-context-menu/op-context-menu.types';\nimport { PERMITTED_CONTEXT_MENU_ACTIONS } from 'core-app/shared/components/op-context-menu/wp-context-menu/wp-static-context-menu-actions';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { CopyToClipboardService } from 'core-app/shared/components/copy-to-clipboard/copy-to-clipboard.service';\nimport { WorkPackageAction } from 'core-app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { TimeEntryCreateService } from 'core-app/shared/components/time_entries/create/create.service';\nimport { WpDestroyModalComponent } from 'core-app/shared/components/modals/wp-destroy-modal/wp-destroy.modal';\nimport { WorkPackageAuthorization } from 'core-app/features/work-packages/services/work-package-authorization.service';\nimport * as moment from 'moment-timezone';\n\n@Directive({\n selector: '[wpSingleContextMenu]',\n})\nexport class WorkPackageSingleContextMenuDirective extends OpContextMenuTrigger {\n @Input('wpSingleContextMenu-workPackage') public workPackage:WorkPackageResource;\n\n @InjectField() public timeEntryCreateService:TimeEntryCreateService;\n\n constructor(readonly HookService:HookService,\n readonly $state:StateService,\n readonly injector:Injector,\n readonly PathHelper:PathHelperService,\n readonly elementRef:ElementRef,\n readonly opModalService:OpModalService,\n readonly opContextMenuService:OPContextMenuService,\n readonly authorisationService:AuthorisationService,\n protected copyToClipboardService:CopyToClipboardService,\n ) {\n super(elementRef, opContextMenuService);\n }\n\n protected open(evt:JQuery.TriggeredEvent) {\n this.workPackage.project.$load().then(() => {\n this.authorisationService.initModelAuth('work_package', this.workPackage.$links);\n\n const authorization = new WorkPackageAuthorization(this.workPackage, this.PathHelper, this.$state);\n const permittedActions = this.getPermittedActions(authorization);\n\n this.buildItems(permittedActions);\n this.opContextMenu.show(this, evt);\n });\n }\n\n public triggerContextMenuAction(action:WorkPackageAction, key:string) {\n const { link } = action;\n\n switch (key) {\n case 'copy_to_other_project':\n window.location.href = `${this.PathHelper.staticBase}/work_packages/move/new?copy=true&ids[]=${this.workPackage.id as string}`;\n break;\n\n case 'copy':\n this.$state.go('work-packages.copy', { copiedFromWorkPackageId: this.workPackage.id });\n break;\n case 'delete':\n this.opModalService.show(WpDestroyModalComponent, this.injector, { workPackages: [this.workPackage] });\n break;\n case 'log_time':\n this.timeEntryCreateService\n .create(moment(new Date()), this.workPackage, { showWorkPackageField: false })\n .catch(() => {\n // do nothing, the user closed without changes\n });\n break;\n case 'copy_link_to_clipboard': {\n const url = new URL(String(link), window.location.origin);\n this.copyToClipboardService.copy(url.toString());\n break;\n }\n default:\n window.location.href = link!;\n break;\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 private getPermittedActions(authorization:WorkPackageAuthorization) {\n const actions:WorkPackageAction[] = authorization.permittedActionsWithLinks(PERMITTED_CONTEXT_MENU_ACTIONS);\n\n // Splice plugin actions onto the core actions\n _.each(this.getPermittedPluginActions(authorization), (action:WorkPackageAction) => {\n const index = action.indexBy ? action.indexBy(actions) : actions.length;\n actions.splice(index, 0, action);\n });\n\n return actions;\n }\n\n private getPermittedPluginActions(authorization:WorkPackageAuthorization) {\n const actions:WorkPackageAction[] = this.HookService.call('workPackageSingleContextMenu');\n return authorization.permittedActionsWithLinks(actions);\n }\n\n protected buildItems(permittedActions:WorkPackageAction[]):OpContextMenuItem[] {\n const configureFormLink = this.workPackage.configureForm;\n\n this.items = permittedActions.map((action:WorkPackageAction) => {\n const { key } = action;\n return {\n disabled: false,\n linkText: I18n.t(`js.button_${key}`),\n href: action.link,\n icon: action.icon || `icon-${key}`,\n onClick: ($event:JQuery.TriggeredEvent) => {\n if (action.link && isClickedWithModifier($event)) {\n return false;\n }\n\n this.triggerContextMenuAction(action, key);\n return true;\n },\n };\n });\n\n if (configureFormLink) {\n this.items.push(\n {\n href: configureFormLink.href,\n icon: 'icon-settings3',\n linkText: I18n.t('js.button_configure-form'),\n onClick: () => false,\n },\n );\n }\n\n return this.items;\n }\n}\n","import { WorkPackageAction } from 'core-app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service';\n\nexport const PERMITTED_CONTEXT_MENU_ACTIONS:WorkPackageAction[] = [\n {\n key: 'log_time',\n link: 'logTime',\n },\n {\n key: 'change_project',\n icon: 'icon-move',\n link: 'move',\n },\n {\n key: 'copy',\n link: 'copy',\n },\n {\n key: 'copy_link_to_clipboard',\n icon: 'icon-clipboard',\n link: 'id',\n },\n {\n key: 'copy_to_other_project',\n link: 'copy',\n icon: 'icon-project-types',\n },\n {\n key: 'delete',\n link: 'delete',\n },\n {\n key: 'export-pdf',\n link: 'pdf',\n },\n {\n key: 'export-atom',\n link: 'atom',\n },\n];\n","import { Injector } from '@angular/core';\nimport {\n WorkPackageAction,\n WorkPackageContextMenuHelperService,\n} from 'core-app/features/work-packages/components/wp-table/context-menu-helper/wp-context-menu-helper.service';\nimport { States } from 'core-app/core/states/states.service';\nimport { WorkPackageRelationsHierarchyService } from 'core-app/features/work-packages/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service';\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 { OpContextMenuHandler } from 'core-app/shared/components/op-context-menu/op-context-menu-handler';\nimport { OPContextMenuService } from 'core-app/shared/components/op-context-menu/op-context-menu.service';\nimport {\n OpContextMenuItem,\n OpContextMenuLocalsMap,\n} from 'core-app/shared/components/op-context-menu/op-context-menu.types';\nimport { PERMITTED_CONTEXT_MENU_ACTIONS } from 'core-app/shared/components/op-context-menu/wp-context-menu/wp-static-context-menu-actions';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { StateService } from '@uirouter/core';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { CopyToClipboardService } from 'core-app/shared/components/copy-to-clipboard/copy-to-clipboard.service';\nimport { TimeEntryCreateService } from 'core-app/shared/components/time_entries/create/create.service';\nimport { splitViewRoute } from 'core-app/features/work-packages/routing/split-view-routes.helper';\nimport { WpDestroyModalComponent } from 'core-app/shared/components/modals/wp-destroy-modal/wp-destroy.modal';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport * as moment from 'moment-timezone';\n\nexport class WorkPackageViewContextMenu extends OpContextMenuHandler {\n @InjectField() protected states!:States;\n\n @InjectField() protected wpRelationsHierarchyService:WorkPackageRelationsHierarchyService;\n\n @InjectField() protected opModalService:OpModalService;\n\n @InjectField() protected $state!:StateService;\n\n @InjectField() protected wpTableSelection:WorkPackageViewSelectionService;\n\n @InjectField() protected WorkPackageContextMenuHelper!:WorkPackageContextMenuHelperService;\n\n @InjectField() protected timeEntryCreateService:TimeEntryCreateService;\n\n @InjectField() protected pathHelper:PathHelperService;\n\n protected workPackage = this.states.workPackages.get(this.workPackageId).value!;\n\n protected selectedWorkPackages = this.getSelectedWorkPackages();\n\n protected permittedActions = this.WorkPackageContextMenuHelper.getPermittedActions(\n this.selectedWorkPackages,\n PERMITTED_CONTEXT_MENU_ACTIONS,\n this.allowSplitScreenActions,\n );\n\n // Get the base route for the current route to ensure we always link correctly\n protected baseRoute = this.$state.current.data.baseRoute || this.$state.current.name;\n\n protected items = this.buildItems();\n\n private copyToClipboardService:CopyToClipboardService;\n\n constructor(public injector:Injector,\n protected workPackageId:string,\n protected $element:JQuery,\n protected additionalPositionArgs:any = {},\n protected allowSplitScreenActions:boolean = true) {\n super(injector.get(OPContextMenuService));\n this.copyToClipboardService = injector.get(CopyToClipboardService);\n }\n\n public get locals():OpContextMenuLocalsMap {\n return { contextMenuId: 'work-package-context-menu', items: this.items };\n }\n\n public positionArgs(evt:JQuery.TriggeredEvent) {\n const position = super.positionArgs(evt);\n _.assign(position, this.additionalPositionArgs);\n\n return position;\n }\n\n public triggerContextMenuAction(action:WorkPackageAction) {\n const { link } = action;\n const id = this.workPackage.id as string;\n\n switch (action.key) {\n case 'delete':\n this.deleteSelectedWorkPackages();\n break;\n\n case 'edit':\n this.editSelectedWorkPackages(link!);\n break;\n\n case 'copy':\n this.copySelectedWorkPackages(link!);\n break;\n\n case 'copy_link_to_clipboard': {\n const url = new URL(String(link), window.location.origin);\n this.copyToClipboardService.copy(url.toString());\n break;\n }\n case 'copy_to_other_project':\n window.location.href = `${this.pathHelper.staticBase}/work_packages/move/new?copy=true&ids[]=${id}`;\n break;\n\n case 'relation-new-child':\n this.wpRelationsHierarchyService.addNewChildWp(this.baseRoute, this.workPackage);\n break;\n\n case 'log_time':\n this.logTimeForSelectedWorkPackage();\n break;\n\n default:\n window.location.href = link!;\n break;\n }\n }\n\n private deleteSelectedWorkPackages() {\n const selected = this.getSelectedWorkPackages();\n this.opModalService.show(WpDestroyModalComponent, this.injector, { workPackages: selected });\n }\n\n private editSelectedWorkPackages(link:any) {\n const selected = this.getSelectedWorkPackages();\n\n if (selected.length > 1) {\n window.location.href = link;\n }\n }\n\n private copySelectedWorkPackages(link:any) {\n const selected = this.getSelectedWorkPackages();\n\n if (selected.length > 1) {\n window.location.href = link;\n return;\n }\n\n const params = {\n copiedFromWorkPackageId: selected[0].id,\n };\n\n this.$state.go(`${this.baseRoute}.copy`, params);\n }\n\n private logTimeForSelectedWorkPackage() {\n this.timeEntryCreateService\n .create(moment(new Date()), this.workPackage)\n .catch(() => {\n // do nothing, the user closed without changes\n });\n }\n\n private getSelectedWorkPackages() {\n const selectedWorkPackages = this.wpTableSelection.getSelectedWorkPackages();\n\n if (selectedWorkPackages.length === 0) {\n return [this.workPackage];\n }\n\n if (selectedWorkPackages.indexOf(this.workPackage) === -1) {\n selectedWorkPackages.push(this.workPackage);\n }\n\n return selectedWorkPackages;\n }\n\n protected buildItems():OpContextMenuItem[] {\n const items = this.permittedActions.map((action:WorkPackageAction) => ({\n class: undefined as string|undefined,\n disabled: false,\n linkText: action.text,\n href: action.href,\n icon: action.icon != null ? action.icon : `icon-${action.key}`,\n onClick: ($event:JQuery.TriggeredEvent) => {\n if (action.href && isClickedWithModifier($event)) {\n return false;\n }\n\n this.triggerContextMenuAction(action);\n return true;\n },\n }));\n\n if (!isNewResource(this.workPackage)) {\n items.unshift({\n disabled: false,\n icon: 'icon-view-fullscreen',\n class: 'openFullScreenView',\n href: this.$state.href('work-packages.show', { workPackageId: this.workPackageId }),\n linkText: I18n.t('js.button_open_fullscreen'),\n onClick: ($event:JQuery.TriggeredEvent) => {\n if (isClickedWithModifier($event)) {\n return false;\n }\n\n this.$state.go(\n 'work-packages.show',\n { workPackageId: this.workPackageId },\n );\n return true;\n },\n });\n\n if (this.allowSplitScreenActions) {\n items.unshift({\n disabled: false,\n icon: 'icon-view-split',\n class: 'detailsViewMenuItem',\n href: this.$state.href(\n `${splitViewRoute(this.$state)}.tabs`,\n { workPackageId: this.workPackageId, tabIdentifier: 'overview' },\n ),\n linkText: I18n.t('js.button_open_details'),\n onClick: ($event:JQuery.TriggeredEvent) => {\n if (isClickedWithModifier($event)) {\n return false;\n }\n\n this.$state.go(\n `${splitViewRoute(this.$state)}.tabs`,\n { workPackageId: this.workPackageId, tabIdentifier: 'overview' },\n );\n return true;\n },\n });\n }\n }\n\n return items;\n }\n}\n","\n\n\n \n \n \n \n \n \n \n \n\n\n\n \n \n \n \n\n \n \n \n \n \n\n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n HostBinding,\n Injector,\n Input,\n OnInit,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpModalService } from '../modal/modal.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\nimport { FullCalendarComponent } from '@fullcalendar/angular';\nimport {\n EventInput,\n CalendarOptions,\n EventSourceFuncArg,\n} from '@fullcalendar/core';\nimport listPlugin from '@fullcalendar/list';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { DayResourceService } from 'core-app/core/state/days/day.service';\nimport { IDay } from 'core-app/core/state/days/day.model';\nimport { CalendarViewEvent } from 'core-app/features/calendar/op-work-packages-calendar.service';\nimport { opIconElement } from 'core-app/shared/helpers/op-icon-builder';\nimport { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';\nimport { ConfirmDialogOptions } from '../modals/confirm-dialog/confirm-dialog.modal';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport * as moment from 'moment-timezone';\n\nexport const nonWorkingDaysListSelector = 'op-non-working-days-list';\n\nexport interface INonWorkingDay {\n id:string|null;\n name:string;\n date:string;\n _destroy?:boolean;\n}\n\n@Component({\n selector: nonWorkingDaysListSelector,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['./op-non-working-days-list.component.sass'],\n templateUrl: './op-non-working-days-list.component.html',\n})\nexport class OpNonWorkingDaysListComponent implements OnInit {\n @ViewChild(FullCalendarComponent) ucCalendar:FullCalendarComponent;\n\n @HostBinding('class.op-non-working-days-list') className = true;\n\n @Input() public modifiedNonWorkingDays:INonWorkingDay[] = [];\n\n text = {\n empty_state_header: this.I18n.t('js.admin.working_days.calendar.empty_state_header'),\n empty_state_description: this.I18n.t('js.admin.working_days.calendar.empty_state_description'),\n already_added_error: this.I18n.t('js.admin.working_days.already_added_error'),\n new_date: this.I18n.t('js.admin.working_days.calendar.new_date'),\n add_non_working_day: this.I18n.t('js.admin.working_days.add_non_working_day'),\n change_description: this.I18n.t('js.admin.working_days.change_description'),\n warning: this.I18n.t('js.admin.working_days.warning'),\n change_button: this.I18n.t('js.admin.working_days.change_button'),\n change_title: this.I18n.t('js.admin.working_days.change_title'),\n removed_title: this.I18n.t('js.admin.working_days.removed_title'),\n non_working_day_name: this.I18n.t('js.modals.label_name'),\n add: this.I18n.t('js.button_add'),\n };\n\n form_submitted = false;\n\n nonWorkingDays:INonWorkingDay[] = [];\n\n datepickerOpened = false;\n\n selectedNonWorkingDayName= '';\n\n calendarOptions:CalendarOptions = {\n plugins: [listPlugin],\n initialView: 'listYear',\n contentHeight: 'auto',\n headerToolbar: {\n right: '',\n center: '',\n left: 'prev,next,title',\n },\n events: this.calendarEventsFunction.bind(this),\n eventDidMount: (evt:CalendarViewEvent) => {\n const { el, event } = evt;\n const td = document.createElement('td');\n const anchor = document.createElement('a');\n anchor.title = 'Delete';\n anchor.href = '#';\n anchor.classList.add('fc-list-day-side-text', 'op-non-working-days-list--delete-icon');\n anchor.appendChild(opIconElement('icon', 'icon-delete'));\n\n anchor.addEventListener('click', () => {\n // Create 4 hidden inputs(id, name, date, _destroy) for the deleted NWD\n this.nonWorkingDays = this.nonWorkingDays.map((item) => {\n if (item.date === event.id) {\n return { ...item, _destroy: true };\n }\n\n return item;\n });\n event.remove();\n this.cdRef.detectChanges();\n });\n td.appendChild(anchor);\n el.appendChild(td);\n },\n noEventsContent: { html: `
${this.text.empty_state_description}
` },\n\n };\n\n constructor(\n readonly elementRef:ElementRef,\n protected I18n:I18nService,\n readonly bannersService:BannersService,\n readonly opModalService:OpModalService,\n readonly injector:Injector,\n readonly pathHelper:PathHelperService,\n readonly apiV3Service:ApiV3Service,\n readonly dayService:DayResourceService,\n readonly confirmDialogService:ConfirmDialogService,\n readonly toast:ToastService,\n readonly cdRef:ChangeDetectorRef,\n ) {\n populateInputsFromDataset(this);\n this.listenToFormSubmit();\n }\n\n private listenToFormSubmit() {\n const form = this.elementRef.nativeElement.closest('form') as HTMLFormElement;\n form.addEventListener('submit', (evt:Event) => {\n if (!this.form_submitted) {\n this.form_submitted = true;\n const target = evt.target as HTMLFormElement;\n const options:ConfirmDialogOptions = {\n text: {\n text: this.text.change_description,\n title: this.text.change_title,\n button_continue: this.text.change_button,\n },\n dangerHighlighting: true,\n divideContent: true,\n refreshOnCancel: true,\n showListData: this.removedNonWorkingDays.length > 0,\n warningText: this.text.warning,\n passedData: this.removedNonWorkingDays,\n listTitle: this.text.removed_title,\n };\n evt.preventDefault();\n void this.confirmDialogService.confirm(options).then(() => {\n this.form_submitted = false;\n target.submit();\n });\n }\n });\n }\n\n ngOnInit():void {\n this\n .modifiedNonWorkingDays\n .forEach((el) => {\n this.nonWorkingDays.push({ ...el });\n });\n }\n\n public get removedNonWorkingDays():string[] {\n return this\n .nonWorkingDays\n .filter((el) => el._destroy)\n .map((el) => moment(el.date).format('MMMM DD, YYYY'));\n }\n\n public calendarEventsFunction(\n fetchInfo:EventSourceFuncArg,\n successCallback:(events:EventInput[]) => void,\n failureCallback:(error:Error) => void,\n ):void|PromiseLike {\n this.dayService.requireNonWorkingYear$(fetchInfo.start)\n .subscribe(\n (days:IDay[]) => {\n this.nonWorkingDays = _\n .uniqBy([...this.nonWorkingDays, ...days], (el) => el.date)\n .filter((el:INonWorkingDay) => !this.nonWorkingDays.find((existing) => existing.id === el.id && existing._destroy));\n\n const events = this.mapToCalendarEvents(this.nonWorkingDays);\n successCallback(events);\n this.cdRef.detectChanges();\n },\n failureCallback,\n );\n }\n\n private mapToCalendarEvents(nonWorkingDays:INonWorkingDay[]) {\n return nonWorkingDays\n .filter((nwd) => nwd._destroy !== true)\n .map((nwd:IDay) => ({\n title: nwd.name,\n start: nwd.date,\n id: nwd.date,\n }));\n }\n\n public addNonWorkingDay(date:string):void {\n const name = this.selectedNonWorkingDayName;\n this.selectedNonWorkingDayName = '';\n\n if (!date || date === '' || !name || name === '') {\n return;\n }\n\n const day = {\n start: date,\n id: null,\n name,\n date,\n title: name,\n } as INonWorkingDay;\n\n const api = this.ucCalendar.getApi();\n\n if (api.getEventById(date)) {\n this.toast.addError(this.text.already_added_error);\n return;\n }\n\n this.nonWorkingDays = [...this.nonWorkingDays, day];\n api.addEvent({ ...day, id: 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 { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { Injectable } from '@angular/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { StateService } from '@uirouter/core';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { IOpSidemenuItem } from 'core-app/shared/components/sidemenu/sidemenu.component';\nimport { ViewType } from 'core-app/shared/components/op-view-select/op-view-select.component';\n\ninterface IStaticQuery extends IOpSidemenuItem {\n view:ViewType;\n}\n\n@Injectable()\nexport class StaticQueriesService {\n private staticQueries:IStaticQuery[] = [];\n\n constructor(\n private readonly I18n:I18nService,\n private readonly $state:StateService,\n private readonly CurrentProject:CurrentProjectService,\n private readonly PathHelper:PathHelperService,\n private readonly CurrentUser:CurrentUserService,\n ) {\n this.staticQueries = this.buildQueries();\n }\n\n public text = {\n assignee: this.I18n.t('js.work_packages.properties.assignee'),\n author: this.I18n.t('js.work_packages.properties.author'),\n created_at: this.I18n.t('js.work_packages.properties.createdAt'),\n updated_at: this.I18n.t('js.work_packages.properties.updatedAt'),\n status: this.I18n.t('js.work_packages.properties.status'),\n work_packages: this.I18n.t('js.label_work_package_plural'),\n gantt: this.I18n.t('js.gantt_chart.label'),\n latest_activity: this.I18n.t('js.work_packages.default_queries.latest_activity'),\n created_by_me: this.I18n.t('js.work_packages.default_queries.created_by_me'),\n assigned_to_me: this.I18n.t('js.work_packages.default_queries.assigned_to_me'),\n recently_created: this.I18n.t('js.work_packages.default_queries.recently_created'),\n all_open: this.I18n.t('js.work_packages.default_queries.all_open'),\n shared_with_users: this.I18n.t('js.work_packages.default_queries.shared_with_users'),\n summary: this.I18n.t('js.work_packages.default_queries.summary'),\n overdue: this.I18n.t('js.notifications.date_alerts.overdue'),\n };\n\n public getStaticName(query:QueryResource):string {\n if (this.$state.params.query_props) {\n const queryProps = JSON.parse(this.$state.params.query_props) as { pa:unknown, pp:unknown }&unknown;\n delete queryProps.pp;\n delete queryProps.pa;\n const queryPropsString = JSON.stringify(queryProps);\n\n const matched = this.staticQueries.find((item) => {\n const uiParams = item.uiParams as { query_id:string, query_props:string };\n return uiParams && uiParams.query_props === queryPropsString;\n });\n\n if (matched) {\n return matched.title;\n }\n }\n\n // Try to detect the all open filter\n if (query.filters.length === 1 // Only one filter\n && query.filters[0].id === 'status' // that is status\n && query.filters[0].operator.id === 'o') { // and is open\n return this.text.all_open;\n }\n\n // Otherwise, fall back to work packages\n return this.text.work_packages;\n }\n\n public buildQueries():IStaticQuery[] {\n let items:IStaticQuery[] = [\n {\n title: this.text.all_open,\n uiSref: 'work-packages',\n uiParams: { query_id: '', query_props: '' },\n view: 'WorkPackagesTable',\n },\n {\n title: this.text.latest_activity,\n uiSref: 'work-packages',\n uiParams: {\n query_id: '',\n query_props: '{\"c\":[\"id\",\"subject\",\"type\",\"status\",\"assignee\",\"updatedAt\"],\"hi\":false,\"g\":\"\",\"t\":\"updatedAt:desc\",\"f\":[{\"n\":\"status\",\"o\":\"*\",\"v\":[]}]}',\n },\n view: 'WorkPackagesTable',\n },\n {\n title: this.text.recently_created,\n uiSref: 'work-packages',\n uiParams: {\n query_id: '',\n query_props: '{\"c\":[\"id\",\"subject\",\"type\",\"status\",\"assignee\",\"createdAt\"],\"hi\":false,\"g\":\"\",\"t\":\"createdAt:desc\",\"f\":[{\"n\":\"status\",\"o\":\"o\",\"v\":[]}]}',\n },\n view: 'WorkPackagesTable',\n },\n {\n title: this.text.gantt,\n uiSref: 'work-packages',\n uiParams: {\n query_id: '',\n query_props: '{\"c\":[\"id\",\"type\",\"subject\",\"status\",\"startDate\",\"dueDate\",\"duration\"],\"tv\":true,\"tzl\":\"auto\",\"tll\":\"{\\\\\"left\\\\\":\\\\\"startDate\\\\\",\\\\\"right\\\\\":\\\\\"dueDate\\\\\",\\\\\"farRight\\\\\":\\\\\"subject\\\\\"}\",\"hi\":true,\"g\":\"\",\"t\":\"startDate:asc\",\"f\":[{\"n\":\"status\",\"o\":\"o\",\"v\":[]}]}',\n },\n view: 'WorkPackagesTable',\n },\n {\n title: this.text.overdue,\n uiSref: 'work-packages',\n uiParams: {\n query_id: '',\n query_props: '{\"c\":[\"id\",\"type\",\"subject\",\"status\",\"startDate\",\"dueDate\",\"duration\"],\"hi\":false,\"g\":\"\",\"t\":\"createdAt:desc\",\"f\":[{\"n\":\"dueDate\",\"o\":\" query.view === view);\n }\n\n private projectDependentQueries(projectIdentifier:string):IStaticQuery[] {\n return [\n {\n title: this.text.summary,\n href: `${this.PathHelper.projectWorkPackagesPath(projectIdentifier)}/report`,\n view: 'WorkPackagesTable',\n },\n ];\n }\n\n private userDependentQueries():IStaticQuery[] {\n return [\n {\n title: this.text.created_by_me,\n uiSref: 'work-packages',\n uiParams: {\n query_id: '',\n query_props: '{\"c\":[\"id\",\"subject\",\"type\",\"status\",\"assignee\",\"updatedAt\"],\"hi\":false,\"g\":\"\",\"t\":\"updatedAt:desc,id:asc\",\"f\":[{\"n\":\"status\",\"o\":\"o\",\"v\":[]},{\"n\":\"author\",\"o\":\"=\",\"v\":[\"me\"]}]}',\n },\n view: 'WorkPackagesTable',\n },\n {\n title: this.text.assigned_to_me,\n uiSref: 'work-packages',\n uiParams: {\n query_id: '',\n query_props: '{\"c\":[\"id\",\"subject\",\"type\",\"status\",\"author\",\"updatedAt\"],\"hi\":false,\"g\":\"\",\"t\":\"updatedAt:desc,id:asc\",\"f\":[{\"n\":\"status\",\"o\":\"o\",\"v\":[]},{\"n\":\"assigneeOrGroup\",\"o\":\"=\",\"v\":[\"me\"]}]}',\n },\n view: 'WorkPackagesTable',\n },\n {\n title: this.text.shared_with_users,\n uiSref: 'work-packages',\n uiParams: {\n query_id: '',\n query_props: '{\"c\":[\"id\",\"subject\",\"type\",\"project\"],\"hi\":false,\"g\":\"\",\"t\":\"updatedAt:desc,id:asc\",\"f\":[{\"n\":\"sharedWithUser\",\"o\":\"*\",\"v\":[]}]}',\n },\n view: 'WorkPackagesTable',\n },\n {\n title: this.text.created_by_me,\n uiSref: 'bim.partitioned.list',\n uiParams: {\n query_id: '',\n query_props: '{\"c\":[\"id\",\"subject\",\"bcfThumbnail\",\"type\",\"status\",\"assignee\",\"updatedAt\"],\"t\":\"id:desc\",\"f\":[{\"n\":\"status\",\"o\":\"o\",\"v\":[]},{\"n\":\"author\",\"o\":\"=\",\"v\":[\"me\"]}]}',\n },\n view: 'Bim',\n },\n {\n title: this.text.assigned_to_me,\n uiSref: 'bim.partitioned.list',\n uiParams: {\n query_id: '',\n query_props: '{\"c\":[\"id\",\"subject\",\"bcfThumbnail\",\"type\",\"status\",\"author\",\"updatedAt\"],\"t\":\"id:desc\",\"f\":[{\"n\":\"status\",\"o\":\"o\",\"v\":[]},{\"n\":\"assigneeOrGroup\",\"o\":\"=\",\"v\":[\"me\"]}]}',\n },\n view: 'Bim',\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 Input,\n OnInit,\n} from '@angular/core';\nimport { map } from 'rxjs/operators';\nimport {\n BehaviorSubject,\n combineLatest,\n} from 'rxjs';\nimport { States } from 'core-app/core/states/states.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\nimport { MainMenuNavigationService } from 'core-app/core/main-menu/main-menu-navigation.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { IOpSidemenuItem } from 'core-app/shared/components/sidemenu/sidemenu.component';\nimport { StaticQueriesService } from 'core-app/shared/components/op-view-select/op-static-queries.service';\nimport { ViewsResourceService } from 'core-app/core/state/views/views.service';\nimport { IView } from 'core-app/core/state/views/view.model';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { MAGIC_PAGE_NUMBER } from 'core-app/core/apiv3/helpers/get-paginated-results';\n\nexport type ViewType = 'WorkPackagesTable'|'Bim'|'TeamPlanner'|'WorkPackagesCalendar';\n\nexport const opViewSelectSelector = 'op-view-select';\n\n@Component({\n selector: opViewSelectSelector,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './op-view-select.template.html',\n})\nexport class ViewSelectComponent extends UntilDestroyedMixin implements OnInit {\n public text = {\n search: this.I18n.t('js.global_search.search'),\n label: this.I18n.t('js.toolbar.search_query_label'),\n scope_default: this.I18n.t('js.label_default_queries'),\n scope_starred: this.I18n.t('js.label_starred_queries'),\n scope_global: this.I18n.t('js.label_global_queries'),\n scope_private: this.I18n.t('js.label_custom_queries'),\n no_results: this.I18n.t('js.autocompleter.notFoundText'),\n };\n\n @Input() menuItems:string[] = [];\n\n @Input() projectId:string|undefined;\n\n @Input() baseRoute:string;\n\n @Input() viewType:ViewType;\n\n public items:IOpSidemenuItem[] = [];\n\n private apiViewType:string;\n\n private viewCategories$ = new BehaviorSubject([]);\n\n private search$ = new BehaviorSubject('');\n\n private initialized = false;\n\n constructor(\n readonly elementRef:ElementRef,\n readonly apiV3Service:ApiV3Service,\n readonly I18n:I18nService,\n readonly states:States,\n readonly opStaticQueries:StaticQueriesService,\n readonly mainMenuService:MainMenuNavigationService,\n readonly cdRef:ChangeDetectorRef,\n readonly viewsService:ViewsResourceService,\n ) {\n super();\n\n populateInputsFromDataset(this);\n }\n\n public set search(input:string) {\n if (this.search$.value !== input) {\n this.search$.next(input);\n }\n }\n\n ngOnInit():void {\n this.apiViewType = `Views::${this.viewType}`;\n\n // When activating the work packages submenu,\n // either initially or through click on the toggle, load the results\n this.mainMenuService\n .onActivate(...this.menuItems)\n .subscribe(() => this.initializeAutocomplete());\n\n combineLatest([\n this.search$,\n this.viewCategories$,\n ]).pipe(\n map(([searchText, categories]) => {\n // We go the way of assigning the variable instead of using the observable directly with the async pipe.\n // For whatever the reason Angular's change detection does not catch the changes made here.\n // Thus, the sidemenu items were only updated with the next global change event (e.g. notifications push or some user interaction).\n this.items = categories\n .map((category) => {\n if (ViewSelectComponent.matchesText(category.title, searchText)) {\n return category;\n }\n const filteredChildren = category.children\n ?.filter((query) => ViewSelectComponent.matchesText(query.title, searchText));\n\n return { title: category.title, children: filteredChildren, collapsible: true };\n })\n .filter((category) => category.children && category.children.length > 0);\n\n this.cdRef.detectChanges();\n\n return this.items;\n }),\n ).subscribe();\n }\n\n private initializeAutocomplete():void {\n if (this.initialized) {\n return;\n }\n\n // Set focus on collapsible menu's back button.\n // This improves accessibility for blind users to tell them their current location.\n const buttonArrowLeft = document.getElementById('main-menu-work-packages-wrapper')?.parentElement\n ?.getElementsByClassName('main-menu--arrow-left-to-project')[0] as HTMLElement;\n if (buttonArrowLeft) {\n buttonArrowLeft.focus();\n }\n\n this.updateMenuOnChanges();\n this.initializeViews();\n this.initialized = true;\n }\n\n private static matchesText(text:string, searchText:string):boolean {\n return text.toLowerCase().includes(searchText.toLowerCase());\n }\n\n private initializeViews():void {\n const categories:{ [category:string]:IOpSidemenuItem[] } = {\n starred: [],\n default: [],\n public: [],\n private: [],\n createNew: [],\n };\n\n const params:ApiV3ListParameters = {\n filters: [\n ['type', '=', [this.apiViewType]],\n ],\n pageSize: MAGIC_PAGE_NUMBER,\n };\n\n if (this.projectId) {\n params.filters?.push(\n ['project', '=', [this.projectId]],\n );\n } else {\n params.filters?.push(\n ['project', '!*', []],\n );\n }\n\n this.viewsService.fetchResults(params)\n .pipe(this.untilDestroyed())\n .subscribe((views) => {\n views\n .sort((a, b) => a._links.query.title.localeCompare(b._links.query.title))\n .forEach((view) => {\n let cat = 'private';\n if (view.public) {\n cat = 'public';\n }\n if (view.starred) {\n cat = 'starred';\n }\n\n categories[cat].push(this.toOpSideMenuItem(view));\n });\n\n const staticQueries = this.opStaticQueries.getStaticQueriesForView(this.viewType);\n const viewCategories = [\n { title: this.text.scope_starred, children: categories.starred, collapsible: true },\n { title: this.text.scope_default, children: staticQueries, collapsible: true },\n { title: this.text.scope_global, children: categories.public, collapsible: true },\n { title: this.text.scope_private, children: categories.private, collapsible: true },\n ];\n\n this.viewCategories$.next(viewCategories);\n });\n }\n\n private toOpSideMenuItem(view:IView):IOpSidemenuItem {\n const { query } = view._links;\n return {\n title: query.title,\n uiSref: this.baseRoute,\n uiParams: { query_id: idFromLink(query.href), query_props: '' },\n uiOptions: { reload: true },\n };\n }\n\n // Listens on all changes of queries (via an observable in the service), e.g. delete, create, rename, toggle starred\n private updateMenuOnChanges() {\n this.states.changes.queries\n .pipe(this.untilDestroyed())\n .subscribe(() => this.initializeViews());\n }\n}\n","
\n
\n
\n \n \n \n
\n\n

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

\n\n \n \n
\n
\n","\n \n
\n

{{ option.title }}

\n

\n
\n\n","import {\n Component,\n EventEmitter,\n forwardRef,\n HostBinding,\n Input,\n Output,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport interface IOpOptionListOption {\n value:T;\n title:string;\n disabled?:boolean;\n description?:string;\n}\n\nexport type IOpOptionListValue = T|null;\n\n@Component({\n // Style is imported globally\n templateUrl: './option-list.component.html',\n selector: 'op-option-list',\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OpOptionListComponent),\n multi: true,\n }],\n})\nexport class OpOptionListComponent implements ControlValueAccessor {\n @HostBinding('class.op-option-list') className = true;\n\n @Input() options:IOpOptionListOption[] = [];\n\n @Input() name = `op-option-list-${+(new Date())}`;\n\n @Output() selectedChange = new EventEmitter();\n\n private _selected:IOpOptionListValue = null;\n\n get selected() {\n return this._selected;\n }\n\n set selected(value:IOpOptionListValue) {\n this._selected = value;\n this.onChange(value);\n }\n\n getClassListForItem(option:IOpOptionListOption) {\n return {\n 'op-option-list--item': true,\n 'op-option-list--item_selected': this.selected === option.value,\n 'op-option-list--item_disabled': !!option.disabled,\n };\n }\n\n onChange = (_:IOpOptionListValue) => {};\n\n onTouched = (_:IOpOptionListValue) => {};\n\n writeValue(value:IOpOptionListValue) {\n this._selected = value;\n }\n\n registerOnChange(fn:any) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn:any) {\n this.onTouched = fn;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\n\nexport const persistentToggleSelector = 'persistent-toggle';\n\n@Component({\n selector: persistentToggleSelector,\n template: '',\n})\nexport class PersistentToggleComponent implements OnInit {\n /** Unique identifier of the toggle */\n private identifier:string;\n\n /** Is hidden */\n private isHidden = false;\n\n /** Element reference */\n private $element:JQuery;\n\n private $targetNotification:JQuery;\n\n constructor(private elementRef:ElementRef) {\n }\n\n ngOnInit():void {\n this.$element = jQuery(this.elementRef.nativeElement);\n this.$targetNotification = this.getTargetNotification();\n\n this.identifier = this.$element.data('identifier');\n this.isHidden = window.OpenProject.guardedLocalStorage(this.identifier) === 'true';\n\n // Set initial state\n this.$targetNotification.prop('hidden', !!this.isHidden);\n\n // Register click handler\n this.$element\n .parent()\n .find('.persistent-toggle--click-handler')\n .on('click', () => this.toggle(!this.isHidden));\n\n // Register target toaster close icon\n this.$targetNotification\n .find('.op-toast--close')\n .on('click', () => this.toggle(true));\n }\n\n private getTargetNotification() {\n return this.$element\n .parent()\n .find('.persistent-toggle--toaster');\n }\n\n private toggle(isNowHidden:boolean) {\n this.isHidden = isNowHidden;\n window.OpenProject.guardedLocalStorage(this.identifier, (!!isNowHidden).toString());\n\n if (isNowHidden) {\n this.$targetNotification.slideUp(400, () => {\n // Set hidden only after animation completed\n this.$targetNotification.prop('hidden', true);\n });\n } else {\n this.$targetNotification.slideDown(400);\n this.$targetNotification.prop('hidden', 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 { PrincipalLike } from 'core-app/shared/components/principal/principal-types';\nimport { IPrincipal } from 'core-app/core/state/principals/principal.model';\nimport { HalSourceLink } from 'core-app/features/hal/resources/hal-resource';\n\nexport type PrincipalType = 'user'|'placeholder_user'|'group'|'external_user';\n\n/*\n * This function is a helper that wraps around the old HalResource based principal type and the new interface based one.\n *\n * TODO: Remove old HalResource stuff :P\n */\nexport function hrefFromPrincipal(p:IPrincipal|PrincipalLike):string {\n if ((p as PrincipalLike).href) {\n return (p as PrincipalLike).href || '';\n }\n\n if ((p as IPrincipal)._links) {\n const self = (p as IPrincipal)._links.self as HalSourceLink;\n return self.href || '';\n }\n\n return '';\n}\nexport function typeFromHref(href:string):PrincipalType|null {\n const match = /\\/(user|group|placeholder_user|external_user)s\\/\\d+$/.exec(href);\n\n if (!match) {\n return null;\n }\n\n return match[1] as PrincipalType;\n}\n","import { Injectable } from '@angular/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { ColorsService, colorModes } from 'core-app/shared/components/colors/colors.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { IPrincipal } from 'core-app/core/state/principals/principal.model';\nimport { PrincipalLike } from './principal-types';\nimport {\n PrincipalType,\n hrefFromPrincipal,\n typeFromHref,\n} from './principal-helper';\n\nexport type AvatarSize = 'default'|'medium'|'mini';\n\nexport interface AvatarOptions {\n hide:boolean;\n size:AvatarSize;\n}\n\nexport interface NameOptions {\n hide:boolean;\n link:boolean;\n classes?:string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class PrincipalRendererService {\n constructor(\n private pathHelper:PathHelperService,\n private apiV3Service:ApiV3Service,\n private colors:ColorsService,\n ) {\n }\n\n renderMultiple(\n container:HTMLElement,\n users:PrincipalLike[]|IPrincipal[],\n name:NameOptions = { hide: false, link: false },\n avatar:AvatarOptions = { hide: false, size: 'default' },\n multiLine = false,\n ):void {\n container.classList.add('op-principal');\n const list = document.createElement('span');\n\n for (let i = 0; i < users.length; i++) {\n const userElement = document.createElement('span');\n if (multiLine) {\n userElement.classList.add('op-principal--multi-line');\n }\n\n this.render(userElement, users[i], name, avatar);\n\n list.appendChild(userElement);\n\n if (!multiLine && i < users.length - 1) {\n const sep = document.createElement('span');\n sep.textContent = ', ';\n list.appendChild(sep);\n }\n }\n\n container.appendChild(list);\n }\n\n render(\n container:HTMLElement,\n principal:PrincipalLike|IPrincipal,\n name:NameOptions = { hide: false, link: true },\n avatar:AvatarOptions = { hide: false, size: 'default' },\n title:string|null = null,\n ):void {\n if (!container.dataset.testSelector) {\n container.dataset.testSelector = 'op-principal';\n }\n container.classList.add('op-principal');\n const type = typeFromHref(hrefFromPrincipal(principal)) as PrincipalType;\n\n if (!avatar.hide) {\n const el = this.renderAvatar(principal, avatar, type);\n container.appendChild(el);\n }\n\n if (!name.hide) {\n const el = this.renderName(principal, type, name.link, title || principal.name, name.classes);\n container.appendChild(el);\n }\n }\n\n private renderAvatar(\n principal:PrincipalLike|IPrincipal,\n options:AvatarOptions,\n type:PrincipalType,\n ) {\n const userInitials = this.getInitials(principal.name);\n const colorMode = this.colors.colorMode();\n const colorCode = this.colors.toHsl(principal.name, colorMode);\n\n const fallback = document.createElement('div');\n fallback.classList.add('op-principal--avatar');\n fallback.classList.add('op-avatar');\n fallback.classList.add(`op-avatar_${options.size}`);\n fallback.classList.add(`op-avatar_${type.replace('_', '-')}`);\n fallback.classList.add('op-avatar--fallback');\n fallback.title = principal.name;\n fallback.textContent = userInitials;\n\n if (type === 'placeholder_user' && colorMode !== colorModes.lightHighContrast) {\n fallback.style.color = colorCode;\n fallback.style.borderColor = colorCode;\n } else {\n fallback.style.background = colorCode;\n }\n\n // Image avatars are only supported for users\n if (type === 'user') {\n this.renderUserAvatar(principal, fallback, options);\n }\n\n return fallback;\n }\n\n private renderUserAvatar(principal:PrincipalLike|IPrincipal, fallback:HTMLElement, options:AvatarOptions):void {\n const url = this.userAvatarUrl(principal);\n\n if (!url) {\n return;\n }\n\n const image = new Image();\n image.classList.add('op-avatar');\n image.classList.add(`op-avatar_${options.size}`);\n image.src = url;\n image.title = principal.name;\n image.alt = principal.name;\n image.onload = () => {\n fallback.replaceWith(image);\n // eslint-disable-next-line no-param-reassign\n (fallback as unknown) = undefined;\n };\n }\n\n private userAvatarUrl(principal:PrincipalLike|IPrincipal):string|null {\n const id = principal.id || idFromLink(hrefFromPrincipal(principal));\n return id ? this.apiV3Service.users.id(id).avatar.toString() : null;\n }\n\n private renderName(\n principal:PrincipalLike|IPrincipal,\n type:PrincipalType,\n asLink = true,\n title = '',\n classes = '',\n ) {\n if (asLink) {\n const link = document.createElement('a');\n link.textContent = principal.name;\n link.href = this.principalURL(principal, type);\n link.target = '_blank';\n link.classList.add('op-principal--name');\n link.title = title;\n\n return link;\n }\n\n const span = document.createElement('span');\n span.textContent = principal.name;\n span.classList.add('op-principal--name');\n span.title = title;\n classes !== '' && classes.split(' ').forEach((cls) => {\n span.classList.add(cls);\n });\n return span;\n }\n\n private principalURL(principal:PrincipalLike|IPrincipal, type:PrincipalType):string {\n const href = hrefFromPrincipal(principal);\n const id = principal.id || (href ? idFromLink(href) : '');\n\n switch (type) {\n case 'group':\n return this.pathHelper.groupPath(id);\n case 'placeholder_user':\n return this.pathHelper.placeholderUserPath(id);\n case 'user':\n return this.pathHelper.userPath(id);\n default:\n throw new Error('Invalid principal type provided');\n }\n }\n\n private getInitials(name:string):string {\n const characters = [...name];\n const lastSpace = name.lastIndexOf(' ');\n const first = characters[0]?.toUpperCase();\n const last = name[lastSpace + 1]?.toUpperCase();\n\n return [first, last].join('');\n }\n}\n","\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n HostBinding,\n} from '@angular/core';\nimport { PrincipalLike } from 'core-app/shared/components/principal/principal-types';\n\n@Component({\n selector: 'op-principal-list',\n templateUrl: './principal-list.component.html',\n styleUrls: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OpPrincipalListComponent {\n @HostBinding('class.op-principal-list') className = true;\n\n @Input() principals:PrincipalLike[];\n}\n","import { Injector, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { OpPrincipalComponent } from './principal.component';\nimport { OpPrincipalListComponent } from './principal-list.component';\nimport { PrincipalRendererService } from './principal-renderer.service';\n\n@NgModule({\n imports: [\n CommonModule,\n ],\n exports: [\n OpPrincipalComponent,\n OpPrincipalListComponent,\n ],\n providers: [\n PrincipalRendererService,\n ],\n declarations: [\n OpPrincipalComponent,\n OpPrincipalListComponent,\n ],\n})\nexport class OpenprojectPrincipalRenderingModule {\n constructor(readonly injector:Injector) {\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 Input,\n OnInit,\n ViewEncapsulation,\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 { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport {\n AvatarSize,\n PrincipalRendererService,\n} from './principal-renderer.service';\nimport { PrincipalLike } from './principal-types';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\nimport { PrincipalType } from 'core-app/shared/components/principal/principal-helper';\nimport { PrincipalsResourceService } from 'core-app/core/state/principals/principals.service';\n\nexport const principalSelector = 'op-principal';\n\nexport interface PrincipalInput {\n type:PrincipalType;\n id:string;\n}\n\n@Component({\n template: '',\n selector: principalSelector,\n styleUrls: ['./principal.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class OpPrincipalComponent implements OnInit {\n @Input() principal:PrincipalLike;\n\n @Input() hideAvatar = false;\n\n @Input() hideName = false;\n\n @Input() nameClasses? = '';\n\n @Input() link = true;\n\n @Input() size:AvatarSize = 'default';\n\n @Input() title = '';\n\n public constructor(\n readonly elementRef:ElementRef,\n readonly PathHelper:PathHelperService,\n readonly principalRenderer:PrincipalRendererService,\n readonly principalResourceService:PrincipalsResourceService,\n readonly I18n:I18nService,\n readonly apiV3Service:ApiV3Service,\n readonly timezoneService:TimezoneService,\n readonly cdRef:ChangeDetectorRef,\n ) {\n populateInputsFromDataset(this);\n }\n\n ngOnInit() {\n if (this.principal.name) {\n this.principalRenderer.render(\n this.elementRef.nativeElement as HTMLElement,\n this.principal,\n {\n hide: this.hideName,\n link: this.link,\n classes: this.nameClasses,\n },\n {\n hide: this.hideAvatar,\n size: this.size,\n },\n this.title === '' ? null : this.title,\n );\n }\n }\n}\n","import { IProject } from 'core-app/core/state/projects/project.model';\nimport { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport { IProjectData } from 'core-app/shared/components/searchable-project-list/project-data';\n\nconst UNDISCLOSED_ANCESTOR = 'urn:openproject-org:api:v3:undisclosed';\n\n// Helper function that recursively inserts a project into the hierarchy at the right place\nexport const insertInList = (\n projects:IProject[],\n project:IProject,\n list:IProjectData[],\n ancestors:IHalResourceLink[],\n):IProjectData[] => {\n // In a set of projects, some ancestors may be undisclosed. The client then knows of its existence\n // but knows nothing more than that. Those projects receive an 'undisclosed' urn for their href. For building\n // the project hierarchy, they can be ignored.\n const visibleAncestors = ancestors.filter((ancestor) => ancestor.href !== UNDISCLOSED_ANCESTOR);\n\n if (!visibleAncestors.length) {\n return [\n ...list,\n {\n id: project.id,\n name: project.name,\n href: project._links.self.href,\n disabled: false,\n children: [],\n position: 0,\n },\n ];\n }\n\n const ancestorHref = visibleAncestors[0].href;\n const ancestor:IProjectData|undefined = list.find((projectInList) => projectInList.href === ancestorHref);\n\n if (ancestor) {\n ancestor.children = insertInList(projects, project, ancestor.children, visibleAncestors.slice(1));\n return [...list];\n }\n\n const ancestorProject = projects.find((projectInList) => projectInList._links.self.href === ancestorHref);\n if (!ancestorProject) {\n return [...list];\n }\n\n return [\n ...list,\n {\n id: ancestorProject.id,\n name: ancestorProject.name,\n href: ancestorProject._links.self.href,\n disabled: true,\n children: insertInList(projects, project, [], visibleAncestors.slice(1)),\n position: 0,\n },\n ];\n};\n","\n \n \n \n \n {{ project.name }}\n \n \n\n \n {{ text.current_project }}\n\n \n {{ text.include_all_selected }}\n \n {{ text.does_not_match_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 ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostBinding,\n Input,\n Output,\n} from '@angular/core';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport SpotDropAlignmentOption from 'core-app/spot/drop-alignment-options';\nimport { IProjectData } from 'core-app/shared/components/searchable-project-list/project-data';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport {\n SearchableProjectListService,\n} from 'core-app/shared/components/searchable-project-list/searchable-project-list.service';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[op-project-include-list]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './project-include-list.component.html',\n styleUrls: ['./project-include-list.component.sass'],\n})\nexport class OpProjectIncludeListComponent {\n @HostBinding('class.spot-list') classNameList = true;\n\n @HostBinding('class.op-project-include-list') className = true;\n\n @Output() update = new EventEmitter();\n\n @Input() @HostBinding('class.op-project-include-list--root') root = false;\n\n @Input() projects:IProjectData[] = [];\n\n @Input() selected:string[] = [];\n\n @Input() searchText = '';\n\n @Input() includeSubprojects = false;\n\n @Input() parentChecked = false;\n\n public get currentProjectHref():string|null {\n return this.currentProjectService.apiv3Path;\n }\n\n public text = {\n does_not_match_search: this.I18n.t('js.include_projects.tooltip.does_not_match_search'),\n include_all_selected: this.I18n.t('js.include_projects.tooltip.include_all_selected'),\n current_project: this.I18n.t('js.include_projects.tooltip.current_project'),\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly currentProjectService:CurrentProjectService,\n readonly pathHelper:PathHelperService,\n readonly searchableProjectListService:SearchableProjectListService,\n ) { }\n\n public updateList(selected:string[]):void {\n this.update.emit(selected);\n }\n\n public isChecked(href:string):boolean {\n return this.selected.includes(href);\n }\n\n public changeSelected(project:IProjectData):void {\n if (project.disabled) {\n return;\n }\n\n const { href } = project;\n const checked = this.isChecked(href);\n\n if (checked) {\n this.updateList(this.selected.filter((selectedHref) => selectedHref !== href));\n } else {\n this.updateList([\n ...this.selected,\n href,\n ]);\n }\n }\n\n public getTooltipAlignment(project:IProjectData):SpotDropAlignmentOption {\n if (project.position <= 1) {\n return SpotDropAlignmentOption.BottomLeft;\n }\n\n return SpotDropAlignmentOption.TopLeft;\n }\n\n extendedProjectUrl(projectId:string):string {\n const currentMenuItem = document.querySelector('meta[name=\"current_menu_item\"]') as HTMLMetaElement;\n const url = this.pathHelper.projectPath(projectId);\n\n if (!currentMenuItem) {\n return url;\n }\n\n return `${url}?jump=${encodeURIComponent(currentMenuItem.content)}`;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { IProjectData } from 'core-app/shared/components/searchable-project-list/project-data';\n\nexport const calculatePositions = (data:IProjectData[], start = 0):[IProjectData[], number] => {\n let current = start;\n\n return [data.map((value) => {\n value.position = current;\n current += 1;\n [value.children, current] = calculatePositions(value.children, current);\n return value;\n }), current];\n};\n","\n \n {{ text.toggle_title }}\n \n \n \n \n\n \n
\n

{{ text.title }}

\n \n
\n \n \n \n \n\n \n 0; else noResultsTemplate\"\n class=\"op-project-include--list\"\n [ngClass]=\"{ 'spot-list_active': textFieldFocused }\"\n op-project-include-list\n [projects]=\"projects\"\n [selected]=\"selectedProjects\"\n [includeSubprojects]=\"includeSubprojects$ | async\"\n [searchText]=\"searchableProjectListService.searchText\"\n [root]=\"true\"\n (update)=\"selectedProjects = $event\"\n data-test-selector=\"project-include-list\"\n data-list-root=\"true\"\n >\n\n \n \n {{text.no_results}}\n \n \n \n\n
\n
\n \n
\n
\n \n {{ text.clear_selection }}\n \n \n {{ text.apply }}\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 HostBinding,\n OnInit,\n} from '@angular/core';\nimport { BehaviorSubject, combineLatest } from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n mergeMap,\n shareReplay,\n take,\n} from 'rxjs/operators';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport {\n WorkPackageViewFiltersService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport {\n WorkPackageViewIncludeSubprojectsService,\n} from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-include-subprojects.service';\nimport { QueryFilterInstanceResource } from 'core-app/features/hal/resources/query-filter-instance-resource';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { IProject } from 'core-app/core/state/projects/project.model';\nimport {\n SearchableProjectListService,\n} from 'core-app/shared/components/searchable-project-list/searchable-project-list.service';\nimport { IProjectData } from 'core-app/shared/components/searchable-project-list/project-data';\n\nimport { insertInList } from './insert-in-list';\nimport { recursiveSort } from './recursive-sort';\nimport { calculatePositions } from 'core-app/shared/components/project-include/calculate-positions';\n\n@Component({\n selector: 'op-project-include',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './project-include.component.html',\n styleUrls: ['./project-include.component.sass'],\n providers: [\n SearchableProjectListService,\n ],\n})\nexport class OpProjectIncludeComponent extends UntilDestroyedMixin implements OnInit {\n @HostBinding('class.op-project-include') className = true;\n\n public text = {\n toggle_title: this.I18n.t('js.include_projects.toggle_title'),\n title: this.I18n.t('js.include_projects.title'),\n filter_all: this.I18n.t('js.include_projects.selected_filter.all'),\n filter_selected: this.I18n.t('js.include_projects.selected_filter.selected'),\n search_placeholder: this.I18n.t('js.include_projects.search_placeholder'),\n clear_selection: this.I18n.t('js.include_projects.clear_selection'),\n apply: this.I18n.t('js.include_projects.apply'),\n include_subprojects: this.I18n.t('js.include_projects.include_subprojects'),\n no_results: this.I18n.t('js.include_projects.no_results'),\n };\n\n public opened = false;\n\n public textFieldFocused = false;\n\n public query$ = this.wpTableFilters.querySpace.query.values$();\n\n public displayModeOptions = [\n { value: 'all', title: this.text.filter_all },\n { value: 'selected', title: this.text.filter_selected },\n ];\n\n private _displayMode = 'all';\n\n public get displayMode():string {\n return this._displayMode;\n }\n\n public set displayMode(val:string) {\n this._displayMode = val;\n this.displayMode$.next(val);\n }\n\n public displayMode$ = new BehaviorSubject('all');\n\n private _includeSubprojects = true;\n\n public get includeSubprojects():boolean {\n return this._includeSubprojects;\n }\n\n public set includeSubprojects(val:boolean) {\n this._includeSubprojects = val;\n this.includeSubprojects$.next(val);\n }\n\n public includeSubprojects$ = new BehaviorSubject(true);\n\n private _selectedProjects:string[] = [];\n\n public get selectedProjects():string[] {\n return this._selectedProjects;\n }\n\n public set selectedProjects(val:string[]) {\n this._selectedProjects = val;\n this.selectedProjects$.next(val);\n }\n\n public selectedProjects$ = new BehaviorSubject([]);\n\n private projectsInFilter$ = this.wpTableFilters\n .live$()\n .pipe(\n this.untilDestroyed(),\n map((queryFilters) => {\n const projectFilter = queryFilters.find((queryFilter) => queryFilter._type === 'ProjectQueryFilter');\n const selectedProjectHrefs = ((projectFilter?.values || []) as HalResource[]).map((p) => p.href);\n const currentProjectHref = this.currentProjectService.apiv3Path;\n if (selectedProjectHrefs.includes(currentProjectHref)) {\n return selectedProjectHrefs;\n }\n const selectedProjects = [...selectedProjectHrefs];\n if (currentProjectHref) {\n selectedProjects.push(currentProjectHref);\n }\n return selectedProjects;\n }),\n );\n\n public numberOfProjectsInFilter$ = this.projectsInFilter$.pipe(map((selected) => selected.length));\n\n public projects$ = combineLatest([\n this.searchableProjectListService.allProjects$,\n this.displayMode$.pipe(distinctUntilChanged()),\n this.includeSubprojects$.pipe(debounceTime(20)),\n this.searchableProjectListService.searchText$.pipe(debounceTime(200)),\n ]).pipe(\n mergeMap(([projects, displayMode, includeSubprojects, searchText]) => this.selectedProjects$.pipe(\n take(1),\n map((selected) => [projects, displayMode, includeSubprojects, searchText, selected]),\n )),\n map(\n ([projects, displayMode, includeSubprojects, searchText, selected]:[IProject[], string, boolean, string, string[]]) => [\n projects\n .filter(\n (project) => {\n if (searchText.length) {\n const matches = project.name.toLowerCase().includes(searchText.toLowerCase());\n\n if (!matches) {\n return false;\n }\n }\n\n if (displayMode !== 'selected') {\n return true;\n }\n\n if (selected.includes(project._links.self.href)) {\n return true;\n }\n\n const hasSelectedAncestor = project._links.ancestors.reduce(\n (anySelected, ancestor) => anySelected || selected.includes(ancestor.href),\n false,\n );\n\n if (includeSubprojects && hasSelectedAncestor) {\n return true;\n }\n\n return false;\n },\n )\n .sort((a, b) => a._links.ancestors.length - b._links.ancestors.length)\n .reduce(\n (list, project) => {\n const { ancestors } = project._links;\n\n return insertInList(\n projects,\n project,\n list,\n ancestors,\n );\n },\n [] as IProjectData[],\n ),\n includeSubprojects,\n ],\n ),\n mergeMap(([projects, includeSubprojects]) => this.selectedProjects$.pipe(\n map((selected) => [projects, includeSubprojects, selected]),\n )),\n map(([projects, includeSubprojects, selected]:[IProjectData[], boolean, string[]]) => {\n const isDisabled = (project:IProjectData, parentChecked:boolean) => {\n if (project.disabled) {\n return true;\n }\n\n if (project.href === this.currentProjectService.apiv3Path) {\n return true;\n }\n\n return includeSubprojects && parentChecked;\n };\n\n const setDisabledStatus = (project:IProjectData, parentChecked:boolean):IProjectData => ({\n ...project,\n disabled: isDisabled(project, parentChecked),\n children: project.children.map(\n (child) => setDisabledStatus(child, parentChecked || selected.includes(project.href)),\n ),\n });\n\n return projects.map((project) => setDisabledStatus(project, false));\n }),\n map((projects) => recursiveSort(projects)),\n map((projects) => (calculatePositions(projects))[0]),\n shareReplay(),\n );\n\n /* This seems like a way too convoluted loading check, but there's a good reason we need it.\n * The searchableProjectListService says fetching is \"done\" when the request returns.\n * However, this causes flickering on the initial load, since `projects$` still needs\n * to do the tree calculation. In the template, we show the project-list when `loading$ | async` is false,\n * but if we would only make this depend on `fetchingProjects$` Angular would still wait with\n * rendering the project-list until `projects$ | async` has also fired.\n *\n * To fix this, we first wait for fetchingProjects$ to be true once,\n * then switch over to projects$, and after that has pinged once, it switches back to\n * fetchingProjects$ as the decider for when fetching is done.\n */\n public loading$ = this.searchableProjectListService.fetchingProjects$.pipe(\n filter((fetching) => fetching),\n take(1),\n mergeMap(() => this.projects$),\n mergeMap(() => this.searchableProjectListService.fetchingProjects$),\n );\n\n constructor(\n readonly I18n:I18nService,\n readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly wpIncludeSubprojects:WorkPackageViewIncludeSubprojectsService,\n readonly halResourceService:HalResourceService,\n readonly currentProjectService:CurrentProjectService,\n readonly searchableProjectListService:SearchableProjectListService,\n ) {\n super();\n\n this.projects$\n .pipe(\n this.untilDestroyed(),\n filter((p) => p.length > 0),\n take(1),\n )\n .subscribe((projects) => {\n this.searchableProjectListService.resetActiveResult(projects);\n });\n }\n\n public ngOnInit():void {\n this.query$\n .pipe(\n map((query) => query.includeSubprojects),\n distinctUntilChanged(),\n )\n .subscribe((includeSubprojects) => {\n this.includeSubprojects = includeSubprojects;\n });\n }\n\n public toggleIncludeSubprojects():void {\n this.wpIncludeSubprojects.setIncludeSubprojects(!this.wpIncludeSubprojects.current);\n }\n\n public toggleOpen():void {\n this.opened = !this.opened;\n\n if (this.opened) {\n this.searchableProjectListService.loadAllProjects();\n this.projectsInFilter$\n .pipe(\n take(1),\n )\n .subscribe((selectedProjects) => {\n this.displayMode = 'all';\n this.searchableProjectListService.searchText = '';\n this.selectedProjects = selectedProjects as string[];\n });\n }\n }\n\n public clearSelection():void {\n this.selectedProjects = [this.currentProjectService.apiv3Path || ''];\n }\n\n public onSubmit(e:Event):void {\n e.preventDefault();\n\n // Replace actually also instantiates if it does not exist, which is handy here\n this.wpTableFilters.replace('project', (projectFilter:QueryFilterInstanceResource) => {\n const projectHrefs = this.selectedProjects;\n // eslint-disable-next-line no-param-reassign\n projectFilter.values = projectHrefs.map((href:string) => this.halResourceService.createHalResource({ href }, true));\n });\n\n this.wpIncludeSubprojects.update(this.includeSubprojects);\n\n this.close();\n }\n\n public close():void {\n this.opened = false;\n }\n}\n","import { IProjectData } from 'core-app/shared/components/searchable-project-list/project-data';\n\n// Recursively sort project children and their children by name\nexport const recursiveSort = (projects:IProjectData[]):IProjectData[] => projects\n .map((project) => ({\n ...project,\n children: recursiveSort(project.children),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { KeyCodes } from 'core-app/shared/helpers/keyCodes.enum';\nimport { HttpClient } from '@angular/common/http';\n\nexport const remoteFieldUpdaterSelector = 'remote-field-updater';\n\n@Component({\n selector: remoteFieldUpdaterSelector,\n template: '',\n})\nexport class RemoteFieldUpdaterComponent implements OnInit {\n constructor(private elementRef:ElementRef,\n private http:HttpClient) {\n }\n\n private url:string;\n\n private htmlMode:boolean;\n\n private inputs:JQuery;\n\n private target:JQuery;\n\n ngOnInit():void {\n const $element = jQuery(this.elementRef.nativeElement);\n const $form = $element.parent();\n this.inputs = $form.find('.remote-field--input');\n this.target = $form.find('.remote-field--target');\n\n this.url = $element.data('url');\n this.htmlMode = $element.data('mode') === 'html';\n\n this.inputs.on('keyup change', _.debounce((event:JQuery.TriggeredEvent) => {\n // This prevents an update of the result list when\n // tabbing to the result list (9),\n // pressing enter (13)\n // tabbing back with shift (16) and\n // special cases where the tab code is not correctly recognized (undefined).\n // Thus the focus is kept on the first element of the result list.\n const keyCodes = [KeyCodes.TAB, KeyCodes.ENTER, KeyCodes.SHIFT];\n if (event.type === 'change' || (event.which && keyCodes.indexOf(event.which) === -1)) {\n this.updater();\n }\n }, 500));\n }\n\n private request(params:any) {\n const headers:any = {};\n\n // In HTML mode, expect html response\n if (this.htmlMode) {\n headers.Accept = 'text/html';\n } else {\n headers.Accept = 'application/json';\n }\n\n return this.http\n .get(\n this.url,\n {\n params,\n headers,\n responseType: (this.htmlMode ? 'text' : 'json') as any,\n withCredentials: true,\n },\n );\n }\n\n private updater() {\n const params:any = {};\n\n // Gather request keys\n this.inputs.each((i, el:HTMLInputElement) => {\n params[el.dataset.remoteFieldKey!] = el.value;\n });\n\n this\n .request(params)\n .subscribe((response:any) => {\n if (this.htmlMode) {\n // Replace the given target\n this.target.html(response);\n } else {\n _.each(response, (val:string, selector:string) => {\n const element = document.getElementById(selector) as HTMLElement|HTMLInputElement;\n\n if (element instanceof HTMLInputElement) {\n element.value = val;\n } else if (element) {\n element.textContent = val;\n }\n });\n }\n });\n }\n}\n","
\n
\n\n","import {\n Component, EventEmitter, HostListener, Input, OnDestroy, Output,\n} from '@angular/core';\nimport { setBodyCursor } from 'core-app/shared/helpers/dom/set-window-cursor.helper';\n\nexport interface ResizeDelta {\n origin:any;\n\n // Absolute difference from start\n absolute:{\n x:number;\n y:number;\n };\n\n // Relative difference from last position\n relative:{\n x:number;\n y:number;\n };\n}\n\n@Component({\n selector: 'resizer',\n templateUrl: './resizer.component.html',\n})\nexport class ResizerComponent implements OnDestroy {\n private startX:number;\n\n private startY:number;\n\n private oldX:number;\n\n private oldY:number;\n\n private newX:number;\n\n private newY:number;\n\n private mouseMoveHandler:EventListener;\n\n private mouseUpHandler:EventListener;\n\n private resizing = false;\n\n @Output() end:EventEmitter = new EventEmitter();\n\n @Output() start:EventEmitter = new EventEmitter();\n\n @Output() move:EventEmitter = new EventEmitter();\n\n @Input() customHandler = false;\n\n @Input() cursorClass = 'nwse-resize';\n\n @Input() resizerClass = 'resizer';\n\n ngOnDestroy() {\n this.removeEventListener();\n }\n\n @HostListener('mousedown', ['$event'])\n @HostListener('touchstart', ['$event'])\n public startResize(event:any) {\n event.preventDefault();\n event.stopPropagation();\n\n // Only on left mouse click the resizing is started\n if (event.buttons === 1 || event.which === 1 || event.which === 0) {\n // Getting starting position\n this.oldX = this.startX = event.clientX || event.pageX || event.touches[0].clientX;\n this.oldY = this.startY = event.clientY || event.pageY || event.touches[0].clientY;\n\n this.newX = event.clientX || event.pageX || event.touches[0].clientX;\n this.newY = event.clientY || event.pageY || event.touches[0].clientY;\n\n this.resizing = true;\n\n this.setResizeCursor();\n this.bindEventListener(event);\n\n this.start.emit(this.buildDelta(event));\n }\n }\n\n private onMouseUp(event:any) {\n this.setAutoCursor();\n this.removeEventListener();\n\n this.end.emit(this.buildDelta(event));\n }\n\n private onMouseMove(event:any) {\n event.preventDefault();\n event.stopPropagation();\n\n this.oldX = this.newX;\n this.oldY = this.newY;\n\n this.newX = event.clientX || event.pageX || event.touches[0].clientX;\n this.newY = event.clientY || event.pageY || event.touches[0].clientX;\n\n this.move.emit(this.buildDelta(event));\n }\n\n // Necessary to encapsulate this to be able to remove the event listener later\n private bindEventListener(event:any) {\n this.mouseMoveHandler = this.onMouseMove.bind(this);\n this.mouseUpHandler = this.onMouseUp.bind(this);\n\n window.addEventListener('mousemove', this.mouseMoveHandler);\n window.addEventListener('touchmove', this.mouseMoveHandler);\n window.addEventListener('mouseup', this.mouseUpHandler);\n window.addEventListener('touchend', this.mouseUpHandler);\n }\n\n private removeEventListener() {\n window.removeEventListener('touchmove', this.mouseMoveHandler);\n window.removeEventListener('mousemove', this.mouseMoveHandler);\n window.removeEventListener('mouseup', this.mouseUpHandler);\n window.removeEventListener('touchend', this.mouseUpHandler);\n }\n\n private setResizeCursor() {\n setBodyCursor(this.cursorClass, 'important');\n }\n\n private setAutoCursor() {\n setBodyCursor('auto');\n }\n\n private buildDelta(event:any):ResizeDelta {\n return {\n origin: event,\n absolute: {\n x: this.newX - this.startX,\n y: this.newY - this.startY,\n },\n relative: {\n x: this.newX - this.oldX,\n y: this.newY - this.oldX,\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, ChangeDetectionStrategy, Component, ElementRef, Input, OnInit,\n} from '@angular/core';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { TransitionService } from '@uirouter/core';\nimport { BrowserDetector } from 'core-app/core/browser/browser-detector.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ResizeDelta } from 'core-app/shared/components/resizer/resizer.component';\nimport { fromEvent } from 'rxjs';\nimport { MainMenuToggleService } from 'core-app/core/main-menu/main-menu-toggle.service';\n\n@Component({\n selector: 'wp-resizer',\n template: `\n \n \n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n\nexport class WpResizerDirective extends UntilDestroyedMixin implements OnInit, AfterViewInit {\n @Input() elementClass:string;\n\n @Input() resizeEvent:string;\n\n @Input() localStorageKey:string;\n\n @Input() resizeStyle:'flexBasis'|'width' = 'flexBasis';\n\n private resizingElement:HTMLElement;\n\n private elementWidth:number;\n\n private element:HTMLElement;\n\n private resizer:HTMLElement;\n\n // Min-width this element is allowed to have\n private elementMinWidth = 530;\n\n public moving = false;\n\n public resizerClass = 'work-packages--resizer icon-resizer-vertical-lines';\n\n constructor(readonly toggleService:MainMenuToggleService,\n private elementRef:ElementRef,\n readonly $transitions:TransitionService,\n readonly browserDetector:BrowserDetector) {\n super();\n }\n\n ngOnInit() {\n // Get element\n // We use this more complicated approach of taking the last element of the class as it allows\n // to still work in case an element is duplicated by Angular.\n const elements = document.getElementsByClassName(this.elementClass);\n this.resizingElement = elements[elements.length - 1];\n\n // Get initial width from local storage and apply\n const localStorageValue = this.parseLocalStorageValue();\n this.elementWidth = localStorageValue\n || (this.resizingElement.offsetWidth < this.elementMinWidth\n ? this.elementMinWidth\n : this.resizingElement.offsetWidth);\n\n // This case only happens when the timeline is loaded but not displayed.\n // Therefor the flexbasis will be set to 50%, just in px\n if (this.elementWidth === 0 && this.resizingElement.parentElement) {\n this.elementWidth = this.resizingElement.parentElement.offsetWidth / 2;\n }\n\n this.resizingElement.style[this.resizeStyle] = `${this.elementWidth}px`;\n\n // Add event listener\n this.element = this.elementRef.nativeElement;\n\n // Listen on sidebar changes and toggle column layout, if necessary\n this.toggleService.changeData$\n .pipe(\n distinctUntilChanged(),\n this.untilDestroyed(),\n debounceTime(100),\n )\n .subscribe(() => {\n this.applyColumnLayout();\n });\n\n // Listen to event\n fromEvent(window, 'resize', { passive: true })\n .pipe(\n this.untilDestroyed(),\n debounceTime(250),\n )\n .subscribe(() => this.applyColumnLayout());\n }\n\n ngAfterViewInit():void {\n // Get the reziser\n this.resizer = this.elementRef.nativeElement.getElementsByClassName(this.resizerClass)[0];\n\n this.applyColumnLayout();\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n // Reset the style when killing this directive, otherwise the style remains\n this.resizingElement.style[this.resizeStyle] = '';\n }\n\n resizeStart() {\n // In case we dragged the resizer farther than the element can actually grow,\n // we reset it to the actual width at the start of the new resizing\n const localStorageValue = this.parseLocalStorageValue();\n const actualElementWidth = this.resizingElement.offsetWidth;\n if (localStorageValue && localStorageValue > actualElementWidth) {\n this.elementWidth = actualElementWidth;\n }\n }\n\n resizeEnd() {\n const localStorageValue = this.parseLocalStorageValue();\n if (localStorageValue) {\n this.elementWidth = localStorageValue;\n }\n\n // Send a event that we resized this element\n const event = new Event(this.resizeEvent);\n window.dispatchEvent(event);\n\n this.manageErrorClass(false);\n }\n\n resizeMove(deltas:ResizeDelta) {\n // Get new value depending on the delta\n this.elementWidth -= deltas.relative.x;\n let newValue;\n\n // The resizingElement is not allowed to be smaller than the elementMinWidth\n if (this.elementWidth < this.elementMinWidth) {\n newValue = this.elementMinWidth;\n\n // Show the resizer red when it reaches its limit (min-width)\n this.manageErrorClass(true);\n } else {\n newValue = this.elementWidth;\n\n this.manageErrorClass(false);\n }\n\n // Store item in local storage\n window.OpenProject.guardedLocalStorage(this.localStorageKey, `${newValue}`);\n\n // Apply two column layout\n this.applyColumnLayout();\n\n // Set new width\n this.resizingElement.style[this.resizeStyle] = `${newValue}px`;\n }\n\n private parseLocalStorageValue():number|undefined {\n const localStorageValue = window.OpenProject.guardedLocalStorage(this.localStorageKey);\n const number = parseInt(localStorageValue || '', 10);\n\n if (typeof number === 'number' && !Number.isNaN(number)) {\n return number;\n }\n\n return undefined;\n }\n private applyColumnLayout(checkWidth = 750) {\n const singleView = document.querySelectorAll(\"[data-selector='wp-single-view']\")[0] as HTMLElement;\n if (singleView) {\n jQuery(singleView).toggleClass('work-package--single-view_with-columns', singleView.offsetWidth > checkWidth);\n }\n }\n\n private manageErrorClass(shouldBePresent:boolean) {\n if (shouldBePresent && !this.resizer.classList.contains('-error-font')) {\n this.resizer.classList.add('-error-font');\n }\n\n if (!shouldBePresent && this.resizer.classList.contains('-error-font')) {\n this.resizer.classList.remove('-error-font');\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n templateUrl: './loading-project-list.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'op-loading-project-list',\n encapsulation: ViewEncapsulation.None,\n})\nexport class OpLoadingProjectListComponent { }\n","\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n","import { Injectable } from '@angular/core';\nimport {\n ApiV3ListFilter,\n ApiV3ListParameters,\n listParamsString,\n} from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { BehaviorSubject } from 'rxjs';\nimport { IProject } from 'core-app/core/state/projects/project.model';\nimport { getPaginatedResults } from 'core-app/core/apiv3/helpers/get-paginated-results';\nimport { IHALCollection } from 'core-app/core/apiv3/types/hal-collection.type';\nimport { finalize, take } from 'rxjs/operators';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { HttpClient } from '@angular/common/http';\nimport { KeyCodes } from 'core-app/shared/helpers/keyCodes.enum';\nimport { ID } from '@datorama/akita';\nimport { IProjectData } from './project-data';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\n\n@Injectable()\nexport class SearchableProjectListService {\n private _searchText = '';\n\n get searchText():string {\n return this._searchText;\n }\n\n set searchText(val:string) {\n this._searchText = val;\n this.searchText$.next(val);\n }\n\n selectedItemID$ = new BehaviorSubject(null);\n\n searchText$ = new BehaviorSubject('');\n\n allProjects$ = new BehaviorSubject([]);\n\n fetchingProjects$ = new BehaviorSubject(false);\n\n constructor(\n readonly http:HttpClient,\n readonly apiV3Service:ApiV3Service,\n readonly currentProjectService:CurrentProjectService,\n ) { }\n\n public loadAllProjects():void {\n this.fetchingProjects$.next(true);\n\n getPaginatedResults(\n (params) => {\n const collectionURL = listParamsString({ ...this.params, ...params });\n return this.http.get>(this.apiV3Service.projects.path + collectionURL);\n },\n )\n .pipe(\n finalize(() => this.fetchingProjects$.next(false)),\n )\n .subscribe((projects) => {\n this.allProjects$.next(projects);\n });\n }\n\n public get params():ApiV3ListParameters {\n const filters:ApiV3ListFilter[] = [\n ['active', '=', ['t']],\n ];\n\n return {\n filters,\n pageSize: -1,\n select: [\n 'elements/id',\n 'elements/name',\n 'elements/identifier',\n 'elements/self',\n 'elements/ancestors',\n 'total',\n 'count',\n 'pageSize',\n ],\n };\n }\n\n onKeydown(event:KeyboardEvent, projects:IProjectData[]):void {\n this.selectedItemID$\n .pipe(take(1))\n .subscribe((activeID) => {\n switch (event.keyCode) {\n case KeyCodes.UP_ARROW:\n event.preventDefault();\n this.selectPreviousResult(activeID, projects);\n break;\n case KeyCodes.DOWN_ARROW:\n event.preventDefault();\n this.selectNextResult(activeID, projects);\n break;\n case KeyCodes.ENTER:\n event.stopPropagation();\n event.preventDefault();\n this.activateSelectedResult(event);\n break;\n default:\n break;\n }\n });\n }\n\n public resetActiveResult(projects:IProjectData[]):void {\n const findFirstNonDisabledID = (projects:IProjectData[]):ID|null => {\n for (let i = 0; i < projects.length; i++) {\n if (!projects[i].disabled) {\n return projects[i].id;\n }\n\n const childFound = findFirstNonDisabledID(projects[i].children);\n if (childFound !== null) {\n return childFound;\n }\n }\n\n return null;\n }\n\n this.selectedItemID$.next(findFirstNonDisabledID(projects));\n }\n\n private selectPreviousResult(activeID:ID|null, allProjects:IProjectData[]):void {\n if (activeID === null) {\n return;\n }\n\n const findLastChild = (project:IProjectData):IProjectData => {\n if (project?.children?.length) {\n return findLastChild(project.children[project.children.length - 1]);\n }\n\n return project;\n };\n\n const findPreviousID = (idOfCurrent:ID, projects:IProjectData[], parent?:IProjectData):ID|null => {\n for (let i = 0; i < projects.length; i++) {\n if (projects[i].id === idOfCurrent) {\n const previous = findLastChild(projects[i - 1]) || projects[i - 1] || parent;\n if (!previous) {\n return null;\n }\n\n if (previous.disabled) {\n return findPreviousID(previous.id, allProjects);\n }\n\n return previous.id;\n }\n\n const previous = findPreviousID(idOfCurrent, projects[i].children, projects[i]);\n if (previous !== null) {\n return previous;\n }\n }\n\n return null;\n };\n\n const foundPreviousID = findPreviousID(activeID, allProjects);\n if (foundPreviousID !== null) {\n this.selectedItemID$.next(foundPreviousID);\n } else {\n this.resetActiveResult(allProjects);\n }\n }\n\n private selectNextResult(activeID:ID|null, allProjects:IProjectData[]):void {\n if (activeID === null) {\n return;\n }\n\n const findNextID = (idOfCurrent:ID, projects:IProjectData[], nextParent?:IProjectData):ID|null => {\n for (let i = 0; i < projects.length; i++) {\n if (projects[i].id === idOfCurrent) {\n const next = projects[i].children[0] || projects[i + 1] || nextParent;\n if (!next) {\n return null;\n }\n\n if (next.disabled) {\n return findNextID(next.id, allProjects);\n }\n\n return next.id;\n }\n\n const next = findNextID(idOfCurrent, projects[i].children, projects[i + 1] || nextParent);\n if (next !== null) {\n return next;\n }\n }\n\n return null;\n };\n\n const foundNextID = findNextID(activeID, allProjects);\n if (foundNextID !== null) {\n this.selectedItemID$.next(foundNextID);\n } else {\n this.resetActiveResult(allProjects);\n }\n }\n\n private activateSelectedResult(event:KeyboardEvent):void {\n const findSearchableListParent = (el:HTMLElement|null):HTMLElement|null => {\n if (!el) {\n return null;\n }\n\n if ('searchableListParent' in el.dataset) {\n return el;\n }\n\n return findSearchableListParent(el.parentElement);\n };\n\n const listParent = findSearchableListParent(event.currentTarget as HTMLElement);\n const focused = document.activeElement;\n (listParent?.querySelector('.spot-list--item-action_active') as HTMLElement)?.click();\n (focused as HTMLElement)?.focus();\n }\n}\n","\n {{ title }}\n \n \n\n\n\n {{ title }}\n\n\n\n \n \n\n \n \n \n\n \n \n \n\n \n\n\n\n \n {{ item.title }}\n \n \n {{ item.count }}\n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n HostBinding,\n ElementRef,\n} from '@angular/core';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\n\nexport interface IOpSidemenuItem {\n title:string;\n icon?:string;\n count?:number;\n href?:string;\n uiSref?:string;\n uiParams?:unknown;\n uiOptions?:unknown;\n children?:IOpSidemenuItem[];\n collapsible?:boolean;\n isEnterprise?:boolean;\n}\n\nexport const sidemenuSelector = 'op-sidemenu';\n\n@Component({\n selector: sidemenuSelector,\n templateUrl: './sidemenu.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OpSidemenuComponent {\n @HostBinding('class.op-sidemenu') className = true;\n\n @Input() items:IOpSidemenuItem[] = [];\n\n @Input() title:string;\n\n @Input() collapsible = false;\n\n @Input() searchable = false;\n\n public collapsed = false;\n\n noEEToken = this.Banner.eeShowBanners;\n\n constructor(\n readonly elementRef:ElementRef,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n readonly Banner:BannersService,\n ) {\n populateInputsFromDataset(this);\n }\n\n toggleCollapsed():void {\n this.collapsed = !this.collapsed;\n }\n}\n","\n {{text.notAllowdTooltipText}}

\n\n \n \n \n \n \n \n\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { IFileIcon } from 'core-app/shared/components/storages/icons.mapping';\nimport { IFileLink, IFileLinkOriginData } from 'core-app/core/state/file-links/file-link.model';\nimport { fileLinkViewAllowed } from 'core-app/shared/components/storages/storages-constants.const';\nimport { PrincipalRendererService } from 'core-app/shared/components/principal/principal-renderer.service';\nimport { ConfirmDialogOptions } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.modal';\nimport { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';\nimport { getIconForMimeType, isDirectory } from 'core-app/shared/components/storages/functions/storages.functions';\nimport SpotDropAlignmentOption from 'core-app/spot/drop-alignment-options';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[op-file-link-list-item]',\n templateUrl: './file-link-list-item.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FileLinkListItemComponent implements OnInit, AfterViewInit {\n @Input() public fileLink:IFileLink;\n\n @Input() public allowEditing = false;\n\n @Input() public disabled = true;\n\n @Output() public removeFileLink = new EventEmitter();\n\n @ViewChild('avatar') avatar:ElementRef;\n\n infoTimestampText:string;\n\n fileLinkIcon:IFileIcon;\n\n downloadAllowed:boolean;\n\n viewAllowed:boolean;\n\n tooltipAllignment:SpotDropAlignmentOption = SpotDropAlignmentOption.TopLeft;\n\n text = {\n title: {\n openFile: this.i18n.t('js.storages.file_links.open'),\n openFileLocation: this.i18n.t('js.storages.file_links.open_location'),\n removeFileLink: this.i18n.t('js.storages.file_links.remove'),\n downloadFileLink: '',\n },\n floatingText: {\n noViewPermission: this.i18n.t('js.storages.file_links.no_permission'),\n },\n removalTitle: this.i18n.t('js.storages.file_links.remove'),\n removalButtonLabel: this.i18n.t('js.storages.file_links.remove_short'),\n removalConfirmation: this.i18n.t('js.storages.file_links.remove_confirmation'),\n notAllowdTooltipText: this.i18n.t('js.storages.file_links.not_allowed_tooltip'),\n };\n\n constructor(\n private readonly i18n:I18nService,\n private readonly timezoneService:TimezoneService,\n private readonly confirmDialogService:ConfirmDialogService,\n private readonly principalRendererService:PrincipalRendererService,\n ) {}\n\n private get originData():IFileLinkOriginData {\n return this.fileLink.originData;\n }\n\n ngOnInit():void {\n if (this.originData.lastModifiedAt) {\n this.infoTimestampText = this.timezoneService.parseDatetime(this.originData.lastModifiedAt).fromNow();\n }\n\n this.fileLinkIcon = getIconForMimeType(this.originData.mimeType);\n\n this.downloadAllowed = !isDirectory(this.originData);\n\n this.text.title.downloadFileLink = this.i18n.t(\n 'js.storages.file_links.download',\n { fileName: this.fileLink.originData.name },\n );\n\n this.viewAllowed = !this.fileLink._links.permission || this.fileLink._links.permission.href === fileLinkViewAllowed;\n }\n\n ngAfterViewInit():void {\n if (this.originData.lastModifiedByName) {\n this.principalRendererService.render(\n this.avatar.nativeElement as HTMLElement,\n { name: this.originData.lastModifiedByName, href: '/external_users/1' },\n { hide: true, link: false },\n { hide: false, size: 'mini' },\n );\n } else {\n this.principalRendererService.render(\n this.avatar.nativeElement as HTMLElement,\n { name: 'Not Available', href: '/placeholder_users/1' },\n { hide: true, link: false },\n { hide: false, size: 'mini' },\n );\n }\n }\n\n public confirmRemoveFileLink():void {\n const options:ConfirmDialogOptions = {\n text: {\n text: this.text.removalConfirmation,\n title: this.text.removalTitle,\n button_continue: this.text.removalButtonLabel,\n },\n icon: {\n continue: 'remove-link',\n },\n };\n void this.confirmDialogService\n .confirm(options)\n .then(() => { this.removeFileLink.emit(); })\n .catch(() => { /* confirmation rejected */ });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport interface Breadcrumb {\n text:string;\n icon?:string;\n navigate?:() => void;\n}\n\nexport class BreadcrumbsContent {\n constructor(\n public readonly crumbs:Breadcrumb[],\n ) { }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 ElementRef,\n Inject,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport {\n BehaviorSubject,\n Observable,\n of,\n Subscription,\n switchMap,\n} from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\n\nimport { IStorage } from 'core-app/core/state/storages/storage.model';\nimport { IStorageFile } from 'core-app/core/state/storage-files/storage-file.model';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { SortFilesPipe } from 'core-app/shared/components/storages/pipes/sort-files.pipe';\nimport { StorageFilesResourceService } from 'core-app/core/state/storage-files/storage-files.service';\nimport { Breadcrumb, BreadcrumbsContent } from 'core-app/spot/components/breadcrumbs/breadcrumbs-content';\nimport {\n StorageFileListItem,\n} from 'core-app/shared/components/storages/storage-file-list-item/storage-file-list-item';\nimport {\n isDirectory,\n getIconForStorageType,\n makeFilesCollectionLink,\n} from 'core-app/shared/components/storages/functions/storages.functions';\nimport {\n IHalErrorBase,\n v3ErrorIdentifierOutboundRequestForbidden,\n} from 'core-app/features/hal/resources/error-resource';\n\ntype Alert = 'none'|'noAccess'|'managedFolderNoAccess'|'managedFolderNotFound';\n\n@Directive()\nexport abstract class FilePickerBaseModalComponent extends OpModalComponent implements OnInit, OnDestroy {\n private loadingSubscription:Subscription;\n\n protected readonly storageFiles$ = new BehaviorSubject([]);\n\n protected currentDirectory:IStorageFile;\n\n protected get storage():IStorage {\n return this.locals.storage as IStorage;\n }\n\n public breadcrumbs:BreadcrumbsContent = new BreadcrumbsContent([{\n text: this.storage.name,\n icon: getIconForStorageType(this.storage._links.type.href),\n navigate: () => {},\n }]);\n\n public showAlert:BehaviorSubject = new BehaviorSubject('none');\n\n public listItems$:Observable = this.storageFiles$\n .pipe(\n map((files) =>\n this.sortFilesPipe.transform(files)\n .map((file, index) => this.storageFileToListItem(file, index))),\n );\n\n public readonly loading$ = new BehaviorSubject<'loading'|'success'|'error'>('loading');\n\n protected constructor(\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly elementRef:ElementRef,\n readonly cdRef:ChangeDetectorRef,\n protected readonly sortFilesPipe:SortFilesPipe,\n protected readonly storageFilesResourceService:StorageFilesResourceService,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit():void {\n super.ngOnInit();\n\n this.entryLocation()\n .pipe(\n this.untilDestroyed(),\n switchMap((location:string) => this.storageFilesResourceService.files(makeFilesCollectionLink(this.storage._links.self, location))),\n )\n .subscribe({\n next: (storageFiles) => {\n this.currentDirectory = storageFiles.parent;\n this.breadcrumbs = this.makeBreadcrumbs(storageFiles.ancestors, storageFiles.parent);\n this.storageFiles$.next(storageFiles.files);\n this.loading$.next('success');\n },\n error: (error) => {\n this.loading$.next('error');\n throw error;\n },\n });\n }\n\n ngOnDestroy():void {\n super.ngOnDestroy();\n\n this.storageFilesResourceService.reset();\n }\n\n public closeAlert():void {\n this.showAlert.next('none');\n }\n\n protected abstract storageFileToListItem(file:IStorageFile, index:number):StorageFileListItem;\n\n protected enterDirectoryCallback(directory:IStorageFile):() => void {\n if (!isDirectory(directory)) {\n return () => {};\n }\n\n return () => this.changeLevel(directory);\n }\n\n protected changeLevel(ancestor:IStorageFile):void {\n this.cancelCurrentLoading();\n this.loading$.next('loading');\n\n this.loadingSubscription = this.storageFilesResourceService\n .files(makeFilesCollectionLink(this.storage._links.self, ancestor.location))\n .subscribe({\n next: (storageFiles) => {\n this.currentDirectory = storageFiles.parent;\n this.breadcrumbs = this.makeBreadcrumbs(storageFiles.ancestors, storageFiles.parent);\n this.storageFiles$.next(storageFiles.files);\n this.loading$.next('success');\n },\n error: (error) => {\n this.loading$.next('error');\n throw error;\n },\n });\n }\n\n private entryLocation():Observable {\n if (this.locals.projectFolderMode === 'inactive' || this.locals.projectFolderMode === undefined) {\n return of('/');\n }\n\n if (this.locals.projectFolderMode === 'automatic' && this.locals.projectFolderHref === null) {\n this.showAlert.next('managedFolderNotFound');\n return of('/');\n }\n\n return this.storageFilesResourceService\n .file(this.locals.projectFolderHref as string)\n .pipe(\n map((file) => file.location),\n catchError((response:HttpErrorResponse) => {\n const isForbiddenOnStorage = response.status === 500\n && (response.error as IHalErrorBase).errorIdentifier === v3ErrorIdentifierOutboundRequestForbidden;\n\n if (!isForbiddenOnStorage) {\n throw new Error(response.message);\n }\n\n if (this.locals.projectFolderMode === 'automatic') {\n this.showAlert.next('managedFolderNoAccess');\n } else {\n this.showAlert.next('noAccess');\n }\n return of('/');\n }),\n );\n }\n\n private cancelCurrentLoading():void {\n this.loadingSubscription?.unsubscribe();\n }\n\n private makeBreadcrumbs(ancestors:IStorageFile[], parent:IStorageFile):BreadcrumbsContent {\n const crumbs = ancestors.concat(parent).map((ancestor):Breadcrumb => {\n const isRoot = ancestor.location === '/';\n const icon = isRoot ? getIconForStorageType(this.storage._links.type.href) : undefined;\n const text = isRoot ? this.storage.name : ancestor.name;\n return { icon, text, navigate: () => this.changeLevel(ancestor) };\n });\n\n return new BreadcrumbsContent(crumbs);\n }\n}\n","\n
\n {{text.header}}\n
\n\n
\n\n
\n \n
\n

{{alertText | async}}

\n \n \n \n
\n
\n\n \n\n \n \n \n\n \n 0; else emptyTemplate\"\n class=\"spot-list spot-list_compact op-file-list op-file-picker--scrollable-content\"\n data-test-selector=\"op-files-picker-modal--file-list\"\n >\n \n \n \n\n \n \n \n\n \n
\n \n \n
\n
\n\n \n
\n \n \n \n
\n
\n \n\n
\n \n \n \n \n \n
\n
\n \n 0 }\"\n [disabled]=\"selectedFileCount === 0\"\n (click)=\"createSelectedFileLinks()\"\n >\n \n {{text.buttons.submit(selectedFileCount)}}\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,\n} from '@angular/core';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { map, take } from 'rxjs/operators';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { IFileLink } from 'core-app/core/state/file-links/file-link.model';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { IStorageFile } from 'core-app/core/state/storage-files/storage-file.model';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { SortFilesPipe } from 'core-app/shared/components/storages/pipes/sort-files.pipe';\nimport { FileLinksResourceService } from 'core-app/core/state/file-links/file-links.service';\nimport { isDirectory, storageLocaleString } from 'core-app/shared/components/storages/functions/storages.functions';\nimport { StorageFilesResourceService } from 'core-app/core/state/storage-files/storage-files.service';\nimport {\n StorageFileListItem,\n} from 'core-app/shared/components/storages/storage-file-list-item/storage-file-list-item';\nimport {\n FilePickerBaseModalComponent,\n} from 'core-app/shared/components/storages/file-picker-base-modal/file-picker-base-modal.component';\n\n@Component({\n templateUrl: 'file-picker-modal.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FilePickerModalComponent extends FilePickerBaseModalComponent {\n public readonly text = {\n header: this.i18n.t('js.storages.file_links.select'),\n alertNoAccess: this.i18n.t('js.storages.files.project_folder_no_access'),\n alertNoManagedProjectFolder: this.i18n.t('js.storages.files.managed_project_folder_not_available'),\n alertNoAccessToManagedProjectFolder: this.i18n.t('js.storages.files.managed_project_folder_no_access'),\n content: {\n empty: this.i18n.t('js.storages.files.empty_folder'),\n emptyHint: this.i18n.t('js.storages.files.empty_folder_location_hint'),\n noConnection: (storageType:string) => this.i18n.t('js.storages.no_connection', { storageType }),\n noConnectionHint: (storageType:string) => this.i18n.t('js.storages.information.connection_error', { storageType }),\n },\n buttons: {\n submit: (count:number):string => this.i18n.t('js.storages.file_links.selection', { count }),\n cancel: this.i18n.t('js.button_cancel'),\n selectAll: this.i18n.t('js.storages.file_links.select_all'),\n },\n tooltip: {\n alreadyLinkedFile: this.i18n.t('js.storages.file_links.already_linked_file'),\n alreadyLinkedDirectory: this.i18n.t('js.storages.file_links.already_linked_directory'),\n },\n toast: {\n successFileLinksCreated: (count:number):string => this.i18n.t('js.storages.file_links.success_create', { count }),\n },\n };\n\n public get selectedFileCount():number {\n return this.selection.size;\n }\n\n public get storageType():string {\n return this.i18n.t(storageLocaleString(this.storage._links.type.href));\n }\n\n public get alertText():Observable {\n return this.showAlert\n .pipe(\n map((alert) => {\n switch (alert) {\n case 'noAccess':\n return this.text.alertNoAccess;\n case 'managedFolderNoAccess':\n return this.text.alertNoAccessToManagedProjectFolder;\n case 'managedFolderNotFound':\n return this.text.alertNoManagedProjectFolder;\n case 'none':\n return '';\n default:\n throw new Error('unknown alert type');\n }\n }),\n );\n }\n\n public showSelectAll = false;\n\n private readonly selection = new Set();\n\n private readonly fileMap:Record = {};\n\n constructor(\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly elementRef:ElementRef,\n readonly cdRef:ChangeDetectorRef,\n protected readonly sortFilesPipe:SortFilesPipe,\n protected readonly storageFilesResourceService:StorageFilesResourceService,\n private readonly i18n:I18nService,\n private readonly toastService:ToastService,\n private readonly timezoneService:TimezoneService,\n private readonly configuration:ConfigurationService,\n private readonly fileLinksResourceService:FileLinksResourceService,\n ) {\n super(\n locals,\n elementRef,\n cdRef,\n sortFilesPipe,\n storageFilesResourceService,\n );\n\n this.showSelectAll = this.configuration.activeFeatureFlags.includes('storageFilePickingSelectAll');\n }\n\n public createSelectedFileLinks():void {\n const files = Array.from(this.selection).map((id) => this.fileMap[id]);\n this.fileLinksResourceService.addFileLinks(\n this.locals.collectionKey as string,\n this.locals.addFileLinksHref as string,\n this.storage._links.self,\n files,\n ).subscribe(\n (fileLinks) => { this.toastService.addSuccess(this.text.toast.successFileLinksCreated(fileLinks.count)); },\n (error:HttpErrorResponse) => { this.toastService.addError(error); },\n );\n\n this.service.close();\n }\n\n public selectAllOfCurrentLevel():void {\n this.storageFiles$\n .pipe(take(1))\n .subscribe((files) => {\n files.forEach((file) => {\n const id = file.id as string;\n if (!this.selection.has(id) && !this.isAlreadyLinked(file)) {\n this.selection.add(id);\n this.fileMap[id] = file;\n }\n });\n\n // push the file data again to the subject\n // to trigger a rerender with new selection state\n this.storageFiles$.next(files);\n });\n }\n\n public changeSelection(file:IStorageFile):void {\n const fileId = file.id as string;\n if (this.selection.has(fileId)) {\n this.selection.delete(fileId);\n } else {\n this.selection.add(fileId);\n this.fileMap[fileId] = file;\n }\n }\n\n protected storageFileToListItem(file:IStorageFile, index:number):StorageFileListItem {\n return new StorageFileListItem(\n this.timezoneService,\n file,\n this.isAlreadyLinked(file),\n index === 0,\n this.enterDirectoryCallback(file),\n false,\n this.tooltip(file),\n {\n selected: this.selection.has(file.id as string),\n changeSelection: () => { this.changeSelection(file); },\n },\n );\n }\n\n private isAlreadyLinked(file:IStorageFile):boolean {\n const currentFileLinks = this.locals.fileLinks as IFileLink[];\n const found = currentFileLinks.find((a) => a.originData.id === file.id);\n\n return !!found;\n }\n\n private tooltip(file:IStorageFile):string|undefined {\n if (!this.isAlreadyLinked(file)) {\n return undefined;\n }\n\n return isDirectory(file) ? this.text.tooltip.alreadyLinkedDirectory : this.text.tooltip.alreadyLinkedFile;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n fileIconMappings,\n IFileIcon,\n storageIconMappings,\n} from 'core-app/shared/components/storages/icons.mapping';\nimport { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport { IFileLinkOriginData } from 'core-app/core/state/file-links/file-link.model';\nimport { nextcloud } from 'core-app/shared/components/storages/storages-constants.const';\n\nexport function isDirectory(originData:IFileLinkOriginData):boolean {\n return originData.mimeType === 'application/x-op-directory';\n}\n\nexport function getIconForMimeType(mimeType?:string):IFileIcon {\n if (mimeType && fileIconMappings[mimeType]) {\n return fileIconMappings[mimeType];\n }\n\n return fileIconMappings.default;\n}\n\nexport function getIconForStorageType(storageType?:string):string {\n if (storageType && storageIconMappings[storageType]) {\n return storageIconMappings[storageType];\n }\n\n return storageIconMappings.default;\n}\n\nexport function makeFilesCollectionLink(storageLink:IHalResourceLink, location:string):IHalResourceLink {\n const query = location !== '/' ? `?parent=${location}` : '';\n\n return {\n href: `${storageLink.href}/files${query}`,\n title: 'Storage files',\n };\n}\n\nconst storageTypeMap:Record = {\n [nextcloud]: 'js.storages.types.nextcloud',\n default: 'js.storages.types.default',\n};\n\nexport function storageLocaleString(storageTypeUrn:string) {\n return storageTypeMap[storageTypeUrn] || storageTypeMap.default;\n}\n","// --copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { nextcloud } from 'core-app/shared/components/storages/storages-constants.const';\n\nexport interface IFileIcon {\n icon:'image1'|'movie'|'file-text'|'export-pdf-descr'|'file-doc'|'file-sheet'|'file-presentation'|'folder'|'ticket'\n clazz:'pdf'|'img'|'txt'|'doc'|'sheet'|'presentation'|'form'|'primary'|'mov'|'default'\n}\n\nexport const fileIconMappings:Record = {\n 'application/pdf': { icon: 'export-pdf-descr', clazz: 'pdf' },\n\n 'image/jpeg': { icon: 'image1', clazz: 'img' },\n 'image/png': { icon: 'image1', clazz: 'img' },\n 'image/gif': { icon: 'image1', clazz: 'img' },\n 'image/svg+xml': { icon: 'image1', clazz: 'img' },\n 'image/tiff': { icon: 'image1', clazz: 'img' },\n 'image/bmp': { icon: 'image1', clazz: 'img' },\n 'image/webp': { icon: 'image1', clazz: 'img' },\n 'image/heic': { icon: 'image1', clazz: 'img' },\n 'image/heif': { icon: 'image1', clazz: 'img' },\n 'image/avif': { icon: 'image1', clazz: 'img' },\n 'image/cgm': { icon: 'image1', clazz: 'img' },\n\n 'text/plain': { icon: 'file-text', clazz: 'txt' },\n 'text/markdown': { icon: 'file-text', clazz: 'txt' },\n 'text/html': { icon: 'file-text', clazz: 'txt' },\n 'application/rtf': { icon: 'file-text', clazz: 'txt' },\n 'application/xml': { icon: 'file-text', clazz: 'txt' },\n 'application/xhtml+xml': { icon: 'file-text', clazz: 'txt' },\n 'application/x-tex': { icon: 'file-text', clazz: 'txt' },\n\n 'application/vnd.oasis.opendocument.text': { icon: 'file-doc', clazz: 'doc' },\n 'application/vnd.oasis.opendocument.text-template': { icon: 'file-doc', clazz: 'doc' },\n 'application/msword': { icon: 'file-doc', clazz: 'doc' },\n 'application/vnd.apple.pages': { icon: 'file-doc', clazz: 'doc' },\n 'application/vnd.stardivision.writer': { icon: 'file-doc', clazz: 'doc' },\n 'application/x-abiword': { icon: 'file-doc', clazz: 'doc' },\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': { icon: 'file-doc', clazz: 'doc' },\n 'font/otf': { icon: 'file-doc', clazz: 'doc' },\n\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': { icon: 'file-sheet', clazz: 'sheet' },\n 'application/vnd.oasis.opendocument.spreadsheet': { icon: 'file-sheet', clazz: 'sheet' },\n 'application/vnd.oasis.opendocument.spreadsheet-template': { icon: 'file-sheet', clazz: 'sheet' },\n 'application/vnd.ms-excel': { icon: 'file-sheet', clazz: 'sheet' },\n 'application/vnd.stardivision.calc': { icon: 'file-sheet', clazz: 'sheet' },\n 'application/vnd.apple.numbers': { icon: 'file-sheet', clazz: 'sheet' },\n 'application/x-starcalc': { icon: 'file-sheet', clazz: 'sheet' },\n 'application/x-quattro-pro': { icon: 'file-sheet', clazz: 'sheet' },\n 'application/csv': { icon: 'file-sheet', clazz: 'sheet' },\n\n 'application/vnd.oasis.opendocument.presentation': { icon: 'file-presentation', clazz: 'presentation' },\n 'application/vnd.oasis.opendocument.presentation-template': { icon: 'file-presentation', clazz: 'presentation' },\n 'application/vnd.apple.keynote': { icon: 'file-presentation', clazz: 'presentation' },\n 'application/vnd.ms-powerpoint': { icon: 'file-presentation', clazz: 'presentation' },\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': {\n icon: 'file-presentation',\n clazz: 'presentation',\n },\n 'application/vnd.stardivision.impress': { icon: 'file-presentation', clazz: 'presentation' },\n 'application/mathematica': { icon: 'file-presentation', clazz: 'presentation' },\n\n 'video/mp4': { icon: 'movie', clazz: 'mov' },\n 'video/x-m4v': { icon: 'movie', clazz: 'mov' },\n 'video/avi': { icon: 'movie', clazz: 'mov' },\n 'video/quicktime': { icon: 'movie', clazz: 'mov' },\n 'video/webm': { icon: 'movie', clazz: 'mov' },\n 'video/mpg': { icon: 'movie', clazz: 'mov' },\n 'video/x-matroska': { icon: 'movie', clazz: 'mov' },\n 'video/mp1s': { icon: 'movie', clazz: 'mov' },\n 'video/mp2p': { icon: 'movie', clazz: 'mov' },\n 'video/3gpp': { icon: 'movie', clazz: 'mov' },\n 'video/3gpp-tt': { icon: 'movie', clazz: 'mov' },\n 'video/3gpp-2': { icon: 'movie', clazz: 'mov' },\n\n 'application/x-op-directory': { icon: 'folder', clazz: 'primary' },\n\n default: { icon: 'ticket', clazz: 'default' },\n};\n\nexport const storageIconMappings:Record = {\n [nextcloud]: 'nextcloud-circle',\n\n default: 'hosting',\n};\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n templateUrl: './loading-file-list.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'op-loading-file-list',\n encapsulation: ViewEncapsulation.None,\n})\nexport class LoadingFileListComponent { }\n","\n \n\n \n\n \n\n \n\n \n\n","\n
\n {{text.header}}\n
\n\n
\n\n
\n \n
\n

{{alertText | async}}

\n \n \n \n
\n
\n\n \n\n \n \n \n\n \n 0; else emptyTemplate\"\n class=\"spot-list spot-list_compact op-file-list op-file-picker--scrollable-content\"\n data-test-selector=\"op-files-picker-modal--file-list\"\n >\n \n \n \n\n \n \n \n\n \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 Inject,\n} from '@angular/core';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { IStorageFile } from 'core-app/core/state/storage-files/storage-file.model';\nimport { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types';\nimport { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service';\nimport { SortFilesPipe } from 'core-app/shared/components/storages/pipes/sort-files.pipe';\nimport { isDirectory, storageLocaleString } from 'core-app/shared/components/storages/functions/storages.functions';\nimport { StorageFilesResourceService } from 'core-app/core/state/storage-files/storage-files.service';\nimport {\n StorageFileListItem,\n} from 'core-app/shared/components/storages/storage-file-list-item/storage-file-list-item';\nimport {\n FilePickerBaseModalComponent,\n} from 'core-app/shared/components/storages/file-picker-base-modal/file-picker-base-modal.component';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n@Component({\n templateUrl: 'location-picker-modal.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LocationPickerModalComponent extends FilePickerBaseModalComponent {\n public submitted = false;\n\n public readonly text = {\n header: this.i18n.t('js.storages.select_location'),\n alertNoAccess: this.i18n.t('js.storages.files.project_folder_no_access'),\n alertNoManagedProjectFolder: this.i18n.t('js.storages.files.managed_project_folder_not_available'),\n alertNoAccessToManagedProjectFolder: this.i18n.t('js.storages.files.managed_project_folder_no_access'),\n content: {\n empty: this.i18n.t('js.storages.files.empty_folder'),\n emptyHint: this.i18n.t('js.storages.files.empty_folder_location_hint'),\n noConnection: (storageType:string) => this.i18n.t('js.storages.no_connection', { storageType }),\n noConnectionHint: (storageType:string) => this.i18n.t('js.storages.information.connection_error', { storageType }),\n },\n buttons: {\n submit: this.i18n.t('js.storages.choose_location'),\n submitEmptySelection: this.i18n.t('js.storages.file_links.selection_none'),\n cancel: this.i18n.t('js.button_cancel'),\n selectAll: this.i18n.t('js.storages.file_links.select_all'),\n },\n tooltip: {\n directory_not_writeable: this.i18n.t('js.storages.files.directory_not_writeable'),\n file_not_selectable: this.i18n.t('js.storages.files.file_not_selectable_location'),\n },\n };\n\n public get location():IStorageFile {\n return this.currentDirectory;\n }\n\n public get storageType():string {\n return this.i18n.t(storageLocaleString(this.storage._links.type.href));\n }\n\n public get filesAtLocation():IStorageFile[] {\n return this.storageFiles$.getValue();\n }\n\n public get canChooseLocation():boolean {\n if (!this.currentDirectory) {\n return false;\n }\n\n return this.currentDirectory.permissions.some((value) => value === 'writeable');\n }\n\n public get alertText():Observable {\n return this.showAlert\n .pipe(\n map((alert) => {\n switch (alert) {\n case 'noAccess':\n return this.text.alertNoAccess;\n case 'managedFolderNoAccess':\n return this.text.alertNoAccessToManagedProjectFolder;\n case 'managedFolderNotFound':\n return this.text.alertNoManagedProjectFolder;\n case 'none':\n return '';\n default:\n throw new Error('unknown alert type');\n }\n }),\n );\n }\n\n constructor(\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly elementRef:ElementRef,\n readonly cdRef:ChangeDetectorRef,\n protected sortFilesPipe:SortFilesPipe,\n protected readonly storageFilesResourceService:StorageFilesResourceService,\n private readonly i18n:I18nService,\n private readonly timezoneService:TimezoneService,\n ) {\n super(\n locals,\n elementRef,\n cdRef,\n sortFilesPipe,\n storageFilesResourceService,\n );\n }\n\n public chooseLocation():void {\n this.submitted = true;\n this.service.close();\n }\n\n protected storageFileToListItem(file:IStorageFile, index:number):StorageFileListItem {\n return new StorageFileListItem(\n this.timezoneService,\n file,\n !isDirectory(file),\n index === 0,\n this.enterDirectoryCallback(file),\n this.isConstrained(file),\n this.tooltip(file),\n undefined,\n );\n }\n\n private isConstrained(file:IStorageFile):boolean {\n return !file.permissions.some((permission) => permission === 'writeable');\n }\n\n private tooltip(file:IStorageFile):string|undefined {\n if (isDirectory(file)) {\n return file.permissions.some((permission) => permission === 'writeable')\n ? undefined\n : this.text.tooltip.directory_not_writeable;\n }\n\n return this.text.tooltip.file_not_selectable;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { isDirectory } from 'core-app/shared/components/storages/functions/storages.functions';\nimport { IFileLinkOriginData } from 'core-app/core/state/file-links/file-link.model';\n\n@Pipe({\n name: 'sortFiles',\n})\nexport class SortFilesPipe implements PipeTransform {\n transform(array:T[]):T[] {\n return array.sort((a, b):number => {\n if (isDirectory(a) && isDirectory(b)) {\n return a.name.localeCompare(b.name);\n }\n\n if (isDirectory(a)) {\n return -1;\n }\n\n if (isDirectory(b)) {\n return 1;\n }\n\n return a.name.localeCompare(b.name);\n });\n }\n}\n","\n {{content.tooltip}}

\n\n \n \n\n \n \n\n \n \n\n \n\n \n\n \n \n \n \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n} from '@angular/core';\n\nimport { PrincipalLike } from 'core-app/shared/components/principal/principal-types';\nimport {\n StorageFileListItem,\n} from 'core-app/shared/components/storages/storage-file-list-item/storage-file-list-item';\nimport SpotDropAlignmentOption from 'core-app/spot/drop-alignment-options';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[op-storage-file-list-item]',\n templateUrl: './storage-file-list-item.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StorageFileListItemComponent {\n @Input() public content:StorageFileListItem;\n\n get principal():PrincipalLike {\n return this.content.createdByName\n ? {\n name: this.content.createdByName,\n href: '/external_users/1',\n }\n : {\n name: 'Not Available',\n href: '/placeholder_users/1',\n };\n }\n\n get getTooltipAlignment():SpotDropAlignmentOption {\n if (this.content.isFirst) {\n return SpotDropAlignmentOption.BottomLeft;\n }\n\n return SpotDropAlignmentOption.TopLeft;\n }\n\n /**\n * This function enables an override of the click on the label for the storage file list items.\n *\n * Normal behaviour is, that the label click is associated with the first interactive element,\n * which usually should be the checkbox if available, or the \"enterDirectory\" icon button,\n * if no checkbox is available.\n *\n * With this override, the click on the label of a directory element WITH checkbox instead enters the directory.\n * But if directly targeting the checkbox, the item is checked instead.\n *\n * (WorkPackage #44965)\n */\n enterDirectoryOnLabel(event:MouseEvent):void {\n const isCheckboxTarget = (event.target as HTMLElement).className.includes('spot-checkbox');\n\n if (this.content.isDirectory && !isCheckboxTarget) {\n this.content.enterDirectory();\n event.preventDefault();\n event.stopPropagation();\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { IStorageFile } from 'core-app/core/state/storage-files/storage-file.model';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { IFileIcon } from 'core-app/shared/components/storages/icons.mapping';\nimport { getIconForMimeType, isDirectory } from 'core-app/shared/components/storages/functions/storages.functions';\n\ninterface StorageFileListItemCheckbox {\n selected:boolean;\n changeSelection?:() => void;\n}\n\nexport class StorageFileListItem {\n get name():string {\n return this.storageFile.name;\n }\n\n get mimeType():string|undefined {\n return this.storageFile.mimeType;\n }\n\n get createdByName():string|undefined {\n return this.storageFile.createdByName;\n }\n\n get timestamp():string|undefined {\n return this.storageFile.lastModifiedAt\n ? this.timezoneService.parseDatetime(this.storageFile.lastModifiedAt).fromNow()\n : undefined;\n }\n\n get icon():IFileIcon {\n return getIconForMimeType(this.storageFile.mimeType);\n }\n\n get isDirectory():boolean {\n return isDirectory(this.storageFile);\n }\n\n constructor(\n private readonly timezoneService:TimezoneService,\n private readonly storageFile:IStorageFile,\n public readonly disabled:boolean,\n public readonly isFirst:boolean,\n public readonly enterDirectory:() => void,\n public readonly isConstrained:boolean,\n public readonly tooltip?:string,\n public readonly checkbox?:StorageFileListItemCheckbox,\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, Component, Input,\n} from '@angular/core';\nimport {\n StorageInformationBox,\n} from 'core-app/shared/components/storages/storage-information/storage-information-box';\n\n@Component({\n selector: 'op-storage-information',\n templateUrl: './storage-information.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StorageInformationComponent {\n @Input() content:StorageInformationBox;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { IStorageLoginInput } from 'core-app/shared/components/storages/storage-login-button/storage-login-input';\n\nexport class StorageInformationBox {\n constructor(\n public readonly iconClass:string,\n public readonly header:string,\n public readonly content:string,\n public readonly login?:IStorageLoginInput,\n ) { }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IStorage } from 'core-app/core/state/storages/storage.model';\nimport { IFileLink } from 'core-app/core/state/file-links/file-link.model';\nimport { StorageInformationBox } from 'core-app/shared/components/storages/storage-information/storage-information-box';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { storageLocaleString } from 'core-app/shared/components/storages/functions/storages.functions';\nimport {\n fileLinkViewError,\n storageAuthorizationError,\n storageConnected,\n storageFailedAuthorization,\n} from 'core-app/shared/components/storages/storages-constants.const';\n\n@Injectable()\nexport class StorageInformationService {\n private text = {\n fileLinkErrorHeader: this.i18n.t('js.storages.information.live_data_error'),\n fileLinkErrorContent: (storageType:string):string => this.i18n.t('js.storages.information.live_data_error_description', { storageType }),\n connectionErrorHeader: (storageType:string):string => this.i18n.t('js.storages.no_connection', { storageType }),\n connectionErrorContent: (storageType:string):string => this.i18n.t('js.storages.information.connection_error', { storageType }),\n authorizationFailureHeader: (storageType:string):string => this.i18n.t('js.storages.login_to', { storageType }),\n authorizationFailureContent: (storageType:string):string => this.i18n.t('js.storages.information.not_logged_in', { storageType }),\n loginButton: (storageType:string):string => this.i18n.t('js.storages.login', { storageType }),\n };\n\n constructor(\n private readonly i18n:I18nService,\n private readonly currentUserService:CurrentUserService,\n ) {}\n\n public storageInformation(storage:IStorage, fileLinks:IFileLink[]):Observable {\n return this.currentUserService.isLoggedIn$\n .pipe(\n map((loggedIn) => {\n if (!loggedIn) {\n return [];\n }\n\n const storageType = this.i18n.t(storageLocaleString(storage._links.type.href));\n\n switch (storage._links.authorizationState.href) {\n case storageFailedAuthorization:\n return [this.failedAuthorizationInformation(storage, storageType)];\n case storageAuthorizationError:\n return [this.authorizationErrorInformation(storageType)];\n case storageConnected:\n if (this.hasFileLinkViewErrors(fileLinks)) {\n return [this.fileLinkErrorInformation(storageType)];\n }\n return [];\n default:\n return [];\n }\n }),\n );\n }\n\n private failedAuthorizationInformation(storage:IStorage, storageType:string):StorageInformationBox {\n if (!storage._links.authorize) {\n throw new Error('Authorize link is missing!');\n }\n\n return new StorageInformationBox(\n 'import',\n this.text.authorizationFailureHeader(storageType),\n this.text.authorizationFailureContent(storageType),\n {\n storageId: storage.id,\n storageType: storage._links.type.href,\n authorizationLink: storage._links.authorize,\n },\n );\n }\n\n private authorizationErrorInformation(storageType:string):StorageInformationBox {\n return new StorageInformationBox(\n 'remove-link',\n this.text.connectionErrorHeader(storageType),\n this.text.connectionErrorContent(storageType),\n );\n }\n\n private fileLinkErrorInformation(storageType:string):StorageInformationBox {\n return new StorageInformationBox(\n 'error',\n this.text.fileLinkErrorHeader,\n this.text.fileLinkErrorContent(storageType),\n );\n }\n\n private hasFileLinkViewErrors(fileLinks:IFileLink[]):boolean {\n return fileLinks.filter((fileLink) => fileLink._links.permission?.href === fileLinkViewError).length > 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 {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n OnInit,\n} from '@angular/core';\nimport { CookieService } from 'ngx-cookie-service';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IStorageLoginInput } from 'core-app/shared/components/storages/storage-login-button/storage-login-input';\nimport { storageLocaleString } from 'core-app/shared/components/storages/functions/storages.functions';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\n\nexport const opStorageLoginButtonSelector = 'op-storage-login-button';\n\n@Component({\n selector: opStorageLoginButtonSelector,\n templateUrl: 'storage-login-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StorageLoginButtonComponent implements OnInit {\n @Input() input:IStorageLoginInput;\n\n label:string;\n\n constructor(\n public elementRef:ElementRef,\n private readonly i18n:I18nService,\n private readonly cookieService:CookieService,\n ) {\n populateInputsFromDataset(this);\n }\n\n ngOnInit():void {\n const storageType = this.i18n.t(storageLocaleString(this.input.storageType));\n this.label = this.i18n.t('js.storages.login', { storageType });\n }\n\n public login():void {\n const nonce = uuidv4();\n this.setAuthorizationCallbackCookie(nonce);\n window.location.href = StorageLoginButtonComponent.authorizationFailureActionUrl(this.input.authorizationLink.href, nonce);\n }\n\n private setAuthorizationCallbackCookie(nonce:string):void {\n this.cookieService.set(\n `oauth_state_${nonce}`,\n JSON.stringify({ href: window.location.href, storageId: this.input.storageId }),\n {\n path: '/',\n expires: 1/24, // roughly 1 hour\n },\n );\n }\n\n private static authorizationFailureActionUrl(baseUrl:string, nonce:string):string {\n return `${baseUrl}&state=${nonce}`;\n }\n}\n","\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { HttpEvent } from '@angular/common/http';\nimport isHttpResponse from 'core-app/core/upload/is-http-response';\n\nexport default function convertHttpEvent(event:HttpEvent, convert:(body:T) => K):HttpEvent {\n if (isHttpResponse(event) && event.body !== null) {\n return event.clone({ body: convert(event.body) });\n }\n\n return event as HttpEvent;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { map, share } from 'rxjs/operators';\nimport { HttpClient, HttpEvent } from '@angular/common/http';\n\nimport { IUploadFile } from 'core-app/core/upload/upload.service';\nimport { EXTERNAL_REQUEST_HEADER } from 'core-app/features/hal/http/openproject-header-interceptor';\nimport { IUploadStrategy } from 'core-app/shared/components/storages/upload/upload-strategy';\nimport convertHttpEvent from 'core-app/core/upload/convert-http-event';\n\nexport interface NextcloudFileUploadResponse {\n file_name:string;\n file_id:number;\n}\n\nexport class NextcloudUploadStrategy implements IUploadStrategy {\n constructor(private readonly http:HttpClient) { }\n\n public execute(\n href:string,\n uploadFiles:IUploadFile[],\n ):Observable>[] {\n return uploadFiles.map((file) => this.uploadSingle(href, file));\n }\n\n private uploadSingle(href:string, uploadFile:IUploadFile):Observable> {\n const body = new FormData();\n body.append('file', uploadFile.file, uploadFile.file.name);\n\n if (uploadFile.overwrite !== undefined) {\n body.append('overwrite', String(uploadFile.overwrite));\n }\n\n return this.http.request(\n 'post',\n href,\n {\n body,\n headers: { [EXTERNAL_REQUEST_HEADER]: 'true' },\n observe: 'events',\n reportProgress: true,\n responseType: 'json',\n },\n ).pipe(\n share(),\n map((event) =>\n convertHttpEvent(event, (responseBody) => ({\n id: responseBody.file_id,\n name: responseBody.file_name,\n size: uploadFile.file.size,\n mimeType: uploadFile.file.type,\n } as T))),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { map, share } from 'rxjs/operators';\nimport { HttpClient, HttpEvent } from '@angular/common/http';\n\nimport { IUploadFile } from 'core-app/core/upload/upload.service';\nimport { EXTERNAL_REQUEST_HEADER } from 'core-app/features/hal/http/openproject-header-interceptor';\nimport { IUploadStrategy } from 'core-app/shared/components/storages/upload/upload-strategy';\nimport convertHttpEvent from 'core-app/core/upload/convert-http-event';\n\nexport interface OneDriveFileUploadResponse {\n id:string;\n name:string;\n file:{ mimeType:string };\n size:number;\n}\n\nexport class OneDriveUploadStrategy implements IUploadStrategy {\n constructor(private readonly http:HttpClient) { }\n\n public execute(\n href:string,\n uploadFiles:IUploadFile[],\n ):Observable>[] {\n return uploadFiles.map((file) => this.uploadSingle(href, file));\n }\n\n private uploadSingle(href:string, uploadFile:IUploadFile):Observable> {\n const contentRangeHeader = `bytes 0-${uploadFile.file.size - 1}/${uploadFile.file.size}`;\n\n return this.http.request(\n 'put',\n href,\n {\n body: uploadFile.file,\n headers: {\n [EXTERNAL_REQUEST_HEADER]: 'true',\n 'Content-Range': contentRangeHeader,\n },\n observe: 'events',\n reportProgress: true,\n responseType: 'json',\n },\n ).pipe(\n share(),\n map((event) =>\n convertHttpEvent(event, (responseBody) => ({\n id: responseBody.id,\n name: responseBody.name,\n size: responseBody.size,\n mimeType: responseBody.file.mimeType,\n } as T))),\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { ID } from '@datorama/akita';\nimport { Injectable } from '@angular/core';\nimport { HttpClient, HttpEvent } from '@angular/common/http';\n\nimport { IUploadFile, OpUploadService } from 'core-app/core/upload/upload.service';\nimport { IUploadStrategy } from 'core-app/shared/components/storages/upload/upload-strategy';\nimport { NextcloudUploadStrategy } from 'core-app/shared/components/storages/upload/nextcloud-upload.strategy';\nimport { nextcloud, oneDrive } from 'core-app/shared/components/storages/storages-constants.const';\nimport { OneDriveUploadStrategy } from 'core-app/shared/components/storages/upload/one-drive-upload.strategy';\n\nexport interface IStorageFileUploadResponse {\n id:ID;\n name:string;\n mimeType:string;\n size:number;\n}\n\n@Injectable()\nexport class StorageUploadService extends OpUploadService {\n private uploadStrategy:IUploadStrategy;\n\n constructor(\n private readonly http:HttpClient,\n ) {\n super();\n }\n\n public upload(\n href:string,\n uploadFiles:IUploadFile[],\n ):Observable>[] {\n if (!this.uploadStrategy) {\n throw new Error('missing strategy');\n }\n\n return this.uploadStrategy.execute(href, uploadFiles);\n }\n\n public setUploadStrategy(storageType:string):void {\n switch (storageType) {\n case nextcloud:\n this.uploadStrategy = new NextcloudUploadStrategy(this.http);\n break;\n case oneDrive:\n this.uploadStrategy = new OneDriveUploadStrategy(this.http);\n break;\n default:\n throw new Error('unknown storage type');\n }\n }\n}\n","\n
\n \n \n \n \n \n
\n\n \n\n
\n 0\"\n class=\"spot-list spot-list_compact op-file-list\"\n [ngClass]=\"{\n 'op-file-section': true,\n 'op-file-section--list_dragging': dragging > 0\n }\"\n data-test-selector=\"file-list\"\n >\n \n \n\n \n\n \n\n 0,\n 'op-file-section--drop-box_dragging-over': draggingOverDropZone,\n 'op-file-section--drop-box_float': (fileLinks | async)?.length\n }\"\n type=\"button\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDropFiles($event)\"\n (click)=\"triggerFileInput()\"\n >\n \n 0\"\n class=\"op-file-section--drop-box-text\"\n [textContent]=\"text.dropBox.dropFiles(this.storageType | async)\"\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 Input,\n OnDestroy,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport {\n combineLatest,\n Observable,\n of,\n throwError,\n} from 'rxjs';\nimport {\n catchError,\n filter, first,\n map,\n switchMap,\n take,\n tap,\n} from 'rxjs/operators';\n\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { IFileLink, IFileLinkOriginData } from 'core-app/core/state/file-links/file-link.model';\nimport { IPrepareUploadLink, IStorage } from 'core-app/core/state/storages/storage.model';\nimport { IProjectStorage } from 'core-app/core/state/project-storages/project-storage.model';\nimport { FileLinksResourceService } from 'core-app/core/state/file-links/file-links.service';\nimport {\n fileLinkViewError,\n nextcloud,\n storageConnected,\n} from 'core-app/shared/components/storages/storages-constants.const';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n StorageInformationBox,\n} from 'core-app/shared/components/storages/storage-information/storage-information-box';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport {\n FilePickerModalComponent,\n} from 'core-app/shared/components/storages/file-picker-modal/file-picker-modal.component';\nimport { IHalResourceLink } from 'core-app/core/state/hal-resource';\nimport {\n LocationPickerModalComponent,\n} from 'core-app/shared/components/storages/location-picker-modal/location-picker-modal.component';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { StorageFilesResourceService } from 'core-app/core/state/storage-files/storage-files.service';\nimport { IUploadFile, OpUploadService } from 'core-app/core/upload/upload.service';\nimport { IUploadLink } from 'core-app/core/state/storage-files/upload-link.model';\nimport { IStorageFile } from 'core-app/core/state/storage-files/storage-file.model';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport {\n UploadConflictModalComponent,\n} from 'core-app/shared/components/storages/upload-conflict-modal/upload-conflict-modal.component';\nimport { LocationData, UploadData } from 'core-app/shared/components/storages/storage/interfaces';\nimport isNotNull from 'core-app/core/state/is-not-null';\nimport compareId from 'core-app/core/state/compare-id';\nimport isHttpResponse from 'core-app/core/upload/is-http-response';\nimport isNewResource from 'core-app/features/hal/helpers/is-new-resource';\nimport { StoragesResourceService } from 'core-app/core/state/storages/storages.service';\nimport {\n StorageInformationService,\n} from 'core-app/shared/components/storages/storage-information/storage-information.service';\nimport { storageLocaleString } from 'core-app/shared/components/storages/functions/storages.functions';\nimport { storageIconMappings } from 'core-app/shared/components/storages/icons.mapping';\nimport {\n IStorageFileUploadResponse,\n StorageUploadService,\n} from 'core-app/shared/components/storages/upload/storage-upload.service';\nimport {\n IHalErrorBase, v3ErrorIdentifierMissingEnterpriseToken,\n} from 'core-app/features/hal/resources/error-resource';\n\n@Component({\n selector: 'op-storage',\n templateUrl: './storage.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: OpUploadService, useClass: StorageUploadService }],\n})\nexport class StorageComponent extends UntilDestroyedMixin implements OnInit, OnDestroy {\n @Input() public resource:HalResource;\n\n @Input() public projectStorage:IProjectStorage;\n\n @Input() public allowUploading = true;\n\n @Input() public allowLinking = true;\n\n @ViewChild('hiddenFileInput') public filePicker:ElementRef;\n\n fileLinks:Observable;\n\n storage:Observable;\n\n disabled:Observable;\n\n storageType:Observable;\n\n storageErrors:Observable;\n\n draggingOverDropZone = false;\n\n dragging = 0;\n\n icon = {\n storageHeader: (storageType:string) => storageIconMappings[storageType] || storageIconMappings.default,\n };\n\n text = {\n actions: {\n linkExisting: this.i18n.t('js.storages.link_existing_files'),\n uploadFile: this.i18n.t('js.storages.upload_files'),\n },\n toast: {\n successFileLinksCreated: (count:number):string => this.i18n.t('js.storages.file_links.success_create', { count }),\n uploadFailed: (fileName:string):string => this.i18n.t('js.storages.file_links.upload_error.default', { fileName }),\n uploadFailedNextcloudDetail: this.i18n.t('js.storages.file_links.upload_error.detail.nextcloud'),\n uploadFailedForbidden: (fileName:string):string => this.i18n.t('js.storages.file_links.upload_error.403', { fileName }),\n uploadFailedSizeLimit:\n (fileName:string, storageType:string):string => this.i18n.t(\n 'js.storages.file_links.upload_error.413',\n {\n fileName,\n storageType,\n },\n ),\n uploadFailedQuota: (fileName:string):string => this.i18n.t('js.storages.file_links.upload_error.507', { fileName }),\n linkingAfterUploadFailed:\n (fileName:string, workPackageId:string):string => this.i18n.t(\n 'js.storages.file_links.link_uploaded_file_error',\n {\n fileName,\n workPackageId,\n },\n ),\n draggingManyFiles: (storageType:string):string => this.i18n.t('js.storages.files.dragging_many_files', { storageType }),\n draggingFolder: (storageType:string):string => this.i18n.t('js.storages.files.dragging_folder', { storageType }),\n uploadingLabel: this.i18n.t('js.label_upload_notification'),\n },\n dropBox: {\n uploadLabel: this.i18n.t('js.storages.upload_files'),\n dropFiles: (name:string):string => this.i18n.t('js.storages.drop_files', { name }),\n dropClickFiles: (name:string):string => this.i18n.t('js.storages.drop_or_click_files', { name }),\n },\n emptyList: (storageType:string):string => this.i18n.t('js.storages.file_links.empty', { storageType }),\n openStorage: (storageType:string):string => this.i18n.t('js.storages.open_storage', { storageType }),\n };\n\n private get addFileLinksHref():string {\n if (isNewResource(this.resource)) {\n return this.pathHelperService.fileLinksPath();\n }\n\n return (this.resource.$links as unknown&{ addFileLink:IHalResourceLink }).addFileLink.href;\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 // When the global drag and drop is active and the dragging happens over the DOM\n // elements, the dragenter and dragleave events are always fired in pairs.\n // On dragenter the this.dragging is set to 2 and on dragleave we deduct it to 1,\n // meaning the drag and drop remains active. When the drag and drop action is canceled\n // i.e. by the \"Escape\" key, an extra dragleave event is fired.\n // In this case this.dragging will be deducted to 0, disabling the active drop areas.\n this.dragging = 2;\n this.cdRef.detectChanges();\n };\n\n constructor(\n private readonly i18n:I18nService,\n private readonly cdRef:ChangeDetectorRef,\n private readonly toastService:ToastService,\n private readonly uploadService:OpUploadService,\n private readonly opModalService:OpModalService,\n private readonly timezoneService:TimezoneService,\n private readonly pathHelperService:PathHelperService,\n private readonly storagesResourceService:StoragesResourceService,\n private readonly fileLinkResourceService:FileLinksResourceService,\n private readonly storageInformationService:StorageInformationService,\n private readonly storageFilesResourceService:StorageFilesResourceService,\n ) {\n super();\n }\n\n ngOnInit():void {\n this.storage = this.storagesResourceService.requireEntity(this.projectStorage._links.storage.href);\n\n this.fileLinks = this.collectionKey()\n .pipe(\n switchMap((key) => {\n if (isNewResource(this.resource)) {\n return this.fileLinkResourceService.collection(key);\n }\n\n return this.fileLinkResourceService.requireCollection(key);\n }),\n tap((fileLinks) => {\n if (isNewResource(this.resource)) {\n this.resource.fileLinks = { elements: fileLinks.map((a) => a._links?.self) };\n }\n }),\n );\n\n this.disabled = combineLatest([\n this.storage,\n this.fileLinks,\n ]).pipe(\n map(([storage, fileLinks]) =>\n this.hasFileLinkViewErrors(fileLinks) || storage._links.authorizationState.href !== storageConnected),\n );\n\n this.storageType = this.storage\n .pipe(\n map((storage) => this.i18n.t(storageLocaleString(storage._links.type.href))),\n );\n\n this.storage.pipe(take(1)).subscribe((storage) => {\n (this.uploadService as StorageUploadService).setUploadStrategy(storage._links.type.href);\n });\n\n this.storageErrors = combineLatest([\n this.storage,\n this.fileLinks,\n ]).pipe(\n this.untilDestroyed(),\n switchMap(([storage, fileLinks]) => this.storageInformationService.storageInformation(storage, fileLinks)),\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 removeFileLink(fileLink:IFileLink):void {\n this.collectionKey()\n .pipe(\n switchMap((key) => this.fileLinkResourceService.remove(key, fileLink)),\n )\n .subscribe({\n next: () => { /* Do nothing */ },\n error: (error:HttpErrorResponse) => this.toastService.addError(error),\n });\n }\n\n public openLinkFilesDialog():void {\n combineLatest([\n this.storage,\n this.fileLinks,\n this.collectionKey(),\n ]).pipe(first())\n .subscribe(([storage, fileLinks, collectionKey]) => {\n const locals = {\n addFileLinksHref: this.addFileLinksHref,\n projectFolderHref: this.projectStorage._links.projectFolder?.href || null,\n projectFolderMode: this.projectStorage.projectFolderMode,\n storage,\n collectionKey,\n fileLinks,\n };\n this.opModalService.show(FilePickerModalComponent, 'global', locals);\n });\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 this.storageFileUpload(fileList[0]);\n // reset file input, so that selecting the same file again triggers a change\n this.filePicker.nativeElement.value = '';\n }\n\n private storageFileUpload(file:File):void {\n this.storage\n .pipe(\n switchMap((storage) => this.selectUploadLocation(storage)),\n switchMap((data) => this.resolveUploadConflicts(file, data.files, data.location)),\n )\n .subscribe((data) => {\n this.uploadAndCreateFileLink(data);\n });\n }\n\n private selectUploadLocation(storage:IStorage):Observable {\n const locals = {\n projectFolderHref: this.projectStorage._links.projectFolder?.href,\n projectFolderMode: this.projectStorage.projectFolderMode,\n storage,\n };\n\n return this.opModalService.show(LocationPickerModalComponent, 'global', locals)\n .pipe(\n switchMap((modal) => modal.closingEvent),\n filter((modal) => modal.submitted),\n first(),\n map((modal) => ({ location: modal.location.id as string, files: modal.filesAtLocation })),\n );\n }\n\n private resolveUploadConflicts(file:File, storageFiles:IStorageFile[], location:string):Observable {\n const conflict = storageFiles.find((f) => f.name === file.name);\n if (!conflict) {\n return of({ file, location, overwrite: null });\n }\n\n return this.opModalService.show(UploadConflictModalComponent, 'global', { fileName: file.name })\n .pipe(\n switchMap((modal) => modal.closingEvent),\n filter((modal) => modal.overwrite !== null),\n take(1),\n map((modal) => ({ file, location, overwrite: modal.overwrite })),\n );\n }\n\n private uploadAndCreateFileLink(data:UploadData):void {\n let isUploadError = false;\n\n this.storage\n .pipe(\n switchMap((storage) => {\n const link = this.uploadResourceLink(storage, data.file.name, data.location);\n return this.storageFilesResourceService.uploadLink(link);\n }),\n switchMap((link) => this.uploadAndNotify(link, data.file, data.overwrite)),\n catchError((error) => {\n isUploadError = true;\n return throwError(error);\n }),\n switchMap((uploadResponse) => this.createFileLinkData(uploadResponse)),\n tap((fileLinkCreationData) => {\n // Update the file link list of this storage only in case of a linked file got updated\n if (fileLinkCreationData === null) {\n this.collectionKey()\n .pipe(switchMap((key) => this.fileLinkResourceService.fetchCollection(key)))\n .subscribe();\n }\n }),\n filter(isNotNull),\n switchMap((file) =>\n combineLatest([\n this.storage.pipe(first()),\n this.collectionKey(),\n ])\n .pipe(\n switchMap(([storage, collectionKey]) => this.fileLinkResourceService.addFileLinks(\n collectionKey,\n this.addFileLinksHref,\n storage._links.self,\n [file],\n )),\n )),\n )\n .subscribe({\n next: (collection) => {\n this.toastService.addSuccess(this.text.toast.successFileLinksCreated(collection.count));\n },\n error: (error) => {\n if (isUploadError) {\n this.handleUploadError(error as HttpErrorResponse, data.file.name);\n } else {\n this.toastService.addError(this.text.toast.linkingAfterUploadFailed(data.file.name, this.resource.id as string));\n }\n\n console.error(error);\n },\n });\n }\n\n private handleUploadError(error:HttpErrorResponse, fileName:string):void {\n if (error.status === 500 && (error.error as IHalErrorBase).errorIdentifier === v3ErrorIdentifierMissingEnterpriseToken) {\n this.toastService.addError(error);\n return;\n }\n\n switch (error.status) {\n case 403:\n this.toastService.addError(this.text.toast.uploadFailedForbidden(fileName));\n break;\n case 413:\n this.storage\n .pipe(first())\n .subscribe((storage) => {\n const storageType = this.i18n.t(storageLocaleString(storage._links.type.href));\n const toast = this.text.toast.uploadFailedSizeLimit(fileName, storageType);\n this.toastService.addError(toast);\n });\n break;\n case 507:\n this.toastService.addError(this.text.toast.uploadFailedQuota(fileName));\n break;\n default:\n this.storage\n .pipe(first())\n .subscribe((storage) => {\n const additionalInfo = storage._links.type.href === nextcloud ? this.text.toast.uploadFailedNextcloudDetail : [];\n this.toastService.addError(this.text.toast.uploadFailed(fileName), additionalInfo);\n });\n }\n }\n\n private uploadAndNotify(link:IUploadLink, file:File, overwrite:boolean|null):Observable {\n const { href } = link._links.destination;\n const uploadFiles:IUploadFile[] = [{ file, overwrite: overwrite !== null ? overwrite : undefined }];\n const observable = this.uploadService.upload(href, uploadFiles)[0];\n this.toastService.addUpload(this.text.toast.uploadingLabel, [[file, observable]]);\n\n return observable\n .pipe(\n filter(isHttpResponse),\n map((ev) => ev.body),\n map((data) => {\n if (data === null) {\n throw new Error('Upload data is null.');\n }\n\n return data;\n }),\n );\n }\n\n private createFileLinkData(response:IStorageFileUploadResponse):Observable {\n return this.fileLinks\n .pipe(\n take(1),\n map((fileLinks) => {\n const existingFileLink = fileLinks.find((l) => compareId(l.originData.id, response.id));\n if (existingFileLink) {\n return null;\n }\n\n const now = this.timezoneService.parseDate(new Date()).toISOString();\n return ({\n id: response.id,\n name: response.name,\n mimeType: response.mimeType,\n size: response.size,\n createdAt: now,\n lastModifiedAt: now,\n });\n }),\n );\n }\n\n private uploadResourceLink(storage:IStorage, fileName:string, location:string):IPrepareUploadLink {\n const project = (this.resource.project as unknown&{ id:string }).id;\n const link = storage._links.prepareUpload.filter((value) => project === value.payload.projectId.toString());\n if (link.length === 0) {\n throw new Error('Cannot upload to this storage. Missing permissions in project.');\n }\n\n return {\n href: link[0].href,\n method: link[0].method,\n title: link[0].title,\n payload: {\n projectId: link[0].payload.projectId,\n parent: location,\n fileName,\n },\n };\n }\n\n private hasFileLinkViewErrors(fileLinks:IFileLink[]):boolean {\n return fileLinks.filter((fileLink) => fileLink._links.permission?.href === fileLinkViewError).length > 0;\n }\n\n private collectionKey():Observable {\n return isNewResource(this.resource)\n ? of('new')\n : this.storage.pipe(\n first(),\n map((storage) => this.fileLinkSelfLink(storage)),\n );\n }\n\n private fileLinkSelfLink(storage:IStorage):string {\n const fileLinks = this.resource.fileLinks as unknown&{ href:string };\n return `${fileLinks.href}?filters=[{\"storage\":{\"operator\":\"=\",\"values\":[\"${storage.id}\"]}}]`;\n }\n\n public onDropFiles(event:DragEvent):void {\n if (event.dataTransfer === null) return;\n\n this.draggingOverDropZone = false;\n this.dragging = 0;\n\n const files = event.dataTransfer.files;\n const draggingManyFiles = files.length !== 1;\n const isDirectory = event.dataTransfer.items[0].webkitGetAsEntry()?.isDirectory;\n if (draggingManyFiles || isDirectory) {\n this.storageType\n .pipe(first())\n .subscribe((storageType) => {\n const toast = draggingManyFiles\n ? this.text.toast.draggingManyFiles(storageType)\n : this.text.toast.draggingFolder(storageType);\n this.toastService.addError(toast);\n });\n return;\n }\n\n this.storageFileUpload(files[0]);\n }\n\n public onDragOver(event:DragEvent):void {\n const containsFiles = (dataTransfer:DataTransfer):boolean => dataTransfer.types.indexOf('Files') >= 0;\n\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\n\nexport default function compareId(a:ID, b:ID):boolean {\n return String(a) === String(b);\n}\n","// Storage types\nexport const nextcloud = 'urn:openproject-org:api:v3:storages:Nextcloud';\nexport const oneDrive = 'urn:openproject-org:api:v3:storages:OneDrive';\n\n// Storage authorization state\nexport const storageConnected = 'urn:openproject-org:api:v3:storages:authorization:Connected';\nexport const storageFailedAuthorization = 'urn:openproject-org:api:v3:storages:authorization:FailedAuthorization';\nexport const storageAuthorizationError = 'urn:openproject-org:api:v3:storages:authorization:Error';\n\n// File link view permission flags\nexport const fileLinkViewAllowed = 'urn:openproject-org:api:v3:file-links:permission:View';\nexport const fileLinkViewNotAllowed = 'urn:openproject-org:api:v3:file-links:permission:NotAllowed';\nexport const fileLinkViewError = 'urn:openproject-org:api:v3:file-links:permission:Error';\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Inject,\n} from '@angular/core';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\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';\n\n@Component({\n templateUrl: 'upload-conflict-modal.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UploadConflictModalComponent extends OpModalComponent {\n public overwrite:boolean|null = null;\n\n public text = {\n header: this.i18n.t('js.storages.files.already_existing_header'),\n body: () => this.i18n.t('js.storages.files.already_existing_body', { fileName: this.locals.fileName as string }),\n buttons: {\n keepBoth: this.i18n.t('js.storages.files.upload_keep_both'),\n replace: this.i18n.t('js.storages.files.upload_replace'),\n cancel: this.i18n.t('js.button_cancel'),\n },\n };\n\n public constructor(\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef,\n private readonly i18n:I18nService,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n public close(overwrite:boolean):void {\n this.overwrite = overwrite;\n this.service.close();\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\nexport class PaginationInstance {\n constructor(public page:number,\n public total:number,\n public perPage:number) {\n }\n\n public getLowerPageBound() {\n return this.perPage * (this.page - 1) + 1;\n }\n\n public getUpperPageBound(limit:number) {\n return Math.min(this.perPage * this.page, limit);\n }\n\n public nextPage() {\n this.page += 1;\n }\n\n public previousPage() {\n this.page -= 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 { Injectable } from '@angular/core';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\n\nexport const DEFAULT_PAGINATION_OPTIONS = {\n maxVisiblePageOptions: 6,\n optionsTruncationSize: 1,\n};\n\nexport interface IPaginationOptions {\n perPage:number;\n perPageOptions:number[];\n maxVisiblePageOptions:number;\n optionsTruncationSize:number;\n}\n\nexport interface PaginationObject {\n pageSize:number;\n offset:number;\n}\n\n@Injectable()\nexport class PaginationService {\n private paginationOptions:IPaginationOptions;\n\n constructor(private configuration:ConfigurationService) {\n this.loadPaginationOptions();\n }\n\n public getCachedPerPage(initialPageOptions:number[]):number {\n const value = this.localStoragePerPage;\n const initialLength = initialPageOptions?.length || 0;\n\n if (value !== null && value > 0 && (initialLength === 0 || initialPageOptions?.indexOf(value) !== -1)) {\n return value;\n }\n\n if (initialLength > 0) {\n return initialPageOptions[0];\n }\n\n return 20;\n }\n\n private get localStoragePerPage() {\n const value = window.OpenProject.guardedLocalStorage('pagination.perPage') as string;\n\n if (value !== undefined) {\n return parseInt(value, 10);\n }\n return null;\n }\n\n public getPaginationOptions() {\n return this.paginationOptions;\n }\n\n public getPerPage() {\n return this.localStoragePerPage || this.paginationOptions.perPage;\n }\n\n public getMaxVisiblePageOptions() {\n return _.get(this.paginationOptions, 'maxVisiblePageOptions', DEFAULT_PAGINATION_OPTIONS.maxVisiblePageOptions);\n }\n\n public getOptionsTruncationSize() {\n return _.get(this.paginationOptions, 'optionsTruncationSize', DEFAULT_PAGINATION_OPTIONS.optionsTruncationSize);\n }\n\n public setPerPage(perPage:number) {\n window.OpenProject.guardedLocalStorage('pagination.perPage', perPage.toString());\n this.paginationOptions.perPage = perPage;\n }\n\n public getPerPageOptions() {\n return this.paginationOptions.perPageOptions;\n }\n\n public setPerPageOptions(perPageOptions:number[]) {\n this.paginationOptions.perPageOptions = perPageOptions;\n }\n\n private loadPaginationOptions():void {\n this.paginationOptions = {\n perPage: this.getCachedPerPage(this.configuration.perPageOptions),\n perPageOptions: this.configuration.perPageOptions,\n maxVisiblePageOptions: DEFAULT_PAGINATION_OPTIONS.maxVisiblePageOptions,\n optionsTruncationSize: DEFAULT_PAGINATION_OPTIONS.optionsTruncationSize,\n };\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 { PaginationService } from 'core-app/shared/components/table-pagination/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(\n protected paginationService:PaginationService,\n protected cdRef:ChangeDetectorRef,\n protected I18n:I18nService,\n ) {\n super();\n }\n\n ngOnInit():void {\n const paginationOptions = this.paginationService.getPaginationOptions();\n this.perPageOptions = paginationOptions.perPageOptions;\n this.pagination = new PaginationInstance(1, parseInt(this.totalEntries, 10), paginationOptions.perPage);\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","
\n \n \n \n \n \n \n \n \n \n 0 && !tab.showCountAsBubble\"\n data-test-selector=\"tab-count\"\n > ({{ tabCounter }})\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} from '@angular/core';\nimport { GonService } from 'core-app/core/gon/gon.service';\nimport { StateService } from '@uirouter/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ScrollableTabsComponent } from 'core-app/shared/components/tabs/scrollable-tabs/scrollable-tabs.component';\nimport { TabDefinition } from 'core-app/shared/components/tabs/tab.interface';\n\nexport const contentTabsSelector = 'content-tabs';\n\ninterface GonTab extends TabDefinition {\n partial:string;\n label:string;\n}\n\n@Component({\n selector: 'op-content-tabs',\n templateUrl: '../scrollable-tabs/scrollable-tabs.component.html',\n styleUrls: ['./content-tabs.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n\nexport class ContentTabsComponent extends ScrollableTabsComponent {\n public classes:string[] = ['content--tabs', 'scrollable-tabs'];\n\n constructor(\n readonly elementRef:ElementRef,\n protected readonly $state:StateService,\n readonly gon:GonService,\n cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n public injector:Injector,\n ) {\n super($state, cdRef, injector);\n\n const gonTabs = JSON.parse((this.gon.get('contentTabs') as any).tabs);\n const currentTab = JSON.parse((this.gon.get('contentTabs') as any).selected);\n\n // parse tabs from backend and map them to scrollable tabs structure\n this.tabs = gonTabs.map((tab:GonTab) => ({\n id: tab.name,\n name: this.I18n.t(`js.${tab.label}`, { defaultValue: tab.label }),\n path: tab.path,\n }));\n\n // highlight current tab\n this.currentTabId = currentTab.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//++\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UIRouterModule } from '@uirouter/angular';\nimport { FocusModule } from 'core-app/shared/directives/focus/focus.module';\nimport { AttributeHelpTextModule } from 'core-app/shared/components/attribute-help-texts/attribute-help-text.module';\nimport { ContentTabsComponent } from 'core-app/shared/components/tabs/content-tabs/content-tabs.component';\nimport { ScrollableTabsComponent } from 'core-app/shared/components/tabs/scrollable-tabs/scrollable-tabs.component';\nimport { TabCountComponent } from 'core-app/shared/components/tabs/tab-badges/tab-count.component';\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\n\n@NgModule({\n imports: [\n CommonModule,\n FocusModule,\n IconModule,\n AttributeHelpTextModule,\n UIRouterModule,\n ],\n exports: [\n ScrollableTabsComponent,\n ],\n declarations: [\n ScrollableTabsComponent,\n ContentTabsComponent,\n TabCountComponent,\n ],\n})\nexport class OpenprojectTabsModule {\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n Injector,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { TabDefinition } from 'core-app/shared/components/tabs/tab.interface';\nimport { trackByProperty } from 'core-app/shared/helpers/angular/tracking-functions';\nimport {\n RawParams,\n StateService,\n UIRouterGlobals,\n} from '@uirouter/core';\nimport { Observable } from 'rxjs';\nimport { share } from 'rxjs/operators';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Component({\n templateUrl: 'scrollable-tabs.component.html',\n selector: 'op-scrollable-tabs',\n styleUrls: ['./scrollable-tabs.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n\nexport class ScrollableTabsComponent extends UntilDestroyedMixin implements AfterViewInit, OnChanges {\n @ViewChild('scrollContainer', { static: true }) scrollContainer:ElementRef;\n\n @ViewChild('scrollPane', { static: true }) scrollPane:ElementRef;\n\n @ViewChild('scrollRightBtn', { static: true }) scrollRightBtn:ElementRef;\n\n @ViewChild('scrollLeftBtn', { static: true }) scrollLeftBtn:ElementRef;\n\n @Input() public currentTabId:string|null = null;\n\n @Input() public tabs:TabDefinition[] = [];\n\n @Input() public classes:string[] = [];\n\n @Input() public hideLeftButton = true;\n\n @Input() public hideRightButton = true;\n\n @Output() public tabSelected = new EventEmitter();\n\n @InjectField() uiRouterGlobals:UIRouterGlobals;\n\n trackById = trackByProperty('id');\n\n counters:Record> = {};\n\n private container:Element;\n\n private pane:Element;\n\n private debouncedTabActivationTimeout:ReturnType|null;\n\n private dragTargetStack = 0;\n\n constructor(\n protected readonly $state:StateService,\n private cdRef:ChangeDetectorRef,\n public injector:Injector,\n ) {\n super();\n }\n\n ngAfterViewInit():void {\n this.container = this.scrollContainer.nativeElement as HTMLElement;\n this.pane = this.scrollPane.nativeElement as HTMLElement;\n\n this.updateScrollableArea();\n this\n .uiRouterGlobals\n .params$\n ?.pipe(\n this.untilDestroyed(),\n )\n .subscribe((params) => {\n if (params.tabIdentifier) {\n this.currentTabId = params.tabIdentifier as string;\n }\n });\n }\n\n ngOnChanges(_changes:SimpleChanges):void {\n if (this.pane) {\n this.updateScrollableArea();\n }\n }\n\n counter(tab:TabDefinition):Observable|null {\n if (!tab.counter) {\n return null;\n }\n\n if (!this.counters[tab.id]) {\n this.counters[tab.id] = tab.counter(this.injector).pipe(share());\n }\n\n return this.counters[tab.id];\n }\n\n private updateScrollableArea() {\n this.determineScrollButtonVisibility();\n if (this.currentTabId != null) {\n this.scrollIntoVisibleArea(this.currentTabId);\n }\n }\n\n public clickTab(tab:TabDefinition, event:Event):void {\n this.currentTabId = tab.id;\n this.tabSelected.emit(tab);\n\n // If the tab does not provide its own link,\n // avoid propagation\n if (!tab.path) {\n event.preventDefault();\n }\n }\n\n public startDebouncedTabActivation(tab:TabDefinition):void {\n // 'dragenter' events are always fired before 'dragleave' events. Hence, when dragging directly from one tab to\n // another, first the dragenter of the new tab is fired, before we get a dragleave from the old one.\n // Therefor we keep the drag stack, which can raise from 0 to 2. And we only clear the debounced tab activation\n // completely when we fully leave tabs (which means, drag stack is 0).\n this.dragTargetStack += 1;\n\n if (this.debouncedTabActivationTimeout !== null) {\n this.clearDebouncedTabActivation();\n }\n\n this.debouncedTabActivationTimeout = setTimeout(() => {\n this.currentTabId = tab.id;\n this.tabSelected.emit(tab);\n\n const route = this.$state.includes('**.details.*')\n ? this.$state.$current.name\n : tab.route;\n\n if (route) {\n void this.$state.go(route, tab.routeParams as RawParams);\n }\n\n this.debouncedTabActivationTimeout = null;\n }, 300);\n }\n\n public cancelDebouncedTabActivation():void {\n this.dragTargetStack -= 1;\n\n if (this.dragTargetStack === 0) {\n this.clearDebouncedTabActivation();\n }\n }\n\n private clearDebouncedTabActivation():void {\n if (this.debouncedTabActivationTimeout !== null) {\n clearTimeout(this.debouncedTabActivationTimeout);\n this.debouncedTabActivationTimeout = null;\n }\n }\n\n public onScroll():void {\n this.determineScrollButtonVisibility();\n }\n\n private determineScrollButtonVisibility() {\n this.hideLeftButton = (this.pane.scrollLeft <= 0);\n this.hideRightButton = (this.pane.scrollWidth - this.pane.scrollLeft <= this.container.clientWidth);\n\n this.cdRef.detectChanges();\n }\n\n public scrollRight():void {\n this.pane.scrollLeft += this.container.clientWidth;\n }\n\n public scrollLeft():void {\n this.pane.scrollLeft -= this.container.clientWidth;\n }\n\n public tabTitle(tab:TabDefinition):string {\n return (typeof tab.disable === 'string') ? tab.disable : tab.name;\n }\n\n private scrollIntoVisibleArea(tabId:string) {\n const tab:JQuery = jQuery(this.pane).find(`[data-tab-id=${tabId}]`);\n const position:JQueryCoordinates = tab.position();\n\n const tabRightBorderAt:number = position.left + Number(tab.outerWidth());\n\n if (this.pane.scrollLeft + this.container.clientWidth < tabRightBorderAt) {\n this.pane.scrollLeft = tabRightBorderAt - this.container.clientWidth + 40; // 40px to not overlap by buttons\n }\n }\n}\n","\n 0\"\n [textContent]=\"count\"\n >\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\n\n@Component({\n selector: 'op-tab-count',\n templateUrl: './tab-count.component.html',\n styleUrls: ['./tab-count.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TabCountComponent {\n @Input() count:number;\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 { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { TimeEntryBaseModal } from '../shared/modal/base.modal';\n\n@Component({\n templateUrl: '../shared/modal/base.modal.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n HalResourceEditingService,\n ],\n})\nexport class TimeEntryCreateModalComponent extends TimeEntryBaseModal {\n public createdEntry:TimeEntryResource;\n\n public get deleteAllowed() {\n return false;\n }\n\n public setModifiedEntry($event:{ savedResource:HalResource, isInital:boolean }) {\n this.createdEntry = $event.savedResource as TimeEntryResource;\n this.reloadWorkPackageAndClose();\n }\n}\n","import {\n Injectable,\n Injector,\n} from '@angular/core';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n map,\n take,\n} from 'rxjs/operators';\nimport { FormResource } from 'core-app/features/hal/resources/form-resource';\nimport { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { Moment } from 'moment';\nimport { TimeEntryCreateModalComponent } from 'core-app/shared/components/time_entries/create/create.modal';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { TimeEntryModalOptions } from 'core-app/shared/components/time_entries/edit/edit.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { Observable } from 'rxjs';\n\n@Injectable()\nexport class TimeEntryCreateService {\n constructor(\n readonly opModalService:OpModalService,\n readonly injector:Injector,\n readonly halResource:HalResourceService,\n readonly apiV3Service:ApiV3Service,\n readonly schemaCache:SchemaCacheService,\n protected halEditing:HalResourceEditingService,\n readonly i18n:I18nService,\n ) {\n }\n\n public create(\n date:Moment,\n wp?:WorkPackageResource,\n options:TimeEntryModalOptions = {},\n ):Promise<{ entry:TimeEntryResource, action:'create' }> {\n return new Promise<{ entry:TimeEntryResource, action:'create' }>((resolve, reject) => {\n void this\n .createNewTimeEntry(date, wp)\n .subscribe((changeset) => {\n this.opModalService.show(\n TimeEntryCreateModalComponent,\n this.injector,\n { ...options, changeset },\n ).subscribe((modal) => {\n modal\n .closingEvent\n .pipe(take(1))\n .subscribe(() => {\n if (modal.createdEntry) {\n resolve({ entry: modal.createdEntry, action: 'create' });\n } else {\n reject();\n }\n });\n });\n });\n });\n }\n\n public createNewTimeEntry(date:Moment, wp?:WorkPackageResource, ongoing = false):Observable {\n const payload:any = {\n spentOn: date.format('YYYY-MM-DD'),\n ongoing,\n };\n\n if (wp) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n payload._links = {\n workPackage: {\n href: wp.href,\n },\n };\n }\n\n return this\n .apiV3Service\n .time_entries\n .form\n .post(payload)\n .pipe(\n map((form) => this.fromCreateForm(form)),\n );\n }\n\n public fromCreateForm(form:FormResource):ResourceChangeset {\n const entry = this.initializeNewResource(form);\n\n return this.halEditing.edit>(entry, form);\n }\n\n private initializeNewResource(form:FormResource):TimeEntryResource {\n const entry = this.halResource.createHalResourceOfType(\n 'TimeEntry',\n (form.payload as HalResource).$plain(),\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n entry.$links.schema = { href: 'new' };\n\n entry._type = 'TimeEntry';\n entry.id = 'new';\n entry.hours = 'PT1H';\n\n // Set update link to form\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access,no-multi-assign\n entry.update = entry.$links.update = form.$links.self;\n // Use POST /work_packages for saving link\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,no-multi-assign\n entry.updateImmediately = entry.$links.updateImmediately = (payload:Record) => this\n .apiV3Service\n .time_entries\n .post(payload)\n .toPromise();\n\n entry.state.putValue(entry);\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(entry, form.schema);\n\n return entry;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n OnInit,\n} from '@angular/core';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { TimeEntryBaseModal } from 'core-app/shared/components/time_entries/shared/modal/base.modal';\n\n@Component({\n templateUrl: '../shared/modal/base.modal.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TimeEntryEditModalComponent extends TimeEntryBaseModal implements OnInit {\n public modifiedEntry:TimeEntryResource;\n\n public destroyedEntry:TimeEntryResource;\n\n ngOnInit() {\n super.ngOnInit();\n }\n\n public setModifiedEntry($event:{ savedResource:HalResource, isInital:boolean }) {\n this.modifiedEntry = $event.savedResource as TimeEntryResource;\n this.reloadWorkPackageAndClose();\n }\n\n public get saveAllowed() {\n return !!this.entry.update;\n }\n\n public get deleteAllowed() {\n return !!this.entry.delete;\n }\n\n public destroy() {\n // eslint-disable-next-line no-alert\n if (!window.confirm(this.text.areYouSure)) {\n return;\n }\n\n this.destroyedEntry = this.entry;\n this.service.close();\n }\n}\n","import {\n Injectable,\n Injector,\n} from '@angular/core';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { take } from 'rxjs/operators';\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 { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { TimeEntryEditModalComponent } from './edit.modal';\nimport * as moment from 'moment';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { TimeEntryTimerService } from 'core-app/shared/components/time_entries/services/time-entry-timer.service';\n\nexport interface TimeEntryModalOptions {\n showWorkPackageField?:boolean;\n showUserField?:boolean;\n}\n\nexport interface TimeEntryUpdate {\n entry:TimeEntryResource,\n action:'update'|'destroy'|'unchanged';\n}\n\n@Injectable()\nexport class TimeEntryEditService {\n constructor(\n readonly opModalService:OpModalService,\n readonly injector:Injector,\n readonly apiV3Service:ApiV3Service,\n readonly halResource:HalResourceService,\n readonly schemaCache:SchemaCacheService,\n readonly timezoneService:TimezoneService,\n readonly timeEntryService:TimeEntryTimerService,\n protected halEditing:HalResourceEditingService,\n readonly i18n:I18nService,\n ) {\n }\n\n public edit(\n entry:TimeEntryResource,\n options:TimeEntryModalOptions = {},\n ):Promise {\n return this\n .createChangeset(entry)\n .then((changeset) => this.editChange(changeset, options));\n }\n\n public editChange(changeset:ResourceChangeset, options:TimeEntryModalOptions = {}) {\n return new Promise((resolve, _) => {\n this\n .opModalService\n .show(\n TimeEntryEditModalComponent,\n this.injector,\n { ...options, changeset },\n ).subscribe((modal) => {\n modal\n .closingEvent\n .pipe(take(1))\n .subscribe(() => {\n if (modal.destroyedEntry) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access\n void modal.destroyedEntry.delete().then(() => {\n resolve({ entry: modal.destroyedEntry, action: 'destroy' });\n });\n } else if (modal.modifiedEntry) {\n resolve({ entry: modal.modifiedEntry, action: 'update' });\n } else {\n resolve({ entry: modal.entry, action: 'unchanged' });\n }\n });\n });\n });\n }\n\n public async stopTimerAndEdit(activeTimer:TimeEntryResource):Promise {\n await this.schemaCache.ensureLoaded(activeTimer);\n\n const change = this.halEditing.edit(activeTimer);\n const hours = moment().diff(moment(activeTimer.createdAt as string), 'hours', true);\n const formatted = this.timezoneService.toISODuration(hours, 'hours');\n change.setValue('hours', formatted);\n change.setValue('ongoing', false);\n\n return this\n .editChange(change)\n .then((update) => {\n if (update.action !== 'unchanged') {\n this.timeEntryService.timer$.next(null);\n }\n });\n }\n\n public createChangeset(entry:TimeEntryResource):Promise> {\n return this\n .apiV3Service\n .time_entries\n .id(entry)\n .form\n .post(entry)\n .toPromise()\n .then((form) => this.halEditing.edit>(entry, form));\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Injector,\n} from '@angular/core';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { TimeEntryEditService } from 'core-app/shared/components/time_entries/edit/edit.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport {\n Observable,\n switchMap,\n} from 'rxjs';\n\nexport const triggerActionsEntryComponentSelector = 'time-entry--trigger-actions-entry';\n\n@Component({\n selector: triggerActionsEntryComponentSelector,\n template: `\n \n \n \n \n \n \n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n HalResourceEditingService,\n TimeEntryEditService,\n ],\n})\nexport class TriggerActionsEntryComponent {\n @InjectField() readonly timeEntryEditService:TimeEntryEditService;\n\n @InjectField() readonly apiv3Service:ApiV3Service;\n\n @InjectField() readonly toastService:ToastService;\n\n @InjectField() readonly elementRef:ElementRef;\n\n @InjectField() i18n!:I18nService;\n\n @InjectField() readonly cdRef:ChangeDetectorRef;\n\n public text = {\n edit: this.i18n.t('js.button_edit'),\n delete: this.i18n.t('js.button_delete'),\n error: this.i18n.t('js.error.internal'),\n areYouSure: this.i18n.t('js.text_are_you_sure'),\n };\n\n constructor(readonly injector:Injector) {\n }\n\n editTimeEntry() {\n void this\n .loadEntry()\n .subscribe((entry) => {\n this.timeEntryEditService\n .edit(entry)\n .then(() => {\n window.location.reload();\n })\n .catch(() => {\n // User canceled the modal\n });\n });\n }\n\n deleteTimeEntry() {\n if (!window.confirm(this.text.areYouSure)) {\n return;\n }\n\n this.loadEntry()\n .pipe(\n switchMap((entry) => this\n .apiv3Service\n .time_entries\n .id(entry)\n .delete()),\n )\n .subscribe(\n () => window.location.reload(),\n (error) => this.toastService.addError(error || this.text.error),\n );\n }\n\n protected loadEntry():Observable {\n const timeEntryId = (this.elementRef.nativeElement as HTMLElement).dataset.entry as string;\n\n return this\n .apiv3Service\n .time_entries\n .id(timeEntryId)\n .get();\n }\n}\n","\n
\n \n
\n
\n
\n \n \n
\n
\n\n
\n
\n
\n \n \n
\n\n
\n
\n
\n \n \n
\n\n \n
\n
\n
\n \n \n
\n
\n\n
\n
\n
\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 { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { HalResource } from 'core-app/features/hal/resources/hal-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 { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\n\n@Component({\n templateUrl: './form.component.html',\n selector: 'te-form',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TimeEntryFormComponent extends UntilDestroyedMixin implements OnInit, OnDestroy {\n @Input() changeset:ResourceChangeset;\n\n @Input() showWorkPackageField = true;\n\n @Input() showUserField = true;\n\n @Output() modifiedEntry = new EventEmitter<{ savedResource:TimeEntryResource, isInital:boolean }>();\n\n @ViewChild('editForm', { static: true }) editForm:EditFormComponent;\n\n text = {\n wpRequired: this.i18n.t('js.time_entry.work_package_required'),\n };\n\n public workPackageSelected = false;\n\n public schema:SchemaResource;\n\n public customFields:{ key:string, label:string, type:string }[] = [];\n\n constructor(readonly halEditing:HalResourceEditingService,\n readonly cdRef:ChangeDetectorRef,\n readonly i18n:I18nService) {\n super();\n }\n\n ngOnInit() {\n this.halEditing\n .temporaryEditResource(this.changeset.projectedResource)\n .values$()\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((changeset) => {\n if (changeset && changeset.workPackage) {\n this.workPackageSelected = true;\n this.cdRef.markForCheck();\n }\n });\n\n this.schema = this.changeset.schema;\n this.workPackageSelected = !!this.changeset?.value('workPackage');\n this.setCustomFields();\n this.cdRef.detectChanges();\n }\n\n public get entry() {\n return this.changeset.projectedResource;\n }\n\n public signalModifiedEntry($event:{ savedResource:HalResource, isInital:boolean }) {\n this.modifiedEntry.emit($event as { savedResource:TimeEntryResource, isInital:boolean });\n }\n\n public save() {\n return this.editForm.submit();\n }\n\n public get inEditMode() {\n // For now, we always want the form in edit mode.\n // Alternatively, this.entry.isNew can be used.\n return true;\n }\n\n public isRequired(field:string) {\n // Other than defined in the schema, we consider the work package to be required.\n // Remove once the schema requires it explicitly.\n if (field === 'workPackage') {\n return true;\n }\n return this.schema.ofProperty(field).required;\n }\n\n private setCustomFields() {\n Object.entries(this.schema).forEach(([key, keySchema]) => {\n if (/customField\\d+/.exec(key) && this.isACustomField(keySchema)) {\n this.customFields.push({ key, label: keySchema.name || '', type: keySchema.type });\n }\n });\n }\n\n private isACustomField(obj:unknown):obj is IOPFieldSchema {\n return !!(obj as IOPFieldSchema).type;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { OpSharedModule } from 'core-app/shared/shared.module';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport { OpenprojectFieldsModule } from 'core-app/shared/components/fields/openproject-fields.module';\nimport { TimeEntryCreateModalComponent } from 'core-app/shared/components/time_entries/create/create.modal';\nimport { TimeEntryEditModalComponent } from 'core-app/shared/components/time_entries/edit/edit.modal';\nimport { TimeEntryFormComponent } from 'core-app/shared/components/time_entries/form/form.component';\nimport { TimeEntryEditService } from 'core-app/shared/components/time_entries/edit/edit.service';\nimport { TriggerActionsEntryComponent } from 'core-app/shared/components/time_entries/edit/trigger-actions-entry.component';\nimport { TimeEntryTimerService } from 'core-app/shared/components/time_entries/services/time-entry-timer.service';\nimport { CommonModule } from '@angular/common';\nimport { TimerAccountMenuComponent } from 'core-app/shared/components/time_entries/timer/timer-account-menu.component';\nimport { StopExistingTimerModalComponent } from 'core-app/shared/components/time_entries/timer/stop-existing-timer-modal.component';\n\n@NgModule({\n imports: [\n // Commons\n CommonModule,\n OpSharedModule,\n OpenprojectModalModule,\n\n // Editable fields e.g. for modals\n OpenprojectFieldsModule,\n ],\n declarations: [\n TimeEntryEditModalComponent,\n TimeEntryCreateModalComponent,\n TimeEntryFormComponent,\n TriggerActionsEntryComponent,\n TimerAccountMenuComponent,\n StopExistingTimerModalComponent,\n ],\n providers: [\n TimeEntryTimerService,\n ],\n})\nexport class OpenprojectTimeEntriesModule {\n}\n","import {\n Injectable,\n Injector,\n} from '@angular/core';\nimport {\n filter,\n map,\n tap,\n} from 'rxjs/operators';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport {\n BehaviorSubject,\n Observable,\n} from 'rxjs';\n\n@Injectable()\nexport class TimeEntryTimerService {\n public timer$ = new BehaviorSubject(undefined);\n\n public activeTimer$ = this.timer$\n .asObservable()\n .pipe(\n filter((item) => item !== undefined),\n ) as Observable;\n\n constructor(\n readonly injector:Injector,\n readonly apiV3Service:ApiV3Service,\n ) {\n // Refresh the timer after some interval to not block other resources\n setTimeout(() => this.refresh().subscribe(), 100);\n\n this\n .activeTimer$\n .subscribe((entry) => {\n this.removeTimer();\n\n if (entry) {\n this.renderTimer();\n }\n });\n }\n\n public refresh():Observable {\n const filters = new ApiV3FilterBuilder();\n filters.add('ongoing', '=', true);\n\n return this\n .apiV3Service\n .time_entries\n .filtered(filters)\n .get()\n .pipe(\n map((collection) => collection.elements.pop() || null),\n tap((active) => this.timer$.next(active)),\n );\n }\n\n private renderTimer() {\n const timerElement = document.createElement('span');\n const icon = document.createElement('span');\n timerElement.classList.add('op-principal--timer');\n icon.classList.add('spot-icon', 'spot-icon_time', 'spot-icon_1_25');\n timerElement.appendChild(icon);\n\n const avatar = document.querySelector('.op-top-menu-user-avatar');\n avatar?.appendChild(timerElement);\n }\n\n private removeTimer() {\n const timerElement = document.querySelector('.op-principal--timer') as HTMLElement;\n timerElement?.remove();\n }\n}\n","import {\n ChangeDetectorRef,\n Directive,\n ElementRef,\n Inject,\n Injector,\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 { TimeEntryFormComponent } from 'core-app/shared/components/time_entries/form/form.component';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { ResourceChangeset } from 'core-app/shared/components/fields/changeset/resource-changeset';\n\n@Directive()\nexport abstract class TimeEntryBaseModal extends OpModalComponent implements OnInit {\n @ViewChild('editForm', { static: true }) editForm:TimeEntryFormComponent;\n\n public text:{ [key:string]:string } = {\n title: this.i18n.t('js.time_entry.title'),\n cancel: this.i18n.t('js.button_cancel'),\n close: this.i18n.t('js.button_close'),\n save: this.i18n.t('js.button_save'),\n delete: this.i18n.t('js.button_delete'),\n areYouSure: this.i18n.t('js.text_are_you_sure'),\n };\n\n public formInFlight:boolean;\n\n public changeset:ResourceChangeset;\n\n @InjectField() apiV3Service:ApiV3Service;\n\n constructor(readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) readonly locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly i18n:I18nService,\n readonly injector:Injector) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit() {\n super.ngOnInit();\n this.changeset = this.locals.changeset as ResourceChangeset;\n }\n\n public abstract setModifiedEntry($event:{ savedResource:HalResource, isInital:boolean }):void;\n\n public get entry():TimeEntryResource {\n return this.changeset.projectedResource;\n }\n\n public get showWorkPackageField():boolean {\n return this.locals.showWorkPackageField !== false;\n }\n\n public get showUserField():boolean {\n return this.locals.showUserField !== false;\n }\n\n public saveEntry():void {\n this.formInFlight = true;\n\n this.editForm.save()\n .then(() => this.reloadWorkPackageAndClose())\n .catch(() => {\n this.formInFlight = false;\n this.cdRef.detectChanges();\n });\n }\n\n public get saveAllowed():boolean {\n return true;\n }\n\n public get deleteAllowed():boolean {\n return true;\n }\n\n protected reloadWorkPackageAndClose():void {\n this.service.close();\n this.formInFlight = false;\n // reload workPackage\n if (this.entry.workPackage) {\n void this\n .apiV3Service\n .work_packages\n .id(this.entry.workPackage)\n .refresh();\n }\n\n this.cdRef.detectChanges();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 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 { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport {\n Observable,\n timer,\n} from 'rxjs';\nimport {\n filter,\n map,\n} from 'rxjs/operators';\nimport { formatElapsedTime } from 'core-app/features/work-packages/components/wp-timer-button/time-formatter.helper';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { StateService } from '@uirouter/core';\n\n@Component({\n templateUrl: './stop-existing-timer-modal.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StopExistingTimerModalComponent extends OpModalComponent implements OnInit {\n @HostBinding('class.op-timer-stop-modal') className = true;\n\n public active:TimeEntryResource;\n\n public confirmed = false;\n\n elapsed$:Observable = timer(0, 1000)\n .pipe(\n map(() => this.active),\n filter((timeEntry) => timeEntry !== null),\n map((timeEntry:TimeEntryResource) => formatElapsedTime(timeEntry.createdAt as string)),\n );\n\n public text = {\n title: this.I18n.t('js.timer.start_new_timer'),\n button_cancel: this.I18n.t('js.button_cancel'),\n button_stop: this.I18n.t('js.timer.button_stop'),\n timer_already_running: this.I18n.t('js.timer.timer_already_running'),\n tracking_time: this.I18n.t('js.timer.tracking_time'),\n };\n\n constructor(\n readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly state:StateService,\n readonly I18n:I18nService,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit() {\n super.ngOnInit();\n this.active = this.locals.timer as TimeEntryResource;\n }\n\n saveAndClose():void {\n this.confirmed = true;\n this.closeMe();\n }\n}\n","\n
\n {{text.title}}\n
\n\n

\n\n
\n\n
\n

\n {{ text.tracking_time }}: {{ elapsed$ | async }}\n
\n \n #{{ active.workPackage.id }}: {{ active.workPackage.name }}\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 HostBinding,\n OnInit,\n ViewEncapsulation,\n} from '@angular/core';\nimport { TimeEntryTimerService } from 'core-app/shared/components/time_entries/services/time-entry-timer.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport {\n firstValueFrom,\n Observable,\n switchMap,\n timer,\n} from 'rxjs';\nimport {\n filter,\n map,\n} from 'rxjs/operators';\nimport { formatElapsedTime } from 'core-app/features/work-packages/components/wp-timer-button/time-formatter.helper';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TimeEntryEditService } from '../edit/edit.service';\nimport { HalResourceEditingService } from '../../fields/edit/services/hal-resource-editing.service';\nimport { SchemaCacheService } from 'core-app/core/schemas/schema-cache.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\n\nexport const timerAccountSelector = 'op-timer-account-menu';\n\n@Component({\n selector: timerAccountSelector,\n templateUrl: './timer-account-menu.component.html',\n styleUrls: ['./timer-account-menu.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [TimeEntryEditService,\n HalResourceEditingService],\n})\nexport class TimerAccountMenuComponent extends UntilDestroyedMixin implements OnInit {\n @HostBinding('class.op-timer-account-menu') className = true;\n\n timer$ = this.timeEntryService.activeTimer$;\n\n elapsed$:Observable = timer(0, 1000)\n .pipe(\n switchMap(() => this.timer$),\n filter((timeEntry) => timeEntry !== null),\n map((timeEntry:TimeEntryResource) => formatElapsedTime(timeEntry.createdAt as string)),\n );\n\n text = {\n tracking: this.I18n.t('js.time_entry.tracking'),\n stop: this.I18n.t('js.time_entry.stop'),\n timer_already_stopped: this.I18n.t('js.timer.timer_already_stopped'),\n };\n\n constructor(\n readonly elementRef:ElementRef,\n readonly timeEntryService:TimeEntryTimerService,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n readonly timeEntryEditService:TimeEntryEditService,\n readonly halEditing:HalResourceEditingService,\n readonly schemaCache:SchemaCacheService,\n readonly timezoneService:TimezoneService,\n readonly toastService:ToastService,\n ) {\n super();\n }\n\n ngOnInit() {\n const parent = this.elementRef.nativeElement.parentElement as HTMLElement;\n parent.hidden = true;\n\n this.timer$\n .subscribe((active) => {\n parent.hidden = !active;\n this.cdRef.detectChanges();\n });\n }\n\n public async stopTimer():Promise {\n const active = await firstValueFrom(this.timeEntryService.refresh());\n if (!active) {\n return this.toastService.addWarning(this.text.timer_already_stopped);\n }\n\n return this.timeEntryEditService.stopTimerAndEdit(active);\n }\n}\n","
\n
\n \n

\n \n
\n
\n \n

\n \n \n \n \n

\n
\n
\n
\n \n \n \n \n \n \n \n
\n
\n
    0\">\n \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 OnInit,\n} from '@angular/core';\nimport {\n BehaviorSubject,\n Observable,\n} from 'rxjs';\nimport {\n finalize,\n timeout,\n} from 'rxjs/operators';\nimport { take } from 'rxjs/internal/operators/take';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { IToast, ToastService, ToastType } from 'core-app/shared/components/toaster/toast.service';\n\n@Component({\n templateUrl: './toast.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'op-toast',\n})\nexport class ToastComponent implements OnInit {\n @Input() public toast:IToast;\n\n public text = {\n close_popup: this.I18n.t('js.close_popup_title'),\n };\n\n public type:ToastType;\n\n public uploadCount = 0;\n\n public show = false;\n\n public canBeHidden = false;\n\n public removable = true;\n\n public loading$ = new BehaviorSubject(false);\n\n constructor(\n readonly I18n:I18nService,\n readonly toastService:ToastService,\n ) {\n }\n\n ngOnInit():void {\n this.type = this.toast.type;\n\n this.removable = !['upload', 'loading'].includes(this.type);\n\n if (this.type === 'upload') {\n const data = this.data as [File, Observable];\n this.removable = false;\n this.canBeHidden = data && data.length > 5;\n }\n\n if (this.type === 'loading') {\n this.removable = false;\n this.loading$.next(true);\n (this.data as Observable)\n .pipe(\n take(1),\n timeout(20000),\n finalize(() => {\n this.loading$.next(false);\n this.remove();\n }),\n )\n .subscribe();\n }\n }\n\n public get data():unknown {\n return this.toast.data;\n }\n\n public remove():void {\n this.toastService.remove(this.toast);\n }\n\n /**\n * Execute the link callback from content.link.target\n * and close this toaster.\n */\n public executeTarget():void {\n if (this.toast.link) {\n this.toast.link.target();\n this.remove();\n }\n }\n\n public onUploadSuccess():void {\n this.uploadCount += 1;\n }\n\n public get uploadText():string {\n const count = (this.data as unknown[]).length;\n return this.I18n.t('js.label_upload_counter', { done: this.uploadCount, count });\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { take } from 'rxjs/operators';\nimport { input, State } from '@openproject/reactivestates';\nimport { Injectable } from '@angular/core';\nimport { HttpErrorResponse, HttpEvent } from '@angular/common/http';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport waitForUploadsFinished from 'core-app/core/upload/wait-for-uploads-finished';\nimport {\n IHalErrorBase,\n IHalMultipleError,\n isHalError,\n} from 'core-app/features/hal/resources/error-resource';\n\nexport function removeSuccessFlashMessages():void {\n jQuery('.op-toast.-success').remove();\n}\n\nexport type ToastType = 'success'|'error'|'warning'|'info'|'upload'|'loading';\nexport const OPToastEvent = 'op:toasters:add';\n\nexport interface IToast {\n message:string;\n link?:{ text:string, target:() => void };\n type:ToastType;\n data?:unknown;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ToastService {\n // The current stack of toasters\n private stack = input([]);\n\n constructor(\n readonly configurationService:ConfigurationService,\n readonly I18n:I18nService,\n ) {\n jQuery(window).on(\n OPToastEvent,\n (event:JQuery.TriggeredEvent, toast:IToast) => { this.add(toast); },\n );\n }\n\n /**\n * Get a read-only view of the current stack of toasters.\n */\n public get current():State {\n return this.stack;\n }\n\n public add(toast:IToast, timeoutAfter = 5000):IToast {\n // Remove flash messages\n removeSuccessFlashMessages();\n\n this.stack.doModify((current) => {\n const nextValue = [toast].concat(current);\n _.remove(nextValue, (n, i) => i > 0 && this.removeOnAdd(n));\n return nextValue;\n });\n\n // auto-hide if success\n if (toast.type === 'success' && this.configurationService.autoHidePopups()) {\n setTimeout(() => this.remove(toast), timeoutAfter);\n }\n\n return toast;\n }\n\n private removeOnAdd(toast:IToast):boolean {\n return ['success', 'error', 'loading'].includes(toast.type);\n }\n\n public addError(obj:HttpErrorResponse|IToast|string, additionalErrors:unknown[]|string = []):IToast {\n let message:IToast|string;\n let errors:string[];\n\n if (typeof additionalErrors === 'string') {\n errors = [additionalErrors];\n } else {\n errors = [...additionalErrors] as string[];\n }\n\n if (obj instanceof HttpErrorResponse) {\n message = isHalError(obj.error) ? obj.error.message : obj.message;\n\n if ((obj.error as IHalMultipleError)?._embedded?.errors) {\n errors = [\n ...errors,\n ...(obj.error as IHalMultipleError)._embedded.errors.map((el:IHalErrorBase) => el.message),\n ];\n }\n } else {\n message = obj;\n }\n\n const toast:IToast = this.createToast(message, 'error');\n toast.data = errors;\n\n return this.add(toast);\n }\n\n public addWarning(message:IToast|string):IToast {\n return this.add(this.createToast(message, 'warning'));\n }\n\n public addSuccess(message:IToast|string):IToast {\n return this.add(this.createToast(message, 'success'));\n }\n\n public addNotice(message:IToast|string):IToast {\n return this.add(this.createToast(message, 'info'));\n }\n\n public addUpload(message:string, uploads:[File, Observable>][]):IToast {\n if (!uploads.length) {\n throw new Error('Cannot create an upload toast without uploads!');\n }\n\n const notification = this.add({\n data: uploads,\n type: 'upload',\n message,\n });\n\n waitForUploadsFinished(uploads.map((o) => o[1]))\n .pipe(take(1))\n .subscribe(() => {\n setTimeout(() => this.remove(notification), 700);\n });\n\n return notification;\n }\n\n public addLoading(observable:Observable):IToast {\n return this.add(this.createLoadingToast(this.I18n.t('js.ajax.updating'), observable));\n }\n\n public remove(toast:IToast):void {\n this.stack.doModify((current) => {\n _.remove(current, (n) => n === toast);\n return current;\n });\n }\n\n public clear():void {\n this.stack.putValue([]);\n }\n\n private createToast(toast:IToast|string, type:ToastType):IToast {\n return (typeof toast === 'string')\n ? { message: toast, type }\n : {\n message: toast.message,\n type,\n link: toast.link,\n data: toast.data,\n };\n }\n\n private createLoadingToast(message:IToast|string, observable:Observable) {\n const toast = this.createToast(message, 'loading');\n toast.data = observable;\n\n return toast;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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, OnInit,\n} from '@angular/core';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { IToast, ToastService } from './toast.service';\n\nexport const toastsContainerSelector = 'op-toasts-container';\n\n@Component({\n template: `\n
\n
\n \n
\n
\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: toastsContainerSelector,\n})\nexport class ToastsContainerComponent extends UntilDestroyedMixin implements OnInit {\n public stack:IToast[] = [];\n\n constructor(\n readonly toastService:ToastService,\n readonly cdRef:ChangeDetectorRef\n ) {\n super();\n }\n\n ngOnInit():void {\n this.toastService\n .current\n .values$('Subscribing to changes in the toaster stack')\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((stack) => {\n this.stack = stack;\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 {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport {\n HttpErrorResponse,\n HttpEvent,\n HttpEventType,\n HttpProgressEvent,\n} from '@angular/common/http';\nimport { BehaviorSubject, combineLatest, Observable } from 'rxjs';\n\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\n@Component({\n selector: 'op-toasters-upload-progress',\n template: `\n
  • \n \n \n

    0%

    \n \n \n \n \n
  • \n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UploadProgressComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit {\n @Input() public file:File;\n\n @Input() public upload:Observable>;\n\n @Output() public uploadError = new EventEmitter();\n\n @Output() public uploadSuccess = new EventEmitter();\n\n @ViewChild('progressBar') progressBar:ElementRef;\n\n @ViewChild('progressPercentage') progressPercentage:ElementRef;\n\n public error = false;\n\n public completed = false;\n\n private viewInitialized = new BehaviorSubject(false);\n\n set value(value:number) {\n (this.progressBar.nativeElement as HTMLProgressElement).value = value;\n (this.progressPercentage.nativeElement as HTMLParagraphElement).innerText = `${value}%`;\n\n if (value === 100) {\n (this.progressBar.nativeElement as HTMLElement).style.display = 'none';\n }\n }\n\n ngOnInit() {\n combineLatest([\n this.upload,\n this.viewInitialized,\n ]).pipe(this.untilDestroyed())\n .subscribe(\n ([evt, initialized]) => {\n if (!initialized) {\n return;\n }\n\n switch (evt.type) {\n case HttpEventType.Sent:\n this.value = 5;\n debugLog(`Uploading file \"${this.file.name}\" of size ${this.file.size}.`);\n break;\n case HttpEventType.UploadProgress:\n this.updateProgress(evt);\n break;\n case HttpEventType.Response:\n debugLog(`File ${this.fileName} was fully uploaded.`);\n this.value = 100;\n this.completed = true;\n this.uploadSuccess.emit();\n break;\n case HttpEventType.DownloadProgress:\n case HttpEventType.ResponseHeader:\n /* do nothing */\n break;\n default:\n console.warn(`unknown event type: ${evt.type}`);\n }\n },\n (error:HttpErrorResponse) => this.handleError(error),\n );\n }\n\n ngAfterViewInit():void {\n this.viewInitialized.next(true);\n }\n\n public get fileName():string {\n return this.file && this.file.name;\n }\n\n private updateProgress(evt:HttpProgressEvent) {\n if (evt.total) {\n this.value = Math.round((evt.loaded / evt.total) * 100);\n } else {\n this.value = 10;\n }\n }\n\n private handleError(error:HttpErrorResponse) {\n this.error = true;\n this.uploadError.emit(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 { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n@Component({\n selector: 'op-user-link',\n template: `\n \n \n \n {{ name }}\n \n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UserLinkComponent {\n @Input() user:UserResource;\n\n constructor(readonly I18n:I18nService) {\n }\n\n public get href() {\n return this.user && this.user.showUserPath;\n }\n\n public get name() {\n return this.user && this.user.name;\n }\n\n public get label() {\n return this.I18n.t('js.label_author', { user: this.name });\n }\n}\n","import {\n AfterViewInit,\n Directive,\n ElementRef,\n Input,\n} from '@angular/core';\nimport { FocusHelperService } from './focus-helper';\n\n@Directive({\n selector: '[opAutofocus]',\n})\nexport class AutofocusDirective implements AfterViewInit {\n @Input('opAutofocus') public condition:string|boolean = true;\n\n constructor(\n readonly FocusHelper:FocusHelperService,\n readonly elementRef:ElementRef,\n ) { }\n\n ngAfterViewInit():void {\n this.updateFocus();\n }\n\n private updateFocus():void {\n // Empty string should count as true because just using the directive like the\n // plain HTML autofocus attribute should be possible:\n //\n // \n //\n if (this.condition || this.condition === '') {\n this.FocusHelper.focus(this.elementRef.nativeElement);\n }\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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 * Return whether the target element is either the same as within, or contained within it.\n *\n * @param {Element} within\n * @param {Element} target\n * @returns {boolean}\n */\nexport function insideOrSelf(within:Element, target:Element):boolean {\n return within === target || within.contains(target);\n}\n\n/**\n * Execute the callback when the element is outside\n * @param {Element} within\n * @param {Function} callback\n */\nexport function whenOutside(within:Element, callback:() => void) {\n setTimeout(() => {\n if (!insideOrSelf(within, document.activeElement!)) {\n callback();\n }\n }, 20);\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { findAllFocusableElementsWithin } from 'core-app/shared/helpers/focus-helpers';\n\n@Injectable({ providedIn: 'root' })\nexport class FocusHelperService {\n public focus(element:HTMLElement):void {\n setTimeout(() => {\n const focusable = findAllFocusableElementsWithin(element)[0] || element;\n focusable?.focus();\n }, 20);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { BehaviorSubject } from 'rxjs';\nimport { auditTime } from 'rxjs/operators';\nimport {\n Directive, ElementRef, Input, OnInit,\n} from '@angular/core';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\n// with courtesy of http://stackoverflow.com/a/29722694/3206935\n\n@Directive({\n selector: '[opFocusWithin]',\n})\nexport class FocusWithinDirective extends UntilDestroyedMixin implements OnInit {\n @Input() public selector:string;\n\n constructor(readonly elementRef:ElementRef) {\n super();\n }\n\n ngOnInit() {\n const element = jQuery(this.elementRef.nativeElement);\n const focusedObservable = new BehaviorSubject(false);\n\n focusedObservable\n .pipe(\n this.untilDestroyed(),\n auditTime(50),\n )\n .subscribe((focused) => {\n element.toggleClass('-focus', focused);\n });\n\n const focusListener = function () {\n focusedObservable.next(true);\n };\n element[0].addEventListener('focus', focusListener, true);\n\n const blurListener = function () {\n focusedObservable.next(false);\n };\n element[0].addEventListener('blur', blurListener, true);\n\n setTimeout(() => {\n element.addClass('op-focus-within');\n element.find(this.selector).addClass('op-focus-within');\n }, 0);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { FocusWithinDirective } from './focus-within.directive';\nimport { AutofocusDirective } from './autofocus.directive';\n\n@NgModule({\n declarations: [\n AutofocusDirective,\n FocusWithinDirective,\n ],\n imports: [\n CommonModule,\n ],\n exports: [\n AutofocusDirective,\n FocusWithinDirective,\n ],\n})\nexport class FocusModule { }\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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, OnDestroy, OnInit,\n} from '@angular/core';\n\nexport const highlightColSelector = 'col[opHighlightCol]';\n\n@Component({\n selector: highlightColSelector,\n template: '',\n})\nexport class OpHighlightColDirective implements OnInit, OnDestroy { // eslint-disable-line @angular-eslint/component-class-suffix\n private $element:JQuery;\n\n private thead:JQuery;\n\n constructor(private elementRef:ElementRef) {\n }\n\n ngOnInit() {\n this.$element = jQuery(this.elementRef.nativeElement);\n this.thead = this.$element\n .parent('colgroup')\n .siblings('thead');\n\n // Separate handling instead of toggle is necessary to avoid\n // unwanted side effects when adding/removing columns via keyboard in the modal\n this.thead.on('mouseenter', 'th', (evt:JQuery.TriggeredEvent) => {\n if (this.$element.index() === jQuery(evt.currentTarget).index()) {\n this.$element.addClass('hover');\n }\n });\n\n this.thead.on('mouseleave', 'th', (evt:JQuery.TriggeredEvent) => {\n if (this.$element.index() === jQuery(evt.currentTarget).index()) {\n this.$element.removeClass('hover');\n }\n });\n }\n\n ngOnDestroy() {\n this.thead.off('mouseenter mouseleave');\n }\n}\n","import {\n AfterViewChecked,\n Directive,\n ElementRef,\n Input,\n} from '@angular/core';\n\n@Directive({\n selector: '[opSearchHighlight]',\n})\nexport class OpSearchHighlightDirective implements AfterViewChecked {\n @Input('opSearchHighlight') public query = '';\n\n constructor(readonly elementRef:ElementRef) { }\n\n ngAfterViewChecked():void {\n let el = this.elementRef.nativeElement as HTMLElement;\n const highlightedElement = el.querySelector('.op-search-highlight');\n\n if (!!highlightedElement && this.query && highlightedElement.innerHTML.toLocaleLowerCase() === this.query.toLocaleLowerCase()) {\n return;\n }\n\n el = this.cleanUpOldHighlighting(el);\n if (!this.query) {\n return;\n }\n\n const textNode = Array.from(el.childNodes).find((n:Node) => n.nodeType === n.TEXT_NODE) as Node;\n const content = textNode?.textContent || '';\n if (!content) {\n return;\n }\n\n const query = this.query.toLowerCase();\n const startIndex = content.toLowerCase().indexOf(query);\n if (startIndex < 0) {\n return;\n }\n\n const start = content.slice(0, startIndex);\n const result = content.slice(startIndex, startIndex + query.length);\n const end = content.slice(startIndex + query.length);\n\n const newNode = document.createElement('span');\n newNode.innerHTML = `${_.escape(start)}${_.escape(result)}${_.escape(end)}`;\n el.replaceChild(newNode, textNode);\n }\n\n private cleanUpOldHighlighting(el:HTMLElement):HTMLElement {\n if (el.children.length > 0) {\n const unifiedLabelText = Array.from(el.children, ({ textContent }) => textContent?.trim()).join('');\n // eslint-disable-next-line no-param-reassign\n el.innerHTML = '';\n // eslint-disable-next-line no-param-reassign\n el.innerText = unifiedLabelText;\n }\n\n return el;\n }\n}\n","import 'reflect-metadata';\nimport { InjectFlags, Injector } from '@angular/core';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\n\nexport interface InjectableClass {\n injector:Injector;\n}\n\nexport function InjectField(token?:any, defaultValue:any = null, flags?:InjectFlags) {\n return (target:InjectableClass, property:string) => {\n // eslint-ignore-next-line no-param-reassign\n if (delete (target as any)[property]) {\n Object.defineProperty(target, property, {\n get(this:InjectableClass) {\n if (token) {\n return this.injector.get(token, defaultValue, flags);\n }\n const type = Reflect.getMetadata('design:type', target, property);\n return this.injector.get(type, defaultValue, flags);\n },\n set(this:InjectableClass) {\n debugLog(`Trying to set InjectField property ${property}`);\n },\n });\n }\n };\n}\n","import { HalResource } from 'core-app/features/hal/resources/hal-resource';\n\nexport function halHref(_index:number, item:T):string|null {\n return item.href;\n}\n\nexport function compareByAttribute(attribute:string) {\n return (a:any, b:any) => {\n const bothNil = !a && !b;\n return bothNil || (!!a && !!b && a[attribute] === b[attribute]);\n };\n}\n\nexport function compareByName(a:T|undefined|null, b:T|undefined|null):boolean {\n return compareByAttribute('name')(a, b);\n}\n\nexport function trackByName(i:number, item:any) {\n return _.get(item, 'name');\n}\n\nexport function trackByHref(i:number, item:{ href?:unknown }) {\n return _.get(item, 'href');\n}\n\nexport function trackByProperty(prop:string) {\n return (i:number, item:unknown) => _.get(item, prop);\n}\n\nexport function trackByHrefAndProperty(propertyName:string) {\n return (i:number, item:HalResource) => {\n const href:string = _.get(item, 'href') || '';\n const prop:string = _.get(item, propertyName, 'none');\n\n return `${href}#${propertyName}=${prop}`;\n };\n}\n\nexport function trackByTrackingIdentifier(i:number, item:any) {\n return _.get(item, 'trackingIdentifier', item && item.href);\n}\n\nexport function compareByHref(a:T|undefined|null, b:T|undefined|null):boolean {\n const bothNil = !a && !b;\n return bothNil || (!!a && !!b && a.href === b.href);\n}\n\nexport function compareByHrefOrString(a:T|string|undefined|null|unknown, b:T|string|undefined|null|unknown):boolean {\n if (a instanceof HalResource && b instanceof HalResource) {\n return compareByHref(a, b);\n }\n\n const bothNil = !a && !b;\n return bothNil || a === b;\n}\n","import { OnDestroyMixin, untilComponentDestroyed } from '@w11k/ngx-componentdestroyed';\nimport { Directive, OnDestroy } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n/**\n * Mixin function to provide access to observable and flags\n * whether this component has been destroyed.\n *\n * Use for rxjs with .pipe(this.untilDestroyed)\n */\n@Directive()\nexport class UntilDestroyedMixin extends OnDestroyMixin implements OnDestroy {\n public componentDestroyed = false;\n\n ngOnDestroy():void {\n this.componentDestroyed = true;\n super.ngOnDestroy();\n }\n\n /**\n * Helper function to access `untilComponentDestroyed`\n */\n protected untilDestroyed():(source:Observable) => Observable {\n return untilComponentDestroyed(this);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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 FilterOperator = '='|'!*'|'!'|'~'|'o'|'>t-'|'<>d'|'**'|'ow';\nexport const FalseValue = ['f'];\nexport const TrueValue = ['t'];\n\nexport type ApiV3FilterValueType = string|number|boolean;\n\nexport interface ApiV3FilterValue {\n operator:FilterOperator;\n values:ApiV3FilterValueType[];\n}\n\nexport interface ApiV3Filter {\n [filter:string]:ApiV3FilterValue;\n}\n\nexport type ApiV3FilterObject = { [filter:string]:ApiV3FilterValue };\n\nexport class ApiV3FilterBuilder {\n private filterMap:ApiV3FilterObject = {};\n\n public add(name:string, operator:FilterOperator, filterValues:ApiV3FilterValueType[]|boolean):this {\n const values = (() => {\n if (filterValues === true) {\n return TrueValue;\n }\n\n if (filterValues === false) {\n return FalseValue;\n }\n\n return filterValues;\n })();\n\n this.filterMap[name] = {\n operator,\n values,\n };\n\n return this;\n }\n\n /**\n * Remove from the filter set\n * @param name\n */\n public remove(name:string):void {\n delete this.filterMap[name];\n }\n\n /**\n * Turns the array-map style of query filters to an actual object\n *\n * @param filters APIv3 filter array [ {foo: { operator: '=', val: ['bar'] } }, ...]\n * @return A map { foo: { operator: '=', val: ['bar'] } , ... }\n */\n public static toFilterObject(filters:ApiV3Filter[]):ApiV3FilterObject {\n const map:ApiV3FilterObject = {};\n\n filters.forEach((item:ApiV3Filter) => {\n _.each(item, (val:ApiV3FilterValue, filter:string) => {\n map[filter] = val;\n });\n });\n\n return map;\n }\n\n /**\n * Builds a filter instance from the array-map style of query filters\n *\n * @param filters APIv3 filter array [ {foo: { operator: '=', val: ['bar'] } }, ...]\n * @return ApiV3FilterBuilder\n */\n public static fromFilterObject(filters:ApiV3FilterObject):ApiV3FilterBuilder {\n const instance = new ApiV3FilterBuilder();\n\n Object.keys(filters).forEach((selector) => {\n const item = filters[selector];\n instance.add(selector, item.operator, item.values);\n });\n\n return instance;\n }\n\n /**\n * Merges the other filters into the current set,\n * replacing them if the are duplicated.\n *\n * @param filters\n * @param only Only apply the given filters\n */\n public merge(filters:ApiV3Filter[], ...only:string[]):void {\n const toAdd:ApiV3FilterObject = _.pickBy(\n ApiV3FilterBuilder.toFilterObject(filters),\n (_, filter:string) => only.includes(filter),\n );\n\n this.filterMap = {\n ...this.filterMap,\n ...toAdd,\n };\n }\n\n public get filters():ApiV3Filter[] {\n const filters:ApiV3Filter[] = [];\n _.each(this.filterMap, (val:ApiV3FilterValue, filter:string) => {\n filters.push({ [filter]: val });\n });\n\n return filters;\n }\n\n public toJson():string {\n return JSON.stringify(this.filters);\n }\n\n public toParams(mergeParams:{ [key:string]:string } = {}):string {\n const params = { filters: this.toJson(), ...mergeParams };\n return new URLSearchParams(params).toString();\n }\n\n public clone():ApiV3FilterBuilder {\n const newFilters = new ApiV3FilterBuilder();\n\n this.filters.forEach((filter) => {\n Object.keys(filter).forEach((name) => {\n newFilters.add(name, filter[name].operator, filter[name].values);\n });\n });\n\n return newFilters;\n }\n}\n\nexport function ApiV3Filter(name:string, operator:FilterOperator, values:ApiV3FilterValueType[]):ApiV3FilterBuilder {\n return new ApiV3FilterBuilder().add(name, operator, values);\n}\n","import { environment } from '../../../environments/environment';\n\n/**\n * Execute the callback when DEBUG is defined\n * through webpack.\n */\nexport function whenDebugging(cb:() => void) {\n if (!environment.production) {\n cb();\n }\n}\n\n/**\n * Log with console.log when DEBUG is defined\n * through webpack.\n */\nexport function debugLog(message:string, ...args:unknown[]):void {\n // eslint-disable-next-line no-console\n whenDebugging(() => console.log(`[DEBUG] ${message}`, ...args));\n}\n\nexport function timeOutput(msg:string, cb:() => void):any {\n if (!environment.production) {\n const t0 = performance.now();\n\n const results = cb();\n\n const t1 = performance.now();\n // eslint-disable-next-line no-console\n console.log(`%c${msg} completed in ${(t1 - t0)} milliseconds.`, 'color:#00A093;');\n\n return results;\n }\n return cb();\n}\n\nexport function asyncTimeOutput(msg:string, promise:Promise):any {\n if (!environment.production) {\n const t0 = performance.now();\n\n return promise.then(() => {\n const t1 = performance.now();\n // eslint-disable-next-line no-console\n console.log(`%c${msg} completed in ${(t1 - t0)} milliseconds.`, 'color:#00A093;');\n });\n }\n return promise;\n}\n","export function setBodyCursor(cursor:string, priority:'important'|'' = '') {\n document.body.style.setProperty('cursor', cursor, priority);\n}\n","import { createPointCB, getClientRect as getRect, pointInside } from 'dom-plane';\n\nexport class DomAutoscrollService {\n public elements:Element[];\n\n public scrolling:boolean;\n\n public down = false;\n\n public scrollWhenOutside:boolean;\n\n public autoScroll:() => boolean;\n\n public maxSpeed:number;\n\n public margin:number;\n\n public animationFrame:number;\n\n public windowAnimationFrame:number;\n\n public current:HTMLElement[];\n\n public outerScrollContainer:HTMLElement;\n\n public point:any;\n\n public pointCB:any;\n\n constructor(elements:Element[],\n params:any) {\n this.elements = elements;\n this.scrollWhenOutside = params.scrollWhenOutside || false;\n this.maxSpeed = params.maxSpeed || 5;\n this.margin = params.margin || 10;\n this.scrollWhenOutside = params.scrollWhenOutside || false;\n this.autoScroll = params.autoScroll;\n this.point = {};\n this.pointCB = createPointCB(this.point);\n\n this.init();\n }\n\n public init() {\n jQuery(window).on('mousemove.domautoscroll touchmove.domautoscroll', (evt:any) => {\n if (this.down) {\n this.pointCB(evt);\n this.onMove(evt);\n }\n });\n jQuery(window).on('mousedown.domautoscroll touchstart.domautoscroll', () => { this.down = true; });\n jQuery(window).on('mouseup.domautoscroll touchend.domautoscroll', () => this.onUp());\n jQuery(window).on('scroll.domautoscroll', (evt:any) => this.setScroll(evt));\n }\n\n public destroy() {\n jQuery(window).off('.domautoscroll');\n\n this.elements = [];\n this.cleanAnimation();\n }\n\n public add(el:Element|Element[]) {\n if (Array.isArray(el)) {\n this.elements = this.elements.concat(el);\n\n // Remove duplicates\n this.elements = Array.from(new Set(this.elements));\n } else {\n this.elements.push(el);\n }\n }\n\n public onUp() {\n this.down = false;\n cancelAnimationFrame(this.animationFrame);\n cancelAnimationFrame(this.windowAnimationFrame);\n }\n\n public setScroll(e:any) {\n for (let i = 0; i < this.elements.length; i++) {\n if (this.elements[i] === e.target) {\n this.scrolling = true;\n break;\n }\n }\n\n if (this.scrolling) {\n requestAnimationFrame(() => { this.scrolling = false; });\n }\n }\n\n public cleanAnimation() {\n cancelAnimationFrame(this.animationFrame);\n cancelAnimationFrame(this.windowAnimationFrame);\n }\n\n public getTarget(target:HTMLElement):HTMLElement[] {\n if (!target) {\n return [];\n }\n\n const recurseParents = (targetObject:HTMLElement):HTMLElement[] => [\n ...(this.elements.includes(targetObject) ? [targetObject] : []),\n ...(targetObject.parentElement ? recurseParents(targetObject.parentElement) : []),\n ];\n return recurseParents(target);\n }\n\n public getElementsUnderPoint():HTMLElement[] {\n const underPoint = [];\n\n for (let i = 0; i < this.elements.length; i++) {\n if (this.inside(this.point, this.elements[i])) {\n underPoint.push(this.elements[i] as HTMLElement);\n }\n }\n\n return underPoint;\n }\n\n public onMove(event:any) {\n if (!this.autoScroll()) {\n return;\n }\n\n if (event.dispatched) {\n return;\n }\n\n let target = [] as HTMLElement[];\n if (event.target !== null) {\n target.push(event.target as HTMLElement);\n }\n const { body } = document;\n\n if (target.length > 0 && target[0].parentNode === body) {\n // The special condition to improve speed.\n target = this.getElementsUnderPoint();\n } else {\n target = this.getTarget(target[0]);\n\n if (target.length === 0) {\n target = this.getElementsUnderPoint();\n }\n }\n\n this.current = target;\n\n if (this.current.length === 0) {\n this.current = [this.outerScrollContainer];\n }\n\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = requestAnimationFrame(this.scrollTick.bind(this));\n }\n\n public setOuterScrollContainer(el:HTMLElement) {\n this.outerScrollContainer = el;\n }\n\n public scrollTick() {\n if (this.current.length === 0) {\n return;\n }\n\n this.current.forEach((e?:Element) => {\n if (e) {\n this.scrollAutomatically(e);\n }\n });\n\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = requestAnimationFrame(this.scrollTick.bind(this));\n }\n\n public scrollAutomatically(el:Element) {\n const rect = getRect(el);\n const scrollx = (() => {\n if (this.point.x < rect.left + this.margin) {\n return -this.maxSpeed;\n } if (this.point.x > rect.right - this.margin) {\n return this.maxSpeed;\n }\n return 0;\n })();\n\n const scrolly = (() => {\n if (this.point.y < rect.top + this.margin) {\n return -this.maxSpeed;\n } if (this.point.y > rect.bottom - this.margin) {\n return this.maxSpeed;\n }\n return 0;\n })();\n\n setTimeout(() => {\n if (scrolly) {\n this.scrollY(el, scrolly);\n }\n\n if (scrollx) {\n this.scrollX(el, scrollx);\n }\n });\n }\n\n public scrollY(el:Element|Window, amount:number) {\n if (el === window) {\n window.scrollTo(el.pageXOffset, el.pageYOffset + amount);\n } else {\n // eslint-disable-next-line no-param-reassign\n (el as Element).scrollTop += amount;\n }\n }\n\n public scrollX(el:Element|Window, amount:number) {\n if (el === window) {\n window.scrollTo(el.pageXOffset + amount, el.pageYOffset);\n } else {\n // eslint-disable-next-line no-param-reassign\n (el as Element).scrollLeft += amount;\n }\n }\n\n public inside(point:any, el:Element, rect?:any) {\n if (!rect) {\n return pointInside(point, el);\n }\n return (point.y > rect.top && point.y < rect.bottom\n && point.x > rect.left && point.x < rect.right);\n }\n}\n","export function findIndex(el:HTMLElement):number {\n if (!el.parentElement) {\n return -1;\n }\n\n const children = Array.from(el.parentElement.children);\n return children.indexOf(el);\n}\n\nexport function reinsert(el:HTMLElement, previousIndex:number|string, container:HTMLElement) {\n const prev = typeof previousIndex === 'string' ? parseInt(previousIndex, 10) : previousIndex;\n const currentIndex = el.parentNode ? Array.from(el.parentNode.children).indexOf(el) : null;\n const children = Array.from(container.children);\n\n const pointOfInsertion = (() => {\n if (currentIndex != null && currentIndex >= 0) {\n const isDraggingDown = currentIndex > prev;\n return isDraggingDown ? children[prev] : children[prev + 1];\n }\n\n return children[prev];\n })();\n\n if (pointOfInsertion) {\n container.insertBefore(el, pointOfInsertion);\n } else {\n container.appendChild(el);\n }\n}\n","import {\n Inject, Injectable, Injector, OnDestroy,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { DomAutoscrollService } from 'core-app/shared/helpers/drag-and-drop/dom-autoscroll.service';\nimport { findIndex, reinsert } from 'core-app/shared/helpers/drag-and-drop/drag-and-drop.helpers';\n\nexport interface DragMember {\n dragContainer:HTMLElement;\n scrollContainers:HTMLElement[];\n /** Whether this element moves */\n moves:(element:HTMLElement, fromContainer:HTMLElement, handle:HTMLElement, sibling?:HTMLElement|null) => boolean;\n /** Move element in container */\n onMoved:(element:HTMLElement, target:any, source:HTMLElement, sibling:HTMLElement|null) => void;\n /** Add element to this container */\n onAdded:(element:HTMLElement, target:any, source:HTMLElement, sibling:HTMLElement|null) => Promise;\n /** Remove element from this container */\n onRemoved:(element:HTMLElement, target:any, source:HTMLElement, sibling:HTMLElement|null) => void;\n\n /** Move this container accepts elements */\n accepts?:(row:HTMLElement, container:any) => boolean;\n\n /** Callback when the element got cloned */\n onCloned?:(clone:HTMLElement, original:HTMLElement) => void;\n\n /** Callback when the shadow element got inserted into a container */\n onShadowInserted?:(row:HTMLElement) => void;\n\n /** Callback when the shadow element got inserted into a container */\n onCancel?:(element:HTMLElement) => void;\n}\n\n@Injectable()\nexport class DragAndDropService implements OnDestroy {\n public drake:dragula.Drake|null = null;\n\n public members:DragMember[] = [];\n\n private autoscroll:any;\n\n private escapeListener = (evt:KeyboardEvent) => {\n if (this.drake && evt.key === 'Escape') {\n this.drake.cancel(true);\n }\n };\n\n constructor(@Inject(DOCUMENT) private document:Document,\n readonly injector:Injector) {\n this.document.documentElement.addEventListener('keydown', this.escapeListener);\n }\n\n ngOnDestroy():void {\n this.document.documentElement.removeEventListener('keydown', this.escapeListener);\n\n if (this.autoscroll) {\n this.autoscroll.destroy();\n }\n\n if (this.drake) {\n this.drake.destroy();\n }\n }\n\n public remove(container:HTMLElement) {\n if (this.initialized) {\n _.remove(this.drake!.containers, (el) => el === container);\n _.remove(this.members, (el) => el.dragContainer === container);\n }\n }\n\n public member(container:HTMLElement):DragMember|undefined {\n return _.find(this.members, (el) => el.dragContainer === container);\n }\n\n public get initialized() {\n return this.drake !== null;\n }\n\n public register(member:DragMember) {\n this.members.push(member);\n const { scrollContainers } = member;\n\n if (this.autoscroll) {\n this.autoscroll.add(scrollContainers);\n } else {\n this.setupAutoscroll(scrollContainers);\n }\n\n const { dragContainer } = member;\n if (this.drake === null) {\n this.initializeDrake([dragContainer]);\n } else {\n this.drake.containers.push(dragContainer);\n }\n }\n\n public addScrollContainer(el:Element) {\n if (this.autoscroll) {\n this.autoscroll.add(el);\n } else {\n this.setupAutoscroll([el]);\n }\n this.autoscroll.setOuterScrollContainer(el);\n }\n\n protected setupAutoscroll(containers:Element[]) {\n // Setup autoscroll\n this.autoscroll = new DomAutoscrollService(\n containers,\n {\n margin: 100,\n maxSpeed: 10,\n scrollWhenOutside: true,\n autoScroll: () => this.drake && this.drake.dragging,\n },\n );\n }\n\n /**\n * Retrieve a member from the container, if one exists.\n * @param container\n */\n protected getMember(container:Element):DragMember|undefined {\n return this.members.find((member) => member.dragContainer === container);\n }\n\n protected initializeDrake(containers:Element[]) {\n this.drake = dragula(containers, {\n moves: (el:any, container:any, handle:any, sibling:any) => {\n const member = this.getMember(container);\n return member ? member.moves(el, container, handle, sibling) : false;\n },\n accepts: (el:any, container:any) => {\n const member = this.getMember(container);\n return (member && member.accepts) ? member.accepts(el, container) : true;\n },\n invalid: () => false,\n direction: 'vertical', // Y axis is considered when determining where an element would be dropped\n copy: false, // elements are moved by default, not copied\n revertOnSpill: true, // spilling will put the element back where it was dragged from, if this is true\n removeOnSpill: false, // spilling will `.remove` the element, if this is true\n mirrorContainer: document.body, // set the element that gets mirror elements appended\n ignoreInputTextSelection: true, // allows users to select input text, see details below\n });\n\n this.drake.on('drag', (el:HTMLElement) => {\n // eslint-disable-next-line no-param-reassign\n el.dataset.sourceIndex = findIndex(el).toString();\n });\n\n this.drake.on('over', (_, container:HTMLElement) => {\n const zone = container.closest('.drop-zone');\n if (zone) {\n zone.classList.add('-dragged-over');\n }\n });\n\n this.drake.on('out', (_, container:HTMLElement) => {\n const zone = container.closest('.drop-zone');\n if (zone) {\n zone.classList.remove('-dragged-over');\n }\n });\n\n this.drake.on('cloned', (clone:HTMLElement, original:HTMLElement) => {\n const member = this.member(original.parentElement!);\n if (member && member.onCloned) {\n member.onCloned(clone, original);\n }\n });\n\n this.drake.on('drop', (el:HTMLElement, target:HTMLElement, source:HTMLElement, sibling:HTMLElement) => {\n try {\n void this.handleDrop(el, target, source, sibling);\n } catch (e) {\n console.error('Failed to handle drop of %O, %O', el, e);\n }\n });\n\n this.drake.on('shadow', (shadowElement:HTMLElement, container:HTMLElement) => {\n const member = this.member(container);\n if (member && member.onShadowInserted) {\n member.onShadowInserted(shadowElement);\n }\n });\n\n this.drake.on('cancel', (el:HTMLElement, container:HTMLElement) => {\n const member = this.member(container);\n if (member && member.onCancel) {\n member.onCancel(el);\n }\n });\n }\n\n private async handleDrop(el:HTMLElement, target:HTMLElement, source:HTMLElement, sibling:HTMLElement|null) {\n const to = this.member(target);\n const from = this.member(source);\n\n if (!(to && from)) {\n return;\n }\n\n if (to === from) {\n to.onMoved(el, target, source, sibling);\n return;\n }\n\n const result = await to.onAdded(el, target, source, sibling);\n if (result) {\n from.onRemoved(el, target, source, sibling);\n } else {\n // Restore element in from container\n reinsert(el, el.dataset.sourceIndex || -1, source);\n }\n }\n}\n","/**\n * Elements that can receive focus\n */\nexport const FOCUSABLE_ELEMENT_SELECTORS = [\n 'a[href]:not([tabindex^=\"-\"])',\n 'area[href]:not([tabindex^=\"-\"])',\n 'input:not([type=\"hidden\"]):not([type=\"radio\"]):not([disabled]):not([tabindex^=\"-\"])',\n 'input[type=\"radio\"]:not([disabled]):not([tabindex^=\"-\"])',\n 'select:not([disabled]):not([tabindex^=\"-\"])',\n 'textarea:not([disabled]):not([tabindex^=\"-\"])',\n 'button:not([disabled]):not([tabindex^=\"-\"])',\n 'iframe:not([tabindex^=\"-\"])',\n 'audio[controls]:not([tabindex^=\"-\"])',\n 'video[controls]:not([tabindex^=\"-\"])',\n '[contenteditable]:not([tabindex^=\"-\"])',\n '[tabindex]:not([tabindex^=\"-\"]):not(.cdk-focus-trap-anchor)',\n];\n\n/**\n * Find all focusable element within a given container\n */\nexport function findAllFocusableElementsWithin(container:HTMLElement):NodeListOf {\n return container.querySelectorAll(FOCUSABLE_ELEMENT_SELECTORS.toString());\n}\n","/**\n * Returns an absolute asset path from the assets/images/ folder\n *\n * e.g., to access:\n * frontend/src/assets/images/board_creation_modal/assignees.svg\n *\n * use\n * imagePath('board_creation_modal/assignees.svg')\n *\n *\n * @param image Path to the image starting from frontend/src/assets/images\n */\nexport function imagePath(image:string) {\n return `${__webpack_public_path__}assets/images/${image}`;\n}\n","export enum KeyCodes {\n BACKSPACE = 8,\n TAB = 9,\n ENTER = 13,\n SHIFT = 16,\n CTRL = 17,\n ALT = 18,\n PAUSE = 19,\n CAPS_LOCK = 20,\n ESCAPE = 27,\n SPACE = 32,\n PAGE_UP = 33,\n PAGE_DOWN = 34,\n END = 35,\n HOME = 36,\n LEFT_ARROW = 37,\n UP_ARROW = 38,\n RIGHT_ARROW = 39,\n DOWN_ARROW = 40,\n INSERT = 45,\n DELETE = 46,\n KEY_0 = 48,\n KEY_1 = 49,\n KEY_2 = 50,\n KEY_3 = 51,\n KEY_4 = 52,\n KEY_5 = 53,\n KEY_6 = 54,\n KEY_7 = 55,\n KEY_8 = 56,\n KEY_9 = 57,\n KEY_A = 65,\n KEY_B = 66,\n KEY_C = 67,\n KEY_D = 68,\n KEY_E = 69,\n KEY_F = 70,\n KEY_G = 71,\n KEY_H = 72,\n KEY_I = 73,\n KEY_J = 74,\n KEY_K = 75,\n KEY_L = 76,\n KEY_M = 77,\n KEY_N = 78,\n KEY_O = 79,\n KEY_P = 80,\n KEY_Q = 81,\n KEY_R = 82,\n KEY_S = 83,\n KEY_T = 84,\n KEY_U = 85,\n KEY_V = 86,\n KEY_W = 87,\n KEY_X = 88,\n KEY_Y = 89,\n KEY_Z = 90,\n LEFT_META = 91,\n RIGHT_META = 92,\n SELECT = 93,\n NUMPAD_0 = 96,\n NUMPAD_1 = 97,\n NUMPAD_2 = 98,\n NUMPAD_3 = 99,\n NUMPAD_4 = 100,\n NUMPAD_5 = 101,\n NUMPAD_6 = 102,\n NUMPAD_7 = 103,\n NUMPAD_8 = 104,\n NUMPAD_9 = 105,\n MULTIPLY = 106,\n ADD = 107,\n SUBTRACT = 109,\n DECIMAL = 110,\n DIVIDE = 111,\n F1 = 112,\n F2 = 113,\n F3 = 114,\n F4 = 115,\n F5 = 116,\n F6 = 117,\n F7 = 118,\n F8 = 119,\n F9 = 120,\n F10 = 121,\n F11 = 122,\n F12 = 123,\n NUM_LOCK = 144,\n SCROLL_LOCK = 145,\n SEMICOLON = 186,\n EQUALS = 187,\n COMMA = 188,\n DASH = 189,\n PERIOD = 190,\n FORWARD_SLASH = 191,\n GRAVE_ACCENT = 192,\n OPEN_BRACKET = 219,\n BACK_SLASH = 220,\n CLOSE_BRACKET = 221,\n SINGLE_QUOTE = 222,\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nexport function isClickedWithModifier(event:MouseEvent|JQuery.TriggeredEvent) {\n const modifier = event.ctrlKey || event.shiftKey || event.metaKey;\n const middleButton = event.button === 1;\n\n return modifier || middleButton;\n}\n","/**\n * Return an HTML element with the given icon classes\n * and aria-hidden=true set.\n */\nexport function opIconElement(...classes:string[]) {\n const icon = document.createElement('i');\n icon.setAttribute('aria-hidden', 'true');\n icon.classList.add(...classes);\n\n return icon;\n}\n","const pattern = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\nexport function randomString(length = 16) {\n return (new Array(length))\n .fill(null)\n .map(() => pattern.charAt(Math.floor(Math.random() * pattern.length)))\n .join('');\n}\n","import { EventEmitter } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\n\nexport class DebouncedEventEmitter {\n private emitter = new EventEmitter();\n\n private debouncer:Subject;\n\n constructor(takeUntil$:Observable, debounceTimeInMs = 250) {\n this.debouncer = new Subject();\n this.debouncer\n .pipe(\n debounceTime(debounceTimeInMs),\n takeUntil(takeUntil$),\n )\n .subscribe((val) => this.emitter.emit(val));\n }\n\n public emit(value:T):void {\n this.debouncer.next(value);\n }\n\n public subscribe(generatorOrNext?:any, error?:any, complete?:any):any {\n return this.emitter.subscribe(generatorOrNext, error, complete);\n }\n}\n","import { debugLog } from '../debug_output';\n\n/**\n * Try to set the position on the given input element.\n *\n * @param element The element to set the cursor to\n * @param offset The character offset retrieved from getPosition.\n */\nexport function setPosition(element:HTMLInputElement, offset:number):void {\n try {\n element.setSelectionRange(offset, offset);\n } catch (e) {\n debugLog('Failed to set click position for edit field.', e);\n }\n}\n\n/**\n * Get the cursor offset from the click event.\n *\n * @param evt\n * @return {number}\n */\nexport function getPosition(evt:any):number {\n const originalEvt = evt.originalEvent;\n\n try {\n if (originalEvt.rangeParent) {\n const range = document.createRange();\n range.setStart(originalEvt.rangeParent, originalEvt.rangeOffset);\n return range.startOffset;\n }\n\n const legacyDocument = document as { caretRangeFromPoint?:(x:number, y:number) => { startOffset:number } };\n if (legacyDocument.caretRangeFromPoint) {\n return legacyDocument\n .caretRangeFromPoint((evt as MouseEvent).clientX, (evt as MouseEvent).clientY)\n .startOffset;\n }\n\n return 0;\n } catch (e) {\n debugLog('Failed to get click position for edit field.', e);\n return 0;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n Injector,\n Input,\n OnInit,\n Output,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\nimport {\n areDatesEqual,\n mappedDate,\n onDayCreate,\n parseDate,\n setDates,\n validDate,\n} from 'core-app/shared/components/datepicker/helpers/date-modal.helpers';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { DatePicker } from '../datepicker';\nimport flatpickr from 'flatpickr';\nimport { DayElement } from 'flatpickr/dist/types/instance';\nimport {\n ActiveDateChange,\n DateFields,\n DateKeys,\n} from '../wp-multi-date-form/wp-multi-date-form.component';\nimport {\n fromEvent,\n merge,\n Observable,\n Subject,\n} from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport {\n debounceTime,\n filter,\n map,\n} from 'rxjs/operators';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport { DateOption } from 'flatpickr/dist/types/options';\nimport { WeekdayService } from 'core-app/core/days/weekday.service';\nimport { FocusHelperService } from 'core-app/shared/directives/focus/focus-helper';\nimport { SpotDropModalTeleportationService } from 'core-app/spot/components/drop-modal/drop-modal-teleportation.service';\n\n@Component({\n selector: 'op-multi-date-picker',\n templateUrl: './multi-date-picker.component.html',\n styleUrls: ['../styles/datepicker.modal.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OpMultiDatePickerComponent),\n multi: true,\n },\n ],\n})\nexport class OpMultiDatePickerComponent extends UntilDestroyedMixin implements OnInit, ControlValueAccessor {\n @ViewChild('modalContainer') modalContainer:ElementRef;\n\n @ViewChild('flatpickrTarget') flatpickrTarget:ElementRef;\n\n @Input() id = `flatpickr-input-${+(new Date())}`;\n\n @Input() name = '';\n\n @Input() fieldName = '';\n\n @Input() value:string[] = [];\n\n @Input() applyLabel:string;\n\n private _opened = false;\n\n @Input() set opened(opened:boolean) {\n if (this._opened === !!opened) {\n return;\n }\n\n this._opened = !!opened;\n\n if (this._opened) {\n this.initializeDatepickerAfterOpen();\n } else {\n this.datePickerInstance?.destroy();\n this.closed.emit();\n }\n }\n\n get opened() {\n return this._opened;\n }\n\n @Output() valueChange = new EventEmitter();\n\n @Output('closed') closed = new EventEmitter();\n\n text = {\n apply: this.I18n.t('js.modals.button_apply'),\n cancel: this.I18n.t('js.button_cancel'),\n startDate: this.I18n.t('js.work_packages.properties.startDate'),\n endDate: this.I18n.t('js.work_packages.properties.dueDate'),\n placeholder: this.I18n.t('js.placeholders.default'),\n today: this.I18n.t('js.label_today'),\n days: (count:number):string => this.I18n.t('js.units.day', { count }),\n ignoreNonWorkingDays: {\n title: this.I18n.t('js.work_packages.datepicker_modal.ignore_non_working_days.title'),\n },\n };\n\n get datesString():string {\n if (this.value?.[0] && this.value?.[1]) {\n return `${this.value[0]} - ${this.value[1]}`;\n }\n\n return this.text.placeholder;\n }\n\n ignoreNonWorkingDays = true;\n\n currentlyActivatedDateField:DateFields;\n\n htmlId = '';\n\n dates:{ [key in DateKeys]:string|null } = {\n start: null,\n end: null,\n };\n\n // Manual changes from the inputs to start and end dates\n startDateChanged$ = new Subject();\n\n startDateDebounced$:Observable = this.debouncedInput(this.startDateChanged$, 'start');\n\n endDateChanged$ = new Subject();\n\n endDateDebounced$:Observable = this.debouncedInput(this.endDateChanged$, 'end');\n\n // Manual changes to the datepicker, with information which field was active\n datepickerChanged$ = new Subject();\n\n ignoreNonWorkingDaysWritable = true;\n\n private datePickerInstance:DatePicker;\n\n constructor(\n readonly injector:Injector,\n readonly cdRef:ChangeDetectorRef,\n readonly I18n:I18nService,\n readonly timezoneService:TimezoneService,\n readonly deviceService:DeviceService,\n readonly weekdayService:WeekdayService,\n readonly focusHelper:FocusHelperService,\n readonly spotDropModalTeleportationService:SpotDropModalTeleportationService,\n ) {\n super();\n\n merge(\n this.startDateDebounced$,\n this.endDateDebounced$,\n this.datepickerChanged$,\n )\n .pipe(\n this.untilDestroyed(),\n filter(() => !!this.datePickerInstance),\n )\n .subscribe(([field, update]) => {\n // When clearing the one date, clear the others as well\n if (update !== null) {\n this.handleSingleDateUpdate(field, update);\n }\n\n this.cdRef.detectChanges();\n });\n }\n\n ngOnInit():void {\n this.applyLabel = this.applyLabel || this.text.apply;\n this.htmlId = `wp-datepicker-${this.fieldName}`;\n this.dates.start = this.value?.[0];\n this.dates.end = this.value?.[1];\n\n this.setCurrentActivatedField(this.initialActivatedField);\n }\n\n onInputClick(event:MouseEvent) {\n event.stopPropagation();\n }\n\n close():void {\n this.opened = false;\n }\n\n changeNonWorkingDays():void {\n this.initializeDatepicker();\n this.cdRef.detectChanges();\n }\n\n save($event:Event):void {\n $event.preventDefault();\n const value = [\n this.dates.start || '',\n this.dates.end || '',\n ];\n this.value = value;\n this.valueChange.emit(value);\n this.onChange(value);\n this.close();\n }\n\n updateDate(key:DateKeys, val:string|null):void {\n if ((val === null || validDate(val)) && this.datePickerInstance) {\n this.dates[key] = mappedDate(val);\n const dateValue = parseDate(val || '') || undefined;\n this.enforceManualChangesToDatepicker(dateValue);\n this.cdRef.detectChanges();\n }\n }\n\n setCurrentActivatedField(val:DateFields):void {\n this.currentlyActivatedDateField = val;\n }\n\n toggleCurrentActivatedField():void {\n this.currentlyActivatedDateField = this.currentlyActivatedDateField === 'start' ? 'end' : 'start';\n }\n\n isStateOfCurrentActivatedField(val:DateFields):boolean {\n return this.currentlyActivatedDateField === val;\n }\n\n setToday(key:DateKeys):void {\n this.datepickerChanged$.next([key, new Date()]);\n\n const nextActive = key === 'start' ? 'end' : 'start';\n this.setCurrentActivatedField(nextActive);\n }\n\n showFieldAsActive(field:DateFields):boolean {\n return this.isStateOfCurrentActivatedField(field);\n }\n\n private initializeDatepickerAfterOpen():void {\n this.spotDropModalTeleportationService\n .afterRenderOnce$(true)\n .subscribe(() => {\n this.initializeDatepicker();\n });\n }\n\n private initializeDatepicker(minimalDate?:Date|null) {\n this.datePickerInstance?.destroy();\n this.datePickerInstance = new DatePicker(\n this.injector,\n this.id,\n [this.dates.start || '', this.dates.end || ''],\n {\n mode: 'range',\n showMonths: this.deviceService.isMobile ? 1 : 2,\n inline: true,\n onReady: (_date, _datestr, instance) => {\n instance.calendarContainer.classList.add('op-datepicker-modal--flatpickr-instance');\n\n this.ensureHoveredSelection(instance.calendarContainer);\n },\n onChange: (dates:Date[], _datestr, instance) => {\n this.onTouched();\n\n if (dates.length === 2) {\n this.setDates(dates[0], dates[1]);\n this.toggleCurrentActivatedField();\n this.cdRef.detectChanges();\n return;\n }\n\n // Update with the same flow as entering a value\n const { latestSelectedDateObj } = instance as { latestSelectedDateObj:Date };\n const activeField = this.currentlyActivatedDateField;\n this.handleSingleDateUpdate(activeField, latestSelectedDateObj);\n this.cdRef.detectChanges();\n },\n onDayCreate: async (dObj:Date[], dStr:string, fp:flatpickr.Instance, dayElem:DayElement) => {\n onDayCreate(\n dayElem,\n this.ignoreNonWorkingDays,\n await this.datePickerInstance?.isNonWorkingDay(dayElem.dateObj),\n this.isDayDisabled(dayElem, minimalDate),\n );\n },\n },\n this.flatpickrTarget.nativeElement as HTMLElement,\n );\n }\n\n private enforceManualChangesToDatepicker(enforceDate?:Date) {\n let startDate = parseDate(this.dates.start || '');\n let endDate = parseDate(this.dates.end || '');\n\n if (startDate && endDate) {\n // If the start date is manually changed to be after the end date,\n // we adjust the end date to be at least the same as the newly entered start date.\n // Same applies if the end date is set manually before the current start date\n if (startDate > endDate && this.isStateOfCurrentActivatedField('start')) {\n endDate = startDate;\n this.dates.end = this.timezoneService.formattedISODate(endDate);\n } else if (endDate < startDate && this.isStateOfCurrentActivatedField('end')) {\n startDate = endDate;\n this.dates.start = this.timezoneService.formattedISODate(startDate);\n }\n }\n\n const dates = [startDate, endDate];\n setDates(dates, this.datePickerInstance, enforceDate);\n }\n\n private setDates(newStart:Date, newEnd:Date) {\n this.dates.start = this.timezoneService.formattedISODate(newStart);\n this.dates.end = this.timezoneService.formattedISODate(newEnd);\n }\n\n private handleSingleDateUpdate(activeField:DateFields, selectedDate:Date) {\n if (activeField === 'duration') {\n return;\n }\n\n this.replaceDatesWithNewSelection(activeField, selectedDate);\n\n // Set the selected date on the datepicker\n this.enforceManualChangesToDatepicker(selectedDate);\n }\n\n private replaceDatesWithNewSelection(activeField:DateFields, selectedDate:Date) {\n /**\n Overwrite flatpickr default behavior by not starting a new date range everytime but preserving either start or end date.\n There are three cases to cover.\n 1. Everything before the current start date will become the new start date (independent of the active field)\n 2. Everything after the current end date will become the new end date if that is the currently active field.\n If the active field is the start date, the selected date becomes the new start date and the end date is cleared.\n 3. Everything in between the current start and end date is dependent on the currently activated field.\n * */\n\n const parsedStartDate = parseDate(this.dates.start || '') as Date;\n const parsedEndDate = parseDate(this.dates.end || '') as Date;\n\n if (selectedDate < parsedStartDate) {\n if (activeField === 'start') {\n // Set start, derive end from\n this.applyNewDates([selectedDate]);\n } else {\n // Reset and end date\n this.applyNewDates(['', selectedDate]);\n }\n } else if (selectedDate > parsedEndDate) {\n if (activeField === 'end') {\n this.applyNewDates([parsedStartDate, selectedDate]);\n } else {\n // Reset and end date\n this.applyNewDates([selectedDate]);\n }\n } else if (areDatesEqual(selectedDate, parsedStartDate) || areDatesEqual(selectedDate, parsedEndDate)) {\n this.applyNewDates([selectedDate, selectedDate]);\n } else {\n const newDates = activeField === 'start' ? [selectedDate, parsedEndDate] : [parsedStartDate, selectedDate];\n this.applyNewDates(newDates);\n }\n }\n\n private applyNewDates([start, end]:DateOption[]) {\n this.dates.start = start ? this.timezoneService.formattedISODate(start) : null;\n this.dates.end = end ? this.timezoneService.formattedISODate(end) : null;\n\n // Apply the dates to the datepicker\n setDates([start, end], this.datePickerInstance);\n }\n\n private get initialActivatedField():DateFields {\n switch (this.fieldName) {\n case 'startDate':\n return 'start';\n case 'dueDate':\n return 'end';\n case 'duration':\n return 'duration';\n default:\n return (this.dates.start && !this.dates.end) ? 'end' : 'start';\n }\n }\n\n private isDayDisabled(dayElement:DayElement, minimalDate?:Date|null):boolean {\n return !!minimalDate && dayElement.dateObj <= minimalDate;\n }\n\n private debouncedInput(input$:Subject, key:DateKeys):Observable {\n return input$\n .pipe(\n this.untilDestroyed(),\n // Skip values that are already set as the current model\n filter((value) => value !== this.dates[key]),\n // Avoid that the manual changes are moved to the datepicker too early.\n // The debounce is chosen quite large on purpose to catch the following case:\n // 1. Start date is for example 2022-07-15. The user wants to set the end date to the 19th.\n // 2. So he/she starts entering the finish date 2022-07-1 .\n // 3. This is already a valid date. Since it is before the start date,the start date would be changed automatically to the first without the debounce.\n // 4. The debounce gives the user enough time to type the last number \"9\" before the changes are converted to the datepicker and the start date would be affected.\n debounceTime(500),\n filter((date) => validDate(date)),\n map((date) => {\n if (date === '') {\n return null;\n }\n\n return parseDate(date) as Date;\n }),\n map((date) => [key, date]),\n );\n }\n\n /**\n * When hovering selections in the range datepicker, the range usually\n * stays active no matter where the cursor is.\n *\n * We want to hide any hovered selection preview when we leave the datepicker.\n * @param calendarContainer\n * @private\n */\n private ensureHoveredSelection(calendarContainer:HTMLDivElement) {\n fromEvent(calendarContainer, 'mouseenter')\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe(() => calendarContainer.classList.remove('flatpickr-container-suppress-hover'));\n\n fromEvent(calendarContainer, 'mouseleave')\n .pipe(\n this.untilDestroyed(),\n filter(() => !(!!this.dates.start && !!this.dates.end)),\n )\n .subscribe(() => calendarContainer.classList.add('flatpickr-container-suppress-hover'));\n }\n\n writeValue(newValue:string[]|null):void {\n const value = (newValue || []).map((d) => this.timezoneService.formattedISODate(d));\n if (value[0] === this.dates.start && value[1] === this.dates.end) {\n return;\n }\n this.value = value;\n this.dates.start = this.value[0];\n this.dates.end = this.value[1];\n }\n\n onChange = (_:string[]):void => {};\n\n onTouched = ():void => {};\n\n registerOnChange(fn:(_:string[]) => void):void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn:() => void):void {\n this.onTouched = fn;\n }\n}\n","\n \n\n \n
    \n
    \n \n \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 { NgModule } from '@angular/core';\nimport { DynamicBootstrapComponent } from './component/dynamic-bootstrap/dynamic-bootstrap.component';\n\n@NgModule({\n declarations: [DynamicBootstrapComponent],\n exports: [DynamicBootstrapComponent],\n})\nexport class DynamicBootstrapModule { }\n","import { Injector, NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpBasicRangeDatePickerComponent } from './basic-range-date-picker/basic-range-date-picker.component';\nimport { OpBasicSingleDatePickerComponent } from './basic-single-date-picker/basic-single-date-picker.component';\n\n@NgModule({\n imports: [\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n ],\n\n providers: [\n I18nService,\n ],\n\n declarations: [\n OpBasicRangeDatePickerComponent,\n OpBasicSingleDatePickerComponent,\n ],\n\n exports: [\n OpBasicRangeDatePickerComponent,\n OpBasicSingleDatePickerComponent,\n ],\n})\nexport class OpBasicDatePickerModule {\n constructor(readonly injector:Injector) {\n }\n}\n","import { NgModule } from '@angular/core';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport {\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { CommonModule } from '@angular/common';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpModalSingleDatePickerComponent } from './modal-single-date-picker/modal-single-date-picker.component';\nimport { OpWpMultiDateFormComponent } from './wp-multi-date-form/wp-multi-date-form.component';\nimport { OpWpSingleDateFormComponent } from './wp-single-date-form/wp-single-date-form.component';\nimport { OpDatePickerBannerComponent } from './banner/datepicker-banner.component';\nimport { OpDatePickerSchedulingToggleComponent } from './scheduling-mode/datepicker-scheduling-toggle.component';\nimport { OpDatePickerWorkingDaysToggleComponent } from './toggle/datepicker-working-days-toggle.component';\nimport { OpBasicDatePickerModule } from './basic-datepicker.module';\nimport { OpSpotModule } from 'core-app/spot/spot.module';\nimport { OpenprojectModalModule } from '../modal/modal.module';\nimport { OpDatePickerSheetComponent } from 'core-app/shared/components/datepicker/sheet/date-picker-sheet.component';\n\n@NgModule({\n imports: [\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n A11yModule,\n OpSpotModule,\n OpBasicDatePickerModule,\n OpenprojectModalModule,\n ],\n\n providers: [\n I18nService,\n ],\n\n declarations: [\n OpDatePickerBannerComponent,\n OpDatePickerSchedulingToggleComponent,\n OpDatePickerWorkingDaysToggleComponent,\n\n OpModalSingleDatePickerComponent,\n OpWpMultiDateFormComponent,\n OpWpSingleDateFormComponent,\n OpDatePickerSheetComponent,\n ],\n\n exports: [\n OpModalSingleDatePickerComponent,\n OpWpMultiDateFormComponent,\n OpWpSingleDateFormComponent,\n OpBasicDatePickerModule,\n OpDatePickerSheetComponent,\n ],\n})\nexport class OpDatePickerModule { }\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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 { FormsModule } from '@angular/forms';\nimport {\n Injector,\n NgModule,\n} from '@angular/core';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { UIRouterGlobals } from '@uirouter/core';\nimport { NgSelectModule } from '@ng-select/ng-select';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { PortalModule } from '@angular/cdk/portal';\nimport { CommonModule } from '@angular/common';\nimport { NgOptionHighlightModule } from '@ng-select/ng-option-highlight';\nimport { DragulaModule } from 'ng2-dragula';\nimport { DynamicModule } from 'ng-dynamic-component';\nimport { UIRouterModule } from '@uirouter/angular';\nimport { OpSpotModule } from 'core-app/spot/spot.module';\nimport { CurrentUserModule } from 'core-app/core/current-user/current-user.module';\nimport { OpenprojectAutocompleterModule } from 'core-app/shared/components/autocompleter/openproject-autocompleter.module';\nimport { IconModule } from 'core-app/shared/components/icon/icon.module';\nimport { AttributeHelpTextModule } from 'core-app/shared/components/attribute-help-texts/attribute-help-text.module';\nimport { IconTriggeredContextMenuComponent } from 'core-app/shared/components/op-context-menu/icon-triggered-context-menu/icon-triggered-context-menu.component';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { SortHeaderDirective } from 'core-app/features/work-packages/components/wp-table/sort-header/sort-header.directive';\nimport { ZenModeButtonComponent } from 'core-app/features/work-packages/components/wp-buttons/zen-mode-toggle-button/zen-mode-toggle-button.component';\nimport { OPContextMenuComponent } from 'core-app/shared/components/op-context-menu/op-context-menu.component';\nimport { OpenprojectPrincipalRenderingModule } from 'core-app/shared/components/principal/principal-rendering.module';\nimport { FocusModule } from 'core-app/shared/directives/focus/focus.module';\nimport { EnterpriseBannerComponent } from 'core-app/shared/components/enterprise-banner/enterprise-banner.component';\nimport { EnterprisePageComponent } from 'core-app/shared/components/enterprise-page/enterprise-page.component';\nimport { FreeTrialButtonComponent } from 'core-app/features/enterprise/free-trial-button/free-trial-button.component';\nimport { HomescreenNewFeaturesBlockComponent } from 'core-app/features/homescreen/blocks/new-features.component';\nimport { TablePaginationComponent } from 'core-app/shared/components/table-pagination/table-pagination.component';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { ViewSelectComponent } from 'core-app/shared/components/op-view-select/op-view-select.component';\nimport { StaticQueriesService } from 'core-app/shared/components/op-view-select/op-static-queries.service';\nimport {\n highlightColSelector,\n OpHighlightColDirective,\n} from './directives/highlight-col/highlight-col.directive';\nimport { CopyToClipboardService } from './components/copy-to-clipboard/copy-to-clipboard.service';\nimport { CopyToClipboardComponent } from './components/copy-to-clipboard/copy-to-clipboard.component';\nimport { OpDateTimeComponent } from './components/date/op-date-time.component';\nimport { ToastComponent } from './components/toaster/toast.component';\n\n// Old datepickers\nimport { OpMultiDatePickerComponent } from 'core-app/shared/components/datepicker/multi-date-picker/multi-date-picker.component';\n\nimport { ToastsContainerComponent } from './components/toaster/toasts-container.component';\nimport { UploadProgressComponent } from './components/toaster/upload-progress.component';\nimport { ResizerComponent } from './components/resizer/resizer.component';\nimport { CollapsibleSectionComponent } from './components/collapsible-section/collapsible-section.component';\nimport { NoResultsComponent } from './components/no-results/no-results.component';\nimport { EditableToolbarTitleComponent } from './components/editable-toolbar-title/editable-toolbar-title.component';\nimport { PersistentToggleComponent } from './components/persistent-toggle/persistent-toggle.component';\nimport { AddSectionDropdownComponent } from './components/hide-section/add-section-dropdown/add-section-dropdown.component';\nimport { HideSectionLinkComponent } from './components/hide-section/hide-section-link/hide-section-link.component';\nimport { RemoteFieldUpdaterComponent } from './components/remote-field-updater/remote-field-updater.component';\nimport { ShowSectionDropdownComponent } from './components/hide-section/show-section-dropdown.component';\nimport { DynamicBootstrapModule } from './components/dynamic-bootstrap/dynamic-bootstrap.module';\nimport { OpOptionListComponent } from './components/option-list/option-list.component';\nimport { OpSidemenuComponent } from './components/sidemenu/sidemenu.component';\nimport { OpProjectIncludeComponent } from './components/project-include/project-include.component';\nimport { OpProjectIncludeListComponent } from './components/project-include/list/project-include-list.component';\nimport { OpLoadingProjectListComponent } from './components/searchable-project-list/loading-project-list.component';\nimport { OpNonWorkingDaysListComponent } from './components/op-non-working-days-list/op-non-working-days-list.component';\nimport { ViewsResourceService } from 'core-app/core/state/views/views.service';\nimport { OpenprojectContentLoaderModule } from 'core-app/shared/components/op-content-loader/openproject-content-loader.module';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport { FullCalendarModule } from '@fullcalendar/angular';\nimport { OpDatePickerModule } from 'core-app/shared/components/datepicker/datepicker.module';\n\nexport function bootstrapModule(injector:Injector):void {\n // Ensure error reporter is run\n const currentProject = injector.get(CurrentProjectService);\n const uiRouterGlobals = injector.get(UIRouterGlobals);\n\n (window.ErrorReporter).addHook(() => ({\n project: currentProject.identifier || 'global',\n 'router state': uiRouterGlobals.current.name || 'unknown',\n }));\n\n const hookService = injector.get(HookService);\n hookService.register('openProjectAngularBootstrap', () => [\n {\n selector: highlightColSelector,\n cls: OpHighlightColDirective,\n },\n ]);\n}\n\n@NgModule({\n imports: [\n // UI router components (NOT routes!)\n UIRouterModule,\n // Angular browser + common module\n CommonModule,\n // Angular Forms\n FormsModule,\n OpSpotModule,\n // Angular CDK\n A11yModule,\n PortalModule,\n DragDropModule,\n DragulaModule,\n CurrentUserModule,\n FormsModule,\n NgSelectModule,\n NgOptionHighlightModule,\n\n DynamicBootstrapModule,\n OpenprojectPrincipalRenderingModule,\n OpenprojectContentLoaderModule,\n OpenprojectAutocompleterModule,\n OpenprojectModalModule,\n\n FocusModule,\n IconModule,\n AttributeHelpTextModule,\n FullCalendarModule,\n OpDatePickerModule,\n ],\n exports: [\n // Re-export all commonly used\n // modules to DRY\n UIRouterModule,\n CommonModule,\n FormsModule,\n PortalModule,\n DragDropModule,\n A11yModule,\n IconModule,\n AttributeHelpTextModule,\n FormsModule,\n NgOptionHighlightModule,\n DynamicBootstrapModule,\n OpenprojectPrincipalRenderingModule,\n OpenprojectAutocompleterModule,\n OpenprojectContentLoaderModule,\n\n OpSpotModule,\n\n OpDatePickerModule,\n\n FocusModule,\n OpDateTimeComponent,\n\n ToastsContainerComponent,\n ToastComponent,\n UploadProgressComponent,\n OpDateTimeComponent,\n\n // Table highlight\n OpHighlightColDirective,\n\n ResizerComponent,\n\n TablePaginationComponent,\n SortHeaderDirective,\n\n ZenModeButtonComponent,\n\n OPContextMenuComponent,\n IconTriggeredContextMenuComponent,\n\n NoResultsComponent,\n\n EditableToolbarTitleComponent,\n\n // Enterprise Edition\n EnterpriseBannerComponent,\n EnterprisePageComponent,\n FreeTrialButtonComponent,\n\n DynamicModule,\n\n OpOptionListComponent,\n OpSidemenuComponent,\n OpProjectIncludeComponent,\n OpProjectIncludeListComponent,\n OpLoadingProjectListComponent,\n\n ViewSelectComponent,\n\n // Old datepickers\n OpMultiDatePickerComponent,\n\n OpNonWorkingDaysListComponent,\n ],\n providers: [\n CopyToClipboardService,\n StaticQueriesService,\n ViewsResourceService,\n ],\n declarations: [\n ViewSelectComponent,\n\n ToastsContainerComponent,\n ToastComponent,\n UploadProgressComponent,\n OpDateTimeComponent,\n\n OPContextMenuComponent,\n IconTriggeredContextMenuComponent,\n\n // Table highlight\n OpHighlightColDirective,\n\n // Add functionality to rails rendered templates\n CopyToClipboardComponent,\n CollapsibleSectionComponent,\n\n ResizerComponent,\n\n TablePaginationComponent,\n SortHeaderDirective,\n\n // Zen mode button\n ZenModeButtonComponent,\n\n NoResultsComponent,\n\n EditableToolbarTitleComponent,\n\n PersistentToggleComponent,\n HideSectionLinkComponent,\n ShowSectionDropdownComponent,\n AddSectionDropdownComponent,\n RemoteFieldUpdaterComponent,\n\n // Enterprise Edition\n EnterpriseBannerComponent,\n EnterprisePageComponent,\n FreeTrialButtonComponent,\n\n HomescreenNewFeaturesBlockComponent,\n\n OpOptionListComponent,\n OpSidemenuComponent,\n OpProjectIncludeComponent,\n OpProjectIncludeListComponent,\n OpLoadingProjectListComponent,\n\n OpNonWorkingDaysListComponent,\n\n // Old datepickers\n OpMultiDatePickerComponent,\n ],\n})\nexport class OpSharedModule {\n constructor(injector:Injector) {\n bootstrapModule(injector);\n }\n}\n","\n \n \n \n \n \n \n\n \n \n\n 4\"\n class=\"spot-breadcrumbs--crumb spot-breadcrumbs--crumb_collapsed\"\n >\n \n \n\n \n \n \n \n
    \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n} from '@angular/core';\n\nimport { BreadcrumbsContent } from 'core-app/spot/components/breadcrumbs/breadcrumbs-content';\n\n@Component({\n selector: 'spot-breadcrumbs',\n templateUrl: './breadcrumbs.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpotBreadcrumbsComponent {\n @HostBinding('class.spot-breadcrumbs') className = true;\n\n @Input() content:BreadcrumbsContent;\n}\n","import {\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n Input,\n Output,\n ViewChild,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nexport type SpotCheckboxState = true|false|null;\n\n@Component({\n selector: 'spot-checkbox',\n templateUrl: './checkbox.component.html',\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SpotCheckboxComponent),\n multi: true,\n }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpotCheckboxComponent implements ControlValueAccessor {\n @HostBinding('class.spot-checkbox') public className = true;\n\n @ViewChild('input') public input:ElementRef;\n\n /**\n * The tabindex for the underlying HTML input\n */\n @Input() tabindex = 0;\n\n /**\n * Whether the input should be disabled\n */\n @Input() disabled = false;\n\n /**\n * The name of the input. Will be autogenerated if not given,\n * but especially useful to provide in a hybrid Rails <-> Angular context\n * where a submit of a form is handled without JS.\n */\n @Input() name = `spot-checkbox-${+(new Date())}`;\n\n /**\n * If you're not using Angular Reactive Forms (Which you should be using!)\n * then you can manually set the checked state via this input.\n */\n @Input() public checked = false;\n\n /**\n * Emits when the checked state changes.\n */\n @Output() checkedChange = new EventEmitter();\n\n constructor(\n readonly cdRef:ChangeDetectorRef,\n ) {}\n\n onStateChange():void {\n const value = (this.input.nativeElement as HTMLInputElement).checked;\n this.checkedChange.emit(value);\n this.onChange(value);\n this.onTouched(value);\n }\n\n writeValue(value:SpotCheckboxState):void {\n // This is set in a timeout because the initial value is set before the template is ready,\n // which causes the input nativeElement to not be available yet.\n setTimeout(() => {\n const input = this.input.nativeElement as HTMLInputElement;\n input.indeterminate = value === null;\n\n this.checked = !!value;\n this.cdRef.detectChanges();\n });\n }\n\n onChange = (_:SpotCheckboxState):void => {};\n\n onTouched = (_:SpotCheckboxState):void => {};\n\n registerOnChange(fn:(_:SpotCheckboxState) => void):void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn:(_:SpotCheckboxState) => void):void {\n this.onTouched = fn;\n }\n}\n","\n\n","import {\n OnInit,\n AfterViewChecked,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n ChangeDetectorRef,\n} from '@angular/core';\nimport {\n SpotDropModalTeleportationService,\n TeleportInstance,\n} from './drop-modal-teleportation.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\nexport const spotDropModalPortalComponentSelector = 'spot-drop-modal-portal';\n\n@Component({\n selector: spotDropModalPortalComponentSelector,\n template: '',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpotDropModalPortalComponent extends UntilDestroyedMixin implements OnInit, AfterViewChecked {\n @HostBinding('class.spot-drop-modal-portal') className = true;\n\n template:TeleportInstance|null = null;\n\n constructor(\n readonly cdRef:ChangeDetectorRef,\n readonly template$:SpotDropModalTeleportationService,\n readonly elementRef:ElementRef,\n ) {\n super();\n }\n\n ngOnInit() {\n this\n .template$\n .templateRef$\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((templ) => {\n this.template = templ;\n this.cdRef.detectChanges();\n });\n }\n\n ngAfterViewChecked():void {\n this.template$.hasRendered$.next(!!this.elementRef.nativeElement.children.length);\n }\n}\n","import {\n Injectable,\n TemplateRef,\n} from '@angular/core';\nimport {\n BehaviorSubject,\n Subject,\n} from 'rxjs';\nimport { distinctUntilChanged, filter, take } from 'rxjs/operators';\n\nexport type TeleportInstance = TemplateRef;\n\n@Injectable({ providedIn: 'root' })\nexport class SpotDropModalTeleportationService {\n\n public templateRef$ = new BehaviorSubject(null);\n\n public hasRendered$ = new Subject();\n\n public hasRenderedFiltered$ = this.hasRendered$.pipe(distinctUntilChanged());\n\n public afterRenderOnce$(appearOrDissapear:boolean = true) {\n return this.hasRenderedFiltered$\n .pipe(\n filter(f => f === appearOrDissapear),\n take(1),\n );\n }\n\n public activate(instance: TeleportInstance) {\n this.templateRef$.next(instance);\n }\n\n public clear() { \n this.templateRef$.next(null);\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 EventEmitter,\n HostBinding,\n Input,\n OnDestroy,\n Output,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { KeyCodes } from 'core-app/shared/helpers/keyCodes.enum';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { findAllFocusableElementsWithin } from 'core-app/shared/helpers/focus-helpers';\nimport { SpotDropModalTeleportationService } from './drop-modal-teleportation.service';\nimport { filter, take } from 'rxjs/operators';\nimport { debounce } from 'lodash';\nimport {\n autoUpdate,\n computePosition,\n flip,\n limitShift,\n Placement,\n shift,\n} from '@floating-ui/dom';\n\n@Component({\n selector: 'spot-drop-modal',\n templateUrl: './drop-modal.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpotDropModalComponent implements OnDestroy {\n @HostBinding('class.spot-drop-modal') public className = true;\n\n /**\n * Whether to allow automatic changing the alignment based on the available space.\n */\n @Input() public allowRepositioning = true;\n\n /**\n * The default alignment of the drop modal. There are twelve alignments in total. You can check which ones they are\n * from the `SpotDropAlignmentOption` Enum that is available in 'core-app/spot/drop-alignment-options'.\n */\n @Input() public alignment:Placement = 'bottom-start';\n\n public _opened = false;\n\n /**\n * Boolean indicating whether the modal should be opened\n */\n /* eslint-disable-next-line @angular-eslint/no-input-rename */\n @Input('opened')\n @HostBinding('class.spot-drop-modal_opened')\n set opened(value:boolean) {\n if (this._opened === value) {\n return;\n }\n\n if (value) {\n this.open();\n } else {\n this.close();\n }\n }\n\n get opened():boolean {\n return this._opened;\n }\n\n /**\n * Emits when the drop modal closes. This is needed because you are usually controlling the opened\n * state of the modal manually because you have to define the trigger that opens the modal, but can\n * will close itself automatically if the user interacts outside of it or presses Escape.\n *\n * ```\n * \n * Open drop modal\n * \n * ```\n */\n @Output() closed = new EventEmitter();\n\n public id = `drop-modal-${Math.round(Math.random() * 10000)}`;\n\n public text = {\n close: this.i18n.t('js.spot.drop_modal.close'),\n focus_grab: this.i18n.t('js.spot.drop_modal.focus_grab'),\n };\n\n private cleanupFloatingUI:() => void|undefined;\n\n @ViewChild('anchor') anchor:ElementRef;\n\n @ViewChild('body') body:TemplateRef;\n\n @ViewChild('focusGrabber') focusGrabber:ElementRef;\n\n constructor(\n readonly i18n:I18nService,\n readonly elementRef:ElementRef,\n readonly cdRef:ChangeDetectorRef,\n private teleportationService:SpotDropModalTeleportationService,\n ) {}\n\n open() {\n this._opened = true;\n this.updateAppHeight();\n this.cdRef.detectChanges();\n\n /*\n * If we don't activate the body after one tick, angular will complain because\n * it already rendered a `null` template, but then gets an update to that\n * template in the same tick.\n * To make it happy, we update afterwards\n */\n this.teleportationService.activate(this.body);\n\n this.teleportationService\n .hasRenderedFiltered$\n .pipe(\n filter((hasRendered) => !!hasRendered),\n take(1),\n )\n .subscribe(() => {\n const referenceEl = this.elementRef.nativeElement as HTMLElement;\n const floatingEl = this.anchor.nativeElement as HTMLElement;\n this.cleanupFloatingUI = autoUpdate(\n referenceEl,\n floatingEl,\n /* eslint-disable-next-line @typescript-eslint/no-misused-promises */\n async () => {\n const { x, y } = await computePosition(\n referenceEl,\n floatingEl,\n {\n placement: this.alignment,\n middleware: this.allowRepositioning ? [\n flip({\n mainAxis: true,\n crossAxis: true,\n fallbackAxisSideDirection: 'start',\n }),\n shift({ limiter: limitShift() }),\n ] : [],\n },\n );\n\n Object.assign(floatingEl.style, {\n left: `${x}px`,\n top: `${y}px`,\n });\n },\n );\n /*\n * We have to set these listeners next tick, because they're so far up the tree.\n * If the open value was set because of a click listener in the trigger slot,\n * that event would reach the event listener added here and close the modal right away.\n */\n setTimeout(() => {\n document.body.addEventListener('click', this.onGlobalClick);\n document.body.addEventListener('keydown', this.onEscape);\n window.addEventListener('resize', this.onResize);\n window.addEventListener('orientationchange', this.onResize);\n\n const focusCatcherContainer = document.querySelectorAll(\"[data-modal-focus-catcher-container='true']\")[0];\n if (focusCatcherContainer) {\n (findAllFocusableElementsWithin(focusCatcherContainer as HTMLElement)[0])?.focus();\n } else {\n // Index 1 because the element at index 0 is the trigger button to open the modal\n (findAllFocusableElementsWithin(document.querySelector('.spot-drop-modal-portal')!)[1])?.focus();\n }\n });\n });\n }\n\n close():void {\n this._opened = false;\n this.closed.emit();\n\n /*\n * The same as with opening; if we don't deactivate the body after\n * one tick, angular will complain because it already rendered the\n * template, but then gets an update to render `null` in the same tick.\n *\n * To make it happy, we update afterwards\n */\n document.body.removeEventListener('click', this.onGlobalClick);\n document.body.removeEventListener('keydown', this.onEscape);\n window.removeEventListener('resize', this.onResize);\n window.removeEventListener('orientationchange', this.onResize);\n\n this.teleportationService.clear();\n this.cdRef.detectChanges();\n (this.focusGrabber.nativeElement as HTMLElement).focus();\n }\n\n private onGlobalClick = this.close.bind(this) as () => void;\n\n ngOnDestroy():void {\n this.teleportationService.clear();\n document.body.removeEventListener('click', this.onGlobalClick);\n document.body.removeEventListener('keydown', this.onEscape);\n window.removeEventListener('resize', this.onResize);\n window.removeEventListener('orientationchange', this.onResize);\n this.cleanupFloatingUI?.();\n }\n\n onBodyClick(e:MouseEvent):void {\n // We stop propagation here so that clicks inside the body do not\n // close the modal when the event reaches the document body\n e.stopPropagation();\n }\n\n private escapeCallback = (evt:KeyboardEvent) => {\n if (evt.keyCode === KeyCodes.ESCAPE) {\n this.close();\n }\n };\n\n private onEscape = debounce(this.escapeCallback.bind(this), 10);\n\n private resizeCallback():void {\n this.updateAppHeight();\n }\n\n private onResize = debounce(this.resizeCallback.bind(this), 10);\n\n private updateAppHeight = () => {\n const doc = document.documentElement;\n doc.style.setProperty('--app-height', `${window.innerHeight}px`);\n };\n}\n","import { Directive, forwardRef, Input } from '@angular/core';\nimport {\n UntypedFormArray, UntypedFormControl, UntypedFormGroup, NgControl,\n} from '@angular/forms';\n\nexport const formControlBinding = {\n provide: NgControl,\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n useExisting: forwardRef(() => SpotFormBindingDirective),\n};\n\n@Directive({\n selector: '[spotFormBinding]',\n providers: [formControlBinding],\n exportAs: 'ngForm',\n})\nexport class SpotFormBindingDirective extends NgControl {\n @Input('spotFormBinding') form!:UntypedFormControl|UntypedFormGroup|UntypedFormArray;\n\n get control():UntypedFormControl|UntypedFormGroup|UntypedFormArray {\n return this.form;\n }\n\n viewToModelUpdate():void {}\n}\n","\n \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 Component, ContentChild, HostBinding, Input, Optional,\n} from '@angular/core';\nimport { AbstractControl, FormGroupDirective, NgControl } from '@angular/forms';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n/* eslint-disable-next-line change-detection-strategy/on-push */\n@Component({\n selector: 'spot-form-field',\n templateUrl: './form-field.component.html',\n})\nexport class SpotFormFieldComponent {\n @HostBinding('class.spot-form-field') className = true;\n\n @HostBinding('class.spot-form-field_invalid') get errorClassName():boolean {\n return this.showErrorMessage;\n }\n\n /**\n * The text label of the input\n */\n @Input() label = '';\n\n /**\n * By default, the label wraps the input. For some input types this\n * leads to unwanted behavior because clicking in the input might focus\n * unrelated elements.\n *\n * One example of an input like is the CKEditor rich text editor.\n *\n * Setting noWrapLabel to `true` causes the label not to wrap the input.\n * This might slightly reduce the label functionality (e.g. clicking the label\n * does not focus the input) but is still preferred over more broken behavior.\n */\n @Input() noWrapLabel = false;\n\n /**\n * Whether this input is required\n */\n @Input() required = false;\n\n /**\n * When to show validation errors. To remain consistent, you will almost never need to change this.\n * However, for some inputs or usecases it might be useful to show the validation error anyway.\n */\n @Input() showValidationErrorOn:'change' | 'blur' | 'submit' | 'never' = 'submit';\n\n /**\n * The control of the input. This can be any interface that is compatible with `AbstractControl`,\n * but will almost always be a `FormControl`.\n *\n * The control is used to show disabled and invalid states.\n */\n @Input() control?:AbstractControl;\n\n /**\n * Hides the input. This is a utility input for usage of `spot-form-field` in dynamic forms.\n * Outside of dynamic forms, you should be hiding inputs via `*ngIf` or other methods.\n */\n @Input() hidden = false;\n\n @ContentChild(NgControl) ngControl:NgControl;\n\n internalID = `spot-form-field-${+new Date()}`;\n\n text = {\n invalid: this.I18n.t('js.label_invalid'),\n };\n\n get errorsID():string {\n return `${this.internalID}-errors`;\n }\n\n get descriptionID():string {\n return `${this.internalID}-description`;\n }\n\n get describedByID():string {\n return this.showErrorMessage ? this.errorsID : this.descriptionID;\n }\n\n get formControl():AbstractControl|undefined|null {\n return this.ngControl?.control || this.control;\n }\n\n get showErrorMessage():boolean {\n if (!this.formControl) {\n return false;\n }\n\n if (this.showValidationErrorOn === 'submit') {\n return this.formControl.invalid && this._formGroupDirective?.submitted;\n } if (this.showValidationErrorOn === 'blur') {\n return this.formControl.invalid && this.formControl.touched;\n } if (this.showValidationErrorOn === 'change') {\n return this.formControl.invalid && this.formControl.dirty;\n }\n\n return false;\n }\n\n constructor(\n @Optional() private _formGroupDirective:FormGroupDirective,\n readonly I18n:I18nService,\n ) {}\n}\n","\n \n \n \n \n\n \n Invalid\n {{ label }}\n *\n \n \n \n\n \n \n \n\n \n \n \n\n","import {\n Component,\n ContentChild,\n HostBinding,\n Input,\n Optional,\n} from '@angular/core';\nimport {\n AbstractControl,\n FormGroupDirective,\n NgControl,\n} from '@angular/forms';\n\n@Component({\n selector: 'spot-selector-field',\n templateUrl: './selector-field.component.html',\n})\nexport class SpotSelectorFieldComponent {\n @HostBinding('class.spot-form-field') className = true;\n\n @HostBinding('class.spot-selector-field') classNameCheckbox = true;\n\n @HostBinding('class.spot-form-field_invalid') get errorClassName():boolean {\n return this.showErrorMessage;\n }\n\n /**\n * The text label of the input\n */\n @Input() label = '';\n\n /**\n * Whether the label should be in front of the input instead of after it\n */\n @Input() reverseLabel = false;\n\n /**\n * Whether the label should be in bold or regular font weight\n */\n @Input() labelWeight:'bold'|'regular' = 'bold';\n\n /**\n * Whether this input is required\n */\n @Input() required = false;\n\n /**\n * When to show validation errors. To remain consistent, you will almost never need to change this.\n * However, for some inputs or usecases it might be useful to show the validation error anyway.\n */\n @Input() showValidationErrorOn:'change'|'blur'|'submit'|'never' = 'submit';\n\n /**\n * The control of the input. This can be any interface that is compatible with `AbstractControl`,\n * but will almost always be a `FormControl`.\n *\n * The control is used to show disabled and invalid states.\n */\n @Input() control?:AbstractControl;\n\n /**\n * Hides the input. This is a utility input for usage of `spot-form-field` in dynamic forms.\n * Outside of dynamic forms, you should be hiding inputs via `*ngIf` or other methods.\n */\n @Input() hidden = false;\n\n @ContentChild(NgControl) ngControl:NgControl;\n\n internalID = `spot-selector-field-${+new Date()}`;\n\n get errorsID():string {\n return `${this.internalID}-errors`;\n }\n\n get descriptionID():string {\n return `${this.internalID}-description`;\n }\n\n get describedByID():string {\n return this.showErrorMessage ? this.errorsID : this.descriptionID;\n }\n\n get formControl():AbstractControl|undefined|null {\n return this.ngControl?.control || this.control;\n }\n\n get showErrorMessage():boolean {\n if (!this.formControl) {\n return false;\n }\n\n if (this.showValidationErrorOn === 'submit') {\n return this.formControl.invalid && this.formGroupDirective?.submitted;\n }\n if (this.showValidationErrorOn === 'blur') {\n return this.formControl.invalid && this.formControl.touched;\n }\n if (this.showValidationErrorOn === 'change') {\n return this.formControl.invalid && this.formControl.dirty;\n }\n\n return false;\n }\n\n constructor(\n @Optional() private formGroupDirective:FormGroupDirective,\n ) {}\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n Input,\n Output,\n ViewChild,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\n\nexport type SpotSwitchState = boolean;\n\nexport const spotSwitchSelector = 'spot-switch';\n\n@Component({\n selector: spotSwitchSelector,\n templateUrl: './switch.component.html',\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SpotSwitchComponent),\n multi: true,\n }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpotSwitchComponent implements ControlValueAccessor {\n @HostBinding('class.spot-switch') public className = true;\n\n @ViewChild('input') public input:ElementRef;\n\n /**\n * The tabindex for the underlying HTML input\n */\n @Input() tabindex = 0;\n\n /**\n * Whether the input should be disabled\n */\n @Input() disabled = false;\n\n /**\n * The name of the input. Will be autogenerated if not given,\n * but especially useful to provide in a hybrid Rails <-> Angular context\n * where a submit of a form is handled without JS.\n */\n @Input() name = `spot-switch-${+(new Date())}`;\n\n /**\n * If you're not using Angular Reactive Forms (Which you should be using!)\n * then you can manually set the checked state via this input.\n */\n @Input() public checked = false;\n\n /**\n * Emits when the checked state changes.\n */\n @Output() checkedChange = new EventEmitter();\n\n constructor(\n public elementRef:ElementRef,\n public cdRef:ChangeDetectorRef,\n ) {\n populateInputsFromDataset(this);\n }\n\n onStateChange():void {\n const value = (this.input.nativeElement as HTMLInputElement).checked;\n this.checkedChange.emit(value);\n this.onChange(value);\n this.onTouched(value);\n }\n\n writeValue(value:SpotSwitchState):void {\n this.checked = !!value;\n this.cdRef.markForCheck();\n }\n\n onToggle(value:SpotSwitchState):void {\n this.writeValue(value);\n this.onChange(value);\n this.onTouched(value);\n }\n\n onChange = (_:SpotSwitchState):void => {};\n\n onTouched = (_:SpotSwitchState):void => {};\n\n registerOnChange(fn:(_:SpotSwitchState) => void):void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn:(_:SpotSwitchState) => void):void {\n this.onTouched = fn;\n }\n}\n","\n\n","\n\n\n \n\n\n","import {\n Component,\n ElementRef,\n ViewChild,\n forwardRef,\n HostBinding,\n HostListener,\n Input,\n Output,\n EventEmitter,\n ChangeDetectorRef,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\n@Component({\n selector: 'spot-text-field',\n templateUrl: './text-field.component.html',\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SpotTextFieldComponent),\n multi: true,\n }],\n})\nexport class SpotTextFieldComponent implements ControlValueAccessor {\n @HostBinding('class.spot-text-field') public className = true;\n\n @HostBinding('class.spot-text-field_focused') public focused = false;\n\n @HostListener('click')\n public onParentClick():void {\n this.input.nativeElement.focus();\n }\n\n @ViewChild('input') public input:ElementRef;\n\n /**\n * The name of the input. Will be autogenerated if not given,\n * but especially useful to provide in a hybrid Rails <-> Angular context\n * where a submit of a form is handled without JS.\n */\n @Input() public name = `spot-text-field-${+(new Date())}`;\n\n /**\n * Whether the input should be disabled\n */\n @Input() @HostBinding('class.spot-text-field_disabled') public disabled = false;\n\n /**\n * By default, we show a small \"x\" inside the input on the right hand side if\n * some value has been set. This is a button that clears the input. Setting this option\n * to false will not show this clear button.\n */\n @Input() public showClearButton = true;\n\n /**\n * The placeholder text.\n * This should never be a label replacement, since placeholders are not properly accessible.\n */\n @Input() public placeholder = '';\n\n /**\n * If you're not using Angular Reactive Forms (Which you should be using!)\n * then you can manually set the value via this input.\n */\n @Input() public value = '';\n\n /**\n * Whether the field should be receive a [required] property.\n */\n @Input() public required:boolean = false;\n\n /**\n * The html input (Regexp) pattern to provide hints to keyboards what layout to use\n * and to aid in validation.\n */\n @Input() public pattern:string|undefined;\n\n /**\n * The html inputmode to hint virtual keyboard layouts.\n */\n @Input() public inputmode:'text'|'decimal'|'numeric'|'tel'|'search'|'email'|'url' = 'text';\n\n valueChanged(value:string):void {\n this.writeValue(value);\n this.onChange(value);\n this.onTouched(value);\n }\n\n @Output() public inputFocus = new EventEmitter();\n\n @Output() public inputBlur = new EventEmitter();\n\n constructor(\n private cdRef:ChangeDetectorRef,\n ) {}\n\n onInputFocus(event:FocusEvent):void {\n this.focused = true;\n this.inputFocus.next(event);\n }\n\n onInputBlur(event:FocusEvent):void {\n this.focused = false;\n this.inputBlur.next(event);\n }\n\n writeValue(value:string) {\n this.value = value || '';\n this.cdRef.markForCheck();\n }\n\n onChange = (_:string):void => {};\n\n onTouched = (_:string):void => {};\n\n registerOnChange(fn:(_:string) => void):void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn:(_:string) => void):void {\n this.onTouched = fn;\n }\n}\n","\n \n {{ option.title }}\n\n","import {\n ChangeDetectorRef,\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n forwardRef,\n HostBinding,\n Input,\n Output,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport interface SpotToggleOption {\n value:T;\n title:string;\n};\n\n@Component({\n selector: 'spot-toggle',\n templateUrl: './toggle.component.html',\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SpotToggleComponent),\n multi: true,\n }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpotToggleComponent implements ControlValueAccessor {\n // TODO: These old styles will need to be replaced\n @HostBinding('class.form--field-inline-buttons-container') public classNameOld = true;\n\n @HostBinding('class.spot-toggle') public className = true;\n\n /**\n * The array of options that should be shown. Options have a simple structure:\n *\n * ```\n * {\n * title:string;\n * value:T;\n * }\n * ```\n *\n * `title` will be shown in the toggle for the user to read, while `value` will be the\n * value that is set as the ngModel if the option is selected.\n */\n @Input() options:SpotToggleOption[] = [];\n\n /**\n * Whether the input should be disabled\n */\n @Input() disabled = false;\n\n /**\n * The name of the input. Will be autogenerated if not given,\n * but especially useful to provide in a hybrid Rails <-> Angular context\n * where a submit of a form is handled without JS.\n */\n @Input() name = `spot-toggle-${+(new Date())}`;\n\n /**\n * If you're not using Angular Reactive Forms (Which you should be using!)\n * then you can manually set the value via this input.\n */\n @Input() public value:T;\n\n /**\n * Emits when the selected value changes.\n */\n @Output() valueChange = new EventEmitter();\n\n constructor(\n private cdRef:ChangeDetectorRef,\n ) {}\n\n writeValue(value:T):void {\n this.value = value;\n this.cdRef.markForCheck();\n }\n\n onToggle(value:T):void {\n this.writeValue(value);\n this.onChange(value);\n this.onTouched(value);\n }\n\n onChange = (_:T):void => {};\n\n onTouched: (t:T) => void = (_:T):void => {};\n\n registerOnChange(fn:(_:T) => void):void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn:(_:T) => void):void {\n this.onTouched = fn;\n }\n}\n","\n\n \n\n","import {\n Component,\n HostBinding,\n Input,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport SpotDropAlignmentOption from '../../drop-alignment-options';\n\n@Component({\n selector: 'spot-tooltip',\n templateUrl: './tooltip.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpotTooltipComponent {\n @HostBinding('class.spot-tooltip') public className = true;\n\n /**\n * Show a dark-gray version of the tooltip\n */\n @Input() @HostBinding('class.spot-tooltip_dark') public dark = false;\n\n /**\n * Whether the tooltip should be disabled.\n * In that case, hovering the trigger element will not do anything.\n */\n @Input() public disabled = false;\n\n /**\n * The alignment of the tooltip. There are twelve alignments in total. You can check which ones they are\n * from the `SpotDropAlignmentOption` Enum that is available in 'core-app/spot/drop-alignment-options'.\n */\n @Input() public alignment:SpotDropAlignmentOption = SpotDropAlignmentOption.BottomCenter;\n\n get alignmentClass():string {\n return `spot-tooltip--body_${this.alignment}`;\n }\n}\n","enum SpotDropAlignmentOption {\n TopLeft = 'top-left',\n TopCenter = 'top-center',\n TopRight = 'top-right',\n\n RightTop = 'right-top',\n RightCenter = 'right-center',\n RightBottom = 'right-bottom',\n\n BottomLeft = 'bottom-left',\n BottomCenter = 'bottom-center',\n BottomRight = 'bottom-right',\n\n LeftTop = 'left-top',\n LeftCenter = 'left-center',\n LeftBottom = 'left-bottom',\n}\n\nexport default SpotDropAlignmentOption;\n","\n \n\n
    \n \n {{ title }}\n
    \n","import {\n Component,\n EventEmitter,\n HostBinding,\n Input,\n Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n@Component({\n selector: 'spot-filter-chip',\n templateUrl: './filter-chip.component.html',\n})\nexport class SpotFilterChipComponent {\n @HostBinding('class.spot-filter-chip') public className = true;\n\n @Input() @HostBinding('class.spot-filter-chip_disabled') public disabled = false;\n\n @Input() removable = true;\n\n @Input() title = '';\n\n @Input() icon = '';\n\n @Output() remove = new EventEmitter();\n\n public text = {\n remove: this.i18n.t('js.spot.filter_chip.remove'),\n };\n\n public get iconClasses():string[] {\n return [\n 'spot-icon',\n `spot-icon_${this.icon}`,\n ];\n }\n\n constructor(readonly i18n:I18nService) {}\n}\n","import { NgModule } from '@angular/core';\nimport {\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { A11yModule } from '@angular/cdk/a11y';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { SpotCheckboxComponent } from './components/checkbox/checkbox.component';\nimport { SpotSwitchComponent } from './components/switch/switch.component';\nimport { SpotToggleComponent } from './components/toggle/toggle.component';\nimport { SpotTextFieldComponent } from './components/text-field/text-field.component';\nimport { SpotFilterChipComponent } from './components/filter-chip/filter-chip.component';\nimport { SpotDropModalComponent } from './components/drop-modal/drop-modal.component';\nimport { SpotTooltipComponent } from './components/tooltip/tooltip.component';\nimport { SpotFormFieldComponent } from './components/form-field/form-field.component';\nimport { SpotFormBindingDirective } from './components/form-field/form-binding.directive';\nimport { SpotBreadcrumbsComponent } from './components/breadcrumbs/breadcrumbs.component';\nimport { SpotSelectorFieldComponent } from './components/selector-field/selector-field.component';\nimport { SpotDropModalPortalComponent } from './components/drop-modal/drop-modal-portal.component';\n\n@NgModule({\n imports: [\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n A11yModule,\n ],\n\n providers: [\n I18nService,\n ],\n\n declarations: [\n SpotBreadcrumbsComponent,\n SpotCheckboxComponent,\n SpotSwitchComponent,\n SpotToggleComponent,\n SpotTextFieldComponent,\n SpotFilterChipComponent,\n SpotDropModalComponent,\n SpotDropModalPortalComponent,\n SpotDropModalPortalComponent,\n SpotFormFieldComponent,\n SpotFormBindingDirective,\n SpotTooltipComponent,\n SpotSelectorFieldComponent,\n ],\n\n exports: [\n SpotBreadcrumbsComponent,\n SpotCheckboxComponent,\n SpotSwitchComponent,\n SpotToggleComponent,\n SpotTextFieldComponent,\n SpotFilterChipComponent,\n SpotDropModalComponent,\n SpotDropModalPortalComponent,\n SpotDropModalPortalComponent,\n SpotFormFieldComponent,\n SpotFormBindingDirective,\n SpotTooltipComponent,\n SpotSelectorFieldComponent,\n ],\n})\nexport class OpSpotModule { }\n","export const environment = {\n production: true,\n};\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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 { Directive, ElementRef, OnInit } from '@angular/core';\n\n@Directive({\n selector: 'op-drag-scroll',\n})\nexport class OpDragScrollDirective implements OnInit {\n constructor(readonly elementRef:ElementRef) {\n }\n\n ngOnInit() {\n const element = jQuery(this.elementRef.nativeElement);\n const eventName = 'op:dragscroll';\n\n // Is mouse down?\n let mousedown = false;\n\n // Position of last mousedown\n let mousedownX:number; let\n mousedownY:number;\n\n // Mousedown: Potential drag start\n element.on('mousedown', (evt) => {\n setTimeout(() => {\n mousedown = true;\n mousedownX = evt.clientX;\n mousedownY = evt.clientY;\n }, 50, false);\n });\n\n // Mouseup: Potential drag stop\n element.on('mouseup', () => {\n mousedown = false;\n });\n\n // Mousemove: Report movement if mousedown\n element.on('mousemove', (evt) => {\n if (!mousedown) {\n return;\n }\n\n // Trigger drag scroll event\n element.trigger(eventName, {\n x: evt.clientX - mousedownX,\n y: evt.clientY - mousedownY,\n });\n\n // Update last mouse position\n mousedownX = evt.clientX;\n mousedownY = evt.clientY;\n });\n }\n}\n","export class GridArea {\n private storedGuid:string;\n\n public startRow:number;\n\n public endRow:number;\n\n public startColumn:number;\n\n public endColumn:number;\n\n constructor(startRow:number, endRow:number, startColumn:number, endColumn:number) {\n this.startRow = startRow;\n this.endRow = endRow;\n this.startColumn = startColumn;\n this.endColumn = endColumn;\n }\n\n public get gridStartRow() {\n return this.startRow * 2;\n }\n\n public get gridEndRow() {\n return this.endRow * 2 - 1;\n }\n\n public get gridStartColumn() {\n return this.startColumn * 2;\n }\n\n public get gridEndColumn() {\n return this.endColumn * 2 - 1;\n }\n\n public get guid():string {\n if (!this.storedGuid) {\n this.storedGuid = this.newGuid();\n }\n\n return this.storedGuid;\n }\n\n private newGuid() {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n }\n return `${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`;\n }\n}\n","import { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\nimport { GridArea } from 'core-app/shared/components/grids/areas/grid-area';\n\nexport class GridWidgetArea extends GridArea {\n public widget:GridWidgetResource;\n\n constructor(widget:GridWidgetResource) {\n super(widget.startRow,\n widget.endRow,\n widget.startColumn,\n widget.endColumn);\n\n this.widget = widget;\n }\n\n public reset() {\n this.startRow = this.widget.startRow;\n this.endRow = this.widget.endRow;\n this.startColumn = this.widget.startColumn;\n this.endColumn = this.widget.endColumn;\n }\n\n public moveRight() {\n this.startColumn++;\n this.endColumn++;\n }\n\n public moveLeft() {\n this.startColumn--;\n this.endColumn--;\n }\n\n public growColumn() {\n this.endColumn++;\n }\n\n public overlaps(otherArea:GridWidgetArea) {\n return this.rowOverlaps(otherArea)\n && this.columnOverlaps(otherArea);\n }\n\n public rowOverlaps(otherArea:GridWidgetArea) {\n return this.startRow < otherArea.endRow\n && this.endRow >= otherArea.endRow\n || this.startRow <= otherArea.startRow\n && this.endRow > otherArea.startRow\n || this.startRow > otherArea.startRow\n && this.endRow < otherArea.endRow;\n }\n\n public columnOverlaps(otherArea:GridWidgetArea) {\n return this.startColumn < otherArea.endColumn\n && this.endColumn >= otherArea.endColumn\n || this.startColumn <= otherArea.startColumn\n && this.endColumn > otherArea.startColumn\n || this.startColumn > otherArea.startColumn\n && this.endColumn < otherArea.endColumn;\n }\n\n public startColumnOverlaps(otherArea:GridWidgetArea) {\n return this.startColumn < otherArea.startColumn\n && this.endColumn > otherArea.startColumn\n && this.rowOverlaps(otherArea);\n }\n\n public get unchangedSize() {\n return this.startColumn === this.widget.startColumn\n && this.endColumn === this.widget.endColumn\n && this.startRow === this.widget.startRow\n && this.endRow === this.widget.endRow;\n }\n\n public writeAreaChangeToWidget() {\n this.widget.startRow = this.startRow;\n this.widget.endRow = this.endRow;\n this.widget.startColumn = this.startColumn;\n this.widget.endColumn = this.endColumn;\n }\n\n public copyDimensionsTo(sink:GridWidgetArea) {\n sink.startRow = this.startRow;\n sink.startColumn = this.startColumn;\n sink.endRow = this.endRow;\n sink.endColumn = this.endColumn;\n }\n}\n","import { GridArea } from 'core-app/shared/components/grids/areas/grid-area';\n\nexport class GridGap extends GridArea {\n private type:'row'|'column';\n\n constructor(startRow:number, endRow:number, startColumn:number, endColumn:number, type:'row'|'column') {\n super(startRow, endRow, startColumn, endColumn);\n\n this.type = type;\n }\n\n public get gridStartRow() {\n if (this.isRow) {\n return this.startRow * 2 - 1;\n }\n return this.startRow * 2;\n }\n\n public get gridEndRow() {\n if (this.isRow) {\n return this.endRow * 2 - 2;\n }\n return this.endRow * 2 - 1;\n }\n\n public get gridStartColumn() {\n if (this.isRow) {\n return this.startColumn * 2;\n }\n return this.startColumn * 2 - 1;\n }\n\n public get gridEndColumn() {\n if (this.isRow) {\n return this.endColumn * 2 - 1;\n }\n return this.endColumn * 2 - 2;\n }\n\n public get isRow() {\n return this.type === 'row';\n }\n\n public get isColumn() {\n return this.type === 'column';\n }\n}\n","import { Injectable } from '@angular/core';\nimport { GridWidgetArea } from 'core-app/shared/components/grids/areas/grid-widget-area';\nimport { GridArea } from 'core-app/shared/components/grids/areas/grid-area';\nimport { GridGap } from 'core-app/shared/components/grids/areas/grid-gap';\nimport { GridResource } from 'core-app/features/hal/resources/grid-resource';\nimport { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { WidgetChangeset } from 'core-app/shared/components/grids/widgets/widget-changeset';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { BehaviorSubject } from 'rxjs';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3GridForm } from 'core-app/core/apiv3/endpoints/grids/apiv3-grid-form';\n\n@Injectable()\nexport class GridAreaService {\n private resource:GridResource;\n\n public schema:SchemaResource;\n\n public numColumns = 0;\n\n public numRows = 0;\n\n public gridAreas:GridArea[];\n\n public gridGaps:GridArea[];\n\n public widgetAreas:GridWidgetArea[];\n\n public gridAreaIds:string[];\n\n public mousedOverArea:GridArea|null = null;\n\n public $mousedOverArea = new BehaviorSubject(this.mousedOverArea);\n\n public helpMode = false;\n\n constructor(private apiV3Service:ApiV3Service,\n private toastService:ToastService,\n private i18n:I18nService) { }\n\n public set gridResource(value:GridResource) {\n this.resource = value;\n this.fetchSchema();\n\n this.numRows = this.resource.rowCount;\n this.numColumns = this.resource.columnCount;\n\n this.buildAreas(true);\n }\n\n public get gridResource() {\n return this.resource;\n }\n\n public setMousedOverArea(area:GridArea|null) {\n this.mousedOverArea = area;\n\n this.$mousedOverArea.next(area);\n }\n\n public cleanupUnusedAreas() {\n // array containing Numbers from this.numRows to 1\n let unusedRows = _.range(this.numRows, 0, -1);\n\n this.widgetAreas.forEach((widget) => {\n unusedRows = unusedRows.filter((item) => item !== widget.startRow);\n });\n\n unusedRows.forEach((number) => {\n if (this.numRows > 1) {\n this.removeRow(number);\n }\n });\n\n let unusedColumns = _.range(this.numColumns, 0, -1);\n\n this.widgetAreas.forEach((widget) => {\n unusedColumns = unusedColumns.filter((item) => item !== widget.startColumn);\n });\n\n unusedColumns.forEach((number) => {\n if (this.numColumns > 1) {\n this.removeColumn(number);\n }\n });\n }\n\n public buildAreas(widgets = false) {\n this.gridAreas = this.buildGridAreas();\n this.gridGaps = this.buildGridGaps();\n this.gridAreaIds = this.buildGridAreaIds();\n if (widgets) {\n this.widgetAreas = this.buildGridWidgetAreas();\n }\n }\n\n public rebuildAndPersist() {\n this.persist();\n this.buildAreas(false);\n }\n\n public persist() {\n this.resource.rowCount = this.numRows = (this.widgetAreas.map((area) => area.endRow).sort((a, b) => a - b).pop() || 2) - 1;\n this.resource.columnCount = this.numColumns;\n\n this.writeAreaChangesToWidgets();\n\n this.saveGrid(this.resource, this.schema);\n }\n\n public saveWidgetChangeset(changeset:WidgetChangeset) {\n const payload:any = ApiV3GridForm.extractPayload(this.resource, this.schema);\n\n const payloadWidget = payload.widgets.find((w:any) => w.id === changeset.pristineResource.id);\n Object.assign(payloadWidget, changeset.changes);\n\n // Adding the id so that the url can be deduced\n payload.id = this.resource.id;\n\n this.saveGrid(payload);\n }\n\n public isGap(area:GridArea) {\n return area instanceof GridGap;\n }\n\n public get isSingleCell() {\n return this.numRows === 1 && this.numColumns === 1 && this.widgetResources.length === 0;\n }\n\n public get inHelpMode() {\n return this.helpMode || this.isSingleCell;\n }\n\n public toggleHelpMode() {\n this.helpMode = !this.helpMode;\n }\n\n // This is a hacky way to have the placeholder in the viewport.\n // It is a noop for firefox and edge as both do not support scrollIntoViewIfNeeded.\n // But as scrollIntoView will always readjust the viewport, the result would be an unbearable flicker\n // which causes e.g. dragging to be impossible.\n public scrollPlaceholderIntoView() {\n const placeholder = jQuery('.grid--area.-placeholder');\n\n if ((placeholder[0] as any).scrollIntoViewIfNeeded) {\n setTimeout(() => (placeholder[0] as any).scrollIntoViewIfNeeded());\n }\n }\n\n private saveGrid(resource:GridWidgetResource|any, schema?:SchemaResource) {\n this\n .apiV3Service\n .grids\n .id(resource)\n .patch(resource, schema)\n .subscribe((updatedGrid) => {\n this.assignAreasWidget(updatedGrid);\n this.toastService.addSuccess(this.i18n.t('js.notice_successful_update'));\n });\n }\n\n private assignAreasWidget(newGrid:GridResource) {\n this.resource.widgets = newGrid.widgets;\n\n const takenIds = this.widgetAreas.map((a) => a.widget.id);\n this.widgetAreas.forEach((area) => {\n let newWidget:GridWidgetResource;\n\n // identify the right resource for the area. Typically that means fetching them by id.\n // But new areas have unpersisted resources at first. Unpersisted resources have no id.\n // In those cases, we find the one resource which is not claimed by any other area.\n if (area.widget.id) {\n newWidget = newGrid.widgets.find((widget) => widget.id === area.widget.id)!;\n } else {\n newWidget = newGrid.widgets.find((widget) => !takenIds.includes(widget.id) && widget.identifier === area.widget.identifier && widget.startRow === area.widget.startRow && widget.startColumn === area.widget.startColumn)!;\n }\n\n area.widget = newWidget!;\n });\n }\n\n private buildGridAreas() {\n const cells:GridArea[] = [];\n\n // the one extra row is added in case the user wants to drag a widget to the very bottom\n for (let row = 1; row <= this.numRows + 1; row++) {\n cells.push(...this.buildGridAreasRow(row));\n }\n\n return cells;\n }\n\n private buildGridGaps() {\n const cells:GridArea[] = [];\n\n // special case where we want no gaps\n if (this.isSingleCell) {\n return cells;\n }\n\n for (let row = 1; row <= this.numRows + 1; row++) {\n cells.push(...this.buildGridGapRow(row));\n }\n\n return cells;\n }\n\n private buildGridAreasRow(row:number) {\n const cells:GridArea[] = [];\n\n for (let column = 1; column <= this.numColumns; column++) {\n const cell = new GridArea(row,\n row + 1,\n column,\n column + 1);\n\n cells.push(cell);\n }\n\n return cells;\n }\n\n private buildGridGapRow(row:number) {\n const cells:GridGap[] = [];\n\n for (let column = 1; column <= this.numColumns; column++) {\n cells.push(new GridGap(row,\n row + 1,\n column,\n column + 1,\n 'row'));\n }\n\n if (row <= this.numRows) {\n for (let column = 1; column <= this.numColumns + 1; column++) {\n cells.push(new GridGap(row,\n row + 1,\n column,\n column + 1,\n 'column'));\n }\n }\n\n return cells;\n }\n\n private buildGridWidgetAreas() {\n return this.widgetResources.map((widget) => new GridWidgetArea(widget));\n }\n\n // persist all changes to the areas caused by dragging/resizing\n // to the widget\n public writeAreaChangesToWidgets() {\n this.widgetAreas.forEach((area) => {\n area.writeAreaChangeToWidget();\n });\n }\n\n public addColumn(column:number, excludeRow:number) {\n this.numColumns++;\n\n const movedWidgets:GridWidgetArea[] = [];\n\n for (let row = 1; row <= this.numRows; row++) {\n if (row === excludeRow) {\n continue;\n }\n\n const widget = this\n .rowWidgets(row)\n .sort((a, b) => a.startColumn - b.startColumn)\n .find((widget) => !(widget.startRow < excludeRow && widget.endRow > excludeRow)\n && (widget.startColumn === column + 1\n || widget.endColumn === column + 1\n || widget.startColumn <= column && widget.endColumn > column));\n\n if (widget) {\n movedWidgets.push(widget);\n widget.endColumn++;\n }\n }\n\n this.moveSubsequentRowWidgets(this.widgetAreas.filter((widget) => !movedWidgets.includes(widget)),\n column);\n }\n\n public addRow(row:number, excludeColumn:number) {\n this.numRows++;\n\n const movedWidgets:GridWidgetArea[] = [];\n\n for (let column = 1; column <= this.numColumns; column++) {\n if (column === excludeColumn) {\n continue;\n }\n\n const widget = this\n .columnWidgets(column)\n .sort((a, b) => a.startRow - b.startRow)\n .find((widget) => !(widget.startColumn < excludeColumn && widget.endColumn > excludeColumn)\n && (widget.startRow === row + 1\n || widget.endRow === row + 1\n || widget.startRow <= row && widget.endRow > row));\n\n if (widget) {\n movedWidgets.push(widget);\n widget.endRow++;\n }\n }\n\n this.moveSubsequentColumnWidgets(this.widgetAreas.filter((widget) => !movedWidgets.includes(widget)),\n row);\n }\n\n public removeColumn(column:number) {\n this.numColumns--;\n\n // shrink widgets that span more than the removed column\n this.widgetAreas.forEach((widget) => {\n if (widget.startColumn <= column && widget.endColumn >= column + 1) {\n // shrink widgets that span more than the removed column\n widget.endColumn--;\n }\n });\n\n // move all widgets that are after the removed column\n // so that they appear to keep their place.\n this.widgetAreas.filter((widget) => widget.startColumn > column).forEach((widget) => {\n widget.startColumn--;\n widget.endColumn--;\n });\n }\n\n public removeRow(row:number) {\n this.numRows--;\n\n // shrink widgets that span more than the removed row\n this.widgetAreas.forEach((widget) => {\n if (widget.startRow <= row && widget.endRow >= row + 1) {\n // shrink widgets that span more than the removed row\n widget.endRow--;\n }\n });\n\n // move all widgets that are after the removed row\n // so that they appear to keep their place.\n this.widgetAreas.filter((widget) => widget.startRow > row).forEach((widget) => {\n widget.startRow--;\n widget.endRow--;\n });\n }\n\n public resetAreas(ignoredArea:GridWidgetArea|null = null) {\n this.widgetAreas.filter((area) => !ignoredArea || area.guid !== ignoredArea.guid).forEach((area) => area.reset());\n\n this.numRows = this.resource.rowCount;\n this.numColumns = this.resource.columnCount;\n }\n\n public get isEditable() {\n return this.gridResource.updateImmediately !== undefined;\n }\n\n private buildGridAreaIds() {\n return this\n .gridAreas\n .filter((area) => !this.isGap(area))\n .map((area) => area.guid);\n }\n\n private fetchSchema() {\n this\n .apiV3Service\n .grids\n .id(this.resource)\n .form\n .post({})\n .subscribe((form) => this.schema = form.schema);\n }\n\n public removeWidget(removedWidget:GridWidgetResource) {\n let index = this.resource.widgets.findIndex((widget) => widget.id === removedWidget.id);\n this.resource.widgets.splice(index, 1);\n\n index = this.widgetAreas.findIndex((area) => area.widget.id === removedWidget.id);\n this.widgetAreas.splice(index, 1);\n this.cleanupUnusedAreas();\n\n this.rebuildAndPersist();\n }\n\n public get widgetResources() {\n return (this.resource && this.resource.widgets) || [];\n }\n\n private rowWidgets(row:number) {\n return this.widgetAreas.filter((widget) => widget.startRow === row);\n }\n\n private moveSubsequentRowWidgets(rowWidgets:GridWidgetArea[], column:number) {\n rowWidgets.forEach((subsequentWidget) => {\n if (subsequentWidget.startColumn > column) {\n subsequentWidget.startColumn++;\n subsequentWidget.endColumn++;\n }\n });\n }\n\n private columnWidgets(column:number) {\n return this.widgetAreas.filter((widget) => widget.startColumn === column);\n }\n\n private moveSubsequentColumnWidgets(columnWidgets:GridWidgetArea[], row:number) {\n columnWidgets.forEach((subsequentWidget) => {\n if (subsequentWidget.startRow > row) {\n subsequentWidget.startRow++;\n subsequentWidget.endRow++;\n }\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { GridWidgetArea } from 'core-app/shared/components/grids/areas/grid-widget-area';\nimport { GridAreaService } from 'core-app/shared/components/grids/grid/area.service';\nimport { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\n\n@Injectable()\nexport class GridRemoveWidgetService {\n constructor(readonly layout:GridAreaService) {\n }\n\n public area(area:GridWidgetArea) {\n this.widget(area.widget);\n }\n\n public widget(widget:GridWidgetResource) {\n this.layout.removeWidget(widget);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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, Injector, Input } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { OpContextMenuItem } from 'core-app/shared/components/op-context-menu/op-context-menu.types';\nimport { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\nimport { GridRemoveWidgetService } from 'core-app/shared/components/grids/grid/remove-widget.service';\nimport { GridAreaService } from 'core-app/shared/components/grids/grid/area.service';\n\n@Directive()\nexport abstract class WidgetAbstractMenuComponent {\n @Input() resource:GridWidgetResource;\n\n protected menuItemList:OpContextMenuItem[] = [this.removeItem];\n\n constructor(readonly injector:Injector,\n readonly i18n:I18nService,\n protected readonly remove:GridRemoveWidgetService,\n protected readonly layout:GridAreaService) {\n }\n\n public get menuItems() {\n return async () => this.menuItemList;\n }\n\n protected get removeItem():OpContextMenuItem {\n return {\n linkText: this.i18n.t('js.grid.remove'),\n onClick: () => {\n this.remove.widget(this.resource);\n return true;\n },\n };\n }\n\n public get hasMenu() {\n return this.layout.isEditable;\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 { WidgetAbstractMenuComponent } from 'core-app/shared/components/grids/widgets/menu/widget-abstract-menu.component';\n\n@Component({\n selector: 'widget-menu',\n templateUrl: './widget-menu.component.html',\n styleUrls: ['./widget-menu.component.css'],\n})\nexport class WidgetMenuComponent extends WidgetAbstractMenuComponent {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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, EventEmitter, Input, Output,\n} from '@angular/core';\nimport { GridAreaService } from 'core-app/shared/components/grids/grid/area.service';\n\n@Component({\n selector: 'widget-header',\n templateUrl: './header.component.html',\n styleUrls: ['./header.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WidgetHeaderComponent {\n @Input() name:string;\n\n @Input() editable = true;\n\n @Output() onRenamed = new EventEmitter();\n\n constructor(readonly layout:GridAreaService) {\n\n }\n\n public renamed(name:string) {\n this.onRenamed.emit(name);\n }\n\n public get isRenameable() {\n return this.editable && this.layout.isEditable;\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, Injector } from '@angular/core';\nimport { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport {\n WorkPackageIsolatedQuerySpaceDirective,\n} from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\n\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './wp-calendar.component.html',\n hostDirectives: [WorkPackageIsolatedQuerySpaceDirective],\n})\nexport class WidgetWpCalendarComponent extends AbstractWidgetComponent {\n constructor(protected readonly i18n:I18nService,\n protected readonly injector:Injector,\n protected readonly currentProject:CurrentProjectService) {\n super(i18n, injector);\n }\n\n public get projectIdentifier() {\n return this.currentProject.identifier;\n }\n}\n","\n\n \n \n\n\n\n","import { Injectable } from '@angular/core';\nimport { DisplayedDays } from 'core-app/features/calendar/te-calendar/te-calendar.component';\nimport * as moment from 'moment-timezone';\n\n@Injectable()\nexport class TimeEntriesCurrentUserConfigurationModalService {\n /*\n * Get the data of the days in the locale order\n * @param daysCheckedValues: Checked value of all days of the week, starting from Monday.\n * Moment's default weekday start is Sunday, so daysCheckedValues have a weekday offset of 1.\n * @param localeWeekDays: week days ordered by locale\n * @param localeOffset: locale offset regarding the default week start day (Sunday (0)).\n */\n\n getOrderedDaysData(\n daysCheckedValues:boolean[],\n localeWeekDays = moment.weekdays(true),\n localeOffset = moment.localeData().firstDayOfWeek(),\n ):IDayData[] {\n // The daysCheckedValues come with offset 1 (the week start day is Monday (1),\n // so the first element in the array is Monday). We have to subtract 1 to the\n // locale offset to match localeWeekDays with daysCheckedValues. For example:\n // localeWeekDays (with offset 0) = [SundayValue, MondayValue, TuesdayValue, WednesdayValue, ThursdayValue, FridayValue, SaturdayValue]\n // daysCheckedValues (with offset 1) = [MondayValue, TuesdayValue, WednesdayValue, ThursdayValue, FridayValue, SaturdayValue, SundayValue]\n // offsetToApply = -1, so we need to pass the last daysCheckedValues to the start of the array to match the localeWeekDays order\n // In order save the result, we will have to reorder it with offset 1 (getCheckedValuesInOriginalOrder)\n const offsetToApply = localeOffset - 1;\n const offsetCheckedValues = offsetToApply >= 0 ? daysCheckedValues.splice(0, offsetToApply) : daysCheckedValues.splice(offsetToApply);\n const orderedDaysCheckedValues = offsetToApply >= 0 ? [...daysCheckedValues, ...offsetCheckedValues] : [...offsetCheckedValues, ...daysCheckedValues];\n const weekDaysWithCheckedValue = orderedDaysCheckedValues\n .map(\n (dayCheckedValue, index) => ({\n weekDay: localeWeekDays[index],\n checked: dayCheckedValue,\n originalIndex: this.getOriginalIndex(offsetToApply, index, orderedDaysCheckedValues.length),\n }),\n );\n\n return weekDaysWithCheckedValue;\n }\n\n getOriginalIndex(offsetToApply:number, currentIndex:number, arrayLength:number):number {\n let originalIndex = currentIndex + offsetToApply;\n\n if (originalIndex < 0) {\n originalIndex = arrayLength - 1;\n } else if (originalIndex >= arrayLength) {\n originalIndex = 0;\n }\n\n return originalIndex;\n }\n\n getCheckedValuesInOriginalOrder(days:IDayData[]) {\n const configuredDays = days\n .sort((a, b) => (a.originalIndex < b.originalIndex ? -1 : 1))\n .map((localeDayData) => localeDayData.checked);\n\n return this.validDays(configuredDays as DisplayedDays);\n }\n\n private validDays(days:DisplayedDays) {\n if (days.every((value) => !value)) {\n return Array.apply(null, Array(7)).map(() => true);\n }\n return days;\n }\n}\n","
    \n\n
    {{text.displayedDays}}
    \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, ChangeDetectorRef, Component, ElementRef, Inject, Injector, OnInit,\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 { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.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 { TimeEntriesCurrentUserConfigurationModalService } from 'core-app/shared/components/grids/widgets/time-entries/current-user/configuration-modal/services/configuration-modal/configuration-modal.service';\n\n@Component({\n templateUrl: './configuration.modal.html',\n providers: [TimeEntriesCurrentUserConfigurationModalService],\n})\nexport class TimeEntriesCurrentUserConfigurationModalComponent extends OpModalComponent implements OnInit {\n public text = {\n displayedDays: this.I18n.t('js.grid.widgets.time_entries_current_user.displayed_days'),\n closePopup: this.I18n.t('js.close_popup_title'),\n applyButton: this.I18n.t('js.modals.button_apply'),\n cancelButton: this.I18n.t('js.modals.button_cancel'),\n };\n\n public firstDayOfWeek:number;\n\n // Checked value of all days of the week, starting from Monday.\n public options:{ days:boolean[] };\n\n public daysOriginalCheckedValues:boolean[];\n\n public days:IDayData[];\n\n constructor(@Inject(OpModalLocalsToken) public locals:OpModalLocalsMap,\n readonly I18n:I18nService,\n readonly injector:Injector,\n readonly appRef:ApplicationRef,\n readonly loadingIndicator:LoadingIndicatorService,\n readonly notificationService:WorkPackageNotificationService,\n readonly cdRef:ChangeDetectorRef,\n readonly configuration:ConfigurationService,\n readonly elementRef:ElementRef,\n readonly timeEntriesCurrentUserConfigurationModalService:TimeEntriesCurrentUserConfigurationModalService) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit() {\n const localDayOptions = this.locals.options.days;\n this.daysOriginalCheckedValues = localDayOptions.length > 0 ? localDayOptions : Array.from({ length: 7 }, () => true);\n this.days = this.timeEntriesCurrentUserConfigurationModalService.getOrderedDaysData(this.daysOriginalCheckedValues);\n }\n\n public saveChanges():void {\n const checkedValuesInOriginalOrder = this.timeEntriesCurrentUserConfigurationModalService.getCheckedValuesInOriginalOrder(this.days);\n\n this.options = { days: checkedValuesInOriginalOrder };\n this.service.close();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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, Output,\n} from '@angular/core';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { WidgetAbstractMenuComponent } from 'core-app/shared/components/grids/widgets/menu/widget-abstract-menu.component';\nimport { TimeEntriesCurrentUserConfigurationModalComponent } from 'core-app/shared/components/grids/widgets/time-entries/current-user/configuration-modal/configuration.modal';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Component({\n selector: 'widget-time-entries-current-user-menu',\n templateUrl: '../../menu/widget-menu.component.html',\n})\nexport class WidgetTimeEntriesCurrentUserMenuComponent extends WidgetAbstractMenuComponent {\n @InjectField() opModalService:OpModalService;\n\n @Output() onConfigured:EventEmitter = new EventEmitter();\n\n protected menuItemList = [\n this.removeItem,\n this.configureItem,\n ];\n\n protected get configureItem() {\n return {\n linkText: this.i18n.t('js.grid.configure'),\n onClick: () => {\n this.opModalService.show(TimeEntriesCurrentUserConfigurationModalComponent, this.injector, this.locals)\n .subscribe(\n (modal) => modal.closingEvent.subscribe(() => {\n if (modal.options) {\n this.onConfigured.emit(modal.options);\n }\n }),\n );\n return true;\n },\n };\n }\n\n protected get locals() {\n return { options: this.resource.options };\n }\n}\n","import {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, Injector,\n} from '@angular/core';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\nimport { DisplayedDays } from 'core-app/features/calendar/te-calendar/te-calendar.component';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\n\n@Component({\n templateUrl: './time-entries-current-user.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WidgetTimeEntriesCurrentUserComponent extends AbstractWidgetComponent {\n public entries:TimeEntryResource[] = [];\n\n public displayedDays:DisplayedDays;\n\n constructor(protected readonly injector:Injector,\n readonly timezone:TimezoneService,\n readonly i18n:I18nService,\n readonly pathHelper:PathHelperService,\n protected readonly cdr:ChangeDetectorRef) {\n super(i18n, injector);\n }\n\n public ngOnInit() {\n this.displayedDays = this.resource.options.days as DisplayedDays;\n }\n\n public updateEntries(entries:CollectionResource) {\n this.entries = entries.elements;\n\n this.cdr.detectChanges();\n }\n\n public get total() {\n const duration = this.entries.reduce((current, entry) => current + this.timezone.toHours(entry.hours), 0);\n\n if (duration > 0) {\n return this.i18n.t('js.units.hour', { count: duration });\n }\n return this.i18n.t('js.placeholders.default');\n }\n\n public get isEditable() {\n return false;\n }\n\n public updateConfiguration(options:{ days:DisplayedDays }) {\n this.resourceChanged.emit(this.setChangesetOptions(options));\n // Need to copy to trigger change detection\n this.displayedDays = [...options.days] as DisplayedDays;\n }\n\n protected formatNumber(value:number):string {\n return this.i18n.toNumber(value, { precision: 2 });\n }\n}\n","\n\n \n \n\n\n\n\n\n
    \n

    Total:

    \n
    \n
    \n","import { Injectable } from '@angular/core';\nimport { WidgetRegistration } from 'core-app/shared/components/grids/grid/grid.component';\nimport { HookService } from 'core-app/features/plugins/hook-service';\n\n@Injectable()\nexport class GridWidgetsService {\n constructor(private Hook:HookService) {}\n\n public get registered() {\n let registeredWidgets:WidgetRegistration[] = [];\n\n _.each(this.Hook.call('gridWidgets'), (registration:WidgetRegistration[]) => {\n registeredWidgets = registeredWidgets.concat(registration);\n });\n\n return registeredWidgets;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { GridWidgetArea } from 'core-app/shared/components/grids/areas/grid-widget-area';\nimport { GridAreaService } from 'core-app/shared/components/grids/grid/area.service';\n\n@Injectable()\nexport class GridMoveService {\n constructor(private layout:GridAreaService) {}\n\n public down(movedArea:GridWidgetArea|null, ignoreArea:GridWidgetArea) {\n const movedAreas:GridWidgetArea[] = [];\n let remainingAreas:GridWidgetArea[] = this.layout.widgetAreas.slice(0);\n\n if (ignoreArea) {\n remainingAreas = remainingAreas.filter((area) => area.guid !== ignoreArea.guid);\n }\n\n remainingAreas.sort((a, b) => b.startRow - a.startRow);\n\n while (movedArea !== null) {\n movedAreas.push(movedArea);\n\n remainingAreas = remainingAreas.filter((area) => area.guid !== movedArea!.guid);\n\n movedArea = this.moveOneDown(movedAreas, remainingAreas);\n }\n }\n\n private moveOneDown(anchorAreas:GridWidgetArea[], movableAreas:GridWidgetArea[]) {\n const moveSpecification = this.firstAreaToMove(anchorAreas, movableAreas);\n\n if (moveSpecification) {\n const toMoveArea = moveSpecification[0];\n const anchorArea = moveSpecification[1];\n\n const areaHeight = toMoveArea.widget.height;\n\n toMoveArea.startRow = anchorArea.endRow;\n toMoveArea.endRow = toMoveArea.startRow + areaHeight;\n\n if (this.layout.numRows < toMoveArea.endRow - 1) {\n this.layout.numRows = toMoveArea.endRow - 1;\n }\n\n return toMoveArea;\n }\n return null;\n }\n\n // Return first area that needs to move as it overlaps another area.\n // There are two groups of areas here. The first (anchorAreas) is considered stable\n // and as such not fit for being moved. This happens e.g. when the user explicitly\n // moved a widget or if the area has already been moved in a previous run of this method.\n // The second group (movableAreas) consists of all areas that are movable.\n // Once an area out of the second group has been identified that overlaps an area of the first\n // group, the appropriate reference area for later moving is selected out of the group of all\n // unmovable areas. The reference area is the bottommost area within the unmovable areas which's\n // column values (start/end) include the to move area's start column value and which's end row is larger\n // than the area overlapping the area to move. Unmovable areas which's column values do not include the\n // start column are to the left or right of the area to move and can thus be ignored.\n private firstAreaToMove(anchorAreas:GridWidgetArea[], movableAreas:GridWidgetArea[]) {\n let overlappingArea:GridWidgetArea|null = null;\n let toMoveArea:GridWidgetArea|null = null;\n\n movableAreas.forEach((movableArea) => {\n anchorAreas.forEach((anchorArea) => {\n if (anchorArea.overlaps(movableArea)) {\n overlappingArea = anchorArea;\n toMoveArea = movableArea;\n }\n });\n\n if (toMoveArea) {\n\n }\n });\n\n if (toMoveArea !== null) {\n let referenceArea = overlappingArea!;\n\n anchorAreas.forEach((anchorArea) => {\n if (anchorArea.endRow > referenceArea.endRow && toMoveArea!.columnOverlaps(anchorArea)) {\n referenceArea = anchorArea;\n }\n });\n\n return [toMoveArea, referenceArea];\n }\n return null;\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { GridWidgetArea } from 'core-app/shared/components/grids/areas/grid-widget-area';\nimport { GridArea } from 'core-app/shared/components/grids/areas/grid-area';\nimport { GridAreaService } from 'core-app/shared/components/grids/grid/area.service';\nimport { GridMoveService } from 'core-app/shared/components/grids/grid/move.service';\nimport { Subscription } from 'rxjs';\nimport { distinctUntilChanged, filter, throttleTime } from 'rxjs/operators';\n\n@Injectable()\nexport class GridDragAndDropService implements OnDestroy {\n public draggedArea:GridWidgetArea|null;\n\n public placeholderArea:GridWidgetArea|null;\n\n public draggedHeight:number|null;\n\n private mousedOverAreaObserver:Subscription;\n\n constructor(readonly layout:GridAreaService,\n readonly move:GridMoveService) {\n // ngOnInit is not called on services\n this.setupMousedOverAreaSubscription();\n }\n\n ngOnDestroy():void {\n this.mousedOverAreaObserver.unsubscribe();\n }\n\n private setupMousedOverAreaSubscription() {\n this.mousedOverAreaObserver = this\n .layout\n .$mousedOverArea\n .pipe(\n // avoid flickering of widgets as the grid gets resized by the placeholder movement\n throttleTime(10),\n distinctUntilChanged(),\n filter((area) => this.currentlyDragging && !!area && !this.layout.isGap(area) && (this.placeholderArea!.startRow !== area.startRow || this.placeholderArea!.startColumn !== area.startColumn)),\n ).subscribe((area) => {\n this.updateArea(area!);\n\n this.layout.scrollPlaceholderIntoView();\n });\n }\n\n private updateArea(area:GridArea) {\n this.layout.resetAreas(this.draggedArea);\n this.moveAreasOnDragging(area);\n }\n\n private moveAreasOnDragging(dropArea:GridArea) {\n if (!this.placeholderArea) {\n return;\n }\n const widgetArea = this.draggedArea!;\n\n // Set the draggedArea's startRow/startColumn properties\n // to the drop zone ones.\n // The dragged Area should keep it's height and width normally but will\n // shrink if the area would otherwise end outside the grid.\n // we cannot use the widget's original area as moving it while dragging confuses cdkDrag\n this.copyPositionButRestrict(dropArea, this.placeholderArea);\n\n this.move.down(this.placeholderArea, widgetArea);\n }\n\n public get currentlyDragging() {\n return !!this.draggedArea;\n }\n\n public isDropOnlyArea(area:GridArea) {\n return !this.currentlyDragging && area.endRow === this.layout.numRows + 2;\n }\n\n public isDragged(area:GridWidgetArea) {\n return this.currentlyDragging && this.draggedArea!.guid === area.guid;\n }\n\n public isPassive(area:GridWidgetArea) {\n return this.currentlyDragging && !this.isDragged(area);\n }\n\n public get isDraggable() {\n return this.layout.isEditable;\n }\n\n public start(area:GridWidgetArea) {\n this.placeholderArea = new GridWidgetArea(area.widget);\n // TODO find an angular way to do this that ideally does not require passing the element from the grid component\n this.draggedHeight = (document as any).getElementById(area.guid).offsetHeight - 2; // border width * 2\n this.draggedArea = area;\n }\n\n public abort() {\n document.dispatchEvent(new Event('mouseup'));\n this.draggedArea = null;\n this.placeholderArea = null;\n this.layout.resetAreas();\n }\n\n public drop() {\n if (!this.draggedArea) {\n return;\n }\n\n this.placeholderArea!.copyDimensionsTo(this.draggedArea);\n\n if (!this.draggedArea.unchangedSize) {\n this.layout.writeAreaChangesToWidgets();\n this.layout.cleanupUnusedAreas();\n this.layout.rebuildAndPersist();\n }\n\n this.draggedArea = null;\n this.placeholderArea = null;\n }\n\n private copyPositionButRestrict(source:GridArea, sink:GridWidgetArea) {\n sink.startRow = source.startRow;\n\n // The first condition is aimed at the case when the user drags an element to the very last row\n // which is not reflected by the numRows.\n if (source.startRow === this.layout.numRows + 1) {\n sink.endRow = this.layout.numRows + 2;\n } else if (source.startRow + sink.widget.height > this.layout.numRows + 1) {\n sink.endRow = this.layout.numRows + 1;\n } else {\n sink.endRow = source.startRow + sink.widget.height;\n }\n\n sink.startColumn = source.startColumn;\n if (source.startColumn + sink.widget.width > this.layout.numColumns + 1) {\n sink.endColumn = this.layout.numColumns + 1;\n } else {\n sink.endColumn = source.startColumn + sink.widget.width;\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { GridWidgetArea } from 'core-app/shared/components/grids/areas/grid-widget-area';\nimport { GridArea } from 'core-app/shared/components/grids/areas/grid-area';\nimport { GridAreaService } from 'core-app/shared/components/grids/grid/area.service';\nimport { GridMoveService } from 'core-app/shared/components/grids/grid/move.service';\nimport { GridDragAndDropService } from 'core-app/shared/components/grids/grid/drag-and-drop.service';\n\n@Injectable()\nexport class GridResizeService {\n private resizedArea:GridWidgetArea|null;\n\n private targetIds:string[];\n\n constructor(readonly layout:GridAreaService,\n readonly move:GridMoveService,\n readonly drag:GridDragAndDropService) { }\n\n public end(area:GridWidgetArea) {\n if (!this.resizedArea) {\n return;\n }\n\n this.resizedArea = null;\n\n // user aborted resizing\n if (area.unchangedSize) {\n return;\n }\n\n this.layout.writeAreaChangesToWidgets();\n this.layout.cleanupUnusedAreas();\n\n this.layout.rebuildAndPersist();\n }\n\n public abort() {\n if (this.resizedArea) {\n this.layout.resetAreas();\n this.resizedArea = null;\n }\n }\n\n public start(resizedArea:GridWidgetArea) {\n this.resizedArea = resizedArea;\n\n const resizeTargets = this.layout.gridAreas.filter((area) => {\n // All areas on the same row which are after the current column are valid targets.\n const sameRow = area.startRow === this.resizedArea!.startRow\n && area.startColumn >= this.resizedArea!.startColumn;\n\n // Areas that are on higher (number, they are printed below) rows\n // are allowed as long as there is guaranteed to always be one widget\n // before or after the resized to area.\n const higherRow = area.startRow > this.resizedArea!.startRow\n && area.startColumn >= this.resizedArea!.startColumn\n && this.layout.widgetAreas.some((fixedArea) => fixedArea.startRow === area.startRow\n // before\n && (fixedArea.endColumn <= this.resizedArea!.startColumn\n // after\n || fixedArea.startColumn >= area.endColumn));\n return sameRow || higherRow;\n });\n\n this.targetIds = resizeTargets\n .map((area) => area.guid);\n }\n\n public moving() {\n if (!this.resizedArea\n || !this.layout.mousedOverArea\n || !this.targetIds.includes(this.layout.mousedOverArea.guid)) {\n return;\n }\n\n this.layout.resetAreas();\n\n this.resizedArea.endRow = this.layout.mousedOverArea.endRow;\n this.resizedArea.endColumn = this.layout.mousedOverArea.endColumn;\n\n this.move.down(this.resizedArea, this.resizedArea);\n }\n\n public isTarget(area:GridArea) {\n const areaId = area.guid;\n\n return this.resizedArea && this.targetIds.includes(areaId);\n }\n\n public isResized(area:GridWidgetArea) {\n return this.resizedArea && this.resizedArea.guid === area.guid;\n }\n\n public isPassive(area:GridWidgetArea) {\n return this.currentlyResizing && !this.isResized(area);\n }\n\n public get currentlyResizing() {\n return !!this.resizedArea;\n }\n\n public get isResizable() {\n return !this.drag.currentlyDragging && this.isAllowed;\n }\n\n private get isAllowed() {\n return this.layout.gridResource.updateImmediately;\n }\n}\n","\n
    {{text.title}}
    \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","import {\n ChangeDetectorRef, Component, ElementRef, Inject,\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 { WidgetRegistration } from 'core-app/shared/components/grids/grid/grid.component';\nimport { GridWidgetsService } from 'core-app/shared/components/grids/widgets/widgets.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { enterpriseDocsUrl } from 'core-app/core/setup/globals/constants.const';\n\n@Component({\n templateUrl: './add.modal.html',\n})\nexport class AddGridWidgetModalComponent extends OpModalComponent {\n text = {\n title: this.i18n.t('js.grid.add_widget'),\n close_popup: this.i18n.t('js.button_close'),\n upsale_link: this.i18n.t('js.grid.upsale.link'),\n upsale_text: this.i18n.t('js.grid.upsale.text'),\n cancel_button: this.i18n.t('js.button_cancel'),\n more_info_link: enterpriseDocsUrl.graphWidgets,\n };\n\n public chosenWidget:WidgetRegistration;\n\n public eeShowBanners = false;\n\n constructor(readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) readonly locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly widgetsService:GridWidgetsService,\n readonly i18n:I18nService,\n readonly bannerService:BannersService) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit() {\n super.ngOnInit();\n this.eeShowBanners = this.bannerService.eeShowBanners;\n }\n\n public get selectable() {\n return this.eligibleWidgets.sort((a, b) => a.title.localeCompare(b.title));\n }\n\n public select($event:any, widget:WidgetRegistration) {\n this.chosenWidget = widget;\n this.closeMe($event);\n }\n\n public trackWidgetBy(widget:WidgetRegistration) {\n return widget.identifier;\n }\n\n private get eligibleWidgets() {\n const schemaWidgetIdentifiers = this.locals.schema.widgets.allowedValues.map((widget:any) => widget.identifier);\n\n return this.widgetsService.registered.filter((widget) => schemaWidgetIdentifiers.includes(widget.identifier));\n }\n}\n","import { Injectable, Injector } from '@angular/core';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { AddGridWidgetModalComponent } from 'core-app/shared/components/grids/widgets/add/add.modal';\nimport { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\nimport { GridArea } from 'core-app/shared/components/grids/areas/grid-area';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { GridWidgetArea } from 'core-app/shared/components/grids/areas/grid-widget-area';\nimport { GridAreaService } from 'core-app/shared/components/grids/grid/area.service';\nimport { GridDragAndDropService } from 'core-app/shared/components/grids/grid/drag-and-drop.service';\nimport { GridResizeService } from 'core-app/shared/components/grids/grid/resize.service';\nimport { GridMoveService } from 'core-app/shared/components/grids/grid/move.service';\nimport { GridGap } from 'core-app/shared/components/grids/areas/grid-gap';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n@Injectable()\nexport class GridAddWidgetService {\n text = { add: this.i18n.t('js.grid.add_widget') };\n\n constructor(readonly opModalService:OpModalService,\n readonly injector:Injector,\n readonly halResource:HalResourceService,\n readonly layout:GridAreaService,\n readonly drag:GridDragAndDropService,\n readonly move:GridMoveService,\n readonly resize:GridResizeService,\n readonly i18n:I18nService) {\n }\n\n public isAddable(area:GridArea) {\n return !this.drag.currentlyDragging\n && !this.resize.currentlyResizing\n && (this.layout.mousedOverArea === area || this.layout.isSingleCell || this.layout.inHelpMode)\n && this.isAllowed;\n }\n\n public widget(area:GridArea) {\n this\n .select(area)\n .then((widgetResource) => {\n if (this.layout.isGap(area)) {\n this.addLine(area as GridGap);\n }\n\n const newArea = new GridWidgetArea(widgetResource);\n\n this.setMaxWidth(newArea);\n\n this.persist(newArea);\n })\n .catch(() => {\n // user didn't select a widget\n });\n }\n\n public get addText() {\n return this.text.add;\n }\n\n private select(area:GridArea) {\n return new Promise((resolve, reject) => {\n this.opModalService.show(\n AddGridWidgetModalComponent,\n this.injector,\n { schema: this.layout.schema },\n ).subscribe((modal) => {\n modal.closingEvent.subscribe(() => {\n const registered = modal.chosenWidget;\n\n if (!registered) {\n reject();\n return;\n }\n\n const source = {\n _type: 'GridWidget',\n identifier: registered.identifier,\n startRow: area.startRow,\n endRow: area.endRow,\n startColumn: area.startColumn,\n endColumn: area.endColumn,\n options: registered.properties || {},\n };\n\n const resource:GridWidgetResource = this.halResource.createHalResource(source);\n\n resource.grid = this.layout.gridResource;\n\n resolve(resource);\n });\n });\n });\n }\n\n private addLine(area:GridGap) {\n if (area.isRow) {\n // - 1 to have it added before\n this.layout.addRow(area.startRow - 1, area.startColumn);\n } else if (area.isColumn) {\n // - 1 to have it added before\n this.layout.addColumn(area.startColumn - 1, area.startRow);\n }\n }\n\n // try to set it to a layout with a height of 1 and as wide as possible\n // but shrink if that is outside the grid or overlaps any other widget\n private setMaxWidth(area:GridWidgetArea) {\n area.endColumn = this.layout.numColumns + 1;\n\n this.layout.widgetAreas.forEach((existingArea) => {\n if (area.startColumnOverlaps(existingArea)) {\n area.endColumn = existingArea.startColumn;\n }\n });\n }\n\n private persist(area:GridWidgetArea) {\n area.writeAreaChangeToWidget();\n this.layout.widgetAreas.push(area);\n this.layout.widgetResources.push(area.widget);\n this.layout.rebuildAndPersist();\n }\n\n public get isAllowed() {\n return this.layout.gridResource && this.layout.gridResource.updateImmediately;\n }\n}\n","import { TabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { Component, ViewChild } from '@angular/core';\nimport {\n WorkPackageIsolatedQuerySpaceDirective,\n} from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\n\n@Component({\n selector: 'op-wp-graph-configuration-settings-tab',\n templateUrl: './settings-tab.component.html',\n hostDirectives: [WorkPackageIsolatedQuerySpaceDirective],\n})\nexport class WpGraphConfigurationSettingsTabComponent implements TabComponent {\n @ViewChild('tabInner', { static: true })\n tabInner:TabComponent;\n\n public onSave() {\n this.tabInner.onSave();\n }\n}\n","\n","import { Component, ViewChild } from '@angular/core';\nimport { TabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport {\n WorkPackageIsolatedQuerySpaceDirective,\n} from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\n\n@Component({\n selector: 'op-wp-graph-configuration-filters-tab',\n templateUrl: './filters-tab.component.html',\n hostDirectives: [WorkPackageIsolatedQuerySpaceDirective], // TODO replace\n})\nexport class WpGraphConfigurationFiltersTabComponent implements TabComponent {\n @ViewChild('tabInner', { static: true })\n tabInner:TabComponent;\n\n public onSave() {\n this.tabInner.onSave();\n }\n}\n","\n","import { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { ChartOptions } from 'chart.js';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\nexport interface WpGraphQueryParams {\n id?:string;\n props?:any;\n name?:string;\n}\n\nexport interface WpGraphConfiguration {\n queries:QueryResource[];\n queryParams:WpGraphQueryParams[];\n chartType:string;\n chartOptions:ChartOptions;\n}\n\nexport class WpGraphConfiguration implements WpGraphConfiguration {\n public queries:QueryResource[] = [];\n\n constructor(\n public queryParams:WpGraphQueryParams[],\n public chartOptions:ChartOptions,\n public chartType:string,\n ) {\n this.chartType = this.chartType || 'bar';\n }\n\n public static queryCreationParams(i18n:I18nService, isPublic:boolean):unknown {\n return {\n public: isPublic,\n name: i18n.t('js.grid.widgets.work_packages_graph.title'),\n showHierarchies: false,\n _links: {\n groupBy: {\n href: '/api/v3/queries/group_bys/status',\n },\n },\n };\n }\n}\n\n","import { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WpGraphConfigurationSettingsTabComponent } from 'core-app/shared/components/work-package-graphs/configuration-modal/tabs/settings-tab.component';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { TabInterface } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { Injectable } from '@angular/core';\nimport { WpGraphConfigurationFiltersTabComponent } from 'core-app/shared/components/work-package-graphs/configuration-modal/tabs/filters-tab.component';\nimport { ChartOptions } from 'chart.js';\nimport { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';\nimport {\n WpGraphConfiguration,\n WpGraphQueryParams,\n} from 'core-app/shared/components/work-package-graphs/configuration/wp-graph-configuration';\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 { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { WorkPackageEmbeddedGraphDataset } from 'core-app/shared/components/work-package-graphs/embedded/wp-embedded-graph.component';\nimport {\n firstValueFrom,\n Observable,\n switchMap,\n} from 'rxjs';\n\n@Injectable()\nexport class WpGraphConfigurationService {\n private _configuration:WpGraphConfiguration;\n\n private _forms:{ [id:string]:QueryFormResource } = {};\n\n private _formsPromise:Promise|null;\n\n constructor(\n readonly I18n:I18nService,\n readonly apiv3Service:ApiV3Service,\n readonly notificationService:WorkPackageNotificationService,\n readonly currentProject:CurrentProjectService,\n ) { }\n\n public persistAndReload():Promise {\n return this\n .persistChanges()\n .then(() => this.reloadQueries());\n }\n\n public persistChanges():Promise {\n const promises = this.queries.map((query) => this.saveQuery(query));\n\n return Promise.all(promises);\n }\n\n public get datasets():WorkPackageEmbeddedGraphDataset[] {\n return this.queries.map((query) => ({\n groups: query.results.groups,\n queryProps: '',\n label: query.name,\n }));\n }\n\n public reloadQueries():Promise {\n this.configuration.queries.length = 0;\n\n return this.loadQueries();\n }\n\n public ensureQueryAndLoad():Promise {\n if (this.queryParams.length === 0) {\n return firstValueFrom(this.createInitial())\n .then((query) => {\n this.queryParams.push({ id: query.id! });\n\n return this.loadQueries();\n });\n }\n return this.loadQueries();\n }\n\n private createInitial():Observable {\n return this\n .apiv3Service\n .queries\n .form\n .loadWithParams(\n { pageSize: 0 },\n undefined,\n this.currentProject.identifier,\n WpGraphConfiguration.queryCreationParams(this.I18n, !!this.currentProject.identifier),\n )\n .pipe(\n switchMap(([form, query]) => this.apiv3Service.queries.post(query, form)),\n );\n }\n\n private loadQueries() {\n const queryPromises = this.queryParams.map((queryParam) => this.loadQuery(queryParam));\n\n return Promise.all(queryPromises);\n }\n\n private loadQuery(params:WpGraphQueryParams):Promise {\n return firstValueFrom(this\n .apiv3Service\n .queries\n .find(\n { pageSize: 0, ...params.props },\n params.id,\n this.currentProject.identifier,\n ))\n .then((query) => {\n if (params.name) {\n // eslint-ignore-next-line no-param-reassign\n query.name = params.name;\n }\n this.configuration.queries.push(query);\n });\n }\n\n private async saveQuery(query:QueryResource) {\n return this.formFor(query)\n .then((form) => this\n .apiv3Service\n .queries\n .id(query)\n .patch(query, form)\n .toPromise());\n }\n\n public get configuration() {\n return this._configuration;\n }\n\n public set configuration(config:WpGraphConfiguration) {\n this._configuration = config;\n this._formsPromise = null;\n }\n\n public async formFor(query:QueryResource):Promise {\n return this\n .loadForms()\n .then(() => this._forms[query.id!]);\n }\n\n public get tabs():TabInterface[] {\n const tabs:TabInterface[] = [\n {\n id: 'graph-settings',\n name: this.I18n.t('js.chart.tabs.graph_settings'),\n componentClass: WpGraphConfigurationSettingsTabComponent,\n },\n ];\n\n const queryTabs = this.configuration.queries.map((query) => ({\n id: query.id as string,\n name: this.I18n.t('js.work_packages.query.filters'),\n componentClass: WpGraphConfigurationFiltersTabComponent,\n }));\n\n return tabs.concat(queryTabs);\n }\n\n public loadForms():Promise {\n if (!this._formsPromise) {\n const formPromises = this\n .configuration\n .queries\n .map(\n (query) => firstValueFrom(this.apiv3Service.queries.form.load(query))\n .then(([form]) => {\n this._forms[query.id as string] = form;\n })\n .catch((error) => this.notificationService.handleRawError(error)),\n );\n\n this._formsPromise = Promise.all(formPromises);\n }\n\n return this._formsPromise;\n }\n\n public get chartType():string {\n return this._configuration.chartType;\n }\n\n public set chartType(type:string) {\n this._configuration.chartType = type;\n }\n\n public get queries():QueryResource[] {\n return this._configuration.queries;\n }\n\n public get chartOptions():ChartOptions {\n return this._configuration.chartOptions;\n }\n\n public get queryParams():WpGraphQueryParams[] {\n return this._configuration.queryParams;\n }\n}\n","
    \n \n \n \n \n
    \n","import { Component, Input, SimpleChanges } from '@angular/core';\nimport { WorkPackageTableConfiguration } from 'core-app/features/work-packages/components/wp-table/wp-table-configuration';\nimport { ChartOptions } from 'chart.js';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { GroupObject } from 'core-app/features/hal/resources/wp-collection-resource';\nimport DataLabelsPlugin from 'chartjs-plugin-datalabels';\n\nexport interface WorkPackageEmbeddedGraphDataset {\n label:string;\n queryProps:any;\n queryId?:number|string;\n groups?:GroupObject[];\n}\ninterface ChartDataSet {\n label:string;\n data:number[];\n}\n\n@Component({\n selector: 'op-wp-embedded-graph',\n templateUrl: './wp-embedded-graph.html',\n styleUrls: ['./wp-embedded-graph.component.sass'],\n})\nexport class WorkPackageEmbeddedGraphComponent {\n @Input() public datasets:WorkPackageEmbeddedGraphDataset[];\n\n @Input() public chartOptions:ChartOptions;\n\n @Input() chartType = 'bar';\n\n public configuration:WorkPackageTableConfiguration;\n\n public error:string|null = null;\n\n public chartHeight = '100%';\n\n public chartLabels:string[] = [];\n\n public chartData:ChartDataSet[] = [];\n\n public chartPlugins = [DataLabelsPlugin];\n\n public internalChartOptions:ChartOptions;\n\n public initialized = false;\n\n public text = {\n noResults: this.i18n.t('js.work_packages.no_results.title'),\n };\n\n constructor(readonly i18n:I18nService) {}\n\n ngOnChanges(changes:SimpleChanges) {\n if (changes.datasets) {\n this.setChartOptions();\n this.updateChartData();\n\n if (!changes.datasets.firstChange) {\n this.initialized = true;\n }\n } else if (changes.chartType) {\n this.setChartOptions();\n }\n }\n\n private updateChartData() {\n let uniqLabels = _.uniq(this.datasets.reduce((array, dataset) => {\n const groups = (dataset.groups || []).map((group) => group.value) as any;\n return array.concat(groups);\n }, [])) as string[];\n\n const labelCountMaps = this.datasets.map((dataset) => {\n const countMap = (dataset.groups || []).reduce((hash, group) => ({\n ...hash,\n [group.value]: group.count,\n }), {} as any);\n\n return {\n label: dataset.label,\n data: uniqLabels.map((label) => countMap[label] || 0),\n };\n });\n\n uniqLabels = uniqLabels.map((label) => {\n if (label === null) {\n return this.i18n.t('js.placeholders.default');\n }\n return label;\n });\n\n this.setHeight();\n\n // keep the array in order to update the labels\n this.chartLabels.length = 0;\n this.chartLabels.push(...uniqLabels);\n this.chartData.length = 0;\n this.chartData.push(...labelCountMaps);\n }\n\n protected setChartOptions() {\n const defaults:ChartOptions = {\n responsive: true,\n maintainAspectRatio: false,\n indexAxis: this.chartType === 'horizontalBar' ? 'y' : 'x',\n plugins: {\n legend: {\n // Only display legends if more than one dataset is provided.\n display: this.datasets.length > 1,\n },\n datalabels: {\n anchor: 'center',\n align: this.chartType === 'bar' ? 'top' : 'center',\n },\n },\n };\n\n this.internalChartOptions = {\n ...defaults,\n ...this.chartOptions,\n };\n }\n\n public get hasDataToDisplay() {\n return this.chartData.length > 0 && this.chartData.some((set) => set.data.length > 0);\n }\n\n public get mappedChartType():string {\n return this.chartType === 'horizontalBar' ? 'bar' : this.chartType;\n }\n\n private setHeight() {\n if (this.chartType === 'horizontalBar' && this.datasets && this.datasets[0]) {\n const labels:string[] = [];\n this.datasets.forEach((d) => d.groups!.forEach((g) => {\n if (!labels.includes(g.value)) {\n labels.push(g.value);\n }\n }));\n let height = labels.length * 40;\n\n if (this.datasets.length > 1) {\n // make some more room for the legend\n height += 40;\n }\n\n // some minimum height e.g. for the labels\n height += 40;\n\n this.chartHeight = `${height}px`;\n } else {\n this.chartHeight = '100%';\n }\n }\n}\n","import {\n ApplicationRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ComponentFactoryResolver,\n ElementRef,\n Inject,\n InjectionToken,\n Injector,\n OnDestroy,\n OnInit,\n Optional,\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 { ConfigurationService } from 'core-app/core/config/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 { LoadingIndicatorService } from 'core-app/core/loading-indicator/loading-indicator.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { WpGraphConfigurationService } from 'core-app/shared/components/work-package-graphs/configuration/wp-graph-configuration.service';\nimport { WpGraphConfiguration } from 'core-app/shared/components/work-package-graphs/configuration/wp-graph-configuration';\nimport { WorkPackageNotificationService } from 'core-app/features/work-packages/services/notifications/work-package-notification.service';\n\nexport const WpTableConfigurationModalPrependToken = new InjectionToken>('WpTableConfigurationModalPrependComponent');\n\n@Component({\n templateUrl: '../../../../features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WpGraphConfigurationModalComponent extends OpModalComponent implements OnInit, OnDestroy {\n public $element:HTMLElement;\n\n public text = {\n title: this.I18n.t('js.chart.modal_title'),\n closePopup: this.I18n.t('js.close_popup_title'),\n\n applyButton: this.I18n.t('js.modals.button_apply'),\n cancelButton: this.I18n.t('js.modals.button_cancel'),\n };\n\n public configuration:WpGraphConfiguration;\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 constructor(\n @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 notificationService:WorkPackageNotificationService,\n readonly cdRef:ChangeDetectorRef,\n readonly configurationService:ConfigurationService,\n readonly elementRef:ElementRef,\n readonly graphConfiguration:WpGraphConfigurationService,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit():void {\n this.$element = this.elementRef.nativeElement as HTMLElement;\n\n this.loadingIndicator.indicator('modal').promise = this.graphConfiguration.loadForms()\n .then(() => {\n this.tabPortalHost = new TabPortalOutlet(\n this.graphConfiguration.tabs,\n this.tabContentOutlet.nativeElement,\n this.componentFactoryResolver,\n this.appRef,\n this.injector,\n );\n\n const initialTabName = this.locals.initialTab;\n const initialTab = this.availableTabs.find((el) => el.id === initialTabName);\n this.cdRef.markForCheck();\n this.switchTo(initialTab || this.availableTabs[0]);\n });\n }\n\n ngOnDestroy():void {\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.configuration = this.graphConfiguration.configuration;\n\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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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, EventEmitter, Output,\n} from '@angular/core';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { WidgetAbstractMenuComponent } from 'core-app/shared/components/grids/widgets/menu/widget-abstract-menu.component';\nimport { WpGraphConfigurationModalComponent } from 'core-app/shared/components/work-package-graphs/configuration-modal/wp-graph-configuration.modal';\nimport { WpTableConfigurationModalComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\n\n@Directive()\nexport abstract class WidgetWpSetMenuComponent extends WidgetAbstractMenuComponent {\n protected configurationComponent:ComponentType;\n\n @InjectField() opModalService:OpModalService;\n\n @Output() onConfigured:EventEmitter = new EventEmitter();\n\n protected menuItemList = [\n this.removeItem,\n this.configureItem,\n ];\n\n protected get configureItem() {\n return {\n linkText: this.i18n.t('js.toolbar.settings.configure_view'),\n onClick: () => {\n this.opModalService\n .show(this.configurationComponent, this.injector, this.locals)\n .subscribe((modal) => modal.closingEvent.subscribe(() => {\n if (modal instanceof WpGraphConfigurationModalComponent) {\n this.onConfigured.emit(modal.configuration);\n }\n }));\n return true;\n },\n };\n }\n\n protected get locals() {\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 { Component } from '@angular/core';\nimport { WpGraphConfigurationModalComponent } from 'core-app/shared/components/work-package-graphs/configuration-modal/wp-graph-configuration.modal';\nimport { WidgetWpSetMenuComponent } from 'core-app/shared/components/grids/widgets/menu/wp-set-menu.component';\n\n@Component({\n selector: 'widget-wp-graph-menu',\n templateUrl: '../menu/widget-menu.component.html',\n})\nexport class WidgetWpGraphMenuComponent extends WidgetWpSetMenuComponent {\n protected configurationComponent = WpGraphConfigurationModalComponent;\n}\n","import {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, Injector, OnDestroy, OnInit,\n} from '@angular/core';\nimport { WorkPackageEmbeddedGraphDataset } from 'core-app/shared/components/work-package-graphs/embedded/wp-embedded-graph.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\nimport { ChartOptions } from 'chart.js';\nimport { WpGraphConfigurationService } from 'core-app/shared/components/work-package-graphs/configuration/wp-graph-configuration.service';\nimport { WpGraphConfiguration } from 'core-app/shared/components/work-package-graphs/configuration/wp-graph-configuration';\n\n@Component({\n selector: 'widget-wp-graph',\n templateUrl: './wp-graph.component.html',\n styleUrls: ['../wp-table/wp-table.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [WpGraphConfigurationService],\n})\nexport class WidgetWpGraphComponent extends AbstractWidgetComponent implements OnInit, OnDestroy {\n public datasets:WorkPackageEmbeddedGraphDataset[] = [];\n\n constructor(protected i18n:I18nService,\n protected injector:Injector,\n protected cdr:ChangeDetectorRef,\n protected readonly graphConfiguration:WpGraphConfigurationService) {\n super(i18n, injector);\n }\n\n ngOnInit() {\n this.initializeConfiguration();\n this.loadQueriesInitially();\n }\n\n public set chartType(type:string) {\n this.resource.options.chartType = type;\n }\n\n public updateGraph(config:any) {\n this.graphConfiguration.persistAndReload()\n .then(() => {\n this.repaint();\n\n if (this.resource.options.chartType !== this.graphConfiguration.chartType) {\n const changeset = this.setChangesetOptions({ chartType: this.graphConfiguration.chartType });\n\n this.resourceChanged.emit(changeset);\n }\n });\n }\n\n protected repaint() {\n this.datasets = this.graphConfiguration.datasets;\n this.cdr.detectChanges();\n }\n\n protected initializeConfiguration() {\n const ids = [];\n if (this.resource.options.queryId) {\n ids.push({ id: this.resource.options.queryId as string });\n }\n\n this.graphConfiguration.configuration = new WpGraphConfiguration(\n ids,\n this.resource.options.chartOptions as ChartOptions,\n this.resource.options.chartType as string,\n );\n }\n\n protected loadQueriesInitially() {\n this.graphConfiguration.ensureQueryAndLoad()\n .then(() => {\n if (!this.resource.options.queryId) {\n const changeset = this.setChangesetOptions({ queryId: this.graphConfiguration.queryParams[0].id });\n\n this.resourceChanged.emit(changeset);\n }\n this.repaint();\n });\n }\n\n public get chartOptions() {\n return this.graphConfiguration.chartOptions;\n }\n\n public get chartType() {\n return this.graphConfiguration.chartType;\n }\n}\n","\n\n \n \n\n\n\n\n","
    \n\n \n
    \n
    \n\n \n\n \n \n
    \n \n
    \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 Component, ComponentRef, HostListener, Input, OnDestroy, OnInit,\n} from '@angular/core';\nimport { GridResource } from 'core-app/features/hal/resources/grid-resource';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { GridWidgetsService } from 'core-app/shared/components/grids/widgets/widgets.service';\nimport { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\nimport { GridArea } from 'core-app/shared/components/grids/areas/grid-area';\nimport { GridMoveService } from 'core-app/shared/components/grids/grid/move.service';\nimport { GridDragAndDropService } from 'core-app/shared/components/grids/grid/drag-and-drop.service';\nimport { GridResizeService } from 'core-app/shared/components/grids/grid/resize.service';\nimport { GridAreaService } from 'core-app/shared/components/grids/grid/area.service';\nimport { GridAddWidgetService } from 'core-app/shared/components/grids/grid/add-widget.service';\nimport { GridRemoveWidgetService } from 'core-app/shared/components/grids/grid/remove-widget.service';\nimport { WidgetWpGraphComponent } from 'core-app/shared/components/grids/widgets/wp-graph/wp-graph.component';\nimport { GridWidgetArea } from 'core-app/shared/components/grids/areas/grid-widget-area';\nimport { BrowserDetector } from 'core-app/core/browser/browser-detector.service';\n\nexport interface WidgetRegistration {\n identifier:string;\n title:string;\n component:{ new (...args:any[]):AbstractWidgetComponent };\n properties?:Record;\n}\n\nexport const GRID_PROVIDERS = [\n GridAreaService,\n GridMoveService,\n GridDragAndDropService,\n GridResizeService,\n GridAddWidgetService,\n GridRemoveWidgetService,\n];\n\n@Component({\n templateUrl: './grid.component.html',\n selector: 'grid',\n})\nexport class GridComponent implements OnDestroy, OnInit {\n public uiWidgets:ComponentRef[] = [];\n\n public GRID_AREA_HEIGHT = 'auto';\n\n public GRID_GAP_DIMENSION = '20px';\n\n public component = WidgetWpGraphComponent;\n\n @Input() grid:GridResource;\n\n constructor(private sanitization:DomSanitizer,\n private widgetsService:GridWidgetsService,\n public drag:GridDragAndDropService,\n public resize:GridResizeService,\n public layout:GridAreaService,\n public add:GridAddWidgetService,\n public remove:GridRemoveWidgetService,\n readonly browserDetector:BrowserDetector) {\n }\n\n ngOnInit() {\n this.layout.gridResource = this.grid;\n }\n\n ngOnDestroy() {\n this.uiWidgets.forEach((widget) => widget.destroy());\n }\n\n @HostListener('window:keyup', ['$event'])\n handleKeyboardEvent(event:KeyboardEvent) {\n if (event.key !== 'Escape') {\n\n } else if (this.drag.currentlyDragging) {\n this.drag.abort();\n } else if (this.resize.currentlyResizing) {\n this.resize.abort();\n }\n }\n\n public widgetComponent(area:GridWidgetArea) {\n const { widget } = area;\n\n if (!widget) {\n return null;\n }\n\n const registration = this.widgetsService.registered.find((reg) => reg.identifier === widget.identifier);\n\n if (!registration) {\n // debugLog(`No widget registered with identifier ${widget.identifier}`);\n\n return null;\n }\n return registration.component;\n }\n\n public widgetComponentInput(area:GridWidgetArea) {\n return { resource: area.widget };\n }\n\n public widgetComponentOutput(area:GridWidgetArea) {\n return { resourceChanged: this.layout.saveWidgetChangeset.bind(this.layout) };\n }\n\n public get gridColumnStyle() {\n return this.gridStyle(this.layout.numColumns,\n `calc((100% - ${this.GRID_GAP_DIMENSION} * ${this.layout.numColumns + 1}) / ${this.layout.numColumns})`);\n }\n\n public get gridRowStyle() {\n return this.gridStyle(this.layout.numRows,\n this.GRID_AREA_HEIGHT);\n }\n\n public identifyGridArea(index:number, area:GridArea) {\n return area.guid;\n }\n\n public get isHeadersDisplayed() {\n return this.layout.isEditable;\n }\n\n public get isMobileDevice() {\n return this.browserDetector.isMobile;\n }\n\n private gridStyle(amount:number, itemStyle:string) {\n let style = '';\n for (let i = 0; i < amount; i++) {\n style += `${this.GRID_GAP_DIMENSION} ${itemStyle} `;\n }\n\n style += `${this.GRID_GAP_DIMENSION}`;\n\n return this.sanitization.bypassSecurityTrustStyle(style);\n }\n}\n","\n\n \n \n\n\n
    \n \n \n \n

    \n \n \n \n ({{ text.project }}: {{ document.project.name }})\n \n

    \n

    \n \n

    \n\n
    \n
    \n
    \n
    \n","import { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Injector,\n OnInit,\n SecurityContext,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CollectionResource } from 'core-app/features/hal/resources/collection-resource';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { DocumentResource } from '../../../../../../../../modules/documents/frontend/module/hal/resources/document-resource';\n\n@Component({\n templateUrl: './documents.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WidgetDocumentsComponent extends AbstractWidgetComponent implements OnInit {\n public text = {\n noResults: this.i18n.t('js.grid.widgets.documents.no_results'),\n project: this.i18n.t('js.label_project'),\n };\n\n public entries:DocumentResource[] = [];\n\n private entriesLoaded = false;\n\n constructor(readonly halResource:HalResourceService,\n readonly pathHelper:PathHelperService,\n readonly apiV3Service:ApiV3Service,\n readonly i18n:I18nService,\n readonly timezone:TimezoneService,\n readonly domSanitizer:DomSanitizer,\n protected readonly injector:Injector,\n readonly currentProject:CurrentProjectService,\n readonly cdr:ChangeDetectorRef) {\n super(i18n, injector);\n }\n\n ngOnInit() {\n this.halResource\n .get(this.documentsUrl)\n .subscribe((collection) => {\n this.entries = collection.elements as DocumentResource[];\n this.entriesLoaded = true;\n\n this.cdr.detectChanges();\n });\n }\n\n public get isEditable() {\n return false;\n }\n\n public documentPath(document:DocumentResource) {\n return `${this.pathHelper.appBasePath}/documents/${document.id}`;\n }\n\n public documentCreated(document:DocumentResource) {\n return this.timezone.formattedDatetime(document.createdAt);\n }\n\n public documentDescription(document:DocumentResource) {\n return this.domSanitizer.sanitize(SecurityContext.HTML, document.description.html);\n }\n\n public get noEntries() {\n return !this.entries.length && this.entriesLoaded;\n }\n\n public get documentsUrl() {\n const orders = JSON.stringify([['updated_at', 'desc']]);\n\n let url = `${this.apiV3Service.documents.toPath()}?sortBy=${orders}&pageSize=10`;\n\n if (this.currentProject.id) {\n const filters = JSON.stringify([{ project_id: { operator: '=', values: [this.currentProject.id.toString()] } }]);\n\n url += `&filters=${filters}`;\n }\n\n return url;\n }\n}\n","\n\n \n \n\n\n
    \n \n
      \n \n \n
      \n :\n \n
      \n
    \n

    \n \n \n","import { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, Injector, 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 { NewsResource } from 'core-app/features/hal/resources/news-resource';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\n\n@Component({\n templateUrl: './news.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WidgetNewsComponent extends AbstractWidgetComponent implements OnInit {\n public text = {\n at: this.i18n.t('js.grid.widgets.news.at'),\n noResults: this.i18n.t('js.grid.widgets.news.no_results'),\n addedBy: (news:NewsResource) => this.i18n.t('js.label_added_time_by',\n { author: this.newsAuthorName(news), age: this.newsCreated(news), authorLink: this.newsAuthorPath(news) }),\n };\n\n public entries:NewsResource[] = [];\n\n private entriesLoaded = false;\n\n constructor(\n\n readonly pathHelper:PathHelperService,\n readonly i18n:I18nService,\n protected readonly injector:Injector,\n readonly timezone:TimezoneService,\n readonly currentProject:CurrentProjectService,\n readonly apiV3Service:ApiV3Service,\n readonly cdr:ChangeDetectorRef,\n ) {\n super(i18n, injector);\n }\n\n ngOnInit() {\n this\n .apiV3Service\n .news\n .list(this.newsDmParams)\n .subscribe((collection) => this.setupNews(collection.elements));\n }\n\n public setupNews(news:any[]) {\n this.entries = news;\n this.entriesLoaded = true;\n this.cdr.detectChanges();\n }\n\n public get isEditable() {\n return false;\n }\n\n public newsPath(news:NewsResource) {\n return this.pathHelper.newsPath(news.id!);\n }\n\n public newsProjectPath(news:NewsResource) {\n return this.pathHelper.projectPath(idFromLink(news.project?.href));\n }\n\n public newsProjectName(news:NewsResource) {\n return news.project?.name;\n }\n\n public newsAuthorName(news:NewsResource) {\n return news.author?.name;\n }\n\n public newsAuthorPath(news:NewsResource) {\n return this.pathHelper.userPath(news.author?.id);\n }\n\n public newsCreated(news:NewsResource) {\n return this.timezone.formattedDatetime(news.createdAt);\n }\n\n public get noEntries() {\n return !this.entries.length && this.entriesLoaded;\n }\n\n private get newsDmParams() {\n const params:ApiV3ListParameters = {\n sortBy: [['created_at', 'desc']],\n pageSize: 3,\n };\n\n if (this.currentProject.id) {\n params.filters = [['project_id', '=', [this.currentProject.id]]];\n }\n\n return 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 { Component } from '@angular/core';\nimport { WpTableConfigurationModalComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/wp-table-configuration.modal';\nimport { WidgetWpSetMenuComponent } from 'core-app/shared/components/grids/widgets/menu/wp-set-menu.component';\n\n@Component({\n selector: 'widget-wp-table-menu',\n templateUrl: '../menu/widget-menu.component.html',\n})\nexport class WidgetWpTableMenuComponent extends WidgetWpSetMenuComponent {\n protected configurationComponent = WpTableConfigurationModalComponent;\n}\n","\n \n \n\n\n\n\n","import {\n ChangeDetectionStrategy,\n Component,\n Injector,\n OnInit,\n} from '@angular/core';\nimport { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\nimport { QueryFormResource } from 'core-app/features/hal/resources/query-form-resource';\nimport { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { WorkPackageTableConfiguration } from 'core-app/features/work-packages/components/wp-table/wp-table-configuration';\nimport {\n Observable,\n switchMap,\n} from 'rxjs';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { StateService } from '@uirouter/core';\nimport {\n map,\n skip,\n} from 'rxjs/operators';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport {\n WorkPackageIsolatedQuerySpaceDirective,\n} from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\n\n@Component({\n selector: 'widget-wp-table',\n templateUrl: './wp-table.component.html',\n styleUrls: ['./wp-table.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [WorkPackageIsolatedQuerySpaceDirective],\n})\nexport class WidgetWpTableComponent extends AbstractWidgetComponent implements OnInit {\n public queryId:string|null;\n\n private queryForm:QueryFormResource;\n\n public inFlight = false;\n\n public query$:Observable;\n\n public configuration:Partial = {\n actionsColumnEnabled: false,\n columnMenuEnabled: false,\n hierarchyToggleEnabled: true,\n contextMenuEnabled: false,\n };\n\n constructor(protected i18n:I18nService,\n protected readonly injector:Injector,\n protected urlParamsHelper:UrlParamsHelperService,\n protected readonly state:StateService,\n protected readonly querySpace:IsolatedQuerySpace,\n protected readonly apiV3Service:ApiV3Service) {\n super(i18n, injector);\n }\n\n ngOnInit():void {\n if (!this.resource.options.queryId) {\n this\n .createInitial()\n .subscribe((query) => {\n const changeset = this.setChangesetOptions({ queryId: query.id });\n\n this.resourceChanged.emit(changeset);\n\n this.queryId = query.id;\n });\n } else {\n this.queryId = this.resource.options.queryId as string;\n }\n\n this.query$ = this\n .querySpace\n .query\n .values$();\n\n this.query$\n .pipe(\n // 2 because ... well it is a magic number and works\n skip(2),\n this.untilDestroyed(),\n ).subscribe((query) => {\n this.ensureFormAndSaveQuery(query);\n });\n }\n\n public get widgetName() {\n return this.resource.options.name as string;\n }\n\n public static get identifier():string {\n return 'work_packages_table';\n }\n\n private ensureFormAndSaveQuery(query:QueryResource) {\n if (this.queryForm) {\n this.saveQuery(query, this.queryForm);\n } else {\n this\n .apiV3Service\n .queries\n .form\n .load(query)\n .subscribe(([form, _]) => {\n this.queryForm = form;\n this.saveQuery(query, form);\n });\n }\n }\n\n private saveQuery(query:QueryResource, form:QueryFormResource) {\n this.inFlight = true;\n\n this\n .apiV3Service\n .queries\n .id(query)\n .patch(query, this.queryForm)\n .subscribe(\n () => this.inFlight = false,\n () => this.inFlight = false,\n );\n }\n\n private createInitial():Observable {\n const projectIdentifier = this.state.params.projectPath as string;\n const initializationProps = this.resource.options.queryProps as { [key:string]:unknown };\n const queryProps = {\n pageSize: 0,\n ...initializationProps,\n };\n\n return this\n .apiV3Service\n .queries\n .form\n .loadWithParams(\n queryProps,\n undefined,\n projectIdentifier,\n this.queryCreationParams(),\n )\n .pipe(\n switchMap(([form, query]) => this\n .apiV3Service\n .queries\n .post(query, form)\n .pipe(\n map((resource:QueryResource) => {\n delete this.resource.options.queryProps;\n\n return resource;\n }),\n ),\n ),\n );\n }\n\n protected queryCreationParams() {\n // On the MyPage, the queries should be non public, on a project dashboard, they should be public.\n // This will not longer work, when global dashboards are implemented as the tables then need to\n // be public as well.\n const projectIdentifier = this.state.params.projectPath;\n\n return {\n hidden: true,\n public: !!projectIdentifier,\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { GridResource } from 'core-app/features/hal/resources/grid-resource';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { switchMap } from 'rxjs/operators';\nimport {\n Observable,\n of,\n} from 'rxjs';\n\n@Injectable()\nexport class GridInitializationService {\n constructor(\n readonly apiV3Service:ApiV3Service,\n readonly halResourceService:HalResourceService) {\n }\n\n // If a page with the current page exists (scoped to the current user by the backend)\n // that page will be used to initialized the grid.\n // If it does not exist, fetch the form and then create a new resource.\n // The created resource is then used to initialize the grid.\n public initialize(path:string):Observable {\n return this\n .apiV3Service\n .grids\n .list({ filters: [['scope', '=', [path]]] })\n .pipe(\n switchMap((collection) => {\n if (collection.total === 0) {\n return this.myPageForm(path);\n }\n return of(collection.elements[0]);\n }),\n );\n }\n\n private myPageForm(path:string):Observable {\n const payload = {\n _links: {\n scope: {\n href: path,\n },\n },\n };\n\n return this\n .apiV3Service\n .grids\n .form\n .post(payload)\n .pipe(\n switchMap((form) => {\n const source = form.payload.$source;\n const resource:GridResource = this.halResourceService.createHalResource(source);\n\n if (resource.widgets.length === 0) {\n resource.rowCount = 1;\n resource.columnCount = 1;\n }\n\n return this\n .apiV3Service\n .grids\n .post(resource, form.schema);\n }),\n );\n }\n}\n","import { Component } from '@angular/core';\nimport { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\nimport { WidgetChangeset } from 'core-app/shared/components/grids/widgets/widget-changeset';\n\n@Component({\n templateUrl: './wp-table-qs.component.html',\n styleUrls: ['./wp-table-qs.component.sass'],\n})\nexport class WidgetWpTableQuerySpaceComponent extends AbstractWidgetComponent {\n public onResourceChanged(changeset:WidgetChangeset) {\n this.resourceChanged.emit(changeset);\n }\n}\n","\n","import { QueryResource } from 'core-app/features/hal/resources/query-resource';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WorkPackageStatesInitializationService } from 'core-app/features/work-packages/components/wp-list/wp-states-initialization.service';\nimport { WpGraphConfigurationService } from 'core-app/shared/components/work-package-graphs/configuration/wp-graph-configuration.service';\n\nexport abstract class QuerySpacedTabComponent {\n constructor(readonly I18n:I18nService,\n readonly wpStatesInitialization:WorkPackageStatesInitializationService,\n readonly wpGraphConfiguration:WpGraphConfigurationService) {\n }\n\n protected initializeQuerySpace() {\n return this\n .wpGraphConfiguration\n .formFor(this.query)\n .then((form) => {\n this.wpStatesInitialization.initialize(this.query, this.query.results);\n this.wpStatesInitialization.updateStatesFromForm(this.query, form);\n });\n }\n\n protected abstract get query():QueryResource;\n}\n","\n","import { Component } 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 { 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 { WpGraphConfigurationService } from 'core-app/shared/components/work-package-graphs/configuration/wp-graph-configuration.service';\nimport { WorkPackageStatesInitializationService } from 'core-app/features/work-packages/components/wp-list/wp-states-initialization.service';\nimport { QuerySpacedTabComponent } from 'core-app/shared/components/work-package-graphs/configuration-modal/tabs/abstract-query-spaced-tab.component';\nimport { WorkPackageFiltersService } from 'core-app/features/work-packages/components/filters/wp-filters/wp-filters.service';\n\n@Component({\n selector: 'op-filters-tab-inner',\n templateUrl: './filters-tab-inner.component.html',\n})\nexport class WpGraphConfigurationFiltersTabInnerComponent extends QuerySpacedTabComponent implements TabComponent {\n public filters:QueryFilterInstanceResource[] = [];\n\n public text = {\n multiSelectLabel: this.I18n.t('js.work_packages.label_column_multiselect'),\n };\n\n constructor(readonly I18n:I18nService,\n readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly wpFiltersService:WorkPackageFiltersService,\n readonly wpStatesInitialization:WorkPackageStatesInitializationService,\n readonly wpGraphConfiguration:WpGraphConfigurationService) {\n super(I18n, wpStatesInitialization, wpGraphConfiguration);\n }\n\n ngOnInit() {\n this.initializeQuerySpace()\n .then(() => {\n this.wpTableFilters\n .onReady()\n .then(() => {\n this.filters = this.wpTableFilters.current;\n });\n });\n }\n\n public onSave() {\n if (this.filters) {\n this.wpTableFilters.replaceIfComplete(this.filters);\n this.wpTableFilters.applyToQuery(this.wpGraphConfiguration.queries[0]);\n }\n }\n\n protected get query() {\n return this.wpGraphConfiguration.queries[0];\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 { WorkPackageViewGroupByService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-group-by.service';\nimport { Component } from '@angular/core';\nimport { WpGraphConfigurationService } from 'core-app/shared/components/work-package-graphs/configuration/wp-graph-configuration.service';\nimport { WorkPackageStatesInitializationService } from 'core-app/features/work-packages/components/wp-list/wp-states-initialization.service';\nimport { TabComponent } from 'core-app/features/work-packages/components/wp-table/configuration-modal/tab-portal-outlet';\nimport { QuerySpacedTabComponent } from 'core-app/shared/components/work-package-graphs/configuration-modal/tabs/abstract-query-spaced-tab.component';\nimport { QueryGroupByResource } from 'core-app/features/hal/resources/query-group-by-resource';\n\ninterface OpChartType {\n identifier:string;\n label:string;\n indexAxis?:'x'|'y';\n}\n\n@Component({\n selector: 'op-settings-tab-inner',\n templateUrl: './settings-tab-inner.component.html',\n})\nexport class WpGraphConfigurationSettingsTabInnerComponent extends QuerySpacedTabComponent implements TabComponent {\n // Grouping\n public availableGroups:QueryGroupByResource[] = [];\n\n public availableChartTypes:OpChartType[];\n\n public currentChartType:OpChartType;\n\n public text = {\n group_by: this.I18n.t('js.chart.axis_criteria'),\n chart_type: this.I18n.t('js.chart.type'),\n };\n\n constructor(readonly I18n:I18nService,\n readonly wpTableGroupBy:WorkPackageViewGroupByService,\n readonly wpStatesInitialization:WorkPackageStatesInitializationService,\n readonly wpGraphConfiguration:WpGraphConfigurationService) {\n super(I18n, wpStatesInitialization, wpGraphConfiguration);\n }\n\n public onSave() {\n this.wpGraphConfiguration.chartType = this.currentChartType.identifier;\n this.wpGraphConfiguration.queries.forEach((query) => {\n this.wpTableGroupBy.applyToQuery(query);\n });\n }\n\n public get currentGroup() {\n return this.wpTableGroupBy.current!;\n }\n\n public set currentGroup(value:QueryGroupByResource) {\n this.wpTableGroupBy.update(value);\n }\n\n ngOnInit() {\n this\n .initializeQuerySpace()\n .then(() => {\n this.wpTableGroupBy\n .onReady()\n .then(() => {\n this.initializeAvailableGroups();\n this.initializeAvailableChartType();\n });\n });\n }\n\n private initializeAvailableGroups() {\n let { available } = this.wpTableGroupBy;\n // the object in current is not identical to one in available. We therefore\n // have to do this by hand to be able to just use ngModel later.\n const { current } = this.wpTableGroupBy;\n\n if (current) {\n available = available.filter((group) => group.id !== current.id);\n available = available.concat(current);\n }\n\n this.availableGroups = _.sortBy(available, 'name');\n }\n\n private initializeAvailableChartType() {\n this.availableChartTypes = _.sortBy([\n { identifier: 'horizontalBar', label: this.I18n.t('js.chart.types.horizontal_bar') },\n { identifier: 'bar', label: this.I18n.t('js.chart.types.bar') },\n { identifier: 'line', label: this.I18n.t('js.chart.types.line') },\n { identifier: 'pie', label: this.I18n.t('js.chart.types.pie') },\n { identifier: 'doughnut', label: this.I18n.t('js.chart.types.doughnut') },\n { identifier: 'radar', label: this.I18n.t('js.chart.types.radar') },\n { identifier: 'polarArea', label: this.I18n.t('js.chart.types.polar_area') },\n ], 'label');\n\n this.currentChartType = this.availableChartTypes.find((type) => type.identifier === this.wpGraphConfiguration.configuration.chartType) || this.availableChartTypes[0];\n }\n\n protected get query() {\n return this.wpGraphConfiguration.queries[0];\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 Input,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport {\n WorkPackageEmbeddedGraphComponent,\n WorkPackageEmbeddedGraphDataset,\n} from 'core-app/shared/components/work-package-graphs/embedded/wp-embedded-graph.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ChartOptions } from 'chart.js';\nimport { WpGraphConfigurationService } from 'core-app/shared/components/work-package-graphs/configuration/wp-graph-configuration.service';\nimport {\n WpGraphConfiguration,\n WpGraphQueryParams,\n} from 'core-app/shared/components/work-package-graphs/configuration/wp-graph-configuration';\n\nexport const wpOverviewGraphSelector = 'wp-overview-graph';\n\n@Component({\n selector: wpOverviewGraphSelector,\n templateUrl: './wp-overview-graph.template.html',\n styleUrls: ['./wp-overview-graph.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n WpGraphConfigurationService,\n ],\n})\n\nexport class WorkPackageOverviewGraphComponent implements OnInit {\n @Input() additionalFilter:any;\n\n @ViewChild('wpEmbeddedGraphMulti') private embeddedGraphMulti:WorkPackageEmbeddedGraphComponent;\n\n @ViewChild('wpEmbeddedGraphSingle') private embeddedGraphSingle:WorkPackageEmbeddedGraphComponent;\n\n @Input() groupBy = 'status';\n\n @Input() chartOptions:ChartOptions = { maintainAspectRatio: false };\n\n public datasets:WorkPackageEmbeddedGraphDataset[] = [];\n\n public displayModeSingle = true;\n\n public availableGroupBy:{ label:string, key:string }[];\n\n public error:string|null = null;\n\n constructor(readonly elementRef:ElementRef,\n readonly I18n:I18nService,\n readonly graphConfigurationService:WpGraphConfigurationService,\n protected readonly cdr:ChangeDetectorRef) {\n this.availableGroupBy = [{ label: I18n.t('js.work_packages.properties.category'), key: 'category' },\n { label: I18n.t('js.work_packages.properties.type'), key: 'type' },\n { label: I18n.t('js.work_packages.properties.status'), key: 'status' },\n { label: I18n.t('js.work_packages.properties.priority'), key: 'priority' },\n { label: I18n.t('js.work_packages.properties.author'), key: 'author' },\n { label: I18n.t('js.work_packages.properties.assignee'), key: 'assignee' }];\n }\n\n ngOnInit() {\n const element = this.elementRef.nativeElement;\n this.additionalFilter = JSON.parse(element.getAttribute('additional-filter'));\n\n this.setQueryProps();\n }\n\n public setQueryProps() {\n this.datasets = [];\n\n const params = this.graphParams;\n\n this.graphConfigurationService.configuration = new WpGraphConfiguration(params, {}, 'horizontalBar');\n\n // 'finally' was not available yet so the code for the change detection is duplicated\n this\n .graphConfigurationService\n .reloadQueries()\n .then(() => {\n this.datasets = this.sortedDatasets(this.graphConfigurationService.datasets, params);\n\n this.cdr.detectChanges();\n })\n .catch(() => {\n this.error = this.I18n.t('js.chart.errors.could_not_load');\n\n this.cdr.detectChanges();\n });\n }\n\n public get graphParams() {\n const params = [];\n\n if (this.groupBy === 'status') {\n this.displayModeSingle = true;\n\n params.push({ name: this.I18n.t('js.label_all'), props: this.propsBoth });\n } else {\n this.displayModeSingle = false;\n\n params.push({ name: this.I18n.t('js.label_open_work_packages'), props: this.propsOpen });\n params.push({ name: this.I18n.t('js.label_closed_work_packages'), props: this.propsClosed });\n }\n\n return params;\n }\n\n public sortedDatasets(datasets:WorkPackageEmbeddedGraphDataset[], params:WpGraphQueryParams[]) {\n const sortingArray = params.map((x) => x.name);\n\n return datasets.slice().sort((a, b) => sortingArray.indexOf(a.label) - sortingArray.indexOf(b.label));\n }\n\n public get propsBoth() {\n return this.baseProps();\n }\n\n public get propsOpen() {\n return this.baseProps({ status: { operator: 'o', values: [] } });\n }\n\n public get propsClosed() {\n return this.baseProps({ status: { operator: 'c', values: [] } });\n }\n\n private baseProps(filter?:any) {\n const filters = [{ subprojectId: { operator: '*', values: [] } }];\n\n if (filter) {\n filters.push(filter);\n }\n\n if (this.additionalFilter) {\n filters.push(this.additionalFilter);\n }\n\n return {\n 'columns[]': [],\n filters: JSON.stringify(filters),\n group_by: this.groupBy,\n pageSize: 0,\n };\n }\n\n public get displaySingle() {\n return this.displayModeSingle;\n }\n\n public get displayMulti() {\n return !this.displayModeSingle;\n }\n\n private get currentGraph() {\n if (this.displaySingle) {\n return this.embeddedGraphSingle;\n }\n return this.embeddedGraphMulti;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { OpSharedModule } from 'core-app/shared/shared.module';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport { OpenprojectWorkPackagesModule } from 'core-app/features/work-packages/openproject-work-packages.module';\nimport { WpGraphConfigurationModalComponent } from 'core-app/shared/components/work-package-graphs/configuration-modal/wp-graph-configuration.modal';\nimport { WpGraphConfigurationFiltersTabComponent } from 'core-app/shared/components/work-package-graphs/configuration-modal/tabs/filters-tab.component';\nimport { WpGraphConfigurationSettingsTabComponent } from 'core-app/shared/components/work-package-graphs/configuration-modal/tabs/settings-tab.component';\nimport { WpGraphConfigurationFiltersTabInnerComponent } from 'core-app/shared/components/work-package-graphs/configuration-modal/tabs/filters-tab-inner.component';\nimport { WpGraphConfigurationSettingsTabInnerComponent } from 'core-app/shared/components/work-package-graphs/configuration-modal/tabs/settings-tab-inner.component';\nimport { WorkPackageEmbeddedGraphComponent } from 'core-app/shared/components/work-package-graphs/embedded/wp-embedded-graph.component';\nimport { WorkPackageOverviewGraphComponent } from 'core-app/shared/components/work-package-graphs/overview/wp-overview-graph.component';\nimport * as ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { OpenprojectTabsModule } from 'core-app/shared/components/tabs/openproject-tabs.module';\nimport { NgChartsModule } from 'ng2-charts';\n\n@NgModule({\n imports: [\n // Commons\n OpSharedModule,\n OpenprojectModalModule,\n\n OpenprojectWorkPackagesModule,\n\n NgChartsModule,\n OpenprojectTabsModule,\n ],\n declarations: [\n // Modals\n WpGraphConfigurationModalComponent,\n WpGraphConfigurationFiltersTabComponent,\n WpGraphConfigurationFiltersTabInnerComponent,\n WpGraphConfigurationSettingsTabComponent,\n WpGraphConfigurationSettingsTabInnerComponent,\n\n // Embedded graphs\n WorkPackageEmbeddedGraphComponent,\n // Work package graphs on version page\n WorkPackageOverviewGraphComponent,\n\n ],\n exports: [\n // Modals\n WpGraphConfigurationModalComponent,\n\n // Embedded graphs\n WorkPackageEmbeddedGraphComponent,\n WorkPackageOverviewGraphComponent,\n ],\n})\nexport class OpenprojectWorkPackageGraphsModule {\n constructor() {\n // By this seemingly useless statement, the plugin is registered with Chart.\n // Simply importing it will have it removed probably by angular tree shaking\n // so it will not be active. The current default of the plugin is to be enabled\n // by default. This will be changed in the future:\n // https://github.com/chartjs/chartjs-plugin-datalabels/issues/42\n //\n // eslint-ignore-next-line @typescript-eslint/no-unused-expressions\n ChartDataLabels;\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, Injector, OnInit,\n} from '@angular/core';\nimport { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { Observable } from 'rxjs';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Component({\n templateUrl: './project-description.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n HalResourceEditingService,\n ],\n})\nexport class WidgetProjectDescriptionComponent extends AbstractWidgetComponent implements OnInit {\n public project$:Observable;\n\n constructor(protected readonly i18n:I18nService,\n protected readonly injector:Injector,\n protected readonly apiV3Service:ApiV3Service,\n protected readonly currentProject:CurrentProjectService,\n protected readonly cdRef:ChangeDetectorRef) {\n super(i18n, injector);\n }\n\n ngOnInit():void {\n if (this.currentProject.id) {\n this.project$ = this\n .apiV3Service\n .projects\n .id(this.currentProject.id)\n .get();\n this.cdRef.detectChanges();\n }\n }\n\n public get isEditable():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 { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\n\n@Component({\n templateUrl: './wp-overview.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WidgetWpOverviewComponent extends AbstractWidgetComponent {\n}\n","\n\n \n \n\n\n\n\n","import { EditFieldHandler } from 'core-app/shared/components/fields/edit/editing-portal/edit-field-handler';\nimport { ElementRef, Injectable, Injector } from '@angular/core';\nimport { IFieldSchema } from 'core-app/shared/components/fields/field.base';\nimport { BehaviorSubject } from 'rxjs';\nimport { GridWidgetResource } from 'core-app/features/hal/resources/grid-widget-resource';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\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 { ICKEditorContext } from 'core-app/shared/components/editor/components/ckeditor/ckeditor.types';\nimport { GridResource } from 'core-app/features/hal/resources/grid-resource';\n\n@Injectable()\nexport class CustomTextEditFieldService extends EditFieldHandler {\n public fieldName = 'text';\n\n public valueChanged$:BehaviorSubject;\n\n public changeset:ResourceChangeset;\n\n public active:boolean;\n\n constructor(protected elementRef:ElementRef,\n protected injector:Injector,\n protected halResource:HalResourceService,\n protected schemaCache:SchemaCacheService) {\n super();\n }\n\n onFocusOut():void {\n // interface\n }\n\n public initialize(value:GridWidgetResource) {\n this.initializeChangeset(value);\n this.valueChanged$ = new BehaviorSubject(value.options.text as string);\n }\n\n public reinitialize(value:GridWidgetResource) {\n this.initializeChangeset(value);\n }\n\n /**\n * Handle saving the text\n */\n public handleUserSubmit():Promise {\n return this.update();\n }\n\n public reset(withText = '') {\n let resetText:string = withText;\n if (withText.length > 0) {\n resetText += '\\n';\n }\n\n this.changeset.setValue(this.fieldName, { raw: resetText });\n }\n\n public get schema():IFieldSchema {\n return {\n name: I18n.t('js.grid.widgets.custom_text.title'),\n writable: true,\n required: false,\n type: 'Formattable',\n hasDefault: false,\n };\n }\n\n private async update() {\n return this\n .onSubmit()\n .then(() => {\n this.valueChanged$.next(this.rawText);\n this.deactivate();\n });\n }\n\n public get rawText() {\n return _.get(this.textValue, 'raw', '');\n }\n\n public get htmlText() {\n return _.get(this.textValue, 'html', '');\n }\n\n public get textValue() {\n return this.changeset.value(this.fieldName);\n }\n\n public handleUserCancel() {\n this.deactivate();\n }\n\n deactivate():void {\n this.changeset.clear();\n this.active = false;\n }\n\n activate() {\n this.active = true;\n }\n\n get inEditMode():boolean {\n return false;\n }\n\n get inFlight():boolean {\n return this.changeset.inFlight;\n }\n\n focus():void {\n const trigger = this.elementRef.nativeElement.querySelector('.inplace-editing--trigger-container');\n if (trigger) {\n trigger.focus();\n }\n }\n\n setErrors():void {\n // interface\n }\n\n handleUserKeydown():void {\n // interface\n }\n\n isChanged():boolean {\n return !this.changeset.isEmpty();\n }\n\n stopPropagation():boolean {\n return false;\n }\n\n /**\n * Mimiks having a HalResource for the sake of the Changeset.\n * @param value\n */\n private initializeChangeset(value:GridWidgetResource) {\n const schemaHref = 'customtext-schema';\n const grid:GridResource = value.grid;\n const resourceSource:HalSource = {\n text: value.options.text,\n getEditorContext: () => ({\n type: 'full',\n macros: 'resource',\n } as ICKEditorContext),\n canAddAttachments: value.grid.canAddAttachments as boolean,\n _links: {\n attachments: grid.attachments as { href?:string },\n schema: {\n href: schemaHref,\n },\n },\n };\n\n if (grid.prepareAttachment as { href?:string }) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access\n resourceSource._links.prepareAttachment = grid.prepareAttachment;\n }\n\n const resource = this.halResource.createHalResource(resourceSource, true);\n\n const schemaSource = {\n text: this.schema,\n _links: {\n self: { href: schemaHref },\n },\n };\n\n const schema:SchemaResource = this.halResource.createHalResource(schemaSource, true);\n\n this.schemaCache.update(resource, schema);\n\n this.changeset = new ResourceChangeset(resource);\n }\n}\n","\n\n \n \n\n\n\n \n
    \n \n
    \n
    \n\n
    \n
    \n \n\n \n \n {{ text.attachments }}\n \n \n \n\n \n \n \n \n\n \n \n \n
    \n
    \n\n","import { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\nimport {\n ApplicationRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Injector,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { CustomTextEditFieldService } from 'core-app/shared/components/grids/widgets/custom-text/custom-text-edit-field.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { filter } from 'rxjs/operators';\nimport { GridAreaService } from 'core-app/shared/components/grids/grid/area.service';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { DynamicBootstrapper } from 'core-app/core/setup/globals/dynamic-bootstrapper';\n\n@Component({\n templateUrl: './custom-text.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n CustomTextEditFieldService,\n ],\n})\nexport class WidgetCustomTextComponent extends AbstractWidgetComponent implements OnInit, OnChanges, OnDestroy {\n protected currentRawText:string;\n\n public customText:SafeHtml;\n\n public text = {\n attachments: this.I18n.t('js.label_attachments'),\n };\n\n @ViewChild('displayContainer') readonly displayContainer:ElementRef;\n\n constructor(\n protected I18n:I18nService,\n protected injector:Injector,\n public handler:CustomTextEditFieldService,\n protected cdr:ChangeDetectorRef,\n protected sanitization:DomSanitizer,\n protected appRef:ApplicationRef,\n protected layout:GridAreaService,\n ) {\n super(I18n, injector);\n }\n\n ngOnInit():void {\n this.setupVariables(true);\n\n this\n .handler\n .valueChanged$\n .pipe(\n this.untilDestroyed(),\n filter((value) => value !== this.resource.options.text),\n ).subscribe((newText) => {\n const changeset = this.setChangesetOptions({ text: { raw: newText } });\n this.resourceChanged.emit(changeset);\n });\n }\n\n ngOnChanges(changes:SimpleChanges):void {\n if (changes.resource.currentValue.options.text.raw !== this.currentRawText) {\n this.setupVariables();\n\n this.cdr.detectChanges();\n }\n }\n\n public activate(event:MouseEvent) {\n // Prevent opening the edit mode if a link was clicked\n if (this.clickedElementIsLinkWithinDisplayContainer(event)) {\n return;\n }\n\n // Load the attachments so that they are displayed in the list.\n // Once that is done, we can show the edit form.\n void this.resource.grid.updateAttachments().then(() => {\n this.handler.activate();\n this.cdr.detectChanges();\n });\n }\n\n public get placeholderText() {\n return this.I18n.t('js.grid.widgets.work_packages_overview.placeholder');\n }\n\n public get inplaceEditClasses() {\n let classes = 'inplace-editing--container inline-edit--display-field -editable';\n\n if (this.textEmpty) {\n classes += ' -placeholder';\n }\n\n return classes;\n }\n\n public get schema() {\n return this.handler.schema;\n }\n\n public get changeset() {\n return this.handler.changeset;\n }\n\n public get active() {\n return this.handler.active;\n }\n\n public get textEmpty() {\n return !this.currentRawText.length;\n }\n\n public get isTextEditable() {\n return this.layout.isEditable;\n }\n\n private setupVariables(initial = false) {\n this.memorizeRawText();\n if (initial) {\n this.handler.initialize(this.resource);\n } else {\n this.handler.reinitialize(this.resource);\n }\n this.memorizeCustomText();\n }\n\n private memorizeRawText() {\n this.currentRawText = (this.resource.options.text as HalResource).raw;\n }\n\n private memorizeCustomText() {\n this.customText = this.sanitization.bypassSecurityTrustHtml(this.handler.htmlText);\n\n // Allow embeddable rendered content\n setTimeout(() => {\n DynamicBootstrapper.bootstrapOptionalEmbeddable(this.appRef, this.displayContainer.nativeElement);\n }, 100);\n }\n\n private clickedElementIsLinkWithinDisplayContainer(event:any) {\n return this.displayContainer.nativeElement.contains(event.target.closest('a,macro'));\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2022 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 OnInit,\n} from '@angular/core';\nimport { WidgetAbstractMenuComponent } from 'core-app/shared/components/grids/widgets/menu/widget-abstract-menu.component';\nimport { OpContextMenuItem } from 'core-app/shared/components/op-context-menu/op-context-menu.types';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { take } from 'rxjs/operators';\nimport { firstValueFrom } from 'rxjs';\n\n@Component({\n selector: 'op-widget-project-details-menu',\n templateUrl: '../menu/widget-menu.component.html',\n})\nexport class WidgetProjectDetailsMenuComponent extends WidgetAbstractMenuComponent implements OnInit {\n @InjectField() pathHelper:PathHelperService;\n\n @InjectField() currentProject:CurrentProjectService;\n\n @InjectField() currentUser:CurrentUserService;\n\n private capabilityPromise:Promise;\n\n ngOnInit():void {\n this.capabilityPromise = firstValueFrom(\n this.currentUser\n .hasCapabilities$('activities/read', this.currentProject.id)\n .pipe(take(1)),\n );\n }\n\n public get menuItems() {\n return async () => {\n const items = [\n this.removeItem,\n ];\n if (await this.capabilityPromise) {\n items.push(this.projectActivityLinkItem);\n }\n return items;\n };\n }\n\n protected get projectActivityLinkItem():OpContextMenuItem {\n const projectActivityPath = this.pathHelper.projectActivityPath(this.currentProject.identifier as string);\n return {\n linkText: this.i18n.t('js.project.details_activity'),\n href: `${projectActivityPath}?event_types[]=project_attributes`,\n };\n }\n}\n","\n\n \n \n\n\n
    \n \n
    \n \n
    \n {{ cf.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 ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Injector,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport { Observable } from 'rxjs';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { SchemaAttributeObject } from 'core-app/features/hal/resources/schema-attribute-object';\n\n@Component({\n templateUrl: './project-details.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n HalResourceEditingService,\n ],\n})\nexport class WidgetProjectDetailsComponent extends AbstractWidgetComponent implements OnInit {\n @ViewChild('contentContainer', { static: true }) readonly contentContainer:ElementRef;\n\n public customFields:{ key:string, label:string }[] = [];\n\n public project$:Observable;\n\n constructor(protected readonly i18n:I18nService,\n protected readonly injector:Injector,\n protected readonly apiV3Service:ApiV3Service,\n protected readonly currentProject:CurrentProjectService,\n protected readonly cdRef:ChangeDetectorRef) {\n super(i18n, injector);\n }\n\n ngOnInit():void {\n this.loadAndRender();\n if (this.currentProject.id) {\n this.project$ = this\n .apiV3Service\n .projects\n .id(this.currentProject.id)\n .requireAndStream();\n }\n }\n\n public get isEditable():boolean {\n return false;\n }\n\n private loadAndRender():void {\n void Promise.all([\n this.loadProjectSchema(),\n ])\n .then(([schema]) => {\n this.setCustomFields(schema);\n });\n }\n\n private loadProjectSchema():Promise {\n return this\n .apiV3Service\n .projects\n .schema\n .get()\n .toPromise();\n }\n\n private setCustomFields(schema:SchemaResource) {\n Object.entries(schema).forEach(([key, keySchema]) => {\n if (/customField\\d+/.exec(key)) {\n this.customFields.push({ key, label: (keySchema as SchemaAttributeObject).name });\n }\n });\n\n this.cdRef.detectChanges();\n }\n}\n","import {\n ChangeDetectorRef,\n Directive,\n Injector,\n OnInit,\n} from '@angular/core';\nimport { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { TimeEntryEditService } from 'core-app/shared/components/time_entries/edit/edit.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { FilterOperator } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';\nimport { TimeEntryResource } from 'core-app/features/hal/resources/time-entry-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { SchemaResource } from 'core-app/features/hal/resources/schema-resource';\nimport {\n firstValueFrom,\n Observable,\n} from 'rxjs';\n\n@Directive()\nexport abstract class WidgetTimeEntriesListComponent extends AbstractWidgetComponent implements OnInit {\n public text = {\n edit: this.i18n.t('js.button_edit'),\n delete: this.i18n.t('js.button_delete'),\n confirmDelete: {\n text: this.i18n.t('js.modals.destroy_time_entry.text'),\n title: this.i18n.t('js.modals.destroy_time_entry.title'),\n },\n noResults: this.i18n.t('js.grid.widgets.time_entries_list.no_results'),\n };\n\n public entries:TimeEntryResource[] = [];\n\n public schema:SchemaResource;\n\n private entriesLoaded = false;\n\n public rows:{ date:string, sum?:string, entry?:TimeEntryResource }[] = [];\n\n @InjectField() public readonly timeEntryEditService:TimeEntryEditService;\n\n @InjectField() public readonly apiV3Service:ApiV3Service;\n\n constructor(readonly injector:Injector,\n readonly timezone:TimezoneService,\n readonly i18n:I18nService,\n readonly pathHelper:PathHelperService,\n readonly confirmDialog:ConfirmDialogService,\n protected readonly cdr:ChangeDetectorRef) {\n super(i18n, injector);\n }\n\n ngOnInit():void {\n this\n .apiV3Service\n .time_entries\n .list({ filters: this.dmFilters(), pageSize: 500 })\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n .subscribe(async (collection) => {\n this.buildEntries(collection.elements);\n\n if (collection.count > 0) {\n this.schema = await firstValueFrom(this.loadSchema());\n }\n\n this.entriesLoaded = true;\n\n this.cdr.detectChanges();\n });\n }\n\n public get total():string {\n const duration = this.entries.reduce((current, entry) => current + this.timezone.toHours(entry.hours), 0);\n\n return this.i18n.t('js.units.hour', { count: duration });\n }\n\n public get anyEntries():boolean {\n return !!this.entries.length;\n }\n\n public activityName(entry:TimeEntryResource):string {\n return entry.activity.name;\n }\n\n public projectName(entry:TimeEntryResource):string {\n return entry.project.name;\n }\n\n public workPackageName(entry:TimeEntryResource):string {\n return `#${entry.workPackage.id as string}: ${entry.workPackage.name}`;\n }\n\n public workPackageId(entry:TimeEntryResource):string {\n return entry.workPackage.id as string;\n }\n\n public comment(entry:TimeEntryResource):string|undefined {\n return entry.comment && entry.comment.raw;\n }\n\n public hours(entry:TimeEntryResource):string {\n return this.formatNumber(this.timezone.toHours(entry.hours));\n }\n\n public workPackagePath(entry:TimeEntryResource):string {\n return this.pathHelper.workPackagePath(idFromLink(entry.workPackage.href));\n }\n\n public get isEditable():boolean {\n return false;\n }\n\n public editTimeEntry(entry:TimeEntryResource):void {\n this\n .apiV3Service\n .time_entries\n .id(entry.id as string)\n .get()\n .subscribe((loadedEntry) => {\n this.timeEntryEditService\n .edit(loadedEntry)\n .then((changedEntry) => {\n const oldEntryIndex:number = this.entries.findIndex((el) => el.id === changedEntry.entry.id);\n const newEntries = this.entries;\n newEntries[oldEntryIndex] = changedEntry.entry;\n\n this.buildEntries(newEntries);\n })\n .catch(() => {\n // User canceled the modal\n });\n });\n }\n\n public deleteIfConfirmed(event:Event, entry:TimeEntryResource):void {\n event.preventDefault();\n this.confirmDialog.confirm({\n text: this.text.confirmDelete,\n closeByEscape: true,\n showClose: true,\n closeByDocument: true,\n passedData: [\n `#${idFromLink(entry.workPackage?.href)} ${entry.workPackage?.name}`,\n `${this.i18n.t(\n 'js.units.hour',\n { count: this.timezone.toHours(entry.hours) },\n )} (${entry.activity?.name})`,\n ],\n dangerHighlighting: true,\n }).then(() => {\n void entry.delete().then(() => {\n const newEntries = this.entries.filter((anEntry) => entry.id !== anEntry.id);\n\n this.buildEntries(newEntries);\n });\n })\n .catch(() => {\n // nothing\n });\n }\n\n protected abstract dmFilters():Array<[string, FilterOperator, [string]]>;\n\n private buildEntries(entries:TimeEntryResource[]) {\n this.entries = entries;\n const sumsByDateSpent:{ [key:string]:number } = {};\n\n entries.forEach((entry) => {\n const date = entry.spentOn;\n\n if (!sumsByDateSpent[date]) {\n sumsByDateSpent[date] = 0;\n }\n\n sumsByDateSpent[date] += this.timezone.toHours(entry.hours);\n });\n\n const sortedEntries = entries.sort((a, b) => b.spentOn.localeCompare(a.spentOn));\n\n this.rows = [];\n let currentDate:string|null = null;\n sortedEntries.forEach((entry) => {\n if (entry.spentOn !== currentDate) {\n currentDate = entry.spentOn;\n this.rows.push({\n date: this.timezone.formattedDate(currentDate),\n sum: this.formatNumber(sumsByDateSpent[currentDate]),\n });\n }\n\n this.rows.push({ date: currentDate, entry });\n });\n // entries\n }\n\n protected formatNumber(value:number):string {\n return this.i18n.toNumber(value, { precision: 2 });\n }\n\n public get noEntries():boolean {\n return !this.entries.length && this.entriesLoaded;\n }\n\n private loadSchema():Observable {\n return this\n .apiV3Service\n .time_entries\n .schema\n .get();\n }\n}\n","\n\n \n \n\n\n\n\n\n\n
    \n

    Total:

    \n
    \n\n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n \n \n \n {{projectName(item.entry)}} - \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n
    \n","import {\n ChangeDetectorRef,\n Component,\n Injector,\n OnInit,\n} from '@angular/core';\nimport { WidgetTimeEntriesListComponent } from 'core-app/shared/components/grids/widgets/time-entries/list/time-entries-list.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { FilterOperator } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';\nimport { TimeEntryEditService } from 'core-app/shared/components/time_entries/edit/edit.service';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\n\n@Component({\n templateUrl: '../list/time-entries-list.component.html',\n providers: [\n HalResourceEditingService,\n TimeEntryEditService,\n ],\n})\nexport class WidgetTimeEntriesProjectComponent extends WidgetTimeEntriesListComponent implements OnInit {\n constructor(readonly injector:Injector,\n readonly timezone:TimezoneService,\n readonly i18n:I18nService,\n readonly pathHelper:PathHelperService,\n readonly confirmDialog:ConfirmDialogService,\n protected readonly cdr:ChangeDetectorRef,\n protected readonly currentProject:CurrentProjectService) {\n super(injector, timezone, i18n, pathHelper, confirmDialog, cdr);\n }\n\n protected dmFilters():Array<[string, FilterOperator, [string]]> {\n return [['spentOn', '>t-', ['7']] as [string, FilterOperator, [string]],\n ['project_id', '=', [this.currentProject.id]] as [string, FilterOperator, [string]]];\n }\n}\n","\n\n \n \n\n\n
    \n \n \n \n \n \n , \n \n
    \n","import { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, Injector, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.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 { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { TimezoneService } from 'core-app/core/datetime/timezone.service';\nimport { MAGIC_PAGE_NUMBER } from 'core-app/core/apiv3/helpers/get-paginated-results';\n\n@Component({\n templateUrl: './subprojects.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WidgetSubprojectsComponent extends AbstractWidgetComponent implements OnInit {\n public text = {\n noResults: this.i18n.t('js.grid.widgets.subprojects.no_results'),\n };\n\n public projects:ProjectResource[];\n\n constructor(\n readonly halResource:HalResourceService,\n readonly pathHelper:PathHelperService,\n readonly i18n:I18nService,\n protected readonly injector:Injector,\n readonly timezone:TimezoneService,\n readonly apiV3Service:ApiV3Service,\n readonly currentProject:CurrentProjectService,\n readonly cdr:ChangeDetectorRef,\n ) {\n super(i18n, injector);\n }\n\n ngOnInit() {\n this\n .apiV3Service\n .projects\n .list(this.projectListParams)\n .subscribe((collection) => {\n this.projects = collection.elements;\n\n this.cdr.detectChanges();\n });\n }\n\n public get isEditable() {\n return false;\n }\n\n public projectPath(project:ProjectResource) {\n return this.pathHelper.projectPath(project.identifier);\n }\n\n public projectName(project:ProjectResource) {\n return project.name;\n }\n\n public get noEntries() {\n return this.projects && !this.projects.length;\n }\n\n private get projectListParams():ApiV3ListParameters {\n return {\n sortBy: [['name', 'asc']],\n filters: [['parent_id', '=', [this.currentProject.id!]], ['active', '=', ['t']]],\n pageSize: MAGIC_PAGE_NUMBER,\n };\n }\n}\n","\n\n \n\n \n \n\n\n
    \n \n \n
    \n \n
    \n {{usersByRole.role.name}}\n
    \n\n
    \n \n \n , \n \n
    \n
    \n
    \n
    \n {{moreMembersText}}\n
    \n
    \n\n\n","import { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\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 { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { MembershipResource } from 'core-app/features/hal/resources/membership-resource';\nimport { RoleResource } from 'core-app/features/hal/resources/role-resource';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ApiV3ListParameters } from 'core-app/core/apiv3/paths/apiv3-list-resource.interface';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { map } from 'rxjs/operators';\nimport { Observable } from 'rxjs';\n\nconst DISPLAYED_MEMBERS_LIMIT = 100;\n\n@Component({\n templateUrl: './members.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./members.component.sass'],\n})\nexport class WidgetMembersComponent extends AbstractWidgetComponent implements OnInit {\n public text = {\n add: this.i18n.t('js.grid.widgets.members.add'),\n noResults: this.i18n.t('js.grid.widgets.members.no_results'),\n viewAll: this.i18n.t('js.grid.widgets.members.view_all_members'),\n };\n\n public totalMembers:number;\n\n public entriesByRoles:{ [roleId:string]:{ role:RoleResource, users:HalResource[] } } = {};\n\n private entriesLoaded = false;\n\n public membersAddable$:Observable;\n\n constructor(\n readonly pathHelper:PathHelperService,\n readonly apiV3Service:ApiV3Service,\n readonly i18n:I18nService,\n protected readonly injector:Injector,\n readonly currentProject:CurrentProjectService,\n readonly cdr:ChangeDetectorRef,\n ) {\n super(i18n, injector);\n }\n\n ngOnInit() {\n this\n .apiV3Service\n .memberships\n .list(this.listMembersParams)\n .subscribe((collection) => {\n this.partitionEntriesByRole(collection.elements);\n this.sortUsersByName();\n this.totalMembers = collection.total;\n\n this.entriesLoaded = true;\n this.cdr.detectChanges();\n });\n\n this.membersAddable$ = this\n .apiV3Service\n .memberships\n .available_projects\n .list(this.listAvailableProjectsParams)\n .pipe(\n map((collection) => collection.total > 0),\n );\n }\n\n public get isEditable() {\n return false;\n }\n\n public get noMembers() {\n return this.entriesLoaded && !Object.keys(this.entriesByRoles).length;\n }\n\n public get moreMembers() {\n return this.entriesLoaded && this.totalMembers > DISPLAYED_MEMBERS_LIMIT;\n }\n\n public get moreMembersText() {\n return I18n.t(\n 'js.grid.widgets.members.too_many',\n { count: DISPLAYED_MEMBERS_LIMIT, total: this.totalMembers },\n );\n }\n\n public get projectMembershipsPath() {\n return this.pathHelper.projectMembershipsPath(this.currentProject.identifier!);\n }\n\n public get usersByRole() {\n return Object.values(this.entriesByRoles);\n }\n\n private partitionEntriesByRole(memberships:MembershipResource[]) {\n memberships.forEach((membership) => {\n membership.roles.forEach((role) => {\n if (!this.entriesByRoles[role.id!]) {\n this.entriesByRoles[role.id!] = { role, users: [] };\n }\n\n this.entriesByRoles[role.id!].users.push(membership.principal);\n });\n });\n }\n\n private sortUsersByName() {\n Object.values(this.entriesByRoles).forEach((entry) => {\n entry.users.sort((a, b) => a.name.localeCompare(b.name));\n });\n }\n\n private get listMembersParams() {\n const params:ApiV3ListParameters = { sortBy: [['created_at', 'desc']], pageSize: DISPLAYED_MEMBERS_LIMIT };\n\n if (this.currentProject.id) {\n params.filters = [['project_id', '=', [this.currentProject.id]]];\n }\n\n return params;\n }\n\n private get listAvailableProjectsParams() {\n // It would make sense to set the pageSize but the backend for projects\n // returns an upaginated list which does not support that.\n const params:ApiV3ListParameters = {};\n\n if (this.currentProject.id) {\n params.filters = [['id', '=', [this.currentProject.id]]];\n }\n\n return params;\n }\n}\n","\n\n \n\n \n \n\n\n
    \n \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 OnInit,\n ViewChild,\n} from '@angular/core';\nimport { AbstractWidgetComponent } from 'core-app/shared/components/grids/widgets/abstract-widget.component';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { WorkPackageViewHighlightingService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-highlighting.service';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { Observable } from 'rxjs';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Component({\n templateUrl: './project-status.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n WorkPackageViewHighlightingService,\n IsolatedQuerySpace,\n HalResourceEditingService,\n ],\n})\nexport class WidgetProjectStatusComponent extends AbstractWidgetComponent implements OnInit {\n @ViewChild('contentContainer', { static: true }) readonly contentContainer:ElementRef;\n\n public currentStatusCode = 'not set';\n\n public explanation = '';\n\n public project$:Observable;\n\n constructor(protected readonly i18n:I18nService,\n protected readonly injector:Injector,\n protected readonly apiV3Service:ApiV3Service,\n protected readonly currentProject:CurrentProjectService,\n protected readonly cdRef:ChangeDetectorRef) {\n super(i18n, injector);\n }\n\n ngOnInit():void {\n if (this.currentProject.id) {\n this.project$ = this\n .apiV3Service\n .projects\n .id(this.currentProject.id)\n .get();\n this.cdRef.detectChanges();\n }\n }\n\n public get isEditable():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 { Injector, NgModule } from '@angular/core';\nimport { DynamicModule } from 'ng-dynamic-component';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport { OpenprojectCalendarModule } from 'core-app/features/calendar/openproject-calendar.module';\nimport { FormsModule } from '@angular/forms';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { OpenprojectWorkPackagesModule } from 'core-app/features/work-packages/openproject-work-packages.module';\nimport { WidgetWpCalendarComponent } from 'core-app/shared/components/grids/widgets/wp-calendar/wp-calendar.component';\nimport { WidgetTimeEntriesCurrentUserComponent } from 'core-app/shared/components/grids/widgets/time-entries/current-user/time-entries-current-user.component';\nimport { GridWidgetsService } from 'core-app/shared/components/grids/widgets/widgets.service';\nimport { GridComponent } from 'core-app/shared/components/grids/grid/grid.component';\nimport { AddGridWidgetModalComponent } from 'core-app/shared/components/grids/widgets/add/add.modal';\nimport { WidgetDocumentsComponent } from 'core-app/shared/components/grids/widgets/documents/documents.component';\nimport { WidgetNewsComponent } from 'core-app/shared/components/grids/widgets/news/news.component';\nimport { WidgetWpTableComponent } from 'core-app/shared/components/grids/widgets/wp-table/wp-table.component';\nimport { WidgetMenuComponent } from 'core-app/shared/components/grids/widgets/menu/widget-menu.component';\nimport { WidgetWpTableMenuComponent } from 'core-app/shared/components/grids/widgets/wp-table/wp-table-menu.component';\nimport { GridInitializationService } from 'core-app/shared/components/grids/grid/initialization.service';\nimport { WidgetWpGraphComponent } from 'core-app/shared/components/grids/widgets/wp-graph/wp-graph.component';\nimport { WidgetWpGraphMenuComponent } from 'core-app/shared/components/grids/widgets/wp-graph/wp-graph-menu.component';\nimport { WidgetWpTableQuerySpaceComponent } from 'core-app/shared/components/grids/widgets/wp-table/wp-table-qs.component';\nimport { OpenprojectWorkPackageGraphsModule } from 'core-app/shared/components/work-package-graphs/openproject-work-package-graphs.module';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { WidgetProjectDescriptionComponent } from 'core-app/shared/components/grids/widgets/project-description/project-description.component';\nimport { WidgetHeaderComponent } from 'core-app/shared/components/grids/widgets/header/header.component';\nimport { WidgetWpOverviewComponent } from 'core-app/shared/components/grids/widgets/wp-overview/wp-overview.component';\nimport { WidgetCustomTextComponent } from 'core-app/shared/components/grids/widgets/custom-text/custom-text.component';\nimport { OpenprojectFieldsModule } from 'core-app/shared/components/fields/openproject-fields.module';\nimport { WidgetProjectDetailsComponent } from 'core-app/shared/components/grids/widgets/project-details/project-details.component';\nimport { WidgetProjectDetailsMenuComponent } from 'core-app/shared/components/grids/widgets/project-details/project-details-menu.component';\nimport { WidgetTimeEntriesProjectComponent } from 'core-app/shared/components/grids/widgets/time-entries/project/time-entries-project.component';\nimport { WidgetSubprojectsComponent } from 'core-app/shared/components/grids/widgets/subprojects/subprojects.component';\nimport { OpenprojectAttachmentsModule } from 'core-app/shared/components/attachments/openproject-attachments.module';\nimport { WidgetMembersComponent } from 'core-app/shared/components/grids/widgets/members/members.component';\nimport { WidgetProjectStatusComponent } from 'core-app/shared/components/grids/widgets/project-status/project-status.component';\nimport { OpenprojectTimeEntriesModule } from 'core-app/shared/components/time_entries/openproject-time-entries.module';\nimport { WidgetTimeEntriesCurrentUserMenuComponent } from 'core-app/shared/components/grids/widgets/time-entries/current-user/time-entries-current-user-menu.component';\nimport { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { TimeEntriesCurrentUserConfigurationModalComponent } from './widgets/time-entries/current-user/configuration-modal/configuration.modal';\n\n@NgModule({\n imports: [\n FormsModule,\n DragDropModule,\n\n OpSharedModule,\n OpenprojectModalModule,\n OpenprojectWorkPackagesModule,\n OpenprojectWorkPackageGraphsModule,\n OpenprojectCalendarModule,\n OpenprojectTimeEntriesModule,\n\n OpenprojectAttachmentsModule,\n\n DynamicModule,\n\n // Support for inline editig fields\n OpenprojectFieldsModule,\n\n ],\n providers: [\n GridWidgetsService,\n GridInitializationService,\n ],\n declarations: [\n GridComponent,\n\n // Widgets\n WidgetCustomTextComponent,\n WidgetDocumentsComponent,\n WidgetMembersComponent,\n WidgetNewsComponent,\n WidgetWpCalendarComponent,\n WidgetWpOverviewComponent,\n WidgetWpTableComponent,\n WidgetWpTableQuerySpaceComponent,\n WidgetWpGraphComponent,\n WidgetProjectDescriptionComponent,\n WidgetProjectDetailsComponent,\n WidgetProjectStatusComponent,\n WidgetSubprojectsComponent,\n WidgetTimeEntriesCurrentUserComponent,\n WidgetTimeEntriesProjectComponent,\n\n // Widget menus\n WidgetProjectDetailsMenuComponent,\n WidgetMenuComponent,\n WidgetWpTableMenuComponent,\n WidgetWpGraphMenuComponent,\n WidgetTimeEntriesCurrentUserMenuComponent,\n TimeEntriesCurrentUserConfigurationModalComponent,\n\n AddGridWidgetModalComponent,\n\n WidgetHeaderComponent,\n ],\n exports: [\n GridComponent,\n ],\n})\nexport class OpenprojectGridsModule {\n constructor(injector:Injector) {\n registerWidgets(injector);\n }\n}\n\nexport function registerWidgets(injector:Injector) {\n const hookService = injector.get(HookService);\n const i18n = injector.get(I18nService);\n\n hookService.register('gridWidgets', () => {\n const defaultColumns = ['id', 'project', 'type', 'subject'];\n\n const assignedFilters = new ApiV3FilterBuilder();\n assignedFilters.add('assignee', '=', ['me']);\n assignedFilters.add('status', 'o', []);\n\n const assignedProps = {\n 'columns[]': defaultColumns,\n filters: assignedFilters.toJson(),\n };\n\n const accountableFilters = new ApiV3FilterBuilder();\n accountableFilters.add('responsible', '=', ['me']);\n accountableFilters.add('status', 'o', []);\n\n const accountableProps = {\n 'columns[]': defaultColumns,\n filters: accountableFilters.toJson(),\n };\n\n const createdFilters = new ApiV3FilterBuilder();\n createdFilters.add('author', '=', ['me']);\n createdFilters.add('status', 'o', []);\n\n const createdProps = {\n 'columns[]': defaultColumns,\n filters: createdFilters.toJson(),\n };\n\n const watchedFilters = new ApiV3FilterBuilder();\n watchedFilters.add('watcher', '=', ['me']);\n watchedFilters.add('status', 'o', []);\n\n const watchedProps = {\n 'columns[]': defaultColumns,\n filters: watchedFilters.toJson(),\n };\n\n return [\n {\n identifier: 'work_packages_assigned',\n component: WidgetWpTableQuerySpaceComponent,\n title: i18n.t('js.grid.widgets.work_packages_assigned.title'),\n properties: {\n queryProps: assignedProps,\n name: i18n.t('js.grid.widgets.work_packages_assigned.title'),\n },\n },\n {\n identifier: 'work_packages_accountable',\n component: WidgetWpTableQuerySpaceComponent,\n title: i18n.t('js.grid.widgets.work_packages_accountable.title'),\n properties: {\n queryProps: accountableProps,\n name: i18n.t('js.grid.widgets.work_packages_accountable.title'),\n },\n },\n {\n identifier: 'work_packages_created',\n component: WidgetWpTableQuerySpaceComponent,\n title: i18n.t('js.grid.widgets.work_packages_created.title'),\n properties: {\n queryProps: createdProps,\n name: i18n.t('js.grid.widgets.work_packages_created.title'),\n },\n },\n {\n identifier: 'work_packages_watched',\n component: WidgetWpTableQuerySpaceComponent,\n title: i18n.t('js.grid.widgets.work_packages_watched.title'),\n properties: {\n queryProps: watchedProps,\n name: i18n.t('js.grid.widgets.work_packages_watched.title'),\n },\n },\n {\n identifier: 'work_packages_table',\n component: WidgetWpTableQuerySpaceComponent,\n title: i18n.t('js.grid.widgets.work_packages_table.title'),\n properties: {\n name: i18n.t('js.grid.widgets.work_packages_table.title'),\n },\n },\n {\n identifier: 'work_packages_graph',\n component: WidgetWpGraphComponent,\n title: i18n.t('js.grid.widgets.work_packages_graph.title'),\n properties: {\n name: i18n.t('js.grid.widgets.work_packages_graph.title'),\n },\n },\n {\n identifier: 'work_packages_calendar',\n component: WidgetWpCalendarComponent,\n title: i18n.t('js.grid.widgets.work_packages_calendar.title'),\n properties: {\n name: i18n.t('js.grid.widgets.work_packages_calendar.title'),\n },\n },\n {\n identifier: 'work_packages_overview',\n component: WidgetWpOverviewComponent,\n title: i18n.t('js.grid.widgets.work_packages_overview.title'),\n properties: {\n name: i18n.t('js.grid.widgets.work_packages_overview.title'),\n },\n },\n {\n identifier: 'time_entries_current_user',\n component: WidgetTimeEntriesCurrentUserComponent,\n title: i18n.t('js.grid.widgets.time_entries_current_user.title'),\n properties: {\n name: i18n.t('js.grid.widgets.time_entries_current_user.title'),\n days: [true, true, true, true, true, true, true],\n },\n },\n {\n identifier: 'time_entries_project',\n component: WidgetTimeEntriesProjectComponent,\n title: i18n.t('js.grid.widgets.time_entries_list.title'),\n properties: {\n name: i18n.t('js.grid.widgets.time_entries_list.title'),\n },\n },\n {\n identifier: 'documents',\n component: WidgetDocumentsComponent,\n title: i18n.t('js.grid.widgets.documents.title'),\n properties: {\n name: i18n.t('js.grid.widgets.documents.title'),\n },\n },\n {\n identifier: 'members',\n component: WidgetMembersComponent,\n title: i18n.t('js.grid.widgets.members.title'),\n properties: {\n name: i18n.t('js.grid.widgets.members.title'),\n },\n },\n {\n identifier: 'news',\n component: WidgetNewsComponent,\n title: i18n.t('js.grid.widgets.news.title'),\n properties: {\n name: i18n.t('js.grid.widgets.news.title'),\n },\n },\n {\n identifier: 'project_description',\n component: WidgetProjectDescriptionComponent,\n title: i18n.t('js.grid.widgets.project_description.title'),\n properties: {\n name: i18n.t('js.grid.widgets.project_description.title'),\n },\n },\n {\n identifier: 'custom_text',\n component: WidgetCustomTextComponent,\n title: i18n.t('js.grid.widgets.custom_text.title'),\n properties: {\n name: i18n.t('js.grid.widgets.custom_text.title'),\n text: {\n raw: '',\n },\n },\n },\n {\n identifier: 'project_details',\n component: WidgetProjectDetailsComponent,\n title: i18n.t('js.grid.widgets.project_details.title'),\n properties: {\n name: i18n.t('js.grid.widgets.project_details.title'),\n },\n },\n {\n identifier: 'project_status',\n component: WidgetProjectStatusComponent,\n title: i18n.t('js.grid.widgets.project_status.title'),\n properties: {\n name: i18n.t('js.grid.widgets.project_status.title'),\n },\n },\n {\n identifier: 'subprojects',\n component: WidgetSubprojectsComponent,\n title: i18n.t('js.grid.widgets.subprojects.title'),\n properties: {\n name: i18n.t('js.grid.widgets.subprojects.title'),\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';\n\nexport const appBaseSelector = 'openproject-base';\n\n@Component({\n selector: appBaseSelector,\n template: `\n
    \n \n
    \n `,\n})\nexport class ApplicationBaseComponent {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\n\nexport const MY_ACCOUNT_LAZY_ROUTES:Ng2StateDeclaration[] = [\n {\n name: 'my_notifications.**',\n url: '/my/notifications',\n loadChildren: () => import('./user-preferences.module').then((m) => m.OpenProjectMyAccountModule),\n },\n {\n name: 'user_notifications.**',\n url: '/users/:userId/edit/notifications',\n loadChildren: () => import('./user-preferences.module').then((m) => m.OpenProjectMyAccountModule),\n },\n {\n name: 'my_reminders.**',\n url: '/my/reminders',\n loadChildren: () => import('./user-preferences.module').then((m) => m.OpenProjectMyAccountModule),\n },\n {\n name: 'user_reminders.**',\n url: '/users/:userId/edit/reminders',\n loadChildren: () => import('./user-preferences.module').then((m) => m.OpenProjectMyAccountModule),\n },\n];\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\n\nexport const IAN_LAZY_ROUTES:Ng2StateDeclaration[] = [\n {\n name: 'notifications.**',\n url: '/notifications',\n loadChildren: () => import('./in-app-notifications.module').then((m) => m.OpenProjectInAppNotificationsModule),\n },\n];\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\n\nexport const TEAM_PLANNER_LAZY_ROUTES:Ng2StateDeclaration[] = [\n {\n name: 'team_planner.**',\n parent: 'optional_project',\n url: '/team_planner',\n loadChildren: () => import('./team-planner.module').then((m) => m.TeamPlannerModule),\n },\n];\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport {\n StateDeclaration,\n StateService,\n Transition,\n TransitionService,\n UIRouter,\n} from '@uirouter/core';\nimport {\n IToast,\n ToastService,\n} from 'core-app/shared/components/toaster/toast.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { Injector } from '@angular/core';\nimport { FirstRouteService } from 'core-app/core/routing/first-route-service';\nimport {\n Ng2StateDeclaration,\n StatesModule,\n} from '@uirouter/angular';\nimport {\n appBaseSelector,\n ApplicationBaseComponent,\n} from 'core-app/core/routing/base/application-base.component';\nimport { BackRoutingService } from 'core-app/features/work-packages/components/back-routing/back-routing.service';\nimport { MY_ACCOUNT_LAZY_ROUTES } from 'core-app/features/user-preferences/user-preferences.lazy-routes';\nimport { IAN_LAZY_ROUTES } from 'core-app/features/in-app-notifications/in-app-notifications.lazy-routes';\nimport { StateObject } from '@uirouter/core/lib/state/stateObject';\nimport {\n mobileGuardActivated,\n redirectToMobileAlternative,\n} from 'core-app/shared/helpers/routing/mobile-guard.helper';\nimport { TEAM_PLANNER_LAZY_ROUTES } from 'core-app/features/team-planner/team-planner/team-planner.lazy-routes';\nimport { CALENDAR_LAZY_ROUTES } from 'core-app/features/calendar/calendar.lazy-routes';\n\nexport const OPENPROJECT_ROUTES:Ng2StateDeclaration[] = [\n {\n name: 'new_project.**',\n url: '/projects/new',\n loadChildren: () => import('../../features/projects/openproject-projects.module').then((m) => m.OpenprojectProjectsModule),\n },\n {\n name: 'root',\n abstract: true,\n url: '',\n component: ApplicationBaseComponent,\n params: {\n // Allow passing of flash messages after routes load\n flash_message: { dynamic: true, value: null, inherit: false },\n },\n },\n {\n name: 'optional_project',\n parent: 'root',\n url: '/{projects}/{projectPath}',\n abstract: true,\n params: {\n // value: null makes the parameter optional\n // squash: true avoids duplicate slashes when the parameter is not provided\n projectPath: { type: 'path', value: null, squash: true },\n projects: { type: 'path', value: null, squash: true },\n },\n views: {\n '!$default': { component: ApplicationBaseComponent },\n },\n },\n {\n name: 'boards.**',\n parent: 'optional_project',\n url: '/boards',\n loadChildren: () => import('../../features/boards/openproject-boards.module').then((m) => m.OpenprojectBoardsModule),\n },\n {\n name: 'bim.**',\n parent: 'optional_project',\n url: '/bcf',\n loadChildren: () => import('../../features/bim/ifc_models/openproject-ifc-models.module').then((m) => m.OpenprojectIFCModelsModule),\n },\n {\n name: 'backlogs.**',\n parent: 'optional_project',\n url: '/backlogs',\n loadChildren: () => import('../../features/backlogs/openproject-backlogs.module').then((m) => m.OpenprojectBacklogsModule),\n },\n {\n name: 'backlogs_sprint.**',\n parent: 'optional_project',\n url: '/sprints',\n loadChildren: () => import('../../features/backlogs/openproject-backlogs.module').then((m) => m.OpenprojectBacklogsModule),\n },\n {\n name: 'reporting.**',\n parent: 'optional_project',\n url: '/cost_reports',\n loadChildren: () => import('../../features/reporting/openproject-reporting.module').then((m) => m.OpenprojectReportingModule),\n },\n {\n name: 'job-statuses.**',\n parent: 'optional_project',\n url: '/job_statuses',\n loadChildren: () => import('../../features/job-status/openproject-job-status.module').then((m) => m.OpenProjectJobStatusModule),\n },\n {\n name: 'project_settings.**',\n parent: 'optional_project',\n url: '/settings/general',\n loadChildren: () => import('../../features/projects/openproject-projects.module').then((m) => m.OpenprojectProjectsModule),\n },\n {\n name: 'project_copy.**',\n parent: 'optional_project',\n url: '/copy',\n loadChildren: () => import('../../features/projects/openproject-projects.module').then((m) => m.OpenprojectProjectsModule),\n },\n ...MY_ACCOUNT_LAZY_ROUTES,\n ...IAN_LAZY_ROUTES,\n ...TEAM_PLANNER_LAZY_ROUTES,\n ...CALENDAR_LAZY_ROUTES,\n];\n\n/**\n * Add or remove a body class. Helper for ui-router body classes functionality\n *\n * @param className\n * @param action\n */\nexport function bodyClass(className:string[]|string|null|undefined, action:'add'|'remove' = 'add') {\n if (className) {\n if (Array.isArray(className)) {\n className.forEach((cssClass:string) => {\n document.body.classList[action](cssClass);\n });\n } else {\n document.body.classList[action](className);\n }\n }\n}\n\nexport function updateMenuItem(menuItemClass:string|undefined, action:'add'|'remove' = 'add') {\n if (!menuItemClass) {\n return;\n }\n\n const menuItem = jQuery(`#main-menu .${menuItemClass}`)[0];\n\n if (!menuItem) {\n return;\n }\n\n // Update Class\n menuItem.classList[action]('selected');\n\n // Update accessibility label\n let menuItemTitle = (menuItem.getAttribute('title') || '').split(':').slice(-1)[0];\n if (action === 'add') {\n menuItemTitle = I18n.t('js.description_current_position') + menuItemTitle;\n }\n\n menuItem.setAttribute('title', menuItemTitle);\n}\n\nexport function uiRouterConfiguration(uiRouter:UIRouter, injector:Injector, module:StatesModule) {\n // Allow optional trailing slashes\n uiRouter.urlService.config.strictMode(false);\n\n // Register custom URL params type\n // to ensure query props are correctly set\n uiRouter.urlService.config.type(\n 'opQueryString',\n {\n encode: encodeURIComponent,\n decode: decodeURIComponent,\n raw: true,\n dynamic: true,\n is: (val:unknown) => typeof (val) === 'string',\n equals: (a:any, b:any) => _.isEqual(a, b),\n },\n );\n\n uiRouter.urlService.config.type(\n 'opQueryId',\n {\n pattern: new RegExp(/(?:new|[0-9]+)/),\n encode: (id:string|null) => id || 'new',\n decode: (id:string) => (id === 'new' ? null : id),\n raw: true,\n dynamic: true,\n is: (val:unknown) => typeof (val) === 'string',\n equals: (a:unknown, b:unknown) => _.isEqual(a, b),\n },\n );\n}\n\nexport function initializeUiRouterListeners(injector:Injector) {\n const $transitions:TransitionService = injector.get(TransitionService);\n const stateService = injector.get(StateService);\n const toastService:ToastService = injector.get(ToastService);\n const currentProject:CurrentProjectService = injector.get(CurrentProjectService);\n const firstRoute:FirstRouteService = injector.get(FirstRouteService);\n const backRoutingService:BackRoutingService = injector.get(BackRoutingService);\n\n // Check whether we are running within our complete app, or only within some other bootstrapped\n // component\n const wpBase = document.querySelector(appBaseSelector);\n\n // Uncomment to trace route changes\n // const uiRouter = injector.get(UIRouter);\n // uiRouter.trace.enable();\n\n // For some pages it makes no sense to display them on mobile (e.g. the split screen).\n // If a `mobileAlternative` is specified, we redirect there instead.\n // Actually, this would be solved with an ActiveGuard, but unfortunately ui-router does not support this.\n // The recommended alternative is this transition hook (compare: https://github.com/angular-ui/ui-router/issues/2964)\n $transitions.onBefore(\n { to: (state) => (state ? mobileGuardActivated(state) : false) },\n (transition) => redirectToMobileAlternative(transition),\n );\n\n // Apply classes from bodyClasses in each state definition\n // This was defined as onEnter, onExit functions in each state before\n // but since AOT doesn't allow anonymous functions, we can't re-use them now.\n // The transition will only return the target state on `transition.to()`,\n // however the second parameter has the currently (e.g., parent) entering state chain.\n $transitions.onEnter({}, (transition:Transition, state:StateDeclaration) => {\n // Add body class when entering this state\n bodyClass(_.get(state, 'data.bodyClasses'), 'add');\n if (transition.from().data && _.get(state, 'data.menuItem') !== transition.from().data.menuItem) {\n updateMenuItem(_.get(state, 'data.menuItem'), 'add');\n }\n });\n\n $transitions.onExit({}, (transition:Transition, state:StateDeclaration) => {\n // Remove body class when leaving this state\n bodyClass(_.get(state, 'data.bodyClasses'), 'remove');\n if (transition.to().data && _.get(state, 'data.menuItem') !== transition.to().data.menuItem) {\n updateMenuItem(_.get(state, 'data.menuItem'), 'remove');\n }\n });\n\n $transitions.onStart({}, (transition:Transition) => {\n const $state = transition.router.stateService;\n const toParams = transition.params('to');\n const toState = transition.to();\n\n // Remove start_onboarding_tour param if set\n if (toParams.start_onboarding_tour && toState.name !== 'work-packages.partitioned.list') {\n const paramsCopy = { ...transition.params() };\n paramsCopy.start_onboarding_tour = undefined;\n return $state.target(transition.to(), paramsCopy);\n }\n\n // Set backRoute to know where we came from\n backRoutingService.sync(transition);\n\n // Reset profiler, if we're actually profiling\n const profiler:{ pageTransition:() => void }|undefined = window.MiniProfiler;\n profiler?.pageTransition();\n\n const toStateObject:StateObject|undefined = toState.$$state && toState.$$state();\n const hasProjectRoutes = toStateObject?.includes?.root;\n const projectIdentifier = toParams.projectPath as string || currentProject.identifier;\n if (hasProjectRoutes && !toParams.projects && projectIdentifier) {\n const newParams = _.clone(toParams);\n _.assign(newParams, { projectPath: projectIdentifier, projects: 'projects' });\n return $state.target(toState, newParams, { location: 'replace' });\n }\n\n // Abort the transition and move to the url instead\n // Only move to the URL if we're not coming from an initial URL load\n // (cases like /work_packages/invalid/activity which render a 403 without frontend,\n // but trigger the ui-router state)\n //\n // The FirstRoute service remembers the first angular route we went to\n // but for pages without any angular routes, this will stay empty.\n // So we also allow routes to happen after some delay\n if (wpBase === null) {\n // Get the current path and compare\n const path = window.location.pathname;\n const pathWithSearch = path + window.location.search;\n const target = stateService.href(toState, toParams);\n\n if (target && path !== target && pathWithSearch !== target) {\n window.location.href = target;\n return false;\n }\n }\n\n // Remove and add any body class definitions for entering\n // and exiting states.\n bodyClass(_.get(toState, 'data.bodyClasses'), 'add');\n\n // We need to distinguish between actions that should run on the initial page load\n // (ie. openining a new tab in the details view should focus on the element in the table)\n // so we need to know which route we visited initially\n firstRoute.setIfFirst(toState.name, toParams);\n\n // Clear all notifications when actually moving between states.\n if (transition.to().name !== transition.from().name) {\n toastService.clear();\n }\n\n // Add new notifications if passed to params\n if (toParams.flash_message) {\n toastService.add(toParams.flash_message as IToast);\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 { Ng2StateDeclaration } from '@uirouter/angular';\n\nexport const CALENDAR_LAZY_ROUTES:Ng2StateDeclaration[] = [\n {\n name: 'calendar.**',\n parent: 'optional_project',\n url: '/calendars',\n loadChildren: () => import('./openproject-calendar.module').then((m) => m.OpenprojectCalendarModule),\n },\n];\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { StateObject } from '@uirouter/core/lib/state/stateObject';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport {\n TargetState,\n Transition,\n} from '@uirouter/core';\n\nexport function mobileGuardActivated(state:StateObject):boolean {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-return\n return state.data && state.data.mobileAlternative && (new DeviceService()).isMobile;\n}\n\nexport function redirectToMobileAlternative(transition:Transition):TargetState {\n const $state = transition.router.stateService;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment\n const alternativeRoute:string = transition.to().data.mobileAlternative;\n\n return $state.target(alternativeRoute, transition.params(), {});\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injector, NgModule } from '@angular/core';\nimport { FirstRouteService } from 'core-app/core/routing/first-route-service';\nimport { UIRouterModule } from '@uirouter/angular';\nimport { ApplicationBaseComponent } from 'core-app/core/routing/base/application-base.component';\nimport {\n initializeUiRouterListeners,\n OPENPROJECT_ROUTES,\n uiRouterConfiguration,\n} from 'core-app/core/routing/openproject.routes';\n\n@NgModule({\n imports: [\n UIRouterModule.forRoot({\n states: OPENPROJECT_ROUTES,\n useHash: false,\n config: uiRouterConfiguration,\n } as any),\n ],\n providers: [\n FirstRouteService,\n ],\n declarations: [\n ApplicationBaseComponent,\n ],\n})\nexport class OpenprojectRouterModule {\n constructor(injector:Injector) {\n initializeUiRouterListeners(injector);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { WpTabWrapperComponent } from 'core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/wp-tab-wrapper.component';\nimport { WorkPackageNewFullViewComponent } from 'core-app/features/work-packages/components/wp-new/wp-new-full-view.component';\nimport { WorkPackagesFullViewComponent } from 'core-app/features/work-packages/routing/wp-full-view/wp-full-view.component';\nimport { WorkPackageSplitViewComponent } from 'core-app/features/work-packages/routing/wp-split-view/wp-split-view.component';\nimport { Ng2StateDeclaration } from '@uirouter/angular';\nimport { WorkPackagesBaseComponent } from 'core-app/features/work-packages/routing/wp-base/wp--base.component';\nimport { WorkPackageListViewComponent } from 'core-app/features/work-packages/routing/wp-list-view/wp-list-view.component';\nimport { WorkPackageViewPageComponent } from 'core-app/features/work-packages/routing/wp-view-page/wp-view-page.component';\nimport { makeSplitViewRoutes } from 'core-app/features/work-packages/routing/split-view-routes.template';\nimport { WorkPackageCopyFullViewComponent } from 'core-app/features/work-packages/components/wp-copy/wp-copy-full-view.component';\nimport { KeepTabService } from 'core-app/features/work-packages/components/wp-single-view-tabs/keep-tab/keep-tab.service';\n\nexport const menuItemClass = 'work-packages-menu-item';\n\nexport const WORK_PACKAGES_ROUTES:Ng2StateDeclaration[] = [\n {\n name: 'work-packages',\n parent: 'optional_project',\n url: '/work_packages?query_id&query_props&start_onboarding_tour',\n redirectTo: 'work-packages.partitioned.list',\n views: {\n '!$default': { component: WorkPackagesBaseComponent },\n },\n data: {\n bodyClasses: 'router--work-packages-base',\n menuItem: menuItemClass,\n },\n params: {\n query_id: { type: 'query', dynamic: true },\n // Use custom encoder/decoder that ensures validity of URL string\n query_props: { type: 'opQueryString' },\n // Optional initial tour param\n start_onboarding_tour: { type: 'query', squash: true, value: undefined },\n },\n },\n {\n name: 'work-packages.new',\n url: '/new?type&parent_id',\n component: WorkPackageNewFullViewComponent,\n reloadOnSearch: false,\n params: {\n defaults: {\n value: null,\n },\n },\n data: {\n baseRoute: 'work-packages',\n allowMovingInEditMode: true,\n bodyClasses: 'router--work-packages-full-create',\n menuItem: menuItemClass,\n successState: 'work-packages.show',\n },\n },\n {\n name: 'work-packages.copy',\n url: '/{copiedFromWorkPackageId:[0-9]+}/copy',\n component: WorkPackageCopyFullViewComponent,\n reloadOnSearch: false,\n data: {\n baseRoute: 'work-packages',\n allowMovingInEditMode: true,\n bodyClasses: 'router--work-packages-full-create',\n menuItem: menuItemClass,\n },\n },\n {\n name: 'work-packages.show',\n url: '/{workPackageId:[0-9]+}',\n // Redirect to 'activity' by default.\n redirectTo: (trans) => {\n const params = trans.params('to');\n const keepTab = trans.injector().get(KeepTabService) as KeepTabService;\n const tabIdentifier = keepTab.currentShowTab;\n return {\n state: 'work-packages.show.tabs',\n params: { ...params, tabIdentifier: tabIdentifier || 'activity' },\n };\n },\n component: WorkPackagesFullViewComponent,\n data: {\n baseRoute: 'work-packages',\n bodyClasses: 'router--work-packages-full-view',\n newRoute: 'work-packages.new',\n menuItem: menuItemClass,\n },\n },\n {\n name: 'work-packages.show.tabs',\n url: '/:tabIdentifier',\n component: WpTabWrapperComponent,\n data: {\n parent: 'work-packages.show',\n menuItem: menuItemClass,\n },\n },\n {\n name: 'work-packages.partitioned',\n component: WorkPackageViewPageComponent,\n url: '',\n data: {\n // This has to be empty to avoid inheriting the parent bodyClasses\n bodyClasses: '',\n },\n },\n {\n name: 'work-packages.partitioned.list',\n url: '',\n reloadOnSearch: false,\n views: {\n 'content-left': { component: WorkPackageListViewComponent },\n },\n data: {\n bodyClasses: 'router--work-packages-partitioned-split-view',\n menuItem: menuItemClass,\n partition: '-left-only',\n },\n },\n ...makeSplitViewRoutes(\n 'work-packages.partitioned.list',\n menuItemClass,\n WorkPackageSplitViewComponent,\n ),\n // Avoid lazy-loading the routes for now\n // {\n // name: 'work-packages.calendar.**',\n // url: '/calendar',\n // loadChildren: '../calendar/openproject-calendar.module#OpenprojectCalendarModule'\n // },\n];\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { UIRouterModule } from '@uirouter/angular';\nimport { WORK_PACKAGES_ROUTES } from 'core-app/features/work-packages/routing/work-packages-routes';\nimport { OpenprojectWorkPackagesModule } from 'core-app/features/work-packages/openproject-work-packages.module';\n\n/**\n * Separate module for work package routes because WP modules\n * are required by other lazy-loaded modules such as calendar.\n *\n * And we must not re-import a module with route definitions.\n */\n\n@NgModule({\n imports: [\n // Import the actual WP modules\n OpenprojectWorkPackagesModule,\n\n // Routes for /work_packages\n UIRouterModule.forChild({ states: WORK_PACKAGES_ROUTES }),\n ],\n})\nexport class OpenprojectWorkPackageRoutesModule {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\n\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\n\n@Injectable()\nexport class GlobalSearchService {\n private _searchTerm = new BehaviorSubject('');\n\n public searchTerm$ = this._searchTerm.asObservable();\n\n // Default selected tab is Work Packages\n private _currentTab = new BehaviorSubject('work_packages');\n\n public currentTab$ = this._currentTab.asObservable();\n\n // Default project scope is \"this project and all subprojects\"\n private _projectScope = new BehaviorSubject('');\n\n public projectScope$ = this._projectScope.asObservable();\n\n private _tabs = new BehaviorSubject([]);\n\n public tabs$ = this._tabs.asObservable();\n\n // Sometimes we need to be able to hide the search results altogether, i.e. while expecting a full page reload.\n private _resultsHidden = new BehaviorSubject(false);\n\n public resultsHidden$ = this._resultsHidden.asObservable();\n\n constructor(\n protected I18n:I18nService,\n protected injector:Injector,\n protected PathHelper:PathHelperService,\n protected currentProjectService:CurrentProjectService,\n ) {\n this.initialize();\n }\n\n private initialize():void {\n const initialData = this.loadGonData();\n if (initialData) {\n if (initialData.available_search_types) {\n this._tabs.next(initialData.available_search_types);\n }\n if (initialData.search_term) {\n this._searchTerm.next(initialData.search_term);\n }\n if (initialData.current_tab) {\n this._currentTab.next(initialData.current_tab);\n }\n\n if (initialData.project_scope) {\n this._projectScope.next(initialData.project_scope);\n } else if (!this.currentProjectService.path) {\n this._projectScope.next('all');\n }\n }\n }\n\n private loadGonData():{ available_search_types:string[],\n search_term:string,\n project_scope:string,\n current_tab:string }|null {\n try {\n return (window as any).gon.global_search;\n } catch (e) {\n return null;\n }\n }\n\n public submitSearch():void {\n window.location.href = this.searchPath();\n }\n\n public searchPath() {\n let searchPath:string = this.PathHelper.staticBase;\n if (this.currentProjectService.path && this.projectScope !== 'all') {\n searchPath = this.currentProjectService.path;\n }\n searchPath += `/search?${this.searchQueryParams()}`;\n return searchPath;\n }\n\n public set searchTerm(searchTerm:string) {\n this._searchTerm.next(searchTerm);\n }\n\n public get searchTerm():string {\n return this._searchTerm.value;\n }\n\n public get searchTermIsId():boolean {\n return this.searchTermWithoutHash !== this.searchTerm;\n }\n\n public get searchTermWithoutHash():string {\n if (/^#(\\d+)/.exec(this.searchTerm)) {\n return this.searchTerm.substr(1);\n }\n return this.searchTerm;\n }\n\n public get tabs():string {\n return this._tabs.value;\n }\n\n public get currentTab():string {\n return this._currentTab.value;\n }\n\n public set currentTab(tab:string) {\n this._currentTab.next(tab);\n }\n\n public get projectScope():string {\n return this._projectScope.value;\n }\n\n public set projectScope(value:string) {\n this._projectScope.next(value);\n }\n\n public get resultsHidden():boolean {\n return this._resultsHidden.value;\n }\n\n public set resultsHidden(value:boolean) {\n this._resultsHidden.next(value);\n }\n\n private searchQueryParams():string {\n let params:string;\n\n params = `q=${encodeURIComponent(this.searchTerm)}`;\n\n if (this.currentTab.length > 0 && this.currentTab !== 'all') {\n params = `${params}&${this.currentTab}=1`;\n }\n if (this.projectScope.length > 0) {\n params = `${params}&scope=${this.projectScope}`;\n }\n\n return params;\n }\n\n public isAfterSearch():boolean {\n return (jQuery('body.controller-search').length > 0);\n }\n}\n","
    \n \n \n \n\n \n \n
    {{text.recently_viewed}}
    \n
    \n \n
    \n
    \n
    {{currentValue}}
    \n
    {{item.text}} ↵
    \n
    \n
    \n \n \n \n
    \n \n \n {{item.subject}}\n \n\n
    \n \n #{{item.id}}\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 HostListener,\n Input,\n NgZone,\n OnDestroy,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { BehaviorSubject, Observable, of } from 'rxjs';\nimport { first, map, switchMap, tap } from 'rxjs/operators';\nimport { GlobalSearchService } from 'core-app/core/global_search/services/global-search.service';\nimport { isClickedWithModifier } from 'core-app/shared/helpers/link-handling/link-handling';\nimport {\n Highlighting,\n} from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport { insideOrSelf } from 'core-app/shared/directives/focus/contain-helpers';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport {\n OpAutocompleterComponent,\n} from 'core-app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ApiV3Service } from '../../apiv3/api-v3.service';\nimport {\n ApiV3WorkPackageCachedSubresource,\n} from 'core-app/core/apiv3/endpoints/work_packages/api-v3-work-package-cached-subresource';\nimport { RecentItemsService } from 'core-app/core/recent-items.service';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\n\ninterface SearchResultItem {\n id:string;\n subject:string;\n status:string;\n statusId:string;\n href:string;\n project:string;\n author:HalResource;\n}\n\ninterface SearchOptionItem {\n projectScope:string;\n text:string;\n}\n\ninterface SearchResultItems {\n items:SearchResultItem[]|SearchOptionItem[];\n term:string;\n}\n\n@Component({\n selector: 'opce-global-search',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './global-search-input.component.html',\n styleUrls: [\n './global-search-input.component.sass',\n './global-search-input-mobile.component.sass',\n './global-search.component.sass',\n ],\n // Necessary because of ng-select\n encapsulation: ViewEncapsulation.None,\n})\nexport class GlobalSearchInputComponent implements AfterViewInit, OnDestroy {\n @Input() public placeholder:string;\n\n @ViewChild('btn', { static: true }) btn:ElementRef;\n\n @ViewChild(OpAutocompleterComponent, { static: true }) public ngSelectComponent:OpAutocompleterComponent;\n\n public expanded = false;\n\n private _markable = new BehaviorSubject(false);\n\n public markable$ = this._markable.asObservable();\n\n public hasRecentItems$ = this.recentItemsService.recentItems$.pipe(\n map((items) => (items.length > 0)),\n );\n\n getAutocompleterData = ():Observable => this.autocompleteWorkPackages();\n\n public autocompleterOptions = {\n filters: [],\n resource: 'work_packages',\n searchKey: 'subjectOrId',\n getOptionsFn: this.getAutocompleterData,\n };\n\n /** Remember the current value */\n public currentValue = '';\n\n public isFocusedDirectly = (this.globalSearchService.searchTerm.length > 0);\n\n /** Remember the item that best matches the query.\n * That way, it will be highlighted (as we manually mark the selected item) and we can handle enter.\n * */\n public selectedItem:WorkPackageResource|SearchOptionItem|undefined;\n\n private unregisterGlobalListener:(() => unknown)|undefined;\n\n public text:{ [key:string]:string } = {\n all_projects: this.I18n.t('js.global_search.all_projects'),\n close_search: this.I18n.t('js.global_search.close_search'),\n current_project_and_all_descendants: this.I18n.t('js.global_search.current_project_and_all_descendants'),\n current_project: this.I18n.t('js.global_search.current_project'),\n recently_viewed: this.I18n.t('js.global_search.recently_viewed'),\n };\n\n constructor(\n readonly elementRef:ElementRef,\n readonly I18n:I18nService,\n readonly apiV3Service:ApiV3Service,\n readonly pathHelperService:PathHelperService,\n readonly halResourceService:HalResourceService,\n readonly globalSearchService:GlobalSearchService,\n readonly currentProjectService:CurrentProjectService,\n readonly deviceService:DeviceService,\n readonly cdRef:ChangeDetectorRef,\n readonly halNotification:HalResourceNotificationService,\n readonly ngZone:NgZone,\n readonly recentItemsService:RecentItemsService,\n ) {\n populateInputsFromDataset(this);\n }\n\n ngAfterViewInit():void {\n // check searchterm on init, expand / collapse search bar and set correct classes\n this.searchTerm = this.globalSearchService.searchTerm;\n this.currentValue = '';\n this.toggleTopMenuClass();\n }\n\n ngOnDestroy():void {\n this.unregister();\n }\n\n public set searchTerm(searchTerm:string) {\n this.ngSelectComponent.ngSelectInstance.searchTerm = searchTerm;\n }\n\n public get searchTerm():string {\n return this.ngSelectComponent.ngSelectInstance.searchTerm;\n }\n\n public set markable(value:boolean) {\n this._markable.next(value);\n }\n\n public get markable():boolean {\n return this._markable.value;\n }\n\n // detect if click is outside or inside the element\n @HostListener('click', ['$event'])\n public handleClick(event:JQuery.TriggeredEvent):void {\n event.preventDefault();\n\n // handle click on search button\n if (insideOrSelf(this.btn.nativeElement as HTMLElement, event.target as HTMLElement)) {\n if (this.deviceService.isMobile) {\n this.toggleMobileSearch();\n // open ng-select menu on default\n jQuery('.ng-input input').focus();\n // only for mobile and not for all devices!\n // See https://github.com/opf/openproject/commit/a2eb0cd6025f2ecaca00f4ed81c4eb8e9399bd86\n event.stopPropagation();\n } else if (this.searchTerm?.length === 0) {\n this.ngSelectComponent.ngSelectInstance.focus();\n } else {\n this.submitNonEmptySearch();\n }\n }\n }\n\n // open or close mobile search\n public toggleMobileSearch():void {\n this.expanded = !this.expanded;\n this.toggleTopMenuClass();\n }\n\n public redirectToWp(id:string, event:MouseEvent):boolean {\n event.stopImmediatePropagation();\n if (isClickedWithModifier(event)) {\n return true;\n }\n\n window.location.href = this.wpPath(id);\n event.preventDefault();\n return false;\n }\n\n public wpPath(id:string):string {\n return this.pathHelperService.workPackagePath(id);\n }\n\n public highlighting(property:string, id:string):string {\n return Highlighting.inlineClass(property, id);\n }\n\n public search(_$event:SearchResultItems):void {\n this.currentValue = this.searchTerm;\n }\n\n public onFocus():void {\n this.expanded = true;\n this.toggleTopMenuClass();\n this.ngSelectComponent.openSelect();\n }\n\n public onFocusOut():void {\n if (!this.deviceService.isMobile) {\n this.expanded = (this.searchTerm !== null && this.searchTerm.length > 0);\n this.ngSelectComponent.ngSelectInstance.isOpen = false;\n this.selectedItem = undefined;\n this.toggleTopMenuClass();\n }\n }\n\n public onClose():void {\n this.searchTerm = this.currentValue;\n }\n\n public clearSearch():void {\n this.currentValue = '';\n this.searchTerm = '';\n }\n\n // If Enter key is pressed before result list is loaded, wait for the results to come\n // in and then decide what to do. If a direct hit is present, follow that. Otherwise,\n // go to the search in the current scope.\n public onEnterBeforeResultsLoaded():void {\n this.markable$.pipe(\n first((v) => v),\n ).subscribe(() => {\n if (this.selectedItem) {\n this.followSelectedItem();\n } else {\n this.searchInScope(this.currentScope);\n }\n });\n }\n\n public statusHighlighting(statusId:string):string {\n return Highlighting.inlineClass('status', statusId);\n }\n\n public followItem(item:WorkPackageResource|SearchOptionItem|undefined):void {\n this.selectedItem = item;\n if (item instanceof HalResource) {\n window.location.href = this.wpPath(item.id as string);\n } else if (item) {\n // update embedded table and title when new search is submitted\n this.globalSearchService.searchTerm = this.currentValue;\n this.searchInScope(item.projectScope);\n }\n }\n\n public followSelectedItem():void {\n if (this.selectedItem) {\n this.followItem(this.selectedItem);\n }\n }\n\n // return all project scope items and all items which contain the search term\n public customSearchFn(term:string, item:SearchResultItem):boolean {\n return item.id === undefined || item.subject.toLowerCase().indexOf(term.toLowerCase()) !== -1;\n }\n\n private autocompleteWorkPackages():Observable<(WorkPackageResource|SearchOptionItem)[]> {\n const query = this.searchTerm;\n if (query === null || query.match(/^\\s+$/)) {\n return of([]);\n }\n\n if (!query.length) {\n return this.recentItemsService.recentItems$.pipe(\n switchMap((wpIds) => {\n // It is needed, because otherwise we get infinite spin running\n // in the searchbar with no recent workpackages IDs inside localStorage\n if (wpIds.length === 0) {\n return of([]);\n }\n\n void this.apiV3Service.work_packages.requireAll(wpIds);\n return this.apiV3Service.work_packages.cache.observeSome(wpIds);\n }),\n );\n }\n\n // Reset the currently selected item.\n // We do not follow the typical goal of an autocompleter of \"setting a value\" here.\n this.selectedItem = undefined;\n // Hide highlighting of ng-option\n this.markable = false;\n\n const hashFreeQuery = this.queryWithoutHash(query);\n\n return this\n .fetchSearchResults(hashFreeQuery, hashFreeQuery !== query)\n .get()\n .pipe(\n map((collection) => this.searchResultsToOptions(collection.elements, hashFreeQuery)),\n tap(() => {\n this.setMarkedOption();\n }),\n );\n }\n\n // Remove ID marker # when searching for #\n private queryWithoutHash(query:string):string {\n if (/^#(\\d+)/.exec(query)) {\n return query.substr(1);\n }\n return query;\n }\n\n private fetchSearchResults(query:string, idOnly:boolean):ApiV3WorkPackageCachedSubresource {\n return this\n .apiV3Service\n .work_packages\n .filterByTypeaheadOrId(query, idOnly);\n }\n\n private searchResultsToOptions(results:WorkPackageResource[], query:string) {\n const searchOptions = this.detailedSearchOptions();\n // If we have a direct hit, we choose it to be the selected element.\n this.selectedItem = results.find((wp) => wp.id?.toString() === query) || searchOptions[0];\n\n return [\n ...searchOptions,\n ...results,\n ];\n }\n\n // set the possible 'search in scope' options for the current project path\n private detailedSearchOptions():{ projectScope:string; text:string }[] {\n const searchOptions = [];\n // add all options when searching within a project\n // otherwise search in 'all projects'\n if (this.currentProjectService.path) {\n searchOptions.push('current_project_and_all_descendants');\n searchOptions.push('current_project');\n }\n if (this.globalSearchService.projectScope === 'current_project') {\n searchOptions.reverse();\n }\n searchOptions.push('all_projects');\n\n return searchOptions.map((suggestion:string) => ({ projectScope: suggestion, text: this.text[suggestion] }));\n }\n\n /*\n * Set the marked ng-option within ng-select and apply the class to highlight marked options.\n *\n * ng-select differentiates between the selected and the marked option. The selected optinon is the option\n * that is binded via ng-model. The marked option is the one that the user is currently selecting (via mouse or keyboard up/down).\n * When hitting enter, the marked option is taken to be the new selected option. Ng-select will retain the index of the marked\n * option between individual searches. The selected option has no influence on the marked option. This is problematic\n * in our use case as the user might have:\n * * the mouse hovering (deliberately or not) over the search options which will mark that option.\n * * marked an option for a previous search but might then have decided to add/remove additional characters to the search.\n *\n * In both cases, whenever the user presses enter then, ng-select assigns the marked option to the ng-model.\n *\n * Our goal however is to either:\n * * mark the direct hit (id matches) if it available\n * * mark the first item if there is no direct hit\n *\n * And we need to update the marked option after every search.\n *\n * There is no way of doing this via the interface provided in the template. There is only [markFirst] and it neither allows us\n * to mark a direct hit, nor does it reset after a search. We handle this then by selecting the desired element once the\n * search results are back. We then set the marked option to be the selected option.\n *\n * In order to avoid flickering, a -markable modifyer class is unset/set before/after searching. This will unset the background until we\n * have marked the element we wish to.\n */\n private setMarkedOption():void {\n this.markable = true;\n this.ngSelectComponent.ngSelectInstance.itemsList.markItem(this.ngSelectComponent.ngSelectInstance.itemsList.selectedItems[0]);\n\n this.cdRef.detectChanges();\n }\n\n private searchInScope(scope:string):void {\n switch (scope) {\n case 'all_projects': {\n let forcePageLoad = false;\n if (this.globalSearchService.projectScope !== 'all') {\n forcePageLoad = true;\n this.globalSearchService.resultsHidden = true;\n }\n this.globalSearchService.projectScope = 'all';\n this.submitNonEmptySearch(forcePageLoad);\n break;\n }\n case 'current_project': {\n this.globalSearchService.projectScope = 'current_project';\n this.submitNonEmptySearch();\n break;\n }\n case 'current_project_and_all_descendants': {\n this.globalSearchService.projectScope = '';\n this.submitNonEmptySearch();\n break;\n }\n default: // Do nothing\n break;\n }\n }\n\n public submitNonEmptySearch(forcePageLoad = false):void {\n this.globalSearchService.searchTerm = this.currentValue;\n if (this.currentValue.length > 0) {\n this.ngSelectComponent.ngSelectInstance.close();\n // Work package results can update without page reload.\n if (!forcePageLoad\n && this.globalSearchService.isAfterSearch()\n && this.globalSearchService.currentTab === 'work_packages') {\n window.history\n .replaceState(\n {},\n `${I18n.t('global_search.search')}: ${this.searchTerm}`,\n this.globalSearchService.searchPath(),\n );\n\n return;\n }\n this.globalSearchService.submitSearch();\n }\n }\n\n public blur():void {\n this.ngSelectComponent.ngSelectInstance.searchTerm = '';\n (document.activeElement).blur();\n }\n\n private get currentScope():string {\n const serviceScope = this.globalSearchService.projectScope;\n return (serviceScope === '') ? 'current_project_and_all_descendants' : serviceScope;\n }\n\n private unregister():void {\n if (this.unregisterGlobalListener) {\n this.unregisterGlobalListener();\n this.unregisterGlobalListener = undefined;\n }\n }\n\n private toggleTopMenuClass():void {\n const el = document.getElementsByClassName('op-app-header')[0] as HTMLElement;\n el.classList.toggle('op-app-header_search-open', this.expanded);\n el.dataset.qaSearchOpen = '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 AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, OnDestroy, OnInit, Renderer2,\n} from '@angular/core';\nimport { FocusHelperService } from 'core-app/shared/directives/focus/focus-helper';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { GlobalSearchService } from 'core-app/core/global_search/services/global-search.service';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\nimport { WorkPackageTableConfigurationObject } from 'core-app/features/work-packages/components/wp-table/wp-table-configuration';\nimport { IsolatedQuerySpace } from 'core-app/features/work-packages/directives/query-space/isolated-query-space';\nimport { WorkPackageViewFiltersService } from 'core-app/features/work-packages/routing/wp-view-base/view-services/wp-view-filters.service';\nimport { debounceTime, distinctUntilChanged, skip } from 'rxjs/operators';\nimport { combineLatest } from 'rxjs';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { WorkPackageFiltersService } from 'core-app/features/work-packages/components/filters/wp-filters/wp-filters.service';\n\nexport const globalSearchWorkPackagesSelector = 'global-search-work-packages';\n\n@Component({\n selector: globalSearchWorkPackagesSelector,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n \n \n `,\n})\n\nexport class GlobalSearchWorkPackagesComponent extends UntilDestroyedMixin implements OnInit, OnDestroy, AfterViewInit {\n public queryProps:{ [key:string]:any };\n\n public resultsHidden = false;\n\n public tableConfiguration:WorkPackageTableConfigurationObject = {\n actionsColumnEnabled: false,\n columnMenuEnabled: true,\n contextMenuEnabled: false,\n inlineCreateEnabled: false,\n withFilters: true,\n showFilterButton: true,\n filterButtonText: this.I18n.t('js.button_advanced_filter'),\n };\n\n constructor(\n readonly FocusHelper:FocusHelperService,\n readonly elementRef:ElementRef,\n readonly renderer:Renderer2,\n readonly I18n:I18nService,\n readonly halResourceService:HalResourceService,\n readonly globalSearchService:GlobalSearchService,\n readonly wpTableFilters:WorkPackageViewFiltersService,\n readonly querySpace:IsolatedQuerySpace,\n readonly wpFilters:WorkPackageFiltersService,\n readonly cdRef:ChangeDetectorRef,\n private UrlParamsHelper:UrlParamsHelperService,\n ) {\n super();\n }\n\n ngAfterViewInit() {\n combineLatest([\n this.globalSearchService.searchTerm$,\n this.globalSearchService.projectScope$,\n ])\n .pipe(\n skip(1),\n distinctUntilChanged(),\n debounceTime(10),\n this.untilDestroyed(),\n )\n .subscribe(([]) => {\n this.wpFilters.visible = false;\n this.setQueryProps();\n });\n\n this.globalSearchService\n .resultsHidden$\n .pipe(\n this.untilDestroyed(),\n )\n .subscribe((resultsHidden:boolean) => (this.resultsHidden = resultsHidden));\n }\n\n ngOnInit():void {\n this.setQueryProps();\n }\n\n private setQueryProps():void {\n const filters:any[] = [];\n let columns = ['id', 'project', 'subject', 'type', 'status', 'updatedAt'];\n\n if (this.globalSearchService.searchTermIsId) {\n filters.push({\n id: {\n operator: '=',\n values: [this.globalSearchService.searchTermWithoutHash],\n },\n });\n } else if (this.globalSearchService.searchTerm.length > 0) {\n filters.push({\n search: {\n operator: '**',\n values: [this.globalSearchService.searchTerm],\n },\n });\n }\n\n if (this.globalSearchService.projectScope === 'current_project') {\n filters.push({\n subprojectId: {\n operator: '!*',\n values: [],\n },\n });\n columns = ['id', 'subject', 'type', 'status', 'updatedAt'];\n }\n\n if (this.globalSearchService.projectScope === '') {\n filters.push({\n subprojectId: {\n operator: '*',\n values: [],\n },\n });\n }\n\n this.queryProps = {\n 'columns[]': columns,\n filters: JSON.stringify(filters),\n sortBy: JSON.stringify([['updatedAt', 'desc']]),\n showHierarchies: 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 {\n ChangeDetectorRef,\n Component,\n OnDestroy,\n Injector,\n OnInit,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { StateService } from '@uirouter/core';\nimport { Subscription } from 'rxjs';\nimport { GlobalSearchService } from 'core-app/core/global_search/services/global-search.service';\nimport { ScrollableTabsComponent } from 'core-app/shared/components/tabs/scrollable-tabs/scrollable-tabs.component';\nimport { TabDefinition } from 'core-app/shared/components/tabs/tab.interface';\n\nexport const globalSearchTabsSelector = 'global-search-tabs';\n\n@Component({\n selector: globalSearchTabsSelector,\n templateUrl: '../../../shared/components/tabs/scrollable-tabs/scrollable-tabs.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n\nexport class GlobalSearchTabsComponent extends ScrollableTabsComponent implements OnInit, OnDestroy {\n private currentTabSub:Subscription;\n\n private tabsSub:Subscription;\n\n public classes:string[] = ['global-search--tabs', 'scrollable-tabs'];\n\n constructor(\n readonly globalSearchService:GlobalSearchService,\n protected readonly $state:StateService,\n public injector:Injector,\n cdRef:ChangeDetectorRef,\n ) {\n super($state, cdRef, injector);\n }\n\n ngOnInit():void {\n this.currentTabSub = this.globalSearchService\n .currentTab$\n .subscribe((currentTab) => {\n this.currentTabId = currentTab;\n });\n\n this.tabsSub = this.globalSearchService\n .tabs$\n .subscribe((tabs) => {\n this.tabs = tabs;\n this.tabs.map((tab) => (tab.path = '#'));\n });\n }\n\n public clickTab(tab:TabDefinition, event:Event):void {\n super.clickTab(tab, event);\n\n this.globalSearchService.currentTab = tab.id;\n this.globalSearchService.submitSearch();\n }\n\n ngOnDestroy():void {\n this.currentTabSub.unsubscribe();\n this.tabsSub.unsubscribe();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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 ChangeDetectorRef,\n Component,\n ElementRef,\n Injector,\n Input,\n OnInit,\n} from '@angular/core';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { combineLatest } from 'rxjs';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { GlobalSearchService } from 'core-app/core/global_search/services/global-search.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\n\nexport const globalSearchTitleSelector = 'global-search-title';\n\n@Component({\n selector: 'global-search-title',\n templateUrl: './global-search-title.component.html',\n})\nexport class GlobalSearchTitleComponent extends UntilDestroyedMixin implements OnInit {\n @Input() public searchTerm:string;\n\n @Input() public project:string;\n\n @Input() public projectScope:string;\n\n @Input() public searchTitle:string;\n\n @InjectField() private currentProjectService:CurrentProjectService;\n\n public text:{ [key:string]:string } = {\n all_projects: this.I18n.t('js.global_search.title.all_projects'),\n project_and_subprojects: this.I18n.t('js.global_search.title.project_and_subprojects'),\n search_for: this.I18n.t('js.global_search.title.search_for'),\n in: this.I18n.t('js.label_in'),\n };\n\n constructor(readonly elementRef:ElementRef,\n readonly cdRef:ChangeDetectorRef,\n readonly globalSearchService:GlobalSearchService,\n readonly I18n:I18nService,\n readonly injector:Injector) {\n super();\n }\n\n ngOnInit() {\n // Listen on changes of search input value and project scope\n combineLatest([\n this.globalSearchService.searchTerm$,\n this.globalSearchService.projectScope$,\n ])\n .pipe(\n distinctUntilChanged(),\n this.untilDestroyed(),\n )\n .subscribe(([newSearchTerm, newProjectScope]) => {\n this.searchTerm = newSearchTerm;\n this.project = this.projectText(newProjectScope);\n this.searchTitle = `${this.text.search_for} ${this.searchTerm} ${this.project === '' ? '' : this.text.in} ${this.project}`;\n\n this.cdRef.detectChanges();\n });\n }\n\n private projectText(scope:string):string {\n const currentProjectName = this.currentProjectService.name ? this.currentProjectService.name : '';\n\n switch (scope) {\n case 'all':\n return this.text.all_projects;\n case 'current_project':\n return currentProjectName;\n case '':\n return `${currentProjectName} ${this.text.project_and_subprojects}`;\n default:\n return '';\n }\n }\n}\n","
    \n
    \n
    \n

    \n {{ text.search_for }}\n \"{{ searchTerm }}\"\n {{ project === '' ? '' : text.in }}\n {{ project }}\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 {\n WorkPackageIsolatedQuerySpaceDirective,\n} from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\n\nexport const globalSearchWorkPackagesSelectorEntry = 'global-search-work-packages-entry';\n\n/**\n * An entry component to be rendered by Rails which opens an isolated query space\n * for the work package search embedded table.\n */\n@Component({\n selector: globalSearchWorkPackagesSelectorEntry,\n hostDirectives: [WorkPackageIsolatedQuerySpaceDirective],\n template: '',\n})\nexport class GlobalSearchWorkPackagesEntryComponent {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { Injector, NgModule } from '@angular/core';\nimport { OpenprojectWorkPackagesModule } from 'core-app/features/work-packages/openproject-work-packages.module';\nimport { GlobalSearchInputComponent } from 'core-app/core/global_search/input/global-search-input.component';\nimport { GlobalSearchWorkPackagesComponent } from 'core-app/core/global_search/global-search-work-packages.component';\nimport { GlobalSearchTabsComponent } from 'core-app/core/global_search/tabs/global-search-tabs.component';\nimport { GlobalSearchTitleComponent } from 'core-app/core/global_search/title/global-search-title.component';\nimport { GlobalSearchService } from 'core-app/core/global_search/services/global-search.service';\nimport {\n GlobalSearchWorkPackagesEntryComponent,\n} from 'core-app/core/global_search/global-search-work-packages-entry.component';\nimport {\n OpenprojectAutocompleterModule,\n} from 'core-app/shared/components/autocompleter/openproject-autocompleter.module';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { RecentItemsService } from 'core-app/core/recent-items.service';\n\n@NgModule({\n imports: [\n OpSharedModule,\n OpenprojectWorkPackagesModule,\n OpenprojectAutocompleterModule,\n ],\n providers: [\n GlobalSearchService,\n RecentItemsService,\n ],\n declarations: [\n GlobalSearchInputComponent,\n GlobalSearchWorkPackagesEntryComponent,\n GlobalSearchWorkPackagesComponent,\n GlobalSearchTabsComponent,\n GlobalSearchTitleComponent,\n ],\n})\nexport class OpenprojectGlobalSearchModule {\n constructor(readonly injector:Injector) {\n }\n}\n","import {\n ChangeDetectorRef, Directive, OnDestroy, OnInit, Renderer2,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { Title } from '@angular/platform-browser';\nimport { GridInitializationService } from 'core-app/shared/components/grids/grid/initialization.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { GridResource } from 'core-app/features/hal/resources/grid-resource';\nimport { GridAddWidgetService } from 'core-app/shared/components/grids/grid/add-widget.service';\nimport { GridAreaService } from 'core-app/shared/components/grids/grid/area.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\n\n@Directive()\nexport abstract class GridPageComponent implements OnInit, OnDestroy {\n public text = {\n title: this.i18n.t(`js.${this.i18nNamespace()}.label`),\n html_title: this.i18n.t(`js.${this.i18nNamespace()}.label`),\n };\n\n constructor(readonly gridInitialization:GridInitializationService,\n // not used in the base class but will be used throughout the subclasses\n readonly pathHelper:PathHelperService,\n readonly currentProject:CurrentProjectService,\n readonly i18n:I18nService,\n readonly cdRef:ChangeDetectorRef,\n readonly title:Title,\n readonly addWidget:GridAddWidgetService,\n readonly renderer:Renderer2,\n readonly areas:GridAreaService) {}\n\n public grid:GridResource;\n\n ngOnInit() {\n this.renderer.addClass(document.body, 'widget-grid-layout');\n this\n .gridInitialization\n .initialize(this.gridScopePath())\n .subscribe((grid) => {\n this.grid = grid;\n this.cdRef.detectChanges();\n });\n\n this.setHtmlTitle();\n }\n\n ngOnDestroy():void {\n this.renderer.removeClass(document.body, 'widget-grid-layout');\n }\n\n private setHtmlTitle() {\n this.title.setTitle(this.text.html_title);\n }\n\n protected abstract i18nNamespace():string;\n\n protected abstract gridScopePath():string;\n}\n","
      \n
      \n
      \n

      \n
      \n\n
        \n
      • \n \n
      • \n
      • \n \n
      • \n
      \n
      \n\n \n\n
      \n","import { Component } from '@angular/core';\nimport { GridPageComponent } from 'core-app/shared/components/grids/grid/page/grid-page.component';\nimport { GRID_PROVIDERS } from 'core-app/shared/components/grids/grid/grid.component';\n\n@Component({\n selector: 'dashboard',\n templateUrl: '../../../shared/components/grids/grid/page/grid-page.component.html',\n styleUrls: ['../../../shared/components/grids/grid/page/grid-page.component.sass'],\n providers: GRID_PROVIDERS,\n})\nexport class DashboardComponent extends GridPageComponent {\n protected i18nNamespace():string {\n return 'dashboards';\n }\n\n protected gridScopePath():string {\n return this.pathHelper.projectDashboardsPath(this.currentProject.identifier!);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { OpSharedModule } from 'core-app/shared/shared.module';\nimport { Ng2StateDeclaration, UIRouter, UIRouterModule } from '@uirouter/angular';\nimport { DashboardComponent } from 'core-app/features/dashboards/dashboard/dashboard.component';\nimport { OpenprojectGridsModule } from 'core-app/shared/components/grids/openproject-grids.module';\n\nconst menuItemClass = 'dashboards-menu-item';\n\nexport const DASHBOARDS_ROUTES:Ng2StateDeclaration[] = [\n {\n name: 'dashboards',\n parent: 'optional_project',\n // The trailing slash is important\n // cf., https://community.openproject.com/wp/29754\n url: '/dashboards/',\n data: {\n bodyClasses: ['router--dashboards-view-base', 'widget-grid-layout'],\n menuItem: menuItemClass,\n },\n component: DashboardComponent,\n },\n];\n\nexport function uiRouterDashboardsConfiguration(uiRouter:UIRouter) {\n // Ensure boards/ are being redirected correctly\n // cf., https://community.openproject.com/wp/29754\n uiRouter.urlService.rules\n .when(\n new RegExp('^/projects/(.*)/dashboards$'),\n (match) => `/projects/${match[1]}/dashboards/`,\n );\n}\n\n@NgModule({\n imports: [\n OpSharedModule,\n\n OpenprojectGridsModule,\n\n // Routes for /dashboards\n UIRouterModule.forChild({\n states: DASHBOARDS_ROUTES,\n config: uiRouterDashboardsConfiguration,\n }),\n ],\n providers: [\n ],\n declarations: [\n DashboardComponent,\n ],\n})\nexport class OpenprojectDashboardsModule {\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 Inject,\n OnInit,\n Input,\n} from '@angular/core';\nimport { OpModalComponent } from 'core-app/shared/components/modal/modal.component';\nimport { OpModalLocalsToken, OpModalService } 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 { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { StateService } from '@uirouter/core';\nimport {\n computePosition,\n flip,\n limitShift,\n Placement,\n shift,\n} from '@floating-ui/dom';\nimport {\n WorkPackageIsolatedQuerySpaceDirective,\n} from 'core-app/features/work-packages/directives/query-space/wp-isolated-query-space.directive';\n\n@Component({\n templateUrl: './wp-preview.modal.html',\n styleUrls: ['./wp-preview.modal.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [WorkPackageIsolatedQuerySpaceDirective],\n})\nexport class WpPreviewModalComponent extends OpModalComponent implements OnInit {\n public workPackage:WorkPackageResource;\n\n public text = {\n created_by: this.i18n.t('js.label_created_by'),\n };\n\n @Input() public alignment?:Placement = 'bottom-end';\n\n @Input() public allowRepositioning? = true;\n\n constructor(\n readonly elementRef:ElementRef,\n @Inject(OpModalLocalsToken) readonly locals:OpModalLocalsMap,\n readonly cdRef:ChangeDetectorRef,\n readonly i18n:I18nService,\n readonly apiV3Service:ApiV3Service,\n readonly opModalService:OpModalService,\n readonly $state:StateService,\n ) {\n super(locals, cdRef, elementRef);\n }\n\n ngOnInit() {\n super.ngOnInit();\n const { workPackageLink } = this.locals;\n const workPackageId = idFromLink(workPackageLink as string|null);\n\n this\n .apiV3Service\n .work_packages\n .id(workPackageId)\n .requireAndStream()\n .subscribe((workPackage:WorkPackageResource) => {\n this.workPackage = workPackage;\n this.cdRef.detectChanges();\n\n const modal = this.elementRef.nativeElement as HTMLElement;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any\n void this.reposition(modal, this.locals.event.target as HTMLElement);\n });\n }\n\n public async reposition(element:HTMLElement, target:HTMLElement) {\n const floatingEl = element.children[0] as HTMLElement;\n const { x, y } = await computePosition(\n target,\n floatingEl,\n {\n placement: this.alignment,\n middleware: this.allowRepositioning ? [\n flip({\n mainAxis: true,\n crossAxis: true,\n fallbackAxisSideDirection: 'start',\n }),\n shift({ limiter: limitShift() }),\n ] : [],\n },\n );\n Object.assign(floatingEl.style, {\n left: `${x}px`,\n top: `${y}px`,\n });\n }\n\n public openStateLink(event:{ workPackageId:string; requestedState:string }) {\n const params = { workPackageId: event.workPackageId };\n void this.$state.go(event.requestedState, 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 { Injectable, Injector, NgZone } from '@angular/core';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { WpPreviewModalComponent } from 'core-app/shared/components/modals/preview-modal/wp-preview-modal/wp-preview.modal';\n\n@Injectable({ providedIn: 'root' })\nexport class PreviewTriggerService {\n private modalElement:HTMLElement;\n\n private mouseInModal = false;\n\n constructor(\n readonly opModalService:OpModalService,\n readonly ngZone:NgZone,\n readonly injector:Injector,\n ) {\n }\n\n setupListener() {\n jQuery(document.body).on('mouseover', '.preview-trigger', (e) => {\n e.preventDefault();\n e.stopPropagation();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const el = e.target as HTMLElement;\n if (el) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const href = el.getAttribute('href');\n\n if (!href) {\n return;\n }\n\n this.opModalService.show(\n WpPreviewModalComponent,\n this.injector,\n { workPackageLink: href, event: e },\n true,\n ).subscribe((previewModal) => {\n this.modalElement = previewModal.elementRef.nativeElement as HTMLElement;\n void previewModal.reposition(this.modalElement, el);\n });\n }\n });\n\n jQuery(document.body).on('mouseleave', '.preview-trigger', () => {\n this.closeAfterTimeout();\n });\n\n jQuery(document.body).on('mouseleave', '.op-wp-preview-modal', () => {\n this.mouseInModal = false;\n this.closeAfterTimeout();\n });\n\n jQuery(document.body).on('mouseenter', '.op-wp-preview-modal', () => {\n this.mouseInModal = true;\n });\n }\n\n private closeAfterTimeout() {\n this.ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n if (!this.mouseInModal) {\n this.opModalService.close();\n }\n }, 100);\n });\n }\n\n private isMouseOverPreview(e:JQuery.MouseLeaveEvent) {\n if (!this.modalElement) {\n return false;\n }\n\n const previewElement = jQuery(this.modalElement.children[0]);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (previewElement && previewElement.offset()) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const horizontalHover = e.pageX >= Math.floor(previewElement.offset()!.left) && e.pageX < previewElement.offset()!.left + previewElement.width()!;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const verticalHover = e.pageY >= Math.floor(previewElement.offset()!.top) && e.pageY < previewElement.offset()!.top + previewElement.height()!;\n return horizontalHover && verticalHover;\n }\n return false;\n }\n}\n","import { Component } from '@angular/core';\nimport { GridPageComponent } from 'core-app/shared/components/grids/grid/page/grid-page.component';\nimport { GRID_PROVIDERS } from 'core-app/shared/components/grids/grid/grid.component';\n\n@Component({\n selector: 'overview',\n templateUrl: '../../shared/components/grids/grid/page/grid-page.component.html',\n styleUrls: ['../../shared/components/grids/grid/page/grid-page.component.sass'],\n providers: GRID_PROVIDERS,\n})\nexport class OverviewComponent extends GridPageComponent {\n protected i18nNamespace():string {\n return 'overviews';\n }\n\n protected gridScopePath():string {\n return this.pathHelper.projectPath(this.currentProject.identifier!);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { OpSharedModule } from 'core-app/shared/shared.module';\nimport { Ng2StateDeclaration, UIRouter, UIRouterModule } from '@uirouter/angular';\nimport { OpenprojectGridsModule } from 'core-app/shared/components/grids/openproject-grids.module';\nimport { OverviewComponent } from 'core-app/features/overview/overview.component';\n\nconst menuItemClass = 'overview-menu-item';\n\nexport const OVERVIEW_ROUTES:Ng2StateDeclaration[] = [\n {\n name: 'overview',\n parent: 'optional_project',\n // The trailing slash is important\n // cf., https://community.openproject.com/wp/29754\n url: '/',\n data: {\n menuItem: menuItemClass,\n },\n component: OverviewComponent,\n },\n];\n\nexport function uiRouterOverviewConfiguration(uiRouter:UIRouter):void {\n // Ensure projects/:project_id/ are being redirected correctly\n // cf., https://community.openproject.com/wp/29754\n uiRouter.urlService.rules\n .when(\n new RegExp('^/projects(?!/new$)/([^/?]+)$'),\n (match:string[]) => `/projects/${match[1]}/${window.location.search}`,\n );\n}\n\n@NgModule({\n imports: [\n OpSharedModule,\n\n OpenprojectGridsModule,\n\n UIRouterModule.forChild({\n states: OVERVIEW_ROUTES,\n config: uiRouterOverviewConfiguration,\n }),\n ],\n providers: [\n ],\n declarations: [\n OverviewComponent,\n ],\n})\nexport class OpenprojectOverviewModule {\n}\n","import { Component, ViewEncapsulation } from '@angular/core';\nimport { GRID_PROVIDERS } from 'core-app/shared/components/grids/grid/grid.component';\nimport { GridPageComponent } from 'core-app/shared/components/grids/grid/page/grid-page.component';\n\n@Component({\n templateUrl: '../../shared/components/grids/grid/page/grid-page.component.html',\n styleUrls: ['../../shared/components/grids/grid/page/grid-page.component.sass'],\n providers: GRID_PROVIDERS,\n encapsulation: ViewEncapsulation.None,\n})\nexport class MyPageComponent extends GridPageComponent {\n protected i18nNamespace():string {\n return 'my_page';\n }\n\n protected gridScopePath():string {\n return this.pathHelper.myPagePath();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { Ng2StateDeclaration, UIRouterModule } from '@uirouter/angular';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport { OpenprojectGridsModule } from 'core-app/shared/components/grids/openproject-grids.module';\nimport { MyPageComponent } from 'core-app/features/my-page/my-page.component';\n\nexport const MY_PAGE_ROUTES:Ng2StateDeclaration[] = [\n {\n name: 'my_page',\n url: '/my/page',\n component: MyPageComponent,\n data: {\n bodyClasses: ['router--work-packages-my-page', 'widget-grid-layout'],\n parent: 'work-packages',\n },\n },\n];\n\n@NgModule({\n imports: [\n OpSharedModule,\n OpenprojectGridsModule,\n OpenprojectModalModule,\n\n // Routes for my_page\n UIRouterModule.forChild({ states: MY_PAGE_ROUTES }),\n ],\n declarations: [\n MyPageComponent,\n ],\n})\nexport class OpenprojectMyPageModule {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { FocusHelperService } from 'core-app/shared/directives/focus/focus-helper';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport * as Mousetrap from 'mousetrap';\n\nconst accessKeys = {\n preview: 1,\n newWorkPackage: 2,\n edit: 3,\n quickSearch: 4,\n projectSearch: 5,\n help: 6,\n moreMenu: 7,\n details: 8,\n};\n\n// this could be extracted into a separate component if it grows\nconst accessibleListSelector = 'table.keyboard-accessible-list';\nconst accessibleRowSelector = 'table.keyboard-accessible-list tbody tr';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class KeyboardShortcutService {\n // maybe move it to a .constant\n private shortcuts:{ [name:string]:() => void } = {\n /* eslint-disable quote-props */\n '?': () => this.showHelpModal(),\n 'g m': this.globalAction('myPagePath'),\n 'g o': this.projectScoped('projectPath'),\n 'g w p': this.projectScoped('projectWorkPackagesPath'),\n 'g w i': this.projectScoped('projectWikiPath'),\n 'g a': this.projectScoped('projectActivityPath'),\n 'g c': this.projectScoped('projectCalendarPath'),\n 'g n': this.projectScoped('projectNewsPath'),\n 'n w p': this.projectScoped('projectWorkPackageNewPath'),\n\n 'g e': this.accessKey('edit'),\n 'g p': this.accessKey('preview'),\n 'd w p': this.accessKey('details'),\n 'm': this.accessKey('moreMenu'),\n 'p': this.accessKey('projectSearch'),\n 's': this.accessKey('quickSearch'),\n 'k': () => this.focusPrevItem(),\n 'j': () => this.focusNextItem(),\n /* eslint-enable quote-props */\n };\n\n constructor(private readonly PathHelper:PathHelperService,\n private readonly FocusHelper:FocusHelperService,\n private readonly currentProject:CurrentProjectService) {\n this.register();\n }\n\n /**\n * Register the keyboard shortcuts.\n */\n public register():void {\n _.each(this.shortcuts, (action:() => void, key:string) => Mousetrap.bind(key, action));\n }\n\n public accessKey(keyName:'preview'|'newWorkPackage'|'edit'|'quickSearch'|'projectSearch'|'help'|'moreMenu'|'details'):() => void {\n const key = accessKeys[keyName];\n\n return () => {\n const elem = jQuery(`[accesskey=${key}]:first`);\n if (elem.is('input') || elem.attr('id') === 'global-search-input') {\n // timeout with delay so that the key is not\n // triggered on the input\n setTimeout(() => this.FocusHelper.focus(elem[0]), 200);\n } else if (elem.is('[href]')) {\n this.clickLink(elem[0] as HTMLLinkElement);\n } else {\n elem[0].click();\n }\n };\n }\n\n public globalAction(action:keyof PathHelperService) {\n return ():void => {\n window.location.href = (this.PathHelper[action] as () => string)();\n };\n }\n\n public projectScoped(action:keyof PathHelperService) {\n return ():void => {\n const projectIdentifier = this.currentProject.identifier;\n if (projectIdentifier) {\n window.location.href = (this.PathHelper[action] as (identifier:string|null) => string)(projectIdentifier);\n }\n };\n }\n\n // eslint-disable-next-line class-methods-use-this\n clickLink(link:HTMLLinkElement):void {\n const event = new MouseEvent('click', {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n const cancelled = !link.dispatchEvent(event);\n\n if (!cancelled) {\n window.location.href = link.href;\n }\n }\n\n showHelpModal():void {\n window.open(this.PathHelper.keyboardShortcutsHelpPath());\n }\n\n focusItemOffset(offset:number):void {\n const list = document.querySelector(accessibleListSelector);\n if (!list) {\n return;\n }\n\n const rows:HTMLElement[] = Array.from(list.querySelectorAll('tbody > tr'));\n let index:number;\n if (document.activeElement) {\n index = rows.indexOf(document.activeElement as HTMLElement);\n const target = rows[index + offset];\n target?.focus();\n }\n }\n\n focusNextItem():void {\n this.focusItemOffset(1);\n }\n\n focusPrevItem():void {\n this.focusItemOffset(-1);\n }\n}\n","import { Observable } from 'rxjs';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { HttpParams } from '@angular/common/http';\nimport { Component } from '@angular/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport {\n IUserAutocompleteItem,\n UserAutocompleterComponent,\n} from 'core-app/shared/components/autocompleter/user-autocompleter/user-autocompleter.component';\nimport { URLParamsEncoder } from 'core-app/features/hal/services/url-params-encoder';\n\n@Component({\n templateUrl: '../op-autocompleter/op-autocompleter.component.html',\n})\nexport class MembersAutocompleterComponent extends UserAutocompleterComponent {\n @InjectField() pathHelper:PathHelperService;\n\n public getAvailableUsers(searchTerm:string):Observable {\n return this\n .http\n .get(\n this.url,\n {\n params: new HttpParams({ encoder: new URLParamsEncoder(), fromObject: { q: searchTerm } }),\n responseType: 'json',\n headers: { 'Content-Type': 'application/json; charset=utf-8' },\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 { NgModule } from '@angular/core';\nimport { MembersAutocompleterComponent } from 'core-app/shared/components/autocompleter/members-autocompleter/members-autocompleter.component';\nimport { NgSelectModule } from '@ng-select/ng-select';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { FormsModule } from '@angular/forms';\n\n@NgModule({\n imports: [\n OpSharedModule,\n FormsModule,\n NgSelectModule,\n ],\n exports: [],\n declarations: [\n MembersAutocompleterComponent,\n ],\n})\nexport class OpenprojectMembersModule { }\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport { OpModalWrapperAugmentService } from 'core-app/shared/components/modal/modal-wrapper-augment.service';\n\n@NgModule({\n imports: [OpenprojectModalModule],\n})\nexport class OpenprojectAugmentingModule {\n constructor(modalWrapper:OpModalWrapperAugmentService) {\n // Setup augmenting services\n modalWrapper.setupListener();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { InviteUserModalComponent } from './invite-user.component';\nimport ClickEvent = JQuery.ClickEvent;\n\nconst attributeSelector = '[invite-user-modal-augment]';\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({ providedIn: 'root' })\nexport class OpInviteUserModalAugmentService {\n constructor(\n @Inject(DOCUMENT) protected documentElement:Document,\n protected opModalService:OpModalService,\n protected currentProjectService:CurrentProjectService,\n ) { }\n\n /**\n * Create initial listeners for Rails-rendered modals\n */\n public setupListener() {\n const matches = this.documentElement.querySelectorAll(attributeSelector);\n for (let i = 0; i < matches.length; ++i) {\n const el = matches[i] as HTMLElement;\n el.addEventListener('click', this.spawnModal.bind(this));\n }\n }\n\n private spawnModal(event:MouseEvent) {\n event.preventDefault();\n\n this.opModalService.show(\n InviteUserModalComponent,\n 'global',\n { projectId: this.currentProjectService.id },\n ).subscribe((modal) => modal\n .closingEvent\n .subscribe((instance:InviteUserModalComponent) => {\n // Just reload the page for now if we saved anything\n if (instance.data) {\n window.location.reload();\n }\n }));\n }\n}\n","\n
      {{text.title}}
      \n\n
      \n\n
      \n \n \n\n \n {{ text.project.lackingPermissionInfo }}\n
      \n\n \n {{ text.project.required }}\n \n\n \n {{ text.project.lackingPermission }}\n \n \n\n \n \n\n \n
      \n {{ text.type.required }}\n
      \n \n
      \n \n\n
      \n
      \n \n \n
      \n
      \n\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport {\n AbstractControl,\n UntypedFormControl,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { IOpOptionListOption } from 'core-app/shared/components/option-list/option-list.component';\nimport { cloneHalResource } from 'core-app/features/hal/helpers/hal-resource-builder';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { PrincipalType } from '../invite-user.component';\nimport { ProjectAllowedValidator } from './project-allowed.validator';\nimport { map } from 'rxjs/operators';\nimport { IProjectAutocompleteItem } from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocomplete-item';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { ICapability } from 'core-app/core/state/capabilities/capability.model';\nimport { firstValueFrom } from 'rxjs';\n\n@Component({\n selector: 'op-ium-project-selection',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './project-selection.component.html',\n})\nexport class ProjectSelectionComponent implements OnInit {\n @Input() type:PrincipalType;\n\n @Input() project:ProjectResource|null;\n\n // eslint-disable-next-line @angular-eslint/no-output-native\n @Output() close = new EventEmitter();\n\n @Output() save = new EventEmitter<{ project:ProjectResource|null, type:string }>();\n\n public text = {\n title: this.I18n.t('js.invite_user_modal.title.invite'),\n project: {\n label: this.I18n.t('js.invite_user_modal.project.label'),\n required: this.I18n.t('js.invite_user_modal.project.required'),\n lackingPermission: this.I18n.t('js.invite_user_modal.project.lacking_permission'),\n lackingPermissionInfo: this.I18n.t('js.invite_user_modal.project.lacking_permission_info'),\n noInviteRights: this.I18n.t('js.invite_user_modal.project.no_invite_rights'),\n },\n type: {\n required: this.I18n.t('js.invite_user_modal.type.required'),\n },\n nextButton: this.I18n.t('js.invite_user_modal.project.next_button'),\n cancelButton: this.I18n.t('js.button_cancel'),\n };\n\n public typeOptions:IOpOptionListOption[] = [\n {\n value: PrincipalType.User,\n title: this.I18n.t('js.invite_user_modal.type.user.title'),\n description: this.I18n.t('js.invite_user_modal.type.user.description'),\n },\n {\n value: PrincipalType.Group,\n title: this.I18n.t('js.invite_user_modal.type.group.title'),\n description: this.I18n.t('js.invite_user_modal.type.group.description'),\n },\n ];\n\n projectAndTypeForm = new UntypedFormGroup({\n // eslint-disable-next-line @typescript-eslint/unbound-method\n type: new UntypedFormControl(PrincipalType.User, [Validators.required]),\n // eslint-disable-next-line @typescript-eslint/unbound-method\n project: new UntypedFormControl(null, [Validators.required], ProjectAllowedValidator(this.currentUserService)),\n });\n\n get typeControl():AbstractControl {\n return this.projectAndTypeForm.get('type') as AbstractControl;\n }\n\n get projectControl():AbstractControl {\n return this.projectAndTypeForm.get('project') as AbstractControl;\n }\n\n private projectInviteCapabilities:ICapability[] = [];\n\n constructor(\n readonly I18n:I18nService,\n readonly elementRef:ElementRef,\n readonly bannersService:BannersService,\n readonly apiV3Service:ApiV3Service,\n readonly currentUserService:CurrentUserService,\n readonly cdRef:ChangeDetectorRef,\n ) {}\n\n ngOnInit():void {\n this.typeControl.setValue(this.type);\n\n if (this.project) {\n this.projectControl.setValue(cloneHalResource(this.project));\n }\n\n this.setPlaceholderOption();\n\n this\n .currentUserService\n .capabilities$(['memberships/create'], null)\n .pipe(\n map((capabilities) => capabilities.filter((c) => c._links.action.href.endsWith('/memberships/create'))),\n )\n .subscribe((projectInviteCapabilities) => {\n this.projectInviteCapabilities = projectInviteCapabilities;\n this.cdRef.detectChanges();\n });\n }\n\n private setPlaceholderOption():void {\n if (this.bannersService.eeShowBanners) {\n this.typeOptions.push({\n value: PrincipalType.Placeholder,\n title: this.I18n.t('js.invite_user_modal.type.placeholder.title_no_ee'),\n description: this.I18n.t('js.invite_user_modal.type.placeholder.description_no_ee', {\n eeHref: this.bannersService.getEnterPriseEditionUrl({\n referrer: 'placeholder-users',\n hash: 'placeholder-users',\n }),\n }),\n disabled: true,\n });\n } else {\n this.typeOptions.push({\n value: PrincipalType.Placeholder,\n title: this.I18n.t('js.invite_user_modal.type.placeholder.title'),\n description: this.I18n.t('js.invite_user_modal.type.placeholder.description'),\n disabled: false,\n });\n }\n }\n\n async onSubmit($e:Event):Promise {\n $e.preventDefault();\n if (this.projectAndTypeForm.invalid) {\n this.projectAndTypeForm.markAsDirty();\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const projectId = idFromLink(this.projectControl?.value?.href);\n const project = await firstValueFrom(this.apiV3Service.projects.id(projectId).get());\n\n this.save.emit({\n project,\n type: this.typeControl.value as string,\n });\n }\n\n APIFiltersForProjects:IAPIFilter[] = [{ name: 'active', operator: '=', values: ['t'] }];\n\n projectFilterFn(projects:IProjectAutocompleteItem[]):IProjectAutocompleteItem[] {\n const mapped = projects.map((project) => {\n const disabled = !this.projectInviteCapabilities.find((cap) => idFromLink(cap._links.context.href) === project.id.toString());\n return {\n ...project,\n disabled,\n disabledReason: disabled ? this.text.project.noInviteRights : '',\n };\n });\n\n mapped.sort(\n (a, b) => (a.disabled ? 1 : 0) - (b.disabled ? 1 : 0),\n );\n\n return mapped;\n }\n}\n","import { AbstractControl } from '@angular/forms';\nimport {\n Observable,\n of,\n} from 'rxjs';\nimport {\n catchError,\n map,\n take,\n} from 'rxjs/operators';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\n\nexport const ProjectAllowedValidator = (currentUser:CurrentUserService) => (control:AbstractControl):Observable => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const href = (control.value?.href || control.value?.$links?.self.href) as string;\n const id = (href ? idFromLink(href) : control.value) as string;\n return currentUser\n .hasCapabilities$(\n 'memberships/create',\n id,\n )\n .pipe(\n take(1),\n map((isAllowed) => (isAllowed ? null : { lackingPermission: true })),\n catchError(() => of(null)),\n );\n};\n","\n \n {{ item.principal?.name || item.name }}\n \n\n \n \n \n
      {{ item.principal.name }}
      \n\n \n {{ text.alreadyAMember() }}\n \n
      \n\n \n \n
      \n {{ text.noResults[type] }}\n
      \n
      \n\n\n \n \n
      \n \n {{ text.inviteNewUser }}\n {{ input }}\n
      \n\n \n
      \n \n {{ text.createNewPlaceholder }}\n {{ input }}\n
      \n
      \n\n","import {\n Component,\n Input,\n EventEmitter,\n OnInit,\n Output,\n ElementRef,\n} from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport {\n Observable,\n BehaviorSubject,\n combineLatest,\n forkJoin,\n} from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n share,\n map,\n shareReplay,\n switchMap,\n} from 'rxjs/operators';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { UserResource } from 'core-app/features/hal/resources/user-resource';\nimport { PrincipalLike } from 'core-app/shared/components/principal/principal-types';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\nimport { PrincipalType } from '../invite-user.component';\nimport { CapabilitiesResourceService } from 'core-app/core/state/capabilities/capabilities.service';\n\ninterface NgSelectPrincipalOption {\n principal:PrincipalLike,\n disabled:boolean;\n}\n\n@Component({\n selector: 'op-ium-principal-search',\n templateUrl: './principal-search.component.html',\n})\nexport class PrincipalSearchComponent extends UntilDestroyedMixin implements OnInit {\n @Input() spotFormBinding:UntypedFormControl;\n\n @Input() type:PrincipalType;\n\n @Input() project:ProjectResource;\n\n @Output() createNew = new EventEmitter();\n\n public input$ = new BehaviorSubject('');\n\n public input = '';\n\n public items$:Observable = this.input$.pipe(\n this.untilDestroyed(),\n debounceTime(200),\n distinctUntilChanged(),\n switchMap(this.loadPrincipalData.bind(this)),\n share(),\n );\n\n private emailRegExp = /^\\S+@\\S+\\.\\S+$/;\n\n public canInviteByEmail$ = combineLatest(\n this.items$,\n this.input$,\n this.currentUserService.hasCapabilities$('users/create', 'global'),\n ).pipe(\n map(([elements, input, canCreateUsers]) => canCreateUsers\n && this.type === PrincipalType.User\n && !!input\n && this.emailRegExp.test(input)\n && !elements.find((el) => (el.principal as UserResource).email === input)),\n );\n\n public canCreateNewPlaceholder$ = combineLatest([\n this.items$,\n this.input$,\n this.currentUserService.hasCapabilities$('placeholder_users/create', 'global'),\n ])\n .pipe(\n map(([elements, input, hasCapability]) => {\n if (!hasCapability) {\n return false;\n }\n\n if (this.type !== PrincipalType.Placeholder) {\n return false;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any\n return !!input && !elements.find((el:any) => el.name === input);\n }),\n );\n\n public showAddTag = false;\n\n public text = {\n alreadyAMember: () => this.I18n.t('js.invite_user_modal.principal.already_member_message', {\n project: this.project?.name,\n }),\n inviteNewUser: this.I18n.t('js.invite_user_modal.principal.invite_user'),\n createNewPlaceholder: this.I18n.t('js.invite_user_modal.principal.create_new_placeholder'),\n noResults: {\n User: this.I18n.t('js.invite_user_modal.principal.no_results_user'),\n PlaceholderUser: this.I18n.t('js.invite_user_modal.principal.no_results_placeholder'),\n Group: this.I18n.t('js.invite_user_modal.principal.no_results_group'),\n },\n };\n\n constructor(\n public I18n:I18nService,\n readonly elementRef:ElementRef,\n readonly apiV3Service:ApiV3Service,\n readonly currentUserService:CurrentUserService,\n readonly capabilitiesService:CapabilitiesResourceService,\n ) {\n super();\n\n this.input$.subscribe((input:string) => {\n this.input = input;\n });\n\n combineLatest(\n this.canInviteByEmail$,\n this.canCreateNewPlaceholder$,\n ).pipe(\n map(([canInviteByEmail, canCreateNewPlaceholder]:boolean[]) => canInviteByEmail || canCreateNewPlaceholder),\n ).subscribe((showAddTag) => {\n this.showAddTag = showAddTag;\n });\n }\n\n ngOnInit() {\n // Make sure we have initial data\n setTimeout(() => this.input$.next(''));\n }\n\n public createNewFromInput() {\n this.createNew.emit({ name: this.input });\n }\n\n private loadPrincipalData(searchTerm:string) {\n const nonMemberFilter = new ApiV3FilterBuilder();\n if (searchTerm) {\n nonMemberFilter.add('any_name_attribute', '~', [searchTerm]);\n }\n nonMemberFilter.add('status', '!', [3]);\n nonMemberFilter.add('type', '=', [this.type]);\n nonMemberFilter.add('member', '!', [this.project?.id || '']);\n const nonMembers = this.apiV3Service.principals.filtered(nonMemberFilter).get();\n\n const memberFilter = new ApiV3FilterBuilder();\n if (searchTerm) {\n memberFilter.add('any_name_attribute', '~', [searchTerm]);\n }\n memberFilter.add('status', '!', [3]);\n memberFilter.add('type', '=', [this.type]);\n memberFilter.add('member', '=', [this.project?.id || '']);\n const members = this.apiV3Service.principals.filtered(memberFilter).get();\n\n return forkJoin({\n members,\n nonMembers,\n })\n .pipe(\n map(({ members, nonMembers }) => [\n ...nonMembers.elements.map((nonMember:PrincipalLike) => ({\n principal: nonMember,\n disabled: false,\n })),\n ...members.elements.map((member:PrincipalLike) => ({\n principal: member,\n disabled: true,\n })),\n ].slice(0, 5)),\n shareReplay(1),\n );\n }\n\n compareWith = (a:NgSelectPrincipalOption, b:PrincipalLike) => a.principal.id === b.id;\n}\n","\n \n \n
      {{ item.name }}
      \n
      \n\n \n \n
      \n {{ text.noRolesFound }}\n
      \n
      \n\n","import {\n Component,\n ElementRef,\n Input,\n OnInit,\n} from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport {\n combineLatest,\n Observable,\n Subject,\n} from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n} from 'rxjs/operators';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder';\n\n/* eslint-disable-next-line change-detection-strategy/on-push */\n@Component({\n selector: 'op-ium-role-search',\n templateUrl: './role-search.component.html',\n})\nexport class RoleSearchComponent extends UntilDestroyedMixin implements OnInit {\n @Input() spotFormBinding:UntypedFormControl;\n\n public input$ = new Subject();\n\n public roles$ = new Subject();\n\n public items$:Observable;\n\n public text = {\n noRolesFound: this.I18n.t('js.invite_user_modal.role.no_roles_found'),\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly elementRef:ElementRef,\n readonly apiV3Service:ApiV3Service,\n ) {\n super();\n\n this.items$ = combineLatest(\n this.input$\n .pipe(\n this.untilDestroyed(),\n debounceTime(200),\n filter((input) => typeof input === 'string'),\n map((input:string) => input.toLowerCase()),\n distinctUntilChanged(),\n ),\n this.roles$,\n ).pipe(\n map(([input, roles]:[string, any[]]) => roles.filter((role) => !input || role.name.toLowerCase().indexOf(input) !== -1)),\n );\n }\n\n ngOnInit():void {\n const filters = new ApiV3FilterBuilder();\n filters.add('grantable', '=', true);\n filters.add('unit', '=', ['project']);\n this.apiV3Service.roles.filtered(filters).get().subscribe(({ elements }) => this.roles$.next(elements));\n\n setTimeout(() => this.input$.next(''));\n }\n}\n","\n
      {{text.principal.title()}}
      \n\n
      \n\n
      \n \n \n\n \n {{ text.principal.inviteUser }} {{ principal.name }}\n {{ text.principal.change }}\n

      \n\n \n {{ text.principal.createNewPlaceholder }} {{ principal.name }}\n {{ text.principal.change }}\n

      \n\n \n {{ text.principal.required[type] }}\n
      \n \n\n \n\n \n \n

      \n\n \n {{ text.role.required }}\n \n \n\n \n\n \n \n\n \n

      \n \n \n\n
      \n
      \n \n \n {{ text.principal.backButton }}\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 ViewChild,\n} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport {\n AbstractControl,\n UntypedFormControl,\n UntypedFormGroup,\n Validators,\n} from '@angular/forms';\nimport { take } from 'rxjs/internal/operators/take';\nimport { map } from 'rxjs/operators';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { DynamicFormComponent } from 'core-app/shared/components/dynamic-forms/components/dynamic-form/dynamic-form.component';\nimport {\n PrincipalData,\n PrincipalLike,\n} from 'core-app/shared/components/principal/principal-types';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { PrincipalType } from '../invite-user.component';\nimport { RoleResource } from 'core-app/features/hal/resources/role-resource';\n\nfunction extractCustomFieldsFromSchema(schema:IOPFormSettings['_embedded']['schema']) {\n return Object.keys(schema)\n .reduce((fields, name) => {\n if (name.startsWith('customField') && schema[name].required) {\n return {\n ...fields,\n [name]: schema[name],\n };\n }\n\n return fields;\n }, {});\n}\n\n@Component({\n selector: 'op-ium-principal',\n templateUrl: './principal.component.html',\n styleUrls: ['./principal.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PrincipalComponent implements OnInit {\n @Input() principalData:PrincipalData;\n\n @Input() project:ProjectResource;\n\n @Input() type:PrincipalType;\n\n @Input() roleData:RoleResource;\n\n @Input() messageData = '';\n\n @Output() close = new EventEmitter();\n\n @Output() save = new EventEmitter<{\n principalData:PrincipalData,\n isAlreadyMember:boolean,\n role:RoleResource,\n message:string\n }>();\n\n @Output() back = new EventEmitter();\n\n @ViewChild(DynamicFormComponent) dynamicForm:DynamicFormComponent;\n\n public PrincipalType = PrincipalType;\n\n public text = {\n principal: {\n title: ():string => this.I18n.t('js.invite_user_modal.title.invite'),\n label: {\n User: this.I18n.t('js.invite_user_modal.principal.label.name_or_email'),\n PlaceholderUser: this.I18n.t('js.invite_user_modal.principal.label.name'),\n Group: this.I18n.t('js.invite_user_modal.principal.label.name'),\n Email: this.I18n.t('js.label_email'),\n },\n change: this.I18n.t('js.label_change'),\n inviteUser: this.I18n.t('js.invite_user_modal.principal.invite_user'),\n createNewPlaceholder: this.I18n.t('js.invite_user_modal.principal.create_new_placeholder'),\n required: {\n User: this.I18n.t('js.invite_user_modal.principal.required.user'),\n PlaceholderUser: this.I18n.t('js.invite_user_modal.principal.required.placeholder'),\n Group: this.I18n.t('js.invite_user_modal.principal.required.group'),\n },\n backButton: this.I18n.t('js.invite_user_modal.back'),\n nextButton: this.I18n.t('js.invite_user_modal.principal.next_button'),\n cancelButton: this.I18n.t('js.button_cancel'),\n },\n role: {\n label: ():string => this.I18n.t('js.invite_user_modal.role.label', {\n project: this.project?.name,\n }),\n description: ():string => this.I18n.t('js.invite_user_modal.role.description', {\n principal: this.principal?.name,\n }),\n required: this.I18n.t('js.invite_user_modal.role.required'),\n },\n message: {\n label: this.I18n.t('js.invite_user_modal.message.label'),\n description: ():string => this.I18n.t('js.invite_user_modal.message.description', {\n principal: this.principal?.name,\n }),\n },\n };\n\n public principalForm = new UntypedFormGroup({\n // eslint-disable-next-line @typescript-eslint/unbound-method\n principal: new UntypedFormControl(null, [Validators.required]),\n userDynamicFields: new UntypedFormGroup({}),\n // eslint-disable-next-line @typescript-eslint/unbound-method\n role: new UntypedFormControl(null, [Validators.required]),\n message: new UntypedFormControl(''),\n });\n\n public userDynamicFieldConfig:{\n payload:IOPFormSettings['_embedded']['payload']|null,\n schema:IOPFormSettings['_embedded']['schema']|null,\n } = {\n payload: null,\n schema: null,\n };\n\n get messageControl():AbstractControl|null {\n return this.principalForm.get('message');\n }\n\n get roleControl():AbstractControl|null {\n return this.principalForm.get('role');\n }\n\n get principalControl():AbstractControl|null {\n return this.principalForm.get('principal');\n }\n\n get principal():PrincipalLike|undefined {\n return this.principalControl?.value as PrincipalLike|undefined;\n }\n\n get role():RoleResource|undefined {\n return this.roleControl?.value as RoleResource|undefined;\n }\n\n get message():string|undefined {\n return this.messageControl?.value as string|undefined;\n }\n\n get dynamicFieldsControl():AbstractControl|null {\n return this.principalForm.get('userDynamicFields');\n }\n\n get customFields():{ [key:string]:any } {\n return this.dynamicFieldsControl?.value;\n }\n\n get hasPrincipalSelected():boolean {\n return !!this.principal;\n }\n\n get textLabel():string {\n if (this.type === PrincipalType.User && this.isNewPrincipal) {\n return this.text.principal.label.Email;\n }\n return this.text.principal.label[this.type];\n }\n\n get isNewPrincipal():boolean {\n return this.hasPrincipalSelected && !(this.principal instanceof HalResource);\n }\n\n get isMemberOfCurrentProject():boolean {\n return !!this.principalControl?.value?.memberships?.elements?.find((mem:any) => mem.project.id === this.project.id);\n }\n\n constructor(\n readonly I18n:I18nService,\n readonly httpClient:HttpClient,\n readonly apiV3Service:ApiV3Service,\n readonly cdRef:ChangeDetectorRef,\n ) {}\n\n ngOnInit():void {\n this.principalControl?.setValue(this.principalData.principal);\n this.roleControl?.setValue(this.roleData);\n this.messageControl?.setValue(this.messageData);\n\n if (this.type === PrincipalType.User) {\n const payload = this.isNewPrincipal ? this.principalData.customFields : {};\n this\n .apiV3Service\n .users\n .form\n .post(payload)\n .pipe(\n take(1),\n // The subsequent code expects to not work with a HalResource but rather with the raw\n // api response.\n map((formResource) => formResource.$source),\n )\n .subscribe((formConfig) => {\n this.userDynamicFieldConfig.schema = extractCustomFieldsFromSchema(formConfig._embedded?.schema);\n this.userDynamicFieldConfig.payload = formConfig._embedded?.payload;\n this.cdRef.detectChanges();\n });\n }\n }\n\n createNewFromInput(input:PrincipalLike):void {\n this.principalControl?.setValue(input);\n }\n\n onSubmit($e:Event):void {\n $e.preventDefault();\n\n if (this.dynamicForm) {\n this.dynamicForm.validateForm().subscribe(() => {\n this.onValidatedSubmit();\n });\n } else {\n this.onValidatedSubmit();\n }\n }\n\n onValidatedSubmit():void {\n if (this.principalForm.invalid) {\n return;\n }\n\n // The code below transforms the model value as it comes from the dynamic form to the value accepted by the API.\n // This is not just necessary for submit, but also so that we can reseed the initial values to the payload\n // when going back to this step after having completed it once.\n const fieldsSchema = this.userDynamicFieldConfig.schema || {};\n const customFields = Object.keys(fieldsSchema)\n .reduce((result, fieldKey) => {\n const fieldSchema = fieldsSchema[fieldKey];\n let fieldValue = this.customFields[fieldKey];\n\n if (fieldSchema.location === '_links') {\n fieldValue = Array.isArray(fieldValue)\n ? fieldValue.map((opt:any) => (opt._links ? opt._links.self : opt))\n : (fieldValue._links ? fieldValue._links.self : fieldValue);\n }\n\n result = {\n ...result,\n [fieldKey]: fieldValue,\n };\n\n return result;\n }, {});\n\n this.save.emit({\n principalData: {\n customFields,\n principal: this.principal as PrincipalLike,\n },\n isAlreadyMember: this.isMemberOfCurrentProject,\n role: this.role as RoleResource,\n message: this.message as string,\n });\n }\n}\n","\n
      {{text.title()}}
      \n\n
      \n\n
      \n\n \n

      {{ project.name }}

      \n
      \n\n \n

      {{ principal?.name }}

      \n
      \n\n \n

      {{ role.name }}

      \n
      \n\n \n

      {{ message }}

      \n \n
      \n\n
      \n
      \n \n \n {{ text.backButton }}\n \n
      \n\n
      \n {{ text.cancelButton }}\n {{ text.nextButton() }}\n
      \n
      \n\n","import {\n Component,\n Input,\n EventEmitter,\n Output,\n ElementRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { mapTo, switchMap } from 'rxjs/operators';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { RoleResource } from 'core-app/features/hal/resources/role-resource';\nimport { PrincipalData, PrincipalLike } from 'core-app/shared/components/principal/principal-types';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { PrincipalType } from '../invite-user.component';\n\n@Component({\n selector: 'op-ium-summary',\n templateUrl: './summary.component.html',\n styleUrls: ['./summary.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SummaryComponent {\n @Input() type:PrincipalType;\n\n @Input() project:ProjectResource;\n\n @Input() role:RoleResource;\n\n @Input() principalData:PrincipalData;\n\n @Input() message = '';\n\n @Output() close = new EventEmitter();\n\n @Output() back = new EventEmitter();\n\n @Output() save = new EventEmitter();\n\n public PrincipalType = PrincipalType;\n\n public text = {\n title: ():string => this.I18n.t('js.invite_user_modal.title.invite'),\n projectLabel: this.I18n.t('js.invite_user_modal.project.label'),\n principalLabel: {\n User: this.I18n.t('js.invite_user_modal.principal.label.name_or_email'),\n PlaceholderUser: this.I18n.t('js.invite_user_modal.principal.label.name'),\n Group: this.I18n.t('js.invite_user_modal.principal.label.name'),\n },\n roleLabel: ():string => this.I18n.t('js.invite_user_modal.role.label', {\n project: this.project?.name,\n }),\n messageLabel: this.I18n.t('js.invite_user_modal.message.label'),\n backButton: this.I18n.t('js.invite_user_modal.back'),\n cancelButton: this.I18n.t('js.button_cancel'),\n nextButton: ():string => this.I18n.t('js.invite_user_modal.summary.next_button', {\n type: this.type,\n principal: this.principal,\n }),\n };\n\n public get principal():PrincipalLike|null {\n return this.principalData.principal;\n }\n\n constructor(\n readonly I18n:I18nService,\n readonly elementRef:ElementRef,\n readonly api:ApiV3Service,\n ) { }\n\n invite():Observable {\n return of(this.principalData)\n .pipe(\n switchMap((principalData:PrincipalData) => this.createPrincipal(principalData)),\n switchMap((principal:HalResource) => this.api.memberships\n .post({\n principal,\n project: this.project,\n roles: [this.role],\n notificationMessage: {\n raw: this.message,\n },\n })\n .pipe(\n mapTo(principal),\n )),\n );\n }\n\n private createPrincipal(principalData:PrincipalData):Observable {\n const { principal, customFields } = principalData;\n if (principal instanceof HalResource) {\n return of(principal);\n }\n\n switch (this.type) {\n case PrincipalType.User:\n return this.api.users.post({\n email: (principal as PrincipalLike).name,\n status: 'invited',\n ...customFields,\n });\n case PrincipalType.Placeholder:\n return this.api.placeholder_users.post({ name: (principal as PrincipalLike).name });\n default:\n throw new Error('Unsupported PrincipalType given');\n }\n }\n\n onSubmit($e:Event):void {\n $e.preventDefault();\n\n this\n .invite()\n .subscribe((principal) => this.save.emit({ principal }));\n }\n}\n","import {\n Component,\n Input,\n EventEmitter,\n Output,\n ElementRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\n\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { ProjectResource } from 'core-app/features/hal/resources/project-resource';\nimport { imagePath } from 'core-app/shared/helpers/images/path-helper';\nimport { PrincipalType } from '../invite-user.component';\n\n@Component({\n selector: 'op-ium-success',\n templateUrl: './success.component.html',\n styleUrls: ['./success.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SuccessComponent {\n @Input() principal:HalResource;\n\n @Input() project:ProjectResource;\n\n @Input() type:PrincipalType;\n\n @Input() createdNewPrincipal:boolean;\n\n @Output() close = new EventEmitter();\n\n public PrincipalType = PrincipalType;\n\n user_image = imagePath('invite-user-modal/successful-invite.svg');\n\n placeholder_image = imagePath('invite-user-modal/placeholder-added.svg');\n\n public text = {\n title: () => this.I18n.t('js.invite_user_modal.success.title', {\n principal: this.createdNewPrincipal ? this.principal.email : this.principal.name,\n }),\n description: {\n User: () => this.I18n.t('js.invite_user_modal.success.description.user', { project: this.project?.name }),\n PlaceholderUser: () => this.I18n.t('js.invite_user_modal.success.description.placeholder', { project: this.project?.name }),\n Group: () => this.I18n.t('js.invite_user_modal.success.description.group', { project: this.project?.name }),\n },\n nextButton: this.I18n.t('js.invite_user_modal.success.next_button'),\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly elementRef:ElementRef,\n ) {}\n}\n","\n\n
      \n\n
      \n \n\n \n
      \n\n
      \n
      \n \n
      \n
      \n","import { APP_INITIALIZER, Injector, NgModule } from '@angular/core';\nimport {\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { TextFieldModule } from '@angular/cdk/text-field';\nimport { NgSelectModule } from '@ng-select/ng-select';\nimport { CurrentUserModule } from 'core-app/core/current-user/current-user.module';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport { InviteUserButtonModule } from 'core-app/features/invite-user-modal/button/invite-user-button.module';\nimport { DynamicFormsModule } from 'core-app/shared/components/dynamic-forms/dynamic-forms.module';\nimport { OpInviteUserModalAugmentService } from 'core-app/features/invite-user-modal/invite-user-modal-augment.service';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { OpInviteUserModalService } from 'core-app/features/invite-user-modal/invite-user-modal.service';\nimport { InviteUserModalComponent } from './invite-user.component';\nimport { ProjectSelectionComponent } from './project-selection/project-selection.component';\nimport { PrincipalComponent } from './principal/principal.component';\nimport { PrincipalSearchComponent } from './principal/principal-search.component';\nimport { RoleSearchComponent } from './role/role-search.component';\nimport { SummaryComponent } from './summary/summary.component';\nimport { SuccessComponent } from './success/success.component';\n\nexport function initializeServices(injector:Injector) {\n return function () {\n const inviteUserAugmentService = injector.get(OpInviteUserModalAugmentService);\n inviteUserAugmentService.setupListener();\n };\n}\n\n@NgModule({\n imports: [\n CommonModule,\n OpSharedModule,\n OpenprojectModalModule,\n FormsModule,\n NgSelectModule,\n ReactiveFormsModule,\n TextFieldModule,\n DynamicFormsModule,\n InviteUserButtonModule,\n CurrentUserModule,\n ],\n exports: [\n InviteUserButtonModule,\n ],\n declarations: [\n InviteUserModalComponent,\n ProjectSelectionComponent,\n PrincipalComponent,\n PrincipalSearchComponent,\n RoleSearchComponent,\n SuccessComponent,\n SummaryComponent,\n ],\n providers: [\n OpInviteUserModalService,\n {\n provide: APP_INITIALIZER, useFactory: initializeServices, deps: [Injector], multi: true,\n },\n ],\n})\nexport class OpenprojectInviteUserModalModule {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\n/*\n * This service conditionally creates two settings buttons (on the user menu and on\n * the login menu) that give access to the Revit Plugin settings.\n */\n@Injectable()\nexport class RevitAddInSettingsButtonService {\n private readonly labelText:string;\n\n private readonly groupLabelText:string;\n\n constructor(\n private readonly i18n:I18nService,\n ) {\n const onRevitAddInEnvironment = window.navigator.userAgent.search('Revit') > -1;\n\n if (onRevitAddInEnvironment) {\n this.labelText = i18n.t('js.revit.revit_add_in_settings');\n this.groupLabelText = i18n.t('js.revit.revit_add_in');\n\n this.addUserMenuItem();\n this.addLoginMenuItem();\n }\n }\n\n public addUserMenuItem():void {\n const userMenu = document.getElementById('user-menu');\n\n if (userMenu) {\n const menuItem:HTMLElement = document.createElement('li');\n menuItem.dataset.name = this.labelText;\n menuItem.innerHTML = `\n \n ${this.labelText}\n \n `;\n\n menuItem.addEventListener('click', () => this.goToSettings());\n userMenu.appendChild(menuItem);\n }\n }\n\n public addLoginMenuItem() {\n const loginModal = document.querySelector('#nav-login-content');\n\n if (loginModal) {\n const loginMenuItem:HTMLElement = document.createElement('div');\n\n loginMenuItem.dataset.name = this.labelText;\n loginMenuItem.innerHTML = `\n
      \n

      \n \n ${this.groupLabelText}\n \n

      \n
      \n
      \n ${this.labelText}\n
      \n
      \n
      \n `;\n loginModal.appendChild(loginMenuItem);\n\n const settingsButton = loginModal.querySelector('.revit-add-in-button');\n settingsButton?.addEventListener('click', () => this.goToSettings());\n }\n }\n\n goToSettings() {\n window.RevitBridge.sendMessageToRevit('GoToSettings', '1', '');\n }\n}\n","
      \n
      \n

      {{ text.enterprise_edition }}

      \n

      {{ text.confidence }}

      \n

      \n {{ text.become_hero }}
      \n {{ text.you_contribute }}\n

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

      {{ text.email_not_received }}\n {{ text.try_another_email }}\n

      \n
      \n
      \n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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, Injector } 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';\n\nexport const enterpriseBaseSelector = 'enterprise-base';\n\n@Component({\n selector: enterpriseBaseSelector,\n templateUrl: './enterprise-base.component.html',\n styleUrls: ['./enterprise-base.component.sass'],\n})\nexport class EnterpriseBaseComponent {\n public text = {\n button_trial: this.I18n.t('js.admin.enterprise.upsale.button_start_trial'),\n button_book: this.I18n.t('js.admin.enterprise.upsale.button_book_now'),\n link_quote: this.I18n.t('js.admin.enterprise.upsale.link_quote'),\n become_hero: this.I18n.t('js.admin.enterprise.upsale.become_hero'),\n you_contribute: this.I18n.t('js.admin.enterprise.upsale.you_contribute'),\n email_not_received: this.I18n.t('js.admin.enterprise.trial.email_not_received'),\n enterprise_edition: this.I18n.t('js.admin.enterprise.upsale.text'),\n confidence: this.I18n.t('js.admin.enterprise.upsale.confidence'),\n try_another_email: this.I18n.t('js.admin.enterprise.trial.try_another_email'),\n };\n\n constructor(protected I18n:I18nService,\n protected opModalService:OpModalService,\n readonly injector:Injector,\n public eeTrialService:EnterpriseTrialService) {\n }\n\n public openTrialModal() {\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 noTrialRequested() {\n return window.gon.ee_trial_key === 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 { ChangeDetectionStrategy, Component, ElementRef } from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { EEActiveTrialBase } from 'core-app/features/enterprise/enterprise-active-trial/ee-active-trial.base';\n\nexport const enterpriseActiveSavedTrialSelector = 'enterprise-active-saved-trial';\n\n@Component({\n selector: enterpriseActiveSavedTrialSelector,\n templateUrl: './ee-active-trial.component.html',\n styleUrls: ['./ee-active-trial.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EEActiveSavedTrialComponent extends EEActiveTrialBase {\n public subscriber = this.elementRef.nativeElement.dataset.subscriber;\n\n public email = this.elementRef.nativeElement.dataset.email;\n\n public company = this.elementRef.nativeElement.dataset.company;\n\n public domain = this.elementRef.nativeElement.dataset.domain;\n\n public userCount = this.elementRef.nativeElement.dataset.userCount;\n\n public startsAt = this.elementRef.nativeElement.dataset.startsAt;\n\n public expiresAt = this.elementRef.nativeElement.dataset.expiresAt;\n\n public isExpired:boolean = this.elementRef.nativeElement.dataset.isExpired === 'true';\n\n public reprieveDaysLeft = this.elementRef.nativeElement.dataset.reprieveDaysLeft;\n\n constructor(readonly elementRef:ElementRef,\n readonly I18n:I18nService) {\n super(I18n);\n }\n\n public get expiredWarningText():string {\n let warning = this.text.text_expired;\n\n if (this.reprieveDaysLeft && this.reprieveDaysLeft > 0) {\n warning = `${warning}: ${this.text.text_reprieve_days_left(this.reprieveDaysLeft)}`;\n }\n\n return warning;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { OpSharedModule } from 'core-app/shared/shared.module';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport { EnterpriseTrialService } from 'core-app/features/enterprise/enterprise-trial.service';\nimport { EnterpriseBaseComponent } from 'core-app/features/enterprise/enterprise-base.component';\nimport { EnterpriseTrialModalComponent } from 'core-app/features/enterprise/enterprise-modal/enterprise-trial.modal';\nimport { EETrialFormComponent } from 'core-app/features/enterprise/enterprise-modal/enterprise-trial-form/ee-trial-form.component';\nimport { EETrialWaitingComponent } from 'core-app/features/enterprise/enterprise-trial-waiting/ee-trial-waiting.component';\nimport { EEActiveTrialComponent } from 'core-app/features/enterprise/enterprise-active-trial/ee-active-trial.component';\nimport { EEActiveSavedTrialComponent } from 'core-app/features/enterprise/enterprise-active-trial/ee-active-saved-trial.component';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\n@NgModule({\n imports: [\n OpSharedModule,\n OpenprojectModalModule,\n FormsModule,\n ReactiveFormsModule,\n ],\n providers: [\n EnterpriseTrialService,\n ],\n exports: [\n ],\n declarations: [\n EnterpriseBaseComponent,\n EnterpriseTrialModalComponent,\n EETrialFormComponent,\n EETrialWaitingComponent,\n EEActiveTrialComponent,\n EEActiveSavedTrialComponent,\n ],\n})\nexport class OpenprojectEnterpriseModule {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\nimport { findAllFocusableElementsWithin } from 'core-app/shared/helpers/focus-helpers';\nimport {\n Inject,\n Injectable,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport {\n BehaviorSubject,\n Observable,\n} from 'rxjs';\n\nexport const ANIMATION_RATE_MS = 100;\n\n@Injectable({ providedIn: 'root' })\nexport class TopMenuService {\n private hover = false;\n\n private menuIsOpen = false;\n\n private menuContainer = this.document.querySelector('.op-app-header');\n\n private active$ = new BehaviorSubject(null);\n\n constructor(@Inject(DOCUMENT) private document:Document) {\n }\n\n register():void {\n this.setupDropdownClick();\n this.closeOnBodyClick();\n this.accessibility();\n this.skipContentClickListener();\n }\n\n public activeDropdown$():Observable {\n return this.active$.asObservable();\n }\n\n // the entire menu gets closed, no hover possible afterwards\n public close():void {\n this.stopHover();\n this.closeAllItems();\n this.menuIsOpen = false;\n this.active$.next(null);\n }\n\n private skipContentClickListener():void {\n // Skip menu on content\n const skipLink = this.document.querySelector('#skip-navigation--content') as HTMLElement;\n skipLink?.addEventListener('click', () => {\n // Skip to the breadcrumb or the first link in the toolbar or the first link in the content (homescreen)\n const selectors = '.first-breadcrumb-element a, .toolbar-container a:first-of-type, #content a:first-of-type';\n const visibleLink = jQuery(selectors)\n .not(':hidden')\n .first();\n\n if (visibleLink.length) {\n visibleLink.trigger('focus');\n }\n });\n }\n\n private accessibility():void {\n this\n .document\n .querySelectorAll('.op-app-menu--dropdown')\n .forEach((el) => el.setAttribute('aria-expanded', 'false'));\n }\n\n private toggleClick(dropdown:HTMLElement):void {\n if (this.menuIsOpen) {\n if (this.isOpen(dropdown)) {\n this.close();\n } else {\n this.openDropdown(dropdown);\n }\n } else {\n this.opening();\n this.openDropdown(dropdown);\n }\n }\n\n // somebody opens the menu via click, hover possible afterwards\n private opening():void {\n this.startHover();\n this.menuIsOpen = true;\n }\n\n private stopHover():void {\n this.hover = false;\n this.menuContainer?.classList.remove('hover');\n }\n\n private startHover():void {\n this.hover = true;\n this.menuContainer?.classList.add('hover');\n }\n\n private closeAllItems():void {\n this\n .openDropdowns()\n .forEach((item) => this.closeDropdown(item));\n }\n\n private closeOnBodyClick():void {\n const wrapper = document.getElementById('wrapper');\n if (!wrapper) {\n return;\n }\n\n wrapper.addEventListener('click', (evt) => {\n if (this.menuIsOpen && !this.openDropdowns()[0].contains(evt.target as HTMLElement)) {\n this.close();\n }\n }, true);\n }\n\n private openDropdowns():HTMLElement[] {\n const elements = this.menuContainer?.querySelectorAll('.op-app-menu--item_dropdown-open');\n return elements ? Array.from(elements) : [];\n }\n\n private dropdowns():HTMLElement[] {\n const elements = this.menuContainer?.querySelectorAll('.op-app-menu--item_has-dropdown');\n return elements ? Array.from(elements) : [];\n }\n\n private setupDropdownClick():void {\n this.dropdowns().forEach((el) => {\n const action = el.querySelector('.op-app-menu--item-action');\n action?.addEventListener('click', (evt) => {\n this.toggleClick(el);\n evt.preventDefault();\n });\n });\n }\n\n private isOpen(dropdown:HTMLElement):boolean {\n return dropdown.classList.contains('.op-app-menu--item_dropdown-open');\n }\n\n private isClosed(dropdown:HTMLElement):boolean {\n return !this.isOpen(dropdown);\n }\n\n private openDropdown(dropdown:HTMLElement):void {\n this.closeOtherItems(dropdown);\n this.slideAndFocus(dropdown, () => {\n this.active$.next(dropdown);\n });\n }\n\n private closeDropdown(dropdown:HTMLElement, immediate?:boolean):void {\n this.slideUp(dropdown, !!immediate);\n this.active$.next(null);\n }\n\n private closeOtherItems(dropdown:HTMLElement):void {\n this\n .openDropdowns()\n .forEach((other) => {\n if (other !== dropdown) {\n this.closeDropdown(other, true);\n }\n });\n }\n\n private slideAndFocus(dropdown:HTMLElement, callback:() => void):void {\n this.slideDown(dropdown, callback);\n setTimeout(() => this.focusFirstInputOrLink(dropdown), ANIMATION_RATE_MS);\n }\n\n private slideDown(dropdown:HTMLElement, callback:() => void):void {\n const toDrop = this.getDropdownContainer(dropdown);\n toDrop.setAttribute('aria-expanded', 'true');\n dropdown.classList.add('op-app-menu--item_dropdown-open');\n\n jQuery(toDrop)\n .slideDown(ANIMATION_RATE_MS, callback)\n .attr('aria-expanded', 'true');\n }\n\n private slideUp(dropdown:HTMLElement, immediate:boolean):void {\n const toDrop = this.getDropdownContainer(dropdown);\n toDrop.removeAttribute('aria-expanded');\n dropdown.classList.remove('op-app-menu--item_dropdown-open');\n\n if (immediate) {\n toDrop.style.display = 'none';\n } else {\n jQuery(toDrop).slideUp(ANIMATION_RATE_MS);\n }\n }\n\n // If there is ANY input, it will have precedence over links,\n // i.e. links will only get focused, if there is NO input whatsoever\n private focusFirstInputOrLink(dropdown:HTMLElement):void {\n const toDrop = this.getDropdownContainer(dropdown);\n const focusable = findAllFocusableElementsWithin(toDrop);\n const toFocus = focusable[0] as HTMLElement;\n if (!toFocus) {\n return;\n }\n // actually a simple focus should be enough.\n // The rest is only there to work around a rendering bug in webkit (as of Oct 2011),\n // occurring mostly inside the login/signup dropdown.\n toFocus.blur();\n setTimeout(() => {\n toFocus.focus();\n }, 10);\n }\n\n private getDropdownContainer(dropdown:HTMLElement):HTMLElement {\n return dropdown.querySelector('.op-app-menu--dropdown') as HTMLElement;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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, Injector, OnInit,\n} from '@angular/core';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { MainMenuToggleService } from './main-menu-toggle.service';\nimport { TopMenuService } from 'core-app/core/top-menu/top-menu.service';\n\nexport const mainMenuToggleSelector = 'main-menu-toggle';\n\n@Component({\n selector: mainMenuToggleSelector,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'op-app-menu op-main-menu-toggle',\n },\n templateUrl: './main-menu-toggle.component.html',\n})\nexport class MainMenuToggleComponent extends UntilDestroyedMixin implements OnInit {\n toggleTitle = '';\n\n @InjectField() currentProject:CurrentProjectService;\n\n constructor(\n readonly topMenu:TopMenuService,\n readonly toggleService:MainMenuToggleService,\n readonly cdRef:ChangeDetectorRef,\n readonly injector:Injector) {\n super();\n }\n\n ngOnInit():void {\n this.toggleService.initializeMenu();\n\n this.toggleService.titleData$\n .pipe(\n distinctUntilChanged(),\n this.untilDestroyed(),\n )\n .subscribe((setToggleTitle) => {\n this.toggleTitle = setToggleTitle;\n this.cdRef.detectChanges();\n });\n }\n\n toggle(event:Event):void {\n this.toggleService.toggleNavigation(event);\n this.topMenu.close();\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 OnInit,\n ViewChild,\n} from '@angular/core';\n\nimport { ConfirmDialogModalComponent } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.modal';\n\n@Component({\n templateUrl: './password-confirmation.modal.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PasswordConfirmationModalComponent extends ConfirmDialogModalComponent implements OnInit {\n public password_confirmation:string|null = null;\n\n @ViewChild('passwordConfirmationField', { static: true }) passwordConfirmationField:ElementRef;\n\n public additionalText = {\n field_description: I18n.t('js.password_confirmation.field_description'),\n confirm_button: I18n.t('js.button_confirm'),\n password: I18n.t('js.label_password'),\n cancel_button: I18n.t('js.button_cancel'),\n };\n\n public ngOnInit():void {\n super.ngOnInit();\n\n this.text.title = I18n.t('js.password_confirmation.title');\n this.showClose = false;\n }\n\n public confirmAndClose(evt:Event):void {\n if (this.passwordValuePresent()) {\n super.confirmAndClose(evt);\n }\n }\n\n public onOpen():void {\n super.onOpen();\n this.passwordConfirmationField.nativeElement.focus();\n }\n\n public passwordValuePresent():boolean {\n return this.password_confirmation !== null && this.password_confirmation.length > 0;\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\n","\n \n {{ project.name }}\n \n \n {{ project.name }}\n \n\n \n\n","import { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { SearchableProjectListService } from 'core-app/shared/components/searchable-project-list/searchable-project-list.service';\nimport { IProjectData } from 'core-app/shared/components/searchable-project-list/project-data';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\n\n@Component({\n selector: '[op-header-project-select-list]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './header-project-select-list.component.html',\n styleUrls: ['./header-project-select-list.component.sass'],\n})\nexport class OpHeaderProjectSelectListComponent implements OnInit {\n @HostBinding('class.spot-list') classNameList = true;\n\n @HostBinding('class.op-header-project-select-list') className = true;\n\n @Output() update = new EventEmitter();\n\n @Input() @HostBinding('class.op-header-project-select-list--root') root = false;\n\n @Input() projects:IProjectData[] = [];\n\n @Input() searchText = '';\n\n public text = {\n does_not_match_search: this.I18n.t('js.include_projects.tooltip.does_not_match_search'),\n include_all_selected: this.I18n.t('js.include_projects.tooltip.include_all_selected'),\n };\n\n constructor(\n readonly I18n:I18nService,\n readonly pathHelper:PathHelperService,\n readonly searchableProjectListService:SearchableProjectListService,\n readonly elementRef:ElementRef,\n ) { }\n\n ngOnInit():void {\n if (this.root) {\n this.searchableProjectListService.selectedItemID$.subscribe((selectedItemID) => {\n // We have to push this back once so the component gets time to render the list\n // and we can actually find the element and scroll to it.\n requestAnimationFrame(() => {\n const itemAction = (this.elementRef.nativeElement as HTMLElement)\n .querySelectorAll(`.spot-list--item-action[data-project-id=\"${selectedItemID || ''}\"]`);\n itemAction[0]?.scrollIntoView();\n });\n });\n }\n }\n\n extendedProjectUrl(projectId:string):string {\n const currentMenuItem = document.querySelector('meta[name=\"current_menu_item\"]') as HTMLMetaElement;\n const url = this.pathHelper.projectPath(projectId);\n\n if (!currentMenuItem) {\n return url;\n }\n\n return `${url}?jump=${encodeURIComponent(currentMenuItem.content)}`;\n }\n}\n","\n \n \n \n \n\n \n
      \n \n
      \n \n \n \n \n\n \n 0; else noResultsTemplate\"\n op-header-project-select-list\n [ngClass]=\"{ 'spot-list_active': textFieldFocused }\"\n [projects]=\"projects\"\n [searchText]=\"searchableProjectListService.searchText\"\n [root]=\"true\"\n data-list-root=\"true\"\n data-test-selector=\"op-header-project-select--list\"\n >\n\n \n \n {{text.no_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","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n ViewEncapsulation,\n} from '@angular/core';\nimport { CurrentProjectService } from 'core-app/core/current-project/current-project.service';\nimport { combineLatest } from 'rxjs';\nimport {\n debounceTime,\n filter,\n map,\n mergeMap,\n shareReplay,\n take,\n} from 'rxjs/operators';\nimport { IProject } from 'core-app/core/state/projects/project.model';\nimport { insertInList } from 'core-app/shared/components/project-include/insert-in-list';\nimport { recursiveSort } from 'core-app/shared/components/project-include/recursive-sort';\nimport { SearchableProjectListService } from 'core-app/shared/components/searchable-project-list/searchable-project-list.service';\nimport { CurrentUserService } from 'core-app/core/current-user/current-user.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { IProjectData } from 'core-app/shared/components/searchable-project-list/project-data';\n\nexport const headerProjectSelectSelector = 'op-header-project-select';\n\n@Component({\n selector: headerProjectSelectSelector,\n templateUrl: './header-project-select.component.html',\n styleUrls: ['./header-project-select.component.sass'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n SearchableProjectListService,\n ],\n})\nexport class OpHeaderProjectSelectComponent extends UntilDestroyedMixin {\n @HostBinding('class.op-header-project-select') className = true;\n\n public dropModalOpen = false;\n\n public textFieldFocused = false;\n\n public canCreateNewProjects$ = this.currentUserService.hasCapabilities$('projects/create', 'global');\n\n public projects$ = combineLatest([\n this.searchableProjectListService.allProjects$,\n this.searchableProjectListService.searchText$.pipe(debounceTime(200)),\n ]).pipe(\n map(\n ([projects, searchText]:[IProject[], string]) => projects\n .filter(\n (project) => {\n if (searchText.length) {\n const matches = project.name.toLowerCase().includes(searchText.toLowerCase());\n\n if (!matches) {\n return false;\n }\n }\n\n return true;\n },\n )\n .sort((a, b) => a._links.ancestors.length - b._links.ancestors.length)\n .reduce(\n (list, project) => {\n const { ancestors } = project._links;\n\n return insertInList(\n projects,\n project,\n list,\n ancestors,\n );\n },\n [] as IProjectData[],\n ),\n ),\n map((projects) => recursiveSort(projects)),\n shareReplay(),\n );\n\n public text = {\n project: {\n singular: this.I18n.t('js.label_project'),\n plural: this.I18n.t('js.label_project_plural'),\n list: this.I18n.t('js.label_project_list'),\n select: this.I18n.t('js.label_select_project'),\n },\n search_placeholder: this.I18n.t('js.include_projects.search_placeholder'),\n no_results: this.I18n.t('js.include_projects.no_results'),\n };\n\n /* This seems like a way too convoluted loading check, but there's a good reason we need it.\n * The searchableProjectListService says fetching is \"done\" when the request returns.\n * However, this causes flickering on the initial load, since `projects$` still needs\n * to do the tree calculation. In the template, we show the project-list when `loading$ | async` is false,\n * but if we would only make this depend on `fetchingProjects$` Angular would still wait with\n * rendering the project-list until `projects$ | async` has also fired.\n *\n * To fix this, we first wait for fetchingProjects$ to be true once,\n * then switch over to projects$, and after that has pinged once, it switches back to\n * fetchingProjects$ as the decider for when fetching is done.\n */\n public loading$ = this.searchableProjectListService.fetchingProjects$.pipe(\n filter((fetching) => fetching),\n take(1),\n mergeMap(() => this.projects$),\n mergeMap(() => this.searchableProjectListService.fetchingProjects$),\n );\n\n private scrollToCurrent = false;\n\n constructor(\n protected pathHelper:PathHelperService,\n protected I18n:I18nService,\n protected currentProject:CurrentProjectService,\n readonly searchableProjectListService:SearchableProjectListService,\n readonly currentUserService:CurrentUserService,\n ) {\n super();\n\n this.projects$\n .pipe(this.untilDestroyed())\n .subscribe((projects) => {\n if (this.currentProject.id && projects.length && this.scrollToCurrent) {\n this.searchableProjectListService.selectedItemID$.next(parseInt(this.currentProject.id, 10));\n } else {\n this.searchableProjectListService.resetActiveResult(projects);\n }\n\n this.scrollToCurrent = false;\n });\n }\n\n toggleDropModal():void {\n this.dropModalOpen = !this.dropModalOpen;\n if (this.dropModalOpen) {\n this.scrollToCurrent = true;\n this.searchableProjectListService.loadAllProjects();\n }\n }\n\n close():void {\n this.searchableProjectListService.searchText = '';\n this.dropModalOpen = false;\n }\n\n currentProjectName():string {\n if (this.currentProject.name !== null) {\n return this.currentProject.name;\n }\n\n return this.text.project.select;\n }\n\n allProjectsPath():string {\n return this.pathHelper.projectsPath();\n }\n\n newProjectPath():string {\n const parentParam = this.currentProject.id ? `?parent_id=${this.currentProject.id}` : '';\n return `${this.pathHelper.projectsNewPath()}${parentParam}`;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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, OnInit,\n} from '@angular/core';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { ResizeDelta } from 'core-app/shared/components/resizer/resizer.component';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { MainMenuToggleService } from 'core-app/core/main-menu/main-menu-toggle.service';\n\nexport const mainMenuResizerSelector = 'main-menu-resizer';\n\n@Component({\n selector: mainMenuResizerSelector,\n template: `\n \n
      \n \n \n \n
      \n
      \n `,\n})\n\nexport class MainMenuResizerComponent extends UntilDestroyedMixin implements OnInit {\n public toggleTitle:string;\n\n private resizeEvent:string;\n\n private localStorageKey:string;\n\n private elementWidth:number;\n\n private mainMenu = jQuery('#main-menu')[0];\n\n public moving = false;\n\n constructor(readonly toggleService:MainMenuToggleService,\n readonly cdRef:ChangeDetectorRef,\n readonly elementRef:ElementRef) {\n super();\n }\n\n ngOnInit() {\n this.toggleService.titleData$\n .pipe(\n distinctUntilChanged(),\n this.untilDestroyed(),\n )\n .subscribe((setToggleTitle) => {\n this.toggleTitle = setToggleTitle;\n this.cdRef.detectChanges();\n });\n\n this.resizeEvent = 'main-menu-resize';\n this.localStorageKey = 'openProject-mainMenuWidth';\n }\n\n public resizeStart() {\n this.elementWidth = this.mainMenu.clientWidth;\n }\n\n public resizeMove(deltas:ResizeDelta) {\n this.toggleService.saveWidth(this.elementWidth + deltas.absolute.x);\n }\n\n public resizeEnd() {\n const event = new Event(this.resizeEvent);\n window.dispatchEvent(event);\n }\n}\n","import { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { BannersService } from 'core-app/core/enterprise/banners.service';\nimport { Inject, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';\n\n@Injectable()\nexport class TypeBannerService extends BannersService {\n constructor(@Inject(DOCUMENT) protected documentElement:Document,\n private confirmDialog:ConfirmDialogService,\n private I18n:I18nService) {\n super(documentElement);\n }\n\n showEEOnlyHint():void {\n this.confirmDialog.confirm({\n text: {\n title: this.I18n.t('js.types.attribute_groups.upgrade_to_ee'),\n text: this.I18n.t('js.types.attribute_groups.upgrade_to_ee_text'),\n button_continue: this.I18n.t('js.types.attribute_groups.more_information'),\n button_cancel: this.I18n.t('js.types.attribute_groups.nevermind'),\n },\n }).then(() => {\n window.location.href = 'https://www.openproject.org/enterprise-edition/?utm_source=unknown&utm_medium=community-edition&utm_campaign=form-configuration';\n })\n .catch(() => {});\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 EventEmitter,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { TypeBannerService } from 'core-app/features/admin/types/type-banner.service';\n\n@Component({\n selector: 'op-group-edit-in-place',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './group-edit-in-place.html',\n})\nexport class GroupEditInPlaceComponent implements OnInit {\n @Input() public placeholder = '';\n\n @Input() public name:string;\n\n @Output() public onValueChange = new EventEmitter();\n\n public editing = false;\n\n public editedName:string;\n\n constructor(private bannerService:TypeBannerService,\n protected readonly cdRef:ChangeDetectorRef) {\n }\n\n ngOnInit():void {\n this.editedName = this.name;\n\n if (!this.name || this.name.length === 0) {\n // Group name is empty so open in editing mode straight away.\n this.startEditing();\n }\n }\n\n startEditing():void {\n this.bannerService.conditional(\n () => this.bannerService.showEEOnlyHint(),\n () => {\n this.editing = true;\n },\n );\n }\n\n saveEdition(event:FocusEvent):boolean {\n this.leaveEditingMode();\n this.name = this.editedName.trim();\n\n this.cdRef.detectChanges();\n\n if (this.name !== '') {\n this.onValueChange.emit(this.name);\n }\n\n // Ensure form is not submitted.\n event.preventDefault();\n event.stopPropagation();\n return false;\n }\n\n reset():void {\n this.editing = false;\n this.editedName = this.name;\n }\n\n leaveEditingMode():void {\n // Only leave Editing mode if name not empty.\n if (this.editedName != null && this.editedName.trim().length > 0) {\n this.editing = false;\n }\n }\n}\n","
      \n
      \n \n \n \n \n
      \n
      \n
      \n \n \n {{ attribute.translation }}\n \n \n \n \n
      \n
      \n
      \n","import {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TypeFormAttribute, TypeGroup } from 'core-app/features/admin/types/type-form-configuration.component';\n\n@Component({\n selector: 'op-type-form-attribute-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './attribute-group.component.html',\n})\nexport class TypeFormAttributeGroupComponent {\n @Input() public group:TypeGroup;\n\n @Output() public deleteGroup = new EventEmitter();\n\n @Output() public removeAttribute = new EventEmitter();\n\n text = {\n custom_field: this.I18n.t('js.admin.type_form.custom_field'),\n };\n\n constructor(private I18n:I18nService,\n private cdRef:ChangeDetectorRef) {\n }\n\n rename(newValue:string) {\n this.group.name = newValue;\n delete this.group.key;\n this.cdRef.detectChanges();\n }\n\n removeFromGroup(attribute:TypeFormAttribute) {\n this.group.attributes = this.group.attributes.filter((a) => a !== attribute);\n this.removeAttribute.emit(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//++\nimport { ANIMATION_RATE_MS } from 'core-app/core/top-menu/top-menu.service';\nimport ClickEvent = JQuery.ClickEvent;\n\n/*\n The action menu is a menu that usually belongs to an OpenProject entity (like an Issue, WikiPage, Meeting, ..).\n Most likely it looks like this:\n \n The following code is responsible to open and close the \"more functions\" submenu.\n*/\nfunction closeMenu(event:any) {\n const menu = jQuery(event.data.menu);\n // do not close the menu, if the user accidentally clicked next to a menu item (but still within the menu)\n if (event.target !== menu.find(' > li.drop-down.open > ul').get(0)) {\n menu.find(' > li.drop-down.open').removeClass('open').find('> ul').slideUp(ANIMATION_RATE_MS);\n // no need to watch for clicks, when the menu is already closed\n jQuery('html').off('click', closeMenu);\n }\n}\n\nfunction openMenu(menu:JQuery) {\n const dropDown = menu.find(' > li.drop-down');\n // do not open a menu, which is already open\n if (!dropDown.hasClass('open')) {\n dropDown.find('> ul').slideDown(ANIMATION_RATE_MS, () => {\n dropDown.find('li > a:first').focus();\n // when clicking on something, which is not the menu, close the menu\n jQuery('html').on('click', { menu: menu.get(0) }, closeMenu);\n });\n dropDown.addClass('open');\n }\n}\n\n// open the given submenu when clicking on it\nexport function installMenuLogic(menu:JQuery) {\n menu.find(' > li.drop-down').on('click', (event:ClickEvent) => {\n openMenu(menu);\n // and prevent default action (href) for that element\n // but not for the menu items.\n const target = jQuery(event.target);\n if (target.is('.drop-down') || target.closest('li, ul').is('.drop-down')) {\n event.preventDefault();\n }\n });\n}\n","
      \n
      \n
        \n
      • \n \n
      • \n \n \n \n \n \n \n
          \n
        • \n \n \n
        • \n
        • \n \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
      \n
      \n
      \n \n \n {{ inactive_attribute.translation }}\n \n \n \n
      \n
      \n
      \n
      \n
      \n","import {\n AfterViewInit, Component, ElementRef, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { ExternalRelationQueryConfigurationService } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.service';\nimport { DomAutoscrollService } from 'core-app/shared/helpers/drag-and-drop/dom-autoscroll.service';\nimport { DragulaService, DrakeWithModels } from 'ng2-dragula';\nimport { GonService } from 'core-app/core/gon/gon.service';\nimport { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin';\nimport { installMenuLogic } from 'core-app/core/setup/globals/global-listeners/action-menu';\nimport { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';\nimport { TypeBannerService } from 'core-app/features/admin/types/type-banner.service';\n\nexport type TypeGroupType = 'attribute'|'query';\n\nexport interface TypeFormAttribute {\n key:string;\n translation:string;\n is_cf:boolean;\n}\n\nexport interface TypeGroup {\n /** original internal key, if any */\n key:string|null|undefined;\n /** Localized / given name */\n name:string;\n attributes:TypeFormAttribute[];\n query?:any;\n type:TypeGroupType;\n}\n\nexport const adminTypeFormConfigurationSelector = 'admin-type-form-configuration';\nexport const emptyTypeGroup = '__empty';\n\n@Component({\n selector: adminTypeFormConfigurationSelector,\n templateUrl: './type-form-configuration.html',\n providers: [\n TypeBannerService,\n ],\n})\nexport class TypeFormConfigurationComponent extends UntilDestroyedMixin implements OnInit, AfterViewInit {\n public text = {\n drag_to_activate: this.I18n.t('js.admin.type_form.drag_to_activate'),\n reset: this.I18n.t('js.admin.type_form.reset_to_defaults'),\n label_group: this.I18n.t('js.label_group'),\n new_group: this.I18n.t('js.admin.type_form.new_group'),\n label_inactive: this.I18n.t('js.admin.type_form.inactive'),\n custom_field: this.I18n.t('js.admin.type_form.custom_field'),\n add_group: this.I18n.t('js.admin.type_form.add_group'),\n add_table: this.I18n.t('js.admin.type_form.add_table'),\n };\n\n private autoscroll:any;\n\n private element:HTMLElement;\n\n private form:JQuery;\n\n private submit:JQuery;\n\n public groups:TypeGroup[] = [];\n\n public inactives:TypeFormAttribute[] = [];\n\n private attributeDrake:DrakeWithModels;\n\n private groupsDrake:DrakeWithModels;\n\n private no_filter_query:string;\n\n constructor(\n private elementRef:ElementRef,\n private I18n:I18nService,\n private Gon:GonService,\n private dragula:DragulaService,\n private confirmDialog:ConfirmDialogService,\n private toastService:ToastService,\n private externalRelationQuery:ExternalRelationQueryConfigurationService,\n readonly typeBanner:TypeBannerService,\n ) {\n super();\n }\n\n ngOnInit():void {\n // Hook on form submit\n this.element = this.elementRef.nativeElement;\n this.no_filter_query = this.element.dataset.noFilterQuery!;\n this.form = jQuery(this.element).closest('form');\n this.submit = this.form.find('.form-configuration--save');\n\n // In the following we are triggering the form submit ourselves to work around\n // a firefox shortcoming. But to avoid double submits which are sometimes not canceled fast\n // enough, we need to memoize whether we have already submitted.\n let submitted = false;\n\n this.form.on('submit', () => {\n submitted = true;\n });\n\n // Capture mousedown on button because firefox breaks blur on click\n this.submit.on('mousedown', () => {\n setTimeout(() => {\n if (!submitted) {\n this.form.trigger('submit');\n }\n }, 50);\n return true;\n });\n\n // Capture regular form submit\n this.form.on('submit.typeformupdater', () => {\n this.updateHiddenFields();\n return true;\n });\n\n // Setup groups\n this.groupsDrake = this\n .dragula\n .createGroup('groups', {\n moves: (el, source, handle:HTMLElement) => handle.classList.contains('group-handle'),\n })\n .drake;\n\n // Setup attributes\n this.attributeDrake = this\n .dragula\n .createGroup('attributes', {\n moves: (el, source, handle:HTMLElement) => handle.classList.contains('attribute-handle'),\n })\n .drake;\n\n // Get attribute id\n this.groups = JSON\n .parse(this.element.dataset.activeGroups!)\n .filter((group:TypeGroup) => group?.key !== emptyTypeGroup);\n this.inactives = JSON.parse(this.element.dataset.inactiveAttributes!);\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 const groups = that.groupsDrake && that.groupsDrake.dragging;\n const attributes = that.attributeDrake && that.attributeDrake.dragging;\n\n return groups || attributes;\n },\n },\n );\n }\n\n ngAfterViewInit():void {\n const menu = jQuery(this.elementRef.nativeElement).find('.toolbar-items');\n installMenuLogic(menu);\n }\n\n deactivateAttribute(attribute:TypeFormAttribute):void {\n this.updateInactives(this.inactives.concat(attribute));\n }\n\n addGroupAndOpenQuery():void {\n const newGroup = this.createGroup('query');\n this.editQuery(newGroup);\n }\n\n editQuery(group:TypeGroup):void {\n this.typeBanner.conditional(\n () => this.typeBanner.showEEOnlyHint(),\n () => {\n // Disable display mode and timeline for now since we don't want users to enable it\n const disabledTabs = {\n 'display-settings': I18n.t('js.work_packages.table_configuration.embedded_tab_disabled'),\n timelines: I18n.t('js.work_packages.table_configuration.embedded_tab_disabled'),\n };\n\n this.externalRelationQuery.show({\n currentQuery: JSON.parse(group.query),\n callback: (queryProps:any) => (group.query = JSON.stringify(queryProps)),\n disabledTabs,\n });\n },\n );\n }\n\n deleteGroup(group:TypeGroup):void {\n this.typeBanner.conditional(\n () => this.typeBanner.showEEOnlyHint(),\n () => {\n if (group.type === 'attribute') {\n this.updateInactives(this.inactives.concat(group.attributes));\n }\n\n this.groups = this.groups.filter((el) => el !== group);\n\n return group;\n },\n );\n }\n\n createGroup(type:TypeGroupType, groupName = ''):TypeGroup {\n const group:TypeGroup = {\n type,\n name: groupName,\n key: null,\n query: this.no_filter_query,\n attributes: [],\n };\n\n this.groups.unshift(group);\n return group;\n }\n\n resetToDefault($event:Event):boolean {\n this.confirmDialog\n .confirm({\n text: {\n title: this.I18n.t('js.types.attribute_groups.reset_title'),\n text: this.I18n.t('js.types.attribute_groups.confirm_reset'),\n button_continue: this.I18n.t('js.label_reset'),\n },\n })\n .then(() => {\n this.form.find('input#type_attribute_groups').val(JSON.stringify([]));\n\n // Disable our form handler that updates the attribute groups\n this.form.off('submit.typeformupdater');\n this.form.trigger('submit');\n })\n .catch(() => {});\n\n $event.preventDefault();\n return false;\n }\n\n private updateInactives(newValue:TypeFormAttribute[]):void {\n this.inactives = [...newValue].sort((a, b) => a.translation.localeCompare(b.translation));\n }\n\n // We maintain an empty group\n // that gets hidden in the frontend in case the user\n // decides to remove all groups\n // This was necessary since the \"default\" is actually an empty array of groups\n private get emptyGroup():TypeGroup {\n return {\n type: 'attribute', key: emptyTypeGroup, name: 'empty', attributes: [],\n };\n }\n\n private updateHiddenFields():void {\n const hiddenField = this.form.find('.admin-type-form--hidden-field');\n if (this.groups.length === 0) {\n // Ensure we're adding an empty group if deliberately removing\n // all values.\n hiddenField.val(JSON.stringify([this.emptyGroup]));\n } else {\n hiddenField.val(JSON.stringify(this.groups));\n }\n }\n}\n","import {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TypeGroup } from 'core-app/features/admin/types/type-form-configuration.component';\n\n@Component({\n selector: 'op-type-form-query-group',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './query-group.component.html',\n})\nexport class TypeFormQueryGroupComponent {\n text = {\n edit_query: this.I18n.t('js.admin.type_form.edit_query'),\n };\n\n @Input() public group:TypeGroup;\n\n @Output() public editQuery = new EventEmitter();\n\n @Output() public deleteGroup = new EventEmitter();\n\n constructor(private I18n:I18nService,\n private cdRef:ChangeDetectorRef) {\n }\n\n rename(newValue:string):void {\n this.group.name = newValue;\n this.cdRef.detectChanges();\n }\n}\n","
      \n
      \n \n \n \n \n
      \n
      \n \n \n {{ text.edit_query }}\n \n
      \n
      \n","import {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, OnInit,\n} from '@angular/core';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ExternalQueryConfigurationService } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.service';\nimport { UrlParamsHelperService } from 'core-app/features/work-packages/components/wp-query/url-params-helper';\n\nexport const editableQueryPropsSelector = 'editable-query-props';\n\n@Component({\n selector: editableQueryPropsSelector,\n templateUrl: './editable-query-props.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EditableQueryPropsComponent implements OnInit {\n id:string|null;\n\n name:string|null;\n\n urlParams = false;\n\n queryProps:string;\n\n text = {\n edit_query: this.I18n.t('js.admin.type_form.edit_query'),\n };\n\n constructor(private elementRef:ElementRef,\n private I18n:I18nService,\n private cdRef:ChangeDetectorRef,\n private urlParamsHelper:UrlParamsHelperService,\n private externalQuery:ExternalQueryConfigurationService) {\n }\n\n ngOnInit() {\n const element = this.elementRef.nativeElement;\n this.id = element.dataset.id;\n this.name = element.dataset.name;\n this.urlParams = element.dataset.urlParams === 'true';\n\n this.queryProps = element.dataset.query;\n }\n\n public editQuery() {\n const queryProperties = (() => {\n if (this.urlParams) {\n return this.queryProps;\n }\n\n try {\n return JSON.parse(this.queryProps);\n } catch (e) {\n console.error(`Failed to parse query props from ${this.queryProps}: ${e}`);\n return {};\n }\n })();\n\n this.externalQuery.show({\n currentQuery: queryProperties,\n urlParams: this.urlParams,\n callback: (queryProps:any) => {\n this.queryProps = this.urlParams ? queryProps : JSON.stringify(queryProps);\n this.cdRef.detectChanges();\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 { NgModule } from '@angular/core';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { DragulaModule } from 'ng2-dragula';\nimport { TypeFormAttributeGroupComponent } from 'core-app/features/admin/types/attribute-group.component';\nimport { TypeFormConfigurationComponent } from 'core-app/features/admin/types/type-form-configuration.component';\nimport { TypeFormQueryGroupComponent } from 'core-app/features/admin/types/query-group.component';\nimport { GroupEditInPlaceComponent } from 'core-app/features/admin/types/group-edit-in-place.component';\nimport { EditableQueryPropsComponent } from 'core-app/features/admin/editable-query-props/editable-query-props.component';\n\n@NgModule({\n imports: [\n DragulaModule.forRoot(),\n OpSharedModule,\n ],\n providers: [\n ],\n declarations: [\n TypeFormAttributeGroupComponent,\n TypeFormQueryGroupComponent,\n TypeFormConfigurationComponent,\n GroupEditInPlaceComponent,\n EditableQueryPropsComponent,\n ],\n})\nexport class OpenprojectAdminModule { }\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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';\nimport { Observable } from 'rxjs';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\n\n@Injectable({ providedIn: 'root' })\nexport class OpenProjectBackupService {\n constructor(\n protected apiV3Service:ApiV3Service,\n ) {\n }\n\n public triggerBackup(backupToken:string, includeAttachments = true):Observable {\n return this\n .apiV3Service\n .backups\n .post(backupToken, includeAttachments);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 Injector,\n ViewChild,\n} from '@angular/core';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { JobStatusModalComponent } from 'core-app/features/job-status/job-status-modal/job-status.modal';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { OpenProjectBackupService } from 'core-app/core/backup/op-backup.service';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport { HalError } from 'core-app/features/hal/services/hal-error';\n\nexport const backupSelector = 'backup';\n\n@Component({\n selector: backupSelector,\n templateUrl: './backup.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BackupComponent implements AfterViewInit {\n public text = {\n info: this.i18n.t('js.backup.info'),\n note: this.i18n.t('js.backup.note'),\n title: this.i18n.t('js.backup.title'),\n lastBackup: this.i18n.t('js.backup.last_backup'),\n lastBackupFrom: this.i18n.t('js.backup.last_backup_from'),\n includeAttachments: this.i18n.t('js.backup.include_attachments'),\n options: this.i18n.t('js.backup.options'),\n downloadBackup: this.i18n.t('js.backup.download_backup'),\n requestBackup: this.i18n.t('js.backup.request_backup'),\n attachmentsDisabled: this.i18n.t('js.backup.attachments_disabled'),\n };\n\n public jobStatusId:string = this.elementRef.nativeElement.dataset.jobStatusId;\n\n public lastBackupDate:string = this.elementRef.nativeElement.dataset.lastBackupDate;\n\n public lastBackupAttachmentId:string = this.elementRef.nativeElement.dataset.lastBackupAttachmentId;\n\n public mayIncludeAttachments:boolean = this.elementRef.nativeElement.dataset.mayIncludeAttachments != 'false';\n\n public isInProgress = false;\n\n public includeAttachments = true;\n\n public backupToken = '';\n\n @InjectField() opBackup:OpenProjectBackupService;\n\n @ViewChild('backupTokenInput') backupTokenInput:ElementRef;\n\n constructor(\n readonly elementRef:ElementRef,\n public injector:Injector,\n protected i18n:I18nService,\n protected toastService:ToastService,\n protected opModalService:OpModalService,\n protected pathHelper:PathHelperService,\n ) {\n this.includeAttachments = this.mayIncludeAttachments;\n }\n\n ngAfterViewInit():void {\n this.backupTokenInput.nativeElement.focus();\n }\n\n public isDownloadReady():boolean {\n return this.jobStatusId !== undefined && this.jobStatusId !== ''\n && this.lastBackupAttachmentId !== undefined && this.lastBackupAttachmentId !== '';\n }\n\n public getDownloadUrl():string {\n return this.pathHelper.attachmentDownloadPath(this.lastBackupAttachmentId, undefined);\n }\n\n public includeAttachmentsDefault():boolean {\n return this.mayIncludeAttachments;\n }\n\n public includeAttachmentsTitle():string {\n return this.mayIncludeAttachments ? '' : this.text.attachmentsDisabled;\n }\n\n public triggerBackup(event?:JQuery.TriggeredEvent) {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n }\n\n const { backupToken } = this;\n\n this.backupToken = '';\n\n this.opBackup\n .triggerBackup(backupToken, this.includeAttachments)\n .subscribe(\n (resp:HalResource) => {\n this.jobStatusId = resp.jobStatusId;\n this.opModalService.show(JobStatusModalComponent, 'global', { jobId: resp.jobStatusId });\n },\n (error:HalError) => {\n this.toastService.addError(error.message);\n },\n );\n }\n}\n","
      \n
      \n

      \n {{ text.lastBackup }}\n

      \n
      \n \n
      \n
      \n {{ lastBackupDate }}\n
      \n
      \n
      \n\n \n
      \n
      \n\n
      \n
      \n
      \n

      \n {{ text.title }}\n

      \n\n

      \n {{ text.info }}\n

      \n\n

      \n \n {{ text.note }}\n

      \n
      \n
      \n \n {{ text.options }}\n \n \n
      \n
      \n
      \n \n \n \n {{ text.requestBackup }}\n \n
      \n
      \n
      \n
      \n","import { OptionalBootstrapDefinition } from 'core-app/core/setup/globals/dynamic-bootstrapper';\nimport { appBaseSelector, ApplicationBaseComponent } from 'core-app/core/routing/base/application-base.component';\nimport {\n ColorsAutocompleterComponent,\n colorsAutocompleterSelector,\n} from 'core-app/shared/components/colors/colors-autocompleter.component';\nimport {\n ZenModeButtonComponent,\n zenModeComponentSelector,\n} from 'core-app/features/work-packages/components/wp-buttons/zen-mode-toggle-button/zen-mode-toggle-button.component';\nimport {\n attachmentsSelector,\n OpAttachmentsComponent,\n} from 'core-app/shared/components/attachments/attachments.component';\nimport {\n GlobalSearchWorkPackagesComponent,\n globalSearchWorkPackagesSelector,\n} from 'core-app/core/global_search/global-search-work-packages.component';\nimport {\n CustomDateActionAdminComponent,\n customDateActionAdminSelector,\n} from 'core-app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.component';\nimport { BoardsMenuComponent, boardsMenuSelector } from 'core-app/features/boards/boards-sidebar/boards-menu.component';\nimport {\n GlobalSearchWorkPackagesEntryComponent,\n globalSearchWorkPackagesSelectorEntry,\n} from 'core-app/core/global_search/global-search-work-packages-entry.component';\nimport {\n ToastsContainerComponent,\n toastsContainerSelector,\n} from 'core-app/shared/components/toaster/toasts-container.component';\nimport { OpSidemenuComponent, sidemenuSelector } from 'core-app/shared/components/sidemenu/sidemenu.component';\nimport {\n CkeditorAugmentedTextareaComponent,\n ckeditorAugmentedTextareaSelector,\n} from 'core-app/shared/components/editor/components/ckeditor-augmented-textarea/ckeditor-augmented-textarea.component';\nimport {\n PersistentToggleComponent,\n persistentToggleSelector,\n} from 'core-app/shared/components/persistent-toggle/persistent-toggle.component';\nimport {\n HideSectionLinkComponent,\n hideSectionLinkSelector,\n} from 'core-app/shared/components/hide-section/hide-section-link/hide-section-link.component';\nimport {\n ShowSectionDropdownComponent,\n showSectionDropdownSelector,\n} from 'core-app/shared/components/hide-section/show-section-dropdown.component';\nimport {\n AddSectionDropdownComponent,\n addSectionDropdownSelector,\n} from 'core-app/shared/components/hide-section/add-section-dropdown/add-section-dropdown.component';\nimport {\n ContentTabsComponent,\n contentTabsSelector,\n} from 'core-app/shared/components/tabs/content-tabs/content-tabs.component';\nimport {\n CopyToClipboardComponent,\n copyToClipboardSelector,\n} from 'core-app/shared/components/copy-to-clipboard/copy-to-clipboard.component';\nimport {\n collapsibleSectionAugmentSelector,\n CollapsibleSectionComponent,\n} from 'core-app/shared/components/collapsible-section/collapsible-section.component';\nimport {\n headerProjectSelectSelector,\n OpHeaderProjectSelectComponent,\n} from 'core-app/shared/components/header-project-select/header-project-select.component';\nimport {\n RemoteFieldUpdaterComponent,\n remoteFieldUpdaterSelector,\n} from 'core-app/shared/components/remote-field-updater/remote-field-updater.component';\nimport {\n WorkPackageOverviewGraphComponent,\n wpOverviewGraphSelector,\n} from 'core-app/shared/components/work-package-graphs/overview/wp-overview-graph.component';\nimport {\n opViewSelectSelector,\n ViewSelectComponent,\n} from 'core-app/shared/components/op-view-select/op-view-select.component';\nimport {\n GlobalSearchTitleComponent,\n globalSearchTitleSelector,\n} from 'core-app/core/global_search/title/global-search-title.component';\nimport {\n GlobalSearchTabsComponent,\n globalSearchTabsSelector,\n} from 'core-app/core/global_search/tabs/global-search-tabs.component';\nimport {\n TriggerActionsEntryComponent,\n triggerActionsEntryComponentSelector,\n} from 'core-app/shared/components/time_entries/edit/trigger-actions-entry.component';\nimport {\n BacklogsPageComponent,\n backlogsPageComponentSelector,\n} from 'core-app/features/backlogs/backlogs-page/backlogs-page.component';\nimport {\n AttributeHelpTextComponent,\n attributeHelpTextSelector,\n} from 'core-app/shared/components/attribute-help-texts/attribute-help-text.component';\nimport { SpotSwitchComponent, spotSwitchSelector } from 'core-app/spot/components/switch/switch.component';\nimport { BackupComponent, backupSelector } from 'core-app/core/setup/globals/components/admin/backup.component';\nimport {\n EnterpriseBaseComponent,\n enterpriseBaseSelector,\n} from 'core-app/features/enterprise/enterprise-base.component';\nimport {\n FreeTrialButtonComponent,\n freeTrialButtonSelector,\n} from 'core-app/features/enterprise/free-trial-button/free-trial-button.component';\nimport {\n EnterpriseBannerComponent,\n enterpriseBannerSelector,\n} from 'core-app/shared/components/enterprise-banner/enterprise-banner.component';\nimport {\n EnterprisePageComponent,\n enterprisePageSelector,\n} from 'core-app/shared/components/enterprise-page/enterprise-page.component';\nimport {\n nonWorkingDaysListSelector,\n OpNonWorkingDaysListComponent,\n} from 'core-app/shared/components/op-non-working-days-list/op-non-working-days-list.component';\nimport {\n EEActiveSavedTrialComponent,\n enterpriseActiveSavedTrialSelector,\n} from 'core-app/features/enterprise/enterprise-active-trial/ee-active-saved-trial.component';\nimport { NoResultsComponent, noResultsSelector } from 'app/shared/components/no-results/no-results.component';\nimport {\n HomescreenNewFeaturesBlockComponent,\n homescreenNewFeaturesBlockSelector,\n} from 'core-app/features/homescreen/blocks/new-features.component';\nimport { MainMenuToggleComponent, mainMenuToggleSelector } from 'core-app/core/main-menu/main-menu-toggle.component';\nimport {\n MainMenuResizerComponent,\n mainMenuResizerSelector,\n} from 'core-app/shared/components/resizer/resizer/main-menu-resizer.component';\nimport {\n adminTypeFormConfigurationSelector,\n TypeFormConfigurationComponent,\n} from 'core-app/features/admin/types/type-form-configuration.component';\nimport {\n EditableQueryPropsComponent,\n editableQueryPropsSelector,\n} from 'core-app/features/admin/editable-query-props/editable-query-props.component';\nimport {\n InAppNotificationBellComponent,\n opInAppNotificationBellSelector,\n} from 'core-app/features/in-app-notifications/bell/in-app-notification-bell.component';\nimport { IanMenuComponent, ianMenuSelector } from 'core-app/features/in-app-notifications/center/menu/menu.component';\nimport {\n opTeamPlannerSidemenuSelector,\n TeamPlannerSidemenuComponent,\n} from 'core-app/features/team-planner/team-planner/sidemenu/team-planner-sidemenu.component';\nimport {\n CalendarSidemenuComponent,\n opCalendarSidemenuSelector,\n} from 'core-app/features/calendar/sidemenu/calendar-sidemenu.component';\nimport {\n OpModalOverlayComponent,\n opModalOverlaySelector,\n} from 'core-app/shared/components/modal/modal-overlay.component';\nimport {\n OpModalSingleDatePickerComponent,\n opModalSingleDatePickerSelector,\n} from 'core-app/shared/components/datepicker/modal-single-date-picker/modal-single-date-picker.component';\nimport {\n OpBasicSingleDatePickerComponent,\n opBasicSingleDatePickerSelector,\n} from 'core-app/shared/components/datepicker/basic-single-date-picker/basic-single-date-picker.component';\nimport {\n SpotDropModalPortalComponent,\n spotDropModalPortalComponentSelector,\n} from 'core-app/spot/components/drop-modal/drop-modal-portal.component';\nimport {\n StaticAttributeHelpTextComponent,\n staticAttributeHelpTextSelector,\n} from 'core-app/shared/components/attribute-help-texts/static-attribute-help-text.component';\nimport {\n opStorageLoginButtonSelector,\n StorageLoginButtonComponent,\n} from 'core-app/shared/components/storages/storage-login-button/storage-login-button.component';\nimport {\n TimerAccountMenuComponent,\n timerAccountSelector,\n} from 'core-app/shared/components/time_entries/timer/timer-account-menu.component';\n\nexport const globalDynamicComponents:OptionalBootstrapDefinition[] = [\n { selector: appBaseSelector, cls: ApplicationBaseComponent },\n { selector: attributeHelpTextSelector, cls: AttributeHelpTextComponent },\n { selector: staticAttributeHelpTextSelector, cls: StaticAttributeHelpTextComponent },\n { selector: colorsAutocompleterSelector, cls: ColorsAutocompleterComponent },\n { selector: zenModeComponentSelector, cls: ZenModeButtonComponent },\n { selector: attachmentsSelector, cls: OpAttachmentsComponent, embeddable: true },\n { selector: globalSearchTabsSelector, cls: GlobalSearchTabsComponent },\n { selector: globalSearchWorkPackagesSelector, cls: GlobalSearchWorkPackagesComponent },\n { selector: homescreenNewFeaturesBlockSelector, cls: HomescreenNewFeaturesBlockComponent },\n { selector: customDateActionAdminSelector, cls: CustomDateActionAdminComponent },\n { selector: boardsMenuSelector, cls: BoardsMenuComponent },\n { selector: globalSearchWorkPackagesSelectorEntry, cls: GlobalSearchWorkPackagesEntryComponent },\n { selector: toastsContainerSelector, cls: ToastsContainerComponent },\n { selector: sidemenuSelector, cls: OpSidemenuComponent },\n { selector: adminTypeFormConfigurationSelector, cls: TypeFormConfigurationComponent },\n { selector: ckeditorAugmentedTextareaSelector, cls: CkeditorAugmentedTextareaComponent, embeddable: true },\n { selector: persistentToggleSelector, cls: PersistentToggleComponent },\n { selector: hideSectionLinkSelector, cls: HideSectionLinkComponent },\n { selector: showSectionDropdownSelector, cls: ShowSectionDropdownComponent },\n { selector: addSectionDropdownSelector, cls: AddSectionDropdownComponent },\n { selector: contentTabsSelector, cls: ContentTabsComponent },\n { selector: globalSearchTitleSelector, cls: GlobalSearchTitleComponent },\n { selector: copyToClipboardSelector, cls: CopyToClipboardComponent },\n { selector: mainMenuResizerSelector, cls: MainMenuResizerComponent },\n { selector: mainMenuToggleSelector, cls: MainMenuToggleComponent },\n { selector: collapsibleSectionAugmentSelector, cls: CollapsibleSectionComponent },\n { selector: enterpriseBannerSelector, cls: EnterpriseBannerComponent },\n { selector: nonWorkingDaysListSelector, cls: OpNonWorkingDaysListComponent },\n { selector: enterprisePageSelector, cls: EnterprisePageComponent },\n { selector: noResultsSelector, cls: NoResultsComponent },\n { selector: enterpriseBaseSelector, cls: EnterpriseBaseComponent },\n { selector: freeTrialButtonSelector, cls: FreeTrialButtonComponent },\n { selector: enterpriseActiveSavedTrialSelector, cls: EEActiveSavedTrialComponent },\n { selector: headerProjectSelectSelector, cls: OpHeaderProjectSelectComponent },\n { selector: wpOverviewGraphSelector, cls: WorkPackageOverviewGraphComponent },\n { selector: opViewSelectSelector, cls: ViewSelectComponent },\n { selector: opTeamPlannerSidemenuSelector, cls: TeamPlannerSidemenuComponent },\n { selector: opCalendarSidemenuSelector, cls: CalendarSidemenuComponent },\n { selector: triggerActionsEntryComponentSelector, cls: TriggerActionsEntryComponent, embeddable: true },\n { selector: backlogsPageComponentSelector, cls: BacklogsPageComponent },\n { selector: editableQueryPropsSelector, cls: EditableQueryPropsComponent },\n { selector: backupSelector, cls: BackupComponent },\n { selector: opInAppNotificationBellSelector, cls: InAppNotificationBellComponent },\n { selector: ianMenuSelector, cls: IanMenuComponent },\n\n { selector: opModalOverlaySelector, cls: OpModalOverlayComponent },\n { selector: spotDropModalPortalComponentSelector, cls: SpotDropModalPortalComponent },\n { selector: spotSwitchSelector, cls: SpotSwitchComponent },\n { selector: opStorageLoginButtonSelector, cls: StorageLoginButtonComponent },\n\n { selector: opModalSingleDatePickerSelector, cls: OpModalSingleDatePickerComponent, embeddable: true },\n { selector: opBasicSingleDatePickerSelector, cls: OpBasicSingleDatePickerComponent, embeddable: true },\n\n // It is important to initialize the remoteFieldUpdaterSelector after the datepickers,\n // because we need to access the input field of the datepickers inside the remoteFieldUpdaterSelector\n { selector: remoteFieldUpdaterSelector, cls: RemoteFieldUpdaterComponent },\n\n { selector: timerAccountSelector, cls: TimerAccountMenuComponent },\n];\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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, SecurityContext } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n@Injectable({ providedIn: 'root' })\nexport class HTMLSanitizeService {\n public constructor(readonly sanitizer:DomSanitizer) { }\n\n public sanitize(string:string):SafeHtml {\n return this.sanitizer.sanitize(SecurityContext.HTML, string) || '';\n }\n}\n","import { ApplicationRef, Injector, NgZone } from '@angular/core';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ExternalQueryConfigurationService } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-query-configuration.service';\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { DisplayField } from 'core-app/shared/components/fields/display/display-field.module';\nimport { HalResource } from 'core-app/features/hal/resources/hal-resource';\nimport idFromLink from 'core-app/features/hal/helpers/id-from-link';\nimport { DisplayFieldService } from 'core-app/shared/components/fields/display/display-field.service';\nimport { EditFieldService } from 'core-app/shared/components/fields/edit/edit-field.service';\nimport { DynamicBootstrapper } from 'core-app/core/setup/globals/dynamic-bootstrapper';\nimport { States } from 'core-app/core/states/states.service';\nimport { CKEditorPreviewService } from 'core-app/shared/components/editor/components/ckeditor/ckeditor-preview.service';\nimport { ExternalRelationQueryConfigurationService } from 'core-app/features/work-packages/components/wp-table/external-configuration/external-relation-query-configuration.service';\nimport { InjectField } from 'core-app/shared/helpers/angular/inject-field.decorator';\nimport { ApiV3Service } from 'core-app/core/apiv3/api-v3.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { EditorMacrosService } from 'core-app/shared/components/modals/editor/editor-macros.service';\nimport { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';\nimport { HalResourceService } from 'core-app/features/hal/services/hal-resource.service';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { PathHelperService } from '../../core/path-helper/path-helper.service';\nimport { HTMLSanitizeService } from '../../core/html-sanitize/html-sanitize.service';\nimport { DynamicContentModalComponent } from '../../shared/components/modals/modal-wrapper/dynamic-content.modal';\nimport { PasswordConfirmationModalComponent } from '../../shared/components/modals/request-for-confirmation/password-confirmation.modal';\nimport { DomAutoscrollService } from 'core-app/shared/helpers/drag-and-drop/dom-autoscroll.service';\nimport { AttachmentsResourceService } from 'core-app/core/state/attachments/attachments.service';\nimport { HttpClient } from '@angular/common/http';\n\n/**\n * Plugin context bridge for plugins outside the CLI compiler context\n * in order to access services and parts of the core application\n */\nexport class OpenProjectPluginContext {\n private _knownHookNames = [\n 'workPackageBulkContextMenu',\n 'workPackageTableContextMenu',\n 'workPackageSingleContextMenu',\n 'workPackageNewInitialization',\n ];\n\n // Common services referenceable by index\n public readonly services = {\n confirmDialog: this.injector.get(ConfirmDialogService),\n externalQueryConfiguration: this.injector.get(ExternalQueryConfigurationService),\n externalRelationQueryConfiguration: this.injector.get(ExternalRelationQueryConfigurationService),\n halResource: this.injector.get(HalResourceService),\n hooks: this.injector.get(HookService),\n i18n: this.injector.get(I18nService),\n notifications: this.injector.get(ToastService),\n opModalService: this.injector.get(OpModalService),\n displayField: this.injector.get(DisplayFieldService),\n editField: this.injector.get(EditFieldService),\n macros: this.injector.get(EditorMacrosService),\n htmlSanitizeService: this.injector.get(HTMLSanitizeService),\n ckEditorPreview: this.injector.get(CKEditorPreviewService),\n pathHelperService: this.injector.get(PathHelperService),\n states: this.injector.get(States),\n apiV3Service: this.injector.get(ApiV3Service),\n configurationService: this.injector.get(ConfigurationService),\n attachmentsResourceService: this.injector.get(AttachmentsResourceService),\n http: this.injector.get(HttpClient),\n };\n\n public readonly helpers = {\n idFromLink,\n };\n\n // Random collection of classes needed outside of angular\n public readonly classes = {\n modals: {\n passwordConfirmation: PasswordConfirmationModalComponent,\n dynamicContent: DynamicContentModalComponent,\n },\n HalResource,\n DisplayField,\n DomAutoscrollService,\n };\n\n // Hooks\n public readonly hooks:{ [hook:string]:(callback:Function) => void } = {};\n\n // Angular zone reference\n @InjectField() public readonly zone:NgZone;\n\n // Angular2 global injector reference\n constructor(public readonly injector:Injector) {\n this\n ._knownHookNames\n .forEach((hook:string) => {\n this.hooks[hook] = (callback:Function) => this.services.hooks.register(hook, callback);\n });\n }\n\n /**\n * Run the given callback in the angular zone,\n * resulting in triggered change detection that would otherwise not occur.\n *\n * @param cb\n */\n public runInZone(cb:() => void) {\n this.zone.run(cb);\n }\n\n /**\n * Bootstrap a dynamically embeddable component\n * @param element\n */\n public bootstrap(element:HTMLElement) {\n DynamicBootstrapper.bootstrapOptionalEmbeddable(\n this.injector.get(ApplicationRef),\n element,\n );\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n// ++ Ng1FieldControlsWrapper,\n\nimport { Injector, NgModule } from '@angular/core';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { OpenProjectPluginContext } from 'core-app/features/plugins/plugin-context';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\n\n@NgModule({\n providers: [\n HookService,\n ],\n})\nexport class OpenprojectPluginsModule {\n constructor(injector:Injector) {\n debugLog('Registering OpenProject plugin context');\n const pluginContext = new OpenProjectPluginContext(injector);\n window.OpenProject.pluginContext.putValue(pluginContext);\n }\n}\n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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 PlannedCostsFormAugment {\n static listen():void {\n jQuery(document).on('click', '.costs--edit-planned-costs-btn', (evt) => {\n const link = evt.target as HTMLElement;\n const form = link.nextElementSibling as HTMLElement;\n\n link.hidden = true;\n form.hidden = false;\n\n const input = form.querySelector('input') as HTMLInputElement;\n input.disabled = false;\n });\n\n jQuery(document).on('click', '.costs--edit-planned-costs-cancel-btn', (evt) => {\n const form = (evt.target as HTMLElement).closest('.costs--edit-form') as HTMLElement;\n const link = form.previousElementSibling as HTMLElement;\n\n link.hidden = false;\n form.hidden = true;\n\n const input = form.querySelector('input') as HTMLInputElement;\n input.disabled = 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 { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { finalize } from 'rxjs/operators';\nimport { HalResourceNotificationService } from 'core-app/features/hal/services/hal-resource-notification.service';\n\n@Injectable()\nexport class CostBudgetSubformAugmentService {\n constructor(private halNotification:HalResourceNotificationService,\n private http:HttpClient) {\n }\n\n listen():void {\n jQuery('costs-budget-subform').each((i, match) => {\n const el = jQuery(match);\n\n const container = el.find('.budget-item-container');\n const templateEl = el.find('.budget-row-template');\n templateEl.detach();\n const template = templateEl[0].outerHTML;\n let rowIndex = parseInt(el.attr('item-count') as string, 10);\n\n // Refresh row on changes\n el.on('change', '.budget-item-value', (evt) => {\n const row = jQuery(evt.target).closest('.cost_entry');\n this.refreshRow(el, row.attr('id') as string);\n });\n\n el.on('click', '.delete-budget-item', (evt) => {\n evt.preventDefault();\n jQuery(evt.target).closest('.cost_entry').remove();\n return false;\n });\n\n // Add new row handler\n el.find('.budget-add-row').on('click', (evt) => {\n evt.preventDefault();\n const row = jQuery(template.replace(/INDEX/g, rowIndex.toString()));\n row.show();\n row.removeClass('budget-row-template');\n container.append(row);\n rowIndex += 1;\n return false;\n });\n });\n }\n\n /**\n * Refreshes the given row after updating values\n */\n public refreshRow(el:JQuery, row_identifier:string):void {\n const form = el.parents('form').first();\n form.find(':submit').attr('disabled', 'disabled');\n\n const row = el.find(`#${row_identifier}`);\n const request = this.buildRefreshRequest(row, row_identifier);\n\n this.http\n .post(\n el.attr('update-url') as string,\n request,\n {\n headers: { Accept: 'application/json' },\n withCredentials: true,\n },\n )\n .pipe(\n finalize(() => {\n form.find(':submit').attr('disabled', null);\n }),\n )\n .subscribe(\n (data:any) => {\n _.each(data, (val:string, selector:string) => {\n const element = document.getElementById(selector) as HTMLElement|HTMLInputElement|undefined;\n if (element instanceof HTMLInputElement) {\n element.disabled = false;\n element.value = val;\n } else if (element) {\n element.textContent = val;\n }\n });\n },\n (error:any) => this.halNotification.handleRawError(error),\n );\n }\n\n /**\n * Returns the params for the update request\n */\n private buildRefreshRequest(row:JQuery, row_identifier:string) {\n const request:Record = {\n element_id: row_identifier,\n fixed_date: jQuery('#budget_fixed_date').val(),\n };\n\n // Augment common values with specific values for this type\n row.find('.budget-item-value').each((i:number, el:Element) => {\n const field = jQuery(el);\n request[field.data('requestKey') as string] = field.val() || '0';\n });\n\n return 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 { Injectable } from \"@angular/core\";\nimport { OpenProjectPluginContext } from 'core-app/features/plugins/plugin-context';\n\n@Injectable()\nexport class CostSubformAugmentService {\n\n constructor() {\n jQuery('costs-subform').each((i, match) => {\n const el = jQuery(match);\n\n const container = el.find('.subform-container');\n\n const templateEl = el.find('.subform-row-template');\n templateEl.detach();\n const template = templateEl[0].outerHTML;\n let rowIndex = parseInt(el.attr('item-count')!);\n\n el.on('click', '.delete-row-button,.delete-budget-item', (evt:any) => {\n jQuery(evt.target).closest('.subform-row').remove();\n return false;\n });\n\n // Add new row handler\n el.find('.add-row-button,.wp-inline-create--add-link').click((evt:any) => {\n evt.preventDefault();\n const row = jQuery(template.replace(/INDEX/g, rowIndex.toString()));\n row.show();\n row.removeClass('subform-row-template');\n row.find('input.costs-date-picker').prop('required', true);\n row.find('input[id^=\"cost_type_new_rate_attributes\"]').prop('required', true);\n\n container.append(row);\n rowIndex += 1;\n\n window.OpenProject.getPluginContext()\n .then((pluginContext:OpenProjectPluginContext) => {\n pluginContext.bootstrap(row[0]);\n });\n\n setTimeout(() => container.find('.subform-row:last-child input:first').focus(), 10)\n\n return false;\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// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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 { HalResource } from \"core-app/features/hal/resources/hal-resource\";\nimport { Attachable } from \"core-app/features/hal/resources/mixins/attachable-mixin\";\n\nexport interface BudgetResourceLinks {\n addAttachment(attachment:HalResource):Promise;\n}\n\nclass BudgetBaseResource extends HalResource {\n public $links:BudgetResourceLinks;\n}\n\nexport const BudgetResource = Attachable(BudgetBaseResource);\n\nexport interface BudgetResource extends BudgetBaseResource, BudgetResourceLinks {\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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 { Injector, NgModule } from '@angular/core';\nimport { OpenProjectPluginContext } from 'core-app/features/plugins/plugin-context';\nimport { multiInput } from '@openproject/reactivestates';\nimport { PlannedCostsFormAugment } from 'core-app/features/plugins/linked/budgets/augment/planned-costs-form';\nimport { CostBudgetSubformAugmentService } from 'core-app/features/plugins/linked/budgets/augment/cost-budget-subform.augment.service';\nimport { CostSubformAugmentService } from './augment/cost-subform.augment.service';\nimport { BudgetResource } from './hal/resources/budget-resource';\n\nexport function initializeCostsPlugin(injector:Injector) {\n window.OpenProject.getPluginContext().then((pluginContext:OpenProjectPluginContext) => {\n pluginContext.services.editField.extendFieldType('select', ['Budget']);\n\n const displayFieldService = pluginContext.services.displayField;\n displayFieldService.extendFieldType('resource', ['Budget']);\n\n const halResourceService = pluginContext.services.halResource;\n halResourceService.registerResource('Budget', { cls: BudgetResource });\n\n const { states } = pluginContext.services;\n states.add('budgets', multiInput());\n\n // Augment previous cost-subforms\n new CostSubformAugmentService();\n PlannedCostsFormAugment.listen();\n\n const budgetSubform = injector.get(CostBudgetSubformAugmentService);\n budgetSubform.listen();\n });\n}\n\n@NgModule({\n providers: [\n CostBudgetSubformAugmentService,\n ],\n})\nexport class PluginModule {\n constructor(injector:Injector) {\n initializeCostsPlugin(injector);\n }\n}\n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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\nimport { DisplayField } from \"core-app/shared/components/fields/display/display-field.module\";\nimport { IFieldSchema } from \"core-app/shared/components/fields/field.base\";\nimport { InjectField } from \"core-app/shared/helpers/angular/inject-field.decorator\";\nimport { ApiV3Service } from \"core-app/core/apiv3/api-v3.service\";\n\ninterface ICostsByType {\n costObjectId:string;\n costType:{\n name:string;\n id:string;\n };\n staticPath:{\n href:string;\n };\n spentUnits:number;\n}\n\nexport class CostsByTypeDisplayField extends DisplayField {\n\n @InjectField() apiV3Service:ApiV3Service;\n\n public apply(resource:any, schema:IFieldSchema) {\n super.apply(resource, schema);\n this.loadIfNecessary();\n }\n\n protected loadIfNecessary() {\n if (this.value && this.value.$loaded === false) {\n this.value.$load().then(() => {\n\n if (this.resource.$source._type === 'WorkPackage') {\n this\n .apiV3Service\n .work_packages\n .cache\n .touch(this.resource.id!);\n }\n });\n }\n }\n\n public get title() {\n return '';\n }\n\n public render(element:HTMLElement, displayText:string):void {\n if (this.isEmpty()) {\n element.textContent = this.placeholder;\n return;\n }\n\n this.value.elements.forEach((val:ICostsByType, i:number) => {\n if (this.resource.showCosts) {\n this.renderCostAsLink(val, element, i);\n } else {\n this.renderCostAsText(val, element, i);\n }\n });\n }\n\n public isEmpty():boolean {\n return !this.value ||\n !this.value.elements ||\n this.value.elements.length === 0;\n }\n\n\n /**\n * Render link to reporting\n */\n private renderCostAsLink(val:ICostsByType, element:HTMLElement, i:number) {\n const showCosts = this.resource.showCosts;\n const link = document.createElement('a') as HTMLAnchorElement;\n\n link.href = showCosts.href + '&unit=' + val.costType.id;\n link.setAttribute('target', '_blank');\n link.textContent = val.spentUnits + ' ' + val.costType.name;\n element.appendChild(link);\n\n this.addSeparator(element, i);\n }\n\n /**\n * Render text\n */\n private renderCostAsText(val:ICostsByType, element:HTMLElement, i:number) {\n const span = document.createElement('span');\n span.textContent = val.spentUnits + ' ' + val.costType.name;\n element.appendChild(span);\n this.addSeparator(element, i);\n }\n\n private addSeparator(element:HTMLElement, i:number) {\n if (i < this.value.elements.length - 1) {\n const sep = document.createElement('span');\n sep.textContent = ', ';\n\n element.appendChild(sep);\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 { DisplayField } from \"core-app/shared/components/fields/display/display-field.module\";\n\nexport class CurrencyDisplayField extends DisplayField {\n\n public isEmpty():boolean {\n return !this.value ||\n !parseFloat(this.value.match(/\\d+/g)[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// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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 { Injector, NgModule } from '@angular/core';\nimport { OpenProjectPluginContext } from 'core-app/features/plugins/plugin-context';\nimport { CostsByTypeDisplayField } from './wp-display/costs-by-type-display-field.module';\nimport { CurrencyDisplayField } from './wp-display/currency-display-field.module';\n\nexport function initializeCostsPlugin(injector:Injector) {\n window.OpenProject.getPluginContext().then((pluginContext:OpenProjectPluginContext) => {\n const displayFieldService = pluginContext.services.displayField;\n displayFieldService.addFieldType(CostsByTypeDisplayField, 'costs', ['costsByType']);\n displayFieldService.addFieldType(CurrencyDisplayField, 'currency', ['laborCosts', 'materialCosts', 'overallCosts']);\n\n pluginContext.hooks.workPackageSingleContextMenu((params:any) => ({\n key: 'log_costs',\n icon: 'icon-projects',\n indexBy(actions:any) {\n const index = _.findIndex(actions, { key: 'log_time' });\n return index !== -1 ? index + 1 : actions.length;\n },\n resource: 'workPackage',\n link: 'logCosts',\n }));\n\n pluginContext.hooks.workPackageTableContextMenu((params:any) => ({\n key: 'log_costs',\n icon: 'icon-projects',\n link: 'logCosts',\n indexBy(actions:any) {\n const index = _.findIndex(actions, { link: 'logTime' });\n return index !== -1 ? index + 1 : actions.length;\n },\n text: I18n.t('js.button_log_costs'),\n }));\n });\n}\n\n@NgModule({\n providers: [\n ],\n})\nexport class PluginModule {\n constructor(injector:Injector) {\n initializeCostsPlugin(injector);\n }\n}\n","function dataURItoBlob(dataURI:string) {\n const bytes = dataURI.split(',')[0].indexOf('base64') >= 0\n ? atob(dataURI.split(',')[1])\n : unescape(dataURI.split(',')[1]);\n const mime = dataURI.split(',')[0].split(':')[1].split(';')[0];\n const max = bytes.length;\n const ia = new Uint8Array(max);\n for (let i = 0; i < max; i += 1) {\n ia[i] = bytes.charCodeAt(i);\n }\n return new Blob([ia], { type: mime });\n}\n\n/**\n * Resize an image to the given max dimension, returning the data URL and a blob\n * Based on https://stackoverflow.com/a/39235724/420614\n *\n * @param {maxSize} Max width or height\n * @param {HTMLImageElement} Input image\n */\nexport function resizeImage(maxSize:number, image:HTMLImageElement):[string, Blob] {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n\n let { width } = image;\n let { height } = image;\n\n if (width > height) {\n if (width > maxSize) {\n height *= maxSize / width;\n width = maxSize;\n }\n } else if (height > maxSize) {\n width *= maxSize / height;\n height = maxSize;\n }\n\n canvas.width = width;\n canvas.height = height;\n ctx.drawImage(image, 0, 0, width, height);\n const dataUrl = canvas.toDataURL('image/jpeg');\n return [dataUrl, dataURItoBlob(dataUrl)];\n}\n\n/**\n * Resize a file input to the given max dimension, returning the data URL and a blob\n *\n * @param maxSize Max width or height\n * @param file Input file\n */\nexport function resizeFile(maxSize:number, file:File):Promise<[string, Blob]> {\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = (readerEvent:ProgressEvent) => {\n const image = new Image();\n image.onload = () => resolve(resizeImage(maxSize, image));\n image.src = readerEvent.target?.result as string;\n };\n reader.readAsDataURL(file);\n });\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { share } from 'rxjs/operators';\nimport { Injectable } from '@angular/core';\nimport { HttpClient, HttpEvent } from '@angular/common/http';\n\nimport { IUploadFile, OpUploadService } from 'core-app/core/upload/upload.service';\n\nexport interface AvatarUploadFile extends IUploadFile {\n method:string;\n}\n\n@Injectable()\nexport class AvatarUploadService extends OpUploadService {\n constructor(\n private readonly http:HttpClient,\n ) {\n super();\n }\n\n public upload(\n href:string,\n uploadFiles:AvatarUploadFile[],\n ):Observable>[] {\n return uploadFiles.map((file) => this.uploadSingle(href, file));\n }\n\n private uploadSingle(href:string, uploadFile:AvatarUploadFile):Observable> {\n const body = new FormData();\n body.append('metadata', JSON.stringify({ fileName: uploadFile.file.name }));\n body.append('file', uploadFile.file, uploadFile.file.name);\n\n return this.http.request(\n uploadFile.method,\n href,\n {\n body,\n observe: 'events',\n withCredentials: true,\n responseType: 'text',\n reportProgress: true,\n },\n ).pipe(share()) as Observable>;\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 ViewChild,\n} from '@angular/core';\n\nimport { resizeFile } from 'core-app/shared/helpers/images/resizer';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { ToastService } from 'core-app/shared/components/toaster/toast.service';\nimport { OpUploadService } from 'core-app/core/upload/upload.service';\n\nimport { AvatarUploadFile, AvatarUploadService } from '../avatar-upload.service';\nimport { HttpErrorResponse } from '@angular/common/http';\n\n@Component({\n selector: 'avatar-upload-form',\n templateUrl: './avatar-upload-form.html',\n providers: [{ provide: OpUploadService, useClass: AvatarUploadService }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AvatarUploadFormComponent implements OnInit {\n public form:any;\n\n public target:string;\n\n public method:string;\n\n public avatarFile:File;\n\n public avatarPreviewUrl:string;\n\n public busy = false;\n\n public fileInvalid = false;\n\n @ViewChild('avatarFilePicker', { static: true }) public avatarFilePicker:ElementRef;\n\n // Text\n public text = {\n label_choose_avatar: this.I18n.t('js.avatars.label_choose_avatar'),\n upload_instructions: this.I18n.t('js.avatars.text_upload_instructions'),\n error_too_large: this.I18n.t('js.avatars.error_image_too_large'),\n wrong_file_format: this.I18n.t('js.avatars.wrong_file_format'),\n button_update: this.I18n.t('js.button_update'),\n uploading: this.I18n.t('js.avatars.uploading_avatar'),\n preview: this.I18n.t('js.label_preview'),\n };\n\n public constructor(\n protected I18n:I18nService,\n protected elementRef:ElementRef,\n protected cdRef:ChangeDetectorRef,\n protected toastService:ToastService,\n protected uploadService:OpUploadService,\n ) { }\n\n public ngOnInit() {\n const element = this.elementRef.nativeElement as HTMLElement;\n this.target = element.getAttribute('target') || '';\n this.method = element.getAttribute('method') || '';\n }\n\n public onFilePickerChanged(_evt:Event) {\n const fileList = this.avatarFilePicker.nativeElement.files;\n if (fileList === null || fileList.length === 0) {\n return;\n }\n\n const file = fileList[0];\n if (['image/jpeg', 'image/png', 'image/gif'].indexOf(file.type) === -1) {\n this.fileInvalid = true;\n this.cdRef.detectChanges();\n return;\n }\n\n void resizeFile(128, file).then(([dataURL, blob]) => {\n // Create resized file\n this.avatarFile = new File([blob], file.name);\n this.avatarPreviewUrl = dataURL;\n this.fileInvalid = false;\n this.cdRef.detectChanges();\n });\n }\n\n public uploadAvatar(event:Event) {\n event.preventDefault();\n this.busy = true;\n const uploadFile:AvatarUploadFile = { file: this.avatarFile, method: this.method };\n const observable = this.uploadService.upload(this.target, [uploadFile])[0];\n this.toastService.addUpload(this.text.uploading, [[this.avatarFile, observable]]);\n\n observable.subscribe(\n (ev) => {\n switch (ev.type) {\n case 0:\n // Sent\n break;\n case 4:\n this.busy = false;\n window.location.reload();\n break;\n default:\n // Sent or unknown event\n }\n },\n (error:HttpErrorResponse) => {\n this.toastService.addError(error);\n this.busy = 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// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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 { Injector, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { AvatarUploadFormComponent } from './avatar-upload-form/avatar-upload-form.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ],\n declarations: [\n AvatarUploadFormComponent,\n ],\n})\nexport class PluginModule {\n constructor(injector:Injector) {\n const hookService = injector.get(HookService);\n hookService.register('openProjectAngularBootstrap', () => [\n { selector: 'avatar-upload-form', cls: AvatarUploadFormComponent },\n ]);\n }\n}\n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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// This resource exists solely for the purpose of uploading attachments via the\n// WYSIWYIG editor.\nimport { HalResource } from \"core-app/features/hal/resources/hal-resource\";\nimport { Attachable } from \"core-app/features/hal/resources/mixins/attachable-mixin\";\n\nexport interface DocumentResourceLinks {\n addAttachment(attachment:HalResource):Promise;\n}\n\nclass DocumentBaseResource extends HalResource {\n public $links:DocumentResourceLinks;\n\n private attachmentsBackend = false;\n}\n\nexport const DocumentResource = Attachable(DocumentBaseResource);\n\nexport type DocumentResource = DocumentBaseResource;\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { OpenProjectPluginContext } from 'core-app/features/plugins/plugin-context';\nimport { multiInput } from '@openproject/reactivestates';\nimport { DocumentResource } from './hal/resources/document-resource';\n\nexport function initializeDocumentPlugin() {\n window.OpenProject.getPluginContext()\n .then((pluginContext:OpenProjectPluginContext) => {\n const halResourceService = pluginContext.services.halResource;\n halResourceService.registerResource('Document', { cls: DocumentResource });\n\n const { states } = pluginContext.services;\n states.add('documents', multiInput());\n });\n}\n\n@NgModule()\nexport class PluginModule {\n constructor() {\n initializeDocumentPlugin();\n }\n}\n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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\";\n\n// probably not providable in root when we want to cache the formatter and set custom templates\n@Injectable({ providedIn: 'root' })\nexport class GitActionsService {\n private sanitizeBranchString(str:string):string {\n // See https://stackoverflow.com/a/3651867 for how these rules came in.\n // This sanitization tries to be harsher than those rules\n return str\n .replace(/&/g, 'and ') // & becomes and\n .replace(/ +/g, '-') // Spaces become dashes\n .replace(/[\\000-\\039]/g, '') // ASCII control characters are out\n .replace(/\\177/g, '') // DEL is out\n .replace(/[#\\\\\\/\\?\\*\\~\\^\\:\\{\\}@\\.\\[\\]'\"]/g, '') // Some other characters with special rules are out\n .replace(/^[-]+/g, '') // Dashes at the start are removed\n .replace(/[-]+$/g, '') // Dashes at the end are removed\n .replace(/-+/g, '-') // Multiple dashes in a row are deduped\n .trim();\n }\n\n private formattingInput(workPackage: WorkPackageResource) {\n const type = workPackage.type.name || '';\n const id = workPackage.id || '';\n const title = workPackage.subject;\n const url = window.location.origin + workPackage.pathHelper.workPackagePath(id);\n const description = '';\n\n return({\n id, type, title, url, description\n });\n }\n\n private sanitizeShellInput(str:string):string {\n return `${str.replace(/'/g, '\\\\\\'')}`;\n }\n\n public branchName(workPackage:WorkPackageResource):string {\n const { type, id, title } = this.formattingInput(workPackage);\n return `${this.sanitizeBranchString(type)}/${id}-${this.sanitizeBranchString(title)}`.toLocaleLowerCase();\n }\n\n public commitMessage(workPackage:WorkPackageResource):string {\n const { title, id, description, url } = this.formattingInput(workPackage);\n return `[#${id}] ${title}\n\n${description}\n\n${url}\n`.replace(/\\n\\n+/g, '\\n\\n');\n }\n\n public gitCommand(workPackage:WorkPackageResource):string {\n const branch = this.branchName(workPackage);\n const commit = this.commitMessage(workPackage);\n return `git checkout -b '${this.sanitizeShellInput(branch)}' && git commit --allow-empty -m '${this.sanitizeShellInput(commit)}'`;\n }\n}\n","
      \n

      {{text.title}}

      \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 copy from 'copy-text-to-clipboard';\nimport {\n Component,\n Inject,\n Input,\n} from '@angular/core';\nimport { GitActionsService } from '../git-actions/git-actions.service';\nimport { WorkPackageResource } from \"core-app/features/hal/resources/work-package-resource\";\nimport { OPContextMenuComponent } from \"core-app/shared/components/op-context-menu/op-context-menu.component\";\nimport {\n OpContextMenuLocalsMap,\n OpContextMenuLocalsToken,\n} from \"core-app/shared/components/op-context-menu/op-context-menu.types\";\nimport { I18nService } from \"core-app/core/i18n/i18n.service\";\nimport { ISnippet } from 'core-app/features/plugins/linked/openproject-github_integration/state/github-pull-request.model';\n\n\n@Component({\n selector: 'op-git-actions-menu',\n templateUrl: './git-actions-menu.template.html',\n styleUrls: [\n './styles/git-actions-menu.sass',\n ],\n})\nexport class GitActionsMenuComponent extends OPContextMenuComponent {\n @Input() public workPackage:WorkPackageResource;\n\n public text = {\n title: this.I18n.t('js.github_integration.tab_header.git_actions.title'),\n copyButtonHelpText: this.I18n.t('js.github_integration.tab_header.git_actions.copy_button_help'),\n copyResult: {\n success: this.I18n.t('js.github_integration.tab_header.git_actions.copy_success'),\n error: this.I18n.t('js.github_integration.tab_header.git_actions.copy_error'),\n },\n };\n\n public lastCopyResult:string = this.text.copyResult.success;\n\n public showCopyResult:boolean = false;\n\n public copiedSnippetId:string = '';\n\n public snippets:ISnippet[] = [\n {\n id: 'branch',\n name: this.I18n.t('js.github_integration.tab_header.git_actions.branch_name'),\n textToCopy: () => this.gitActions.branchName(this.workPackage),\n },\n {\n id: 'message',\n name: this.I18n.t('js.github_integration.tab_header.git_actions.commit_message'),\n textToCopy: () => this.gitActions.commitMessage(this.workPackage),\n },\n {\n id: 'command',\n name: this.I18n.t('js.github_integration.tab_header.git_actions.cmd'),\n textToCopy: () => this.gitActions.gitCommand(this.workPackage),\n },\n ];\n\n constructor(\n @Inject(OpContextMenuLocalsToken)\n public locals:OpContextMenuLocalsMap,\n readonly I18n:I18nService,\n readonly gitActions:GitActionsService,\n ) {\n super(locals);\n this.workPackage = this.locals.workPackage as WorkPackageResource;\n }\n\n public onCopyButtonClick(snippet:ISnippet):void {\n const success = copy(snippet.textToCopy());\n\n if (success) {\n this.lastCopyResult = this.text.copyResult.success;\n } else {\n this.lastCopyResult = this.text.copyResult.error;\n }\n this.copiedSnippetId = snippet.id;\n this.showCopyResult = true;\n window.setTimeout(() => {\n this.showCopyResult = false;\n }, 2000);\n }\n}\n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { 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';\nimport { WorkPackageResource } from \"core-app/features/hal/resources/work-package-resource\";\nimport { GitActionsMenuComponent } from './git-actions-menu.component';\n\n@Directive({\n selector: '[gitActionsCopyDropdown]'\n})\nexport class GitActionsMenuDirective extends OpContextMenuTrigger {\n @Input('gitActionsCopyDropdown-workPackage') public workPackage:WorkPackageResource;\n\n constructor(readonly elementRef:ElementRef,\n readonly opContextMenu:OPContextMenuService) {\n super(elementRef, opContextMenu);\n }\n\n protected open(evt:JQuery.TriggeredEvent) {\n this.opContextMenu.show(this, evt, GitActionsMenuComponent);\n }\n\n public get locals():{ showAnchorRight?:boolean, contextMenuId?:string, items:OpContextMenuItem[], workPackage:WorkPackageResource } {\n return {\n workPackage: this.workPackage,\n contextMenuId: 'github-integration-git-actions-menu',\n items: []\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 { WorkPackageResource } from \"core-app/features/hal/resources/work-package-resource\";\nimport { I18nService } from \"core-app/core/i18n/i18n.service\";\n\n@Component({\n selector: 'tab-header',\n templateUrl: './tab-header.template.html',\n styleUrls: [\n './styles/tab-header.sass'\n ]\n})\nexport class TabHeaderComponent {\n @Input() public workPackage:WorkPackageResource;\n\n public text = {\n title: this.I18n.t('js.github_integration.tab_header.title'),\n createPrButtonLabel: this.I18n.t('js.github_integration.tab_header.create_pr.label'),\n createPrButtonDescription: this.I18n.t('js.github_integration.tab_header.create_pr.description'),\n gitMenuLabel: this.I18n.t('js.github_integration.tab_header.copy_menu.label'),\n gitMenuDescription: this.I18n.t('js.github_integration.tab_header.copy_menu.description'),\n };\n\n constructor(readonly I18n:I18nService) {\n }\n}\n","
      \n

      \n \n {{text.title}}\n

      \n
        \n
      • \n \n
      • \n
      \n
      \n","import { EntityStore, StoreConfig } from '@datorama/akita';\nimport { IGithubPullRequest } from 'core-app/features/plugins/linked/openproject-github_integration/state/github-pull-request.model';\nimport {\n createInitialResourceState,\n ResourceState,\n} from 'core-app/core/state/resource-store';\n\nexport interface GithubPullRequestsState extends ResourceState {\n}\n\n@StoreConfig({ name: 'github-pull-requests' })\nexport class GithubPullRequestsStore extends EntityStore {\n constructor() {\n super(createInitialResourceState());\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { IGithubPullRequest } from 'core-app/features/plugins/linked/openproject-github_integration/state/github-pull-request.model';\nimport { GithubPullRequestsStore } from 'core-app/features/plugins/linked/openproject-github_integration/state/github-pull-request.store';\nimport { ID } from '@datorama/akita';\nimport { ResourceStoreService, ResourceStore } from 'core-app/core/state/resource-store.service';\nimport { Observable } from 'rxjs';\n\n@Injectable()\nexport class GithubPullRequestResourceService extends ResourceStoreService {\n ofWorkPackage(workPackage:WorkPackageResource):Observable {\n const path = this.workPackagePullRequestsPath(workPackage.id as string);\n return this.requireCollection(path);\n }\n\n requireSingle(id:ID):Observable {\n return this.requireEntity(this.entityPath(id));\n }\n\n protected basePath():string {\n return this.apiV3Service.github_pull_requests.path;\n }\n\n protected entityPath(id:ID):string {\n return this.apiV3Service.github_pull_requests.id(id).path;\n }\n\n protected workPackagePullRequestsPath(id:ID):string {\n return this.apiV3Service.work_packages.id(id).github_pull_requests.path;\n }\n\n protected createStore():ResourceStore {\n return new GithubPullRequestsStore();\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 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 { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\n\nexport type PullRequestState = 'opened'|'closed'|'referenced'|'ready_for_review'|'merged'|'draft';\n\n@Component({\n selector: 'op-github-pull-request-state',\n templateUrl: './pull-request-state.component.html',\n styleUrls: [\n './pull-request-state.component.sass',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PullRequestStateComponent implements OnInit {\n @Input() state:PullRequestState;\n\n @Input() small = false;\n\n displayText:string;\n\n constructor(\n readonly PathHelper:PathHelperService,\n readonly I18n:I18nService,\n ) {\n }\n\n ngOnInit():void {\n this.displayText = this.I18n.t(\n `js.github_integration.pull_requests.states.${this.state}`,\n { defaultValue: this.state || '(unknown state)' },\n );\n }\n}\n","\n \n {{displayText}}\n\n","\n\n\n\n
      \n {{ text.label_created_by }}\n \n \n .\n \n\n \n {{ text.label_last_updated_on }}\n \n .\n
      \n\n\n\n\n\n\n\n
    • \n \n \n \n app owner avatar\n\n \n \n \n \n\n \n \n {{ text.label_details }}\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 HostBinding,\n Input,\n} from '@angular/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {\n IGithubCheckRunResource,\n IGithubPullRequest,\n} from 'core-app/features/plugins/linked/openproject-github_integration/state/github-pull-request.model';\n\n@Component({\n selector: 'op-github-pull-request',\n templateUrl: './pull-request.component.html',\n styleUrls: [\n './pull-request.component.sass',\n './pr-check.component.sass',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n\nexport class PullRequestComponent {\n @HostBinding('class.op-pull-request') className = true;\n\n @Input() public pullRequest:IGithubPullRequest;\n\n public text = {\n label_created_by: this.I18n.t('js.label_created_by'),\n label_last_updated_on: this.I18n.t('js.label_last_updated_on'),\n label_details: this.I18n.t('js.label_details'),\n label_actions: this.I18n.t('js.github_integration.github_actions'),\n };\n\n constructor(\n readonly PathHelper:PathHelperService,\n readonly I18n:I18nService,\n ) {\n }\n\n get state():string {\n if (this.pullRequest.state === 'open') {\n return (this.pullRequest.draft ? 'draft' : 'open');\n }\n return (this.pullRequest.merged ? 'merged' : 'closed');\n }\n\n public checkRunStateText(checkRun:IGithubCheckRunResource) {\n /* Github apps can *optionally* add an output object (and a title) which is the most relevant information to display.\n If that is not present, we can display the conclusion (which is present only on finished runs).\n If that is not present, we can always fall back to the status. */\n return (checkRun.outputTitle || checkRun.conclusion || checkRun.status);\n }\n\n public checkRunState(checkRun:IGithubCheckRunResource) {\n return (checkRun.conclusion || checkRun.status);\n }\n\n public checkRunStateIcon(checkRun:IGithubCheckRunResource) {\n switch (this.checkRunState(checkRun)) {\n case 'success': {\n return 'checkmark';\n }\n case 'queued': {\n return 'getting-started';\n }\n case 'in_progress': {\n return 'loading1';\n }\n case 'failure': {\n return 'cancel';\n }\n case 'timed_out': {\n return 'reminder';\n }\n case 'action_required': {\n return 'warning';\n }\n case 'stale': {\n return 'not-supported';\n }\n case 'skipped': {\n return 'redo';\n }\n case 'neutral': {\n return 'minus1';\n }\n case 'cancelled': {\n return 'minus1';\n }\n default: {\n return 'not-supported';\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 HostBinding,\n Input,\n 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 { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { GithubPullRequestResourceService } from 'core-app/features/plugins/linked/openproject-github_integration/state/github-pull-request.service';\nimport { IGithubPullRequest } from 'core-app/features/plugins/linked/openproject-github_integration/state/github-pull-request.model';\nimport {\n map,\n shareReplay,\n} from 'rxjs/operators';\nimport { Observable } from 'rxjs';\n\n@Component({\n selector: 'op-tab-prs',\n templateUrl: './tab-prs.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TabPrsComponent implements OnInit {\n @HostBinding('class.op-github-prs') className = true;\n\n @Input() workPackage:WorkPackageResource;\n\n pullRequests$:Observable;\n\n emptyText:string;\n\n constructor(\n readonly I18n:I18nService,\n readonly apiV3Service:ApiV3Service,\n readonly githubPullRequests:GithubPullRequestResourceService,\n ) {}\n\n ngOnInit():void {\n this.emptyText = this.I18n.t('js.github_integration.tab_prs.empty', { wp_id: this.workPackage.id });\n this.pullRequests$ = this\n .githubPullRequests\n .ofWorkPackage(this.workPackage)\n .pipe(\n map((elements) => _.sortBy(elements, 'updatedAt')),\n shareReplay(1),\n );\n }\n}\n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { WorkPackageResource } from \"core-app/features/hal/resources/work-package-resource\";\nimport { TabComponent } from \"core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/tab\";\nimport { I18nService } from \"core-app/core/i18n/i18n.service\";\nimport { PathHelperService } from \"core-app/core/path-helper/path-helper.service\";\n\n@Component({\n selector: 'github-tab',\n templateUrl: './github-tab.template.html'\n})\nexport class GitHubTabComponent implements TabComponent {\n @Input() public workPackage:WorkPackageResource;\n\n constructor(readonly PathHelper:PathHelperService,\n readonly I18n:I18nService) {\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// ++ Ng1FieldControlsWrapper,\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n Input,\n OnInit,\n} from '@angular/core';\nimport { HalResourceEditingService } from 'core-app/shared/components/fields/edit/services/hal-resource-editing.service';\nimport { populateInputsFromDataset } from 'core-app/shared/components/dataset-inputs';\nimport { IGithubPullRequest, IGithubUserResource } from '../state/github-pull-request.model';\nimport { GithubPullRequestResourceService } from '../state/github-pull-request.service';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PullRequestState } from './pull-request-state.component';\n\nexport const githubPullRequestMacroSelector = 'macro.github_pull_request';\n\n@Component({\n selector: githubPullRequestMacroSelector,\n templateUrl: './pull-request-macro.component.html',\n styleUrls: ['./pull-request-macro.component.sass'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n HalResourceEditingService,\n ],\n})\nexport class PullRequestMacroComponent implements OnInit {\n @Input() pullRequestId:string;\n\n @Input() pullRequestState:PullRequestState;\n\n pullRequest$:Observable;\n\n displayText$:Observable;\n\n constructor(\n readonly elementRef:ElementRef,\n readonly injector:Injector,\n readonly pullRequests:GithubPullRequestResourceService,\n readonly I18n:I18nService,\n ) {\n populateInputsFromDataset(this);\n }\n\n ngOnInit() {\n this.pullRequest$ = this\n .pullRequests\n .requireSingle(this.pullRequestId);\n\n this.displayText$ = this\n .pullRequest$\n .pipe(\n map((pr) => this.buildText(pr)),\n );\n }\n\n private buildText(pr:IGithubPullRequest):string {\n const actor = this.deriveActor(pr) as IGithubUserResource;\n const actorLink = this.htmlLink(actor.htmlUrl, actor.login);\n const repositoryLink = this.htmlLink(pr.repositoryHtmlUrl, pr.repository);\n const prLink = this.htmlLink(pr.htmlUrl, pr.title);\n\n const message = this.deriveMessage();\n return this.I18n.t(\n `js.github_integration.pull_requests.${message}`,\n {\n pr_number: pr.number,\n pr_link: prLink,\n repository_link: repositoryLink,\n pr_state: this.I18n.t(\n `js.github_integration.pull_requests.states.${this.pullRequestState}`,\n { defaultValue: this.pullRequestState || '(unknown state)' },\n ),\n github_user_link: actorLink,\n },\n );\n }\n\n\n private deriveActor(pr:IGithubPullRequest) {\n if (this.pullRequestState === 'merged') {\n return pr._embedded.mergedBy;\n } else {\n return pr._embedded.githubUser;\n }\n }\n\n private deriveMessage() {\n if (this.pullRequestState === 'referenced') {\n return 'referenced_message';\n } else if (this.pullRequestState === 'merged') {\n return 'merged_message';\n }\n\n return 'message';\n }\n\n private htmlLink(href:string, title:string):string {\n const link = document.createElement('a');\n link.href = href;\n link.textContent = title;\n\n return link.outerHTML;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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 Injector,\n NgModule,\n} from '@angular/core';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { OpenprojectTabsModule } from 'core-app/shared/components/tabs/openproject-tabs.module';\nimport { WorkPackageTabsService } from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-tabs.service';\nimport { GitHubTabComponent } from './github-tab/github-tab.component';\nimport { TabHeaderComponent } from './tab-header/tab-header.component';\nimport { TabPrsComponent } from './tab-prs/tab-prs.component';\nimport { GitActionsMenuDirective } from './git-actions-menu/git-actions-menu.directive';\nimport { GitActionsMenuComponent } from './git-actions-menu/git-actions-menu.component';\nimport { PullRequestComponent } from './pull-request/pull-request.component';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { GithubPullRequestResourceService } from './state/github-pull-request.service';\nimport {\n githubPullRequestMacroSelector,\n PullRequestMacroComponent,\n} from './pull-request/pull-request-macro.component';\nimport { DynamicBootstrapper } from 'core-app/core/setup/globals/dynamic-bootstrapper';\nimport { PullRequestStateComponent } from './pull-request/pull-request-state.component';\n\nexport function workPackageGithubPrsCount(\n workPackage:WorkPackageResource,\n injector:Injector,\n):Observable {\n const githubPrsService = injector.get(GithubPullRequestResourceService);\n return githubPrsService\n .ofWorkPackage(workPackage)\n .pipe(\n map((prs) => prs.length),\n );\n}\n\nexport function initializeGithubIntegrationPlugin(injector:Injector) {\n const wpTabService = injector.get(WorkPackageTabsService);\n wpTabService.register({\n component: GitHubTabComponent,\n name: I18n.t('js.github_integration.work_packages.tab_name'),\n id: 'github',\n displayable: (workPackage) => !!workPackage.github,\n count: workPackageGithubPrsCount,\n });\n}\n\n@NgModule({\n imports: [\n OpSharedModule,\n OpenprojectTabsModule,\n ],\n providers: [\n GithubPullRequestResourceService,\n ],\n declarations: [\n GitHubTabComponent,\n TabHeaderComponent,\n TabPrsComponent,\n GitActionsMenuDirective,\n GitActionsMenuComponent,\n PullRequestComponent,\n PullRequestMacroComponent,\n PullRequestStateComponent,\n ],\n exports: [\n GitHubTabComponent,\n TabHeaderComponent,\n TabPrsComponent,\n GitActionsMenuDirective,\n GitActionsMenuComponent,\n PullRequestMacroComponent,\n ],\n})\nexport class PluginModule {\n constructor(injector:Injector) {\n initializeGithubIntegrationPlugin(injector);\n DynamicBootstrapper.register(\n { selector: githubPullRequestMacroSelector, cls: PullRequestMacroComponent, embeddable: true },\n );\n }\n}\n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2023 Ben Tey\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n// Copyright (C) 2012-2021 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See docs/COPYRIGHT.rdoc for more details.\n//++\n\nimport { Injectable } from '@angular/core';\nimport { WorkPackageResource } from \"core-app/features/hal/resources/work-package-resource\";\n\n// probably not providable in root when we want to cache the formatter and set custom templates\n@Injectable({\n providedIn: 'root',\n})\nexport class GitActionsService {\n private sanitizeBranchString(str:string):string {\n // See https://stackoverflow.com/a/3651867 for how these rules came in.\n // This sanitization tries to be harsher than those rules\n return str\n .replace(/&/g, 'and ') // & becomes and\n .replace(/ +/g, '-') // Spaces become dashes\n .replace(/[\\000-\\039]/g, '') // ASCII control characters are out\n .replace(/\\177/g, '') // DEL is out\n .replace(/[#\\\\\\/\\?\\*\\~\\^\\:\\{\\}@\\.\\[\\]'\"]/g, '') // Some other characters with special rules are out\n .replace(/^[-]+/g, '') // Dashes at the start are removed\n .replace(/[-]+$/g, '') // Dashes at the end are removed\n .replace(/-+/g, '-') // Multiple dashes in a row are deduped\n .trim();\n }\n\n private formattingInput(workPackage: WorkPackageResource) {\n const type = workPackage.type.name || '';\n const id = workPackage.id || '';\n const title = workPackage.subject;\n const url = window.location.origin + workPackage.pathHelper.workPackagePath(id);\n const description = '';\n\n return({\n id, type, title, url, description\n });\n }\n\n private sanitizeShellInput(str:string):string {\n return `${str.replace(/'/g, '\\\\\\'')}`;\n }\n\n public branchName(workPackage:WorkPackageResource):string {\n const { type, id, title } = this.formattingInput(workPackage);\n return `${this.sanitizeBranchString(type)}/${id}-${this.sanitizeBranchString(title)}`.toLocaleLowerCase();\n }\n\n public commitMessage(workPackage:WorkPackageResource):string {\n const { title, id, description, url } = this.formattingInput(workPackage);\n return `OP#${id} ${title}\n\n${description}\n\n${url}\n`.replace(/\\n\\n+/g, '\\n\\n');\n }\n\n public gitCommand(workPackage:WorkPackageResource):string {\n const branch = this.branchName(workPackage);\n const commit = this.commitMessage(workPackage);\n return `git checkout -b '${this.sanitizeShellInput(branch)}' && git commit --allow-empty -m '${this.sanitizeShellInput(commit)}'`;\n }\n}\n","
      \n

      {{text.title}}

      \n\n
      \n \n
      \n\n
      \n\n\n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2023 Ben Tey\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n// Copyright (C) 2012-2021 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See docs/COPYRIGHT.rdoc for more details.\n//++\n\nimport copy from 'copy-text-to-clipboard';\nimport { Component, Inject, Input } from '@angular/core';\nimport { GitActionsService } from '../git-actions/git-actions.service';\nimport { ISnippet } from \"core-app/features/plugins/linked/openproject-gitlab_integration/typings\";\nimport { WorkPackageResource } from \"core-app/features/hal/resources/work-package-resource\";\nimport { OPContextMenuComponent } from \"core-app/shared/components/op-context-menu/op-context-menu.component\";\nimport {\n OpContextMenuLocalsMap,\n OpContextMenuLocalsToken\n} from \"core-app/shared/components/op-context-menu/op-context-menu.types\";\nimport { I18nService } from \"core-app/core/i18n/i18n.service\";\n\n\n@Component({\n selector: 'op-git-actions-menu',\n templateUrl: './git-actions-menu.template.html',\n styleUrls: [\n './styles/git-actions-menu.sass'\n ]\n})\nexport class GitActionsMenuComponent extends OPContextMenuComponent {\n @Input() public workPackage:WorkPackageResource;\n\n public text = {\n title: this.I18n.t('js.gitlab_integration.tab_header_mr.git_actions.title'),\n copyButtonHelpText: this.I18n.t('js.gitlab_integration.tab_header_mr.git_actions.copy_button_help'),\n copyResult: {\n success: this.I18n.t('js.gitlab_integration.tab_header_mr.git_actions.copy_success'),\n error: this.I18n.t('js.gitlab_integration.tab_header_mr.git_actions.copy_error')\n }\n };\n\n public lastCopyResult:string = this.text.copyResult.success;\n public showCopyResult:boolean = false;\n public copiedSnippetId:string = '';\n\n public snippets:ISnippet[] = [\n {\n id: 'branch',\n name: this.I18n.t('js.gitlab_integration.tab_header_mr.git_actions.branch_name'),\n textToCopy: () => this.gitActions.branchName(this.workPackage)\n },\n {\n id: 'message',\n name: this.I18n.t('js.gitlab_integration.tab_header_mr.git_actions.commit_message'),\n textToCopy: () => this.gitActions.commitMessage(this.workPackage)\n },\n {\n id: 'command',\n name: this.I18n.t('js.gitlab_integration.tab_header_mr.git_actions.cmd'),\n textToCopy: () => this.gitActions.gitCommand(this.workPackage)\n },\n ];\n\n constructor(@Inject(OpContextMenuLocalsToken)\n public locals:OpContextMenuLocalsMap,\n readonly I18n:I18nService,\n readonly gitActions:GitActionsService) {\n super(locals);\n this.workPackage = this.locals.workPackage;\n }\n\n public onCopyButtonClick(snippet:ISnippet):void {\n const success = copy(snippet.textToCopy());\n\n if (success) {\n this.lastCopyResult = this.text.copyResult.success;\n } else {\n this.lastCopyResult = this.text.copyResult.error;\n }\n this.copiedSnippetId = snippet.id;\n this.showCopyResult = true;\n window.setTimeout(() => {\n this.showCopyResult = false;\n }, 2000);\n }\n}\n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2023 Ben Tey\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n// Copyright (C) 2012-2021 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See docs/COPYRIGHT.rdoc for more details.\n//++\n\nimport { OpContextMenuItem } from 'core-app/shared/components/op-context-menu/op-context-menu.types';\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';\nimport { WorkPackageResource } from \"core-app/features/hal/resources/work-package-resource\";\nimport { GitActionsMenuComponent } from './git-actions-menu.component';\n\n\n@Directive({\n selector: '[gitActionsCopyDropdown]'\n})\nexport class GitActionsMenuDirective extends OpContextMenuTrigger {\n @Input('gitActionsCopyDropdown-workPackage') public workPackage:WorkPackageResource;\n\n constructor(readonly elementRef:ElementRef,\n readonly opContextMenu:OPContextMenuService) {\n super(elementRef, opContextMenu);\n }\n\n protected open(evt:JQuery.TriggeredEvent) {\n this.opContextMenu.show(this, evt, GitActionsMenuComponent);\n }\n\n public get locals():{ showAnchorRight?:boolean, contextMenuId?:string, items:OpContextMenuItem[], workPackage:WorkPackageResource } {\n return {\n workPackage: this.workPackage,\n contextMenuId: 'gitlab-integration-git-actions-menu',\n items: []\n };\n }\n}\n\n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2023 Ben Tey\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n// Copyright (C) 2012-2021 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See docs/COPYRIGHT.rdoc for more details.\n//++\n\nimport { Component, Input } from '@angular/core';\nimport { WorkPackageResource } from \"core-app/features/hal/resources/work-package-resource\";\nimport { I18nService } from \"core-app/core/i18n/i18n.service\";\n\n@Component({\n selector: 'tab-header-mr',\n templateUrl: './tab-header-mr.template.html',\n styleUrls: [\n './styles/tab-header-mr.sass'\n ]\n})\nexport class TabHeaderMrsComponent {\n @Input() public workPackage:WorkPackageResource;\n\n public text = {\n title: this.I18n.t('js.gitlab_integration.tab_header_mr.title'),\n // createPrButtonLabel: this.I18n.t('js.gitlab_integration.tab_header.create_mr.label'),\n // createPrButtonDescription: this.I18n.t('js.gitlab_integration.tab_header.create_mr.description'),\n gitMenuLabel: this.I18n.t('js.gitlab_integration.tab_header_mr.copy_menu.label'),\n gitMenuDescription: this.I18n.t('js.gitlab_integration.tab_header_mr.copy_menu.description'),\n };\n\n constructor(readonly I18n:I18nService) {\n }\n}\n","
      \n \n

      \n {{text.title}}\n

      \n
        \n
      • \n \n
      • \n
      \n
      \n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2023 Ben Tey\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n// Copyright (C) 2012-2021 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See docs/COPYRIGHT.rdoc for more details.\n//++\n\nimport { Component, Input } from '@angular/core';\nimport { WorkPackageResource } from \"core-app/features/hal/resources/work-package-resource\";\nimport { I18nService } from \"core-app/core/i18n/i18n.service\";\n\n@Component({\n selector: 'tab-header-issue',\n templateUrl: './tab-header-issue.template.html',\n styleUrls: [\n './styles/tab-header-issue.sass'\n ]\n})\nexport class TabHeaderIssueComponent {\n @Input() public workPackage:WorkPackageResource;\n\n public text = {\n title: this.I18n.t('js.gitlab_integration.tab_header_issue.title'),\n };\n\n constructor(readonly I18n:I18nService) {\n }\n}\n","
      \n \n

      \n {{text.title}}\n

      \n
      \n","\n\n\n \n {{state}} | \n \n\n\n\n\n 0\" class='op-merge-request--pipeline-icon'\n [ngClass]=\"'op-merge-request--pipeline-icon_bg_' + mergeRequest.pipelines[0].status\">\n \n {{ mergeRequest.pipelines[0].status }} \n\n\n
      \n {{ text.label_created_by }}\n \n \n .\n \n \n {{ text.label_last_updated_on }}\n \n .\n
      \n\n
      \n \n \n {{label.title}}\n \n \n
      \n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2023 Ben Tey\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n// Copyright (C) 2012-2021 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See docs/COPYRIGHT.rdoc for more details.\n//++\n\nimport { Component, Input } from '@angular/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {IGitlabMergeRequestResource} from 'core-app/features/plugins/linked/openproject-gitlab_integration/typings';\n\n@Component({\n selector: 'gitlab-merge-request',\n templateUrl: './merge-request.component.html',\n styleUrls: [\n './merge-request.component.sass',\n './mr-pipeline.component.sass',\n ],\n host: { class: 'op-merge-request' }\n})\n\nexport class MergeRequestComponent {\n @Input() public mergeRequest:IGitlabMergeRequestResource;\n\n public text = {\n label_created_by: this.I18n.t('js.label_created_by'),\n label_last_updated_on: this.I18n.t('js.gitlab_integration.updated_on'),\n label_details: this.I18n.t('js.label_details'),\n label_pipelines: this.I18n.t('js.gitlab_integration.gitlab_pipelines'),\n };\n\n constructor(readonly PathHelper:PathHelperService,\n readonly I18n:I18nService) {\n }\n\n get state() {\n\n if (this.mergeRequest.state === 'opened') {\n return (this.mergeRequest.draft ? 'open' : 'ready');\n } else {\n return(this.mergeRequest.merged ? 'merged' : 'closed');\n }\n }\n\n toggleLabels(identifier: string) {\n const labelsElement = document.querySelector(`.op-merge-request--labels-${identifier}`) as HTMLElement;\n\n // Check the current display property and toggle it\n labelsElement.style.display = labelsElement.style.display === 'none' ? 'block' : 'none';\n }\n\n}\n","\n

      \n
      \n\n\n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2023 Ben Tey\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n// Copyright (C) 2012-2021 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See docs/COPYRIGHT.rdoc for more details.\n//++\n\nimport { ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';\nimport { WorkPackageResource } from \"core-app/features/hal/resources/work-package-resource\";\nimport { HalResourceService } from \"core-app/features/hal/services/hal-resource.service\";\nimport { CollectionResource } from \"core-app/features/hal/resources/collection-resource\";\nimport { I18nService } from \"core-app/core/i18n/i18n.service\";\nimport {IGitlabMergeRequestResource} from \"core-app/features/plugins/linked/openproject-gitlab_integration/typings\";\nimport {ApiV3Service} from \"core-app/core/apiv3/api-v3.service\";\n\n@Component({\n selector: 'tab-mrs',\n templateUrl: './tab-mrs.template.html',\n host: { class: 'op-mrs' }\n})\nexport class TabMrsComponent implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n public mergeRequests:IGitlabMergeRequestResource[] = [];\n\n constructor(\n readonly I18n:I18nService,\n readonly apiV3Service:ApiV3Service,\n readonly halResourceService:HalResourceService,\n readonly changeDetector:ChangeDetectorRef,\n ) {}\n\n ngOnInit(): void {\n const basePath = this.apiV3Service.work_packages.id(this.workPackage.id as string).path;\n const mergeRequestsPath = `${basePath}/gitlab_merge_requests`;\n\n this.halResourceService\n .get>(mergeRequestsPath)\n .subscribe((value) => {\n this.mergeRequests = value.elements;\n this.changeDetector.detectChanges();\n });\n }\n\n public getEmptyText() {\n return this.I18n.t('js.gitlab_integration.tab_mrs.empty',{ wp_id: this.workPackage.id });\n }\n}\n","\n\n\n \n {{state}} | \n \n\n\n\n\n
      \n {{ text.label_created_by }}\n \n \n .\n \n \n {{ text.label_last_updated_on }}\n \n .\n
      \n\n
      \n \n \n {{label.title}}\n \n \n
      \n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2023 Ben Tey\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n// Copyright (C) 2012-2021 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See docs/COPYRIGHT.rdoc for more details.\n//++\n\nimport { Component, Input } from '@angular/core';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport {IGitlabIssueResource} from 'core-app/features/plugins/linked/openproject-gitlab_integration/typings';\n\n@Component({\n selector: 'gitlab-issue',\n templateUrl: './issue.component.html',\n styleUrls: [\n './issue.component.sass',\n ],\n host: { class: 'op-issue' }\n})\n\nexport class IssueComponent {\n @Input() public gitlabIssue:IGitlabIssueResource;\n\n public text = {\n label_created_by: this.I18n.t('js.label_created_by'),\n label_last_updated_on: this.I18n.t('js.gitlab_integration.updated_on'),\n label_details: this.I18n.t('js.label_details'),\n };\n\n constructor(readonly PathHelper:PathHelperService,\n readonly I18n:I18nService) {\n }\n\n get state() {\n\n if (this.gitlabIssue.state === 'opened') {\n return ('open');\n } else {\n return('closed');\n }\n }\n\n toggleLabels(identifier: string) {\n const labelsElement = document.querySelector(`.op-issue--labels-${identifier}`) as HTMLElement;\n\n // Check the current display property and toggle it\n labelsElement.style.display = labelsElement.style.display === 'none' ? 'block' : 'none';\n }\n}\n","\n

      \n
      \n\n\n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2023 Ben Tey\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n// Copyright (C) 2012-2021 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See docs/COPYRIGHT.rdoc for more details.\n//++\n\nimport { ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';\nimport { WorkPackageResource } from \"core-app/features/hal/resources/work-package-resource\";\nimport { HalResourceService } from \"core-app/features/hal/services/hal-resource.service\";\nimport { CollectionResource } from \"core-app/features/hal/resources/collection-resource\";\nimport { I18nService } from \"core-app/core/i18n/i18n.service\";\nimport {IGitlabIssueResource} from \"core-app/features/plugins/linked/openproject-gitlab_integration/typings\";\nimport {ApiV3Service} from \"core-app/core/apiv3/api-v3.service\";\n\n@Component({\n selector: 'tab-issue',\n templateUrl: './tab-issue.template.html',\n host: { class: 'op-issue' }\n})\nexport class TabIssueComponent implements OnInit {\n @Input() public workPackage:WorkPackageResource;\n\n public gitlabIssues:IGitlabIssueResource[] = [];\n\n constructor(\n readonly I18n:I18nService,\n readonly apiV3Service:ApiV3Service,\n readonly halResourceService:HalResourceService,\n readonly changeDetector:ChangeDetectorRef,\n ) {}\n\n ngOnInit(): void {\n const basePath = this.apiV3Service.work_packages.id(this.workPackage.id as string).path;\n const gitlabIssuePath = `${basePath}/gitlab_issues`;\n\n this.halResourceService\n .get>(gitlabIssuePath)\n .subscribe((value) => {\n this.gitlabIssues = value.elements;\n this.changeDetector.detectChanges();\n });\n }\n\n public getEmptyText() {\n return this.I18n.t('js.gitlab_integration.tab_issue.empty',{ wp_id: this.workPackage.id });\n }\n}\n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2023 Ben Tey\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n// Copyright (C) 2012-2021 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See docs/COPYRIGHT.rdoc for more details.\n//++\n\nimport { Component, Input } from '@angular/core';\nimport { WorkPackageResource } from \"core-app/features/hal/resources/work-package-resource\";\nimport { TabComponent } from \"core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/tab\";\nimport { I18nService } from \"core-app/core/i18n/i18n.service\";\nimport { PathHelperService } from \"core-app/core/path-helper/path-helper.service\";\n\n@Component({\n selector: 'gitlab-tab',\n templateUrl: './gitlab-tab.template.html',\n styleUrls: [\n './gitlab-tab.component.sass',\n ]\n})\nexport class GitlabTabComponent implements TabComponent {\n @Input() public workPackage:WorkPackageResource;\n\n constructor(readonly PathHelper:PathHelperService,\n readonly I18n:I18nService) {\n }\n}\n","\n\n\n\n\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \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) 2023 Ben Tey\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n// Copyright (C) 2012-2021 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See docs/COPYRIGHT.rdoc 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';\n\n@Injectable()\nexport class WorkPackagesGitlabMrsService extends WorkPackageLinkedResourceCache {\n\n constructor(public ConfigurationService:ConfigurationService) {\n super();\n }\n\n protected load(workPackage:WorkPackageResource):Promise {\n return workPackage.gitlab_merge_requests.$update().then((data:any) => {\n return this.sortList(data.elements);\n });\n }\n\n protected sortList(mergeRequests:HalResource[], attr = 'createdAt'):HalResource[] {\n return _.sortBy(_.flatten(mergeRequests), attr);\n }\n}\n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2023 Ben Tey\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n// Copyright (C) 2012-2021 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See docs/COPYRIGHT.rdoc 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';\n\n@Injectable()\nexport class WorkPackagesGitlabIssueService extends WorkPackageLinkedResourceCache {\n\n constructor(public ConfigurationService:ConfigurationService) {\n super();\n }\n\n protected load(workPackage:WorkPackageResource):Promise {\n return workPackage.gitlab_issues.$update().then((data:any) => {\n return this.sortList(data.elements);\n });\n }\n\n protected sortList(gitlabIssue:HalResource[], attr = 'createdAt'):HalResource[] {\n return _.sortBy(_.flatten(gitlabIssue), attr);\n }\n}\n","//-- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2023 Ben Tey\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n// Copyright (C) 2012-2021 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See docs/COPYRIGHT.rdoc for more details.\n//++\n\nimport { Injector, NgModule } from '@angular/core';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { OpenprojectTabsModule } from 'core-app/shared/components/tabs/openproject-tabs.module';\nimport { WorkPackageTabsService } from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-tabs.service';\n\n\nimport { GitlabTabComponent } from './gitlab-tab/gitlab-tab.component';\nimport { TabHeaderMrsComponent } from './tab-header-mr/tab-header-mr.component';\nimport { TabHeaderIssueComponent } from './tab-header-issue/tab-header-issue.component';\nimport { TabMrsComponent } from './tab-mrs/tab-mrs.component';\nimport { TabIssueComponent } from './tab-issue/tab-issue.component';\nimport { GitActionsMenuDirective } from './git-actions-menu/git-actions-menu.directive';\nimport { GitActionsMenuComponent } from './git-actions-menu/git-actions-menu.component';\nimport { WorkPackagesGitlabMrsService } from './tab-mrs/wp-gitlab-mrs.service';\nimport { WorkPackagesGitlabIssueService } from './tab-issue/wp-gitlab-issue.service';\nimport { MergeRequestComponent } from './merge-request/merge-request.component';\nimport { IssueComponent } from './issue/issue.component';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { Observable, combineLatest } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nexport function workPackageGitlabCount(\n workPackage:WorkPackageResource,\n injector:Injector,\n):Observable {\n const gitlabMrsService = injector.get(WorkPackagesGitlabMrsService);\n const gitlabIssueService = injector.get(WorkPackagesGitlabIssueService);\n\n const mrsObservable = gitlabMrsService.requireAndStream(workPackage).pipe(\n map((mrs) => mrs.length),\n );\n\n const issuesObservable = gitlabIssueService.requireAndStream(workPackage).pipe(\n map((issues) => issues.length),\n );\n\n return combineLatest([mrsObservable, issuesObservable]).pipe(\n map(([mrsCount, issuesCount]) => mrsCount + issuesCount),\n );\n}\n\nexport function initializeGitlabIntegrationPlugin(injector:Injector) {\n const wpTabService = injector.get(WorkPackageTabsService);\n wpTabService.register({\n component: GitlabTabComponent,\n name: I18n.t('js.gitlab_integration.work_packages.tab_name'),\n id: 'gitlab',\n displayable: (workPackage) => !!workPackage.gitlab,\n count: workPackageGitlabCount,\n });\n}\n\n\n@NgModule({\n imports: [\n OpSharedModule,\n OpenprojectTabsModule,\n ],\n providers: [\n WorkPackagesGitlabMrsService,\n WorkPackagesGitlabIssueService,\n ],\n declarations: [\n GitlabTabComponent,\n TabHeaderMrsComponent,\n TabHeaderIssueComponent,\n TabMrsComponent,\n TabIssueComponent,\n GitActionsMenuDirective,\n GitActionsMenuComponent,\n MergeRequestComponent,\n IssueComponent,\n ],\n exports: [\n GitlabTabComponent,\n TabHeaderMrsComponent,\n TabHeaderIssueComponent,\n TabMrsComponent,\n TabIssueComponent,\n GitActionsMenuDirective,\n GitActionsMenuComponent,\n ],\n})\nexport class PluginModule {\n constructor(injector:Injector) {\n initializeGitlabIntegrationPlugin(injector);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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, ElementRef, Input, OnInit } from '@angular/core';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { TabComponent } from 'core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/tab';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\n\n@Component({\n selector: 'op-meetings-tab',\n templateUrl: './meetings-tab.template.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MeetingsTabComponent implements OnInit, TabComponent {\n @Input() public workPackage:WorkPackageResource;\n turboFrameSrc:string;\n\n constructor(\n private elementRef:ElementRef,\n readonly PathHelper:PathHelperService,\n readonly I18n:I18nService,\n ) {}\n\n ngOnInit():void {\n this.turboFrameSrc = `${this.PathHelper.staticBase}/work_packages/${this.workPackage.id}/meetings/tab`;\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// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\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 { CUSTOM_ELEMENTS_SCHEMA, Injector, NgModule } from '@angular/core';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { OpenprojectTabsModule } from 'core-app/shared/components/tabs/openproject-tabs.module';\nimport {\n WorkPackageTabsService,\n} from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-tabs.service';\nimport { MeetingsTabComponent } from './meetings-tab/meetings-tab.component';\nimport { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';\nimport { PathHelperService } from 'core-app/core/path-helper/path-helper.service';\nimport { HttpClient } from '@angular/common/http';\nimport { filter, map, startWith, switchMap, throttleTime } from 'rxjs/operators';\nimport { fromEvent, merge, Observable } from 'rxjs';\nimport { I18nService } from 'core-app/core/i18n/i18n.service';\nimport { TurboStreamElement } from 'core-typings/turbo';\n\nexport function workPackageMeetingsCount(\n workPackage:WorkPackageResource,\n injector:Injector,\n):Observable {\n const pathHelperService = injector.get(PathHelperService);\n const http = injector.get(HttpClient);\n\n return merge(\n fromEvent(document, 'turbo:frame-render'),\n fromEvent(document, 'turbo:before-stream-render'),\n )\n .pipe(\n filter((event:CustomEvent) => {\n if (event.type === 'turbo:frame-render') {\n return (event.target as HTMLElement).id?.includes('work-package-meetings-tab');\n }\n\n if (event.type === 'turbo:before-stream-render') {\n const stream:TurboStreamElement = (event.detail as { newStream:TurboStreamElement }).newStream;\n return stream.target?.includes('work-package-meetings-tab');\n }\n\n return false;\n }),\n startWith(null),\n throttleTime(1000),\n switchMap(() => {\n return http\n .get(`${pathHelperService.workPackagePath(workPackage.id as string)}/meetings/tab/count`)\n .pipe(\n map((res:{ count:number }) => res.count),\n );\n }),\n );\n}\n\nexport function initializeMeetingPlugin(injector:Injector) {\n const wpTabService = injector.get(WorkPackageTabsService);\n const I18n = injector.get(I18nService);\n wpTabService.register({\n component: MeetingsTabComponent,\n name: I18n.t('js.label_meetings'),\n id: 'meetings',\n displayable: (workPackage) => !!workPackage.meetings,\n count: workPackageMeetingsCount,\n });\n}\n\n@NgModule({\n imports: [\n OpSharedModule,\n OpenprojectTabsModule,\n ],\n declarations: [\n MeetingsTabComponent,\n ],\n exports: [\n MeetingsTabComponent,\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class PluginModule {\n constructor(injector:Injector) {\n initializeMeetingPlugin(injector);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// 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// This file is generated by Rails using the rake task\n// rake openproject:plugins:register_frontend\n\nimport {NgModule} from \"@angular/core\";\nimport {PluginModule as Budgets} from './linked/budgets/main';\nimport {PluginModule as Costs} from './linked/costs/main';\nimport {PluginModule as OpenprojectAvatars} from './linked/openproject-avatars/main';\nimport {PluginModule as OpenprojectDocuments} from './linked/openproject-documents/main';\nimport {PluginModule as OpenprojectGithubIntegration} from './linked/openproject-github_integration/main';\nimport {PluginModule as OpenprojectGitlabIntegration} from './linked/openproject-gitlab_integration/main';\nimport {PluginModule as OpenprojectMeeting} from './linked/openproject-meeting/main';\n\n@NgModule({\n imports: [\n Budgets,\n Costs,\n OpenprojectAvatars,\n OpenprojectDocuments,\n OpenprojectGithubIntegration,\n OpenprojectGitlabIntegration,\n OpenprojectMeeting,\n ],\n})\nexport class LinkedPluginsModule { }\n\n\n\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See docs/COPYRIGHT.rdoc for more details.\n//++\n\nimport { NgModule } from '@angular/core';\nimport { AttachmentsResourceService } from 'core-app/core/state/attachments/attachments.service';\nimport { InAppNotificationsResourceService } from './in-app-notifications/in-app-notifications.service';\nimport { ProjectsResourceService } from './projects/projects.service';\nimport { PrincipalsResourceService } from './principals/principals.service';\nimport { CapabilitiesResourceService } from 'core-app/core/state/capabilities/capabilities.service';\nimport { DayResourceService } from 'core-app/core/state/days/day.service';\nimport { WeekdayResourceService } from 'core-app/core/state/days/weekday.service';\n\n@NgModule({\n providers: [\n AttachmentsResourceService,\n InAppNotificationsResourceService,\n ProjectsResourceService,\n PrincipalsResourceService,\n CapabilitiesResourceService,\n DayResourceService,\n WeekdayResourceService,\n ],\n})\nexport class OpenProjectStateModule {}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { Observable, of } from 'rxjs';\nimport { map, share, switchMap } from 'rxjs/operators';\nimport { HttpClient, HttpEvent, HttpEventType } from '@angular/common/http';\n\nimport { OpUploadService } from 'core-app/core/upload/upload.service';\nimport { AttachmentUploadFile } from 'core-app/core/upload/local-upload.service';\nimport { IAttachmentUpload } from 'core-app/core/state/attachments/attachment.model';\nimport { EXTERNAL_REQUEST_HEADER } from 'core-app/features/hal/http/openproject-header-interceptor';\n\ninterface PrepareUploadData {\n upload:{ href:string, method:string, form:FormData, };\n finishUrl:string;\n}\n\nexport class FogUploadService extends OpUploadService {\n constructor(\n private readonly http:HttpClient,\n ) {\n super();\n }\n\n public upload(\n href:string,\n uploadFiles:AttachmentUploadFile[],\n ):Observable>[] {\n return uploadFiles.map((file) => this.uploadSingle(href, file));\n }\n\n private uploadSingle(href:string, uploadFile:AttachmentUploadFile):Observable> {\n return this.prepareUpload(href, uploadFile)\n .pipe(\n switchMap((data) =>\n this.performUpload(data.upload.href, data.upload.method, data.upload.form)\n .pipe(\n switchMap(this.finishUpload(data.finishUrl)),\n )),\n share(),\n );\n }\n\n private prepareUpload(href:string, uploadFile:AttachmentUploadFile):Observable {\n const fileName = uploadFile.file.name;\n const contentType = (uploadFile.file.type || (fileName && getType(fileName)) || '' as string);\n const metadata = {\n fileName,\n contentType,\n description: uploadFile.description,\n fileSize: uploadFile.file.size,\n };\n\n const body = new FormData();\n body.append('metadata', JSON.stringify(metadata));\n\n return this.http.request(\n 'post',\n href,\n {\n body,\n withCredentials: true,\n responseType: 'json',\n },\n ).pipe(\n map((response) => {\n const form = new FormData();\n const formFields = response._links.addAttachment.form_fields;\n Object.entries(formFields).forEach(([key, value]) => {\n form.append(key, value as string);\n });\n form.append('file', uploadFile.file, uploadFile.file.name);\n\n return {\n upload: {\n href: response._links.addAttachment.href,\n method: response._links.addAttachment.method,\n form,\n },\n finishUrl: response._links.completeUpload.href,\n };\n }),\n );\n }\n\n private performUpload(href:string, method:string, body:FormData):Observable> {\n return this.http.request(\n method,\n href,\n {\n body,\n observe: 'events',\n headers: { [EXTERNAL_REQUEST_HEADER]: 'true' },\n responseType: 'text',\n reportProgress: true,\n },\n );\n }\n\n private finishUpload(href:string):(event:HttpEvent) => Observable> {\n return (ev) => {\n if (ev.type === HttpEventType.Response) {\n return this.http.get(href, { observe: 'response' });\n }\n\n return of(ev);\n };\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 { share } from 'rxjs/operators';\nimport { HttpClient, HttpEvent } from '@angular/common/http';\n\nimport { IUploadFile, OpUploadService } from 'core-app/core/upload/upload.service';\n\nexport interface AttachmentUploadFile extends IUploadFile {\n description?:string;\n}\n\nexport class LocalUploadService extends OpUploadService {\n constructor(\n private readonly http:HttpClient,\n ) {\n super();\n }\n\n public upload(\n href:string,\n uploadFiles:AttachmentUploadFile[],\n ):Observable>[] {\n return uploadFiles.map((file) => this.uploadSingle(href, file));\n }\n\n private uploadSingle(href:string, uploadFile:AttachmentUploadFile):Observable> {\n const body = new FormData();\n const metadata = {\n description: uploadFile.description,\n fileName: uploadFile.file.name,\n };\n\n body.append('metadata', JSON.stringify(metadata));\n body.append('file', uploadFile.file, metadata.fileName);\n\n return this.http.request(\n 'post',\n href,\n {\n body,\n observe: 'events',\n withCredentials: true,\n responseType: 'json',\n reportProgress: true,\n },\n ).pipe(share());\n }\n}\n","import 'reflect-metadata';\nimport { Type } from '@angular/core';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport { createCustomElement, NgElementConfig } from '@angular/elements';\n\nexport function registerCustomElement(name:string, component:Type, config:NgElementConfig) {\n const wrappedElement = createCustomElement(component, config);\n if (customElements.get(name)) {\n debugLog(`${name} custom element already registered.`);\n return;\n }\n\n customElements.define(name, wrappedElement);\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { APP_INITIALIZER, ApplicationRef, Injector, NgModule } from '@angular/core';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { HTTP_INTERCEPTORS, HttpClient, HttpClientModule } from '@angular/common/http';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport {\n OpContextMenuTrigger,\n} from 'core-app/shared/components/op-context-menu/handlers/op-context-menu-trigger.directive';\nimport { States } from 'core-app/core/states/states.service';\nimport { OpenprojectFieldsModule } from 'core-app/shared/components/fields/openproject-fields.module';\nimport { OpSharedModule } from 'core-app/shared/shared.module';\nimport { OpSpotModule } from 'core-app/spot/spot.module';\nimport { OpDragScrollDirective } from 'core-app/shared/directives/op-drag-scroll/op-drag-scroll.directive';\nimport { DynamicBootstrapper } from 'core-app/core/setup/globals/dynamic-bootstrapper';\nimport { OpenprojectWorkPackagesModule } from 'core-app/features/work-packages/openproject-work-packages.module';\nimport { OpenprojectAttachmentsModule } from 'core-app/shared/components/attachments/openproject-attachments.module';\nimport { OpenprojectEditorModule } from 'core-app/shared/components/editor/openproject-editor.module';\nimport { OpenprojectGridsModule } from 'core-app/shared/components/grids/openproject-grids.module';\nimport { OpenprojectRouterModule } from 'core-app/core/routing/openproject-router.module';\nimport {\n OpenprojectWorkPackageRoutesModule,\n} from 'core-app/features/work-packages/openproject-work-package-routes.module';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { OpenprojectCalendarModule } from 'core-app/features/calendar/openproject-calendar.module';\nimport { OpenprojectGlobalSearchModule } from 'core-app/core/global_search/openproject-global-search.module';\nimport { OpenprojectDashboardsModule } from 'core-app/features/dashboards/openproject-dashboards.module';\nimport {\n OpenprojectWorkPackageGraphsModule,\n} from 'core-app/shared/components/work-package-graphs/openproject-work-package-graphs.module';\nimport { PreviewTriggerService } from 'core-app/core/setup/globals/global-listeners/preview-trigger.service';\nimport { OpenprojectOverviewModule } from 'core-app/features/overview/openproject-overview.module';\nimport { OpenprojectMyPageModule } from 'core-app/features/my-page/openproject-my-page.module';\nimport { OpenprojectProjectsModule } from 'core-app/features/projects/openproject-projects.module';\nimport { KeyboardShortcutService } from 'core-app/shared/directives/a11y/keyboard-shortcut.service';\nimport { CopyToClipboardService } from 'core-app/shared/components/copy-to-clipboard/copy-to-clipboard.service';\nimport {\n OpenprojectMembersModule,\n} from 'core-app/shared/components/autocompleter/members-autocompleter/members.module';\nimport { OpenprojectAugmentingModule } from 'core-app/core/augmenting/openproject-augmenting.module';\nimport { OpenprojectInviteUserModalModule } from 'core-app/features/invite-user-modal/invite-user-modal.module';\nimport { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module';\nimport {\n RevitAddInSettingsButtonService,\n} from 'core-app/features/bim/revit_add_in/revit-add-in-settings-button.service';\nimport { OpenprojectEnterpriseModule } from 'core-app/features/enterprise/openproject-enterprise.module';\nimport { MainMenuToggleComponent } from 'core-app/core/main-menu/main-menu-toggle.component';\nimport { ConfirmDialogService } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.service';\nimport { ConfirmDialogModalComponent } from 'core-app/shared/components/modals/confirm-dialog/confirm-dialog.modal';\nimport { DynamicContentModalComponent } from 'core-app/shared/components/modals/modal-wrapper/dynamic-content.modal';\nimport {\n PasswordConfirmationModalComponent,\n} from 'core-app/shared/components/modals/request-for-confirmation/password-confirmation.modal';\nimport {\n WpPreviewModalComponent,\n} from 'core-app/shared/components/modals/preview-modal/wp-preview-modal/wp-preview.modal';\nimport {\n OpHeaderProjectSelectComponent,\n} from 'core-app/shared/components/header-project-select/header-project-select.component';\nimport {\n OpHeaderProjectSelectListComponent,\n} from 'core-app/shared/components/header-project-select/list/header-project-select-list.component';\n\nimport { PaginationService } from 'core-app/shared/components/table-pagination/pagination-service';\nimport { MainMenuResizerComponent } from 'core-app/shared/components/resizer/resizer/main-menu-resizer.component';\nimport { OpenprojectTabsModule } from 'core-app/shared/components/tabs/openproject-tabs.module';\nimport { OpenprojectAdminModule } from 'core-app/features/admin/openproject-admin.module';\nimport { OpenprojectHalModule } from 'core-app/features/hal/openproject-hal.module';\nimport { globalDynamicComponents } from 'core-app/core/setup/global-dynamic-components.const';\nimport { HookService } from 'core-app/features/plugins/hook-service';\nimport { OpenprojectPluginsModule } from 'core-app/features/plugins/openproject-plugins.module';\nimport { LinkedPluginsModule } from 'core-app/features/plugins/linked-plugins.module';\nimport {\n OpenProjectInAppNotificationsModule,\n} from 'core-app/features/in-app-notifications/in-app-notifications.module';\nimport { OpenProjectBackupService } from './core/backup/op-backup.service';\nimport { OpenProjectStateModule } from 'core-app/core/state/openproject-state.module';\nimport {\n OpenprojectContentLoaderModule,\n} from 'core-app/shared/components/op-content-loader/openproject-content-loader.module';\nimport { OpenProjectHeaderInterceptor } from 'core-app/features/hal/http/openproject-header-interceptor';\nimport { TopMenuService } from 'core-app/core/top-menu/top-menu.service';\nimport { OpUploadService } from 'core-app/core/upload/upload.service';\nimport { ConfigurationService } from 'core-app/core/config/configuration.service';\nimport { FogUploadService } from 'core-app/core/upload/fog-upload.service';\nimport { LocalUploadService } from 'core-app/core/upload/local-upload.service';\nimport { registerCustomElement } from 'core-app/shared/helpers/angular/custom-elements.helper';\nimport {\n EmbeddedTablesMacroComponent,\n} from 'core-app/features/work-packages/components/wp-table/embedded/embedded-tables-macro.component';\nimport { OpPrincipalComponent } from 'core-app/shared/components/principal/principal.component';\nimport {\n OpBasicSingleDatePickerComponent,\n} from 'core-app/shared/components/datepicker/basic-single-date-picker/basic-single-date-picker.component';\nimport {\n OpBasicRangeDatePickerComponent,\n} from 'core-app/shared/components/datepicker/basic-range-date-picker/basic-range-date-picker.component';\nimport { GlobalSearchInputComponent } from 'core-app/core/global_search/input/global-search-input.component';\nimport {\n OpAutocompleterComponent,\n} from 'core-app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component';\nimport {\n ProjectAutocompleterComponent,\n} from 'core-app/shared/components/autocompleter/project-autocompleter/project-autocompleter.component';\nimport {\n AutocompleteSelectDecorationComponent,\n} from 'core-app/shared/components/autocompleter/autocomplete-select-decoration/autocomplete-select-decoration.component';\nimport {\n MembersAutocompleterComponent,\n} from 'core-app/shared/components/autocompleter/members-autocompleter/members-autocompleter.component';\nimport {\n UserAutocompleterComponent,\n} from 'core-app/shared/components/autocompleter/user-autocompleter/user-autocompleter.component';\nimport { AttributeValueMacroComponent } from 'core-app/shared/components/fields/macros/attribute-value-macro.component';\nimport { AttributeLabelMacroComponent } from 'core-app/shared/components/fields/macros/attribute-label-macro.component';\nimport {\n WorkPackageQuickinfoMacroComponent,\n} from 'core-app/shared/components/fields/macros/work-package-quickinfo-macro.component';\nimport {\n CkeditorAugmentedTextareaComponent,\n} from 'core-app/shared/components/editor/components/ckeditor-augmented-textarea/ckeditor-augmented-textarea.component';\n\nexport function initializeServices(injector:Injector) {\n return () => {\n const PreviewTrigger = injector.get(PreviewTriggerService);\n const topMenuService = injector.get(TopMenuService);\n const keyboardShortcuts = injector.get(KeyboardShortcutService);\n // Conditionally add the Revit Add-In settings button\n injector.get(RevitAddInSettingsButtonService);\n\n topMenuService.register();\n\n PreviewTrigger.setupListener();\n\n keyboardShortcuts.register();\n\n return injector.get(ConfigurationService).initialize();\n };\n}\n\n@NgModule({\n imports: [\n // The BrowserModule must only be loaded here!\n BrowserModule,\n A11yModule,\n\n // Commons\n OpSharedModule,\n // Design System\n OpSpotModule,\n // State module\n OpenProjectStateModule,\n // Router module\n OpenprojectRouterModule,\n // Hal Module\n OpenprojectHalModule,\n\n // CKEditor\n OpenprojectEditorModule,\n // Display + Edit field functionality\n OpenprojectFieldsModule,\n OpenprojectGridsModule,\n OpenprojectAttachmentsModule,\n\n // Project module\n OpenprojectProjectsModule,\n\n // Work packages and their routes\n OpenprojectWorkPackagesModule,\n OpenprojectWorkPackageRoutesModule,\n\n // Work packages in graph representation\n OpenprojectWorkPackageGraphsModule,\n\n // Calendar module\n OpenprojectCalendarModule,\n\n // Dashboards\n OpenprojectDashboardsModule,\n\n // Overview\n OpenprojectOverviewModule,\n\n // MyPage\n OpenprojectMyPageModule,\n\n // Global Search\n OpenprojectGlobalSearchModule,\n\n // Admin module\n OpenprojectAdminModule,\n OpenprojectEnterpriseModule,\n\n // Plugin hooks and modules\n OpenprojectPluginsModule,\n // Linked plugins dynamically generated by bundler\n LinkedPluginsModule,\n\n // Members\n OpenprojectMembersModule,\n\n // Angular Forms\n ReactiveFormsModule,\n\n // Angular Http Client\n HttpClientModule,\n\n // Augmenting Module\n OpenprojectAugmentingModule,\n\n // Modals\n OpenprojectModalModule,\n\n // Invite user modal\n OpenprojectInviteUserModalModule,\n\n // Tabs\n OpenprojectTabsModule,\n\n // Notifications\n OpenProjectInAppNotificationsModule,\n\n // Loading\n OpenprojectContentLoaderModule,\n ],\n providers: [\n { provide: States, useValue: new States() },\n { provide: HTTP_INTERCEPTORS, useClass: OpenProjectHeaderInterceptor, multi: true },\n {\n provide: APP_INITIALIZER, useFactory: initializeServices, deps: [Injector], multi: true,\n },\n {\n provide: OpUploadService,\n useFactory: (config:ConfigurationService, http:HttpClient) =>\n (config.isDirectUploads() ? new FogUploadService(http) : new LocalUploadService(http)),\n deps: [ConfigurationService, HttpClient],\n },\n PaginationService,\n OpenProjectBackupService,\n ConfirmDialogService,\n RevitAddInSettingsButtonService,\n CopyToClipboardService,\n ],\n declarations: [\n OpContextMenuTrigger,\n\n // Modals\n ConfirmDialogModalComponent,\n DynamicContentModalComponent,\n PasswordConfirmationModalComponent,\n WpPreviewModalComponent,\n\n // Main menu\n MainMenuResizerComponent,\n MainMenuToggleComponent,\n\n // Project selector\n OpHeaderProjectSelectComponent,\n OpHeaderProjectSelectListComponent,\n\n // Form configuration\n OpDragScrollDirective,\n ],\n})\nexport class OpenProjectModule {\n // noinspection JSUnusedGlobalSymbols\n ngDoBootstrap(appRef:ApplicationRef) {\n // Register global dynamic components\n // this is necessary to ensure they are not tree-shaken\n // (if they are not used anywhere in Angular, they would be removed)\n DynamicBootstrapper.register(...globalDynamicComponents);\n\n // Perform global dynamic bootstrapping of our entry components\n // that are in the current DOM response.\n DynamicBootstrapper.bootstrapOptionalDocument(appRef, document);\n this.registerCustomElements(appRef.injector);\n\n // Call hook service to allow modules to bootstrap additional elements.\n // We can't use ngDoBootstrap in nested modules since they are not called.\n const hookService = (appRef as any)._injector.get(HookService);\n hookService\n .call('openProjectAngularBootstrap')\n .forEach((results:{ selector:string, cls:any }[]) => {\n DynamicBootstrapper.bootstrapOptionalDocument(appRef, document, results);\n });\n }\n\n private registerCustomElements(injector:Injector) {\n registerCustomElement('opce-macro-embedded-table', EmbeddedTablesMacroComponent, { injector });\n registerCustomElement('opce-principal', OpPrincipalComponent, { injector });\n registerCustomElement('opce-single-date-picker', OpBasicSingleDatePickerComponent, { injector });\n registerCustomElement('opce-range-date-picker', OpBasicRangeDatePickerComponent, { injector });\n registerCustomElement('opce-global-search', GlobalSearchInputComponent, { injector });\n registerCustomElement('opce-autocompleter', OpAutocompleterComponent, { injector });\n registerCustomElement('opce-project-autocompleter', ProjectAutocompleterComponent, { injector });\n registerCustomElement('opce-select-decoration', AutocompleteSelectDecorationComponent, { injector });\n registerCustomElement('opce-members-autocompleter', MembersAutocompleterComponent, { injector });\n registerCustomElement('opce-user-autocompleter', UserAutocompleterComponent, { injector });\n registerCustomElement('opce-macro-attribute-value', AttributeValueMacroComponent, { injector });\n registerCustomElement('opce-macro-attribute-label', AttributeLabelMacroComponent, { injector });\n registerCustomElement('opce-macro-wp-quickinfo', WorkPackageQuickinfoMacroComponent, { injector });\n registerCustomElement('opce-ckeditor-augmented-textarea', CkeditorAugmentedTextareaComponent, { injector });\n }\n}\n","export type MessageSeverity = 'fatal'|'error'|'warning'|'log'|'info'|'debug';\nexport type ErrorTags = Record;\nexport type ContextHook = () => ErrorTags|Promise;\n\nexport abstract class ErrorReporterBase {\n protected contextHooks:ContextHook[] = [];\n\n public addHook(...hook:ContextHook[]):void {\n this.contextHooks.push(...hook);\n }\n\n protected hookPromises():Promise {\n const promises = this\n .contextHooks\n .map((cb) => Promise.resolve(cb()));\n\n return Promise.all(promises);\n }\n\n /** Capture a message */\n abstract captureMessage(msg:string, level?:MessageSeverity):void;\n\n /** Capture an exception(!) only */\n abstract captureException(err:Error):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 { debugLog } from 'core-app/shared/helpers/debug_output';\nimport {\n ErrorReporterBase,\n ErrorTags,\n MessageSeverity,\n} from 'core-app/core/errors/error-reporter-base';\nimport type {\n Appsignal,\n Span,\n} from './appsignal-dependency';\n\nexport class AppsignalReporter extends ErrorReporterBase {\n private client:Appsignal;\n\n public captureMessage(msg:string, severity:MessageSeverity = 'info'):void {\n console.warn('Logging message %O with severity %O', msg, severity);\n }\n\n public captureException(err:Error|string):void {\n if (!this.client || !err) {\n debugLog('Appsignal is not yet loaded, ignoring error %O', err);\n return;\n }\n\n const error = (typeof err === 'string') ? new Error(err) : err;\n void this.client.sendError(error, (span) => this.setupContext(span));\n }\n\n constructor() {\n super();\n const element = document.querySelector('meta[name=openproject_appsignal]') as HTMLElement;\n this.loadAppsignal(element);\n }\n\n private loadAppsignal(element:HTMLElement) {\n const key = element.dataset.pushKey || '';\n const revision = element.dataset.version || '';\n\n void import('./appsignal-dependency').then((imported) => {\n this.client = new imported.Appsignal({\n namespace: 'frontend',\n key,\n revision,\n });\n\n this.client.use(imported.networkPlugin());\n });\n }\n\n /**\n * @param span The appsignal span to send with\n */\n private async setupContext(span:Span):Promise {\n /** Execute callbacks */\n const results = await this.hookPromises();\n\n let tags = {\n locale: (window.I18n as { locale:string }).locale,\n domain: window.location.hostname,\n url_path: window.location.pathname,\n url_query: window.location.search,\n };\n\n results.forEach((added:ErrorTags) => {\n tags = { ...tags, ...added };\n });\n\n span.setTags(tags);\n\n return span;\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\nimport {\n ErrorReporterBase,\n MessageSeverity,\n} from 'core-app/core/errors/error-reporter-base';\n\nexport class LocalReporter extends ErrorReporterBase {\n public captureMessage(msg:string, severity:MessageSeverity = 'info'):void {\n this.handleOfflineMessage('captureMessage', [msg, severity]);\n }\n\n public captureException(err:Error|string):void {\n this.handleOfflineMessage('captureException', [err]);\n throw (err as Error);\n }\n\n /**\n * Remember a message or error for later handling\n * @param type\n * @param args\n */\n private handleOfflineMessage(type:'captureMessage'|'captureException', args:unknown[]) {\n debugLog('[ErrorReporter] Would queue message %O %O, but is not configured.', type, args);\n }\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { OpModalService } from 'core-app/shared/components/modal/modal.service';\nimport { PasswordConfirmationModalComponent } from 'core-app/shared/components/modals/request-for-confirmation/password-confirmation.modal';\n\nfunction registerListener(\n form:JQuery,\n $event:JQuery.TriggeredEvent,\n opModalService:OpModalService,\n passwordModal:typeof PasswordConfirmationModalComponent,\n) {\n const passwordConfirm = form.find('_password_confirmation');\n\n if (passwordConfirm.length > 0) {\n return true;\n }\n\n $event.preventDefault();\n opModalService.show(passwordModal, 'global')\n .subscribe((modal) => modal.closingEvent.subscribe(() => {\n if (!modal.confirmed) {\n return;\n }\n\n jQuery('')\n .attr({\n type: 'hidden',\n name: '_password_confirmation',\n value: modal.password_confirmation,\n })\n .appendTo(form);\n\n form.trigger('submit');\n }));\n\n return false;\n}\n\nexport function registerRequestForConfirmation($:JQueryStatic) {\n window.OpenProject\n .getPluginContext()\n .then((context) => {\n const { opModalService } = context.services;\n const passwordConfirmationModal = context.classes.modals.passwordConfirmation;\n\n $(document).on(\n 'submit',\n 'form[data-request-for-confirmation]',\n function (this:any, $event:JQuery.TriggeredEvent) {\n const form = jQuery(this);\n\n if (form.find('input[name=\"_password_confirmation\"]').length) {\n return true;\n }\n\n return registerListener(form, $event, opModalService, passwordConfirmationModal);\n },\n );\n })\n .catch(() => {});\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nfunction createFieldsetToggleStateLabel(legend:JQuery, text:string) {\n const labelClass = 'fieldset-toggle-state-label';\n let toggleLabel = legend.find(`a span.${labelClass}`);\n const legendLink = legend.children('a');\n\n if (toggleLabel.length === 0) {\n toggleLabel = jQuery('').addClass(labelClass)\n .addClass('hidden-for-sighted');\n\n legendLink.append(toggleLabel);\n }\n\n toggleLabel.text(` ${text}`);\n}\n\nfunction setFieldsetToggleState(fieldset:JQuery) {\n const legend = fieldset.children('legend');\n\n if (fieldset.hasClass('collapsed')) {\n createFieldsetToggleStateLabel(legend, I18n.t('js.label_collapsed'));\n } else {\n createFieldsetToggleStateLabel(legend, I18n.t('js.label_expanded'));\n }\n}\n\nfunction getFieldset(el:HTMLElement) {\n const element = jQuery(el);\n\n if (element.is('legend')) {\n return jQuery(el).parent();\n } if (element.is('fieldset')) {\n return element;\n }\n\n throw new Error('Cannot derive fieldset from element!');\n}\n\nfunction toggleFieldset(el:HTMLElement) {\n const fieldset = getFieldset(el);\n // Mark the fieldset that the user has touched it at least once\n fieldset.attr('data-touched', 'true');\n const contentArea = fieldset.find('> div').not('.form--toolbar');\n\n fieldset.toggleClass('collapsed');\n contentArea.slideToggle('fast');\n\n setFieldsetToggleState(fieldset);\n}\n\nexport function setupToggableFieldsets() {\n const fieldsets = jQuery('fieldset.form--fieldset.-collapsible');\n\n // Toggle on click\n fieldsets.on('click', '.form--fieldset-legend', function (evt) {\n toggleFieldset(this);\n evt.preventDefault();\n evt.stopPropagation();\n return false;\n });\n\n // Set initial state\n fieldsets\n .each(function () {\n const fieldset = getFieldset(this);\n\n const contentArea = fieldset.find('> div');\n if (fieldset.hasClass('collapsed')) {\n contentArea.hide();\n }\n\n setFieldsetToggleState(fieldset);\n });\n}\n","// Legacy code ported from app/assets/javascripts/application.js.erb\n// Do not add stuff here, but ideally remove into components whenever changes are necessary\nexport function setupServerResponse() {\n initMainMenuExpandStatus();\n focusFirstErroneousField();\n activateFlashNotice();\n activateFlashError();\n autoHideFlashMessage();\n flashCloseHandler();\n\n jQuery(document).ajaxComplete(activateFlashNotice);\n jQuery(document).ajaxComplete(activateFlashError);\n\n /*\n * 1 - registers a callback which copies the csrf token into the\n * X-CSRF-Token header with each ajax request. Necessary to\n * work with rails applications which have fixed\n * CVE-2011-0447\n * 2 - shows and hides ajax indicator\n */\n jQuery(document).ajaxSend((event, request) => {\n if (jQuery(event.target.activeElement!).closest('[ajax-indicated]').length\n && jQuery('ajax-indicator')) {\n jQuery('#ajax-indicator').show();\n }\n\n const csrf_meta_tag = jQuery('meta[name=csrf-token]');\n\n if (csrf_meta_tag) {\n const header = 'X-CSRF-Token';\n const token = csrf_meta_tag.attr('content');\n\n request.setRequestHeader(header, token!);\n }\n\n request.setRequestHeader('X-Authentication-Scheme', 'Session');\n });\n\n // ajaxStop gets called when ALL Requests finish, so we won't need a counter as in PT\n jQuery(document).ajaxStop(() => {\n if (jQuery('#ajax-indicator')) {\n jQuery('#ajax-indicator').hide();\n }\n addClickEventToAllErrorMessages();\n });\n\n // show/hide the files table\n jQuery('.attachments h4').click(function () {\n jQuery(this).toggleClass('closed').next().slideToggle(100);\n });\n\n let resizeTo:any = null;\n jQuery(window).on('resize', () => {\n // wait 200 milliseconds for no further resize event\n // then readjust breadcrumb\n\n if (resizeTo) {\n clearTimeout(resizeTo);\n }\n resizeTo = setTimeout(() => {\n jQuery(window).trigger('resizeEnd');\n }, 200);\n });\n\n // Do not close the login window when using it\n jQuery('#nav-login-content').click((event) => {\n event.stopPropagation();\n });\n\n // Set focus on first error message\n const error_focus = jQuery('a.afocus').first();\n const input_focus = jQuery('.autofocus').first();\n if (error_focus !== undefined) {\n error_focus.focus();\n } else if (input_focus !== undefined) {\n input_focus.focus();\n if (input_focus[0].tagName === 'INPUT') {\n input_focus.select();\n }\n }\n // Focus on field with error\n addClickEventToAllErrorMessages();\n\n // Click handler for formatting help\n jQuery(document.body).on('click', '.formatting-help-link-button', () => {\n window.open(`${window.appBasePath}/help/wiki_syntax`,\n '',\n 'resizable=yes, location=no, width=600, height=640, menubar=no, status=no, scrollbars=yes');\n return false;\n });\n}\n\nfunction flashCloseHandler() {\n jQuery('body').on('click keydown touchend', '.close-handler,.op-toast--close', function (e) {\n if (e.type === 'click' || e.which === 13) {\n jQuery(this).parent('.errorExplanation, .op-toast')\n .not('.persistent-toggle--notification')\n .remove();\n }\n });\n}\n\nfunction autoHideFlashMessage() {\n setTimeout(() => {\n jQuery('.op-toast.autohide-toaster').remove();\n }, 5000);\n}\n\nfunction addClickEventToAllErrorMessages() {\n jQuery('a.afocus').each(function () {\n const target = jQuery(this);\n target.click((evt) => {\n let field = jQuery(`#${target.attr('href')!.substr(1)}`);\n if (field === null) {\n // Cut off '_id' (necessary for select boxes)\n field = jQuery(`#${target.attr('href')!.substr(1).concat('_id')}`);\n }\n target.unbind(evt);\n return false;\n });\n });\n}\n\nfunction initMainMenuExpandStatus() {\n const wrapper = jQuery('#wrapper');\n const upToggle = jQuery('ul.menu_root.closed li.open a.arrow-left-to-project');\n\n if (upToggle.length === 1 && wrapper.hasClass('hidden-navigation')) {\n upToggle.trigger('click');\n }\n}\n\nfunction activateFlash(selector:any) {\n const flashMessages = jQuery(selector);\n\n flashMessages.each((ix, e) => {\n const flashMessage = jQuery(e);\n flashMessage.show();\n });\n}\n\nfunction activateFlashNotice() {\n activateFlash('.op-toast[role=\"alert\"]');\n}\n\nfunction activateFlashError() {\n activateFlash('.errorExplanation[role=\"alert\"]');\n}\n\nfunction focusFirstErroneousField() {\n const firstErrorSpan = jQuery('span.errorSpan').first();\n const erroneousInput = firstErrorSpan.find('*').filter(':input');\n\n erroneousInput.trigger('focus');\n}\n","// Dynamically loads and triggers the onboarding tour\n// when on the correct spots\nimport {\n OnboardingTourNames,\n onboardingTourStorageKey,\n ProjectName,\n waitForElement,\n} from 'core-app/core/setup/globals/onboarding/helpers';\nimport { debugLog } from 'core-app/shared/helpers/debug_output';\n\nasync function triggerTour(name:OnboardingTourNames, project?:ProjectName):Promise {\n debugLog(`Loading and triggering onboarding tour ${name}`);\n await import(/* webpackChunkName: \"onboarding-tour\" */ './onboarding_tour').then((tour) => {\n tour.start(name, project);\n });\n}\n\nexport function detectOnboardingTour():void {\n // ------------------------------- Global -------------------------------\n const url = new URL(window.location.href);\n const isMobile = document.body.classList.contains('-browser-mobile');\n const demoProjectsAvailable = jQuery('meta[name=demo_projects_available]').attr('content') === 'true';\n let currentTourPart = sessionStorage.getItem(onboardingTourStorageKey);\n let tourCancelled = false;\n\n // ------------------------------- Initial start -------------------------------\n // Do not show the tutorial on mobile or when the demo data has been deleted\n if (!isMobile && demoProjectsAvailable) {\n // Start after the intro modal (language selection)\n // This has to be changed once the project selection is implemented\n if (url.searchParams.get('first_time_user')) {\n currentTourPart = '';\n sessionStorage.setItem(onboardingTourStorageKey, 'readyToStart');\n\n // Start automatically when modal is closed by backdrop click\n waitForElement('.spot-modal-overlay_active', 'body', () => {\n const elementsByClassName = document.getElementsByClassName('spot-modal-overlay_active');\n Array.from(elementsByClassName).forEach((modalOverlay) => {\n modalOverlay.addEventListener('click', (evt) => {\n if (evt.target === modalOverlay) {\n tourCancelled = true;\n void triggerTour('homescreen');\n }\n });\n });\n });\n\n // Start automatically when the escape button is pressed\n document.addEventListener('keydown', (event) => {\n if (event.key === 'Escape' && !tourCancelled) {\n tourCancelled = true;\n void triggerTour('homescreen');\n }\n }, { once: true });\n }\n\n // ------------------------------- Tutorial Homescreen page -------------------------------\n // start the home onboarding tour (either after the intro modal or by parameter)\n if (currentTourPart === 'readyToStart' || url.searchParams.get('start_home_onboarding_tour')) {\n void triggerTour('homescreen');\n }\n\n // ------------------------------- Tutorial WP page -------------------------------\n if (url.searchParams.get('start_onboarding_tour')) {\n void triggerTour('main', ProjectName.demo);\n }\n }\n}\n","import { isClickedWithModifier } from 'core-app/shared/helpers/link-handling/link-handling';\n\n/**\n * Our application is still a hybrid one, meaning most routes are still\n * handled by Rails. As such, we disable the default link-hijacking that\n * Angular's HTML5-mode with results in\n * @param evt\n * @param linkElement\n */\nexport function performAnchorHijacking(evt:MouseEvent, linkElement:HTMLAnchorElement):boolean {\n const link = linkElement.getAttribute('href') || '';\n const hashPos = link.indexOf('#');\n\n // If link is neither empty nor starts with hash, ignore it\n if (link !== '' && hashPos !== 0) {\n return false;\n }\n\n // Set the location to the hash if there is any\n // Since with the base tag, links like href=\"#whatever\" otherwise target to /#whatever\n if (hashPos !== -1 && link !== '#') {\n window.location.hash = link;\n }\n\n return true;\n}\n\n/**\n * Detect the origin of a clicked link\n * @param evt\n * @param linkElement\n */\nexport function openExternalLinksInNewTab(evt:MouseEvent, linkElement:HTMLAnchorElement):boolean {\n if (isClickedWithModifier(evt)) {\n return false;\n }\n\n const link = linkElement.href || '';\n\n if (link === '') {\n return false;\n }\n\n const origin = window.location.origin;\n\n try {\n const url = new URL(link, window.location.origin);\n if (origin !== url.origin) {\n window.open(link, '_blank', 'noopener,noreferrer');\n return true;\n }\n } catch (_) {\n // Do nothing if the url is invalid.\n return false;\n }\n\n return false;\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\nimport { registerRequestForConfirmation } from 'core-app/core/setup/globals/global-listeners/request-for-confirmation';\nimport { DeviceService } from 'core-app/core/browser/device.service';\nimport { scrollHeaderOnMobile } from 'core-app/core/setup/globals/global-listeners/top-menu-scroll';\nimport { setupToggableFieldsets } from 'core-app/core/setup/globals/global-listeners/toggable-fieldset';\nimport { installMenuLogic } from 'core-app/core/setup/globals/global-listeners/action-menu';\nimport { makeColorPreviews } from 'core-app/core/setup/globals/global-listeners/color-preview';\nimport { dangerZoneValidation } from 'core-app/core/setup/globals/global-listeners/danger-zone-validation';\nimport { setupServerResponse } from 'core-app/core/setup/globals/global-listeners/setup-server-response';\nimport { listenToSettingChanges } from 'core-app/core/setup/globals/global-listeners/settings';\nimport { detectOnboardingTour } from 'core-app/core/setup/globals/onboarding/onboarding_tour_trigger';\nimport {\n openExternalLinksInNewTab,\n performAnchorHijacking,\n} from './global-listeners/link-hijacking';\nimport { fixFragmentAnchors } from 'core-app/core/setup/globals/global-listeners/fix-fragment-anchors';\n\n/**\n * A set of listeners that are relevant on every page to set sensible defaults\n */\nexport function initializeGlobalListeners():void {\n document\n .documentElement\n .addEventListener('click', (evt:MouseEvent) => {\n const target = evt.target as HTMLElement;\n\n // Avoid defaulting clicks on elements already removed from DOM\n if (!document.contains(target)) {\n evt.preventDefault();\n return;\n }\n\n // Avoid handling clicks on anything other than a\n const linkElement = target.closest('a');\n if (!linkElement) {\n return;\n }\n\n // Avoid opening new tab when clicking links while editing in ckeditor\n if (linkElement.classList.contains('ck-link_selected')) {\n evt.preventDefault();\n return;\n }\n\n const callbacks = [\n openExternalLinksInNewTab,\n performAnchorHijacking,\n ];\n\n // eslint-disable-next-line no-restricted-syntax\n for (const fn of callbacks) {\n if (fn.call(linkElement, evt, linkElement)) {\n evt.preventDefault();\n break;\n }\n }\n\n // Prevent angular handling clicks on href=\"#...\" links from other libraries\n // (especially jquery-ui and its datepicker) from routing to /#\n performAnchorHijacking(evt, linkElement);\n });\n\n // Jump to the element given by location.hash, if present\n const { hash } = window.location;\n if (hash && hash.startsWith('#')) {\n try {\n const el = document.querySelector(hash);\n el && el.scrollIntoView();\n } catch (e) {\n // This is very likely an invalid selector such as a Google Analytics tag.\n // We can safely ignore this and just not scroll in this case.\n // Still log the error so one can confirm the reason there is no scrolling.\n console.log(`Could not scroll to given location hash: ${hash} ( ${e.message})`);\n }\n }\n\n // Global submitting hook,\n // necessary to avoid a data loss warning on beforeunload\n jQuery(document).on('submit', 'form', () => {\n window.OpenProject.pageIsSubmitted = true;\n });\n\n // Add to content if warnings displayed\n if (document.querySelector('.warning-bar--item')) {\n const content = document.querySelector('#content') as HTMLElement;\n if (content) {\n content.style.marginBottom = '100px';\n }\n }\n\n // Global beforeunload hook\n jQuery(window).on('beforeunload', (e:JQuery.TriggeredEvent) => {\n const event = e.originalEvent as BeforeUnloadEvent;\n if (window.OpenProject.pageWasEdited && !window.OpenProject.pageIsSubmitted) {\n // Cancel the event\n event.preventDefault();\n // Chrome requires returnValue to be set\n event.returnValue = I18n.t('js.work_packages.confirm_edit_cancel');\n }\n });\n\n // Disable global drag & drop handling, which results in the browser loading the image and losing the page\n jQuery(document.documentElement)\n .on('dragover drop', (evt:any) => {\n evt.preventDefault();\n return false;\n });\n\n // Allow forms with [request-for-confirmation]\n // to show the password confirmation dialog\n registerRequestForConfirmation(jQuery);\n\n const deviceService:DeviceService = new DeviceService();\n // Register scroll handler on mobile header\n if (deviceService.isMobile) {\n scrollHeaderOnMobile();\n }\n\n // Detect and trigger the onboarding tour\n // through a lazy loaded script\n detectOnboardingTour();\n\n //\n // Legacy scripts from app/assets that are not yet component based\n //\n\n // Toggable fieldsets\n setupToggableFieldsets();\n\n // Action menu logic\n jQuery('.project-actions, .toolbar-items').each((idx:number, menu:HTMLElement) => {\n installMenuLogic(jQuery(menu));\n });\n\n // Legacy settings listener\n listenToSettingChanges();\n\n // Color patches preview the color\n makeColorPreviews();\n\n // Danger zone input validation\n dangerZoneValidation();\n\n // Bootstrap legacy app code\n setupServerResponse();\n\n // Replace fragment\n fixFragmentAnchors();\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\n// Scroll header on mobile in and out when user scrolls the container\nexport function scrollHeaderOnMobile() {\n const headerHeight = 55;\n let prevScrollPos = window.scrollY;\n\n window.addEventListener('scroll', () => {\n // Condition needed for safari browser to avoid negative positions\n const currentScrollPos = window.scrollY < 0 ? 0 : window.scrollY;\n // Only if sidebar is not opened or search bar is opened\n if (!(jQuery('#main').hasClass('hidden-navigation'))\n || jQuery('.op-app-header').hasClass('op-app-header_search-open')\n || Math.abs(currentScrollPos - prevScrollPos) <= headerHeight) { // to avoid flickering at the end of the page\n return;\n }\n\n if (prevScrollPos !== undefined && currentScrollPos !== undefined && (prevScrollPos > currentScrollPos)) {\n // Slide top menu in or out of viewport and change viewport height\n jQuery('#wrapper').removeClass('_header-scrolled');\n } else {\n jQuery('#wrapper').addClass('_header-scrolled');\n }\n prevScrollPos = currentScrollPos;\n });\n}\n","/**\n * Move from legacy app/assets/javascripts/application.js.erb\n *\n * This should not be loaded globally and ideally refactored into components\n */\nexport function listenToSettingChanges() {\n jQuery('#settings_session_ttl_enabled').on('change', function () {\n jQuery('#settings_session_ttl_container').toggle(jQuery(this).is(':checked'));\n }).trigger('change');\n\n /** Sync SCM vendor select when enabled SCMs are changed */\n jQuery('[name=\"settings[enabled_scm][]\"]').change(function (this:HTMLInputElement) {\n const wasDisabled = !this.checked;\n const vendor = this.value;\n const select = jQuery('#settings_repositories_automatic_managed_vendor');\n const option = select.find(`option[value=\"${vendor}\"]`);\n\n // Skip non-manageable SCMs\n if (option.length === 0) {\n return;\n }\n\n option.prop('disabled', wasDisabled);\n if (wasDisabled && option.prop('selected')) {\n select.val('');\n }\n });\n\n /* Javascript for Settings::TextSettingComponent */\n const langSelectSwitchData = function (select:any) {\n const self = jQuery(select);\n const id:string = self.attr('id') || '';\n const settingName = id.replace('lang-for-', '');\n const newLang = self.val();\n const textArea = jQuery(`#settings-${settingName}`);\n const editor = textArea.siblings('ckeditor-augmented-textarea').data('editor');\n\n return {\n id, settingName, newLang, textArea, editor,\n };\n };\n\n // Upon focusing:\n // * store the current value of the editor in the hidden field for that lang.\n // Upon change:\n // * get the current value from the hidden field for that lang and set the editor text to that value.\n // * Set the name of the textarea to reflect the current lang so that the value stored in the hidden field\n // is overwritten.\n jQuery('.lang-select-switch')\n .focus(function () {\n const data = langSelectSwitchData(this);\n\n jQuery(`#${data.id}-${data.newLang}`).val(data.editor.getData());\n })\n .change(function () {\n const data = langSelectSwitchData(this);\n\n const storedValue = jQuery(`#${data.id}-${data.newLang}`).val();\n\n data.editor.setData(storedValue);\n data.textArea.attr('name', `settings[${data.settingName}][${data.newLang}]`);\n });\n /* end Javascript for Settings::TextSettingComponent */\n\n /** Toggle notification settings fields */\n jQuery('#email_delivery_method_switch').on('change', function () {\n const delivery_method = jQuery(this).val();\n jQuery('.email_delivery_method_settings').hide();\n jQuery(`#email_delivery_method_${delivery_method}`).show();\n }).trigger('change');\n\n jQuery('#settings_smtp_authentication').on('change', function () {\n const isNone = jQuery(this).val() === 'none';\n jQuery('#settings_smtp_user_name,#settings_smtp_password')\n .closest('.form--field')\n .toggle(!isNone);\n });\n\n /** Toggle repository checkout fieldsets required when option is disabled */\n jQuery('.settings-repositories--checkout-toggle').change(function (this:HTMLInputElement) {\n const wasChecked = this.checked;\n const fieldset = jQuery(this).closest('fieldset');\n\n fieldset\n .find('input,select')\n .filter(':not([type=checkbox])')\n .filter(':not([type=hidden])')\n .removeAttr('required') // Rails 4.0 still seems to use attribute\n .prop('required', wasChecked);\n });\n\n /** Toggle highlighted attributes visibility depending on if the highlighting mode 'inline' was selected */\n jQuery('.settings--highlighting-mode select').change(function () {\n const highlightingMode = jQuery(this).val();\n jQuery('.settings--highlighted-attributes').toggle(highlightingMode === 'inline');\n });\n\n jQuery('#tab-content-work_packages form').submit(() => {\n const availableAttributes = jQuery(\".settings--highlighted-attributes input[type='checkbox']\");\n const selectedAttributes = jQuery(\".settings--highlighted-attributes input[type='checkbox']:checked\");\n if (selectedAttributes.length === availableAttributes.length) {\n availableAttributes.prop('checked', false);\n }\n });\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\n/**\n * Moved from app/assets/javascripts/colors.js\n *\n * Make this a component instead of modifying it the next time\n * this needs changes\n */\nexport function makeColorPreviews() {\n jQuery('.color--preview').each(function () {\n const preview = jQuery(this);\n let input:any;\n const target = preview.data('target');\n\n if (target) {\n input = jQuery(target);\n } else {\n input = preview.next('input');\n }\n\n if (input.length === 0) {\n return;\n }\n\n const func = function () {\n let previewColor = '';\n\n if (input.val() && input.val().length > 0) {\n previewColor = input.val();\n } else if (input.attr('placeholder')\n && input.attr('placeholder').length > 0) {\n previewColor = input.attr('placeholder');\n }\n\n preview.css('background-color', previewColor);\n };\n\n input.keyup(func).change(func).focus(func);\n func();\n });\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n//\n// See COPYRIGHT and LICENSE files for more details.\n//++\n\n// Moved from app/assets/javascript/danger_zone_validation.js\n// Make the whole danger zone a component the next time this needs changes!\n\nexport function dangerZoneValidation() {\n // This will only work iff there is a single danger zone on the page\n const dangerZoneVerification = jQuery('.danger-zone--verification');\n const expectedValue = jQuery('.danger-zone--expected-value');\n\n // When no expected value is set up, do not disable button\n if (!expectedValue[0]) {\n return;\n }\n\n const expectedText = expectedValue.text();\n dangerZoneVerification.find('input').on('input', () => {\n const actualValue = dangerZoneVerification.find('input').val() as string;\n if (expectedText.toLowerCase() === actualValue.toLowerCase()) {\n dangerZoneVerification.find('button').prop('disabled', false);\n } else {\n dangerZoneVerification.find('button').prop('disabled', true);\n }\n });\n}\n","/**\n * Due to having a tag, links that only contains anchors break as they\n * reference the application base url + the anchor instead of the current page.\n */\nexport function fixFragmentAnchors():void {\n // Get current document URL without any existing fragments\n const baseUrl = document.location.href.replace(/#.*$/, '');\n\n Array\n .from(document.getElementsByTagName('A'))\n .forEach((el:HTMLAnchorElement) => {\n const href = el.getAttribute('href') as string;\n\n if (href && href !== '#' && href.startsWith('#')) {\n el.setAttribute('href', baseUrl + href);\n }\n });\n}\n","import { OpenProjectModule } from 'core-app/app.module';\nimport { enableProdMode } from '@angular/core';\nimport * as jQuery from 'jquery';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\nimport { initializeLocale } from 'core-app/core/setup/init-locale';\nimport { environment } from './environments/environment';\nimport { configureErrorReporter } from 'core-app/core/errors/configure-reporter';\nimport { initializeGlobalListeners } from 'core-app/core/setup/globals/global-listeners';\n\n(window as any).global = window;\n\n// Ensure we set the correct dynamic frontend path\n// based on the RAILS_RELATIVE_URL_ROOT setting\n// https://webpack.js.org/guides/public-path/\nconst ASSET_BASE_PATH = '/assets/frontend/';\n\n// Sets the relative base path\nwindow.appBasePath = jQuery('meta[name=app_base_path]').attr('content') || '';\n\n// Get the asset host, if any\nconst initializer = document.querySelector('meta[name=\"openproject_initializer\"]');\nconst ASSET_HOST = initializer?.dataset.assetHost ? `//${initializer.dataset.assetHost}` : '';\n\n// Ensure to set the asset base for dynamic code loading\n// https://webpack.js.org/guides/public-path/\n__webpack_public_path__ = ASSET_HOST + window.appBasePath + ASSET_BASE_PATH;\n\nwindow.ErrorReporter = configureErrorReporter();\n\nrequire('core-app/core/setup/init-vendors');\nrequire('core-app/core/setup/init-globals');\nrequire('stimulus/setup');\nrequire('turbo/setup');\n\nif (environment.production) {\n enableProdMode();\n}\n\n// Import the correct locale early on\nvoid initializeLocale()\n .then(() => {\n jQuery(() => {\n // Now that DOM is loaded, also run the global listeners\n initializeGlobalListeners();\n\n // Due to the behaviour of the Edge browser we need to wait for 'DOM ready'\n void platformBrowserDynamic()\n .bootstrapModule(OpenProjectModule)\n .then(() => {\n jQuery('body').addClass('__ng2-bootstrap-has-run');\n });\n });\n });\n","import { ErrorReporterBase } from 'core-app/core/errors/error-reporter-base';\nimport { AppsignalReporter } from 'core-app/core/errors/appsignal/appsignal-reporter';\nimport { LocalReporter } from 'core-app/core/errors/local/local-reporter';\n\nexport function configureErrorReporter():ErrorReporterBase {\n const appsignalElement = document.querySelector('meta[name=openproject_appsignal]') as HTMLElement;\n if (appsignalElement !== null) {\n return new AppsignalReporter();\n }\n\n return new LocalReporter();\n}\n","// -- copyright\n// OpenProject is an open source project management software.\n// Copyright (C) 2012-2023 the OpenProject GmbH\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License version 3.\n//\n// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n// Copyright (C) 2006-2013 Jean-Philippe Lang\n// Copyright (C) 2010-2013 the ChiliProject Team\n//\n// This program is free software; you can redistribute it and/or\n// modify it under the terms of the GNU General Public License\n// as published by the Free Software Foundation; either version 2\n// of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, 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 * as i18njs from 'i18n-js';\n\nexport function initializeLocale() {\n const meta = document.querySelector('meta[name=openproject_initializer]');\n const userLocale = meta?.dataset.locale || 'en';\n const defaultLocale = meta?.dataset.defaultlocale || 'en';\n const instanceLocale = meta?.dataset.instancelocale || 'en';\n const firstDayOfWeek = parseInt(meta?.dataset.firstdayofweek || '', 10); // properties of meta.dataset are exposed in lowercase\n const firstWeekOfYear = parseInt(meta?.dataset.firstweekofyear || '', 10); // properties of meta.dataset are exposed in lowercase\n\n window.I18n = new i18njs.I18n();\n I18n.locale = userLocale;\n I18n.defaultLocale = defaultLocale;\n\n if (!Number.isNaN(firstDayOfWeek) && !Number.isNaN(firstWeekOfYear)) {\n // ensure locale like \"zh-CN\" falls back to \"zh-cn\"\n moment.locale(userLocale);\n moment.updateLocale(moment.locale(), {\n week: {\n dow: firstDayOfWeek,\n doy: 7 + firstDayOfWeek - firstWeekOfYear,\n },\n });\n }\n\n // Override the default pluralization function to allow\n // \"other\" to be used as a fallback for \"one\" in languages where one is not set\n // (japanese, for example)\n I18n.pluralization.register(\n 'default',\n (_i18n:i18njs.I18n, count:number) => {\n switch (count) {\n case 0:\n return ['zero', 'other'];\n case 1:\n return ['one', 'other'];\n default:\n return ['other'];\n }\n },\n );\n\n const localeImports = _\n .chain([userLocale, instanceLocale])\n .uniq()\n .map(\n (locale) => import(/* webpackChunkName: \"locale\" */ `../../../locales/${locale}.json`)\n .then((imported:{ default:object }) => {\n I18n.store(imported.default);\n }),\n )\n .value();\n return Promise.all(localeImports);\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { MainMenuNavigationService } from 'core-app/core/main-menu/main-menu-navigation.service';\n\nexport default class MainMenuController extends Controller {\n static targets = [\n 'sidebar',\n 'root',\n 'item',\n ];\n\n declare readonly sidebarTarget:HTMLElement;\n declare readonly rootTarget:HTMLElement;\n declare readonly itemTargets:HTMLElement[];\n\n initialize() {\n if (this.rootTarget.classList.contains('closed')) {\n this.sidebarTarget.classList.add('-hidden');\n }\n\n const active = this.getActiveMenuName();\n if (active) {\n this.markActive(active);\n }\n }\n\n descend(event:MouseEvent) {\n const target = event.target as HTMLElement;\n this.sidebarTarget.classList.add('-hidden');\n const targetLi = target.closest('li') as HTMLElement;\n\n this.toggleMenuState(this.rootTarget);\n this.toggleMenuState(targetLi);\n\n targetLi.querySelector('li > a, .tree-menu--title')?.focus();\n\n this.markActive(targetLi.dataset.name as string);\n }\n\n ascend(event:MouseEvent) {\n event.preventDefault();\n const target = event.target as HTMLElement;\n const parent = target.closest('li') as HTMLElement;\n\n this.toggleMenuState(parent);\n this.toggleMenuState(this.rootTarget);\n\n parent.querySelector('.toggler')?.focus();\n\n this.sidebarTarget.classList.remove('-hidden');\n }\n\n private getActiveMenuName():string|undefined {\n const activeItem = this.itemTargets.find((el) => el.classList.contains('open'));\n const activeRoot = this.rootTarget.querySelector('li');\n return (activeItem || activeRoot)?.dataset.name;\n }\n\n private markActive(active:string):void {\n void window.OpenProject.getPluginContext()\n .then((pluginContext) => pluginContext.injector.get(MainMenuNavigationService))\n .then((service) => service.navigationEvents$.next(active));\n }\n\n private toggleMenuState(item:HTMLElement) {\n item.classList.toggle('closed');\n item.classList.toggle('open');\n }\n}\n","import { ControllerConstructor } from '@hotwired/stimulus/dist/types/core/controller';\nimport { ApplicationController } from 'stimulus-use';\n\nexport class OpApplicationController extends ApplicationController {\n static targets = ['dynamic'];\n\n private loaded = new Set();\n\n dynamicTargetConnected(target:HTMLElement) {\n const controllers = (target.dataset.controller as string).split(' ');\n\n controllers.forEach((controller) => {\n const path = this.derivePath(controller);\n\n if (!this.loaded.has(controller)) {\n this.loaded.add(controller);\n void import(/* webpackChunkName: \"[request]\" */`./dynamic/${path}.controller`)\n .then((imported:{ default:ControllerConstructor }) => this.application.register(controller, imported.default))\n .catch((err:unknown) => {\n console.error('Failed to load dyanmic controller chunk %O: %O', controller, err);\n });\n }\n });\n }\n\n /**\n * Derive dynamic path from controller name.\n *\n * Stimlus conventions allow subdirectories to be used by double dashes.\n * We convert these to slashes for the dynamic import.\n *\n * https://stimulus.hotwired.dev/handbook/installing#controller-filenames-map-to-identifiers\n * @param controller\n * @private\n */\n private derivePath(controller:string):string {\n return controller.replace(/--/g, '/');\n }\n}\n","import { ApplicationController } from 'stimulus-use';\n\nexport default class OpDisableWhenCheckedController extends ApplicationController {\n static targets = ['cause', 'effect'];\n\n static values = {\n reversed: Boolean,\n };\n\n declare reversedValue:boolean;\n\n declare readonly hasReversedValue:boolean;\n\n declare readonly effectTargets:HTMLInputElement[];\n\n causeTargetConnected(target:HTMLElement) {\n target.addEventListener('change', this.toggleDisabled.bind(this));\n }\n\n causeTargetDisconnected(target:HTMLElement) {\n target.removeEventListener('change', this.toggleDisabled.bind(this));\n }\n\n private toggleDisabled(evt:InputEvent):void {\n const checked = (evt.target as HTMLInputElement).checked;\n this.effectTargets.forEach((el) => {\n el.disabled = (this.hasReversedValue && this.reversedValue) ? !checked : checked;\n });\n }\n}\n","import { ApplicationController } from 'stimulus-use';\n\nexport default class PrintController extends ApplicationController {\n triggerPrint(evt:MouseEvent) {\n evt.preventDefault();\n window.print();\n }\n}\n","/*\n * -- copyright\n * OpenProject is an open source project management software.\n * Copyright (C) 2023 the OpenProject GmbH\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License version 3.\n *\n * OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:\n * Copyright (C) 2006-2013 Jean-Philippe Lang\n * Copyright (C) 2010-2013 the ChiliProject Team\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; either version 2\n * of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * 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\nimport { ApplicationController } from 'stimulus-use';\nimport { renderStreamMessage } from '@hotwired/turbo';\n\nexport default class RefreshOnFormChangesController extends ApplicationController {\n static targets = [\n 'form',\n ];\n\n static values = {\n refreshUrl: String,\n turboStreamUrl: String,\n };\n\n declare readonly formTarget:HTMLFormElement;\n\n declare refreshUrlValue:string;\n declare turboStreamUrlValue:string;\n\n triggerReload():void {\n window.location.href = `${this.refreshUrlValue}?${this.getSerializedFormData()}`;\n }\n\n async triggerTurboStream():Promise {\n await fetch(`${this.turboStreamUrlValue}?${this.getSerializedFormData()}`, {\n headers: {\n Accept: 'text/vnd.turbo-stream.html',\n },\n }).then((r) => r.text())\n .then((html) => renderStreamMessage(html));\n }\n\n private getSerializedFormData():string {\n // without the cast to undefined, the URLSearchParams constructor will\n // not accept the FormData object.\n const formData = new FormData(this.formTarget) as unknown as undefined;\n return new URLSearchParams(formData).toString();\n }\n}\n","import { Application } from '@hotwired/stimulus';\nimport { environment } from '../environments/environment';\nimport { OpApplicationController } from './controllers/op-application.controller';\nimport MainMenuController from './controllers/dynamic/menus/main.controller';\nimport OpDisableWhenCheckedController from './controllers/disable-when-checked.controller';\nimport PrintController from './controllers/print.controller';\nimport RefreshOnFormChangesController from './controllers/refresh-on-form-changes.controller';\n\ndeclare global {\n interface Window {\n Stimulus:Application;\n }\n}\n\nconst instance = Application.start();\nwindow.Stimulus = instance;\n\ninstance.debug = !environment.production;\ninstance.handleError = (error, message, detail) => {\n console.warn(error, message, detail);\n};\n\ninstance.register('application', OpApplicationController);\ninstance.register('menus--main', MainMenuController);\n\ninstance.register('disable-when-checked', OpDisableWhenCheckedController);\ninstance.register('print', PrintController);\ninstance.register('refresh-on-form-changes', RefreshOnFormChangesController);\n","import * as Turbo from '@hotwired/turbo';\nimport { ModalDialogElement } from '@openproject/primer-view-components/app/components/primer/alpha/modal_dialog';\n\n// Disable default turbo-drive for now as we don't need it for now AND it breaks angular routing\nTurbo.session.drive = false;\n// Start turbo\nTurbo.start();\n\n// Error handling when \"Content missing\" returned\ndocument.addEventListener('turbo:frame-missing', (event:CustomEvent) => {\n const { detail: { response, visit } } = event as { detail:{ response:Response, visit:(url:string) => void } };\n event.preventDefault();\n visit(response.url);\n});\n\n// Close the primer dialog when the form inside has been submitted with a success response\n// It is necessary to close the primer dialog using the `close()` method, otherwise\n// it will leave an overflow:hidden attribute on the body, which prevents scrolling on the page.\ndocument.addEventListener('turbo:submit-end', (event:CustomEvent) => {\n const { detail: { success }, target } = event as { detail:{ success:boolean }, target:EventTarget };\n\n if (success && target instanceof HTMLFormElement) {\n const dialog = target.closest('modal-dialog') as ModalDialogElement;\n dialog && dialog.close(true);\n }\n});\n","var map = {\n\t\"./apl/apl.js\": [\n\t\t84785,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_apl_apl_js\"\n\t],\n\t\"./asciiarmor/asciiarmor.js\": [\n\t\t63074,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_asciiarmor_asciiarmor_js\"\n\t],\n\t\"./asn.1/asn.1.js\": [\n\t\t34558,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_asn_1_asn_1_js\"\n\t],\n\t\"./asterisk/asterisk.js\": [\n\t\t6361,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_asterisk_asterisk_js\"\n\t],\n\t\"./brainfuck/brainfuck.js\": [\n\t\t84202,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_brainfuck_brainfuck_js\"\n\t],\n\t\"./clike/clike.js\": [\n\t\t53283,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_clike_clike_js\"\n\t],\n\t\"./clojure/clojure.js\": [\n\t\t81484,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_clojure_clojure_js\"\n\t],\n\t\"./cmake/cmake.js\": [\n\t\t31355,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_cmake_cmake_js\"\n\t],\n\t\"./cobol/cobol.js\": [\n\t\t80880,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_cobol_cobol_js\"\n\t],\n\t\"./coffeescript/coffeescript.js\": [\n\t\t60653,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\"\n\t],\n\t\"./commonlisp/commonlisp.js\": [\n\t\t16032,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_commonlisp_commonlisp_js\"\n\t],\n\t\"./crystal/crystal.js\": [\n\t\t6379,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_crystal_crystal_js\"\n\t],\n\t\"./css/css.js\": [\n\t\t92863,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_css_css_js\"\n\t],\n\t\"./cypher/cypher.js\": [\n\t\t65977,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_cypher_cypher_js\"\n\t],\n\t\"./d/d.js\": [\n\t\t30085,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_d_d_js\"\n\t],\n\t\"./dart/dart.js\": [\n\t\t70858,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_clike_clike_js\",\n\t\t\"node_modules_codemirror_mode_dart_dart_js\"\n\t],\n\t\"./diff/diff.js\": [\n\t\t47861,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_diff_diff_js\"\n\t],\n\t\"./django/django.js\": [\n\t\t17096,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_javascript_javascript_js\",\n\t\t\"default-node_modules_codemirror_mode_css_css_js\",\n\t\t\"default-node_modules_codemirror_mode_htmlmixed_htmlmixed_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_django_django_js\"\n\t],\n\t\"./dockerfile/dockerfile.js\": [\n\t\t23693,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_dockerfile_dockerfile_js\"\n\t],\n\t\"./dtd/dtd.js\": [\n\t\t78418,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_dtd_dtd_js\"\n\t],\n\t\"./dylan/dylan.js\": [\n\t\t17183,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_dylan_dylan_js\"\n\t],\n\t\"./ebnf/ebnf.js\": [\n\t\t3402,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_ebnf_ebnf_js\"\n\t],\n\t\"./ecl/ecl.js\": [\n\t\t87748,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_ecl_ecl_js\"\n\t],\n\t\"./eiffel/eiffel.js\": [\n\t\t19841,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_eiffel_eiffel_js\"\n\t],\n\t\"./elm/elm.js\": [\n\t\t52570,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_elm_elm_js\"\n\t],\n\t\"./erlang/erlang.js\": [\n\t\t88230,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_erlang_erlang_js\"\n\t],\n\t\"./factor/factor.js\": [\n\t\t22216,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_factor_factor_js\"\n\t],\n\t\"./fcl/fcl.js\": [\n\t\t8335,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_fcl_fcl_js\"\n\t],\n\t\"./forth/forth.js\": [\n\t\t38957,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_forth_forth_js\"\n\t],\n\t\"./fortran/fortran.js\": [\n\t\t11528,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_fortran_fortran_js\"\n\t],\n\t\"./gas/gas.js\": [\n\t\t83170,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_gas_gas_js\"\n\t],\n\t\"./gfm/gfm.js\": [\n\t\t35565,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_markdown_markdown_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_gfm_gfm_js\"\n\t],\n\t\"./gherkin/gherkin.js\": [\n\t\t37837,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_gherkin_gherkin_js\"\n\t],\n\t\"./go/go.js\": [\n\t\t58237,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_go_go_js\"\n\t],\n\t\"./groovy/groovy.js\": [\n\t\t75463,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_groovy_groovy_js\"\n\t],\n\t\"./haml/haml.js\": [\n\t\t29484,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_javascript_javascript_js\",\n\t\t\"default-node_modules_codemirror_mode_css_css_js\",\n\t\t\"default-node_modules_codemirror_mode_htmlmixed_htmlmixed_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_haml_haml_js\"\n\t],\n\t\"./handlebars/handlebars.js\": [\n\t\t82939,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\"\n\t],\n\t\"./haskell-literate/haskell-literate.js\": [\n\t\t84278,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_haskell-literate_haskell-literate_js\"\n\t],\n\t\"./haskell/haskell.js\": [\n\t\t46745,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\"\n\t],\n\t\"./haxe/haxe.js\": [\n\t\t82474,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_haxe_haxe_js\"\n\t],\n\t\"./htmlembedded/htmlembedded.js\": [\n\t\t96424,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_javascript_javascript_js\",\n\t\t\"default-node_modules_codemirror_mode_css_css_js\",\n\t\t\"default-node_modules_codemirror_mode_htmlmixed_htmlmixed_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_htmlembedded_htmlembedded_js\"\n\t],\n\t\"./htmlmixed/htmlmixed.js\": [\n\t\t34506,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_javascript_javascript_js\",\n\t\t\"default-node_modules_codemirror_mode_css_css_js\",\n\t\t\"default-node_modules_codemirror_mode_htmlmixed_htmlmixed_js\"\n\t],\n\t\"./http/http.js\": [\n\t\t43633,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_http_http_js\"\n\t],\n\t\"./idl/idl.js\": [\n\t\t72531,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_idl_idl_js\"\n\t],\n\t\"./javascript/javascript.js\": [\n\t\t82219,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_javascript_javascript_js\"\n\t],\n\t\"./jinja2/jinja2.js\": [\n\t\t57620,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_jinja2_jinja2_js\"\n\t],\n\t\"./jsx/jsx.js\": [\n\t\t1461,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_javascript_javascript_js\",\n\t\t\"node_modules_codemirror_mode_jsx_jsx_js\"\n\t],\n\t\"./julia/julia.js\": [\n\t\t48049,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_julia_julia_js\"\n\t],\n\t\"./livescript/livescript.js\": [\n\t\t97717,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_livescript_livescript_js\"\n\t],\n\t\"./lua/lua.js\": [\n\t\t44432,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_lua_lua_js\"\n\t],\n\t\"./markdown/markdown.js\": [\n\t\t10608,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_markdown_markdown_js\"\n\t],\n\t\"./mathematica/mathematica.js\": [\n\t\t87584,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_mathematica_mathematica_js\"\n\t],\n\t\"./mbox/mbox.js\": [\n\t\t13003,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_mbox_mbox_js\"\n\t],\n\t\"./mirc/mirc.js\": [\n\t\t40935,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_mirc_mirc_js\"\n\t],\n\t\"./mllike/mllike.js\": [\n\t\t54636,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_mllike_mllike_js\"\n\t],\n\t\"./modelica/modelica.js\": [\n\t\t75635,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_modelica_modelica_js\"\n\t],\n\t\"./mscgen/mscgen.js\": [\n\t\t41952,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_mscgen_mscgen_js\"\n\t],\n\t\"./mumps/mumps.js\": [\n\t\t527,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_mumps_mumps_js\"\n\t],\n\t\"./nginx/nginx.js\": [\n\t\t22833,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_nginx_nginx_js\"\n\t],\n\t\"./nsis/nsis.js\": [\n\t\t39927,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_nsis_nsis_js\"\n\t],\n\t\"./ntriples/ntriples.js\": [\n\t\t31585,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_ntriples_ntriples_js\"\n\t],\n\t\"./octave/octave.js\": [\n\t\t82306,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_octave_octave_js\"\n\t],\n\t\"./oz/oz.js\": [\n\t\t86365,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_oz_oz_js\"\n\t],\n\t\"./pascal/pascal.js\": [\n\t\t42506,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_pascal_pascal_js\"\n\t],\n\t\"./pegjs/pegjs.js\": [\n\t\t41288,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_javascript_javascript_js\",\n\t\t\"node_modules_codemirror_mode_pegjs_pegjs_js\"\n\t],\n\t\"./perl/perl.js\": [\n\t\t34197,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_perl_perl_js\"\n\t],\n\t\"./php/php.js\": [\n\t\t20637,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_javascript_javascript_js\",\n\t\t\"default-node_modules_codemirror_mode_css_css_js\",\n\t\t\"default-node_modules_codemirror_mode_htmlmixed_htmlmixed_js\",\n\t\t\"default-node_modules_codemirror_mode_clike_clike_js\",\n\t\t\"node_modules_codemirror_mode_php_php_js\"\n\t],\n\t\"./pig/pig.js\": [\n\t\t62091,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_pig_pig_js\"\n\t],\n\t\"./powershell/powershell.js\": [\n\t\t195,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_powershell_powershell_js\"\n\t],\n\t\"./properties/properties.js\": [\n\t\t55219,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_properties_properties_js\"\n\t],\n\t\"./protobuf/protobuf.js\": [\n\t\t58442,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_protobuf_protobuf_js\"\n\t],\n\t\"./pug/pug.js\": [\n\t\t37482,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_javascript_javascript_js\",\n\t\t\"default-node_modules_codemirror_mode_css_css_js\",\n\t\t\"default-node_modules_codemirror_mode_htmlmixed_htmlmixed_js\",\n\t\t\"common\"\n\t],\n\t\"./puppet/puppet.js\": [\n\t\t9529,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_puppet_puppet_js\"\n\t],\n\t\"./python/python.js\": [\n\t\t42473,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\"\n\t],\n\t\"./q/q.js\": [\n\t\t34192,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_q_q_js\"\n\t],\n\t\"./r/r.js\": [\n\t\t18112,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_r_r_js\"\n\t],\n\t\"./rpm/rpm.js\": [\n\t\t55336,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_rpm_rpm_js\"\n\t],\n\t\"./rst/rst.js\": [\n\t\t99715,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_rst_rst_js\"\n\t],\n\t\"./ruby/ruby.js\": [\n\t\t40306,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\"\n\t],\n\t\"./rust/rust.js\": [\n\t\t35365,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_rust_rust_js\"\n\t],\n\t\"./sas/sas.js\": [\n\t\t21936,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_sas_sas_js\"\n\t],\n\t\"./sass/sass.js\": [\n\t\t36821,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_css_css_js\",\n\t\t\"common\"\n\t],\n\t\"./scheme/scheme.js\": [\n\t\t35775,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_scheme_scheme_js\"\n\t],\n\t\"./shell/shell.js\": [\n\t\t93982,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_shell_shell_js\"\n\t],\n\t\"./sieve/sieve.js\": [\n\t\t35075,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_sieve_sieve_js\"\n\t],\n\t\"./slim/slim.js\": [\n\t\t910,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_javascript_javascript_js\",\n\t\t\"default-node_modules_codemirror_mode_css_css_js\",\n\t\t\"default-node_modules_codemirror_mode_htmlmixed_htmlmixed_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_slim_slim_js\"\n\t],\n\t\"./smalltalk/smalltalk.js\": [\n\t\t59321,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_smalltalk_smalltalk_js\"\n\t],\n\t\"./smarty/smarty.js\": [\n\t\t98099,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_smarty_smarty_js\"\n\t],\n\t\"./solr/solr.js\": [\n\t\t36824,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_solr_solr_js\"\n\t],\n\t\"./soy/soy.js\": [\n\t\t10464,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_javascript_javascript_js\",\n\t\t\"default-node_modules_codemirror_mode_css_css_js\",\n\t\t\"default-node_modules_codemirror_mode_htmlmixed_htmlmixed_js\",\n\t\t\"node_modules_codemirror_mode_soy_soy_js\"\n\t],\n\t\"./sparql/sparql.js\": [\n\t\t11082,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_sparql_sparql_js\"\n\t],\n\t\"./spreadsheet/spreadsheet.js\": [\n\t\t65676,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_spreadsheet_spreadsheet_js\"\n\t],\n\t\"./sql/sql.js\": [\n\t\t89347,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_sql_sql_js\"\n\t],\n\t\"./stex/stex.js\": [\n\t\t79069,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\"\n\t],\n\t\"./stylus/stylus.js\": [\n\t\t72385,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_stylus_stylus_js\"\n\t],\n\t\"./swift/swift.js\": [\n\t\t1028,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_swift_swift_js\"\n\t],\n\t\"./tcl/tcl.js\": [\n\t\t57771,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_tcl_tcl_js\"\n\t],\n\t\"./textile/textile.js\": [\n\t\t37965,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_textile_textile_js\"\n\t],\n\t\"./tiddlywiki/tiddlywiki.js\": [\n\t\t35894,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_tiddlywiki_tiddlywiki_js\"\n\t],\n\t\"./tiki/tiki.js\": [\n\t\t7682,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_tiki_tiki_js\"\n\t],\n\t\"./toml/toml.js\": [\n\t\t4296,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_toml_toml_js\"\n\t],\n\t\"./tornado/tornado.js\": [\n\t\t87695,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_javascript_javascript_js\",\n\t\t\"default-node_modules_codemirror_mode_css_css_js\",\n\t\t\"default-node_modules_codemirror_mode_htmlmixed_htmlmixed_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_tornado_tornado_js\"\n\t],\n\t\"./troff/troff.js\": [\n\t\t57836,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_troff_troff_js\"\n\t],\n\t\"./ttcn-cfg/ttcn-cfg.js\": [\n\t\t20328,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_ttcn-cfg_ttcn-cfg_js\"\n\t],\n\t\"./ttcn/ttcn.js\": [\n\t\t37598,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_ttcn_ttcn_js\"\n\t],\n\t\"./turtle/turtle.js\": [\n\t\t11665,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_turtle_turtle_js\"\n\t],\n\t\"./twig/twig.js\": [\n\t\t24139,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_twig_twig_js\"\n\t],\n\t\"./vb/vb.js\": [\n\t\t59312,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_vb_vb_js\"\n\t],\n\t\"./vbscript/vbscript.js\": [\n\t\t16802,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_vbscript_vbscript_js\"\n\t],\n\t\"./velocity/velocity.js\": [\n\t\t82200,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_velocity_velocity_js\"\n\t],\n\t\"./verilog/verilog.js\": [\n\t\t22646,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_verilog_verilog_js\"\n\t],\n\t\"./vhdl/vhdl.js\": [\n\t\t40255,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_vhdl_vhdl_js\"\n\t],\n\t\"./vue/vue.js\": [\n\t\t59487,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"default-node_modules_codemirror_mode_javascript_javascript_js\",\n\t\t\"default-node_modules_codemirror_mode_css_css_js\",\n\t\t\"default-node_modules_codemirror_mode_htmlmixed_htmlmixed_js\",\n\t\t\"default-node_modules_codemirror_mode_stylus_stylus_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_vue_vue_js\"\n\t],\n\t\"./wast/wast.js\": [\n\t\t42732,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_wast_wast_js\"\n\t],\n\t\"./webidl/webidl.js\": [\n\t\t36435,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_webidl_webidl_js\"\n\t],\n\t\"./xml/xml.js\": [\n\t\t14900,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_xml_xml_js\"\n\t],\n\t\"./xquery/xquery.js\": [\n\t\t49339,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_xquery_xquery_js\"\n\t],\n\t\"./yacas/yacas.js\": [\n\t\t17075,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_yacas_yacas_js\"\n\t],\n\t\"./yaml-frontmatter/yaml-frontmatter.js\": [\n\t\t73222,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\",\n\t\t\"node_modules_codemirror_mode_yaml-frontmatter_yaml-frontmatter_js\"\n\t],\n\t\"./yaml/yaml.js\": [\n\t\t93546,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"common\"\n\t],\n\t\"./z80/z80.js\": [\n\t\t11568,\n\t\t\"default-node_modules_codemirror_lib_codemirror_js\",\n\t\t\"node_modules_codemirror_mode_z80_z80_js\"\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn Promise.all(ids.slice(1).map(__webpack_require__.e)).then(() => {\n\t\treturn __webpack_require__.t(id, 7 | 16);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = 30341;\nmodule.exports = webpackAsyncContext;","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = () => ([]);\nwebpackEmptyContext.resolve = webpackEmptyContext;\nwebpackEmptyContext.id = 33769;\nmodule.exports = webpackEmptyContext;","var map = {\n\t\"./af\": 35528,\n\t\"./af.js\": 35528,\n\t\"./ar\": 1036,\n\t\"./ar-dz\": 17579,\n\t\"./ar-dz.js\": 17579,\n\t\"./ar-kw\": 69588,\n\t\"./ar-kw.js\": 69588,\n\t\"./ar-ly\": 11650,\n\t\"./ar-ly.js\": 11650,\n\t\"./ar-ma\": 93258,\n\t\"./ar-ma.js\": 93258,\n\t\"./ar-sa\": 54085,\n\t\"./ar-sa.js\": 54085,\n\t\"./ar-tn\": 90287,\n\t\"./ar-tn.js\": 90287,\n\t\"./ar.js\": 1036,\n\t\"./az\": 89757,\n\t\"./az.js\": 89757,\n\t\"./be\": 59620,\n\t\"./be.js\": 59620,\n\t\"./bg\": 31139,\n\t\"./bg.js\": 31139,\n\t\"./bm\": 4042,\n\t\"./bm.js\": 4042,\n\t\"./bn\": 19641,\n\t\"./bn-bd\": 19126,\n\t\"./bn-bd.js\": 19126,\n\t\"./bn.js\": 19641,\n\t\"./bo\": 494,\n\t\"./bo.js\": 494,\n\t\"./br\": 20934,\n\t\"./br.js\": 20934,\n\t\"./bs\": 26274,\n\t\"./bs.js\": 26274,\n\t\"./ca\": 45831,\n\t\"./ca.js\": 45831,\n\t\"./cs\": 92354,\n\t\"./cs.js\": 92354,\n\t\"./cv\": 79692,\n\t\"./cv.js\": 79692,\n\t\"./cy\": 58774,\n\t\"./cy.js\": 58774,\n\t\"./da\": 38955,\n\t\"./da.js\": 38955,\n\t\"./de\": 21557,\n\t\"./de-at\": 24954,\n\t\"./de-at.js\": 24954,\n\t\"./de-ch\": 81881,\n\t\"./de-ch.js\": 81881,\n\t\"./de.js\": 21557,\n\t\"./dv\": 16475,\n\t\"./dv.js\": 16475,\n\t\"./el\": 38877,\n\t\"./el.js\": 38877,\n\t\"./en-au\": 70454,\n\t\"./en-au.js\": 70454,\n\t\"./en-ca\": 67356,\n\t\"./en-ca.js\": 67356,\n\t\"./en-gb\": 10456,\n\t\"./en-gb.js\": 10456,\n\t\"./en-ie\": 28789,\n\t\"./en-ie.js\": 28789,\n\t\"./en-il\": 85471,\n\t\"./en-il.js\": 85471,\n\t\"./en-in\": 39664,\n\t\"./en-in.js\": 39664,\n\t\"./en-nz\": 97672,\n\t\"./en-nz.js\": 97672,\n\t\"./en-sg\": 80805,\n\t\"./en-sg.js\": 80805,\n\t\"./eo\": 87390,\n\t\"./eo.js\": 87390,\n\t\"./es\": 1564,\n\t\"./es-do\": 51473,\n\t\"./es-do.js\": 51473,\n\t\"./es-mx\": 92089,\n\t\"./es-mx.js\": 92089,\n\t\"./es-us\": 84156,\n\t\"./es-us.js\": 84156,\n\t\"./es.js\": 1564,\n\t\"./et\": 6513,\n\t\"./et.js\": 6513,\n\t\"./eu\": 7856,\n\t\"./eu.js\": 7856,\n\t\"./fa\": 2378,\n\t\"./fa.js\": 2378,\n\t\"./fi\": 22687,\n\t\"./fi.js\": 22687,\n\t\"./fil\": 80032,\n\t\"./fil.js\": 80032,\n\t\"./fo\": 46845,\n\t\"./fo.js\": 46845,\n\t\"./fr\": 8875,\n\t\"./fr-ca\": 56425,\n\t\"./fr-ca.js\": 56425,\n\t\"./fr-ch\": 41746,\n\t\"./fr-ch.js\": 41746,\n\t\"./fr.js\": 8875,\n\t\"./fy\": 67037,\n\t\"./fy.js\": 67037,\n\t\"./ga\": 11217,\n\t\"./ga.js\": 11217,\n\t\"./gd\": 37010,\n\t\"./gd.js\": 37010,\n\t\"./gl\": 51931,\n\t\"./gl.js\": 51931,\n\t\"./gom-deva\": 64488,\n\t\"./gom-deva.js\": 64488,\n\t\"./gom-latn\": 8032,\n\t\"./gom-latn.js\": 8032,\n\t\"./gu\": 34984,\n\t\"./gu.js\": 34984,\n\t\"./he\": 69090,\n\t\"./he.js\": 69090,\n\t\"./hi\": 42085,\n\t\"./hi.js\": 42085,\n\t\"./hr\": 38787,\n\t\"./hr.js\": 38787,\n\t\"./hu\": 2901,\n\t\"./hu.js\": 2901,\n\t\"./hy-am\": 59819,\n\t\"./hy-am.js\": 59819,\n\t\"./id\": 44074,\n\t\"./id.js\": 44074,\n\t\"./is\": 70715,\n\t\"./is.js\": 70715,\n\t\"./it\": 31746,\n\t\"./it-ch\": 77040,\n\t\"./it-ch.js\": 77040,\n\t\"./it.js\": 31746,\n\t\"./ja\": 3180,\n\t\"./ja.js\": 3180,\n\t\"./jv\": 34346,\n\t\"./jv.js\": 34346,\n\t\"./ka\": 65538,\n\t\"./ka.js\": 65538,\n\t\"./kk\": 79772,\n\t\"./kk.js\": 79772,\n\t\"./km\": 87905,\n\t\"./km.js\": 87905,\n\t\"./kn\": 79125,\n\t\"./kn.js\": 79125,\n\t\"./ko\": 69140,\n\t\"./ko.js\": 69140,\n\t\"./ku\": 2354,\n\t\"./ku.js\": 2354,\n\t\"./ky\": 63768,\n\t\"./ky.js\": 63768,\n\t\"./lb\": 14016,\n\t\"./lb.js\": 14016,\n\t\"./lo\": 83169,\n\t\"./lo.js\": 83169,\n\t\"./lt\": 62353,\n\t\"./lt.js\": 62353,\n\t\"./lv\": 83243,\n\t\"./lv.js\": 83243,\n\t\"./me\": 52338,\n\t\"./me.js\": 52338,\n\t\"./mi\": 35555,\n\t\"./mi.js\": 35555,\n\t\"./mk\": 85794,\n\t\"./mk.js\": 85794,\n\t\"./ml\": 53151,\n\t\"./ml.js\": 53151,\n\t\"./mn\": 46458,\n\t\"./mn.js\": 46458,\n\t\"./mr\": 69165,\n\t\"./mr.js\": 69165,\n\t\"./ms\": 8680,\n\t\"./ms-my\": 87477,\n\t\"./ms-my.js\": 87477,\n\t\"./ms.js\": 8680,\n\t\"./mt\": 79684,\n\t\"./mt.js\": 79684,\n\t\"./my\": 40285,\n\t\"./my.js\": 40285,\n\t\"./nb\": 45922,\n\t\"./nb.js\": 45922,\n\t\"./ne\": 29040,\n\t\"./ne.js\": 29040,\n\t\"./nl\": 5066,\n\t\"./nl-be\": 74460,\n\t\"./nl-be.js\": 74460,\n\t\"./nl.js\": 5066,\n\t\"./nn\": 53693,\n\t\"./nn.js\": 53693,\n\t\"./oc-lnc\": 88676,\n\t\"./oc-lnc.js\": 88676,\n\t\"./pa-in\": 92341,\n\t\"./pa-in.js\": 92341,\n\t\"./pl\": 57416,\n\t\"./pl.js\": 57416,\n\t\"./pt\": 84344,\n\t\"./pt-br\": 30113,\n\t\"./pt-br.js\": 30113,\n\t\"./pt.js\": 84344,\n\t\"./ro\": 72643,\n\t\"./ro.js\": 72643,\n\t\"./ru\": 61305,\n\t\"./ru.js\": 61305,\n\t\"./sd\": 96095,\n\t\"./sd.js\": 96095,\n\t\"./se\": 74486,\n\t\"./se.js\": 74486,\n\t\"./si\": 58742,\n\t\"./si.js\": 58742,\n\t\"./sk\": 96722,\n\t\"./sk.js\": 96722,\n\t\"./sl\": 3345,\n\t\"./sl.js\": 3345,\n\t\"./sq\": 52416,\n\t\"./sq.js\": 52416,\n\t\"./sr\": 39450,\n\t\"./sr-cyrl\": 50501,\n\t\"./sr-cyrl.js\": 50501,\n\t\"./sr.js\": 39450,\n\t\"./ss\": 32222,\n\t\"./ss.js\": 32222,\n\t\"./sv\": 9454,\n\t\"./sv.js\": 9454,\n\t\"./sw\": 19638,\n\t\"./sw.js\": 19638,\n\t\"./ta\": 96494,\n\t\"./ta.js\": 96494,\n\t\"./te\": 94435,\n\t\"./te.js\": 94435,\n\t\"./tet\": 25003,\n\t\"./tet.js\": 25003,\n\t\"./tg\": 13706,\n\t\"./tg.js\": 13706,\n\t\"./th\": 16025,\n\t\"./th.js\": 16025,\n\t\"./tk\": 59780,\n\t\"./tk.js\": 59780,\n\t\"./tl-ph\": 22068,\n\t\"./tl-ph.js\": 22068,\n\t\"./tlh\": 39167,\n\t\"./tlh.js\": 39167,\n\t\"./tr\": 32494,\n\t\"./tr.js\": 32494,\n\t\"./tzl\": 58707,\n\t\"./tzl.js\": 58707,\n\t\"./tzm\": 91296,\n\t\"./tzm-latn\": 34532,\n\t\"./tzm-latn.js\": 34532,\n\t\"./tzm.js\": 91296,\n\t\"./ug-cn\": 12086,\n\t\"./ug-cn.js\": 12086,\n\t\"./uk\": 85069,\n\t\"./uk.js\": 85069,\n\t\"./ur\": 29304,\n\t\"./ur.js\": 29304,\n\t\"./uz\": 95115,\n\t\"./uz-latn\": 97609,\n\t\"./uz-latn.js\": 97609,\n\t\"./uz.js\": 95115,\n\t\"./vi\": 34802,\n\t\"./vi.js\": 34802,\n\t\"./x-pseudo\": 65605,\n\t\"./x-pseudo.js\": 65605,\n\t\"./yo\": 88456,\n\t\"./yo.js\": 88456,\n\t\"./zh-cn\": 23272,\n\t\"./zh-cn.js\": 23272,\n\t\"./zh-hk\": 9402,\n\t\"./zh-hk.js\": 9402,\n\t\"./zh-mo\": 48101,\n\t\"./zh-mo.js\": 48101,\n\t\"./zh-tw\": 40262,\n\t\"./zh-tw.js\": 40262\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;","var map = {\n\t\"./af.json\": [\n\t\t73069,\n\t\t\"src_locales_af_json\"\n\t],\n\t\"./ar.json\": [\n\t\t26726,\n\t\t\"src_locales_ar_json\"\n\t],\n\t\"./az.json\": [\n\t\t22795,\n\t\t\"src_locales_az_json\"\n\t],\n\t\"./be.json\": [\n\t\t7854,\n\t\t\"src_locales_be_json\"\n\t],\n\t\"./bg.json\": [\n\t\t24901,\n\t\t\"src_locales_bg_json\"\n\t],\n\t\"./bn.json\": [\n\t\t78169,\n\t\t\"src_locales_bn_json\"\n\t],\n\t\"./bs.json\": [\n\t\t38430,\n\t\t\"src_locales_bs_json\"\n\t],\n\t\"./ca.json\": [\n\t\t23886,\n\t\t\"src_locales_ca_json\"\n\t],\n\t\"./ckb-IR.json\": [\n\t\t56942,\n\t\t\"src_locales_ckb-IR_json\"\n\t],\n\t\"./cs.json\": [\n\t\t99789,\n\t\t\"src_locales_cs_json\"\n\t],\n\t\"./cy.json\": [\n\t\t58758,\n\t\t\"src_locales_cy_json\"\n\t],\n\t\"./da.json\": [\n\t\t85638,\n\t\t\"src_locales_da_json\"\n\t],\n\t\"./de-AT.json\": [\n\t\t30702,\n\t\t\"src_locales_de-AT_json\"\n\t],\n\t\"./de-CH.json\": [\n\t\t52919,\n\t\t\"src_locales_de-CH_json\"\n\t],\n\t\"./de-DE.json\": [\n\t\t24048,\n\t\t\"src_locales_de-DE_json\"\n\t],\n\t\"./de.json\": [\n\t\t39929,\n\t\t\"src_locales_de_json\"\n\t],\n\t\"./dz.json\": [\n\t\t43272,\n\t\t\"src_locales_dz_json\"\n\t],\n\t\"./el-CY.json\": [\n\t\t58872,\n\t\t\"src_locales_el-CY_json\"\n\t],\n\t\"./el.json\": [\n\t\t7498,\n\t\t\"src_locales_el_json\"\n\t],\n\t\"./en-AU.json\": [\n\t\t45395,\n\t\t\"src_locales_en-AU_json\"\n\t],\n\t\"./en-CA.json\": [\n\t\t83137,\n\t\t\"src_locales_en-CA_json\"\n\t],\n\t\"./en-CY.json\": [\n\t\t39487,\n\t\t\"src_locales_en-CY_json\"\n\t],\n\t\"./en-GB.json\": [\n\t\t43171,\n\t\t\"src_locales_en-GB_json\"\n\t],\n\t\"./en-IE.json\": [\n\t\t73610,\n\t\t\"src_locales_en-IE_json\"\n\t],\n\t\"./en-IN.json\": [\n\t\t17684,\n\t\t\"src_locales_en-IN_json\"\n\t],\n\t\"./en-NZ.json\": [\n\t\t79432,\n\t\t\"src_locales_en-NZ_json\"\n\t],\n\t\"./en-TT.json\": [\n\t\t21648,\n\t\t\"src_locales_en-TT_json\"\n\t],\n\t\"./en-US.json\": [\n\t\t19594,\n\t\t\"src_locales_en-US_json\"\n\t],\n\t\"./en-ZA.json\": [\n\t\t30177,\n\t\t\"src_locales_en-ZA_json\"\n\t],\n\t\"./en.json\": [\n\t\t20790,\n\t\t\"src_locales_en_json\"\n\t],\n\t\"./eo.json\": [\n\t\t37798,\n\t\t\"src_locales_eo_json\"\n\t],\n\t\"./es-419.json\": [\n\t\t63076,\n\t\t\"src_locales_es-419_json\"\n\t],\n\t\"./es-AR.json\": [\n\t\t32671,\n\t\t\"src_locales_es-AR_json\"\n\t],\n\t\"./es-CL.json\": [\n\t\t47290,\n\t\t\"src_locales_es-CL_json\"\n\t],\n\t\"./es-CO.json\": [\n\t\t40019,\n\t\t\"src_locales_es-CO_json\"\n\t],\n\t\"./es-CR.json\": [\n\t\t59460,\n\t\t\"src_locales_es-CR_json\"\n\t],\n\t\"./es-EC.json\": [\n\t\t83349,\n\t\t\"src_locales_es-EC_json\"\n\t],\n\t\"./es-ES.json\": [\n\t\t33840,\n\t\t\"src_locales_es-ES_json\"\n\t],\n\t\"./es-MX.json\": [\n\t\t20543,\n\t\t\"src_locales_es-MX_json\"\n\t],\n\t\"./es-NI.json\": [\n\t\t55666,\n\t\t\"src_locales_es-NI_json\"\n\t],\n\t\"./es-PA.json\": [\n\t\t97384,\n\t\t\"src_locales_es-PA_json\"\n\t],\n\t\"./es-PE.json\": [\n\t\t10613,\n\t\t\"src_locales_es-PE_json\"\n\t],\n\t\"./es-US.json\": [\n\t\t8595,\n\t\t\"src_locales_es-US_json\"\n\t],\n\t\"./es-VE.json\": [\n\t\t1523,\n\t\t\"src_locales_es-VE_json\"\n\t],\n\t\"./es.json\": [\n\t\t18563,\n\t\t\"src_locales_es_json\"\n\t],\n\t\"./et.json\": [\n\t\t88034,\n\t\t\"src_locales_et_json\"\n\t],\n\t\"./eu.json\": [\n\t\t36485,\n\t\t\"src_locales_eu_json\"\n\t],\n\t\"./fa.json\": [\n\t\t49603,\n\t\t\"src_locales_fa_json\"\n\t],\n\t\"./fi.json\": [\n\t\t2276,\n\t\t\"src_locales_fi_json\"\n\t],\n\t\"./fil.json\": [\n\t\t28919,\n\t\t\"src_locales_fil_json\"\n\t],\n\t\"./fr-CA.json\": [\n\t\t22623,\n\t\t\"src_locales_fr-CA_json\"\n\t],\n\t\"./fr-CH.json\": [\n\t\t50747,\n\t\t\"src_locales_fr-CH_json\"\n\t],\n\t\"./fr-FR.json\": [\n\t\t74824,\n\t\t\"src_locales_fr-FR_json\"\n\t],\n\t\"./fr.json\": [\n\t\t844,\n\t\t\"src_locales_fr_json\"\n\t],\n\t\"./fy.json\": [\n\t\t6191,\n\t\t\"src_locales_fy_json\"\n\t],\n\t\"./gd.json\": [\n\t\t55420,\n\t\t\"src_locales_gd_json\"\n\t],\n\t\"./gl.json\": [\n\t\t71077,\n\t\t\"src_locales_gl_json\"\n\t],\n\t\"./he.json\": [\n\t\t8818,\n\t\t\"src_locales_he_json\"\n\t],\n\t\"./hi-IN.json\": [\n\t\t59223,\n\t\t\"src_locales_hi-IN_json\"\n\t],\n\t\"./hi.json\": [\n\t\t39493,\n\t\t\"src_locales_hi_json\"\n\t],\n\t\"./hr.json\": [\n\t\t44253,\n\t\t\"src_locales_hr_json\"\n\t],\n\t\"./hu.json\": [\n\t\t64626,\n\t\t\"src_locales_hu_json\"\n\t],\n\t\"./id.json\": [\n\t\t98446,\n\t\t\"src_locales_id_json\"\n\t],\n\t\"./is.json\": [\n\t\t92188,\n\t\t\"src_locales_is_json\"\n\t],\n\t\"./it-CH.json\": [\n\t\t22164,\n\t\t\"src_locales_it-CH_json\"\n\t],\n\t\"./it.json\": [\n\t\t20504,\n\t\t\"src_locales_it_json\"\n\t],\n\t\"./ja.json\": [\n\t\t8566,\n\t\t\"src_locales_ja_json\"\n\t],\n\t\"./ka.json\": [\n\t\t61574,\n\t\t\"src_locales_ka_json\"\n\t],\n\t\"./kk.json\": [\n\t\t84887,\n\t\t\"src_locales_kk_json\"\n\t],\n\t\"./km.json\": [\n\t\t655,\n\t\t\"src_locales_km_json\"\n\t],\n\t\"./kn.json\": [\n\t\t33098,\n\t\t\"src_locales_kn_json\"\n\t],\n\t\"./ko.json\": [\n\t\t37697,\n\t\t\"src_locales_ko_json\"\n\t],\n\t\"./lb.json\": [\n\t\t43266,\n\t\t\"src_locales_lb_json\"\n\t],\n\t\"./lo.json\": [\n\t\t56583,\n\t\t\"src_locales_lo_json\"\n\t],\n\t\"./lt.json\": [\n\t\t41560,\n\t\t\"src_locales_lt_json\"\n\t],\n\t\"./lv.json\": [\n\t\t79071,\n\t\t\"src_locales_lv_json\"\n\t],\n\t\"./mg.json\": [\n\t\t45607,\n\t\t\"src_locales_mg_json\"\n\t],\n\t\"./mk.json\": [\n\t\t77483,\n\t\t\"src_locales_mk_json\"\n\t],\n\t\"./ml.json\": [\n\t\t58729,\n\t\t\"src_locales_ml_json\"\n\t],\n\t\"./mn.json\": [\n\t\t77100,\n\t\t\"src_locales_mn_json\"\n\t],\n\t\"./mr-IN.json\": [\n\t\t56161,\n\t\t\"src_locales_mr-IN_json\"\n\t],\n\t\"./ms.json\": [\n\t\t9192,\n\t\t\"src_locales_ms_json\"\n\t],\n\t\"./nb.json\": [\n\t\t54870,\n\t\t\"src_locales_nb_json\"\n\t],\n\t\"./ne.json\": [\n\t\t22998,\n\t\t\"src_locales_ne_json\"\n\t],\n\t\"./nl.json\": [\n\t\t13055,\n\t\t\"src_locales_nl_json\"\n\t],\n\t\"./nn.json\": [\n\t\t98875,\n\t\t\"src_locales_nn_json\"\n\t],\n\t\"./no.json\": [\n\t\t80438,\n\t\t\"src_locales_no_json\"\n\t],\n\t\"./oc.json\": [\n\t\t97006,\n\t\t\"src_locales_oc_json\"\n\t],\n\t\"./or.json\": [\n\t\t95427,\n\t\t\"src_locales_or_json\"\n\t],\n\t\"./pa.json\": [\n\t\t20960,\n\t\t\"src_locales_pa_json\"\n\t],\n\t\"./pap-AW.json\": [\n\t\t68774,\n\t\t\"src_locales_pap-AW_json\"\n\t],\n\t\"./pap-CW.json\": [\n\t\t90514,\n\t\t\"src_locales_pap-CW_json\"\n\t],\n\t\"./pl.json\": [\n\t\t75143,\n\t\t\"src_locales_pl_json\"\n\t],\n\t\"./pt-BR.json\": [\n\t\t96837,\n\t\t\"src_locales_pt-BR_json\"\n\t],\n\t\"./pt.json\": [\n\t\t69898,\n\t\t\"src_locales_pt_json\"\n\t],\n\t\"./rm.json\": [\n\t\t53366,\n\t\t\"src_locales_rm_json\"\n\t],\n\t\"./ro.json\": [\n\t\t54691,\n\t\t\"src_locales_ro_json\"\n\t],\n\t\"./ru.json\": [\n\t\t69672,\n\t\t\"src_locales_ru_json\"\n\t],\n\t\"./rw.json\": [\n\t\t65551,\n\t\t\"src_locales_rw_json\"\n\t],\n\t\"./sc.json\": [\n\t\t82824,\n\t\t\"src_locales_sc_json\"\n\t],\n\t\"./si.json\": [\n\t\t21578,\n\t\t\"src_locales_si_json\"\n\t],\n\t\"./sk.json\": [\n\t\t71941,\n\t\t\"src_locales_sk_json\"\n\t],\n\t\"./sl.json\": [\n\t\t75329,\n\t\t\"src_locales_sl_json\"\n\t],\n\t\"./sq.json\": [\n\t\t67263,\n\t\t\"src_locales_sq_json\"\n\t],\n\t\"./sr.json\": [\n\t\t37931,\n\t\t\"src_locales_sr_json\"\n\t],\n\t\"./st.json\": [\n\t\t98951,\n\t\t\"src_locales_st_json\"\n\t],\n\t\"./sv-FI.json\": [\n\t\t76642,\n\t\t\"src_locales_sv-FI_json\"\n\t],\n\t\"./sv-SE.json\": [\n\t\t59385,\n\t\t\"src_locales_sv-SE_json\"\n\t],\n\t\"./sv.json\": [\n\t\t93244,\n\t\t\"src_locales_sv_json\"\n\t],\n\t\"./sw.json\": [\n\t\t59689,\n\t\t\"src_locales_sw_json\"\n\t],\n\t\"./ta.json\": [\n\t\t22446,\n\t\t\"src_locales_ta_json\"\n\t],\n\t\"./te.json\": [\n\t\t80472,\n\t\t\"src_locales_te_json\"\n\t],\n\t\"./th.json\": [\n\t\t42009,\n\t\t\"src_locales_th_json\"\n\t],\n\t\"./tl.json\": [\n\t\t26831,\n\t\t\"src_locales_tl_json\"\n\t],\n\t\"./tr.json\": [\n\t\t12021,\n\t\t\"src_locales_tr_json\"\n\t],\n\t\"./tt.json\": [\n\t\t91072,\n\t\t\"src_locales_tt_json\"\n\t],\n\t\"./ug.json\": [\n\t\t11316,\n\t\t\"src_locales_ug_json\"\n\t],\n\t\"./uk.json\": [\n\t\t61754,\n\t\t\"src_locales_uk_json\"\n\t],\n\t\"./ur.json\": [\n\t\t50237,\n\t\t\"src_locales_ur_json\"\n\t],\n\t\"./uz.json\": [\n\t\t67534,\n\t\t\"src_locales_uz_json\"\n\t],\n\t\"./vi.json\": [\n\t\t90245,\n\t\t\"src_locales_vi_json\"\n\t],\n\t\"./wo.json\": [\n\t\t40160,\n\t\t\"src_locales_wo_json\"\n\t],\n\t\"./zh-CN.json\": [\n\t\t89890,\n\t\t\"src_locales_zh-CN_json\"\n\t],\n\t\"./zh-HK.json\": [\n\t\t58539,\n\t\t\"src_locales_zh-HK_json\"\n\t],\n\t\"./zh-TW.json\": [\n\t\t46687,\n\t\t\"src_locales_zh-TW_json\"\n\t],\n\t\"./zh-YUE.json\": [\n\t\t68761,\n\t\t\"src_locales_zh-YUE_json\"\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(() => {\n\t\treturn __webpack_require__.t(id, 3 | 16);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = 7535;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./admin/custom-fields.controller\": [\n\t\t14527,\n\t\t\"src_stimulus_controllers_dynamic_admin_custom-fields_controller_ts\"\n\t],\n\t\"./admin/openid-connect-providers.controller\": [\n\t\t68693,\n\t\t\"src_stimulus_controllers_dynamic_admin_openid-connect-providers_controller_ts\"\n\t],\n\t\"./admin/roles.controller\": [\n\t\t56157,\n\t\t\"src_stimulus_controllers_dynamic_admin_roles_controller_ts\"\n\t],\n\t\"./admin/users.controller\": [\n\t\t87209,\n\t\t\"src_stimulus_controllers_dynamic_admin_users_controller_ts\"\n\t],\n\t\"./backlogs.controller\": [\n\t\t27346,\n\t\t\"src_stimulus_controllers_dynamic_backlogs_controller_ts\"\n\t],\n\t\"./forum-messages.controller\": [\n\t\t35044,\n\t\t\"src_stimulus_controllers_dynamic_forum-messages_controller_ts\"\n\t],\n\t\"./journal-history.controller\": [\n\t\t55807,\n\t\t\"src_stimulus_controllers_dynamic_journal-history_controller_ts\"\n\t],\n\t\"./meeting-agenda-item-drag-and-drop.controller\": [\n\t\t8052,\n\t\t\"src_stimulus_controllers_dynamic_meeting-agenda-item-drag-and-drop_controller_ts\"\n\t],\n\t\"./meeting-agenda-item-form.controller\": [\n\t\t61261,\n\t\t\"src_stimulus_controllers_dynamic_meeting-agenda-item-form_controller_ts\"\n\t],\n\t\"./meeting-content.controller\": [\n\t\t11904,\n\t\t\"src_stimulus_controllers_dynamic_meeting-content_controller_ts\"\n\t],\n\t\"./meetings-sidebar-participants.controller\": [\n\t\t92527,\n\t\t\"src_stimulus_controllers_dynamic_meetings-sidebar-participants_controller_ts\"\n\t],\n\t\"./members-form.controller\": [\n\t\t70796,\n\t\t\"src_stimulus_controllers_dynamic_members-form_controller_ts\"\n\t],\n\t\"./menus/expandable-sidemenu.controller\": [\n\t\t50204,\n\t\t\"src_stimulus_controllers_dynamic_menus_expandable-sidemenu_controller_ts\"\n\t],\n\t\"./menus/main.controller\": [\n\t\t68315\n\t],\n\t\"./menus/subtree.controller\": [\n\t\t27987,\n\t\t\"src_stimulus_controllers_dynamic_menus_subtree_controller_ts\"\n\t],\n\t\"./my/timers.controller\": [\n\t\t85551,\n\t\t\"src_stimulus_controllers_dynamic_my_timers_controller_ts\"\n\t],\n\t\"./op-turbo-op-primer-async-dialog.controller\": [\n\t\t59485,\n\t\t\"src_stimulus_controllers_dynamic_op-turbo-op-primer-async-dialog_controller_ts\"\n\t],\n\t\"./project-storage-form.controller\": [\n\t\t47553,\n\t\t\"src_stimulus_controllers_dynamic_project-storage-form_controller_ts\"\n\t],\n\t\"./project.controller\": [\n\t\t99245,\n\t\t\"src_stimulus_controllers_dynamic_project_controller_ts\"\n\t],\n\t\"./repository-navigation.controller\": [\n\t\t95318,\n\t\t\"src_stimulus_controllers_dynamic_repository-navigation_controller_ts\"\n\t],\n\t\"./repository-settings.controller\": [\n\t\t17902,\n\t\t\"src_stimulus_controllers_dynamic_repository-settings_controller_ts\"\n\t],\n\t\"./storages/automatically-managed-project-folders-form.controller\": [\n\t\t94411,\n\t\t\"src_stimulus_controllers_dynamic_storages_automatically-managed-project-folders-form_controller_ts\"\n\t],\n\t\"./storages/open-project-storage-modal.controller\": [\n\t\t39177,\n\t\t\"src_stimulus_controllers_dynamic_storages_open-project-storage-modal_controller_ts\"\n\t],\n\t\"./storages/storage-form.controller\": [\n\t\t12920,\n\t\t\"src_stimulus_controllers_dynamic_storages_storage-form_controller_ts\"\n\t],\n\t\"./two-factor-authentication.controller\": [\n\t\t93351,\n\t\t\"src_stimulus_controllers_dynamic_two-factor-authentication_controller_ts\"\n\t],\n\t\"./user-limit.controller\": [\n\t\t43089,\n\t\t\"src_stimulus_controllers_dynamic_user-limit_controller_ts\"\n\t],\n\t\"./work-packages/share/bulk-selection.controller\": [\n\t\t43278,\n\t\t\"src_stimulus_controllers_dynamic_work-packages_share_bulk-selection_controller_ts\"\n\t],\n\t\"./work-packages/share/user-selected.controller\": [\n\t\t29691,\n\t\t\"src_stimulus_controllers_dynamic_work-packages_share_user-selected_controller_ts\"\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn Promise.all(ids.slice(1).map(__webpack_require__.e)).then(() => {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = 5009;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./af.js\": [\n\t\t22842,\n\t\t\"src_vendor_ckeditor_translations_af_js\"\n\t],\n\t\"./ar.js\": [\n\t\t67122,\n\t\t\"src_vendor_ckeditor_translations_ar_js\"\n\t],\n\t\"./ast.js\": [\n\t\t28367,\n\t\t\"src_vendor_ckeditor_translations_ast_js\"\n\t],\n\t\"./az.js\": [\n\t\t43013,\n\t\t\"src_vendor_ckeditor_translations_az_js\"\n\t],\n\t\"./bg.js\": [\n\t\t57198,\n\t\t\"src_vendor_ckeditor_translations_bg_js\"\n\t],\n\t\"./bn.js\": [\n\t\t50359,\n\t\t\"src_vendor_ckeditor_translations_bn_js\"\n\t],\n\t\"./bs.js\": [\n\t\t55334,\n\t\t\"src_vendor_ckeditor_translations_bs_js\"\n\t],\n\t\"./ca.js\": [\n\t\t20821,\n\t\t\"src_vendor_ckeditor_translations_ca_js\"\n\t],\n\t\"./cs.js\": [\n\t\t980,\n\t\t\"src_vendor_ckeditor_translations_cs_js\"\n\t],\n\t\"./da.js\": [\n\t\t24322,\n\t\t\"src_vendor_ckeditor_translations_da_js\"\n\t],\n\t\"./de-ch.js\": [\n\t\t93637,\n\t\t\"src_vendor_ckeditor_translations_de-ch_js\"\n\t],\n\t\"./de.js\": [\n\t\t2763,\n\t\t\"src_vendor_ckeditor_translations_de_js\"\n\t],\n\t\"./el.js\": [\n\t\t75149,\n\t\t\"src_vendor_ckeditor_translations_el_js\"\n\t],\n\t\"./en-au.js\": [\n\t\t87910,\n\t\t\"src_vendor_ckeditor_translations_en-au_js\"\n\t],\n\t\"./en-gb.js\": [\n\t\t50804,\n\t\t\"src_vendor_ckeditor_translations_en-gb_js\"\n\t],\n\t\"./eo.js\": [\n\t\t83923,\n\t\t\"src_vendor_ckeditor_translations_eo_js\"\n\t],\n\t\"./es-co.js\": [\n\t\t86615,\n\t\t\"src_vendor_ckeditor_translations_es-co_js\"\n\t],\n\t\"./es.js\": [\n\t\t46114,\n\t\t\"src_vendor_ckeditor_translations_es_js\"\n\t],\n\t\"./et.js\": [\n\t\t1306,\n\t\t\"src_vendor_ckeditor_translations_et_js\"\n\t],\n\t\"./eu.js\": [\n\t\t71658,\n\t\t\"src_vendor_ckeditor_translations_eu_js\"\n\t],\n\t\"./fa.js\": [\n\t\t48757,\n\t\t\"src_vendor_ckeditor_translations_fa_js\"\n\t],\n\t\"./fi.js\": [\n\t\t94152,\n\t\t\"src_vendor_ckeditor_translations_fi_js\"\n\t],\n\t\"./fr.js\": [\n\t\t77077,\n\t\t\"src_vendor_ckeditor_translations_fr_js\"\n\t],\n\t\"./gl.js\": [\n\t\t30440,\n\t\t\"src_vendor_ckeditor_translations_gl_js\"\n\t],\n\t\"./gu.js\": [\n\t\t69752,\n\t\t\"src_vendor_ckeditor_translations_gu_js\"\n\t],\n\t\"./he.js\": [\n\t\t73603,\n\t\t\"src_vendor_ckeditor_translations_he_js\"\n\t],\n\t\"./hi.js\": [\n\t\t71070,\n\t\t\"src_vendor_ckeditor_translations_hi_js\"\n\t],\n\t\"./hr.js\": [\n\t\t60663,\n\t\t\"src_vendor_ckeditor_translations_hr_js\"\n\t],\n\t\"./hu.js\": [\n\t\t75813,\n\t\t\"src_vendor_ckeditor_translations_hu_js\"\n\t],\n\t\"./id.js\": [\n\t\t79891,\n\t\t\"src_vendor_ckeditor_translations_id_js\"\n\t],\n\t\"./it.js\": [\n\t\t72585,\n\t\t\"src_vendor_ckeditor_translations_it_js\"\n\t],\n\t\"./ja.js\": [\n\t\t67250,\n\t\t\"src_vendor_ckeditor_translations_ja_js\"\n\t],\n\t\"./jv.js\": [\n\t\t57788,\n\t\t\"src_vendor_ckeditor_translations_jv_js\"\n\t],\n\t\"./km.js\": [\n\t\t94753,\n\t\t\"src_vendor_ckeditor_translations_km_js\"\n\t],\n\t\"./kn.js\": [\n\t\t76756,\n\t\t\"src_vendor_ckeditor_translations_kn_js\"\n\t],\n\t\"./ko.js\": [\n\t\t65159,\n\t\t\"src_vendor_ckeditor_translations_ko_js\"\n\t],\n\t\"./ku.js\": [\n\t\t43757,\n\t\t\"src_vendor_ckeditor_translations_ku_js\"\n\t],\n\t\"./lt.js\": [\n\t\t63299,\n\t\t\"src_vendor_ckeditor_translations_lt_js\"\n\t],\n\t\"./lv.js\": [\n\t\t73299,\n\t\t\"src_vendor_ckeditor_translations_lv_js\"\n\t],\n\t\"./ms.js\": [\n\t\t91111,\n\t\t\"src_vendor_ckeditor_translations_ms_js\"\n\t],\n\t\"./nb.js\": [\n\t\t53007,\n\t\t\"src_vendor_ckeditor_translations_nb_js\"\n\t],\n\t\"./ne.js\": [\n\t\t14360,\n\t\t\"src_vendor_ckeditor_translations_ne_js\"\n\t],\n\t\"./nl.js\": [\n\t\t95421,\n\t\t\"src_vendor_ckeditor_translations_nl_js\"\n\t],\n\t\"./no.js\": [\n\t\t76506,\n\t\t\"src_vendor_ckeditor_translations_no_js\"\n\t],\n\t\"./oc.js\": [\n\t\t81017,\n\t\t\"src_vendor_ckeditor_translations_oc_js\"\n\t],\n\t\"./pl.js\": [\n\t\t91884,\n\t\t\"src_vendor_ckeditor_translations_pl_js\"\n\t],\n\t\"./pt-br.js\": [\n\t\t10162,\n\t\t\"src_vendor_ckeditor_translations_pt-br_js\"\n\t],\n\t\"./pt.js\": [\n\t\t13373,\n\t\t\"src_vendor_ckeditor_translations_pt_js\"\n\t],\n\t\"./ro.js\": [\n\t\t95854,\n\t\t\"src_vendor_ckeditor_translations_ro_js\"\n\t],\n\t\"./ru.js\": [\n\t\t95951,\n\t\t\"src_vendor_ckeditor_translations_ru_js\"\n\t],\n\t\"./si.js\": [\n\t\t58144,\n\t\t\"src_vendor_ckeditor_translations_si_js\"\n\t],\n\t\"./sk.js\": [\n\t\t20955,\n\t\t\"src_vendor_ckeditor_translations_sk_js\"\n\t],\n\t\"./sl.js\": [\n\t\t55839,\n\t\t\"src_vendor_ckeditor_translations_sl_js\"\n\t],\n\t\"./sq.js\": [\n\t\t10892,\n\t\t\"src_vendor_ckeditor_translations_sq_js\"\n\t],\n\t\"./sr-latn.js\": [\n\t\t77497,\n\t\t\"src_vendor_ckeditor_translations_sr-latn_js\"\n\t],\n\t\"./sr.js\": [\n\t\t60320,\n\t\t\"src_vendor_ckeditor_translations_sr_js\"\n\t],\n\t\"./sv.js\": [\n\t\t49760,\n\t\t\"src_vendor_ckeditor_translations_sv_js\"\n\t],\n\t\"./th.js\": [\n\t\t88749,\n\t\t\"src_vendor_ckeditor_translations_th_js\"\n\t],\n\t\"./tk.js\": [\n\t\t69010,\n\t\t\"src_vendor_ckeditor_translations_tk_js\"\n\t],\n\t\"./tr.js\": [\n\t\t2064,\n\t\t\"src_vendor_ckeditor_translations_tr_js\"\n\t],\n\t\"./tt.js\": [\n\t\t38002,\n\t\t\"src_vendor_ckeditor_translations_tt_js\"\n\t],\n\t\"./ug.js\": [\n\t\t74852,\n\t\t\"src_vendor_ckeditor_translations_ug_js\"\n\t],\n\t\"./uk.js\": [\n\t\t84863,\n\t\t\"src_vendor_ckeditor_translations_uk_js\"\n\t],\n\t\"./ur.js\": [\n\t\t21731,\n\t\t\"src_vendor_ckeditor_translations_ur_js\"\n\t],\n\t\"./uz.js\": [\n\t\t59989,\n\t\t\"src_vendor_ckeditor_translations_uz_js\"\n\t],\n\t\"./vi.js\": [\n\t\t85560,\n\t\t\"src_vendor_ckeditor_translations_vi_js\"\n\t],\n\t\"./zh-cn.js\": [\n\t\t17775,\n\t\t\"src_vendor_ckeditor_translations_zh-cn_js\"\n\t],\n\t\"./zh.js\": [\n\t\t14146,\n\t\t\"src_vendor_ckeditor_translations_zh_js\"\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(() => {\n\t\treturn __webpack_require__.t(id, 7 | 16);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = 87983;\nmodule.exports = webpackAsyncContext;"],"names":["ActiveWindowService","constructor","document","activeState$","BehaviorSubject","addEventListener","visibilityState","debugLog","this","next","isActive","value","active$","asObservable","i0","DOCUMENT","factory","ɵfac","providedIn","ApiV3GridPaths","ApiV3GettableResource","form","subResource","ApiV3GridForm","patch","resource","schema","payload","extractPayload","halResourceService","path","delete","ApiV3GridsPaths","ApiV3ResourceCollection","apiRoot","basePath","super","list","params","get","listParamsString","post","ApiV3Resource","cache","createCache","requireAndStream","force","id","toString","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","States","SchemaCacheService","ApiV3TimeEntryPaths","ApiV3FormResource","clearSome","parent","HalResource","HalPayloadHelper","extractPayloadFromSchema","ApiV3Collection","observeAll","response","CollectionResource","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","_links","project","principal","roles","role","_meta","notificationMessage","raw","request","ApiV3MembershipsPaths","available_projects","ApiV3UserPreferencesPaths","ApiV3ResourcePath","http","withCredentials","responseType","HttpClient","ApiV3UserPaths","avatar","preferences","users","ApiV3UsersPaths","me","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","order","parameterised","QueryResource","mapSchemasIntoFilters","paginated","pagination","ApiV3QueriesPaths","default","filter_instance_schemas","find","queryData","withOptionalProject","toggleStarred","starred","unstar","star","getIcalUrl","tokenName","icalUrl","token_name","ApiV3RelationsPaths","loadInvolved","workPackageIds","validIds","_","filter","test","length","from","filtered","getPaginatedResults","ApiV3WorkPackageForm","forTypePayload","type","forPayload","ApiV3WorkPackagePaths","relations","revisions","activities","available_watchers","github_pull_requests","WorkPackageCache","schemaCacheService","updateWorkPackage","wp","immediate","isNewResource","updateWorkPackageList","skipOnIdentical","i","workPackageId","multiState","hasValue","isEqual","$source","i1","ApiV3WorkPackageCachedSubresource","schemas","updateSchemas","ApiV3WorkPackagesPaths","requireAll","ids","Promise","resolve","reject","loadCollectionsFor","uniq","pagedResults","each","results","undefined","filterByTypeaheadOrId","term","idOnly","additionalParams","ApiV3FilterBuilder","add","sortBy","offset","pageSize","filterUpdatedSince","timestamp","n","getAllPaginated","valid_subset","workPackages","ApiV3VersionPaths","version","versions","ApiV3VersionsPaths","ApiV3ProjectCopyPaths","ApiV3ProjectPaths","available_assignees","work_packages","copy","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","boardsPath","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","week","nonWorkingDays","ApiV3StoragesPaths","files","ApiV3ProjectStoragesPaths","ApiV3Service","pathHelper","apiV3CollectionEndpoint","backups","apiV3CustomEndpoint","configuration","days","documents","file_links","notifications","principals","root","apiV3SingularEndpoint","priorities","time_entries","actions","capabilities","memberships","news","storages","projectStorages","placeholder_users","groups","help_texts","job_statuses","views","boards","isNil","collectionFromString","fullPath","replace","api","v3","apiV3Base","segment","cls","holdValuesForSeconds","cacheDurationInMs","current","fallback","getValueOr","loader","share","clearAndPutFromPromise","firstValueFrom","changes$","observeChange","startWith","auditTime","mapped","observeSome","combineLatest","values","clear","hasActivePromiseRequest","isPristine","isValueOlderThan","startRow","endRow","endColumn","identifier","addFiltersToPath","url","URL","window","location","origin","searchParams","has","existingFilters","JSON","parse","stringify","Object","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","HalResourceService","ApiV3GettableResourceCollection","pageParams","SimpleResourceCollection","input","toPath","resourceClass","pathname","signalled","separator","startsWith","BrowserDetector","documentElement","isMobile","hasBodyClass","isEdge","body","classList","contains","DeviceService","mobileWidthTreshold","tabletWidthTreshold","innerWidth","isTablet","ConfigurationService","apiV3Service","initialize","loadConfiguration","commentsSortedInDescendingOrder","userPreference","warnOnLeavingUnsaved","autoHidePopups","isTimezoneSet","timezone","isDefaultTimezoneSet","defaultTimezone","isDirectUploads","prepareAttachmentURL","maximumAttachmentFileSize","systemPreference","perPageOptions","dateFormatPresent","dateFormat","timeFormatPresent","timeFormat","startOfWeekPresent","startOfWeek","moment","I18n","locale","firstDayOfWeek","hostName","activeFeatureFlags","pref","CurrentProjectService","detect","inProjectContext","projectPath","apiv3Path","getCurrent","element","querySelector","dataset","projectName","i2","CurrentUserModule","bootstrapModule","currentUserService","CurrentUserService","ErrorReporter","addHook","user$","user","userMeta","querySelectorAll","setUser","mail","CurrentUserStore","CurrentUserQuery","Query","store","isLoggedIn$","currentUserStore","currentUserQuery","capabilitiesService","_isLoggedIn","_user","setupLegacyDataListeners","capabilities$","projectContext","principalFilter$","userFilter","requireCollection","hasCapabilities$","action","castArray","contextAction","cap","endsWith","distinctUntilChanged","hasAnyCapabilityOf$","actionsToFilter","subscribe","isLoggedIn","userId","language","i3","i4","Store","StoreConfig","TimezoneService","configurationService","setupLocale","userTimezone","guess","parseDatetime","datetime","format","tz","parseDate","date","parseISODatetime","parseISODate","formattedDate","getDateFormat","daysFromToday","dateString","today","startOf","diff","formattedTime","datetimeString","getTimeFormat","formattedDatetime","c","formattedDatetimeComponents","formattedRelativeDateTime","fromNow","d","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","loadWeekdays","weekdaysService","WeekdayResourceService","BannersService","_banners","eeShowBanners","getEnterPriseEditionUrl","referrer","hash","enterpriseEditionUrl","conditional","bannersVisible","bannersNotVisible","callMaybe","func","GonService","gon","titlePartsSeparator","OpTitleService","titleService","getTitle","titleParts","split","setFirstPart","parts","setTitle","prependFirstPart","unshift","I18nService","config","i18n","toTime","meta","instanceLocale","instancelocale","addTagText","clearAllText","loadingText","notFoundText","typeToSearchText","instance_locale_translate","toNumber","localize","withLoadingIndicator","indicator","delayStopTime","start","delayedStop","stop","LoadingIndicator","indicatorTemplate","promise","stopper","catch","prepend","time","setTimeout","remove","LoadingIndicatorService","table","wpDetails","modal","getter","getIndicatorAt","jQuery","MainMenuNavigationService","navigationEvents$","onActivate","names","evt","indexOf","MainMenuToggleService","deviceService","elementMinWidth","defaultWidth","localStorageKey","localStorageStateKey","global","htmlNode","getElementsByTagName","mainMenu","hideElements","titleData","titleData$","changeData","changeData$","initializeMenu","elementWidth","parseInt","OpenProject","guardedLocalStorage","menuCollapsed","closeMenu","setWidth","saveWidth","offsetWidth","currentProject","hasClass","closeWhenOnTablet","toggleNavigation","event","stopPropagation","preventDefault","showNavigation","savedWidth","widthToSave","first","focus","blur","width","String","maxMenuWidth","snapBack","setToggleTitle","toggleClassHidden","style","setProperty","changeEvent","Event","toggleTitle","toggleClass","links","modelName","modelLinks","doModify","observeUntil","unsubscribe","takeUntil","can","cannot","ApiV3Paths","openApiSpecPath","previewMarkup","context","base","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","newBoardsPath","projectDashboardsPath","timeEntriesPath","suffix","workPackagePath","usersPath","groupsPath","placeholderUsersPath","userPath","placeholderUserPath","groupPath","rolesPath","rolePath","versionsPath","versionEditPath","versionShowPath","workPackagesPath","workPackageShortPath","workPackageCopyPath","workPackageDetailsCopyPath","workPackageSharePath","workPackagesBulkEditPath","workPackagesBulkMovePath","workPackagesBulkCopyPath","workPackagesBulkDeletePath","textFormattingHelp","RecentItemsService","recentItems$","getAll","wps","entry","slice","localStorage","setItem","FirstRouteService","isEmpty","setIfFirst","stateName","fallbackSchemaId","fallbackSchema","createHalResourceOfClass","SchemaResource","stateKey","_type","WorkPackageSchemaProxy","SchemaProxy","getSchemaHref","loadAll","hrefs","all","contactUrl","en","de","pricingUrl","enterpriseDocsUrl","website","tableHighlighting","graphWidgets","DynamicBootstrapper","optionalBoostrapComponents","register","defs","bootstrapOptionalDocument","appRef","doc","definitions","performBootstrap","bootstrapOptionalEmbeddable","getEmbeddable","embeddable","embedded","selector","target","closest","bootstrap","setAttribute","onboardingTourStorageKey","ProjectName","matchingFilter","filterFunction","waitForElement","containerSelector","execFunction","container","initial","MutationObserver","mutations","observerInstance","matches","disconnect","childList","subtree","GlobalHelpers","checkAll","checked","toggleCheckboxesBySelector","boxes","all_checked","pluginContext","helpers","pageWasEdited","pageIsSubmitted","getPluginContext","urlRoot","attr","environment","data","edition","isStandardEdition","isBimEdition","newValue","getItem","e","console","error","require","ActionsService","Subject","actions$","ofType","dispatch","AttachmentsStore","EntityStore","createInitialResourceState","AttachmentsResourceService","ResourceStoreService","removeAttachment","collectionKey","attachment","headers","HttpHeaders","removeEntityFromCollectionAndState","catchError","toastService","addError","Error","message","attachFiles","getAttachmentsSelfLink","HAL_NEW_RESOURCE_ID","getUploadTarget","uploadFiles","file","addAttachments","uploadHref","uploadAttachments","applyTransaction","collections","observables","uploadService","upload","uploads","addUpload","waitForUploadsFinished","responses","isNotNull","getDirectUploadLink","prepareAttachment","createStore","OpUploadService","ToastService","CapabilitiesStore","CapabilitiesResourceService","loadedCapabilities$","contextId","selectAll","fetchCapabilities","fetchCollection","DayStore","DayResourceService","isNonWorkingDay$","requireNonWorkingYear$","findIndex","endOf","requireNonWorkingYears$","end","WeekdayStore","selectHasCache","hasCache","EMPTY","fetchWeekdays","extendCollectionElementsWithId","insertCollectionIntoState","EffectHandlers","Symbol","registerEffectCallbacks","instance","untilDestroyed","handlers","item","callback","call","EffectHandler","args","serviceDestroyed","takeWhile","ngOnDestroy","EffectCallback","service","property","descriptor","Map","FileLinksStore","FileLinksResourceService","updateCollectionsForWorkPackage","fileLinksSelfLink","fileLink","storage","group$","seed","fileLinks","fileLinkCollections","storageId","idFromLink","group","updateCollection","addFileLinks","addFileLinksHref","filesToLink","originData","newFileLinks","link","NOTIFICATIONS_MAX_SIZE","markNotificationsAsRead","props","markNotificationsAsReadByFilters","notificationsMarkedRead","notificationCountIncreased","centerUpdatedInPlace","InAppNotificationsStore","InAppNotificationsResourceService","inAppNotification","markAsRead","readIAN","isDefinedEntity","entity","PrincipalsStore","PrincipalsResourceService","ProjectStoragesStore","ProjectStoragesResourceService","ProjectsStore","ProjectsResourceService","QueryEntity","buildResourceLink","collectionExists","resourceLoading","loadedCollection","requireEntity","hasEntity","lookup","fetchEntity","collectionState","selectMany","selectEntity","lookupMany","getValue","loadingResources","omit","fetchResults","handleErrors","setResourceLoading","finalize","removeResourceLoading","handleResourceLoadingError","_path","mapHALCollectionToIDCollection","collectionUrl","upsertMany","entityId","self","StorageFilesStore","resettable","StorageFilesResourceService","httpClient","ancestors","storageFiles","insert","uploadLink","method","reset","fileIds","parentId","ancestorIds","StoragesStore","StoragesResourceService","storageLinks","storageCollection","ViewsStore","ViewsResourceService","StatesGroup","multiInput","posts","placeholderUsers","changes","forResource","camelCase","isHttpResponse","HttpEventType","Response","o","backlogsPageComponentSelector","BacklogsPageComponent","ngOnInit","getElementById","hidden","selectors","decls","vars","template","BacklogsPageComponent_Template","rf","ctx","styles","encapsulation","BcfResourcePath","BcfResourceCollectionPath","BcfApiRequestService","HttpParams","encoder","URLParamsEncoder","fromObject","_request","deserialize","throwError","TypedJSON","BcfProjectResource","jsonMember","jsonObject","BcfTopicAuthorizationMap","jsonArrayMember","BcfTopicResource","preserveNull","deserializer","serializer","BcfViewpointSelectionPath","bcfViewpointsService","BcfViewpointVisibilityPaths","BcfViewpointPaths","selection","visibility","BcfViewpointCollectionPath","bcfViewpointService","BcfTopicPaths","bcfTopicService","comments","viewpoints","BcfTopicCollectionPath","BcfExtensionResource","BcfExtensionPaths","bcfExtensionService","BcfProjectPaths","bcfProjectService","topics","extensions","BcfApiService","bcfApiVersion","bcfApiBase","pathOrId","ViewerBridgeService","StateService","BcfPathHelperService","projectImportIssuePath","projectExportIssuesPath","snapshotPath","ViewpointsService","getViewPointResource","workPackage","index","viewpointHref","bcfViewpoints","bcfApi","getViewPoint$","viewpointResource","components","deleteViewPoint$","saveViewpoint$","projectLink","wpProjectId","topicUUID$","setBcfTopic$","viewpoint$","viewerBridge","getViewpoint$","topicUUID","topicHref","bcfTopic","createBcfTopic$","wpPayload","convertBCF","guid","BcfThumbnailDisplayField","DisplayField","render","displayText","innerHTML","bcfPathHelper","BcfDetectorService","isBcfActivated","BcfAuthorizationService","authorizationMap","authorized$","extension","putFromPromiseIfPristine","includes","isAllowedTo","BcfWpAttributeGroupComponent_ng_container_0_div_5_Template_ngx_gallery_change_1_listener","$event","_r4","ctx_r3","onGalleryChanged","BcfWpAttributeGroupComponent_ng_container_0_div_5_Template_ngx_gallery_imagesReady_1_listener","ctx_r5","selectViewpointInGallery","BcfWpAttributeGroupComponent_ng_container_0_div_5_Template_ngx_gallery_previewOpen_1_listener","ctx_r6","galleryPreviewOpen","BcfWpAttributeGroupComponent_ng_container_0_div_5_Template_ngx_gallery_previewClose_1_listener","ctx_r7","galleryPreviewClose","ctx_r1","galleryOptions","galleryImages","BcfWpAttributeGroupComponent_ng_container_0_a_6_Template_a_click_0_listener","_r9","ctx_r8","saveViewpoint","ctx_r2","text","add_viewpoint","BcfWpAttributeGroupComponent_ng_container_0_div_5_Template","BcfWpAttributeGroupComponent_ng_container_0_a_6_Template","ctx_r0","bcf","viewerVisible","createAllowed","BcfWpAttributeGroupComponent","UntilDestroyedMixin","bcfAuthorization","wpCreate","bcfViewer","cdRef","viewpointsService","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","viewAllowed","ngAfterViewInit","observeChanges","viewerVisible$","visible","detectChanges","_this","_ref","_asyncToGenerator","refreshViewpoints","_x","apply","arguments","_this2","loadViewpointFromRoute","snapshotURL","setViewpointsOnGallery","showViewpoint","shouldShowViewer","currentViewerState","deleteViewpoint","confirm","addSuccess","gallery","preview","close","showIndex","go","reload","shouldShowGroup","icon","onClick","titleText","addClass","removeClass","show","setThumbnailProperties","small","medium","big","viewpointCount","dynamicThumbnailHeight","max","round","i5","i6","i7","i8","i9","viewQuery","BcfWpAttributeGroupComponent_Query","NgxGalleryComponent","consts","BcfWpAttributeGroupComponent_Template","BcfWpAttributeGroupComponent_ng_container_0_Template","BcfNewWpAttributeGroupComponent_ng_container_0_div_5_Template_ngx_gallery_change_1_listener","BcfNewWpAttributeGroupComponent_ng_container_0_div_5_Template_ngx_gallery_imagesReady_1_listener","BcfNewWpAttributeGroupComponent_ng_container_0_div_5_Template_ngx_gallery_previewOpen_1_listener","BcfNewWpAttributeGroupComponent_ng_container_0_div_5_Template_ngx_gallery_previewClose_1_listener","BcfNewWpAttributeGroupComponent_ng_container_0_a_6_Template_a_click_0_listener","BcfNewWpAttributeGroupComponent_ng_container_0_div_5_Template","BcfNewWpAttributeGroupComponent_ng_container_0_a_6_Template","BcfNewWpAttributeGroupComponent","galleryViewpoints","observeCreation","onNewWorkPackage","viewPointItem","_workPackage","_index","newViewpoint","snapshot","snapshot_data","features","BcfNewWpAttributeGroupComponent_Template","BcfNewWpAttributeGroupComponent_ng_container_0_Template","RevitBridgeService","revitMessageReceivedSource","trackingIdNumber","revitMessageReceived$","RevitBridge","hookUpRevitListener","once","trackingId","newTrackingId","sendMessageToRevit","messageType","viewpointJson","messagePayload","hasOwnProperty","snapshot_type","sendMessageToOpenProject","messageString","viewerBridgeServiceFactory","navigator","userAgent","IFCViewerService","OpenprojectBcfModule","bootstrapCalled","DisplayFieldService","addFieldType","HookService","provide","useFactory","deps","Injector","imports","OpSharedModule","NgxGalleryModule","declarations","BcfImportButtonComponent","BcfExportButtonComponent","RefreshButtonComponent","exports","XeokitServer","ifcModels","ifc_models","getProjects","done","_error","getProject","projectData","models","viewerContent","modelsLoaded","shown_models","viewerConfigs","getGeometry","attachmentId","xkt_attachment_ids","log","utils","loadArraybuffer","inspectorVisible$","newViewer","server","viewerUI","BIMViewer","on","loadProject","currentProjectService","formData","FormData","append","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","queryUrlParamsHelper","opModalService","export","export_hover","buildV3GetFilters","exportLink","showDelayedExport","WpTableExportModalComponent","BcfExportButtonComponent_Template","BcfExportButtonComponent_Template_a_click_0_listener","import","import_hover","handleClick","BcfImportButtonComponent_Template","BcfImportButtonComponent_Template_a_click_0_listener","refresh_hover","RefreshButtonComponent_Template","RefreshButtonComponent_Template_a_click_0_listener","BoardService","CurrentProject","currentBoard$","unnamed_board","action_board","unnamed_list","loadAllBoards","loadAllPromise","canManage","reorderWidgets","columnCount","CausedUpdatesService","causedUpdates","cacheValue","splice","updatedAt","items_r2","BoardsMenuComponent_button_4_Template_button_click_0_listener","redirectToNewBoardForm","create_new_board","boardsMenuSelector","BoardsMenuComponent","boardService","mainMenuService","className","boardOptions$","title","uiSref","uiParams","board_id","query_props","uiOptions","localeCompare","canCreateBoards$","focusBackArrow","hostVars","hostBindings","BoardsMenuComponent_HostBindings","BoardsMenuComponent_op_sidemenu_1_Template","BoardsMenuComponent_button_4_Template","calendarRefreshRequest","OpCalendarService","weekdayService","dayService","resize$","resizeObserver","v","resizeObs","ResizeObserver","nativeElement","applyNonWorkingDay","utcDate","utc","formatted","OpWorkPackagesCalendarService","MAX_DISPLAYED","sanitizer","$state","wpTableFilters","wpListService","wpListChecksumService","urlParamsHelper","uiRouterGlobals","timezoneService","halEditing","wpTableSelection","contextMenuService","calendarService","currentWorkPackages$","calendarOptions","additionalOptions","defaultOptions","eventDate","isMilestone","warnOnTooManyResults","isStatic","tooManyResultsText","addNotice","requireNonWorkingDays","updateTimeframe","fetchInfo","areFiltersEmpty","startDate","endDate","urlParams","query_id","initializingWithQuery","initialQuery","generateQueryProps","initializingWithQueryProps","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","hi","cdate","currentStart","custom","notify","updateDates","resizeInfo","dragged","extendedProps","changeset","edit","ignoreNonWorkingDays","duration","setValue","due","endStr","startStr","i10","i11","i12","i13","i14","i15","i16","i17","i18","i19","i20","i21","backButtonCallback","definition_r4","containerClasses","component","inputs","outputs","WorkPackagesCalendarPageComponent_ul_5_ng_container_1_li_1_Template","WorkPackagesCalendarPageComponent_ul_5_ng_container_1_Template","toolbarButtonComponents","filterContainerDefinition","WorkPackagesCalendarPageComponent","PartitionedQuerySpacePageComponent","unsaved_title","selectedTitle","WorkPackageFilterContainerComponent","currentPartition","showToolbar","titleEditingEnabled","showToolbarSaveButton","toolbarDisabled","OpProjectIncludeComponent","WorkPackageFilterButtonComponent","ZenModeButtonComponent","WorkPackageSettingsButtonComponent","hideTableOptions","showCalendarSharingOption","setPartition","partition","staticQueryName","_query","loadInitialQuery","visibly","_firstPage","showLoading","WorkPackagesCalendarPageComponent_Query","WorkPackagesCalendarComponent","QueryParamListenerService","WorkPackagesCalendarPageComponent_Template","WorkPackagesCalendarPageComponent_op_back_button_3_Template","WorkPackagesCalendarPageComponent_Template_editable_toolbar_title_onSave_4_listener","changeChangesFromTitle","WorkPackagesCalendarPageComponent_Template_editable_toolbar_title_onEmptySubmit_4_listener","updateTitleName","WorkPackagesCalendarPageComponent_ul_5_Template","WorkPackagesCalendarPageComponent_ndc_dynamic_7_Template","CALENDAR_ROUTES","redirectTo","WorkPackagesBaseComponent","dynamic","bodyClasses","baseRoute","makeSplitViewRoutes","WorkPackageSplitViewComponent","OpenprojectCalendarModule","UIRouterModule","forChild","OpenprojectWorkPackagesModule","OpenprojectTimeEntriesModule","OpenprojectFieldsModule","FullCalendarModule","ReactiveFormsModule","TimeEntryCalendarComponent","CalendarSidemenuComponent","QueryGetIcalUrlModalComponent","createButton","create_new_calendar","opCalendarSidemenuSelector","elementRef","menuItems","canCreateCalendar$","calendar","populateInputsFromDataset","CalendarSidemenuComponent_HostBindings","CalendarSidemenuComponent_button_2_Template","TimeEntryCalendarComponent_button_1_Template_button_click_0_listener","_r3","addEventToday","logTime","calendarOptions_r4","TimeEntryCalendarComponent_ng_container_2_full_calendar_1_Template","TIME_ENTRY_CLASS_NAME","ADD_ENTRY_CLASS_NAME","ADD_ENTRY_PROHIBITED_CLASS_NAME","displayedDays","initializeCalendar","displayedDayss","Date","hiddenDays","setHiddenDays","calendarOptions$","timeEntryEdit","timeEntryCreate","colors","browserDetector","static","entries","EventEmitter","minHour","maxHour","labelIntervalHours","scaleRatio","memoizedCreateAllowed","buttonText","contentHeight","slotEventOverlap","slotLabelInterval","slotLabelFormat","info","hour","allDaySlot","displayEventTime","slotMinTime","slotMaxTime","events","calendarEventsFunction","eventOverlap","stillEvent","classNames","plugins","timeGrid","interactionPlugin","eventDidMount","alterEventEntry","eventWillUnmount","beforeEventRemove","eventClick","dispatchEventClick","eventDrop","moveEvent","successCallback","failureCallback","_this3","fetchTimeEntries","_ref2","emit","buildEntries","memoizedTimeEntries","valueOf","dmFilters","createTimeEntry","_this4","setRatio","buildTimeEntryEntries","buildAuxEntries","dateSums","calculateDateSums","maxHours","oldRatio","smallerSuitableRatio","ucCalendar","getApi","setOption","hoursDistribution","hours","spentOn","clone","timeEntry","calendarEntries","m","sumEntry","addEntry","color","toHsl","entryName","span","startEditable","backgroundColor","borderColor","min","rendering","sum","editEvent","addEvent","showUserField","modificationAction","updateEventSet","updated","handleRawError","revert","foundIndex","x","refetchEvents","appendAddIcon","appendSum","addTooltip","prependDuration","appendFadeout","addIcon","createElement","innerText","_this5","tooltip","content","tooltipContentString","items","track","removeTooltip","$element","fadeout","hslaStart","toHsla","hslaEnd","css","workPackageName","sanitizedValue","activity","comment","sanitize","SecurityContext","HTML","formatNumber","precision","divisor","candidate","TimeEntryCalendarComponent_Query","FullCalendarComponent","TimeEntryEditService","TimeEntryCreateService","HalResourceEditingService","TimeEntryCalendarComponent_Template","TimeEntryCalendarComponent_button_1_Template","TimeEntryCalendarComponent_ng_container_2_Template","calendarOptions_r2","WorkPackagesCalendarComponent_ng_container_1_full_calendar_1_Template","workPackagesCalendar","ucCalendarElement","halNotification","alreadyLoaded","cannot_drag_to_non_working_day","debounceTime","updateSize","stopAllSubscriptions","updateResults","buildHeader","eventSources","background","textColor","display","dayGridPlugin","selectable","handleDateClicked","eventResizableFromStart","source","eventResize","toDate","updateEvent","dropInfo","eventResizeStart","addBackgroundEventsForNonWorkingDays","eventResizeStop","removeBackgroundEvents","eventDragStart","dragInfo","eventDragStop","removeProperty","openContextMenu","eventContainer","mapToCalendarEvents","exclusiveEnd","subject","durationEditable","allDay","showSave","wasNew","reloadOnRefreshRequest","projectedResource","defaults","dueDate","addBackgroundEvents","WorkPackagesCalendarComponent_Query","ElementRef","WorkPackagesCalendarComponent_Template","WorkPackagesCalendarComponent_Template_div_contextmenu_0_listener","WorkPackagesCalendarComponent_ng_container_1_Template","WorkPackagesCalendarComponent_div_3_Template","EEActiveTrialBase","label_email","label_expires_at","label_maximum_users","label_company","label_domain","label_starts_at","label_subscriber","text_expired","text_reprieve_days_left","company","domain","userCount","startsAt","expiredWarningText","EEActiveTrialComponent_div_17_span_5_Template","ctx_r4","expiresAt","isExpired","EEActiveTrialComponent","Gon","eeTrialService","subscriber","userData$","formatUserData","eeTrialKey","trialLink","baseUrlAugur","getUserDataFromAugur","EXTERNAL_REQUEST_HEADER","retryConfirmation","getToken","userForm","first_name","last_name","email","EEActiveTrialComponent_Template","EEActiveTrialComponent_div_13_Template","EEActiveTrialComponent_div_14_Template","EEActiveTrialComponent_div_15_Template","EEActiveTrialComponent_div_16_Template","EEActiveTrialComponent_div_17_Template","localizeLink","field_r2","emailError","EETrialFormComponent_div_19_Template_input_blur_5_listener","_r6","checkMailField","EETrialFormComponent_div_19_div_6_Template","_c0","domain_mismatch","field_r7","domainError","EETrialFormComponent_div_21_p_7_Template","EETrialFormComponent_div_21_p_8_Template","requestHost","configuredHost","EETrialFormComponent","formBuilder","userData","host","trialForm","Validators","required","general_consent","newsletter_consent","link_terms","link_privacy","label_test_ee","label_first_name","label_last_name","privacy_policy","receive_newsletter","terms_of_service","controls","errors","emailInvalid","EETrialFormComponent_Template","EETrialFormComponent_div_19_Template","EETrialFormComponent_div_21_Template","_c1","emailError$","_c2","domainTaken$","quick_overview","trustedEEVideoURL","EnterpriseTrialModalComponent_div_9_div_2_Template_button_click_1_listener","closeModal","EnterpriseTrialModalComponent_div_9_div_2_Template_button_click_2_listener","ctx_r10","onSubmit","button_cancel","invalid","button_submit","context_r4","status","cancelled","EnterpriseTrialModalComponent_div_9_ng_template_3_button_2_Template_button_click_0_listener","_r14","ctx_r13","ctx_r12","button_continue","EnterpriseTrialModalComponent_div_9_ng_template_3_Template_button_click_1_listener","_r16","ctx_r15","startEnterpriseTrial","EnterpriseTrialModalComponent_div_9_ng_template_3_button_2_Template","confirmed","EnterpriseTrialModalComponent_div_9_div_2_Template","EnterpriseTrialModalComponent_div_9_ng_template_3_Template","EnterpriseTrialModalComponent","OpModalComponent","locals","domSanitizer","close_popup","heading_confirmation","heading_next_steps","heading_test_ee","headerText$","observe$","showState$","trustedURL","formComponent","valid","addControl","UntypedFormControl","sendForm","setStartTrialStatus","closeMe","modalOpen","bypassSecurityTrustResourceUrl","OpModalLocalsToken","EnterpriseTrialModalComponent_Query","EnterpriseTrialModalComponent_div_6_Template","EnterpriseTrialModalComponent_div_7_Template","EnterpriseTrialModalComponent_div_8_Template","EnterpriseTrialModalComponent_div_9_Template","status$","cancelled$","confirmed$","EETrialWaitingComponent_div_0_span_7_Template_button_click_2_listener","_r7","resendMail","status_waiting","resend","session_timeout","status_confirmed","EETrialWaitingComponent_div_0_span_7_Template","EETrialWaitingComponent_div_0_span_8_Template","EETrialWaitingComponent_div_0_ng_template_9_Template","confirmation_info","created","status_label","context_r1","EETrialWaitingComponent","resend_success","resend_warning","ee_trial_key","savedDateStr","resendLink","EETrialWaitingComponent_Template","EETrialWaitingComponent_div_0_Template","EnterpriseTrialStore","EnterpriseTrialService","invalid_email","errorResponse","taken_email","taken_domain","augur_url","tokenVersion","token_version","setMailSubmittedStatus","enterpriseTrial","saveTrialKey","description","addWarning","res","token_retrieved","saveToken","token","resendlink","trialKey","trial_key","enterprise_token","encoded_token","delay","retries","freeTrialButtonSelector","FreeTrialButtonComponent","button_trial","openTrialModal","trialRequested","FreeTrialButtonComponent_Template","FreeTrialButtonComponent_Template_button_click_1_listener","HalLink","requestMethod","templated","$fetch","$prepare","templateValues","regexp","RegExp","$callable","linkFunc","extend","$link","OpenprojectHalModuleHelpers","cloneHalResourceCollection","$copy","cloneHalResource","initializeHalProperties","halResource","asHalResource","loaded","createHalResource","setupProperty","instanceName","sourceName","sourceObj","isObject","propName","lazy","setter","linkName","isArray","setSource","setupLinks","l","setupEmbedded","child","proxyProperties","$embeddableKeys","defineProperty","enumerable","configurable","setLinksAsProperties","$linkableKeys","createLinkedResource","ObservableArray","setEmbeddedAsProperties","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","attachmentsBackend","MeetingContentResource","PostBaseResource","PostResource","TimeEntryResource","without","NewsResource","MembershipResource","GroupResource","RootResource","TypeResource","QueryOperatorResource","FormResource","getErrors","validationErrors","halInitializer","errorIdentifier","v3ErrorIdentifierMultipleErrors","isValidationError","HelpTextBaseResource","HelpTextResource","SchemaDependencyResource","forValue","dependencies","QueryFilterInstanceSchemaResource","availableOperators","operator","allowedValues","allowedFilterValue","$initialize","_dependencies","dependency","getFilter","definesAllowedValues","QueryFilterInstanceResource","isValueRequired","isResourceValue","loadedAllowedValues","resultingSchema","staticSchema","dependentSchema","merge","some","WorkPackageCollectionResource","halResourceDefaultConfig","WorkPackage","WorkPackageResource","attrTypes","children","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","GridWidgetResource","TimeEntry","Membership","News","Version","VersionResource","initializeHalResourceConfig","registerResource","OpenprojectHalModule","useClass","APP_INITIALIZER","multi","HalResourceNotificationService","CommonModule","updateElements","$load","v3ErrorIdentifierOutboundRequestForbidden","v3ErrorIdentifierMissingEnterpriseToken","isHalError","err","hasOwn","prototype","isMultiErrorMessage","getInvolvedAttributes","columns","details","flatten","extractMultiError","getMessagesPerAttribute","perAttribute","messages","GridBaseResource","widgetResource","updateAttachments","$update","$loaded","$halType","getEmptyResource","matchFromLink","expectedResource","match","exec","retainFrom","other","__initialized_at","$plain","cloneDeep","$isHal","_name","previewPath","getEditorContext","fieldName","$loadResource","valuesPromise","$self","properties","Base","canAddAttachments","addAttachment","lookupDownloadLocationByName","staticDownloadLocation","macros","memoizedCurrentSchemas","currentSchema","isCompletelyDefined","findOperator","operatorSymbol","isTemplated","flag","newId","setSortBy","newSortBy","QUERY_SORT_BY_ASC","QUERY_SORT_BY_DESC","RELATION_TYPES","includeParentChild","LOCALIZED_RELATION_TYPES","includeParentchild","label","DEFAULT","normalizedType","denormalized","relationType","targetId","reverseType","reverseRelationType","isInvolved","updateDescription","updateType","availableAttributes","attributeFromLocalizedName","fieldSchema","active_user_statuses","showUserPath","showUser","isLocked","isOpen","isClosed","WorkPackageBaseResource","getAncestors","subjectWithType","truncateSubject","subjectWithId","truncate","disabledMentions","isParentOf","otherWorkPackage","updateLinkedResources","resourceNames","resources","linked","wpCacheService","wpActivity","WorkPackagesActivityService","WorkPackageNotificationService","nonLinkProperties","writable","Proxy","receiver","proxyMethod","ofProperty","mappedName","isEditable","Reflect","propertySchema","__","argumentsList","isReadonly","readonly","setPrototypeOf","HalEventsService","_events","events$","aggregated$","resourceType","debounceTimeInMs","buffer","resourceReference","isCreate","handleErrorResponse","errorBody","retrieveError","showGeneralError","retrieveErrorMessage","errorResource","showError","showApiErrorMessages","showCustomError","showEditingBlockedError","attributeName","i18nString","toLowerCase","HalResourceSortingService","halType","sortingProperty","hasSortingProperty","performRequest","whenDebugging","createErrorObservable","requestParams","toEprops","put","defaultClass","getResourceClassOfType","fromLink","fromSelfLink","fromType","toType","getResourceClassOfAttribute","typeConfig","deflatedArray","Pako","eprops","base64","encodeKey","encodeURIComponent","encodeValue","decodeKey","decodeValue","homescreenNewFeaturesBlockSelector","HomescreenNewFeaturesBlockComponent","hasBimChanges","new_features_image","imagePath","newFeatures","descriptionNewFeatures","learnAbout","teaserWebsiteUrl","translated","currentNewFeatureHtml","translatedEdition","list_styling_class","bcf_api_link","HomescreenNewFeaturesBlockComponent_Template","unreadCountText$","InAppNotificationBellComponent_ng_container_2_span_1_Template","unreadCount_r1","opInAppNotificationBellSelector","InAppNotificationBellComponent","storeService","activeWindow","interval","polling$","timer","throttleTime","fetchUnread","unreadCount$","unread$","InAppNotificationBellComponent_Template","InAppNotificationBellComponent_ng_container_2_Template","IanBellQuery","unreadCountIncreased$","pairwise","last","curr","IanBellStore","totalUnread","IanBellService","resourceService","skip","IAN_FACET_FILTERS","reloadOnNotificationRead","IAN_MENU_PROJECT_FILTERS","IAN_MENU_REASON_FILTERS","IanMenuStore","notificationsByProject","notificationsByReason","projectsFilter","IanMenuService","ianResourceService","projectsResourceService","projectsFilter$","projectsForNotifications$","filterParams","notificationsByProject$","notification","p","valueLink","projectHasParent","notificationsByReason$","checkForNewNotifications","ianMenuSelector","getUiLinkForFilters","IanMenuComponent","ianMenuService","bannersService","baseMenuItems","reasonMenuItems","isEnterprise","eeGuardedDateAlertRoute","reason","menuItems$","byProject","byReason","baseMenuItem","collapsible","button_close","no_results","inherit","IanMenuComponent_HostBindings","IanMenuComponent_Template","IanCenterStore","createInitialState","page","activeCollection","activeFacet","notLoaded","IanCenterService","hasFilters","activeFacet$","notLoaded$","activeCollection$","activeReason$","params$","loading$","selectLoading","selectNotifications$","defaultIfEmpty","aggregatedCenterNotifications$","notifications$","hasNotifications$","hasMoreThanPageSize$","activeReloadToast","onReload","setToLoading","setLoading","sideLoadInvolvedWorkPackages","selectedNotificationIndex","stateChanged$","pluck","updateSelectedNotification","setFilters","setFacet","selectedNotification","goToCenter","markAllAsRead","openSplitScreen","showNextNotification","allInOldCollection","activeID","compact","UIRouterGlobals","InAppNotificationStatusComponent","ngOnChanges","highlightClass","Highlighting","backgroundClass","currentValue","InAppNotificationStatusComponent_Template","and","InAppNotificationActorsLineComponent_ng_container_3_span_1_Template","InAppNotificationActorsLineComponent_ng_container_3_span_3_Template","last_r4","actors","actor_r2","idx_r3","text_for_additional_authors","InAppNotificationActorsLineComponent","and_other_singular","and_other_plural","loading","placeholder","mark_as_read","updated_by_at","age","buildActors","buildTime","number","fixedTime","relativeTime$","aggregatedNotifications","actor","uniqBy","InAppNotificationActorsLineComponent_HostBindings","InAppNotificationActorsLineComponent_ng_container_3_Template","InAppNotificationActorsLineComponent_span_5_Template","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","InAppNotificationDateAlertComponent_HostBindings","InAppNotificationEntryComponent_ng_container_1_div_5_Template_a_click_2_listener","_r10","ctx_r9","projectClicked","showUrl","InAppNotificationEntryComponent_ng_container_1_span_7_ng_container_2_Template","item_r11","last_r13","InAppNotificationEntryComponent_ng_container_1_i_11_Template_i_click_0_listener","workPackage_r3","ctx_r18","ctx_r19","InAppNotificationEntryComponent_ng_container_1_ng_container_17_op_in_app_notification_date_alert_1_Template","InAppNotificationEntryComponent_ng_container_1_ng_container_17_op_in_app_notification_actors_line_2_Template","context_r17","showDateAlert","InAppNotificationEntryComponent_ng_container_1_div_5_Template","InAppNotificationEntryComponent_ng_container_1_span_7_Template","InAppNotificationEntryComponent_ng_container_1_span_9_Template","InAppNotificationEntryComponent_ng_container_1_i_11_Template","InAppNotificationEntryComponent_ng_container_1_Template_i_keydown_enter_12_listener","_r22","ctx_r21","showDetails","InAppNotificationEntryComponent_ng_container_1_ng_container_17_Template","translatedReasons","showDateAlert$","InAppNotificationEntryComponent_ng_template_3_op_content_loader_1_Template","workPackage$","InAppNotificationEntryComponent","dateAlertFiltered","buildTranslatedReason","buildProject","loadWorkPackage","clearTimeout","clickTimer","withLatestFrom","openDetailsTab","tab","onDoubleClick","showFullView","reasons","translatedReason","defaultValue","InAppNotificationEntryComponent_HostBindings","InAppNotificationEntryComponent_Template_div_click_0_listener","InAppNotificationEntryComponent_Template_div_dblclick_0_listener","InAppNotificationEntryComponent_ng_container_1_Template","InAppNotificationEntryComponent_ng_template_3_Template","_r1","records_r8","expanded","InAppNotificationCenterComponent_ng_container_4_ng_container_1_op_in_app_notification_entry_2_Template","trackNotificationGroups","with_current_filter","at_all","change_notification_settings","InAppNotificationCenterComponent_ng_container_4_ng_template_3_span_5_Template","InAppNotificationCenterComponent_ng_container_4_ng_template_3_ng_container_7_Template","no_notification","noNotificationText","totalCount$","InAppNotificationCenterComponent_ng_container_4_ng_container_1_Template","InAppNotificationCenterComponent_ng_container_4_ng_template_3_Template","_r5","totalCountWarning$","InAppNotificationCenterComponent","bellService","apiV3","pathService","maxSize","newest_count","more_count","selectedFilter","no_selection","no_notification_with_current_filter_project","no_notification_with_current_filter","hasNotifications","InAppNotificationCenterComponent_Template","InAppNotificationCenterComponent_ng_container_4_Template","InAppNotificationCenterComponent_ng_template_6_Template","InAppNotificationCenterComponent_p_9_Template","NotificationSettingsButtonComponent","myNotificationSettingsLink","mySettings","NotificationSettingsButtonComponent_Template","ActivateFacetButtonComponent_ng_container_0_Template_button_click_1_listener","facet_r1","$implicit","activateFacet","facet_titles","facets","ActivateFacetButtonComponent","availableFacets","ActivateFacetButtonComponent_Template","ActivateFacetButtonComponent_ng_container_0_Template","MarkAllAsReadButtonComponent","mark_all_read","markAllRead","MarkAllAsReadButtonComponent_Template","MarkAllAsReadButtonComponent_Template_button_click_0_listener","InAppNotificationCenterPageComponent_ul_5_ng_container_1_li_1_Template","InAppNotificationCenterPageComponent_ul_5_ng_container_1_Template","InAppNotificationCenterPageComponent","$transitions","backRoutingService","documentReferer","setInitialHtmlTitle","removeTransitionSubscription","onSuccess","_val","currentTitleParts","InAppNotificationCenterPageComponent_Template","InAppNotificationCenterPageComponent_op_back_button_3_Template","InAppNotificationCenterPageComponent_Template_editable_toolbar_title_onSave_4_listener","InAppNotificationCenterPageComponent_Template_editable_toolbar_title_onEmptySubmit_4_listener","InAppNotificationCenterPageComponent_ul_5_Template","InAppNotificationCenterPageComponent_ndc_dynamic_7_Template","InAppNotificationsDateAlertsUpsaleComponent","video","videoPath","__webpack_public_path__","InAppNotificationsDateAlertsUpsaleComponent_Template","IAN_ROUTES","EmptyStateComponent_ng_container_2_ng_container_1_Template","EmptyStateComponent_ng_container_2_ng_template_3_Template","EmptyStateComponent","EmptyStateComponent_Template","EmptyStateComponent_ng_container_2_Template","EmptyStateComponent_ng_template_4_Template","OpenProjectInAppNotificationsModule","DynamicModule","IconModule","OpenprojectPrincipalRenderingModule","OpenprojectContentLoaderModule","ScrollingModule","InviteUserButtonComponent_button_0_Template_button_click_0_listener","_r2","onAddNewClick","button","InviteUserButtonComponent","opInviteUserModalService","autocompleter","canInviteUsersToProject$","open","closeSelect","InviteUserButtonComponent_Template","InviteUserButtonComponent_button_0_Template","InviteUserButtonModule","OpInviteUserModalService","InviteUserModalComponent","closingEvent","Steps","PrincipalType","InviteUserModalComponent_op_ium_project_selection_1_Template_op_ium_project_selection_save_0_listener","onProjectSelectionSave","InviteUserModalComponent_op_ium_project_selection_1_Template_op_ium_project_selection_close_0_listener","InviteUserModalComponent_op_ium_principal_2_Template_op_ium_principal_save_0_listener","onPrincipalSave","InviteUserModalComponent_op_ium_principal_2_Template_op_ium_principal_back_0_listener","goTo","ProjectSelection","InviteUserModalComponent_op_ium_principal_2_Template_op_ium_principal_close_0_listener","ctx_r11","principalData","InviteUserModalComponent_op_ium_summary_3_Template_op_ium_summary_save_0_listener","_r13","onSuccessfulSubmission","InviteUserModalComponent_op_ium_summary_3_Template_op_ium_summary_back_0_listener","ctx_r14","Principal","InviteUserModalComponent_op_ium_summary_3_Template_op_ium_summary_close_0_listener","InviteUserModalComponent_op_ium_success_4_Template_op_ium_success_close_0_listener","_r17","ctx_r16","closeWithPrincipal","createdNewPrincipal","step","customFields","markForCheck","isAlreadyMember","Summary","Success","InviteUserModalComponent_Template","InviteUserModalComponent_div_0_Template","InviteUserModalComponent_op_ium_project_selection_1_Template","InviteUserModalComponent_op_ium_principal_2_Template","InviteUserModalComponent_op_ium_summary_3_Template","InviteUserModalComponent_op_ium_success_4_Template","statusIcon","htmlContent","error_r6","redirect_errors","redirect_link","redirect","JobStatusModalComponent_ng_container_14_ul_2_Template","JobStatusModalComponent_ng_container_14_p_3_Template","JobStatusModalComponent","loadingIndicator","sanitization","closePopup","download_starts","click_to_download","isLoading","downloadHref","jobId","listenOnJobStatus","retry","continuedStatus","onResponse","complete","iconForStatus","statusText","handleRedirect","handleDownload","download","handleHTML","html","bypassSecurityTrustHtml","redirectionUrl","downloadLink","click","jobUrl","JobStatusModalComponent_Query","JobStatusModalComponent_div_6_Template","JobStatusModalComponent_ng_container_13_Template","JobStatusModalComponent_ng_container_14_Template","hooks","ProjectsComponent","_pathHelperService","_$state","_currentProjectService","formMethod","hiddenFields","dynamicFieldsSettingsPipe","dynamicFieldsSettings","formattedDynamicFieldsSettings","dynamicFormField","isFieldHidden","hide","ProjectsComponent_Template","NewProjectComponent","templateControl","templateForm","uIRouterGlobals","pathHelperService","modalService","fieldSettingsPipe","initialPayload","use_template","no_template_selected","advancedSettingsLabel","copySettingsLabel","copyableTemplateFilter","templateOptions$","UntypedFormGroup","resourcePath","fieldGroups","fieldsFilter","field","templateOptions","isMeta","hasDefault","payloadValue","parent_id","setParentAsPayload","onSubmitted","onTemplateSelected","selected","dynamicForm","model","sendNotifications","formUrl","isHiddenField","NewProjectComponent_Query","DynamicFormComponent","NewProjectComponent_Template_ng_select_ngModelChange_3_listener","NewProjectComponent_Template_op_dynamic_form_submitted_5_listener","CopyProjectComponent","isPrimaryAttribute","sortedCopyFields","fieldA","fieldB","nonCopyFields","CopyProjectComponent_Template","CopyProjectComponent_Template_op_dynamic_form_submitted_0_listener","PROJECTS_ROUTES","uiRouterProjectsConfiguration","uiRouter","urlService","rules","when","OpenprojectProjectsModule","NgSelectModule","DynamicFormsModule","nonWorkingDay","currentStartDate","activeStart","currentEndDate","activeEnd","getTime","getEvents","opTeamPlannerSidemenuSelector","TeamPlannerSidemenuComponent","canAddTeamPlanner$","TeamPlannerSidemenuComponent_HostBindings","TeamPlannerSidemenuComponent_button_2_Template","BackButtonComponent","goBack","customBackMethod","linkClass","BackButtonComponent_Template","BackButtonComponent_Template_button_click_0_listener","BackRoutingService","goToOtherState","route","goBackToDetailsState","preferListOverSplit","backRoute","keepTab","currentDetailsTab","goBackNotToDetailsState","goBackToPreviousState","isDetailsState","goToBaseState","sync","transition","fromState","toState","paramsFromCopy","_backRoute","KeepTabService","WorkPackageEditActionsBarComponent","editForm","onSave","onCancel","_saving","cancel","saving","active","submit","WorkPackageEditActionsBarComponent_Template","WorkPackageEditActionsBarComponent_Template_button_click_1_listener","WorkPackageEditActionsBarComponent_Template_button_click_4_listener","AbstractDateTimeValueController","isoDateParser","isoDateFormatter","isTimeZoneDifferent","lowerBoundary","upperBoundary","minutes","timeZoneText","FilterBooleanValueComponent","shouldFocus","filterChanged","onFilterUpdated","FilterBooleanValueComponent_Template","FilterBooleanValueComponent_Template_spot_switch_ngModelChange_1_listener","WorkPackageFilterContainerComponent_button_0_Template_button_click_0_listener","wpFiltersService","toggleVisibility","visible$","filterButtonText","WorkPackageFilterContainerComponent_div_2_op_query_filters_1_Template_op_query_filters_filtersChanged_0_listener","replaceIfComplete","WorkPackageFilterContainerComponent_div_2_op_query_filters_1_Template","showFilterButton","filtersChanged","DebouncedEventEmitter","componentDestroyed","pristine$","conditionallyLoadForm","available","isAvailable","WorkPackageFilterContainerComponent_Template","WorkPackageFilterContainerComponent_button_0_Template","WorkPackageFilterContainerComponent_div_2_Template","FilterDateTimeValueComponent","valueString","FilterDateTimeValueComponent_HostBindings","FilterDateTimeValueComponent_Template_op_basic_single_date_picker_valueChange_0_listener","FilterDateTimeValueComponent_span_1_Template","FilterDateTimesValueComponent","spacer","begin","parseBegin","validDate","parsed","parseEnd","formatter","FilterDateTimesValueComponent_HostBindings","FilterDateTimesValueComponent_Template_op_basic_single_date_picker_valueChange_0_listener","FilterDateTimesValueComponent_Template_op_basic_single_date_picker_valueChange_2_listener","FilterDateTimesValueComponent_span_3_Template","FilterDateValueComponent","valueChanged","parser","FilterDateValueComponent_HostBindings","FilterDateValueComponent_Template_op_basic_single_date_picker_valueChange_0_listener","FilterDatesValueComponent","FilterDatesValueComponent_HostBindings","FilterDatesValueComponent_Template_op_basic_range_date_picker_valueChange_0_listener","FilterIntegerValueComponent","FilterIntegerValueComponent_Template","FilterIntegerValueComponent_Template_input_ngModelChange_1_listener","FilterProjectComponent","additionalProjectApiFilters","projectID","onChange","FilterProjectComponent_Template","FilterProjectComponent_Template_op_project_autocompleter_change_1_listener","FilterSearchableMultiselectValueComponent","currentUser","ngZone","meValue","autocompleterFn","searchTerm","autocomplete","itemTracker","compareByHref","initialRequest$","loadCollection","matching","initialLoad","matchingItems","withMeValue","lowered","createFilters","allowedValuesLink","setValues","isUserResource","logged","FilterSearchableMultiselectValueComponent_Query","FilterSearchableMultiselectValueComponent_Template_op_autocompleter_change_1_listener","FilterStringValueComponent","enter_text","FilterStringValueComponent_Template","FilterStringValueComponent_Template_input_ngModelChange_1_listener","FilterToggledMultiselectValueComponent","halSorting","availableOptions","ngSelectInstance","FilterToggledMultiselectValueComponent_Query","FilterToggledMultiselectValueComponent_Template_op_autocompleter_change_1_listener","incompatible_filter","operator_r6","QueryFilterComponent_select_7_Template_select_ngModelChange_0_listener","_r8","QueryFilterComponent_select_7_option_1_Template","QueryFilterComponent_op_filter_boolean_value_8_Template_op_filter_boolean_value_filterChanged_0_listener","_r11","QueryFilterComponent_ng_container_9_op_filter_integer_value_2_Template_op_filter_integer_value_filterChanged_0_listener","QueryFilterComponent_ng_container_9_op_filter_date_value_3_Template_op_filter_date_value_filterChanged_0_listener","_r24","ctx_r23","QueryFilterComponent_ng_container_9_op_filter_dates_value_4_Template_op_filter_dates_value_filterChanged_0_listener","_r26","ctx_r25","QueryFilterComponent_ng_container_9_op_filter_date_time_value_5_Template_op_filter_date_time_value_filterChanged_0_listener","_r28","ctx_r27","QueryFilterComponent_ng_container_9_op_filter_date_times_value_6_Template_op_filter_date_times_value_filterChanged_0_listener","_r30","ctx_r29","QueryFilterComponent_ng_container_9_op_filter_string_value_7_Template_op_filter_string_value_filterChanged_0_listener","_r32","ctx_r31","ctx_r17","QueryFilterComponent_ng_container_9_op_filter_string_value_8_Template_op_filter_string_value_filterChanged_0_listener","_r34","ctx_r33","QueryFilterComponent_ng_container_9_op_filter_project_9_Template_op_filter_project_filterChanged_0_listener","_r36","ctx_r35","QueryFilterComponent_ng_container_9_ng_container_10_op_filter_toggled_multiselect_value_1_Template_op_filter_toggled_multiselect_value_filterChanged_0_listener","_r40","ctx_r39","ctx_r37","QueryFilterComponent_ng_container_9_ng_container_10_op_filter_searchable_multiselect_value_2_Template_op_filter_searchable_multiselect_value_filterChanged_0_listener","_r42","ctx_r41","ctx_r38","QueryFilterComponent_ng_container_9_ng_container_10_op_filter_toggled_multiselect_value_1_Template","QueryFilterComponent_ng_container_9_ng_container_10_op_filter_searchable_multiselect_value_2_Template","ctx_r20","QueryFilterComponent_ng_container_9_op_filter_integer_value_2_Template","QueryFilterComponent_ng_container_9_op_filter_date_value_3_Template","QueryFilterComponent_ng_container_9_op_filter_dates_value_4_Template","QueryFilterComponent_ng_container_9_op_filter_date_time_value_5_Template","QueryFilterComponent_ng_container_9_op_filter_date_times_value_6_Template","QueryFilterComponent_ng_container_9_op_filter_string_value_7_Template","QueryFilterComponent_ng_container_9_op_filter_string_value_8_Template","QueryFilterComponent_ng_container_9_op_filter_project_9_Template","QueryFilterComponent_ng_container_9_ng_container_10_Template","valueType","QueryFilterComponent","wpTableBaseline","bannerService","deactivateFilter","showValuesInput","baselineIncompatibleFilter","trackByHref","halHref","open_filter","close_filter","label_filter_add","upsale_for_more","upsale_link","button_delete","showValues","removeThisFilter","isIncompatibleFilter","QueryFilterComponent_HostBindings","QueryFilterComponent_span_3_Template","QueryFilterComponent_select_7_Template","QueryFilterComponent_op_filter_boolean_value_8_Template","QueryFilterComponent_ng_container_9_Template","QueryFilterComponent_div_10_Template","QueryFilterComponent_Template_button_click_12_listener","QueryFiltersComponent_fieldset_0_a_2_Template_a_click_0_listener","closeFilter","close_form","QueryFiltersComponent_fieldset_0_ng_container_9_li_1_Template_li_deactivateFilter_0_listener","_r12","QueryFiltersComponent_fieldset_0_ng_container_9_li_1_Template_li_filterChanged_0_listener","filter_r8","index_r9","focusElementIndex","QueryFiltersComponent_fieldset_0_ng_container_9_li_1_Template","isFilterAvailable","baseline_warning","QueryFiltersComponent_fieldset_0_a_2_Template","QueryFiltersComponent_fieldset_0_Template_wp_filter_by_text_input_deactivateFilter_7_listener","QueryFiltersComponent_fieldset_0_ng_container_9_Template","QueryFiltersComponent_fieldset_0_li_10_Template","QueryFiltersComponent_fieldset_0_Template_ng_select_open_18_listener","onOpen","QueryFiltersComponent_fieldset_0_Template_ng_select_change_18_listener","onFilterAdded","QueryFiltersComponent_fieldset_0_div_20_Template","selected_filter_list","showCloseFilter","filter_by_text","trackByName","isSecondSpacerVisible","remainingFilters","please_select","baselineIncompatibleFilters","QueryFiltersComponent","live$","combineLatestWith","detectIncompatibleFilters","updateRemainingFilters","filterToBeAdded","newFilter","instantiate","currentFilterLength","updateFilterFocus","ngSelectComponent","clearItem","removedFilter","hasSearch","hasAvailableFilter","remainingVisibleFilters","activeFilterCount","filterIndex","currentFilterAt","availableFilters","availableFilter","repositionDropdownBugfix","QueryFiltersComponent_Query","NgSelectComponent","QueryFiltersComponent_fieldset_0_Template","WorkPackageFilterByTextInputComponent","createWithDropdown","explanation","searchTermChanged","currentSearchFilter","upstreamTerm","WorkPackageFilterByTextInputComponent_Template","WorkPackageFilterByTextInputComponent_Template_input_ngModelChange_0_listener","WorkPackageFiltersService","WorkPackageCommentFieldHandler","EditFieldHandler","inEditMode","inFlight","onDestroy","change","WorkPackageChangeset","withText","rawComment","commentValue","handleUserCancel","deactivate","activate","trigger","onFocusOut","handleUserKeydown","onlyCancel","isChanged","WorkPackageCommentComponent_div_3_div_4_Template_div_dragover_0_listener","startDragOverActivation","WorkPackageCommentComponent_div_3_div_4_Template_div_dragenter_0_listener","WorkPackageCommentComponent_div_3_div_4_Template_button_click_1_listener","editTitle","WorkPackageCommentComponent_div_3_edit_form_portal_3_Template","WorkPackageCommentComponent_div_3_div_4_Template","showAbove","WorkPackageCommentComponent","commentService","wpLinkedActivities","workPackageNotificationService","addComment","cancelTitle","fieldLabel","htmlId","canAddComment","draft$","draft","quoteEvents$","quote","commentContainer","scrollIntoView","scrollToBottom","handleUserSubmit","createComment","scrollableContainer","scrollParent","scrollTop","scrollHeight","setErrors","newErrors","contentQueries","WorkPackageCommentComponent_ContentQueries","dirIndex","TemplateRef","WorkPackageCommentComponent_ng_container_2_Template","WorkPackageCommentComponent_div_3_Template","WorkPackageCommentComponent_ng_container_4_Template","WorkPackageCommentFieldComponent_edit_field_controls_3_Template_edit_field_controls_onSave_0_listener","WorkPackageCommentFieldComponent_edit_field_controls_3_Template_edit_field_controls_onCancel_0_listener","WorkPackageCommentFieldComponent","FormattableEditFieldComponent","isBusy","WorkPackageCommentFieldComponent_Template","WorkPackageCommentFieldComponent_Template_op_ckeditor_contentChanged_2_listener","onContentChange","WorkPackageCommentFieldComponent_Template_op_ckeditor_initializationFailed_2_listener","initializationError","WorkPackageCommentFieldComponent_Template_op_ckeditor_initializeDone_2_listener","onCkeditorSetup","WorkPackageCommentFieldComponent_Template_op_ckeditor_saveRequested_2_listener","WorkPackageCommentFieldComponent_edit_field_controls_3_Template","ckEditorContext","initialContent","activityNo","hasUnreadNotification","isInitial","ActivityEntryComponent","activityType","ActivityEntryComponent_Template","ActivityEntryComponent_revision_activity_1_Template","ActivityEntryComponent_user_activity_2_Template","ActivityLinkComponent","activityHtmlId","activityLabel","ActivityLinkComponent_Template","CommentService","errorAndReject","updateComment","author","userName","userLabel","RevisionActivityComponent_div_0_span_2_Template","RevisionActivityComponent_div_0_op_principal_4_Template","RevisionActivityComponent_div_0_op_principal_5_Template","RevisionActivityComponent_div_0_span_6_Template","RevisionActivityComponent_div_0_span_7_Template","userActive","revisionLink","RevisionActivityComponent","loadAuthor","revision","revisionPath","showRevision","formattedRevision","formattedIdentifier","textContent","revision_identifier","committed_revision_link","outerHTML","authorName","userAvatar","RevisionActivityComponent_Template","RevisionActivityComponent_div_0_Template","UserActivityComponent_div_0_button_12_Template_button_click_0_listener","quoteComment","quote_comment","UserActivityComponent_div_0_button_13_Template_button_click_0_listener","edit_comment","bcfSnapshotUrl","postedComment","detail_r14","UserActivityComponent_div_0_ul_18_li_1_Template","UserActivityComponent_div_0_Template_div_mouseenter_0_listener","UserActivityComponent_div_0_Template_div_mouseleave_0_listener","UserActivityComponent_div_0_op_principal_2_Template","UserActivityComponent_div_0_span_9_Template","UserActivityComponent_div_0_button_12_Template","UserActivityComponent_div_0_button_13_Template","UserActivityComponent_div_0_img_14_Template","UserActivityComponent_div_0_div_16_Template","UserActivityComponent_div_0_op_dynamic_bootstrap_17_Template","UserActivityComponent_div_0_ul_18_Template","label_created_on","label_updated_on","shouldHideIcons","userCanQuote","userCanEdit","isComment","isBcfComment","UserActivityComponent","additionalScrollMargin","focused","updateCommentText","runOutsideAngular","activityElement","scrollContainer","scrollOffset","offsetTop","focussing","quotedText","newActivity","finally","focusEditIcon","_newErrors","quoted","line","UserActivityComponent_Template","UserActivityComponent_div_0_Template","BASELINE_OPTIONS","baselineFilterFromValue","selectedDates","DEFAULT_TIMESTAMP","getPartsFromTimestamp","timeWithZone","dateObj","getBaselineState","schemaService","timestamps","attributesByTimestamp","compare","matchesFilters","attributeChanged","offsetToUtcString","in_your_timezone","localDate","OpBaselineLegendsComponent","numAdded","numRemoved","numUpdated","now_meets_filter_criteria","no_longer_meets_filter_criteria","maintained_with_changes","userOffset","getBaselineDetails","getFilterName","datesAndTimes","baselineValue","changesSinceOrBetween","deriveChangesSinceOrBetween","upstreamDate","deriveSingleDate","yesterdayDate","lastWorkingDate","lastweekDate","lastMonthDate","formatUpstreamAndLocal","deriveDateRange","legendDescription","parsedDate","startRange","endRange","formatDate","baselineIsActive","OpBaselineLegendsComponent_HostBindings","OpBaselineLegendsComponent_span_3_Template","OpBaselineLoadingComponent","OpBaselineLoadingComponent_Template","OpBaselineModalComponent","opened","toggle_title","header_description","toggleOpen","OpBaselineModalComponent_HostBindings","OpBaselineModalComponent_Template_spot_drop_modal_closed_0_listener","OpBaselineModalComponent_Template_button_click_1_listener","OpBaselineModalComponent_Template_op_baseline_submitted_5_listener","baseline_comparison","moreInfoLink","more_info_text","availableValue_r12","mappedSelectedDate","OpBaselineComponent_form_5_spot_form_field_7_Template_input_input_1_listener","dateChange","time_description","OpBaselineComponent_form_5_spot_form_field_8_Template_input_change_1_listener","timesChange","OpBaselineComponent_form_5_spot_form_field_8_span_3_Template","selectedTimes","mappedOffset","selectedOffsets","help_description","OpBaselineComponent_form_5_div_9_Template_input_input_2_listener","_r21","OpBaselineComponent_form_5_div_9_Template_button_click_3_listener","ctx_r22","setToday","OpBaselineComponent_form_5_div_9_Template_input_input_5_listener","OpBaselineComponent_form_5_div_9_Template_button_click_6_listener","ctx_r24","OpBaselineComponent_form_5_div_9_Template_input_change_8_listener","OpBaselineComponent_form_5_div_9_span_13_Template","OpBaselineComponent_form_5_div_9_Template_input_change_15_listener","ctx_r26","OpBaselineComponent_form_5_div_9_span_20_Template","tooltipPosition","OpBaselineComponent_form_5_op_datepicker_sheet_10_Template_op_datepicker_sheet_datesSelected_0_listener","futureDateComparer","OpBaselineComponent_form_5_div_11_Template_button_click_2_listener","resetSelection","OpBaselineComponent_form_5_Template_form_submit_0_listener","OpBaselineComponent_form_5_Template_select_change_3_listener","filterChange","OpBaselineComponent_form_5_option_5_Template","OpBaselineComponent_form_5_span_6_Template","OpBaselineComponent_form_5_spot_form_field_7_Template","OpBaselineComponent_form_5_spot_form_field_8_Template","OpBaselineComponent_form_5_div_9_Template","OpBaselineComponent_form_5_op_datepicker_sheet_10_Template","OpBaselineComponent_form_5_div_11_Template","showActionBar","show_changes_since","drop_down_none_option","filterSelected","baselineAvailableValues","DEFAULT_SELECTED_TIME","OpBaselineComponent","daysService","Banner","submitted","nonWorkingDays$","SpotDropAlignmentOption","TopRight","enterprise_header_description","disable","buildBaselineFilter","every","updateDateValues","dayElem","isAfter","buildFilterString","buildISOString","timeWithOffset","OpBaselineComponent_HostBindings","OpBaselineComponent_div_1_Template","OpBaselineComponent_a_4_Template","OpBaselineComponent_form_5_Template","OpBaselineComponent_ng_template_7_Template","set_parent","WorkPackageBreadcrumbParentComponent_ng_container_0_button_2_Template_button_click_0_listener","WorkPackageBreadcrumbParentComponent_ng_container_0_button_2_span_1_Template","edit_parent","WorkPackageBreadcrumbParentComponent_ng_container_0_button_3_Template_button_click_0_listener","updateParent","remove_parent","WorkPackageBreadcrumbParentComponent_ng_container_0_a_1_Template","WorkPackageBreadcrumbParentComponent_ng_container_0_button_2_Template","WorkPackageBreadcrumbParentComponent_ng_container_0_button_3_Template","canModifyParent","WorkPackageBreadcrumbParentComponent_wp_relations_autocomplete_1_Template_wp_relations_autocomplete_cancel_0_listener","WorkPackageBreadcrumbParentComponent_wp_relations_autocomplete_1_Template_wp_relations_autocomplete_change_0_listener","set_or_remove_parent","WorkPackageBreadcrumbParentComponent","wpRelationsHierarchy","notificationService","onSwitch","isSaving","changeParent","editing","toggle","newParent","newParentId","WorkPackageBreadcrumbParentComponent_Template","WorkPackageBreadcrumbParentComponent_ng_container_0_Template","WorkPackageBreadcrumbParentComponent_wp_relations_autocomplete_1_Template","first_r4","ancestor_r3","WorkPackageBreadcrumbComponent_div_0_ng_container_2_ng_container_4_li_1_Template","last_r5","WorkPackageBreadcrumbComponent_div_0_ng_container_2_ng_container_4_Template","hierarchyLabel","WorkPackageBreadcrumbComponent_div_0_ng_container_2_Template","WorkPackageBreadcrumbComponent_div_0_Template_wp_breadcrumb_parent_onSwitch_4_listener","updateActiveInput","inputActive","hierarchyCount","WorkPackageBreadcrumbComponent","hierarchy","WorkPackageBreadcrumbComponent_Template","WorkPackageBreadcrumbComponent_div_0_Template","AbstractWorkPackageButtonComponent","labelKey","textKey","activationPrefix","deactivationPrefix","prefix","isToggle","WorkPackageCreateButtonComponent","allowed","allowedWhen","combined","module","permission","updateDisabledState","transitionUnregisterFn","disabled","stateName$","WorkPackageCreateButtonComponent_Template","WorkPackageDetailsViewButtonComponent","transitions","wpTableFocus","accessKey","activeState","listState","buttonId","buttonClass","iconClass","activateLabel","deactivateLabel","transitionListener","performAction","openDetailsView","openListView","focusedWorkPackage","goCurrentDetailsState","WorkPackageDetailsViewButtonComponent_Template","WorkPackageDetailsViewButtonComponent_Template_button_click_0_listener","filterCount","initialized","setupObserver","currentlyVisibleFilters","WorkPackageFilterButtonComponent_Template","WorkPackageFilterButtonComponent_Template_button_click_0_listener","WorkPackageFilterButtonComponent_span_4_Template","WorkPackageFoldToggleButtonComponent","WorkPackageFoldToggleButtonComponent_Template","WorkPackageMarkNotificationButtonComponent","markAllBelongingNotificationsAsRead","showWithText","WorkPackageMarkNotificationButtonComponent_Template","WorkPackageMarkNotificationButtonComponent_Template_button_click_0_listener","WorkPackageMarkNotificationButtonComponent_span_2_Template","more_actions","WorkPackageSettingsButtonComponent_Template","WorkPackageShareButtonComponent","openModal","WorkPackageShareModalComponent","WorkPackageShareButtonComponent_Template","WorkPackageShareButtonComponent_Template_button_click_0_listener","WorkPackageStatusButtonComponent_div_0_span_2_Template","buttonTitle","statusHighlightClass","WorkPackageStatusButtonComponent","workPackageReadOnly","workPackageStatusBlocked","temporaryEditResource","typedState","WorkPackageStatusButtonComponent_Template","WorkPackageStatusButtonComponent_div_0_Template","WorkPackageTimelineButtonComponent_li_1_Template_button_click_1_listener","enableAutoZoom","getAutoZoomToggleClass","zoomAuto","WorkPackageTimelineButtonComponent_li_2_Template_button_click_1_listener","updateZoomWithDelta","isMaxLevel","zoomOut","WorkPackageTimelineButtonComponent_li_3_Template_button_click_1_listener","isMinLevel","zoomIn","WorkPackageTimelineButtonComponent","wpTableTimeline","minZoomLevel","maxZoomLevel","isAutoZoom","isVisible","appliedZoomLevel$","toggleTimeline","enableAutozoom","WorkPackageTimelineButtonComponent_Template","WorkPackageTimelineButtonComponent_li_1_Template","WorkPackageTimelineButtonComponent_li_2_Template","WorkPackageTimelineButtonComponent_li_3_Template","WorkPackageViewToggleButtonComponent","wpDisplayRepresentationService","card","timeline","timelines","detectView","timelineVisible","wpDisplayCardRepresentation","wpDisplayListRepresentation","WorkPackageViewToggleButtonComponent_Template","screenfull","sfimport","zenModeComponentSelector","inZenMode","enabled","onchange","isFullscreen","deactivateZenMode","exit","activateZenMode","ZenModeButtonComponent_Template","ZenModeButtonComponent_Template_button_click_0_listener","CardClickHandler","EVENT","SELECTOR","eventScope","handleEvent","is","handleWorkPackage","itemClicked","double","classIdentifier","wpCardView","findRenderedCard","ctrlKey","metaKey","shiftKey","setMultiSelectionFrom","renderedCards","toggleRow","selectionChanged","getSelectedWorkPackageIds","updateFocus","WorkPackageViewSelectionService","WorkPackageViewFocusService","WorkPackageCardViewService","CardDblClickHandler","CardRightClickHandler","isSelected","showInfoButton","opContextMenu","OPContextMenuService","CardViewHandlerRegistry","WorkPackageViewHandlerRegistry","eventHandlers","WorkPackageCardDragAndDropService","reorderService","dragService","wpInlineCreate","init","componentRef","cardView","registerDragAndDrop","dragContainer","scrollContainers","moves","canDragOutOf","isNew","accepts","dragInto","onMoved","toIndex","newOrder","move","currentOrder","updateOrder","onRemoved","onAdded","addWorkPackageToQuery","parentElement","removeChild","_x2","_workPackages","activeInlineCreateWp","existingNewWp","addNewCard","createOrContinueWorkPackage","workPackageAddedHandler","removeReferenceWorkPackageForm","removeCard","onCardSaved","newInlineWorkPackageCreated","tableRendered","updateRenderedCardsValues","referenceClass","referenceOutputs","WorkPackageCardViewComponent_ng_container_3_Template_wp_single_card_onRemove_1_listener","wp_r4","WorkPackageCardViewComponent_ng_container_3_Template_wp_single_card_stateLinkClicked_1_listener","stateLinkClicked","WorkPackageCardViewComponent_ng_container_3_hr_2_Template","cardsRemovable","orientation","shrinkOnMobile","noResults","WorkPackageCardViewComponent","halEvents","wpViewOrder","cardDragDrop","showEmptyResultsBox","trackByHrefAndProperty","isResultEmpty","inReference","referenceComponentClass","setReferenceMode","onReferenced","registerCreationCallback","eventType","orderedWorkPackages","registry","WorkPackageViewHandlerToken","attachTo","registerSelectAllListener","registerDeselectAllListener","mode","classes","WorkPackageCardViewComponent_Query","WorkPackageCardViewComponent_div_2_Template","WorkPackageCardViewComponent_ng_container_3_Template","WorkPackageCardViewComponent_div_4_Template","WorkPackageSingleCardComponent_button_4_Template_button_click_0_listener","emitStateLinkClicked","detailsView","WorkPackageSingleCardComponent_button_5_Template_button_click_0_listener","disabledInfo","wpTypeAttribute","typeHighlightingClass","bcfSnapshotPath","baselineMode","baseLineIconAdded","baseLineIconRemoved","baseLineIconChanged","assignee","wpDates","wpOverDueHighlighting","WorkPackageSingleCardComponent_div_8_Template_a_click_3_listener","_r18","WorkPackageSingleCardComponent_div_8_span_6_Template","WorkPackageSingleCardComponent_div_8_span_7_Template","WorkPackageSingleCardComponent_div_8_span_9_Template","WorkPackageSingleCardComponent_div_8_img_10_Template","WorkPackageSingleCardComponent_div_8_wp_status_button_12_Template","WorkPackageSingleCardComponent_div_8_span_13_Template","WorkPackageSingleCardComponent_div_8_op_principal_14_Template","WorkPackageSingleCardComponent_div_8_span_15_Template","showRemoveButton","wpProjectName","fullWorkPackageLink","showAsInlineCard","showStartDate","wpSubject","showEndDate","cardCoverImageShown","baselineIcon","WorkPackageSingleCardComponent","selectedWhenOpen","draggable","showAsGhost","onRemove","cardClicked","cardDblClicked","cardContextMenu","BottomLeft","dateTimeFormatYear","Intl","DateTimeFormat","year","month","dateTimeFormat","stateToEmit","requestedState","cardClasses","cardTitle","formatRange","overdueDate","cardHighlightingClass","cardHighlighting","attributeHighlighting","inlineClass","WorkPackageSingleCardComponent_Template","WorkPackageSingleCardComponent_Template_div_click_0_listener","WorkPackageSingleCardComponent_Template_div_dblclick_0_listener","WorkPackageSingleCardComponent_Template_div_contextmenu_0_listener","WorkPackageSingleCardComponent_button_4_Template","WorkPackageSingleCardComponent_button_5_Template","WorkPackageSingleCardComponent_op_icon_6_Template","WorkPackageSingleCardComponent_edit_form_7_Template","WorkPackageSingleCardComponent_div_8_Template","WorkPackageCopyFullViewComponent_div_0_Template_edit_form_onSaved_1_listener","onSaved","WorkPackageCopyFullViewComponent_div_0_Template_wp_edit_actions_bar_onCancel_12_listener","cancelAndBackToList","newWorkPackage","button_settings","copying","WorkPackageCopyFullViewComponent","WorkPackageCopyController","successState","hostAttrs","WorkPackageCopyFullViewComponent_Template","WorkPackageCopyFullViewComponent_div_0_Template","WorkPackageCopySplitViewComponent_div_0_Template_edit_form_onSaved_1_listener","WorkPackageCopySplitViewComponent_div_0_Template_a_click_6_listener","switchToFullscreen","WorkPackageCopySplitViewComponent_div_0_Template_wp_edit_actions_bar_onCancel_10_listener","WorkPackageCopySplitViewComponent","WorkPackageCopySplitViewComponent_Template","WorkPackageCopySplitViewComponent_div_0_Template","WorkPackageCreateComponent","wpRelations","addCommonRelation","copiedWorkPackageId","createdWorkPackage","stateParams","copiedFromWorkPackageId","createCopyFrom","sourceChangeset","changeFor","copyWorkPackage","copyChangeset","pristineResource","WorkPackageRelationsService","operator_r2","CustomDateActionAdminComponent_span_4_Template_op_basic_single_date_picker_valueChange_1_listener","updateField","fieldId","fieldValue","customDateActionAdminSelector","CustomDateActionAdminComponent","valueVisible","visibleValue","onKey","currentKey","currentFieldValue","operators","selectedOperator","toggleValueVisibility","updateDbValue","CustomDateActionAdminComponent_Template","CustomDateActionAdminComponent_Template_select_ngModelChange_2_listener","CustomDateActionAdminComponent_Template_select_change_2_listener","CustomDateActionAdminComponent_option_3_Template","CustomDateActionAdminComponent_span_4_Template","action_r2","WpCustomActionsComponent_ng_container_0_wp_custom_action_1_Template","WpCustomActionsComponent","customActions","WpCustomActionsComponent_Template","WpCustomActionsComponent_ng_container_0_Template","WpCustomActionComponent","wpSchemaCacheService","fetchAction","lockVersion","savedWp","stopEditing","onMouseEnter","WpCustomActionComponent_HostBindings","WpCustomActionComponent_Template_button_click_0_listener","WorkPackageSplitViewToolbarComponent","displayShareButton$","button_more","displayNotificationsButton","WorkPackageSplitViewToolbarComponent_Template","WorkPackageSplitViewToolbarComponent_op_work_package_mark_notification_button_2_Template","WorkPackageSplitViewToolbarComponent_wp_share_button_3_Template","WorkPackageFilterValues","excluded","applyFirstValue","setToNull","applyDefaultsFromFilters","projectFilter","filterAlreadyApplied","mapFilterToAttribute","setValueFor","findSpecialValue","j","compareByHrefOrString","ResourceChangeset","updateForm","applyChanges","setNewDefaultFor","form$","WorkPackageReplacementLabelComponent","wpeditForm","fields","handleUserActivate","ngContentSelectors","WorkPackageReplacementLabelComponent_Template","WorkPackageReplacementLabelComponent_Template_span_click_0_listener","tdClassName","editCellContainer","CellBuilder","fieldRenderer","DisplayFieldRenderer","build","column","td","appendChild","hasBaseline","editFieldContainerClass","displayElement","prependChanges","WorkPackageViewBaselineService","colorClass","highlightColorTextInline","isBright","variable","getPropertyValue","internalSortColumn","internalContextMenuColumn","internalBaselineColumn","GroupSumsBuilder","SingleRowBuilder","buildSumsRow","tr","groupedRowClassName","renderColumns","sums","augmentedColumns","div","renderContent","sumsSchema","appendFirstLabel","displayFieldService","getField","IsolatedQuerySpace","rowGroupClassName","collapsedRowClass","groupIdentifier","groupByProperty","groupName","groupIndex","groupTypeFromIdentifier","groupIdFromIdentifier","indicatorCollapsedClass","additionalHierarchyRowClassName","SingleHierarchyRowBuilder","workPackageTable","leaf","level","collapsed","refreshRow","jRow","newRow","appendHierarchyIndicator","buildEmpty","ancestorRowData","wpTableHierarchies","rowClasses","parentsWithVisibleChildren","hierarchyRootClass","ancestor","hierarchyGroupClass","collapsedGroupClass","buildAncestorRow","ancestorGroups","hierarchyLevel","hierarchyElement","buildHierarchyIndicator","hierarchyIndicator","indicatorWidth","indentation","WorkPackageViewHierarchiesService","relationCellTdClassName","relationCellIndicatorClassName","RelationCellbuilder","columnId","wpTableRelationColumns","getExpandFor","relationState","relationsForColumn","renderIndicator","badge","renderBadge","WorkPackageViewRelationColumnsService","TableActionRenderer","contextMenuTdClassName","contextMenuSpanClassName","tableActionsService","OpTableActionsService","BaselineColumnBuilder","changeIcon","opIconElement","tableRowClassName","commonRowClassName","cellBuilder","relationCellBuilder","contextLinkBuilder","baselineColumnBuilder","buildAugmentedColumns","wpTableColumns","getColumns","dragAndDropEnabled","buildCell","isRelationColumn","actionsColumnEnabled","columnMenuEnabled","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","which","KeyCodes","ENTER","ClickOrEnterHandler","processEvent","ancestorId","ancestorClassIdentifier","rowId","relationRowClass","locateTableRow","isInsideCollapsedGroup","listClass","locatePredecessorBySelector","previous","previousElementSibling","scrollTableRowIntoView","containerTop","containerBottom","elemTop","elemBottom","warn","RowsBuilder","isApplicable","groupClassNameFor","GroupHeaderBuilder","collapse","expand","buildGroupRow","colspan","togglerIconClass","escape","HighlightingRenderPass","tablePass","highlightAttribute","wpTableHighlighting","getComputedStyle","renderedOrder","position","tableBody","isInline","isDisabled","WorkPackageViewHighlightingService","DragDropHandleBuilder","dragActionRegistry","TableDragActionsRegistryService","actionService","canPickup","DragDropHandleRenderPass","dragDropHandleBuilder","wpTableOrder","withLoadedPositions","positions","renderType","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","size","relationsToExtendFor","relationRow","spliceRow","belongsTo","refreshRelationRow","renderedRow","hasRelationColumns","PrimaryRenderPass","rowBuilder","timeOutput","prepare","doRender","postRender","highlighting","dragDropHandle","replacement","replaceWith","renderedInfo","after","renderPlaceholderRow","appendRow","appendNonWorkPackageRow","classIdentifer","PlainRenderPass","originalRows","originalRowIndex","object","GroupedRenderPass","headerBuilder","sumsBuilder","currentGroup","nextGroup","matchingGroup","groupsChanged","renderSumsRow","groupClass","rowElement","buildSingleRow","matchesMultiValue","joinedOrderedHrefs","objects","isEqualWith","GroupedRowsBuilder","collapsedGroups","buildRows","builder","getGroupData","refreshExpansionState","rendered","tableAndTimelineContainer","parentNode","affected","HierarchyRenderPass","additionalParents","deferred","hierarchies","deferInsertion","buildWithHierarchy","markRendered","renderAllDeferredChildren","ancestorChain","inTable","newElements","insertUnderParent","getOrBuildRow","ancestorRow","insertAtExistingHierarchy","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","setInterval","clearInterval","FocusHelperService","EditingPortalService","WorkPackagesListService","WorkPackageTableEditingContext","existing","startEditing","WorkPackageTable","tbody","timelineController","hierarchyRowsBuilder","groupedRowsBuilder","plainRowsBuilder","builders","lastRenderPass","renderedRows","findRenderedRow","buildIndex","rows","initialSetup","redrawTableAndTimeline","renderPass","performRenderPass","requestAnimationFrame","replaceChildren","redrawTable","refreshRows","pass","setGroupsCollapseState","newState","t0","performance","t1","WorkPackageViewCollapsedGroupsService","resizerClass","resizerStorageKey","WorkPackagesGridComponent","wpTableHighlight","wpTableSortBy","wpList","showResizer","gridOrientation","onReady","highlightingModeChanged","updates$","switchToManualSorting","createOrSave","DragAndDropService","WorkPackagesGridComponent_Template","WorkPackagesGridComponent_Template_wp_card_view_onMoved_0_listener","WorkPackagesGridComponent_Template_wp_card_view_selectionChanged_0_listener","WorkPackagesGridComponent_Template_wp_card_view_itemClicked_0_listener","WorkPackagesGridComponent_Template_wp_card_view_stateLinkClicked_0_listener","WorkPackagesGridComponent_div_1_Template","inlineCreateRowClassName","inlineCreateCancelClassName","InlineCreateRowBuilder","cancelButton","buildCancelButton","buildNew","WorkPackageInlineCreateComponent_ng_container_0_tr_1_button_2_Template_button_click_0_listener","handleAddRowClick","hasReferenceClass","WorkPackageInlineCreateComponent_ng_container_0_tr_1_button_3_Template_button_click_0_listener","handleReferenceClick","WorkPackageInlineCreateComponent_ng_container_0_tr_1_button_2_Template","WorkPackageInlineCreateComponent_ng_container_0_tr_1_button_3_Template","canAdd","canReference","WorkPackageInlineCreateComponent_ng_container_0_tr_2_ng_container_2_Template","WorkPackageInlineCreateComponent_ng_container_0_tr_1_Template","WorkPackageInlineCreateComponent_ng_container_0_tr_2_Template","WorkPackageInlineCreateComponent","showing","buttonTexts","refreshOnColumnChanges","registerCancelHandler","resetRow","stopImmediatePropagation","currentWorkPackage","isEmbedded","cancelCreation","removeWorkPackageRow","showRow","addWorkPackageRow","editingSubscription","changesetUpdates$","insertRow","workPackageEditForm","renderInlineCreateRow","activateMissingFields","hideRow","WorkPackageInlineCreateComponent_HostBindings","WorkPackageInlineCreateComponent_ng_container_0_Template","WorkPackageInlineCreateService","referenceTarget","newInlineWorkPackageReferenced","canCreateWorkPackages","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","sortBys","wpTablePagination","wpStatesInitialization","wpListInvalidQueryService","wpQueryView","queryRequests","queryLoading","q","streamQueryRequest","queryParams","decodedProps","getCurrentQueryProps","buildV3GetQueryFromJsonParams","handleQueryLoadingError","loadDefaultQuery","reloadQuery","extractParamsFromQuery","loadQueryFromExisting","buildV3GetQueryFromQueryResource","loadCurrentQueryFromParams","loadForm","updateStatesFromForm","queryForm","createQueryAndView","createdQuery","currentQuery","givenQuery","getPaginationInfo","paginationObject","currentForm","WorkPackagesQueryViewService","viewType","WorkPackageStatesInitializationService","wpTableGroupBy","wpTableGroupFold","wpTableSum","wpTableAdditionalElements","wpDisplayRepresentation","wpIncludeSubprojects","wpTimestamps","clearStates","initializeFromQuery","updateQuerySpace","updateChecksum","initializeFilters","additionalRequiredWorkPackages","$transition","wpViewFocus","cancelState","destroyed","closeEditFormWhenNewWorkPackageSaved","showForm","savedResource","parentWorkPackage","back_url","WorkPackageCreateComponent_Query","EditFormComponent","newWorkPackageHref","WorkPackageCreateService","attachmentsService","newWorkPackageCreatedSubject","committedChanges","commit","newWorkPackageCreated","createNewWorkPackage","fromCreateForm","initializeNewResource","copyFrom","getEmptyForm","changePromise","continueExistingEdit","createNewWithDefaults","changeType","hasChanges","typeEmpty","typeMatches","withFiltersPayload","filterDefaults","mergedPayload","defaultsFromFilters","ignoreFiltersFn","except","fromFilter","toApiPayload","WorkPackageNewFullViewComponent_div_0_Template_edit_form_onSaved_1_listener","WorkPackageNewFullViewComponent_div_0_Template_wp_edit_actions_bar_onCancel_12_listener","WorkPackageNewFullViewComponent","WorkPackageNewFullViewComponent_Template","WorkPackageNewFullViewComponent_div_0_Template","WorkPackageNewSplitViewComponent_div_0_Template_edit_form_onSaved_1_listener","WorkPackageNewSplitViewComponent_div_0_Template_a_click_6_listener","WorkPackageNewSplitViewComponent_div_0_Template_wp_edit_actions_bar_onCancel_10_listener","WorkPackageNewSplitViewComponent","WorkPackageNewSplitViewComponent_Template","WorkPackageNewSplitViewComponent_div_0_Template","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","encodeTimestamps","s","hl","highlightedAttributes","hla","ts","queryFilterValueToParam","tv","timelineLabels","tll","tzl","timelineZoomLevel","updateJson","getPerPage","showSums","urlFilter","attributes","vs","filterData","contextual","buildV3GetColumnsFromQueryResource","buildV3GetFiltersAsJson","buildV3GetSortByFromQuery","halValue","replacements","buildV3GetFilterIdFromFilter","buildV3GetOperatorIdFromFilter","buildV3GetValuesFromFilter","filterHash","filterBuilderFrom","sortByIds","WpChildrenInlineCreateService","wpRelationsHierarchyService","WpRelationInlineAddExistingComponent","toId","addExistingChildWp","canAddChild","WorkPackageChildrenQueryComponent_ng_container_0_div_1_Template","WorkPackageChildrenQueryComponent_ng_container_0_Template_wp_embedded_table_onQueryLoaded_2_listener","handleQueryLoaded","tableActions","WorkPackageChildrenQueryComponent","WorkPackageRelationQueryBase","addExistingChildEnabled","OpUnlinkTableAction","factoryFor","embeddedTable","buildQueryProps","relatedWorkPackage","isInitialized","refreshTable","WorkPackageChildrenQueryComponent_Template","WorkPackageChildrenQueryComponent_ng_container_0_Template","buildQueryFilters","abort","addExisting","selectedWpId","newRelationId","onSelected","relationTypes","iApiFilters","WpRelationInlineAddExistingComponent_Template","WpRelationInlineAddExistingComponent_Template_wp_relations_autocomplete_change_3_listener","WpRelationInlineAddExistingComponent_Template_button_click_5_listener","WpRelationInlineCreateService","removeRelation","addRelation","loadQuery","filtersLength","projectValuesCount","loadedFiltersLength","WorkPackageRelationQueryBase_Query","normalizedRelationType","highlightingClassForWpType","WorkPackageRelationRowComponent_div_0_button_3_Template_button_click_0_listener","activateRelationTypeEdit","WorkPackageRelationRowComponent_div_0_button_3_span_1_Template","WorkPackageRelationRowComponent_div_0_button_3_span_2_Template","groupByWorkPackageType","updateRelation","relationType_r11","WorkPackageRelationRowComponent_div_0_div_4_Template_select_ngModelChange_1_listener","selectedRelationType","WorkPackageRelationRowComponent_div_0_div_4_Template_select_change_1_listener","saveRelationType","WorkPackageRelationRowComponent_div_0_div_4_Template_select_keydown_escape_1_listener","cancelRelationTypeEditOnEscape","WorkPackageRelationRowComponent_div_0_div_4_option_2_Template","availableRelationTypes","WorkPackageRelationRowComponent_div_0_button_12_Template_button_click_0_listener","showDescriptionInfo","removeButton","WorkPackageRelationRowComponent_div_0_div_13_button_1_Template_button_click_0_listener","startDescriptionEdit","WorkPackageRelationRowComponent_div_0_div_13_div_2_Template_textarea_keyup_1_listener","handleDescriptionKey","WorkPackageRelationRowComponent_div_0_div_13_div_2_Template_textarea_ngModelChange_1_listener","userInputs","newRelationText","WorkPackageRelationRowComponent_div_0_div_13_div_2_Template_edit_field_controls_onSave_3_listener","saveDescription","WorkPackageRelationRowComponent_div_0_div_13_div_2_Template_edit_field_controls_onCancel_3_listener","cancelDescriptionEdit","fieldController","WorkPackageRelationRowComponent_div_0_div_13_button_1_Template","WorkPackageRelationRowComponent_div_0_div_13_div_2_Template","showDescriptionEditForm","WorkPackageRelationRowComponent_div_0_button_3_Template","WorkPackageRelationRowComponent_div_0_div_4_Template","WorkPackageRelationRowComponent_div_0_edit_form_8_Template","WorkPackageRelationRowComponent_div_0_Template_button_click_10_listener","_r29","ctx_r28","showRelationInfo","WorkPackageRelationRowComponent_div_0_button_12_Template","WorkPackageRelationRowComponent_div_0_div_13_Template","showRelationTypesForm","description_label","toggleDescription","WorkPackageRelationRowComponent","showEditForm","relatedBy","relationReady","textarea","relationDescriptionTextarea","textlen","prop","savedRelation","updateRelationType","toggleUserDescriptionForm","WorkPackageRelationRowComponent_Query","WorkPackageRelationRowComponent_div_0_Template","inputName","hiddenFieldAction","headerTemplate","projectedHeaderTemplate","item_r12","search_r14","index_r13","WorkPackageRelationsAutocompleteComponent_6_ng_template_0_Template","projectedLabelTemplate","labelTemplate","item_r16","search_r18","index_r17","clear_r19","WorkPackageRelationsAutocompleteComponent_7_ng_template_0_Template","projectedOptionTemplate","optionTemplate","item_r20","search_r22","index_r21","footerTemplate","projectedFooterTemplate","item_r24","search_r26","index_r25","WorkPackageRelationsAutocompleteComponent_9_ng_template_0_Template","item_r27","WorkPackageRelationsAutocompleteComponent_ng_template_10_ng_container_0_op_principal_2_Template","WorkPackageRelationsAutocompleteComponent_ng_template_10_ng_container_0_span_4_Template","search_r28","WorkPackageRelationsAutocompleteComponent_ng_template_10_ng_container_1_op_principal_2_Template","WorkPackageRelationsAutocompleteComponent_ng_template_10_ng_container_0_Template","WorkPackageRelationsAutocompleteComponent_ng_template_10_ng_container_1_Template","WorkPackageRelationsAutocompleteComponent_ng_template_10_ng_container_2_Template","search_r42","item_r41","WorkPackageRelationsAutocompleteComponent_ng_template_12_ng_container_0_span_1_Template","WorkPackageRelationsAutocompleteComponent_ng_template_12_ng_container_1_Template_span_click_1_listener","_r51","ctx_r50","clear_r43","WorkPackageRelationsAutocompleteComponent_ng_template_12_ng_container_0_Template","WorkPackageRelationsAutocompleteComponent_ng_template_12_ng_container_1_Template","WorkPackageRelationsAutocompleteComponent","OpAutocompleterComponent","hiddenOverflowContainer","appendTo","getOptionsFn","getAutocompleterData","changed","dropdownPanel","adjustPosition","one","availableRelationCandidates","filterCandidatesFor","finalFilters","WorkPackageRelationsAutocompleteComponent_HostBindings","WorkPackageRelationsAutocompleteComponent_input_1_Template","WorkPackageRelationsAutocompleteComponent_Template_ng_select_ngModelChange_2_listener","WorkPackageRelationsAutocompleteComponent_Template_ng_select_change_2_listener","WorkPackageRelationsAutocompleteComponent_Template_ng_select_open_2_listener","WorkPackageRelationsAutocompleteComponent_Template_ng_select_close_2_listener","closed","WorkPackageRelationsAutocompleteComponent_Template_ng_select_blur_2_listener","blured","WorkPackageRelationsAutocompleteComponent_Template_ng_select_focus_2_listener","WorkPackageRelationsAutocompleteComponent_Template_ng_select_clear_2_listener","cleared","WorkPackageRelationsAutocompleteComponent_Template_ng_select_keydown_2_listener","keydowned","WorkPackageRelationsAutocompleteComponent_Template_ng_select_keydown_escape_2_listener","canceled","WorkPackageRelationsAutocompleteComponent_Template_ng_select_search_2_listener","searched","WorkPackageRelationsAutocompleteComponent_Template_ng_select_scroll_2_listener","scrolled","WorkPackageRelationsAutocompleteComponent_Template_ng_select_scrollToEnd_2_listener","scrolledToEnd","WorkPackageRelationsAutocompleteComponent_Template_ng_select_add_2_listener","added","WorkPackageRelationsAutocompleteComponent_Template_ng_select_remove_2_listener","removed","WorkPackageRelationsAutocompleteComponent_6_Template","WorkPackageRelationsAutocompleteComponent_7_Template","WorkPackageRelationsAutocompleteComponent_ng_template_8_Template","WorkPackageRelationsAutocompleteComponent_9_Template","WorkPackageRelationsAutocompleteComponent_ng_template_10_Template","WorkPackageRelationsAutocompleteComponent_ng_template_12_Template","results$","typeahead","clearOnBackspace","clearSearchOnAdd","hideSelected","multiple","addTag","virtualScroll","clearable","closeOnSelect","openOnEnter","bindLabel","bindValue","markFirst","appearance","dropdownPosition","selectOnTab","maxSelectedItems","groupValue","bufferAmount","selectableGroup","searchable","selectableGroupAsModel","trackByFn","compareWith","searchFn","labelForId","inputAttrs","tabIndex","searchWhileComposing","minTermLength","editableSearchTerm","keyDownFn","accesskey","labelRequired","WorkPackageRelationsCreateComponent_div_1_Template_button_click_3_listener","toggleRelationsCreateForm","addNewRelation","type_r5","WorkPackageRelationsCreateComponent_div_3_Template_select_ngModelChange_3_listener","WorkPackageRelationsCreateComponent_div_3_option_4_Template","WorkPackageRelationsCreateComponent_div_3_Template_wp_relations_autocomplete_change_6_listener","WorkPackageRelationsCreateComponent_div_3_Template_wp_relations_autocomplete_cancel_6_listener","WorkPackageRelationsCreateComponent_div_3_Template_button_click_8_listener","WorkPackageRelationsCreateComponent","showRelationsCreateForm","createRelation","createCommonRelation","WorkPackageRelationsCreateComponent_Template","WorkPackageRelationsCreateComponent_div_1_Template","WorkPackageRelationsCreateComponent_div_3_Template","WorkPackageRelationsGroupComponent_div_3_Template_button_click_1_listener","toggleButton","togglerText","relatedWorkPackage_r6","WorkPackageRelationsGroupComponent_div_4_wp_relation_row_1_Template","relatedWorkPackages","WorkPackageRelationsGroupComponent","onToggleGroupBy","groupByType","groupByRelation","toggleElement","WorkPackageRelationsGroupComponent_Query","WorkPackageRelationsGroupComponent_div_3_Template","WorkPackageRelationsGroupComponent_div_4_Template","header","firstGroup","WorkPackageRelationsHierarchyComponent","parentHeadline","childrenHeadline","canModifyHierarchy","canAddRelation","childrenQueryProps","WorkPackageRelationsHierarchyComponent_Template","WorkPackageRelationsHierarchyService","removeParent","childWpId","wpToBecomeChild","addNewChildWp","childWorkPackage","relations_header","WorkPackageRelationsComponent_wp_relations_group_2_Template_wp_relations_group_onToggleGroupBy_0_listener","toggleGroupBy","type_r3","relationGroups","WorkPackageRelationsComponent","relationGroupKeys","relationsPresent","currentRelations","loadedRelations","getRelatedWorkPackages","observablesToGetZipped","zip","getRelatedWorkPackageId","involved","buildRelationGroups","stateValues","relatedWpIds","relatedWpId","WorkPackageRelationsComponent_Template","WorkPackageRelationsComponent_div_1_Template","WorkPackageRelationsComponent_wp_relations_group_2_Template","WorkPackageRelationsComponent_wp_relations_create_3_Template","RelationStateGroup","initializeMembers","relationsStateValue","accumulateRelationsFromInvolved","removeFromStates","insertIntoStates","keyBy","r","relevant","frameSrc","WorkPackageShareModalComponent_Template","WorkPackageShareModalComponent_Template_button_click_3_listener","ActivityPanelBaseController","wpSingleViewService","unfilteredActivities","visibleActivities","onlyComments","commentsOnly","showAll","comingFromNotifications","reverse","isReversed","lastTransitionName","successfulTransitions","peekTail","firstRouteOnMobile","reloadActivities","selectNotificationsCount$","scrollIfNotificationPresent","hasNotification","scrollToUnreadNotification","updateActivities","getVisibleActivities","showToggler","shouldShowToggler","countAll","countWithComments","getActivitiesWithComments","activityHref","unreadNotifications","notificationElement","toggleComments","inf_r2","NewestActivityOnOverviewComponent_ng_template_1_div_1_Template","latestActivityInfo","trackByIdentifier","NewestActivityOnOverviewComponent","trackByProperty","latestActivities","NewestActivityOnOverviewComponent_Template","NewestActivityOnOverviewComponent_ng_template_1_Template","WorkPackageActivityTabComponent_work_package_comment_0_ng_template_1_div_2_h4_1_button_2_Template_button_click_0_listener","WorkPackageActivityTabComponent_work_package_comment_0_ng_template_1_div_2_h4_1_button_2_Template","inf_r3","WorkPackageActivityTabComponent_work_package_comment_0_ng_template_1_div_2_h4_1_Template","isNextDate","WorkPackageActivityTabComponent_work_package_comment_0_ng_template_1_div_2_Template","WorkPackageActivityTabComponent_work_package_comment_0_ng_template_1_Template","WorkPackageActivityTabComponent","tabName","WorkPackageActivityTabComponent_Template","WorkPackageActivityTabComponent_work_package_comment_0_Template","ActivityEntryInfo","activityDate","dateOfPrevious","forceReverse","orderedIndex","idx","WorkPackageLinkedResourceCache","aggregated","promises","sortedActivityList","sorted","storage_r2","allowManageFileLinks$","WorkPackageFilesTabComponent","hook","storagesResourceService","projectStoragesResourceService","canViewFileLinks","showAttachmentHeader$","viewPermission","WorkPackageFilesTabComponent_Template","WorkPackageFilesTabComponent_div_3_Template","WorkPackageFilesTabComponent_section_6_Template","currentTab","ReplaySubject","updateTabs","lastActiveTab","isCurrentState","goCurrentShowState","currentTabIdentifier","updateTab","WorkPackageOverviewTabComponent","WorkPackageOverviewTabComponent_Template","WorkPackageOverviewTabComponent_wp_single_view_0_Template","WorkPackageOverviewTabComponent_div_1_Template","WorkPackageRelationsTabComponent","WorkPackageRelationsTabComponent_Template","WorkPackageRelationsTabComponent_div_0_Template","loadingError","watcher_r2","WorkPackageWatchersTabComponent","wpWatchersService","allowedToView","allowedToAdd","allowedToRemove","watching","loadCurrentWatchers","availableWatchersPath","watchers","addWatcher","removeWatcher","loadingPromise","watcher","user_id","WorkPackageWatchersTabComponent_Template","WorkPackageWatchersTabComponent_div_1_Template","WorkPackageWatchersTabComponent_op_wp_watcher_entry_4_Template","WorkPackageWatchersTabComponent_Template_op_user_autocompleter_change_7_listener","WorkPackageWatchersService","cacheDurationInSeconds","isCached","isRequested","cached","idLabel","infoRow","createdBy","lastUpdatedOn","WorkPackageSingleViewComponent_div_0_div_7_div_3_span_4_Template","descriptor_r11","spanAll","WorkPackageSingleViewComponent_div_0_div_7_div_3_Template","switchToProjectText","component_r13","attributeGroupComponent","group_r14","_c3","WorkPackageSingleViewComponent_div_0_div_13_ng_container_1_Template","WorkPackageSingleViewComponent_div_0_div_13_ng_container_2_Template","shouldHideGroup","isolated","WorkPackageSingleViewComponent_div_0_div_1_Template","WorkPackageSingleViewComponent_div_0_wp_status_button_3_Template","WorkPackageSingleViewComponent_div_0_attribute_help_text_4_Template","WorkPackageSingleViewComponent_div_0_div_5_Template","WorkPackageSingleViewComponent_div_0_div_7_Template","WorkPackageSingleViewComponent_div_0_div_8_Template","WorkPackageSingleViewComponent_div_0_ng_container_9_Template","WorkPackageSingleViewComponent_div_0_div_13_Template","_c4","showTwoColumnLayout","showSwitchToProjectBanner","prependedAttributeGroupComponents","groupedFields","attachmentUploadComponent","_c5","storage_r21","WorkPackageSingleViewComponent_div_1_ndc_dynamic_5_Template","WorkPackageSingleViewComponent_div_1_op_storage_6_Template","attachmentListComponent","WorkPackageSingleViewComponent","projectStoragesService","showProject","uiSelfRef","$current","contextFrom","updateWorkPackageCreationState","rebuildGroupedFields","_attributeGroups","getFields","manageFileLinks","ps","members","queryInNew","elem","projectname","getBoundingClientRect","attributeGroups","groupId","getAttributesGroupId","randomString","fieldNames","descriptors","getDateField","displayField","isFormattable","schemaHref","projectHref","baseSchema","overflowingIdentifier","WorkPackageSingleViewComponent_Template","WorkPackageSingleViewComponent_div_0_Template","WorkPackageSingleViewComponent_div_1_Template","uniqueElementIdentifier","WorkPackageSubjectComponent","WorkPackageSubjectComponent_Template","WorkPackageSubjectComponent_div_0_Template","TabPortalOutlet","availableTabs","outletElement","componentFactoryResolver","activeTabs","activeComponents","switchTo","activateInstance","_getComponentRootNode","portal","setAttachedHost","dispose","createComponent","resolveComponentFactory","componentClass","ComponentPortal","attachView","hostView","detachView","rootNodes","upsaleCheckOutLink","upsaleRelationColumns","WpTableConfigurationColumnsTabComponent","availableColumnsOptions","column2Like","availableColumns","availableColumnsMap","selectedColumns","selectedColumnMap","columnsHelp","columnsLabel","multiSelectLabel","setColumnsById","updateSelected","WpTableConfigurationColumnsTabComponent_Template","WpTableConfigurationColumnsTabComponent_Template_draggable_autocompleter_onChange_2_listener","WpTableConfigurationColumnsTabComponent_op_enterprise_banner_4_Template","display_mode","hierarchy_hint","group_r2","WpTableConfigurationDisplaySettingsTabComponent","wpTableSums","displayMode","availableGroups","displaySums","choose_mode","label_group_by","display_sums","display_sums_hint","grouped","setEnabled","updateGroup","WpTableConfigurationDisplaySettingsTabComponent_Template","WpTableConfigurationDisplaySettingsTabComponent_Template_input_ngModelChange_6_listener","WpTableConfigurationDisplaySettingsTabComponent_Template_input_ngModelChange_15_listener","WpTableConfigurationDisplaySettingsTabComponent_span_20_Template","WpTableConfigurationDisplaySettingsTabComponent_Template_input_ngModelChange_24_listener","WpTableConfigurationDisplaySettingsTabComponent_Template_select_change_29_listener","WpTableConfigurationDisplaySettingsTabComponent_option_30_Template","WpTableConfigurationDisplaySettingsTabComponent_Template_input_change_36_listener","WpTableConfigurationFiltersTab_op_query_filters_0_Template_op_query_filters_filtersChanged_0_listener","WpTableConfigurationFiltersTab","upsaleRelationColumnsLink","WpTableConfigurationFiltersTab_Template","WpTableConfigurationFiltersTab_op_query_filters_0_Template","upsaleAttributeHighlighting","more_info_link","WpTableConfigurationHighlightingTabComponent_form_2_Template_input_ngModelChange_4_listener","WpTableConfigurationHighlightingTabComponent_form_2_Template_input_change_4_listener","updateMode","WpTableConfigurationHighlightingTabComponent_form_2_Template_ng_select_ngModelChange_9_listener","selectedAttributes","WpTableConfigurationHighlightingTabComponent_form_2_Template_ng_select_open_9_listener","WpTableConfigurationHighlightingTabComponent_form_2_Template_ng_select_change_9_listener","updateHighlightingAttributes","WpTableConfigurationHighlightingTabComponent_form_2_Template_input_ngModelChange_13_listener","entireRowMode","WpTableConfigurationHighlightingTabComponent_form_2_Template_input_change_13_listener","WpTableConfigurationHighlightingTabComponent_form_2_Template_ng_select_ngModelChange_17_listener","lastEntireRowAttribute","WpTableConfigurationHighlightingTabComponent_form_2_Template_ng_select_open_17_listener","WpTableConfigurationHighlightingTabComponent_form_2_Template_ng_select_change_17_listener","WpTableConfigurationHighlightingTabComponent_form_2_Template_input_ngModelChange_21_listener","WpTableConfigurationHighlightingTabComponent_form_2_Template_input_change_21_listener","highlighting_mode","disabledValue","inline","inline_all_attributes","availableInlineHighlightedAttributes","entire_row_by","availableRowHighlightedAttributes","none","WpTableConfigurationHighlightingTabComponent","Banners","priority","availableHighlightedAttributes","setSelectedValues","currentValues","WpTableConfigurationHighlightingTabComponent_Query","WpTableConfigurationHighlightingTabComponent_op_enterprise_banner_1_Template","WpTableConfigurationHighlightingTabComponent_form_2_Template","sort_r2","column_r8","WpTableConfigurationSortByTabComponent_ng_container_15_div_1_label_11_Template_input_ngModelChange_1_listener","direction","index_r3","availableDirection_r9","WpTableConfigurationSortByTabComponent_ng_container_15_div_1_Template_select_change_5_listener","_r15","updateSelection","WpTableConfigurationSortByTabComponent_ng_container_15_div_1_option_6_Template","WpTableConfigurationSortByTabComponent_ng_container_15_div_1_option_8_Template","WpTableConfigurationSortByTabComponent_ng_container_15_div_1_label_11_Template","emptyColumn","availableDirections","WpTableConfigurationSortByTabComponent_ng_container_15_div_1_Template","sortationObjects","SortModalObject","WpTableConfigurationSortByTabComponent","sort_criteria_1","sort_criteria_2","sort_criteria_3","sorting_mode","automatic","manually","warning","allColumns","sortingMode","sortElements","manualSortColumn","getMatchingSort","onReadyWithAvailable","getManualSortingOption","updateSortingMode","updateUsedColumns","fillUpSortElements","usedColumns","differenceBy","WpTableConfigurationSortByTabComponent_Template","WpTableConfigurationSortByTabComponent_Template_input_ngModelChange_6_listener","WpTableConfigurationSortByTabComponent_Template_input_change_6_listener","WpTableConfigurationSortByTabComponent_Template_input_ngModelChange_11_listener","WpTableConfigurationSortByTabComponent_Template_input_change_11_listener","WpTableConfigurationSortByTabComponent_ng_container_15_Template","zoom","level_r3","zoomLevel","column_r6","labels","key_r4","WpTableConfigurationTimelinesTabComponent_ng_container_8_div_12_Template_select_change_6_listener","updateLabels","WpTableConfigurationTimelinesTabComponent_ng_container_8_div_12_option_7_Template","WpTableConfigurationTimelinesTabComponent_ng_container_8_Template_select_change_7_listener","WpTableConfigurationTimelinesTabComponent_ng_container_8_option_8_Template","WpTableConfigurationTimelinesTabComponent_ng_container_8_div_12_Template","autoZoom","availableZoomLevels","availableLabels","WpTableConfigurationTimelinesTabComponent","zoomLevelOrder","display_timelines","display_timelines_hint","weeks","months","quarters","years","auto","bar","farRight","allPropertyColumns","WpTableConfigurationTimelinesTabComponent_Template","WpTableConfigurationTimelinesTabComponent_Template_input_change_6_listener","WpTableConfigurationTimelinesTabComponent_ng_container_8_Template","filter_r1","WpTableConfigurationRelationSelectorComponent","relationFilterIds","availableRelationFilters","selectedRelationFilter","filter_work_packages_by_relation_type","precedes","follows","relates","duplicates","duplicated","blocks","blocked","requires","partof","relationFiltersOf","setSelectedRelationFilter","currentRelationFilters","onRelationFilterSelected","removeRelationFiltersFromCurrentState","addFilterToCurrentState","filtersToRemove","getOperatorForId","compareRelationFilters","f1","f2","WpTableConfigurationRelationSelectorComponent_Template","WpTableConfigurationRelationSelectorComponent_Template_select_ngModelChange_4_listener","WpTableConfigurationRelationSelectorComponent_option_5_Template","WpTableConfigurationModalComponent_ng_container_5_ng_container_1_Template","prependModalComponent","WpTableConfigurationModalComponent_op_scrollable_tabs_6_Template_op_scrollable_tabs_tabSelected_0_listener","tabPortalHost","WpTableConfigurationModalPrependToken","InjectionToken","WpTableConfigurationModalComponent","applyButton","onDataUpdated","wpTableConfigurationService","WpTableConfigurationService","tabs","tabContentOutlet","initialTabName","initialTab","saveChanges","onClose","afterFocusOn","WpTableConfigurationModalComponent_Query","WpTableConfigurationModalComponent_ng_container_5_Template","WpTableConfigurationModalComponent_op_scrollable_tabs_6_Template","WpTableConfigurationModalComponent_Template_button_click_11_listener","WpTableConfigurationModalComponent_Template_button_click_12_listener","_tabs","WorkPackageContextMenuHelperService","wpViewRepresentation","wpViewTimeline","wpViewIndent","BULK_ACTIONS","getPermittedActionLinks","permittedActionConstants","allowSplitScreenActions","singularPermittedActions","allowedActions","getAllowedActions","getAllowedParentActions","getAllowedRelationActions","allowedAction","linkForAction","getIntersectOfPermittedActions","bulkPermittedActions","possibleActions","permittedActions","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","EmbeddedTablesMacroComponent","contextMenuEnabled","EmbeddedTablesMacroComponent_Template","WorkPackageEmbeddedTableEntryComponent","initialLoadingIndicator","WorkPackageEmbeddedTableEntryComponent_Template","WorkPackageEmbeddedBaseComponent","WorkPackagesViewBase","uniqueEmbeddedTableName","renderTable","showTablePagination","WorkPackageTableConfiguration","providedConfiguration","buildUrlParams","setLoaded","tableVisible","firstPage","queryProjectScope","loadingIndicatorService","initializeStates","ChangeDetectorRef","WorkPackageEmbeddedTableComponent_div_0_ng_container_1_wp_table_2_Template_wp_table_itemClicked_0_listener","handleWorkPackageClicked","WorkPackageEmbeddedTableComponent_div_0_ng_container_1_wp_table_2_Template_wp_table_stateLinkClicked_0_listener","openStateLink","WorkPackageEmbeddedTableComponent_div_0_ng_container_1_wp_grid_4_Template_wp_grid_itemClicked_0_listener","WorkPackageEmbeddedTableComponent_div_0_ng_container_1_wp_grid_4_Template_wp_grid_stateLinkClicked_0_listener","WorkPackageEmbeddedTableComponent_div_0_ng_container_1_op_filter_container_1_Template","WorkPackageEmbeddedTableComponent_div_0_ng_container_1_wp_table_2_Template","WorkPackageEmbeddedTableComponent_div_0_ng_container_1_wp_grid_4_Template","withFilters","isCardView","WorkPackageEmbeddedTableComponent_div_0_ng_container_1_Template","WorkPackageEmbeddedTableComponent_div_0_div_2_Template","hierarchyToggleEnabled","compactTableStyle","externalHeight","WorkPackageEmbeddedTableComponent","onError","onQueryLoaded","loadedQuery","setActions","openConfigurationModal","onUpdated","apiv3Service","WorkPackageEmbeddedTableComponent_Template","WorkPackageEmbeddedTableComponent_div_0_Template","OpModalService","WorkPackageViewPaginationService","ExternalQueryConfigurationComponent","OpQueryConfigurationLocalsToken","ExternalQueryConfigurationComponent_Query","RestrictedWpTableConfigurationService","ExternalQueryConfigurationComponent_Template","ExternalQueryConfigurationService","bodyPortalHost","_portalHostElement","hostElement","_bodyPortalHost","DomPortalOutlet","externalQueryConfigurationComponent","injectorFor","attach","hasAttached","injectorTokens","WeakMap","PortalInjector","ExternalRelationQueryConfigurationComponent","useValue","ExternalRelationQueryConfigurationComponent_Template","ExternalRelationQueryConfigurationService","disabledTabs","SortHeaderDirective_span_1_span_1_Template_span_click_0_listener","toggleHierarchy","hierarchyIcon","headerColumn","directionClass","openMenu","SortHeaderDirective_span_1_span_1_Template","SortHeaderDirective_span_1_a_2_Template","SortHeaderDirective_span_1_a_3_Template","SortHeaderDirective_span_1_op_icon_4_Template","displayHierarchyIcon","sortable","displayDropdownIcon","SortHeaderDirective_span_2_op_icon_4_Template","columnName","baselineIncompatible","SortHeaderDirective_span_4_a_1_Template","SortHeaderDirective_span_4_a_2_Template","SortHeaderDirective_span_4_span_3_Template","SortHeaderDirective_span_4_op_icon_4_Template","SortHeaderDirective","latestSortElement","currentSortDirection","setActiveColumnClass","isSortable","getDirectionClass","isHierarchyColumn","columnType","relationColumnType","isHierarchyDisabled","setHierarchyIcon","isIncompatibleColumn","toggleState","SortHeaderDirective_Template","SortHeaderDirective_span_1_Template","SortHeaderDirective_span_2_Template","SortHeaderDirective_span_3_Template","SortHeaderDirective_span_4_Template","OpTableAction","applicable","buildElement","contextColumnIcon","contextMenuLinkClassName","OpDetailsTableAction","uiStatebuilder","detailsLink","OpContextMenuTableAction","linkTitle","contextMenu","built","WorkPackageTablePaginationComponent_div_0_ng_container_6_li_1_Template_button_click_1_listener","pageNumber_r8","showPage","WorkPackageTablePaginationComponent_div_0_ng_container_6_li_1_Template","prePageNumbers","pageNumber_r13","WorkPackageTablePaginationComponent_div_0_ng_container_7_li_1_button_2_Template_button_click_0_listener","_r19","WorkPackageTablePaginationComponent_div_0_ng_container_7_li_1_em_1_Template","WorkPackageTablePaginationComponent_div_0_ng_container_7_li_1_button_2_Template","WorkPackageTablePaginationComponent_div_0_ng_container_7_li_1_Template","WorkPackageTablePaginationComponent_div_0_ng_container_7_li_2_Template","pageNumbers","postPageNumbers","WorkPackageTablePaginationComponent_div_0_ng_container_8_li_1_Template_button_click_1_listener","pageNumber_r22","WorkPackageTablePaginationComponent_div_0_ng_container_8_li_1_Template","no_other_page","infoText","WorkPackageTablePaginationComponent_div_0_div_16_li_3_span_1_Template_button_click_1_listener","_r31","perPageOption_r26","selectPerPage","WorkPackageTablePaginationComponent_div_0_div_16_li_3_span_1_Template","WorkPackageTablePaginationComponent_div_0_div_16_li_3_span_2_Template","WorkPackageTablePaginationComponent_div_0_div_16_li_3_Template","per_page","WorkPackageTablePaginationComponent_div_0_Template_button_click_4_listener","_r35","ctx_r34","WorkPackageTablePaginationComponent_div_0_ng_container_6_Template","WorkPackageTablePaginationComponent_div_0_ng_container_7_Template","WorkPackageTablePaginationComponent_div_0_ng_container_8_Template","WorkPackageTablePaginationComponent_div_0_Template_button_click_10_listener","ctx_r36","WorkPackageTablePaginationComponent_div_0_span_14_Template","WorkPackageTablePaginationComponent_div_0_li_15_Template","WorkPackageTablePaginationComponent_div_0_div_16_Template","showPageSelections","label_previous","label_next","currentRange","showPerPageOptions","WorkPackageTablePaginationComponent","TablePaginationComponent","wpPagination","showPerPage","isManualSortingMode","paginationInfoText","setPerPage","updateFromObject","pageNumber","WorkPackageTablePaginationComponent_Template","WorkPackageTablePaginationComponent_div_0_Template","timelineElementCssClass","timelineBackgroundElementClass","timelineGridElementCssClass","timelineMarkerSelectionStartClass","timelineHeaderCSSClass","timelineHeaderSelector","TimelineViewParametersSettings","visibleBeforeTodayInZoomLevel","getPixelPerDayForZoomLevel","requiredPixelMarginLeft","TimelineViewParameters","minute","seconds","dateDisplayStart","dateDisplayEnd","settings","activeSelectionMode","selectionModeStart","pixelPerDay","maxWidthInPx","maxSteps","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","providedConfig","inlineCreateEnabled","filtersExpanded","k","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","_ref5","_ref3","inlineCreateService","updateRenderedOrder","sibling","rowIndex","collapsedGroupId","collapsedGroupElements","getElementsByClassName","collapsedGroupLastChild","findRowIndex","reinsert","sourceIndex","_x3","_x4","_x5","_x6","onCloned","original","maxWidth","_x7","_x8","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","positionArgs","ContextMenuClickHandler","ContextMenuKeyboardHandler","keyCode","F10","altKey","my","at","ContextMenuRightClickHandler","RowClickHandler","activeFieldClassName","RowDoubleClickHandler","GroupRowHandler","parents","toggleGroupCollapseState","HierarchyClickHandler","WorkPackageStateLinksHandler","ColumnsTransformer","HierarchyTransformer","lastValue","renderHierarchyState","isCollapsed","RelationsTransformer","RowsTransformer","changedId","SelectionTransformer","ifShouldFocus","renderSelectionState","TimelineTransformer","renderVisibility","TableHandlerRegistry","stateTransformers","viewRef","cssClassRowHovered","WpTableHoverSync","tableAndTimeline","lastHoveredElement","eventListener","handleHover","passive","removeEventListener","removeAllHoverClasses","locateHoveredTableRow","locateHoveredTimelineRow","parentTableRow","parentTimelineRow","removeOldAndAddNewHoverClass","extractWorkPackageId","getAttribute","hovered","tableRow","timelineRow","WorkPackagesTableComponent_div_0_th_17_op_icon_2_Template","manualSortEnabled","column_r15","custom_field","name_locale","WorkPackagesTableComponent_div_0_th_20_div_1_Template","numTableColumns","WorkPackagesTableComponent_div_0_tbody_25_Template_tbody_showing_0_listener","inlineCreateVisible","WorkPackagesTableComponent_div_0_col_4_Template","WorkPackagesTableComponent_div_0_col_5_Template","WorkPackagesTableComponent_div_0_col_6_Template","WorkPackagesTableComponent_div_0_col_7_Template","WorkPackagesTableComponent_div_0_col_8_Template","WorkPackagesTableComponent_div_0_th_17_Template","WorkPackagesTableComponent_div_0_th_18_Template","WorkPackagesTableComponent_div_0_th_19_Template","WorkPackagesTableComponent_div_0_th_20_Template","WorkPackagesTableComponent_div_0_tbody_21_Template","WorkPackagesTableComponent_div_0_tbody_25_Template","WorkPackagesTableComponent_div_0_div_26_Template","baselineEnabled","tableSummary","tableSummaryHints","tableElement","sumVisible","WorkPackagesTableComponent","zone","limitedResults","configurationObject","scrollSyncUpdate","wpTableHoverSync","registerTimeline","controller","getTableAndTimelineElement","$tableSide","$timelineSide","WorkPackagesTableComponent_Template","WorkPackagesTableComponent_div_0_Template","ndcDynamicInputs_r1","WpTabWrapperComponent_ng_container_0_ndc_dynamic_1_Template","WpTabWrapperComponent","wpTabsService","ndcDynamicInputs$","findTab","getTab","WpTabWrapperComponent_Template","WpTabWrapperComponent_ng_container_0_Template","WpTabsComponent_ng_container_1_Template_button_click_2_listener","WpTabsComponent_ng_container_1_Template_button_click_5_listener","goToFullScreen","WpTabsComponent","canViewWatchers","uiSrefBase","getDisplayableTabs","routeParams","WpTabsComponent_Template","WpTabsComponent_ng_container_1_Template","workPackageWatchersCount","workPackageRelationsCount","workPackageNotificationsCount","WpSingleViewService","nonDateAlertNotificationsCount$","workPackageFilesCount","attachmentService","fileLinkService","WorkPackageTabsService","registeredTabs","buildDefaultTabs","patchTabCondition","displayable","tabDefinition","counter","tabId","showCountAsBubble","paddedNumber","padStart","formatElapsedTime","startTime","floor","WorkPackageTimerButtonComponent_ng_container_0_ng_container_1_Template_button_click_1_listener","stop_timer","elapsed$","WorkPackageTimerButtonComponent_ng_container_0_button_2_Template_button_click_0_listener","start_timer","WorkPackageTimerButtonComponent_ng_container_0_ng_container_1_Template","WorkPackageTimerButtonComponent_ng_container_0_button_2_Template","WorkPackageTimerButtonComponent","timeEntryService","timeEntryEditService","timeEntryCreateService","timer$","activeTimer$","timer_already_stopped","activeForWorkPackage","stopTimerAndEdit","showStopModal","startTimer","createNewTimeEntry","StopExistingTimerModalComponent","WorkPackageTimerButtonComponent_Template","WorkPackageTimerButtonComponent_ng_container_0_Template","WorkPackageTypeStatusComponent","WorkPackageTypeStatusComponent_Template","WorkPackageTypeStatusComponent_div_0_Template","WorkPackageWatcherButtonComponent_button_0_Template_button_click_0_listener","toggleWatch","WorkPackageWatcherButtonComponent_button_0_span_2_Template","watchIconClass","showText","WorkPackageWatcherButtonComponent","setWatchStatus","isWatched","displayWatchButton","toggleLink","nextStateLink","WorkPackageWatcherButtonComponent_Template","WorkPackageWatcherButtonComponent_button_0_Template","timelineRendered","derive","$","renderedWorkPackageIds","WorkPackageIsolatedQuerySpaceDirective","standalone","useExisting","WorkPackageViewFiltersService","WorkPackageViewSumService","WorkPackageViewAdditionalElementsService","WorkPackageViewDisplayRepresentationService","WorkPackageViewIncludeSubprojectsService","WorkPackageService","WorkPackageCellLabels","leftHover","rightHover","withAlternativeLabels","classNameLeftLabel","classNameRightContainer","classNameRightLabel","classNameLeftHoverLabel","classNameRightHoverLabel","classNameHoverStyle","classNameFarRightLabel","classNameShowOnHover","classNameHideOnHover","classNameLeftHandle","classNameRightHandle","TimelineCellRenderer","workPackageTimeline","label_children_derived_duration","ganttChartRowHeight","canMoveDates","isNaN","displayPlaceholderUnderCursor","renderInfo","dateUnderCursor","dayOffset","cursorDateAndDayOffset","displayDurationForDate","pointerEvents","zIndex","applyTypeColor","assignDateValues","assignDate","onDaysMoved","dayUnderCursor","initialStartDate","initialDueDate","calculatedDueDate","onMouseDown","dateForCreate","mouseDirection","projection","mouseDownCursorType","forceCursor","onMouseDownEnd","backgroundImage","setElementPositionAndSize","checkForActiveSelectionMode","checkForSpecialDisplaySituations","offsetX","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","ESCAPE","handleMouseMoveOnEmptyCell","cursor","onmouseleave","onmousedown","clickStart","offsetDayStart","mouseMoveOnEmptyCellFn","mouseDownType","relativePosition","offsetDayCurrent","onmouseup","disableViewParamsCalculation","onmousemove","resetCursor","invalidDates","cancelChange","clearValue","saveWorkPackage","refreshView","workPackageMouseDownFn","classNameActiveDrag","createMouseMoveFn","WorkPackageTimelineCell","renderers","latestRenderInfo","wpElement","cellRenderer","canConnectRelations","cellElement","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","_viewParameters","cellsRenderer","selectionParams","refreshRequest","collapsedGroupsCellsMap","scrollBar","getFirstDayInViewport","getLastDayInViewport","outerContainer","setupManageCollapsedGroupHeaderCells","workPackageCells","workPackageIndex","onRefreshRequested","getParentScrollContainer","applyAutoZoomLevel","appliedZoomLevel","calculateViewParams","cb","refreshCollapsedGroupsHeaderCells","currentWidth","scrollWidth","activateSelectionMode","nonVisibleDaysLeft","viewPortRight","daysUntilViewPortEnds","resetSelectionMode","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","WorkPackageTimelineTableController_Template","OpColumnsContextMenu","OpContextMenuTrigger","confirmDialog","confirmDelete","buildItems","showAnchorRight","contextMenuId","assign","linkText","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","WorkPackageTimelineHeaderController_Template","workPackagePrefix","TimelineRelationElement","belongsToId","timelineGlobalElementCssClassname","newSegment","yPosition","WorkPackageTableTimelineRelations","workPackagesWithRelations","setupRelationSubscription","relationsForWorkPackage","renderWorkPackagesRelations","workPackageWithRelation","removeRelationElementsForWorkPackage","renderElement","removeAllVisibleElements","renderElements","wpIdsWithRelations","startCells","endCells","startCell","idxFrom","endCell","idxTo","renderRelation","rowFrom","rowTo","startX","targetX","directionY","directionX","paddingRight","startLineWith","lastX","WorkPackageTableTimelineRelations_Template","timelineStaticElementCssClassname","TimelineStaticElement","finishElement","TodayLineElement","offsetToday","dayProgress","WorkPackageTableTimelineStaticElements","timelineSide","visibleDaysBeforeToday","visibleDaysBeforeTodayPositionPixels","WorkPackageTableTimelineStaticElements_Template","WorkPackageTableTimelineGrid","gridContainer","paddingTop","checkForNonWorkingDayHighlight","testSelector","getDate","getMonth","getFullYear","WorkPackageTableTimelineGrid_Template","WorkPackageWatcherEntryComponent","panelCtrl","WorkPackageWatcherEntryComponent_Template","WorkPackageWatcherEntryComponent_Template_button_click_3_listener","WorkPackageTableSumsRowController","isHidden","groupSumsBuilder","totalSums","WorkPackageTableSumsRowController_HostBindings","WorkPackageRelationQueryComponent_ng_container_0_div_1_Template","WorkPackageRelationQueryComponent_ng_container_0_Template_wp_embedded_table_onQueryLoaded_2_listener","WorkPackageRelationQueryComponent","relatedTo","getRelationTypeFromQuery","WorkPackageRelationQueryComponent_Template","WorkPackageRelationQueryComponent_ng_container_0_Template","WorkPackagesTableConfigMenuComponent","configureTable","openTableConfigurationModal","WorkPackagesTableConfigMenuComponent_Template","WorkPackagesTableConfigMenuComponent_Template_button_click_0_listener","OpWpTabsModule","OpenprojectTabsModule","WorkPackageFormAttributeGroupComponent_div_0_ng_template_1_div_0_span_3_Template","descriptor_r1","WorkPackageFormAttributeGroupComponent_div_0_ng_template_1_div_0_Template","WorkPackageFormAttributeGroupComponent_div_0_ng_template_1_div_1_Template","WorkPackageFormAttributeGroupComponent_div_0_ng_template_1_Template","shouldHideField","WorkPackageFormAttributeGroupComponent","wpEditForm","parentClassName","editMode","WorkPackageFormAttributeGroupComponent_HostBindings","WorkPackageFormAttributeGroupComponent_div_0_Template","TimeEntryChangeset","buildPayloadFromChanges","OpenprojectStoragesModule","SortFilesPipe","CookieService","StorageInformationService","OpSpotModule","StorageComponent","StorageLoginButtonComponent","FileLinkListItemComponent","FilePickerModalComponent","LocationPickerModalComponent","LoadingFileListComponent","StorageInformationComponent","StorageFileListItemComponent","UploadConflictModalComponent","bootstrapAttributeGroupsCalled","bootstrapAttributeGroups","hookService","OpAttachmentsComponent","OpenprojectEditorModule","OpenprojectAttachmentsModule","OpenprojectModalModule","OpenprojectAutocompleterModule","EditFieldControlsModule","WorkPackageViewPageComponent","WorkPackageListViewComponent","WpResizerDirective","OpTypesContextMenuDirective","OpSettingsMenuDirective","WorkPackageStatusDropdownDirective","WorkPackageCreateSettingsMenuDirective","WorkPackageSingleContextMenuDirective","WorkPackageViewDropdownMenuDirective","WorkPackageGroupToggleDropdownMenuDirective","UserLinkComponent","WorkPackagesFullViewComponent","QuerySharingFormComponent","QuerySharingModalComponent","SaveQueryModalComponent","WpDestroyModalComponent","WpButtonMacroModalComponent","PartitionedQuerySpacePageComponent_ul_5_ng_container_1_li_1_Template","PartitionedQuerySpacePageComponent_ul_5_ng_container_1_Template","jump_to_pagination","text_jump_to_pagination","filterAllowed","inviteModal","shouldUpdateHtmlTitle","queryTitle","setupInformationLoadedListener","queryParamListener","updateTitle","additionalLoadingTime","loadFirstPage","opStaticQueries","getStaticName","isFirstLoad","PartitionedQuerySpacePageComponent_Template","PartitionedQuerySpacePageComponent_op_back_button_3_Template","PartitionedQuerySpacePageComponent_Template_editable_toolbar_title_onSave_4_listener","PartitionedQuerySpacePageComponent_Template_editable_toolbar_title_onEmptySubmit_4_listener","PartitionedQuerySpacePageComponent_ul_5_Template","PartitionedQuerySpacePageComponent_ndc_dynamic_7_Template","menuItemClass","showComponent","newComponent","makeFullWidth","showMobileAlternative","routeName","trans","reloadOnSearch","menuItem","newRoute","mobileAlternative","allowMovingInEditMode","WorkPackageEditFormRoutingService","EditFormRoutingService","blockedTransition","fromParams","WorkPackagesBaseComponent_Template","WorkPackagesFullViewComponent_div_0_li_11_Template","WorkPackagesFullViewComponent_div_0_li_13_Template","WorkPackagesFullViewComponent_div_0_li_14_Template","WorkPackagesFullViewComponent_div_0_li_15_Template","displayTimerButton","displayNotificationsButton$","fullView","buttonMore","focusAnchorLabel","WorkPackageSingleViewBase","recentItemsService","observeWorkPackage","setWorkPackageScopeProperties","WorkPackagesFullViewComponent_Template","WorkPackagesFullViewComponent_div_0_Template","WorkPackageListViewComponent_wp_table_3_Template_wp_table_itemClicked_0_listener","WorkPackageListViewComponent_wp_table_3_Template_wp_table_stateLinkClicked_0_listener","wpTableConfiguration","WorkPackageListViewComponent_div_4_Template_wp_grid_itemClicked_1_listener","handleWorkPackageCardClicked","WorkPackageListViewComponent_div_4_Template_wp_grid_stateLinkClicked_1_listener","showResizerInCardView","wpViewFilters","showTableView","tableInformationLoaded","showResultOverlay$","incomplete$","updateViewRepresentation","selectedRow","selectedCard","previousSibling","block","openInFullView","WorkPackageListViewComponent_Template","WorkPackageListViewComponent_div_0_Template","WorkPackageListViewComponent_op_baseline_legends_2_Template","WorkPackageListViewComponent_wp_table_3_Template","WorkPackageListViewComponent_div_4_Template","WorkPackageListViewComponent_div_5_Template","backToList","WorkPackageSplitViewComponent_div_0_div_2_op_back_button_7_Template","showBackButton","WorkPackageSplitViewComponent_div_0_div_2_Template","WorkPackageSplitViewComponent_div_0_div_3_Template","firstRoute","backRouting","isFirstRoute","isSameID","workPackageI","setRowState","whenChanged","handleLoadingError","flash_message","WorkPackageSplitViewComponent_Template","WorkPackageSplitViewComponent_div_0_Template","WpSingleViewStore","currentUser$","loggedIn","reloadOnCenterUpdate","requireInvolvedRelations","requireHierarchyElements","requireSumsSchema","loadAdditional","getInvolvedWorkPackages","resultIds","WorkPackageViewBaseService","updatesState","pristineState","lastUpdatedState","combinedRaw","combine","deriveRaw","pristine","BASELINE_INCOMPATIBLE_FILTERS","BASELINE_INCOMPATIBLE_COLUMNS","requireNonWorkingDaysOfTwoYears","lastYear","setFullYear","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","isCards","setDisplayRepresentation","representation","incomplete","rawFilters","modifier","newFilters","modify","filterOrId","availableSchemas","mapper","Set","isComplete","cloneFilters","invisibleFilters","isFocused","focusAfterRender","setFocusAfterRender","cur","wpViewHierarchies","wpRelationHierarchy","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","positionSwap","myPosition","neighbor","neighborPosition","insertAsFirst","successorPosition","rebuiltDelta","predecessorPosition","buildUpPredecessorPosition","distance","rebuildPositions","minMaxPositions","any","assignPosition","buildDelta","isAscendingOrder","upstreamOrder","pos","WorkPackageViewPagination","PaginationInstance","getCachedPerPage","currentState","updateFromResults","eachCallback","typeHref","nextState","initializeSelection","selectedWorkPackageIds","activeRowIndex","_emptyState","getSelectedWorkPackages","selectionCount","renderedElements","wasManuallySorted","isManuallySorted","criteria","findAvailableDirection","manualSortObject","defaultState","visibilityChanged","zoomLevelChanged","labelsChanged","setVisible","defaultLabels","positionAsString","setZoomLevel","applyZoomLevel","applied","showStaticPagePath","attachmentsResourceService","fileLinkResourceService","updateFocusAnchorLabel","queryLoaded","setupQueryObservers","setupRefreshObserver","setupQueryLoadedListener","setupChangeObserver","queryState","newQuery","triggerUpdate","filterRefreshEvents","StaticQueriesService","WorkPackageViewPageComponent_ul_5_ng_container_1_li_1_Template","WorkPackageViewPageComponent_ul_5_ng_container_1_Template","WorkPackageViewPageComponent_Template","WorkPackageViewPageComponent_op_back_button_3_Template","WorkPackageViewPageComponent_Template_editable_toolbar_title_onSave_4_listener","WorkPackageViewPageComponent_Template_editable_toolbar_title_onEmptySubmit_4_listener","WorkPackageViewPageComponent_ul_5_Template","WorkPackageViewPageComponent_ndc_dynamic_7_Template","addWorkPackageFullscreenLink","successful_delete","performBulkDelete","defaultHandling","OpAttachmentListItemComponent_button_10_Template_button_click_0_listener","confirmRemoveAttachment","deleteIconTitle","OpAttachmentListItemComponent","imageFileExtensions","removeFile","fileName","confirmDialogService","principalsResourceService","principalRendererService","dragHint","deleteTitle","deleteConfirmation","arg","viewInitialized$","fileIcon","getIconForMimeType","contentType","author$","timestampText","setDragData","downloadPath","previewElement","draggableHTML","dataTransfer","setData","setDragImage","isImage","src","ext","continue","dangerHighlighting","OpAttachmentListItemComponent_Query","OpAttachmentListItemComponent_Template_a_dragstart_1_listener","OpAttachmentListItemComponent_a_9_Template","OpAttachmentListItemComponent_button_10_Template","originOpen","clazz","OpAttachmentListComponent_ul_0_li_1_Template_li_removeAttachment_0_listener","attachment_r2","i_r3","OpAttachmentListComponent_ul_0_li_1_Template","OpAttachmentListComponent","OpAttachmentListComponent_Template","OpAttachmentListComponent_ul_0_Template","dragging","attachments$","OpAttachmentsComponent_input_2_Template_input_change_0_listener","onFilePickerChanged","dropFiles","dropClickFiles","OpAttachmentsComponent_button_3_Template_button_click_0_listener","triggerFileInput","OpAttachmentsComponent_button_3_Template_button_dragover_0_listener","onDragOver","OpAttachmentsComponent_button_3_Template_button_dragleave_0_listener","onDragLeave","OpAttachmentsComponent_button_3_Template_button_drop_0_listener","onDropFiles","OpAttachmentsComponent_button_3_span_3_Template","OpAttachmentsComponent_button_3_span_5_Template","draggingOverDropZone","uploadLabel","OpAttachmentsComponent_div_4_Template_button_click_1_listener","attachmentsSelector","attachmentsSelfLink","allowUploading","destroyImmediately","foldersWarning","onGlobalDragLeave","_event","onGlobalDragEnd","onGlobalDragEnter","newResource","compareCreatedAtTimestamps","rightCreatedAt","leftCreatedAt","filePicker","fileList","dropEffect","containsFiles","filesWithoutFolders","countBefore","filterFolders","OpAttachmentsComponent_Query","OpAttachmentsComponent_op_attachment_list_0_Template","OpAttachmentsComponent_input_2_Template","OpAttachmentsComponent_button_3_Template","OpAttachmentsComponent_div_4_Template","AttributeHelpTextsService","helpTexts","requireById","additionalLabel","AttributeHelpTextComponent_div_0_Template_div_click_0_listener","AttributeHelpTextComponent_div_0_Template_div_keydown_enter_0_listener","AttributeHelpTextComponent_div_0_Template_div_keydown_space_0_listener","AttributeHelpTextComponent_div_0_span_1_Template","open_dialog","attributeHelpTextSelector","AttributeHelpTextComponent","attributeHelpTexts","helpTextId","AttributeHelpTextModalComponent","helpText","attributeScope","AttributeHelpTextComponent_Template","AttributeHelpTextComponent_div_0_Template","helpTextLink","editText","AttributeHelpTextModalComponent_Template","AttributeHelpTextModalComponent_fieldset_6_Template","AttributeHelpTextModalComponent_Template_button_click_9_listener","AttributeHelpTextModalComponent_a_11_Template","attributeCaption","AttributeHelpTextModule","StaticAttributeHelpTextComponent","StaticAttributeHelpTextModalComponent","staticAttributeHelpTextSelector","StaticAttributeHelpTextComponent_HostBindings","StaticAttributeHelpTextComponent_Template_div_click_0_listener","StaticAttributeHelpTextComponent_Template_div_keydown_enter_0_listener","StaticAttributeHelpTextComponent_Template_div_keydown_space_0_listener","StaticAttributeHelpTextModalComponent_Template","StaticAttributeHelpTextModalComponent_Template_button_click_9_listener","AutocompleteSelectDecorationComponent_op_project_autocompleter_0_Template_op_project_autocompleter_change_0_listener","updateProjectSelection","currentProjectSelection","multiselect","item_r5","AutocompleteSelectDecorationComponent_ng_select_1_Template_ng_select_ngModelChange_0_listener","AutocompleteSelectDecorationComponent_ng_select_1_ng_template_1_Template","AutocompleteSelectDecorationComponent","inputId","syncInputFieldName","setInitialSelection","isProjectField","setInitialProjectSelection","removeCurrentSyncedFields","createSyncedField","mappedItems","AutocompleteSelectDecorationComponent_Query","AutocompleteSelectDecorationComponent_op_project_autocompleter_0_Template","AutocompleteSelectDecorationComponent_ng_select_1_Template","OpAutocompleterFooterTemplateDirective","add_new_action","search_r3","search_r5","item_r4","CreateAutocompleterComponent","finishedLoading","onKeydown","onAfterViewInit","onAddNew","_openDirectly","openSelect","openDirectly","changeModel","keyPressed","focusInputField","CreateAutocompleterComponent_Query","CreateAutocompleterComponent_Template_ng_select_ngModelChange_0_listener","CreateAutocompleterComponent_Template_ng_select_change_0_listener","CreateAutocompleterComponent_Template_ng_select_open_0_listener","CreateAutocompleterComponent_Template_ng_select_close_0_listener","CreateAutocompleterComponent_Template_ng_select_keydown_0_listener","CreateAutocompleterComponent_ng_template_2_Template","CreateAutocompleterComponent_ng_template_3_Template","availableValues","DraggableAutocompleteComponent_div_2_Template_a_click_2_listener","item_r2","DraggableAutocompleteComponent","dragula","autofocus","_selected","updateAvailableOptions","columnsGroup","createGroup","drag","setBodyCursor","drop","that","autoscroll","DomAutoscrollService","margin","maxSpeed","scrollWhenOutside","autoScroll","down","drake","clearModel","DraggableAutocompleteComponent_Query","DraggableAutocompleteComponent_Template_div_dragulaModelChange_1_listener","DraggableAutocompleteComponent_div_2_Template","DraggableAutocompleteComponent_Template_ng_select_open_3_listener","DraggableAutocompleteComponent_Template_ng_select_change_3_listener","_updateXPosition","_updateYPosition","OpAutocompleterHeaderTemplateDirective","OpAutocompleterLabelTemplateDirective","OpAutocompleterOptionTemplateDirective","OpAutocompleterService","loadAvailable","searchKey","loadValue","loadData","OpAutocompleterComponent_6_ng_template_0_Template","OpAutocompleterComponent_7_ng_template_0_Template","OpAutocompleterComponent_9_ng_template_0_Template","OpAutocompleterComponent_ng_template_10_ng_container_0_op_principal_2_Template","OpAutocompleterComponent_ng_template_10_ng_container_0_span_4_Template","OpAutocompleterComponent_ng_template_10_ng_container_1_op_principal_2_Template","OpAutocompleterComponent_ng_template_10_ng_container_0_Template","OpAutocompleterComponent_ng_template_10_ng_container_1_Template","OpAutocompleterComponent_ng_template_10_ng_container_2_Template","OpAutocompleterComponent_ng_template_12_ng_container_0_span_1_Template","OpAutocompleterComponent_ng_template_12_ng_container_1_Template_span_click_1_listener","OpAutocompleterComponent_ng_template_12_ng_container_0_Template","OpAutocompleterComponent_ng_template_12_ng_container_1_Template","_addTag","addNewObjectFn","vcRef","defaultData","focusDirectly","fetchDataDirectly","inputBindValue","items$","keydown","scroll","scrollToEnd","initialDebounce","opAutocompleterService","onTouched","inputValue","syncHiddenField","mappedInputValue","autocompleteInputStream","repositionDropdown","getOptionsItems","focusSelect","writeValue","debounce","getDebounceTimeout","queryString","NEVER","registerOnChange","fn","registerOnTouched","applyTemplates","templateInjector","setInput","changeDetectorRef","providers","syncedInput","dispatchEvent","OpAutocompleterComponent_ContentQueries","NG_VALUE_ACCESSOR","forwardRef","OpAutocompleterComponent_Template","OpAutocompleterComponent_input_1_Template","OpAutocompleterComponent_Template_ng_select_ngModelChange_2_listener","OpAutocompleterComponent_Template_ng_select_change_2_listener","OpAutocompleterComponent_Template_ng_select_open_2_listener","OpAutocompleterComponent_Template_ng_select_close_2_listener","OpAutocompleterComponent_Template_ng_select_blur_2_listener","OpAutocompleterComponent_Template_ng_select_focus_2_listener","OpAutocompleterComponent_Template_ng_select_clear_2_listener","OpAutocompleterComponent_Template_ng_select_keydown_2_listener","OpAutocompleterComponent_Template_ng_select_keydown_escape_2_listener","OpAutocompleterComponent_Template_ng_select_search_2_listener","OpAutocompleterComponent_Template_ng_select_scroll_2_listener","OpAutocompleterComponent_Template_ng_select_scrollToEnd_2_listener","OpAutocompleterComponent_Template_ng_select_add_2_listener","OpAutocompleterComponent_Template_ng_select_remove_2_listener","OpAutocompleterComponent_6_Template","OpAutocompleterComponent_7_Template","OpAutocompleterComponent_ng_template_8_Template","OpAutocompleterComponent_9_Template","OpAutocompleterComponent_ng_template_10_Template","OpAutocompleterComponent_ng_template_12_Template","VersionAutocompleterComponent","WorkPackageAutocompleterComponent","TimeEntryWorkPackageAutocompleterComponent","UserAutocompleterComponent","UserAutocompleterTemplateComponent","ProjectAutocompleterComponent","ProjectAutocompleterTemplateComponent","ColorsAutocompleterComponent","OpSearchHighlightDirective","DragulaModule","FormsModule","disabledReason","numberOfAncestors","ProjectAutocompleterTemplateComponent_ng_template_2_div_2_Template","search_r6","ProjectAutocompleterTemplateComponent_Query","ProjectAutocompleterTemplateComponent_ng_template_0_Template","ProjectAutocompleterTemplateComponent_ng_template_2_Template","flattenProjectTree","projectTreeItems","depth","fullList","projectTreeItem","insertProjectWithAncestors","tree","ancestorToFind","ancestorInTree","buildTree","recursiveSort","ProjectAutocompleterComponent_6_ng_template_0_Template","ProjectAutocompleterComponent_7_ng_template_0_Template","ProjectAutocompleterComponent_9_ng_template_0_Template","ProjectAutocompleterComponent_ng_template_10_ng_container_0_op_principal_2_Template","ProjectAutocompleterComponent_ng_template_10_ng_container_0_span_4_Template","ProjectAutocompleterComponent_ng_template_10_ng_container_1_op_principal_2_Template","ProjectAutocompleterComponent_ng_template_10_ng_container_0_Template","ProjectAutocompleterComponent_ng_template_10_ng_container_1_Template","ProjectAutocompleterComponent_ng_template_10_ng_container_2_Template","ProjectAutocompleterComponent_ng_template_12_ng_container_0_span_1_Template","ProjectAutocompleterComponent_ng_template_12_ng_container_1_Template_span_click_1_listener","ProjectAutocompleterComponent_ng_template_12_ng_container_0_Template","ProjectAutocompleterComponent_ng_template_12_ng_container_1_Template","isInlineContext","mapResultsFn","valueChange","projectTracker","getAvailableProjects","dataLoaded","disableSelectedItems","normalizedValue","arrayedValue","filteredURL","buildFilteredURL","filterObject","searchFilters","fromFilterObject","ProjectAutocompleterComponent_HostBindings","ProjectAutocompleterComponent_Template","ProjectAutocompleterComponent_input_1_Template","ProjectAutocompleterComponent_Template_ng_select_ngModelChange_2_listener","ProjectAutocompleterComponent_Template_ng_select_change_2_listener","ProjectAutocompleterComponent_Template_ng_select_open_2_listener","ProjectAutocompleterComponent_Template_ng_select_close_2_listener","ProjectAutocompleterComponent_Template_ng_select_blur_2_listener","ProjectAutocompleterComponent_Template_ng_select_focus_2_listener","ProjectAutocompleterComponent_Template_ng_select_clear_2_listener","ProjectAutocompleterComponent_Template_ng_select_keydown_2_listener","ProjectAutocompleterComponent_Template_ng_select_keydown_escape_2_listener","ProjectAutocompleterComponent_Template_ng_select_search_2_listener","ProjectAutocompleterComponent_Template_ng_select_scroll_2_listener","ProjectAutocompleterComponent_Template_ng_select_scrollToEnd_2_listener","ProjectAutocompleterComponent_Template_ng_select_add_2_listener","ProjectAutocompleterComponent_Template_ng_select_remove_2_listener","ProjectAutocompleterComponent_6_Template","ProjectAutocompleterComponent_7_Template","ProjectAutocompleterComponent_ng_template_8_Template","ProjectAutocompleterComponent_9_Template","ProjectAutocompleterComponent_ng_template_10_Template","ProjectAutocompleterComponent_ng_template_12_Template","TimeEntryWorkPackageAutocompleterComponent_ng_template_1_Template_li_click_3_listener","setMode","TimeEntryWorkPackageAutocompleterComponent_ng_template_1_Template_li_click_5_listener","recent","modeSwitch","TimeEntryWorkPackageAutocompleterComponent_Template","TimeEntryWorkPackageAutocompleterComponent_Template_op_autocompleter_change_0_listener","TimeEntryWorkPackageAutocompleterComponent_Template_op_autocompleter_open_0_listener","TimeEntryWorkPackageAutocompleterComponent_Template_op_autocompleter_close_0_listener","TimeEntryWorkPackageAutocompleterComponent_Template_op_autocompleter_keydown_0_listener","TimeEntryWorkPackageAutocompleterComponent_ng_template_1_Template","item_r3","UserAutocompleterTemplateComponent_ng_template_0_op_principal_0_Template","search_r4","inviteUserToProject","UserAutocompleterTemplateComponent_2_ng_template_0_Template","UserAutocompleterTemplateComponent_Query","UserAutocompleterTemplateComponent_ng_template_0_Template","UserAutocompleterTemplateComponent_2_Template","UserAutocompleterComponent_6_ng_template_0_Template","UserAutocompleterComponent_7_ng_template_0_Template","UserAutocompleterComponent_9_ng_template_0_Template","UserAutocompleterComponent_ng_template_10_ng_container_0_op_principal_2_Template","UserAutocompleterComponent_ng_template_10_ng_container_0_span_4_Template","UserAutocompleterComponent_ng_template_10_ng_container_1_op_principal_2_Template","UserAutocompleterComponent_ng_template_10_ng_container_0_Template","UserAutocompleterComponent_ng_template_10_ng_container_1_Template","UserAutocompleterComponent_ng_template_10_ng_container_2_Template","UserAutocompleterComponent_ng_template_12_ng_container_0_span_1_Template","UserAutocompleterComponent_ng_template_12_ng_container_1_Template_span_click_1_listener","UserAutocompleterComponent_ng_template_12_ng_container_0_Template","UserAutocompleterComponent_ng_template_12_ng_container_1_Template","userInvited","getAvailableUsers","searchString","UserAutocompleterComponent_Template","UserAutocompleterComponent_input_1_Template","UserAutocompleterComponent_Template_ng_select_ngModelChange_2_listener","UserAutocompleterComponent_Template_ng_select_change_2_listener","UserAutocompleterComponent_Template_ng_select_open_2_listener","UserAutocompleterComponent_Template_ng_select_close_2_listener","UserAutocompleterComponent_Template_ng_select_blur_2_listener","UserAutocompleterComponent_Template_ng_select_focus_2_listener","UserAutocompleterComponent_Template_ng_select_clear_2_listener","UserAutocompleterComponent_Template_ng_select_keydown_2_listener","UserAutocompleterComponent_Template_ng_select_keydown_escape_2_listener","UserAutocompleterComponent_Template_ng_select_search_2_listener","UserAutocompleterComponent_Template_ng_select_scroll_2_listener","UserAutocompleterComponent_Template_ng_select_scrollToEnd_2_listener","UserAutocompleterComponent_Template_ng_select_add_2_listener","UserAutocompleterComponent_Template_ng_select_remove_2_listener","UserAutocompleterComponent_6_Template","UserAutocompleterComponent_7_Template","UserAutocompleterComponent_ng_template_8_Template","UserAutocompleterComponent_9_Template","UserAutocompleterComponent_ng_template_10_Template","UserAutocompleterComponent_ng_template_12_Template","onCreate","canCreateNewActionElements","createNewVersion","getVersionPayload","definingProject","VersionAutocompleterComponent_Template","VersionAutocompleterComponent_Template_ng_select_ngModelChange_0_listener","VersionAutocompleterComponent_Template_ng_select_change_0_listener","VersionAutocompleterComponent_Template_ng_select_open_0_listener","VersionAutocompleterComponent_Template_ng_select_close_0_listener","VersionAutocompleterComponent_Template_ng_select_keydown_0_listener","VersionAutocompleterComponent_ng_template_2_Template","VersionAutocompleterComponent_ng_template_3_Template","WorkPackageAutocompleterComponent_Template","WorkPackageAutocompleterComponent_Template_ng_select_ngModelChange_0_listener","WorkPackageAutocompleterComponent_Template_ng_select_change_0_listener","WorkPackageAutocompleterComponent_Template_ng_select_open_0_listener","WorkPackageAutocompleterComponent_Template_ng_select_close_0_listener","WorkPackageAutocompleterComponent_Template_ng_select_keydown_0_listener","WorkPackageAutocompleterComponent_ng_template_2_Template","WorkPackageAutocompleterComponent_ng_template_3_Template","collapsibleSectionAugmentSelector","CollapsibleSectionComponent","sectionTitle","sectionBody","removeAttribute","CollapsibleSectionComponent_Query","CollapsibleSectionComponent_Template_button_click_1_listener","highlightColor","colorsAutocompleterSelector","highlightTextInline","setColorOptions","updateInputField","getElementsByName","updateInput","onModelChange","selectedOption","selectedColorId","selectedColor","highlightingClass","ColorsAutocompleterComponent_Template","ColorsAutocompleterComponent_Template_ng_select_ngModelChange_0_listener","ColorsAutocompleterComponent_Template_ng_select_change_0_listener","ColorsAutocompleterComponent_ng_template_1_Template","ColorsAutocompleterComponent_ng_template_2_Template","colorModes","lightHighContrast","light","ColorsService","colorMode","valueHash","opacity","charCodeAt","copyToClipboardSelector","CopyToClipboardComponent","copyToClipboardService","clickTarget","clipboardTarget","CopyToClipboardComponent_Template","changeDetection","CopyToClipboardService","successMessage","clipboard","writeText","addNotification","cstr","declaredInputsParentKey","declaredInputs","outsideName","insideName","OpDateTimeComponent","dateTimeValue","OpDateTimeComponent_Template","OpDatePickerBannerComponent_op_modal_banner_0_Template_op_modal_banner_buttonClicked_0_listener","openGantt","manually_scheduled","click_on_show_relations_to_open_gantt","show_relations_button","OpDatePickerBannerComponent_op_modal_banner_2_Template_op_modal_banner_buttonClicked_0_listener","automatically_scheduled_parent","OpDatePickerBannerComponent_ng_container_3_op_modal_banner_1_Template_op_modal_banner_buttonClicked_0_listener","start_date_limited_by_relations","OpDatePickerBannerComponent_ng_container_3_op_modal_banner_4_Template_op_modal_banner_buttonClicked_0_listener","changing_dates_affects_follow_relations","OpDatePickerBannerComponent_ng_container_3_op_modal_banner_1_Template","OpDatePickerBannerComponent_ng_container_3_op_modal_banner_4_Template","hasPrecedingRelations$","hasFollowingRelations$","isChild","OpDatePickerBannerComponent","isParent","dateModalRelations","hasRelations$","precedingWorkPackages$","followingWorkPackages$","button_name","getInvolvedWorkPackageIds","OpDatePickerBannerComponent_Template","OpDatePickerBannerComponent_op_modal_banner_0_Template","OpDatePickerBannerComponent_op_modal_banner_2_Template","OpDatePickerBannerComponent_ng_container_3_Template","OpBasicRangeDatePickerComponent_input_0_Template_input_ngModelChange_0_listener","changeValueFromInputDebounced","OpBasicRangeDatePickerComponent_input_0_Template_input_focus_0_listener","showDatePicker","inputClassNames","stringValue","OpBasicRangeDatePickerComponent_ng_container_1_Template_input_ngModelChange_1_listener","OpBasicRangeDatePickerComponent_ng_container_1_Template_input_ngModelChange_3_listener","OpBasicRangeDatePickerComponent","_value","resolveDateArrayToString","mobile","minimalDate","changeValueFromInput","initializeDatePicker","newDates","resolveDateStringToArray","datePickerInstance","DatePicker","allowInput","showMonths","_date","_datestr","calendarContainer","dateStr","onDayCreate","dObj","dStr","fp","trim","OpBasicRangeDatePickerComponent_Query","OpBasicRangeDatePickerComponent_Template","OpBasicRangeDatePickerComponent_input_0_Template","OpBasicRangeDatePickerComponent_ng_container_1_Template","OpBasicSingleDatePickerComponent_input_0_Template_input_input_0_listener","OpBasicSingleDatePickerComponent_input_0_Template_input_focus_0_listener","remoteFieldKey","OpBasicSingleDatePickerComponent_ng_container_1_Template_input_ngModelChange_1_listener","opBasicSingleDatePickerSelector","OpBasicSingleDatePickerComponent","picked","setDates","_dObj","_dStr","_fp","OpBasicSingleDatePickerComponent_Query","OpBasicSingleDatePickerComponent_Template","OpBasicSingleDatePickerComponent_input_0_Template","OpBasicSingleDatePickerComponent_ng_container_1_Template","datepickerElemIdentifier","datepickerTarget","datepickerFormat","weekdaysPromise","datepickerInstance","redraw","mergedOptions","datePickerInstances","flatpickr","setDate","option","weekNumbers","getWeek","defaultDate","shorthand","longhand","weekAbbreviation","rangeSeparator","mappedDate","setHours","areDatesEqual","firstDate","secondDate","parsedDate1","parsedDate2","keepCurrentlyActiveMonth","datePicker","currentMonth","currentYear","comparableDate","enforceDate","newStart","newEnd","selectedStart","selectedEnd","enforcedMonth","enforcedYear","monthDiff","isDayDisabled","OpModalSingleDatePickerComponent_ng_template_2_Template_input_ngModelChange_0_listener","OpModalSingleDatePickerComponent_ng_template_2_Template_input_click_0_listener","onInputClick","OpModalSingleDatePickerComponent_ng_template_2_Template_input_focus_0_listener","OpModalSingleDatePickerComponent_spot_selector_field_5_Template_spot_switch_ngModelChange_1_listener","changeNonWorkingDays","opModalSingleDatePickerSelector","OpModalSingleDatePickerComponent","writeWorkingValue","_opened","initializeDatepickerAfterOpen","spotDropModalTeleportationService","showIgnoreNonWorkingDays","workingValue","workingDate","useDefaultTrigger","applyLabel","ngAfterContentInit","reportValidity","enforceManualChangesToDatepicker","afterRenderOnce$","initializeDatepicker","flatpickrTarget","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","OpModalSingleDatePickerComponent_Query","OpModalSingleDatePickerComponent_Template","OpModalSingleDatePickerComponent_Template_spot_drop_modal_closed_0_listener","OpModalSingleDatePickerComponent_ng_template_2_Template","OpModalSingleDatePickerComponent_Template_form_submit_4_listener","OpModalSingleDatePickerComponent_spot_selector_field_5_Template","OpModalSingleDatePickerComponent_Template_spot_text_field_ngModelChange_8_listener","OpModalSingleDatePickerComponent_Template_button_click_9_listener","OpModalSingleDatePickerComponent_Template_button_click_14_listener","OpDatePickerSchedulingToggleComponent","scheduling","onToggle","OpDatePickerSchedulingToggleComponent_Template","OpDatePickerSchedulingToggleComponent_Template_spot_switch_ngModelChange_1_listener","DateModalRelationsService","setChangeset","changeset$","getMinimalDateFromPreceeding","minimalDateFromPrecedingRelationship","relationDate","parsedRelationDate","preceding","following","DateModalSchedulingService","isSchedulable","dayElement","OpDatePickerSheetComponent","_dayElem","datesSelected","isFirstChange","OpDatePickerSheetComponent_Query","OpDatePickerWorkingDaysToggleComponent","OpDatePickerWorkingDaysToggleComponent_Template","OpDatePickerWorkingDaysToggleComponent_Template_spot_switch_ngModelChange_1_listener","OpWpMultiDateFormComponent","dateModalScheduling","focusHelper","classNameWide","startDateChanged$","startDateDebounced$","debouncedInput","endDateChanged$","endDateDebounced$","datepickerChanged$","modalPositioned","dateUpdates$","handleSingleDateUpdate","clearWithDuration","toggleCurrentActivatedField","durationChanges$","durationDebounced$","applyDurationChange","durationFocused","ignoreNonWorkingDaysWritable","formUpdates$","minimalSchedulingDate","fieldsToUpdate","updateDatesFromForm","getForm","setDurationDaysFromUpstream","setCurrentActivatedField","initialActivatedField","durationField","changeSchedulingMode","durationAsIso8601","doSave","doCancel","updateDate","currentlyActivatedDateField","isStateOfCurrentActivatedField","showTodayLink","showFieldAsActive","handleDurationFocusIn","handleDurationFocusOut","displayedDuration","ensureHoveredSelection","activeField","setDatesAndDeriveDuration","latestSelectedDateObj","selectedDate","replaceDatesWithNewSelection","moveActiveDate","deriveMissingDateFromDuration","durationActiveDateSelected","selectedIsoDate","setDaysInOrder","parsedStartDate","parsedEndDate","applyNewDates","durationDays","input$","fromEvent","OpWpMultiDateFormComponent_Query","OpWpMultiDateFormComponent_Template","OpWpMultiDateFormComponent_Template_form_submit_0_listener","OpWpMultiDateFormComponent_Template_op_datepicker_scheduling_toggle_ngModelChange_5_listener","OpWpMultiDateFormComponent_Template_op_datepicker_working_days_toggle_ngModelChange_6_listener","OpWpMultiDateFormComponent_Template_spot_text_field_ngModelChange_9_listener","OpWpMultiDateFormComponent_Template_spot_text_field_focusin_9_listener","OpWpMultiDateFormComponent_Template_button_click_10_listener","OpWpMultiDateFormComponent_Template_spot_text_field_ngModelChange_12_listener","OpWpMultiDateFormComponent_Template_spot_text_field_focusin_12_listener","OpWpMultiDateFormComponent_Template_button_click_13_listener","OpWpMultiDateFormComponent_Template_spot_text_field_ngModelChange_15_listener","OpWpMultiDateFormComponent_Template_spot_text_field_focusin_15_listener","OpWpMultiDateFormComponent_Template_spot_text_field_focusout_15_listener","OpWpMultiDateFormComponent_Template_button_click_21_listener","OpWpSingleDateFormComponent","dateChangedManually$","debounceDelay","OpWpSingleDateFormComponent_Query","OpWpSingleDateFormComponent_Template","OpWpSingleDateFormComponent_Template_form_submit_0_listener","OpWpSingleDateFormComponent_Template_op_datepicker_scheduling_toggle_ngModelChange_4_listener","OpWpSingleDateFormComponent_Template_op_datepicker_working_days_toggle_ngModelChange_5_listener","OpWpSingleDateFormComponent_Template_spot_text_field_ngModelChange_7_listener","OpWpSingleDateFormComponent_Template_button_click_8_listener","OpWpSingleDateFormComponent_Template_button_click_13_listener","DynamicBootstrapComponent","templateString","innerHtml","dynamicBootstrapper","DynamicBootstrapComponent_Template","FormsService","_httpClient","submit$","resourceEndpoint","resourceId","formHttpMethod","formSchema","modelToSubmit","formatModelToSubmit","getRawValue","httpMethod","handleBackendFormValidationErrors","validateForm$","getFormattedErrors","formattedErrors","setFormValidationErrors","formModel","linksModel","mainModel","resourcesModel","formSchemaKey","keyToRemove","mainModelWithoutResource","formattedResourcesModel","resourceKey","resourceModel","resourceElement","formatModelToEdit","metaModel","otherElements","otherElementsModel","isValue","getFormattedResourcesModel","formErrors","formControl","getAllFormValidationErrors","formControlKeys","keysToValidate","DynamicFieldsService","formsService","selectDefaultValue","inputsCatalogue","useForFields","editorType","noWrapLabel","expressionProperties","templateOptions.clearable","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","inputConfig","configCustomizations","isMultiSelectField","rtl","optionsValues","formatAllowedValues","addParamToHref","prependCurrentValue","prependDefaultValue","formWithFieldGroups","newFormFieldGroup","getDefaultFieldGroupSettings","fieldGroupConfig","fieldGroupClassName","isFieldGroup","collapsibleFieldGroups","collapsibleFieldGroupsCollapsed","getGroupFields","collapsibleFieldGroupsCollapsedExpressionProperty","groupField","parentForm","DynamicFormService","_dynamicFieldsService","_formsService","registerForm","getSettingsFromBackend$","formEndpoint","formPath","formConfig","getSettings","DynamicFormComponent_form_0_div_2_Template_button_click_3_listener","handleCancel","DynamicFormComponent_form_0_Template_form_submit_0_listener","submitForm","DynamicFormComponent_form_0_Template_formly_form_modelChange_1_listener","DynamicFormComponent_form_0_div_2_Template","innerModel","handleSubmit","DynamicFormComponent_formly_form_1_Template_formly_form_modelChange_0_listener","formattedModel","dynamicFormService","patchValue","dynamicFieldsService","showNotifications","showValidationErrorsOn","modelChange","errored","load_error_message","successful_update","successful_create","job_started","noSettingsSourceErrorMessage","noPathToSubmitToError","setDisabledState","enable","dynamicFormGroup","fieldsSettingsPipe","initializeDynamicForm","formResponse","showSuccessNotification","validateForm","dirty","history","back","formEndPoint","getFormEndPoint","setupDynamicFormFromSettings","setupDynamicFormFromBackend","dynamicFormSettings","setupDynamicForm","formattedSettings","submitMessage","DynamicFormComponent_Query","FormlyForm","DynamicFormComponent_Template","DynamicFormComponent_form_0_Template","DynamicFormComponent_formly_form_1_Template","TextInputComponent","FieldType","TextInputComponent_Template","IntegerInputComponent","IntegerInputComponent_Template","search_r2","SelectInputComponent","SelectInputComponent_Template","SelectInputComponent_ng_template_2_Template","SelectInputComponent_ng_template_3_Template","ProjectInputComponent","ProjectInputComponent_Template","cssClass","SelectProjectStatusInputComponent","projectStatusCodeCssClass","SelectProjectStatusInputComponent_Template","SelectProjectStatusInputComponent_ng_template_2_Template","SelectProjectStatusInputComponent_ng_template_3_Template","BooleanInputComponent","BooleanInputComponent_Template","FormattableControlComponent","onTouch","attachmentLabel","syncCKEditorReadonlyMode","valueToEmit","ckEditorInstance","editor","enableReadOnlyMode","disableReadOnlyMode","_editor","ui","focusTracker","touched","FormattableControlComponent_Query","OpCkeditorComponent","FormattableControlComponent_Template","FormattableControlComponent_Template_op_ckeditor_contentChanged_1_listener","FormattableControlComponent_Template_op_ckeditor_initializationFailed_1_listener","FormattableControlComponent_Template_op_ckeditor_initializeDone_1_listener","FormattableTextareaInputComponent","FormattableTextareaInputComponent_Template","helpTextAttributeScope","dynamicFormComponent","showValidationErrorOn","DynamicFieldWrapperComponent","FieldWrapper","DynamicFieldWrapperComponent_Template","DynamicFieldWrapperComponent_spot_form_field_0_Template","DynamicFieldWrapperComponent_spot_selector_field_1_Template","DateInputComponent","class","DateInputComponent_HostBindings","DynamicFieldGroupWrapperComponent_fieldset_0_Template_button_click_2_listener","DynamicFieldGroupWrapperComponent","DynamicFieldGroupWrapperComponent_Template","DynamicFieldGroupWrapperComponent_fieldset_0_Template","DynamicFieldGroupWrapperComponent_fieldset_1_Template","FormattableControlModule","FormattableEditFieldModule","UserInputComponent","UserInputComponent_Template","FormlyModule","forRoot","NgOptionHighlightModule","EditableToolbarTitleComponent_div_0_button_1_Template_button_click_0_listener","query_has_changed_click_to_save","EditableToolbarTitleComponent_div_0_Template_div_focusout_0_listener","saveWhenFocusOutside","EditableToolbarTitleComponent_div_0_button_1_Template","EditableToolbarTitleComponent_div_0_Template_input_focus_2_listener","onFocus","EditableToolbarTitleComponent_div_0_Template_input_blur_2_listener","onBlur","EditableToolbarTitleComponent_div_0_Template_input_keydown_escape_2_listener","EditableToolbarTitleComponent_div_0_Template_input_keydown_enter_2_listener","EditableToolbarTitleComponent_div_0_Template_input_ngModelChange_2_listener","initialFocus","selectableTitleIdentifier","input_placeholder","input_title","smallHeader","triggerEditingEvent","EditableToolbarTitleComponent","editableClass","showSaveCondition","onEmptySubmit","baseClass","click_to_edit","press_enter_to_save","confirm_edit_cancel","duplicate_query_title","inputField","inputTitle","firstChange","selectInputOnInitalFocus","toggleToolbarButtonVisibility","whenOutside","resetInputField","onEmptyError","emitSave","focusInputOnError","EditableToolbarTitleComponent_Query","EditableToolbarTitleComponent_div_0_Template","EditableToolbarTitleComponent_h2_1_Template","ckeditorAugmentedTextareaSelector","CkeditorAugmentedTextareaComponent","Notifications","turboMode","readOnly","formElement","wrappedTextArea","textareaSelector","previewContext","registerFormSubmitListener","saveForm","markEdited","syncToTextarea","submitter","requestSubmit","setup","setupAttachmentAddedCallback","setupAttachmentRemovalSignal","setLabel","getRawData","removedUrls","downloadLocation","fire","textareaId","substring","ckContent","CkeditorAugmentedTextareaComponent_Query","CkeditorAugmentedTextareaComponent_Template_op_ckeditor_initializeDone_1_listener","CkeditorAugmentedTextareaComponent_Template_op_ckeditor_contentChanged_1_listener","CkeditorAugmentedTextareaComponent_Template_op_ckeditor_saveRequested_1_listener","CkeditorAugmentedTextareaComponent_fieldset_2_Template","CKEditorPreviewService","refs","matchedElements","ref","CKEditorSetupService","loadedLocale","prefetch","wrapper","initialData","editorClass","OPConstrainedEditor","OPClassicEditor","toolbarWrapper","contentWrapper","uiLocale","contentLanguage","openProject","createConfig","createWatchdog","watchdog","toolbar","getData","OPEditorWatchdog","setCreator","createCustomized","setDestructor","helpURL","errorTitle","newVal","_content","ckEditorSetup","initializeDone","contentChanged","initializationFailed","saveRequested","allowManualMode","manualMode","debouncedEmitter","getTransformedContent","leading","codeMirrorInstance","notificationOnError","initializeEditor","editorPromise","opCkeditorReplacementContainer","setupWatchdog","enableManualMode","disableManualMode","interceptModifiedEnterKeystrokes","DragEvent","listenTo","imported","CodeMirror","lineNumbers","smartIndent","OpCkeditorComponent_Query","OpCkeditorComponent_div_1_Template","initializeServices","EditorMacrosService","WikiIncludePageMacroModalComponent","CodeBlockMacroModalComponent","ChildPagesMacroModalComponent","EnterpriseBannerComponent_button_7_Template_button_click_0_listener","toggleCollapse","become_hero","you_contribute","EnterpriseBannerComponent_div_11_a_1_Template","upgrade","enterpriseBannerSelector","EnterpriseBannerComponent","leftMargin","enterpriseFeature","enterprise_edition","opReferrer","textMessage","linkMessage","EnterpriseBannerComponent_Template","EnterpriseBannerComponent_button_7_Template","EnterpriseBannerComponent_span_10_Template","EnterpriseBannerComponent_div_11_Template","feature_description","benefits_description","premium_features_text","professional_support_text","feature_video","feature_image","enterprisePageSelector","EnterprisePageComponent","hide_breadcrumb","button_contact_us","upgrade_link","contact_link","enterprise_info_html","feature_title","upgrade_info","button_contact","button_upgrade","feature_more_info","more_info","EnterprisePageComponent_Template","EnterprisePageComponent_p_2_Template","EnterprisePageComponent_p_3_Template","EnterprisePageComponent_video_5_Template","EnterprisePageComponent_img_6_Template","EnterprisePageComponent_img_7_Template","Changeset","pristineValue","getPristine","loadedForm","updatePristineResource","buildRequestPayload","_pristineResource","proxyGet","setNewDefaults","changeMap","isWritable","humanName","valueExists","isOverridden","minimalPayload","plainPayload","getLinkedValue","fl","isArrayType","fieldCache","setSpanAttributes","requestedAttribute","getText","getAriaLabel","getFieldForCurrentContext","activeChange","titleContent","labelContent","getLabelContent","displayName","DisplayFieldComponent","containerType","displayFieldOptions","getDisplayFieldInstance","displayClass","displayFieldContext","DisplayFieldComponent_Query","cssClassCustomOption","Field","texts","renderEmpty","emptyDiv","MultipleLinesCustomOptionsDisplayField","ResourcesDisplayField","renderValues","MultipleLinesUserFieldModule","principalRenderer","renderMultiple","PrincipalRendererService","ProgressTextDisplayField","ProgressDisplayField","percentLabel","AbstractFieldService","getFieldForContext","isCustomMultiLinesField","isVersionMultiLinesField","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","initializeEditMode","skippedFields","onSavedEmitter","registeredFields","confirmText","requiresConfirmation","unregisterListener","onBefore","waitForField","ctrl","setActive","editContainer","closeEditFields","hasActiveFields","skipField","activateOnForm","activeFieldContainerClassName","EditFormComponent_Template","errorsPerAttribute","renderField","activateWhenNeeded","openFields","handleSubmissionErrors","resetChange","handleErroneousAttributes","erroneousAttributes","setErrorsForFields","erroneousFields","loadFormAndCheck","fieldHandler","_onSubmitHandlers","_onBeforeSubmitHandlers","errorMessageOnLabel","registerOnSubmit","onBeforeSubmit","registerOnBeforeSubmit","EditFormPortalComponent_div_0_Template_form_submit_1_listener","EditFormPortalComponent_div_0_ng_container_4_Template","isErrorenous","fieldInjector","EditFormPortalComponent","editField","onEditFieldReady","editFieldHandler","schemaInput","changeInput","createLocalInjector","EditFormPortalComponent_Template","EditFormPortalComponent_div_0_Template","HalResourceEditFieldHandler","withErrors","setClickOffset","tagName","setPosition","blurActiveField","activeElement","HTMLElement","outlet","createDomOutlet","localInjector","attachComponentPortal","EditFieldControlsComponent","saveTitle","EditFieldControlsComponent_Template","EditFieldControlsComponent_Template_button_click_2_listener","EditFieldControlsComponent_Template_button_click_4_listener","FormattableEditFieldComponent_edit_field_controls_3_Template_edit_field_controls_onSave_0_listener","FormattableEditFieldComponent_edit_field_controls_3_Template_edit_field_controls_onCancel_0_listener","isPreview","previewHtml","getCurrentValue","rawValue","FormattableEditFieldComponent_Query","FormattableEditFieldComponent_Template_op_ckeditor_contentChanged_2_listener","FormattableEditFieldComponent_Template_op_ckeditor_initializationFailed_2_listener","FormattableEditFieldComponent_Template_op_ckeditor_initializeDone_2_listener","FormattableEditFieldComponent_Template_op_ckeditor_saveRequested_2_listener","FormattableEditFieldComponent_edit_field_controls_3_Template","EditableAttributeFieldComponent","isDropTarget","startDragActivation","displayContainer","activateIfEditable","hasSelectionWithin","getSelection","hasSelection","isWithin","anchorNode","EditableAttributeFieldComponent_Query","EditableAttributeFieldComponent_Template_div_dragover_0_listener","EditableAttributeFieldComponent_Template_div_click_3_listener","EditableAttributeFieldComponent_Template_div_keydown_enter_3_listener","wrapperClasses","ChangesetStates","changesets","ResourceChangesetCommit","newChangeset","unknownAttribute","attributeType","getClassFor","defaultFieldType","fieldClass","addSpecificFieldType","extendFieldType","code","ensureDefaultCode","projectStatusI18n","AttributeLabelMacroComponent","resourceLoader","help","not_found","invalid_attribute","hostTitle","capitalize","charAt","toUpperCase","loadResourceAttribute","markError","AttributeLabelMacroComponent_HostBindings","AttributeLabelMacroComponent_Template","AttributeLabelMacroComponent_ng_container_0_Template","AttributeLabelMacroComponent_span_1_Template","AttributeModelLoaderService","cache$","onStart","AttributeValueMacroComponent","loadAndRender","AttributeValueMacroComponent_Query","AttributeValueMacroComponent_Template","AttributeValueMacroComponent_span_0_Template","AttributeValueMacroComponent_display_field_1_Template","workPackage_r2","combinedDateDisplayField","WorkPackageQuickinfoMacroComponent_ng_container_0_ng_container_6_display_field_2_Template","WorkPackageQuickinfoMacroComponent_ng_container_0_ng_container_6_display_field_3_Template","WorkPackageQuickinfoMacroComponent_ng_container_0_ng_container_6_display_field_4_Template","WorkPackageQuickinfoMacroComponent_ng_container_0_display_field_1_Template","WorkPackageQuickinfoMacroComponent_ng_container_0_ng_container_6_Template","detailed","workPackageLink","WorkPackageQuickinfoMacroComponent","_e","WorkPackageQuickinfoMacroComponent_HostBindings","WorkPackageQuickinfoMacroComponent_Template","WorkPackageQuickinfoMacroComponent_ng_container_0_Template","WorkPackageQuickinfoMacroComponent_span_2_Template","TextEditFieldComponent","TextEditFieldComponent_Template","TextEditFieldComponent_Template_input_ngModelChange_0_listener","TextEditFieldComponent_Template_input_keydown_0_listener","TextEditFieldComponent_Template_input_focusout_0_listener","IntegerEditFieldComponent","IntegerEditFieldComponent_Template","IntegerEditFieldComponent_Template_input_ngModelChange_0_listener","IntegerEditFieldComponent_Template_input_keydown_0_listener","IntegerEditFieldComponent_Template_input_focusout_0_listener","SelectAutocompleterRegisterService","_fields","getAutocompleterOfAttribute","assignment","SelectEditFieldComponent","newElement","onNewValueAdded","_autocompleterComponent","valuesLoaded","valuesLoadingPromise","_syncUrlParamsOnChangeIfNeeded","editFormComponent","requiredPlaceholder","initialValueLoading","loadValues","autocompleterComponent","selectAutocompleterRegister","sortValues","addEmptyOption","loadValuesFromBackend","loadAllowedValues","cacheKey","fetchAllowedValueQuery","allowedValuesFilter","addValue","currentValueInvalid","emptyOption","getEmptyOption","isRequired","newType","SelectEditFieldComponent_Template","InjectFlags","Optional","MultiSelectEditFieldComponent_1_ng_template_0_Template_op_invite_user_button_invited_0_listener","MultiSelectEditFieldComponent_1_ng_template_0_Template","MultiSelectEditFieldComponent_edit_field_controls_2_Template_edit_field_controls_onSave_0_listener","MultiSelectEditFieldComponent_edit_field_controls_2_Template_edit_field_controls_onCancel_0_listener","MultiSelectEditFieldComponent","requestFocus","nullOption","showAddNewUserButton","openAutocompleteSelectField","buildSelectedOption","findValueOption","_selectedOption","valueOption","sortValuesByName","nameA","nameB","checkCurrentValueValidity","MultiSelectEditFieldComponent_Query","MultiSelectEditFieldComponent_Template_ng_select_ngModelChange_0_listener","MultiSelectEditFieldComponent_Template_ng_select_keydown_0_listener","MultiSelectEditFieldComponent_Template_ng_select_open_0_listener","MultiSelectEditFieldComponent_Template_ng_select_close_0_listener","MultiSelectEditFieldComponent_Template_ng_select_add_0_listener","MultiSelectEditFieldComponent_Template_ng_select_remove_0_listener","MultiSelectEditFieldComponent_1_Template","MultiSelectEditFieldComponent_edit_field_controls_2_Template","FloatEditFieldComponent","FloatEditFieldComponent_Template","FloatEditFieldComponent_Template_input_ngModelChange_0_listener","FloatEditFieldComponent_Template_input_keydown_0_listener","FloatEditFieldComponent_Template_input_focusout_0_listener","BooleanEditFieldComponent","BooleanEditFieldComponent_Template","BooleanEditFieldComponent_Template_input_change_0_listener","BooleanEditFieldComponent_Template_input_keydown_0_listener","DebouncedRequestSwitchmap","requestHandler","errorHandler","preFilterNull","debounceMs","lastResult","output$","lastRequestedValue","hasResults","until","WorkPackageEditFieldComponent","requests","errorNotificationHandler","WorkPackageEditFieldComponent_Template","DateEditFieldComponent","onModalClosed","DateEditFieldComponent_Template","DateEditFieldComponent_Template_op_basic_single_date_picker_ngModelChange_0_listener","DateEditFieldComponent_Template_op_basic_single_date_picker_keydown_escape_0_listener","DateEditFieldComponent_Template_op_basic_single_date_picker_keydown_enter_0_listener","DateEditFieldComponent_Template_op_basic_single_date_picker_picked_0_listener","ProjectStatusEditFieldComponent","availableStatuses","appendToContainer","currentStatusCode","ProjectStatusEditFieldComponent_Query","ProjectStatusEditFieldComponent_Template_ng_select_ngModelChange_0_listener","ProjectStatusEditFieldComponent_Template_ng_select_open_0_listener","ProjectStatusEditFieldComponent_Template_ng_select_close_0_listener","ProjectStatusEditFieldComponent_Template_ng_select_change_0_listener","ProjectStatusEditFieldComponent_ng_template_1_Template","ProjectStatusEditFieldComponent_ng_template_2_Template","PlainFormattableEditFieldComponent","PlainFormattableEditFieldComponent_Template","PlainFormattableEditFieldComponent_Template_input_ngModelChange_0_listener","PlainFormattableEditFieldComponent_Template_input_keydown_0_listener","PlainFormattableEditFieldComponent_Template_input_focusout_0_listener","TimeEntryWorkPackageEditFieldComponent","recentWorkPackageIds","sortValuesByRecentIds","TimeEntryWorkPackageEditFieldComponent_Template","DatePickerEditFieldComponent","showDatePickerModal","CombinedDateEditFieldComponent_op_wp_single_date_form_3_Template_op_wp_single_date_form_save_0_listener","CombinedDateEditFieldComponent_op_wp_single_date_form_3_Template_op_wp_single_date_form_cancel_0_listener","CombinedDateEditFieldComponent_op_wp_multi_date_form_4_Template_op_wp_multi_date_form_save_0_listener","CombinedDateEditFieldComponent_op_wp_multi_date_form_4_Template_op_wp_multi_date_form_cancel_0_listener","CombinedDateEditFieldComponent","isMultiDate","resetDates","dateAttribute","CombinedDateEditFieldComponent_Template","CombinedDateEditFieldComponent_Template_spot_drop_modal_closed_0_listener","CombinedDateEditFieldComponent_Template_input_click_1_listener","CombinedDateEditFieldComponent_Template_input_focus_1_listener","CombinedDateEditFieldComponent_op_wp_single_date_form_3_Template","CombinedDateEditFieldComponent_op_wp_multi_date_form_4_Template","ProjectEditFieldComponent_op_project_autocompleter_0_Template_op_project_autocompleter_change_0_listener","ProjectEditFieldComponent_op_project_autocompleter_0_Template_op_project_autocompleter_cancel_0_listener","APIFilters","ProjectEditFieldComponent","setUrl","loadFormAndSetUrl","newProject","fakeProjectHal","typeId","ProjectEditFieldComponent_Template","ProjectEditFieldComponent_op_project_autocompleter_0_Template","ProjectEditFieldComponent_ng_template_1_Template","HoursDurationEditFieldComponent","validity","parsedValue","HoursDurationEditFieldComponent_Template","HoursDurationEditFieldComponent_Template_input_ngModelChange_0_listener","_r0","HoursDurationEditFieldComponent_Template_input_keydown_0_listener","UserEditFieldComponent_op_user_autocompleter_0_Template_op_user_autocompleter_change_0_listener","UserEditFieldComponent_op_user_autocompleter_0_Template_op_user_autocompleter_cancel_0_listener","UserEditFieldComponent_op_user_autocompleter_0_Template_op_user_autocompleter_userInvited_0_listener","UserEditFieldComponent","newUser","UserEditFieldComponent_Template","UserEditFieldComponent_op_user_autocompleter_0_Template","DaysDurationEditFieldComponent","formattedValue","DaysDurationEditFieldComponent_Template","DaysDurationEditFieldComponent_Template_spot_drop_modal_closed_0_listener","DaysDurationEditFieldComponent_Template_input_click_1_listener","DaysDurationEditFieldComponent_Template_input_focus_1_listener","DaysDurationEditFieldComponent_Template_op_wp_multi_date_form_save_2_listener","DaysDurationEditFieldComponent_Template_op_wp_multi_date_form_cancel_2_listener","initializeCoreEditFields","editFieldService","selectAutocompleterRegisterService","TextDisplayField","FloatDisplayField","toLocaleString","useGrouping","maximumFractionDigits","IntegerDisplayField","ResourceDisplayField","ExpressionService","UNESCAPED_EXPRESSION","ESCAPED_EXPRESSION","unescape","FormattableDisplayField","ApplicationRef","DateTimeDisplayField","BooleanDisplayField","translatedValue","WorkPackageDisplayField","EstimatedTimeDisplayField","derivedText","derivedPropertyName","derivedValue","derivedValueString","renderActual","derived","renderDerived","actualPresent","WorkPackageSpentTimeDisplayField","wpID","appendTimelogLink","timelogElement","showTimelogWidget","showWorkPackageField","IdDisplayField","HighlightedResourceDisplayField","addHighlight","hlClass","TypeDisplayField","UserDisplayField","MultipleUserFieldModule","divContainer","renderAbridgedValues","dots","WorkPackageIdDisplayField","uiStateBuilder","ProjectStatusDisplayField","bulb","pulldown","PlainFormattableDisplayField","LinkedWorkPackageDisplayField","DaysDurationDisplayField","initializeCoreDisplayFields","BooleanEditFieldModule","IntegerEditFieldModule","TextEditFieldModule","FocusModule","DateEditFieldModule","SelectEditFieldModule","WidgetChangeset","AbstractWidgetComponent","widgetName","editableName","widgetIdentifier","renameWidget","setChangesetOptions","resourceChanged","AbstractWidgetComponent_HostBindings","entry_r2","addSectionDropdownSelector","AddSectionDropdownComponent","hideSectionService","trackByKey","displayed","AddSectionDropdownComponent_Query","AddSectionDropdownComponent_Template_select_change_0_listener","AddSectionDropdownComponent_option_3_Template","hideSectionLinkSelector","HideSectionLinkComponent","sectionName","hideSection","HideSectionLinkComponent_Template","HideSectionLinkComponent_Template_button_click_0_listener","HideSectionService","sections","removeHiddenOnSubmit","section","showSectionDropdownSelector","ShowSectionDropdownComponent","HideSection","optValue","hideSecWithName","prev","ShowSectionDropdownComponent_Template","iconTitle","OpIconComponent","iconClasses","OpIconComponent_Template","OpIconComponent_span_1_Template","ShareAndroidIconComponent","XIconComponent","OpModalBannerComponent_button_7_Template_button_click_0_listener","buttonClicked","actionButtonClasses","actionButton","OpModalBannerComponent","subtitle","OpModalBannerComponent_Template","OpModalBannerComponent_span_1_Template","OpModalBannerComponent_span_2_Template","OpModalBannerComponent_button_7_Template","opModalOverlaySelector","OpModalOverlayComponent","portalOutletContainer","portalOutlet","setupListener","notFullscreen","activeModalData$","activeModalInstance$","createAndAttachPortalInstance","detachPortalInstance","includeChildClicks","currentTarget","attachedRef","overlay","OpModalOverlayComponent_Query","CdkPortalOutlet","OpModalOverlayComponent_Template_div_mousedown_0_listener","OpModalOverlayComponent_Template_button_click_3_listener","OpModalOverlayComponent_ng_template_5_Template","OpModalWrapperAugmentService","wrapElement","activationSelector","activationLink","modalClassName","iframeUrl","wrappedElement","modalBody","appendIframe","DynamicContentModalComponent","iframe","iframeParent","openingEvent","onResize","updateAppHeight","innerHeight","PortalModule","A11yModule","defaultPrevented","data_r7","ConfirmDialogModalComponent_ng_container_6_li_3_Template","listTitle","passedData","data_r9","ConfirmDialogModalComponent_ng_template_7_span_0_Template","clazz_r10","clazz_r11","ConfirmDialogModalComponent","defaultTo","showListData","refreshOnCancel","warningText","showClose","divideContent","confirmAndClose","ConfirmDialogModalComponent_Template","ConfirmDialogModalComponent_div_3_Template","ConfirmDialogModalComponent_ng_container_6_Template","ConfirmDialogModalComponent_ng_template_7_Template","ConfirmDialogModalComponent_Template_button_click_12_listener","ConfirmDialogModalComponent_span_13_Template","ConfirmDialogModalComponent_Template_button_click_16_listener","ConfirmDialogModalComponent_span_17_Template","ConfirmDialogService","augmentedConfirmDialog","augmentFormSubmit","configureWorkPackageButton","typeName","configureWikiPageInclude","pageValue","editCodeBlock","languageClass","configureChildPages","includeParent","hint","include_parent","button_save","selectedPage","selectedIncludeParent","applyAndClose","selectedPageInput","updateIncludeParent","ChildPagesMacroModalComponent_Query","ChildPagesMacroModalComponent_Template_form_submit_0_listener","ChildPagesMacroModalComponent_Template_input_change_11_listener","ChildPagesMacroModalComponent_Template_input_ngModelChange_17_listener","ChildPagesMacroModalComponent_Template_button_click_23_listener","_language","debouncedLanguageLoader","loadLanguageAsMode","language_hint","lang","fromTextArea","codeMirrorPane","updateCodeMirrorMode","newLanguage","updateLanguage","CodeBlockMacroModalComponent_Query","CodeBlockMacroModalComponent_Template_form_submit_0_listener","CodeBlockMacroModalComponent_Template_input_ngModelChange_12_listener","CodeBlockMacroModalComponent_Template_button_click_17_listener","WikiIncludePageMacroModalComponent_Query","WikiIncludePageMacroModalComponent_Template_form_submit_0_listener","WikiIncludePageMacroModalComponent_Template_input_change_11_listener","WikiIncludePageMacroModalComponent_Template_button_click_19_listener","WikiIncludePageMacroModalComponent_Template_button_click_20_listener","type_r2","selectedType","selected_type","button_style","button_style_hint","buttonStyle","availableTypes","typeSelect","WpButtonMacroModalComponent_Query","WpButtonMacroModalComponent_Template_form_submit_0_listener","WpButtonMacroModalComponent_Template_select_change_11_listener","WpButtonMacroModalComponent_option_14_Template","WpButtonMacroModalComponent_Template_input_change_19_listener","WpButtonMacroModalComponent_Template_button_click_24_listener","WpTableExportModalComponent_ul_5_li_1_Template_a_click_1_listener","option_r2","triggerByLink","WpTableExportModalComponent_ul_5_li_1_Template","exportOptions","exportPreparing","requestExport","buildExportOptions","representations","addColumnsAndTitleToHref","json","replaceWithJobModal","job_id","removeSearch","addSearch","WpTableExportModalComponent_Template","WpTableExportModalComponent_ul_5_Template","WpTableExportModalComponent_Template_button_click_8_listener","nameControl","rails","tokenNameForm","label_ical_sharing","description_ical_sharing","ical_sharing_warning","token_name_placeholder","token_name_description_text","token_name_already_in_use_error_text","button_copy","generateAndCopyUrl","markAsDirty","QueryGetIcalUrlModalComponent_Template","QueryGetIcalUrlModalComponent_Template_form_submit_0_listener","QueryGetIcalUrlModalComponent_div_14_Template","QueryGetIcalUrlModalComponent_Template_button_click_18_listener","QueryGetIcalUrlModalComponent_Template_button_click_19_listener","closeButton","DynamicContentModalComponent_Template","queryName","isStarred","isPublic","save_as","label_name","label_visibility_settings","queryNameField","saveQueryAs","public","savedQuery","SaveQueryModalComponent_Query","SaveQueryModalComponent_Template_form_submit_0_listener","SaveQueryModalComponent_Template_input_ngModelChange_9_listener","SaveQueryModalComponent_Template_query_sharing_form_onChange_14_listener","SaveQueryModalComponent_Template_button_click_17_listener","showInMenu","visibleForOthers","showInMenuText","visibleForOthersText","canStar","isSave","canPublish","updateStarred","updatePublic","QuerySharingFormComponent_Template","QuerySharingFormComponent_Template_input_ngModelChange_4_listener","QuerySharingFormComponent_Template_input_ngModelChange_11_listener","saveQuery","QuerySharingModalComponent_Template","QuerySharingModalComponent_Template_query_sharing_form_onChange_4_listener","QuerySharingModalComponent_Template_button_click_7_listener","QuerySharingModalComponent_Template_button_click_8_listener","child_r5","WpDestroyModalComponent_ng_container_4_div_7_li_7_Template","hasChildren","singleWorkPackage","singleWorkPackageChildren","deletesChildren","WpDestroyModalComponent_ng_container_4_div_7_Template","single_text","childCount","wp_r7","WpDestroyModalComponent_ng_container_5_li_5_strong_5_Template","WpDestroyModalComponent_ng_container_5_li_5_Template","bulk_text","WpDestroyModalComponent_div_6_Template_input_ngModelChange_3_listener","childrenDeletionConfirmed","label_confirm_children_deletion","workPackageService","busy","_wp","workPackageLabel","childUnits","blockedDueToUnconfirmedChildren","mustConfirmChildren","confirmDeletion","WpDestroyModalComponent_Template","WpDestroyModalComponent_ng_container_4_Template","WpDestroyModalComponent_ng_container_5_Template","WpDestroyModalComponent_div_6_Template","WpDestroyModalComponent_Template_button_click_9_listener","WpDestroyModalComponent_Template_button_click_10_listener","noResultsSelector","NoResultsComponent","showIcon","setHostClass","NoResultsComponent_HostBindings","NoResultsComponent_i_0_Template","NoResultsComponent_div_3_Template","OpContentLoaderComponent","viewBox","baseUrl","OpContentLoaderComponent_Template","OpPrincipalLoadingComponent","OpPrincipalLoadingComponent_Template","OpWPLoadingComponent","OpWPLoadingComponent_Template","ContentLoaderModule","OpContextMenuHandler","openerEvent","collision","queryUpdate","formUpdate","allowQueryAction","allowAction","allowWorkPackageAction","allowFormAction","create_new","divider","configureForm","ariaLabel","configureFormLink","queryCustomFields","wpViewCollapsedGroups","updateStatus","postIcon","postIconTitle","IconTriggeredContextMenuComponent","IconTriggeredContextMenuComponent_Template","menu","item_r1","OPContextMenuComponent_ng_container_2_li_2_a_1_Template_a_click_0_listener","OPContextMenuComponent_ng_container_2_li_2_a_1_op_icon_1_Template","OPContextMenuComponent_ng_container_2_li_2_a_1_op_icon_3_Template","OPContextMenuComponent_ng_container_2_li_2_button_2_Template_button_click_0_listener","_r20","OPContextMenuComponent_ng_container_2_li_2_button_2_op_icon_1_Template","OPContextMenuComponent_ng_container_2_li_2_button_2_op_icon_3_Template","OPContextMenuComponent_ng_container_2_li_2_a_1_Template","OPContextMenuComponent_ng_container_2_li_2_button_2_Template","OPContextMenuComponent_ng_container_2_li_1_Template","OPContextMenuComponent_ng_container_2_li_2_Template","OPContextMenuComponent","OpContextMenuLocalsToken","OPContextMenuComponent_Template","OPContextMenuComponent_ng_container_2_Template","isOpening","portalHostElement","reposition","activeMenu","WorkPackageAuthorization","copyLink","shortLink","bulkCopyLink","isPermitted","permittedActionKeys","permittedActionsWithLinks","opContextMenuService","authorization","PERMITTED_CONTEXT_MENU_ACTIONS","getPermittedPluginActions","selectedWorkPackages","WorkPackageContextMenuHelper","deleteSelectedWorkPackages","editSelectedWorkPackages","copySelectedWorkPackages","logTimeForSelectedWorkPackage","date_r3","OpNonWorkingDaysListComponent_ng_container_1_ng_container_1_Template","OpNonWorkingDaysListComponent_ng_container_1_ng_container_2_Template","_destroy","nonWorkingDaysListSelector","OpNonWorkingDaysListComponent","toast","modifiedNonWorkingDays","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","form_submitted","datepickerOpened","selectedNonWorkingDayName","listPlugin","anchor","noEventsContent","listenToFormSubmit","removedNonWorkingDays","nwd","addNonWorkingDay","getEventById","OpNonWorkingDaysListComponent_Query","OpNonWorkingDaysListComponent_full_calendar_0_Template","OpNonWorkingDaysListComponent_ng_container_1_Template","OpNonWorkingDaysListComponent_Template_op_modal_single_date_picker_closed_3_listener","OpNonWorkingDaysListComponent_Template_op_modal_single_date_picker_valueChange_3_listener","OpNonWorkingDaysListComponent_Template_spot_text_field_ngModelChange_5_listener","OpNonWorkingDaysListComponent_Template_button_click_6_listener","CurrentUser","staticQueries","created_at","updated_at","gantt","latest_activity","created_by_me","assigned_to_me","recently_created","all_open","shared_with_users","summary","buildQueries","matched","projectDependentQueries","userDependentQueries","getStaticQueriesForView","opViewSelectSelector","ViewSelectComponent","viewsService","scope_default","scope_starred","scope_global","scope_private","viewCategories$","search$","apiViewType","initializeAutocomplete","searchText","categories","category","matchesText","filteredChildren","buttonArrowLeft","updateMenuOnChanges","initializeViews","private","createNew","cat","toOpSideMenuItem","viewCategories","ViewSelectComponent_Template","ViewSelectComponent_Template_input_ngModelChange_4_listener","option_r1","OpOptionListComponent_label_0_Template_input_ngModelChange_1_listener","OpOptionListComponent_label_0_p_5_Template","getClassListForItem","OpOptionListComponent","selectedChange","OpOptionListComponent_HostBindings","OpOptionListComponent_Template","OpOptionListComponent_label_0_Template","persistentToggleSelector","PersistentToggleComponent","$targetNotification","getTargetNotification","isNowHidden","slideUp","slideDown","PersistentToggleComponent_Template","hrefFromPrincipal","multiLine","userElement","sep","typeFromHref","renderAvatar","renderName","userInitials","getInitials","colorCode","renderUserAvatar","userAvatarUrl","Image","alt","onload","asLink","principalURL","characters","lastSpace","lastIndexOf","principal_r1","OpPrincipalListComponent","OpPrincipalListComponent_HostBindings","OpPrincipalListComponent_op_principal_0_Template","OpPrincipalComponent","principalResourceService","hideAvatar","hideName","nameClasses","OpPrincipalComponent_Template","insertInList","visibleAncestors","ancestorHref","projectInList","ancestorProject","current_project","include_all_selected","does_not_match_search","OpProjectIncludeListComponent_li_0_ng_template_10_ng_template_1_span_0_Template","project_r1","OpProjectIncludeListComponent_li_0_ng_template_10_span_0_Template","OpProjectIncludeListComponent_li_0_ng_template_10_ng_template_1_Template","parentChecked","OpProjectIncludeListComponent_li_0_ul_12_Template_ul_update_0_listener","updateList","isChecked","OpProjectIncludeListComponent_li_0_Template_label_keydown_space_3_listener","changeSelected","OpProjectIncludeListComponent_li_0_Template_spot_checkbox_change_5_listener","OpProjectIncludeListComponent_li_0_span_9_Template","OpProjectIncludeListComponent_li_0_ng_template_10_Template","OpProjectIncludeListComponent_li_0_ul_12_Template","projectListItemIdentifier","getTooltipAlignment","searchableProjectListService","activeItemID$","projectListActionIdentifier","currentProjectHref","OpProjectIncludeListComponent","classNameList","selectedHref","TopLeft","extendedProjectUrl","currentMenuItem","OpProjectIncludeListComponent_HostBindings","OpProjectIncludeListComponent_li_0_Template","calculatePositions","count_r4","OpProjectIncludeComponent_form_11_ng_container_3_ul_1_Template_ul_update_0_listener","selectedProjects","textFieldFocused","projects_r5","includeSubprojects$","OpProjectIncludeComponent_form_11_ng_container_3_ul_1_Template","OpProjectIncludeComponent_form_11_ng_container_3_ng_template_2_Template","OpProjectIncludeComponent_form_11_Template_form_submit_0_listener","OpProjectIncludeComponent_form_11_Template_spot_text_field_ngModelChange_1_listener","OpProjectIncludeComponent_form_11_Template_spot_text_field_keydown_1_listener","ngIf","OpProjectIncludeComponent_form_11_Template_spot_text_field_inputFocus_1_listener","OpProjectIncludeComponent_form_11_Template_spot_text_field_inputBlur_1_listener","OpProjectIncludeComponent_form_11_ng_container_3_Template","OpProjectIncludeComponent_form_11_Template_spot_checkbox_ngModelChange_8_listener","OpProjectIncludeComponent_form_11_Template_button_click_12_listener","clearSelection","search_placeholder","include_subprojects","clear_selection","_displayMode","displayMode$","_includeSubprojects","_selectedProjects","selectedProjects$","filter_all","filter_selected","query$","displayModeOptions","projectsInFilter$","queryFilter","selectedProjectHrefs","numberOfProjectsInFilter$","projects$","allProjects$","searchText$","hasSelectedAncestor","anySelected","setDisabledStatus","fetchingProjects$","fetching","resetActiveResult","toggleIncludeSubprojects","loadAllProjects","projectHrefs","OpProjectIncludeComponent_HostBindings","SearchableProjectListService","OpProjectIncludeComponent_Template","OpProjectIncludeComponent_Template_spot_drop_modal_closed_0_listener","OpProjectIncludeComponent_Template_button_click_1_listener","OpProjectIncludeComponent_span_3_Template","OpProjectIncludeComponent_Template_spot_toggle_ngModelChange_10_listener","OpProjectIncludeComponent_form_11_Template","OpProjectIncludeComponent_ng_template_13_Template","remoteFieldUpdaterSelector","RemoteFieldUpdaterComponent","$form","htmlMode","keyCodes","TAB","SHIFT","updater","Accept","HTMLInputElement","RemoteFieldUpdaterComponent_Template","ResizerComponent","resizing","customHandler","cursorClass","startResize","buttons","oldX","pageX","touches","oldY","startY","clientY","pageY","newX","newY","setResizeCursor","bindEventListener","onMouseUp","setAutoCursor","onMouseMove","mouseMoveHandler","mouseUpHandler","absolute","relative","ResizerComponent_HostBindings","ResizerComponent_touchstart_HostBindingHandler","ResizerComponent_div_0_Template","toggleService","resizeStyle","moving","elementClass","resizingElement","localStorageValue","parseLocalStorageValue","applyColumnLayout","resizer","resizeStart","actualElementWidth","resizeEnd","resizeEvent","manageErrorClass","resizeMove","deltas","checkWidth","singleView","shouldBePresent","WpResizerDirective_Template","WpResizerDirective_Template_resizer_end_0_listener","WpResizerDirective_Template_resizer_start_0_listener","WpResizerDirective_Template_resizer_move_0_listener","OpLoadingProjectListComponent","OpLoadingProjectListComponent_Template","_searchText","selectedItemID$","collectionURL","UP_ARROW","selectPreviousResult","DOWN_ARROW","selectNextResult","activateSelectedResult","findFirstNonDisabledID","childFound","allProjects","findLastChild","findPreviousID","idOfCurrent","foundPreviousID","findNextID","nextParent","foundNextID","findSearchableListParent","listParent","OpSidemenuComponent_button_0_Template_button_click_0_listener","toggleCollapsed","item_r7","OpSidemenuComponent_li_3_a_2_ng_container_1_Template","OpSidemenuComponent_li_3_a_3_ng_container_1_Template","OpSidemenuComponent_li_3_op_sidemenu_1_Template","OpSidemenuComponent_li_3_a_2_Template","OpSidemenuComponent_li_3_a_3_Template","OpSidemenuComponent_ng_template_4_span_0_Template","OpSidemenuComponent_ng_template_4_span_3_Template","OpSidemenuComponent_ng_template_4_span_4_Template","noEEToken","sidemenuSelector","OpSidemenuComponent","OpSidemenuComponent_HostBindings","OpSidemenuComponent_button_0_Template","OpSidemenuComponent_div_1_Template","OpSidemenuComponent_li_3_Template","OpSidemenuComponent_ng_template_4_Template","downloadFileLink","staticOriginDownload","FileLinkListItemComponent_div_11_button_4_Template_button_click_0_listener","confirmRemoveFileLink","removeFileLink","FileLinkListItemComponent_div_11_a_1_Template","FileLinkListItemComponent_div_11_button_4_Template","downloadAllowed","openFileLocation","staticOriginOpenLocation","allowEditing","floatingText","noViewPermission","tooltipAllignment","openFile","removalTitle","removalButtonLabel","removalConfirmation","notAllowdTooltipText","lastModifiedAt","infoTimestampText","fileLinkIcon","mimeType","isDirectory","fileLinkViewAllowed","lastModifiedByName","FileLinkListItemComponent_Query","FileLinkListItemComponent_div_11_Template","FileLinkListItemComponent_div_12_Template","staticOriginOpen","BreadcrumbsContent","crumbs","FilePickerBaseModalComponent","sortFilesPipe","storageFilesResourceService","storageFiles$","breadcrumbs","getIconForStorageType","navigate","showAlert","listItems$","transform","storageFileToListItem","entryLocation","makeFilesCollectionLink","currentDirectory","makeBreadcrumbs","closeAlert","enterDirectoryCallback","directory","changeLevel","cancelCurrentLoading","loadingSubscription","projectFolderMode","projectFolderHref","FilePickerModalComponent_div_6_Template_button_click_5_listener","file_r17","FilePickerModalComponent_ng_template_15_ul_0_li_1_Template","FilePickerModalComponent_ng_template_15_ul_0_Template","noConnection","storageType","noConnectionHint","FilePickerModalComponent_div_24_Template_button_click_1_listener","selectAllOfCurrentLevel","selectedFileCount","storageLocaleString","alert","alertNoAccess","alertNoAccessToManagedProjectFolder","alertNoManagedProjectFolder","fileLinksResourceService","emptyHint","alreadyLinkedFile","alreadyLinkedDirectory","successFileLinksCreated","showSelectAll","fileMap","createSelectedFileLinks","isAlreadyLinked","changeSelection","fileId","StorageFileListItem","FilePickerModalComponent_Template","FilePickerModalComponent_div_6_Template","FilePickerModalComponent_ng_container_9_Template","FilePickerModalComponent_ng_container_11_Template","FilePickerModalComponent_ng_container_13_Template","FilePickerModalComponent_ng_template_15_Template","FilePickerModalComponent_ng_template_17_Template","FilePickerModalComponent_ng_template_19_Template","FilePickerModalComponent_ng_template_21_Template","FilePickerModalComponent_div_24_Template","FilePickerModalComponent_Template_button_click_26_listener","FilePickerModalComponent_Template_button_click_27_listener","fileIconMappings","storageIconMappings","storageLink","storageTypeMap","nextcloud","storageTypeUrn","LoadingFileListComponent_Template","LocationPickerModalComponent_div_6_Template_button_click_5_listener","file_r16","LocationPickerModalComponent_ng_template_15_ul_0_li_1_Template","LocationPickerModalComponent_ng_template_15_ul_0_Template","filesAtLocation","canChooseLocation","permissions","submitEmptySelection","directory_not_writeable","file_not_selectable","chooseLocation","isConstrained","LocationPickerModalComponent_Template","LocationPickerModalComponent_div_6_Template","LocationPickerModalComponent_ng_container_9_Template","LocationPickerModalComponent_ng_container_11_Template","LocationPickerModalComponent_ng_container_13_Template","LocationPickerModalComponent_ng_template_15_Template","LocationPickerModalComponent_ng_template_17_Template","LocationPickerModalComponent_ng_template_19_Template","LocationPickerModalComponent_ng_template_21_Template","LocationPickerModalComponent_Template_button_click_25_listener","LocationPickerModalComponent_Template_button_click_26_listener","array","pure","StorageFileListItemComponent_spot_checkbox_4_Template_spot_checkbox_checkedChange_0_listener","checkbox","StorageFileListItemComponent_button_10_Template_button_click_0_listener","enterDirectory","createdByName","enterDirectoryOnLabel","isCheckboxTarget","attrs","StorageFileListItemComponent_Template","StorageFileListItemComponent_Template_label_click_3_listener","StorageFileListItemComponent_spot_checkbox_4_Template","StorageFileListItemComponent_span_8_Template","StorageFileListItemComponent_op_principal_9_Template","StorageFileListItemComponent_button_10_Template","storageFile","login","StorageInformationComponent_Template","StorageInformationComponent_div_6_Template","StorageInformationBox","fileLinkErrorHeader","fileLinkErrorContent","connectionErrorHeader","connectionErrorContent","authorizationFailureHeader","authorizationFailureContent","loginButton","storageInformation","authorizationState","storageFailedAuthorization","failedAuthorizationInformation","storageAuthorizationError","authorizationErrorInformation","storageConnected","hasFileLinkViewErrors","fileLinkErrorInformation","authorize","authorizationLink","fileLinkViewError","opStorageLoginButtonSelector","cookieService","nonce","uuidv4","setAuthorizationCallbackCookie","authorizationFailureActionUrl","expires","StorageLoginButtonComponent_Template","StorageLoginButtonComponent_Template_button_click_0_listener","convertHttpEvent","convert","NextcloudUploadStrategy","execute","uploadSingle","uploadFile","overwrite","reportProgress","responseBody","file_id","file_name","OneDriveUploadStrategy","contentRangeHeader","StorageUploadService","uploadStrategy","setUploadStrategy","oneDrive","infoBox_r7","StorageComponent_ng_container_0_ul_14_li_1_Template_li_removeFileLink_0_listener","fileLink_r9","allowLinking","StorageComponent_ng_container_0_ul_14_li_1_Template","emptyList","StorageComponent_ng_container_0_input_19_Template_input_change_0_listener","dropBox","StorageComponent_ng_container_0_button_20_Template_button_dragover_0_listener","StorageComponent_ng_container_0_button_20_Template_button_dragleave_0_listener","StorageComponent_ng_container_0_button_20_Template_button_drop_0_listener","StorageComponent_ng_container_0_button_20_Template_button_click_0_listener","StorageComponent_ng_container_0_button_20_span_3_Template","StorageComponent_ng_container_0_button_20_span_5_Template","tmp_0_0","tmp_2_0","tmp_3_0","StorageComponent_ng_container_0_div_22_button_1_Template_button_click_0_listener","StorageComponent_ng_container_0_div_22_button_2_Template_button_click_0_listener","openLinkFilesDialog","linkExisting","StorageComponent_ng_container_0_div_22_button_1_Template","StorageComponent_ng_container_0_div_22_button_2_Template","StorageComponent_ng_container_0_op_storage_information_11_Template","StorageComponent_ng_container_0_ul_14_Template","StorageComponent_ng_container_0_span_16_Template","StorageComponent_ng_container_0_input_19_Template","StorageComponent_ng_container_0_button_20_Template","StorageComponent_ng_container_0_div_22_Template","storageHeader","tmp_1_0","openStorage","projectStorage","openWithConnectionEnsured","tmp_4_0","storageErrors","tmp_6_0","tmp_7_0","tmp_9_0","tmp_10_0","addFileLink","storageInformationService","uploadFailed","uploadFailedNextcloudDetail","uploadFailedForbidden","uploadFailedSizeLimit","uploadFailedQuota","linkingAfterUploadFailed","draggingManyFiles","draggingFolder","uploadingLabel","projectFolder","storageFileUpload","selectUploadLocation","resolveUploadConflicts","uploadAndCreateFileLink","isUploadError","uploadResourceLink","uploadAndNotify","uploadResponse","createFileLinkData","fileLinkCreationData","handleUploadError","additionalInfo","destination","compareId","prepareUpload","fileLinkSelfLink","webkitGetAsEntry","StorageComponent_Query","StorageComponent_Template","StorageComponent_ng_container_0_Template","keepBoth","UploadConflictModalComponent_Template","UploadConflictModalComponent_Template_button_click_7_listener","UploadConflictModalComponent_Template_button_click_8_listener","UploadConflictModalComponent_Template_button_click_9_listener","getLowerPageBound","getUpperPageBound","limit","nextPage","previousPage","DEFAULT_PAGINATION_OPTIONS","PaginationService","loadPaginationOptions","initialPageOptions","localStoragePerPage","initialLength","getPaginationOptions","paginationOptions","getMaxVisiblePageOptions","getOptionsTruncationSize","getPerPageOptions","setPerPageOptions","maxVisiblePageOptions","optionsTruncationSize","TablePaginationComponent_div_0_ng_container_6_li_1_Template_button_click_1_listener","TablePaginationComponent_div_0_ng_container_6_li_1_Template","TablePaginationComponent_div_0_ng_container_7_li_1_button_2_Template_button_click_0_listener","TablePaginationComponent_div_0_ng_container_7_li_1_em_1_Template","TablePaginationComponent_div_0_ng_container_7_li_1_button_2_Template","TablePaginationComponent_div_0_ng_container_7_li_1_Template","TablePaginationComponent_div_0_ng_container_7_li_2_Template","TablePaginationComponent_div_0_ng_container_8_li_1_Template_button_click_1_listener","TablePaginationComponent_div_0_ng_container_8_li_1_Template","TablePaginationComponent_div_0_div_16_li_3_span_1_Template_button_click_1_listener","TablePaginationComponent_div_0_div_16_li_3_span_1_Template","TablePaginationComponent_div_0_div_16_li_3_span_2_Template","TablePaginationComponent_div_0_div_16_li_3_Template","TablePaginationComponent_div_0_Template_button_click_4_listener","TablePaginationComponent_div_0_ng_container_6_Template","TablePaginationComponent_div_0_ng_container_7_Template","TablePaginationComponent_div_0_ng_container_8_Template","TablePaginationComponent_div_0_Template_button_click_10_listener","TablePaginationComponent_div_0_span_14_Template","TablePaginationComponent_div_0_li_15_Template","TablePaginationComponent_div_0_div_16_Template","hideForSinglePageResults","totalEntries","updateCurrentRangeLabel","updatePageNumbers","onUpdatedPage","totalItems","lowerBound","upperBound","maxVisible","truncSize","currentPage","startingDiff","truncatePageNums","perform","disectFrom","disectLength","truncateFrom","truncationSize","truncatedNums","TablePaginationComponent_Template","TablePaginationComponent_div_0_Template","ContentTabsComponent_li_5_a_1_Template_a_click_0_listener","tab_r5","clickTab","currentTabId","tabTitle","tabCounter_r13","ContentTabsComponent_li_5_a_2_ng_container_2_op_tab_count_1_Template","ContentTabsComponent_li_5_a_2_ng_container_2_span_2_Template","ContentTabsComponent_li_5_a_2_Template_a_click_0_listener","ContentTabsComponent_li_5_a_2_ng_container_2_Template","ContentTabsComponent_li_5_Template_li_dragenter_0_listener","_r25","startDebouncedTabActivation","ContentTabsComponent_li_5_Template_li_dragleave_0_listener","cancelDebouncedTabActivation","ContentTabsComponent_li_5_a_1_Template","ContentTabsComponent_li_5_a_2_Template","contentTabsSelector","ContentTabsComponent","ScrollableTabsComponent","gonTabs","ContentTabsComponent_Template","ContentTabsComponent_Template_ul_scroll_3_listener","onScroll","ContentTabsComponent_li_5_Template","ContentTabsComponent_Template_div_click_6_listener","ContentTabsComponent_Template_div_click_9_listener","scrollRight","trackById","hideLeftButton","hideRightButton","TabCountComponent","ScrollableTabsComponent_li_5_a_1_Template_a_click_0_listener","ScrollableTabsComponent_li_5_a_2_ng_container_2_op_tab_count_1_Template","ScrollableTabsComponent_li_5_a_2_ng_container_2_span_2_Template","ScrollableTabsComponent_li_5_a_2_Template_a_click_0_listener","ScrollableTabsComponent_li_5_a_2_ng_container_2_Template","ScrollableTabsComponent_li_5_Template_li_dragenter_0_listener","ScrollableTabsComponent_li_5_Template_li_dragleave_0_listener","ScrollableTabsComponent_li_5_a_1_Template","ScrollableTabsComponent_li_5_a_2_Template","tabSelected","counters","dragTargetStack","pane","scrollPane","updateScrollableArea","_changes","determineScrollButtonVisibility","scrollIntoVisibleArea","debouncedTabActivationTimeout","clearDebouncedTabActivation","clientWidth","tabRightBorderAt","outerWidth","ScrollableTabsComponent_Query","ScrollableTabsComponent_Template_ul_scroll_3_listener","ScrollableTabsComponent_li_5_Template","ScrollableTabsComponent_Template_div_click_6_listener","ScrollableTabsComponent_Template_div_click_9_listener","TabCountComponent_ng_container_0_span_1_Template","TabCountComponent_Template","TabCountComponent_ng_container_0_Template","TimeEntryCreateModalComponent_button_10_Template_button_click_0_listener","TimeEntryCreateModalComponent_button_12_Template_button_click_0_listener","TimeEntryCreateModalComponent_button_13_Template_button_click_0_listener","saveEntry","formInFlight","TimeEntryCreateModalComponent","TimeEntryBaseModal","deleteAllowed","setModifiedEntry","createdEntry","reloadWorkPackageAndClose","TimeEntryCreateModalComponent_Template","TimeEntryCreateModalComponent_Template_te_form_modifiedEntry_6_listener","TimeEntryCreateModalComponent_button_10_Template","TimeEntryCreateModalComponent_button_12_Template","TimeEntryCreateModalComponent_button_13_Template","saveAllowed","ongoing","TimeEntryEditModalComponent_button_10_Template_button_click_0_listener","TimeEntryEditModalComponent_button_12_Template_button_click_0_listener","TimeEntryEditModalComponent_button_13_Template_button_click_0_listener","TimeEntryEditModalComponent","modifiedEntry","areYouSure","destroyedEntry","TimeEntryEditModalComponent_Template","TimeEntryEditModalComponent_Template_te_form_modifiedEntry_6_listener","TimeEntryEditModalComponent_button_10_Template","TimeEntryEditModalComponent_button_12_Template","TimeEntryEditModalComponent_button_13_Template","createChangeset","editChange","activeTimer","triggerActionsEntryComponentSelector","TriggerActionsEntryComponent","editTimeEntry","loadEntry","deleteTimeEntry","timeEntryId","TriggerActionsEntryComponent_Template","TriggerActionsEntryComponent_Template_a_click_0_listener","TriggerActionsEntryComponent_Template_a_click_2_listener","wpRequired","cf_r6","TimeEntryFormComponent","workPackageSelected","setCustomFields","signalModifiedEntry","keySchema","isACustomField","TimeEntryFormComponent_Query","TimeEntryFormComponent_Template_edit_form_onSaved_0_listener","TimeEntryFormComponent_ng_container_3_Template","TimeEntryFormComponent_ng_container_10_Template","TimeEntryFormComponent_op_editable_attribute_field_13_Template","TimeEntryFormComponent_i_14_Template","TimeEntryFormComponent_ng_container_18_Template","TimeEntryTimerService","TimerAccountMenuComponent","removeTimer","renderTimer","timerElement","TimeEntryBaseModal_Query","button_stop","timer_already_running","tracking_time","saveAndClose","StopExistingTimerModalComponent_HostBindings","StopExistingTimerModalComponent_Template_a_click_12_listener","StopExistingTimerModalComponent_Template_button_click_16_listener","StopExistingTimerModalComponent_Template_button_click_17_listener","TimerAccountMenuComponent_ng_container_0_Template_a_click_4_listener","stopTimer","tracking","timer_r1","timerAccountSelector","TimerAccountMenuComponent_HostBindings","TimerAccountMenuComponent_Template","TimerAccountMenuComponent_ng_container_0_Template","ToastComponent_ng_container_2_div_2_Template","ToastComponent_p_3_a_3_Template_a_click_0_listener","executeTarget","ToastComponent_p_3_a_3_Template","ToastComponent_div_5_div_1_Template_a_click_1_listener","ToastComponent_div_5_div_1_Template_a_click_3_listener","uploadText","ToastComponent_div_5_ul_3_op_toasters_upload_progress_1_Template_op_toasters_upload_progress_uploadSuccess_0_listener","onUploadSuccess","ToastComponent_div_5_ul_3_op_toasters_upload_progress_1_Template_op_toasters_upload_progress_uploadError_0_listener","upload_r16","ToastComponent_div_5_ul_3_op_toasters_upload_progress_1_Template","ToastComponent_div_5_div_1_Template","ToastComponent_div_5_ul_3_Template","canBeHidden","error_r21","ToastComponent_div_7_li_2_Template","ToastComponent_button_8_Template_button_click_0_listener","_r23","ToastComponent","uploadCount","removable","timeout","ToastComponent_Template","ToastComponent_ng_container_2_Template","ToastComponent_p_3_Template","ToastComponent_div_5_Template","ToastComponent_div_6_Template","ToastComponent_div_7_Template","ToastComponent_button_8_Template","stack","timeoutAfter","removeSuccessFlashMessages","nextValue","removeOnAdd","additionalErrors","createToast","addLoading","createLoadingToast","toast_r1","toastsContainerSelector","ToastsContainerComponent","ToastsContainerComponent_Template","ToastsContainerComponent_op_toast_2_Template","UploadProgressComponent_span_7_op_icon_1_Template","UploadProgressComponent_span_7_op_icon_2_Template","completed","UploadProgressComponent","uploadError","uploadSuccess","viewInitialized","progressBar","progressPercentage","Sent","UploadProgress","updateProgress","DownloadProgress","ResponseHeader","UploadProgressComponent_Query","UploadProgressComponent_span_7_Template","UserLinkComponent_Template","UserLinkComponent_a_0_Template","UserLinkComponent_ng_container_1_Template","AutofocusDirective","condition","insideOrSelf","within","focusable","findAllFocusableElementsWithin","FocusWithinDirective","focusedObservable","highlightColSelector","OpHighlightColDirective","thead","siblings","OpHighlightColDirective_Template","ngAfterViewChecked","highlightedElement","toLocaleLowerCase","cleanUpOldHighlighting","textNode","childNodes","nodeType","TEXT_NODE","newNode","unifiedLabelText","flags","getMetadata","propertyName","OnDestroyMixin","untilComponentDestroyed","FalseValue","TrueValue","filterMap","filterValues","toFilterObject","only","toAdd","pickBy","mergeParams","URLSearchParams","production","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","currentIndex","pointOfInsertion","insertBefore","escapeListener","containers","member","setupAutoscroll","initializeDrake","addScrollContainer","getMember","revertOnSpill","removeOnSpill","mirrorContainer","ignoreInputTextSelection","FOCUSABLE_ELEMENT_SELECTORS","middleButton","pattern","random","takeUntil$","emitter","debouncer","generatorOrNext","setSelectionRange","originalEvt","rangeParent","range","createRange","setStart","rangeOffset","startOffset","legacyDocument","caretRangeFromPoint","OpMultiDatePickerComponent","datesString","nextActive","OpMultiDatePickerComponent_Query","OpMultiDatePickerComponent_Template","OpMultiDatePickerComponent_Template_spot_drop_modal_closed_0_listener","OpMultiDatePickerComponent_Template_input_click_1_listener","OpMultiDatePickerComponent_Template_input_focus_1_listener","OpMultiDatePickerComponent_Template_form_submit_2_listener","OpMultiDatePickerComponent_Template_spot_text_field_ngModelChange_6_listener","OpMultiDatePickerComponent_Template_spot_text_field_focusin_6_listener","OpMultiDatePickerComponent_Template_button_click_7_listener","OpMultiDatePickerComponent_Template_spot_text_field_ngModelChange_9_listener","OpMultiDatePickerComponent_Template_spot_text_field_focusin_9_listener","OpMultiDatePickerComponent_Template_button_click_10_listener","OpMultiDatePickerComponent_Template_button_click_15_listener","DynamicBootstrapModule","OpBasicDatePickerModule","OpDatePickerModule","DragDropModule","crumb_r1","SpotBreadcrumbsComponent_ng_container_0_div_1_Template_button_click_1_listener","SpotBreadcrumbsComponent_ng_container_0_div_1_span_2_Template","i_r2","SpotBreadcrumbsComponent_ng_container_0_div_3_span_1_Template","SpotBreadcrumbsComponent_ng_container_0_div_1_Template","SpotBreadcrumbsComponent_ng_container_0_div_2_Template","SpotBreadcrumbsComponent_ng_container_0_div_3_Template","last_r3","SpotBreadcrumbsComponent","SpotBreadcrumbsComponent_HostBindings","SpotBreadcrumbsComponent_ng_container_0_Template","SpotCheckboxComponent","tabindex","checkedChange","onStateChange","indeterminate","SpotCheckboxComponent_Query","SpotCheckboxComponent_Template","SpotCheckboxComponent_Template_input_change_0_listener","spotDropModalPortalComponentSelector","SpotDropModalPortalComponent","template$","templateRef$","templ","hasRendered$","SpotDropModalPortalComponent_HostBindings","SpotDropModalPortalComponent_ng_container_0_Template","SpotDropModalTeleportationService","hasRenderedFiltered$","appearOrDissapear","SpotDropModalComponent_ng_template_3_div_0_Template_div_click_0_listener","onBodyClick","SpotDropModalComponent_ng_template_3_div_0_Template_button_click_3_listener","SpotDropModalComponent_ng_template_3_div_0_Template","SpotDropModalComponent","teleportationService","allowRepositioning","alignment","focus_grab","onGlobalClick","escapeCallback","onEscape","resizeCallback","hasRendered","referenceEl","floatingEl","cleanupFloatingUI","autoUpdate","computePosition","placement","middleware","flip","mainAxis","crossAxis","fallbackAxisSideDirection","limiter","limitShift","focusCatcherContainer","focusGrabber","SpotDropModalComponent_Query","SpotDropModalComponent_ng_template_3_Template","formControlBinding","NgControl","SpotFormBindingDirective","control","viewToModelUpdate","exportAs","SpotFormFieldComponent_ng_container_0_ng_container_7_ng_container_1_Template","SpotFormFieldComponent_ng_container_0_ng_container_8_ng_container_1_Template","errorsID","SpotFormFieldComponent_ng_container_0_span_3_Template","SpotFormFieldComponent_ng_container_0_span_5_Template","SpotFormFieldComponent_ng_container_0_ng_container_7_Template","SpotFormFieldComponent_ng_container_0_ng_container_8_Template","SpotFormFieldComponent_ng_container_0_div_11_Template","showErrorMessage","descriptionID","describedByID","SpotFormFieldComponent","errorClassName","internalID","ngControl","_formGroupDirective","SpotFormFieldComponent_ContentQueries","SpotFormFieldComponent_ng_container_0_Template","SpotFormFieldComponent_ng_template_1_Template","SpotSelectorFieldComponent_ng_container_0_div_4_span_1_Template","SpotSelectorFieldComponent_ng_container_0_div_4_span_3_Template","labelWeight","SpotSelectorFieldComponent_ng_container_0_div_4_Template","SpotSelectorFieldComponent_ng_container_0_div_7_Template","reverseLabel","SpotSelectorFieldComponent","formGroupDirective","classNameCheckbox","SpotSelectorFieldComponent_ContentQueries","SpotSelectorFieldComponent_ng_container_0_Template","spotSwitchSelector","SpotSwitchComponent","SpotSwitchComponent_Query","SpotSwitchComponent_Template","SpotSwitchComponent_Template_input_ngModelChange_0_listener","SpotTextFieldComponent_button_3_Template_button_click_0_listener","SpotTextFieldComponent","onParentClick","showClearButton","inputmode","inputFocus","inputBlur","onInputFocus","onInputBlur","SpotTextFieldComponent_Query","SpotTextFieldComponent_Template","SpotTextFieldComponent_Template_input_ngModelChange_1_listener","SpotTextFieldComponent_Template_input_focus_1_listener","SpotTextFieldComponent_Template_input_blur_1_listener","SpotTextFieldComponent_button_3_Template","SpotToggleComponent_label_0_Template_input_ngModelChange_1_listener","SpotToggleComponent","classNameOld","SpotToggleComponent_HostBindings","SpotToggleComponent_Template","SpotToggleComponent_label_0_Template","alignmentClass","SpotTooltipComponent","dark","BottomCenter","SpotTooltipComponent_HostBindings","SpotTooltipComponent_div_1_Template","SpotFilterChipComponent_button_0_Template_button_click_0_listener","SpotFilterChipComponent","SpotFilterChipComponent_HostBindings","SpotFilterChipComponent_button_0_Template","SpotFilterChipComponent_span_2_Template","OpDragScrollDirective","mousedownX","mousedownY","mousedown","GridArea","gridStartRow","gridEndRow","gridStartColumn","gridEndColumn","storedGuid","newGuid","s4","GridWidgetArea","moveRight","moveLeft","growColumn","overlaps","otherArea","rowOverlaps","columnOverlaps","startColumnOverlaps","unchangedSize","writeAreaChangeToWidget","copyDimensionsTo","sink","GridGap","isRow","isColumn","GridAreaService","numColumns","numRows","mousedOverArea","$mousedOverArea","helpMode","gridResource","rowCount","buildAreas","setMousedOverArea","area","cleanupUnusedAreas","unusedRows","widgetAreas","removeRow","unusedColumns","gridAreas","buildGridAreas","gridGaps","buildGridGaps","gridAreaIds","buildGridAreaIds","buildGridWidgetAreas","rebuildAndPersist","persist","writeAreaChangesToWidgets","saveGrid","saveWidgetChangeset","payloadWidget","w","isGap","isSingleCell","widgetResources","inHelpMode","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","menuItemList","removeItem","hasMenu","WidgetMenuComponent","WidgetMenuComponent_Template","WidgetMenuComponent_icon_triggered_context_menu_0_Template","WidgetHeaderComponent","onRenamed","renamed","isRenameable","WidgetHeaderComponent_Template","WidgetHeaderComponent_Template_editable_toolbar_title_onSave_2_listener","WidgetWpCalendarComponent","WidgetWpCalendarComponent_Template","WidgetWpCalendarComponent_Template_widget_header_onRenamed_0_listener","TimeEntriesCurrentUserConfigurationModalService","getOrderedDaysData","daysCheckedValues","localeWeekDays","localeOffset","offsetToApply","offsetCheckedValues","orderedDaysCheckedValues","dayCheckedValue","weekDay","originalIndex","getOriginalIndex","arrayLength","getCheckedValuesInOriginalOrder","configuredDays","localeDayData","validDays","TimeEntriesCurrentUserConfigurationModalComponent_div_5_Template_input_ngModelChange_4_listener","day_r1","index_r2","TimeEntriesCurrentUserConfigurationModalComponent","timeEntriesCurrentUserConfigurationModalService","localDayOptions","daysOriginalCheckedValues","checkedValuesInOriginalOrder","TimeEntriesCurrentUserConfigurationModalComponent_Template","TimeEntriesCurrentUserConfigurationModalComponent_div_5_Template","TimeEntriesCurrentUserConfigurationModalComponent_Template_button_click_8_listener","TimeEntriesCurrentUserConfigurationModalComponent_Template_button_click_9_listener","WidgetTimeEntriesCurrentUserMenuComponent","onConfigured","configureItem","WidgetTimeEntriesCurrentUserMenuComponent_Template","WidgetTimeEntriesCurrentUserMenuComponent_icon_triggered_context_menu_0_Template","WidgetTimeEntriesCurrentUserComponent","cdr","updateEntries","updateConfiguration","WidgetTimeEntriesCurrentUserComponent_Template","WidgetTimeEntriesCurrentUserComponent_Template_widget_time_entries_current_user_menu_onConfigured_1_listener","WidgetTimeEntriesCurrentUserComponent_Template_op_time_entries_calendar_entries_2_listener","GridWidgetsService","Hook","registered","registeredWidgets","registration","GridMoveService","movedArea","ignoreArea","movedAreas","remainingAreas","moveOneDown","anchorAreas","movableAreas","moveSpecification","firstAreaToMove","toMoveArea","anchorArea","areaHeight","overlappingArea","movableArea","referenceArea","GridDragAndDropService","setupMousedOverAreaSubscription","mousedOverAreaObserver","currentlyDragging","placeholderArea","updateArea","draggedArea","moveAreasOnDragging","dropArea","widgetArea","copyPositionButRestrict","isDropOnlyArea","isDragged","isPassive","isDraggable","draggedHeight","offsetHeight","GridResizeService","resizedArea","resizeTargets","sameRow","higherRow","fixedArea","targetIds","isTarget","areaId","isResized","currentlyResizing","isResizable","isAllowed","upsale_text","AddGridWidgetModalComponent_li_7_Template_button_click_1_listener","widget_r2","AddGridWidgetModalComponent","widgetsService","cancel_button","eligibleWidgets","chosenWidget","trackWidgetBy","schemaWidgetIdentifiers","AddGridWidgetModalComponent_Template","AddGridWidgetModalComponent_op_enterprise_banner_5_Template","AddGridWidgetModalComponent_li_7_Template","AddGridWidgetModalComponent_Template_button_click_10_listener","GridAddWidgetService","resize","isAddable","addLine","newArea","setMaxWidth","addText","existingArea","WpGraphConfigurationSettingsTabComponent","tabInner","WpGraphConfigurationSettingsTabComponent_Query","WpGraphConfigurationFiltersTabComponent","WpGraphConfigurationFiltersTabComponent_Query","WpGraphConfiguration","chartOptions","chartType","queryCreationParams","WpGraphConfigurationService","_forms","persistAndReload","persistChanges","reloadQueries","datasets","loadQueries","ensureQueryAndLoad","createInitial","queryPromises","queryParam","formFor","_configuration","_formsPromise","loadForms","queryTabs","formPromises","chartData","chartLabels","chartPlugins","mappedChartType","internalChartOptions","WorkPackageEmbeddedGraphComponent","chartHeight","DataLabelsPlugin","setChartOptions","updateChartData","uniqLabels","labelCountMaps","countMap","setHeight","responsive","maintainAspectRatio","indexAxis","legend","datalabels","align","hasDataToDisplay","WorkPackageEmbeddedGraphComponent_Template","WorkPackageEmbeddedGraphComponent_canvas_2_Template","WorkPackageEmbeddedGraphComponent_op_no_results_3_Template","WpGraphConfigurationModalComponent_ng_container_5_ng_container_1_Template","WpGraphConfigurationModalComponent_op_scrollable_tabs_6_Template_op_scrollable_tabs_tabSelected_0_listener","WpGraphConfigurationModalComponent","graphConfiguration","WpGraphConfigurationModalComponent_Query","WpGraphConfigurationModalComponent_ng_container_5_Template","WpGraphConfigurationModalComponent_op_scrollable_tabs_6_Template","WpGraphConfigurationModalComponent_Template_button_click_11_listener","WpGraphConfigurationModalComponent_Template_button_click_12_listener","WidgetWpSetMenuComponent","configurationComponent","WidgetWpGraphMenuComponent","WidgetWpGraphMenuComponent_Template","WidgetWpGraphMenuComponent_icon_triggered_context_menu_0_Template","WidgetWpGraphComponent","initializeConfiguration","loadQueriesInitially","updateGraph","repaint","WidgetWpGraphComponent_Template","WidgetWpGraphComponent_Template_widget_header_onRenamed_0_listener","WidgetWpGraphComponent_Template_widget_wp_graph_menu_onConfigured_1_listener","isMobileDevice","GridComponent_div_1_resizer_4_Template_resizer_end_0_listener","area_r4","GridComponent_div_1_resizer_4_Template_resizer_start_0_listener","GridComponent_div_1_resizer_4_Template_resizer_move_0_listener","GridComponent_div_1_Template_div_cdkDragStarted_1_listener","GridComponent_div_1_Template_div_cdkDragDropped_1_listener","GridComponent_div_1_span_2_Template","GridComponent_div_1_resizer_4_Template","widgetComponent","widgetComponentInput","widgetComponentOutput","GridComponent_div_2_div_1_Template_div_click_0_listener","area_r16","GridComponent_div_2_Template_div_mouseover_0_listener","GridComponent_div_2_div_1_Template","GridComponent_div_3_div_1_Template_div_click_0_listener","_r27","gap_r23","GridComponent_div_3_Template_div_mouseover_0_listener","GridComponent_div_3_div_1_Template","GRID_PROVIDERS","GridComponent","uiWidgets","GRID_AREA_HEIGHT","GRID_GAP_DIMENSION","handleKeyboardEvent","reg","gridColumnStyle","gridStyle","gridRowStyle","identifyGridArea","isHeadersDisplayed","itemStyle","bypassSecurityTrustStyle","GridComponent_HostBindings","GridComponent_div_1_Template","GridComponent_div_2_Template","GridComponent_div_3_Template","GridComponent_div_4_Template","document_r2","WidgetDocumentsComponent_ng_container_4_span_3_Template","documentPath","documentCreated","documentDescription","WidgetDocumentsComponent","entriesLoaded","documentsUrl","noEntries","orders","project_id","WidgetDocumentsComponent_Template","WidgetDocumentsComponent_op_no_results_3_Template","WidgetDocumentsComponent_ng_container_4_Template","news_r2","addedBy","WidgetNewsComponent_li_5_op_principal_1_Template","WidgetNewsComponent_li_5_div_6_Template","WidgetNewsComponent_li_5_p_7_Template","newsProjectPath","newsProjectName","WidgetNewsComponent","newsAuthorName","newsCreated","authorLink","newsAuthorPath","newsDmParams","setupNews","WidgetNewsComponent_Template","WidgetNewsComponent_op_no_results_3_Template","WidgetNewsComponent_li_5_Template","WidgetWpTableMenuComponent","WidgetWpTableMenuComponent_Template","WidgetWpTableMenuComponent_icon_triggered_context_menu_0_Template","WidgetWpTableComponent","ensureFormAndSaveQuery","WidgetWpTableComponent_Template","WidgetWpTableComponent_Template_widget_header_onRenamed_0_listener","WidgetWpTableComponent_wp_embedded_table_2_Template","GridInitializationService","myPageForm","WidgetWpTableQuerySpaceComponent","onResourceChanged","WidgetWpTableQuerySpaceComponent_Template","WidgetWpTableQuerySpaceComponent_Template_widget_wp_table_resourceChanged_0_listener","QuerySpacedTabComponent","wpGraphConfiguration","initializeQuerySpace","WpGraphConfigurationFiltersTabInnerComponent_op_query_filters_0_Template_op_query_filters_filtersChanged_0_listener","WpGraphConfigurationFiltersTabInnerComponent","WpGraphConfigurationFiltersTabInnerComponent_Template","WpGraphConfigurationFiltersTabInnerComponent_op_query_filters_0_Template","WpGraphConfigurationSettingsTabInnerComponent","group_by","chart_type","currentChartType","initializeAvailableGroups","initializeAvailableChartType","availableChartTypes","WpGraphConfigurationSettingsTabInnerComponent_Template","WpGraphConfigurationSettingsTabInnerComponent_Template_select_ngModelChange_6_listener","WpGraphConfigurationSettingsTabInnerComponent_option_7_Template","WpGraphConfigurationSettingsTabInnerComponent_Template_select_ngModelChange_12_listener","WpGraphConfigurationSettingsTabInnerComponent_option_13_Template","option_r4","WorkPackageOverviewGraphComponent","graphConfigurationService","displayModeSingle","availableGroupBy","additionalFilter","setQueryProps","graphParams","sortedDatasets","propsBoth","propsOpen","propsClosed","sortingArray","baseProps","subprojectId","displaySingle","displayMulti","currentGraph","embeddedGraphSingle","embeddedGraphMulti","WorkPackageOverviewGraphComponent_Query","WorkPackageOverviewGraphComponent_Template","WorkPackageOverviewGraphComponent_Template_select_ngModelChange_0_listener","WorkPackageOverviewGraphComponent_option_1_Template","WorkPackageOverviewGraphComponent_div_2_Template","WorkPackageOverviewGraphComponent_op_wp_embedded_graph_3_Template","WorkPackageOverviewGraphComponent_op_wp_embedded_graph_4_Template","OpenprojectWorkPackageGraphsModule","NgChartsModule","WidgetProjectDescriptionComponent","project$","WidgetProjectDescriptionComponent_Template","WidgetProjectDescriptionComponent_edit_form_4_Template","WidgetWpOverviewComponent","WidgetWpOverviewComponent_Template","WidgetWpOverviewComponent_Template_widget_header_onRenamed_0_listener","CustomTextEditFieldService","initializeChangeset","valueChanged$","reinitialize","resetText","rawText","textValue","htmlText","resourceSource","schemaSource","customText","placeholderText","WidgetCustomTextComponent_ng_template_2_div_2_Template","WidgetCustomTextComponent_ng_template_2_div_3_Template","textEmpty","WidgetCustomTextComponent_div_8_button_1_Template_button_click_0_listener","WidgetCustomTextComponent_div_8_button_1_ng_container_1_Template","inplaceEditClasses","WidgetCustomTextComponent_div_8_ng_container_2_ng_container_1_Template","WidgetCustomTextComponent_div_8_button_1_Template","WidgetCustomTextComponent_div_8_ng_container_2_Template","isTextEditable","WidgetCustomTextComponent","setupVariables","newText","currentRawText","clickedElementIsLinkWithinDisplayContainer","memorizeRawText","memorizeCustomText","WidgetCustomTextComponent_Query","WidgetCustomTextComponent_Template","WidgetCustomTextComponent_Template_widget_header_onRenamed_0_listener","WidgetCustomTextComponent_ng_template_2_Template","WidgetCustomTextComponent_edit_form_portal_6_Template","WidgetCustomTextComponent_fieldset_7_Template","WidgetCustomTextComponent_div_8_Template","WidgetProjectDetailsMenuComponent","capabilityPromise","projectActivityLinkItem","WidgetProjectDetailsMenuComponent_Template","WidgetProjectDetailsMenuComponent_icon_triggered_context_menu_0_Template","cf_r3","WidgetProjectDetailsComponent_edit_form_3_ng_container_2_Template","WidgetProjectDetailsComponent","loadProjectSchema","WidgetProjectDetailsComponent_Query","WidgetProjectDetailsComponent_Template","WidgetProjectDetailsComponent_edit_form_3_Template","WidgetTimeEntriesListComponent","loadSchema","anyEntries","activityName","loadedEntry","changedEntry","oldEntryIndex","newEntries","deleteIfConfirmed","closeByEscape","closeByDocument","anEntry","sumsByDateSpent","sortedEntries","WidgetTimeEntriesProjectComponent_ng_container_3_div_5_tr_29_a_9_Template_a_click_0_listener","WidgetTimeEntriesProjectComponent_ng_container_3_div_5_tr_29_a_10_Template_a_click_0_listener","WidgetTimeEntriesProjectComponent_ng_container_3_div_5_tr_29_td_1_Template","WidgetTimeEntriesProjectComponent_ng_container_3_div_5_tr_29_td_2_Template","WidgetTimeEntriesProjectComponent_ng_container_3_div_5_tr_29_td_3_Template","WidgetTimeEntriesProjectComponent_ng_container_3_div_5_tr_29_td_4_Template","WidgetTimeEntriesProjectComponent_ng_container_3_div_5_tr_29_td_5_Template","WidgetTimeEntriesProjectComponent_ng_container_3_div_5_tr_29_td_6_Template","WidgetTimeEntriesProjectComponent_ng_container_3_div_5_tr_29_td_7_Template","WidgetTimeEntriesProjectComponent_ng_container_3_div_5_tr_29_a_9_Template","WidgetTimeEntriesProjectComponent_ng_container_3_div_5_tr_29_a_10_Template","WidgetTimeEntriesProjectComponent_ng_container_3_div_5_tr_29_Template","WidgetTimeEntriesProjectComponent_ng_container_3_div_5_Template","WidgetTimeEntriesProjectComponent","WidgetTimeEntriesProjectComponent_Template","WidgetTimeEntriesProjectComponent_op_no_results_2_Template","WidgetTimeEntriesProjectComponent_ng_container_3_Template","WidgetSubprojectsComponent_span_4_span_2_Template","project_r2","WidgetSubprojectsComponent","projectListParams","WidgetSubprojectsComponent_Template","WidgetSubprojectsComponent_op_no_results_3_Template","WidgetSubprojectsComponent_span_4_Template","WidgetMembersComponent_ng_container_6_ng_container_4_ng_container_2_Template","principal_r7","last_r8","WidgetMembersComponent_ng_container_6_ng_container_4_Template","usersByRole_r5","moreMembersText","viewAll","WidgetMembersComponent","entriesByRoles","listMembersParams","partitionEntriesByRole","sortUsersByName","totalMembers","membersAddable$","listAvailableProjectsParams","noMembers","moreMembers","usersByRole","membership","WidgetMembersComponent_Template","WidgetMembersComponent_op_no_results_4_Template","WidgetMembersComponent_ng_container_6_Template","WidgetMembersComponent_div_7_Template","WidgetMembersComponent_a_9_Template","WidgetMembersComponent_a_11_Template","WidgetProjectStatusComponent","WidgetProjectStatusComponent_Query","WidgetProjectStatusComponent_Template","WidgetProjectStatusComponent_edit_form_4_Template","OpenprojectGridsModule","registerWidgets","defaultColumns","assignedFilters","assignedProps","accountableFilters","accountableProps","createdFilters","createdProps","watchedFilters","watchedProps","appBaseSelector","ApplicationBaseComponent","ApplicationBaseComponent_Template","MY_ACCOUNT_LAZY_ROUTES","loadChildren","OpenProjectMyAccountModule","IAN_LAZY_ROUTES","OPENPROJECT_ROUTES","abstract","squash","OpenprojectBoardsModule","OpenprojectIFCModelsModule","OpenprojectBacklogsModule","OpenprojectReportingModule","OpenProjectJobStatusModule","TeamPlannerModule","bodyClass","updateMenuItem","menuItemTitle","uiRouterConfiguration","strictMode","encode","decode","equals","initializeUiRouterListeners","stateService","wpBase","mobileGuardActivated","redirectToMobileAlternative","router","alternativeRoute","onEnter","onExit","start_onboarding_tour","paramsCopy","profiler","MiniProfiler","pageTransition","toStateObject","$$state","hasProjectRoutes","pathWithSearch","OpenprojectRouterModule","useHash","WORK_PACKAGES_ROUTES","OpenprojectWorkPackageRoutesModule","GlobalSearchService","_searchTerm","searchTerm$","_currentTab","currentTab$","_projectScope","projectScope$","tabs$","_resultsHidden","resultsHidden$","loadGonData","available_search_types","search_term","current_tab","project_scope","global_search","submitSearch","searchPath","projectScope","searchQueryParams","searchTermIsId","searchTermWithoutHash","substr","resultsHidden","isAfterSearch","GlobalSearchInputComponent_button_1_Template_button_click_0_listener","toggleMobileSearch","close_search","recently_viewed","GlobalSearchInputComponent_ng_template_4_div_0_Template","hasRecentItems$","GlobalSearchInputComponent_ng_template_5_div_0_Template_div_click_1_listener","item_r8","followItem","GlobalSearchInputComponent_ng_template_5_ng_template_1_Template_a_click_0_listener","redirectToWp","wpPath","statusHighlighting","GlobalSearchInputComponent_ng_template_5_div_0_Template","GlobalSearchInputComponent_ng_template_5_ng_template_1_Template","GlobalSearchInputComponent","globalSearchService","_markable","markable$","autocompleteWorkPackages","autocompleterOptions","isFocusedDirectly","all_projects","current_project_and_all_descendants","toggleTopMenuClass","unregister","markable","btn","submitNonEmptySearch","_$event","selectedItem","clearSearch","onEnterBeforeResultsLoaded","followSelectedItem","searchInScope","currentScope","statusId","customSearchFn","hashFreeQuery","queryWithoutHash","fetchSearchResults","searchResultsToOptions","setMarkedOption","searchOptions","detailedSearchOptions","suggestion","itemsList","markItem","selectedItems","forcePageLoad","replaceState","serviceScope","unregisterGlobalListener","qaSearchOpen","GlobalSearchInputComponent_Query","GlobalSearchInputComponent_button_1_Template","GlobalSearchInputComponent_Template_op_autocompleter_focus_2_listener","GlobalSearchInputComponent_Template_op_autocompleter_search_2_listener","GlobalSearchInputComponent_Template_op_autocompleter_close_2_listener","GlobalSearchInputComponent_Template_op_autocompleter_change_2_listener","GlobalSearchInputComponent_Template_op_autocompleter_keydown_enter_2_listener","GlobalSearchInputComponent_Template_op_autocompleter_keydown_escape_2_listener","GlobalSearchInputComponent_Template_op_autocompleter_clear_2_listener","GlobalSearchInputComponent_ng_template_4_Template","GlobalSearchInputComponent_ng_template_5_Template","GlobalSearchInputComponent_Template_button_click_6_listener","tableConfiguration","GlobalSearchWorkPackagesComponent","wpFilters","GlobalSearchWorkPackagesComponent_Template","GlobalSearchWorkPackagesComponent_wp_embedded_table_0_Template","GlobalSearchTabsComponent_li_5_a_1_Template_a_click_0_listener","GlobalSearchTabsComponent_li_5_a_2_ng_container_2_op_tab_count_1_Template","GlobalSearchTabsComponent_li_5_a_2_ng_container_2_span_2_Template","GlobalSearchTabsComponent_li_5_a_2_Template_a_click_0_listener","GlobalSearchTabsComponent_li_5_a_2_ng_container_2_Template","GlobalSearchTabsComponent_li_5_Template_li_dragenter_0_listener","GlobalSearchTabsComponent_li_5_Template_li_dragleave_0_listener","GlobalSearchTabsComponent_li_5_a_1_Template","GlobalSearchTabsComponent_li_5_a_2_Template","GlobalSearchTabsComponent","currentTabSub","tabsSub","GlobalSearchTabsComponent_Template","GlobalSearchTabsComponent_Template_ul_scroll_3_listener","GlobalSearchTabsComponent_li_5_Template","GlobalSearchTabsComponent_Template_div_click_6_listener","GlobalSearchTabsComponent_Template_div_click_9_listener","GlobalSearchTitleComponent","project_and_subprojects","search_for","in","newSearchTerm","newProjectScope","projectText","searchTitle","currentProjectName","GlobalSearchTitleComponent_Template","GlobalSearchWorkPackagesEntryComponent","GlobalSearchWorkPackagesEntryComponent_Template","OpenprojectGlobalSearchModule","GridPageComponent","gridInitialization","addWidget","areas","i18nNamespace","html_title","gridScopePath","setHtmlTitle","DashboardComponent_button_8_Template_button_click_0_listener","DashboardComponent","DashboardComponent_Template","DashboardComponent_button_8_Template","DashboardComponent_grid_9_Template","DASHBOARDS_ROUTES","uiRouterDashboardsConfiguration","OpenprojectDashboardsModule","WpPreviewModalComponent_div_0_Template_wp_single_card_stateLinkClicked_1_listener","WpPreviewModalComponent","created_by","WpPreviewModalComponent_Template","WpPreviewModalComponent_div_0_Template","PreviewTriggerService","mouseInModal","previewModal","modalElement","closeAfterTimeout","isMouseOverPreview","horizontalHover","verticalHover","OverviewComponent_button_8_Template_button_click_0_listener","OverviewComponent","OverviewComponent_Template","OverviewComponent_button_8_Template","OverviewComponent_grid_9_Template","OVERVIEW_ROUTES","uiRouterOverviewConfiguration","OpenprojectOverviewModule","MyPageComponent_button_8_Template_button_click_0_listener","MyPageComponent","MyPageComponent_Template","MyPageComponent_button_8_Template","MyPageComponent_grid_9_Template","MY_PAGE_ROUTES","OpenprojectMyPageModule","accessKeys","quickSearch","projectSearch","moreMenu","KeyboardShortcutService","shortcuts","?","showHelpModal","globalAction","projectScoped","focusPrevItem","focusNextItem","keyName","clickLink","bubbles","cancelable","focusItemOffset","MembersAutocompleterComponent_6_ng_template_0_Template","MembersAutocompleterComponent_7_ng_template_0_Template","MembersAutocompleterComponent_9_ng_template_0_Template","MembersAutocompleterComponent_ng_template_10_ng_container_0_op_principal_2_Template","MembersAutocompleterComponent_ng_template_10_ng_container_0_span_4_Template","MembersAutocompleterComponent_ng_template_10_ng_container_1_op_principal_2_Template","MembersAutocompleterComponent_ng_template_10_ng_container_0_Template","MembersAutocompleterComponent_ng_template_10_ng_container_1_Template","MembersAutocompleterComponent_ng_template_10_ng_container_2_Template","MembersAutocompleterComponent_ng_template_12_ng_container_0_span_1_Template","MembersAutocompleterComponent_ng_template_12_ng_container_1_Template_span_click_1_listener","MembersAutocompleterComponent_ng_template_12_ng_container_0_Template","MembersAutocompleterComponent_ng_template_12_ng_container_1_Template","MembersAutocompleterComponent","MembersAutocompleterComponent_Template","MembersAutocompleterComponent_input_1_Template","MembersAutocompleterComponent_Template_ng_select_ngModelChange_2_listener","MembersAutocompleterComponent_Template_ng_select_change_2_listener","MembersAutocompleterComponent_Template_ng_select_open_2_listener","MembersAutocompleterComponent_Template_ng_select_close_2_listener","MembersAutocompleterComponent_Template_ng_select_blur_2_listener","MembersAutocompleterComponent_Template_ng_select_focus_2_listener","MembersAutocompleterComponent_Template_ng_select_clear_2_listener","MembersAutocompleterComponent_Template_ng_select_keydown_2_listener","MembersAutocompleterComponent_Template_ng_select_keydown_escape_2_listener","MembersAutocompleterComponent_Template_ng_select_search_2_listener","MembersAutocompleterComponent_Template_ng_select_scroll_2_listener","MembersAutocompleterComponent_Template_ng_select_scrollToEnd_2_listener","MembersAutocompleterComponent_Template_ng_select_add_2_listener","MembersAutocompleterComponent_Template_ng_select_remove_2_listener","MembersAutocompleterComponent_6_Template","MembersAutocompleterComponent_7_Template","MembersAutocompleterComponent_ng_template_8_Template","MembersAutocompleterComponent_9_Template","MembersAutocompleterComponent_ng_template_10_Template","MembersAutocompleterComponent_ng_template_12_Template","OpenprojectMembersModule","OpenprojectAugmentingModule","modalWrapper","OpInviteUserModalAugmentService","spawnModal","lackingPermissionInfo","lackingPermission","ProjectSelectionComponent","typeControl","projectAndTypeForm","projectControl","noInviteRights","nextButton","typeOptions","projectInviteCapabilities","APIFiltersForProjects","setPlaceholderOption","Placeholder","eeHref","$e","projectFilterFn","ProjectSelectionComponent_Template","ProjectSelectionComponent_Template_form_ngSubmit_0_listener","ProjectSelectionComponent_div_7_Template","ProjectSelectionComponent_div_8_Template","ProjectSelectionComponent_div_9_Template","ProjectSelectionComponent_div_12_Template","ProjectSelectionComponent_Template_button_click_15_listener","alreadyAMember","PrincipalSearchComponent_ng_template_4_div_0_div_3_Template","search_r7","item_r6","PrincipalSearchComponent_ng_template_4_div_0_Template","inviteNewUser","createNewPlaceholder","PrincipalSearchComponent_ng_template_6_div_0_Template","PrincipalSearchComponent_ng_template_6_div_2_Template","canInviteByEmail$","canCreateNewPlaceholder$","PrincipalSearchComponent","loadPrincipalData","emailRegExp","canCreateUsers","hasCapability","showAddTag","PlaceholderUser","canInviteByEmail","canCreateNewPlaceholder","createNewFromInput","nonMemberFilter","nonMembers","memberFilter","nonMember","spotFormBinding","PrincipalSearchComponent_Template","PrincipalSearchComponent_ng_template_3_Template","PrincipalSearchComponent_ng_template_4_Template","PrincipalSearchComponent_ng_template_5_Template","PrincipalSearchComponent_ng_template_6_Template","noRolesFound","RoleSearchComponent","roles$","RoleSearchComponent_Template","RoleSearchComponent_ng_template_3_Template","RoleSearchComponent_ng_template_4_Template","PrincipalComponent_op_ium_principal_search_6_Template_op_ium_principal_search_createNew_0_listener","principalControl","PrincipalComponent_p_7_Template_button_click_4_listener","inviteUser","PrincipalComponent_p_8_Template_button_click_4_listener","dynamicFieldsControl","userDynamicFieldConfig","messageControl","PrincipalComponent","principalForm","roleControl","hasPrincipalSelected","textLabel","isNewPrincipal","Email","isMemberOfCurrentProject","mem","messageData","backButton","userDynamicFields","roleData","formResource","extractCustomFieldsFromSchema","onValidatedSubmit","fieldsSchema","fieldKey","opt","PrincipalComponent_Query","PrincipalComponent_Template_form_ngSubmit_0_listener","PrincipalComponent_op_ium_principal_search_6_Template","PrincipalComponent_p_7_Template","PrincipalComponent_p_8_Template","PrincipalComponent_div_9_Template","PrincipalComponent_op_dynamic_form_10_Template","PrincipalComponent_div_14_Template","PrincipalComponent_spot_form_field_15_Template","PrincipalComponent_Template_button_click_18_listener","PrincipalComponent_Template_button_click_22_listener","messageLabel","SummaryComponent","projectLabel","principalLabel","roleLabel","invite","createPrincipal","SummaryComponent_Template","SummaryComponent_Template_form_submit_0_listener","SummaryComponent_spot_form_field_14_Template","SummaryComponent_Template_button_click_17_listener","SummaryComponent_Template_button_click_21_listener","SuccessComponent","user_image","placeholder_image","SuccessComponent_Template","SuccessComponent_Template_button_click_7_listener","OpenprojectInviteUserModalModule","TextFieldModule","RevitAddInSettingsButtonService","labelText","groupLabelText","addUserMenuItem","addLoginMenuItem","userMenu","goToSettings","loginModal","loginMenuItem","settingsButton","EnterpriseBaseComponent_div_1_Template_button_click_11_listener","confidence","EnterpriseBaseComponent_ng_template_2_Template_a_click_3_listener","email_not_received","try_another_email","EnterpriseBaseComponent","button_book","link_quote","noTrialRequested","EnterpriseBaseComponent_Template","EnterpriseBaseComponent_div_1_Template","EnterpriseBaseComponent_ng_template_2_Template","EEActiveSavedTrialComponent_div_17_span_5_Template","EEActiveSavedTrialComponent","reprieveDaysLeft","EEActiveSavedTrialComponent_Template","EEActiveSavedTrialComponent_div_13_Template","EEActiveSavedTrialComponent_div_14_Template","EEActiveSavedTrialComponent_div_15_Template","EEActiveSavedTrialComponent_div_16_Template","EEActiveSavedTrialComponent_div_17_Template","OpenprojectEnterpriseModule","ANIMATION_RATE_MS","TopMenuService","hover","menuIsOpen","menuContainer","setupDropdownClick","closeOnBodyClick","accessibility","skipContentClickListener","activeDropdown$","stopHover","closeAllItems","skipLink","visibleLink","not","toggleClick","dropdown","openDropdown","opening","startHover","openDropdowns","closeDropdown","dropdowns","closeOtherItems","slideAndFocus","focusFirstInputOrLink","toDrop","getDropdownContainer","toFocus","MainMenuToggleComponent","topMenu","MainMenuToggleComponent_Template","MainMenuToggleComponent_Template_button_click_0_listener","PasswordConfirmationModalComponent","password_confirmation","additionalText","field_description","confirm_button","password","passwordValuePresent","passwordConfirmationField","PasswordConfirmationModalComponent_Query","PasswordConfirmationModalComponent_Template_form_submit_0_listener","PasswordConfirmationModalComponent_Template_input_ngModelChange_9_listener","PasswordConfirmationModalComponent_Template_button_click_14_listener","OpHeaderProjectSelectListComponent_li_0_a_1_Template","OpHeaderProjectSelectListComponent_li_0_span_2_Template","OpHeaderProjectSelectListComponent_li_0_ul_3_Template","OpHeaderProjectSelectListComponent","selectedItemID","itemAction","OpHeaderProjectSelectListComponent_HostBindings","OpHeaderProjectSelectListComponent_li_0_Template","projects_r3","OpHeaderProjectSelectComponent_div_7_ng_container_3_ul_1_Template","OpHeaderProjectSelectComponent_div_7_ng_container_3_ng_template_2_Template","newProjectPath","singular","OpHeaderProjectSelectComponent_div_7_Template_spot_text_field_ngModelChange_1_listener","OpHeaderProjectSelectComponent_div_7_Template_spot_text_field_keydown_1_listener","OpHeaderProjectSelectComponent_div_7_Template_spot_text_field_inputFocus_1_listener","OpHeaderProjectSelectComponent_div_7_Template_spot_text_field_inputBlur_1_listener","OpHeaderProjectSelectComponent_div_7_ng_container_3_Template","OpHeaderProjectSelectComponent_div_7_a_10_Template","allProjectsPath","canCreateNewProjects$","OpHeaderProjectSelectComponent","dropModalOpen","plural","scrollToCurrent","toggleDropModal","parentParam","OpHeaderProjectSelectComponent_HostBindings","OpHeaderProjectSelectComponent_Template","OpHeaderProjectSelectComponent_Template_spot_drop_modal_closed_0_listener","OpHeaderProjectSelectComponent_Template_button_click_1_listener","OpHeaderProjectSelectComponent_div_7_Template","OpHeaderProjectSelectComponent_ng_template_9_Template","MainMenuResizerComponent","MainMenuResizerComponent_Template","MainMenuResizerComponent_Template_resizer_end_0_listener","MainMenuResizerComponent_Template_resizer_start_0_listener","MainMenuResizerComponent_Template_resizer_move_0_listener","MainMenuResizerComponent_Template_button_click_2_listener","TypeBannerService","showEEOnlyHint","GroupEditInPlaceComponent_div_0_Template_div_click_0_listener","GroupEditInPlaceComponent_input_1_Template_input_ngModelChange_0_listener","editedName","GroupEditInPlaceComponent_input_1_Template_input_blur_0_listener","saveEdition","GroupEditInPlaceComponent_input_1_Template_input_keydown_escape_0_listener","GroupEditInPlaceComponent_input_1_Template_input_keydown_enter_0_listener","GroupEditInPlaceComponent","onValueChange","leaveEditingMode","GroupEditInPlaceComponent_Template","GroupEditInPlaceComponent_div_0_Template","GroupEditInPlaceComponent_input_1_Template","TypeFormAttributeGroupComponent_div_6_span_4_Template","TypeFormAttributeGroupComponent_div_6_Template_span_click_5_listener","attribute_r1","removeFromGroup","translation","is_cf","TypeFormAttributeGroupComponent","deleteGroup","rename","TypeFormAttributeGroupComponent_Template","TypeFormAttributeGroupComponent_Template_op_group_edit_in_place_onValueChange_3_listener","TypeFormAttributeGroupComponent_Template_span_click_4_listener","TypeFormAttributeGroupComponent_Template_div_dragulaModelChange_5_listener","TypeFormAttributeGroupComponent_div_6_Template","installMenuLogic","dropDown","TypeFormConfigurationComponent_li_7_Template_button_click_7_listener","TypeFormConfigurationComponent_li_7_Template_button_click_9_listener","addGroupAndOpenQuery","label_group","add_group","add_table","TypeFormConfigurationComponent_ng_container_11_op_type_form_attribute_group_1_Template_op_type_form_attribute_group_removeAttribute_0_listener","deactivateAttribute","TypeFormConfigurationComponent_ng_container_11_op_type_form_attribute_group_1_Template_op_type_form_attribute_group_deleteGroup_0_listener","group_r6","TypeFormConfigurationComponent_ng_container_11_op_type_form_query_group_2_Template_op_type_form_query_group_editQuery_0_listener","editQuery","TypeFormConfigurationComponent_ng_container_11_op_type_form_query_group_2_Template_op_type_form_query_group_deleteGroup_0_listener","TypeFormConfigurationComponent_ng_container_11_op_type_form_attribute_group_1_Template","TypeFormConfigurationComponent_ng_container_11_op_type_form_query_group_2_Template","TypeFormConfigurationComponent_div_19_span_4_Template","inactive_attribute_r20","emptyTypeGroup","TypeFormConfigurationComponent","externalRelationQuery","typeBanner","drag_to_activate","new_group","label_inactive","inactives","no_filter_query","noFilterQuery","updateHiddenFields","groupsDrake","attributeDrake","activeGroups","inactiveAttributes","updateInactives","newGroup","resetToDefault","emptyGroup","hiddenField","TypeFormConfigurationComponent_Template","TypeFormConfigurationComponent_Template_button_click_4_listener","TypeFormConfigurationComponent_li_7_Template","TypeFormConfigurationComponent_Template_div_dragulaModelChange_10_listener","TypeFormConfigurationComponent_ng_container_11_Template","TypeFormConfigurationComponent_Template_div_dragulaModelChange_18_listener","TypeFormConfigurationComponent_div_19_Template","TypeFormQueryGroupComponent","edit_query","TypeFormQueryGroupComponent_Template","TypeFormQueryGroupComponent_Template_op_group_edit_in_place_onValueChange_3_listener","TypeFormQueryGroupComponent_Template_span_click_4_listener","TypeFormQueryGroupComponent_Template_span_click_6_listener","EditableQueryPropsComponent","externalQuery","queryProperties","EditableQueryPropsComponent_Template","EditableQueryPropsComponent_Template_button_click_1_listener","OpenprojectAdminModule","OpenProjectBackupService","triggerBackup","BackupComponent","note","lastBackup","lastBackupFrom","downloadBackup","requestBackup","attachmentsDisabled","jobStatusId","lastBackupDate","lastBackupAttachmentId","mayIncludeAttachments","isInProgress","backupTokenInput","isDownloadReady","getDownloadUrl","includeAttachmentsDefault","includeAttachmentsTitle","opBackup","resp","BackupComponent_Query","BackupComponent_Template_input_change_32_listener","BackupComponent_Template_input_input_35_listener","BackupComponent_Template_button_click_37_listener","globalDynamicComponents","HTMLSanitizeService","string","OpenProjectPluginContext","_knownHookNames","services","externalQueryConfiguration","externalRelationQueryConfiguration","htmlSanitizeService","ckEditorPreview","modals","passwordConfirmation","dynamicContent","runInZone","run","NgZone","OpenprojectPluginsModule","PlannedCostsFormAugment","listen","CostBudgetSubformAugmentService","templateEl","row_identifier","buildRefreshRequest","element_id","fixed_date","CostSubformAugmentService","BudgetBaseResource","BudgetResource","initializeCostsPlugin","PluginModule","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","AvatarUploadService","wrong_file_format","avatarPreviewUrl","AvatarUploadFormComponent","fileInvalid","label_choose_avatar","upload_instructions","error_too_large","button_update","uploading","_evt","avatarFilePicker","dataURL","blob","avatarFile","File","uploadAvatar","AvatarUploadFormComponent_Query","AvatarUploadFormComponent_Template","AvatarUploadFormComponent_Template_input_change_3_listener","AvatarUploadFormComponent_span_8_Template","AvatarUploadFormComponent_fieldset_9_Template","AvatarUploadFormComponent_Template_button_click_10_listener","DocumentBaseResource","DocumentResource","initializeDocumentPlugin","GitActionsService","sanitizeBranchString","str","formattingInput","sanitizeShellInput","branchName","commitMessage","gitCommand","branch","lastCopyResult","GitActionsMenuComponent_div_3_Template_button_click_6_listener","snippet_r1","onCopyButtonClick","GitActionsMenuComponent_div_3_div_8_Template","textToCopy","copyButtonHelpText","showCopyResult","copiedSnippetId","GitActionsMenuComponent","gitActions","copyResult","success","snippets","snippet","GitActionsMenuComponent_Template","GitActionsMenuComponent_div_3_Template","GitActionsMenuDirective","TabHeaderComponent","createPrButtonLabel","createPrButtonDescription","gitMenuLabel","gitMenuDescription","TabHeaderComponent_Template","GithubPullRequestsStore","GithubPullRequestResourceService","ofWorkPackage","workPackagePullRequestsPath","requireSingle","entityPath","PullRequestStateComponent","PullRequestStateComponent_Template","pullRequest","githubUser","avatarUrl","htmlUrl","label_actions","checkRunState","checkRun_r5","checkRunStateIcon","checkRunStateText","appOwnerAvatarUrl","detailsUrl","label_details","PullRequestComponent_ul_14_li_1_Template","checkRuns","PullRequestComponent","label_created_by","label_last_updated_on","merged","checkRun","outputTitle","conclusion","PullRequestComponent_HostBindings","PullRequestComponent_img_4_Template","PullRequestComponent_a_6_Template","PullRequestComponent_span_13_Template","PullRequestComponent_ul_14_Template","repository","githubUpdatedAt","emptyText","pullRequest_r2","TabPrsComponent","githubPullRequests","wp_id","pullRequests$","TabPrsComponent_HostBindings","TabPrsComponent_ng_container_0_Template","TabPrsComponent_op_github_pull_request_2_Template","GitHubTabComponent","GitHubTabComponent_Template","pullRequestState","displayText$","PullRequestMacroComponent","pullRequests","pullRequest$","pullRequestId","pr","buildText","deriveActor","actorLink","htmlLink","repositoryLink","repositoryHtmlUrl","prLink","deriveMessage","pr_number","pr_link","repository_link","pr_state","github_user_link","mergedBy","PullRequestMacroComponent_Template","PullRequestMacroComponent_div_0_Template","PullRequestMacroComponent_ng_template_2_Template","workPackageGithubPrsCount","prs","initializeGithubIntegrationPlugin","github","TabHeaderMrsComponent","TabHeaderMrsComponent_Template","TabHeaderIssueComponent","TabHeaderIssueComponent_Template","MergeRequestComponent_button_6_Template_button_click_0_listener","toggleLabels","mergeRequest","pipelines","gitlabUser","label_r6","MergeRequestComponent","label_pipelines","labelsElement","MergeRequestComponent_Template","MergeRequestComponent_button_6_Template","MergeRequestComponent_span_7_Template","MergeRequestComponent_a_11_Template","MergeRequestComponent_span_18_Template","gitlabUpdatedAt","getEmptyText","mergeRequest_r2","TabMrsComponent","changeDetector","mergeRequests","mergeRequestsPath","TabMrsComponent_Template","TabMrsComponent_ng_container_0_Template","TabMrsComponent_gitlab_merge_request_1_Template","IssueComponent_button_6_Template_button_click_0_listener","gitlabIssue","label_r5","IssueComponent","IssueComponent_Template","IssueComponent_button_6_Template","IssueComponent_a_10_Template","IssueComponent_span_17_Template","gitlabIssue_r2","TabIssueComponent","gitlabIssues","gitlabIssuePath","TabIssueComponent_Template","TabIssueComponent_ng_container_0_Template","TabIssueComponent_gitlab_issue_1_Template","GitlabTabComponent","GitlabTabComponent_Template","WorkPackagesGitlabMrsService","gitlab_merge_requests","sortList","WorkPackagesGitlabIssueService","gitlab_issues","workPackageGitlabCount","gitlabMrsService","gitlabIssueService","mrsObservable","mrs","issuesObservable","issues","mrsCount","issuesCount","initializeGitlabIntegrationPlugin","gitlab","MeetingsTabComponent","turboFrameSrc","MeetingsTabComponent_Template","workPackageMeetingsCount","stream","newStream","initializeMeetingPlugin","wpTabService","meetings","LinkedPluginsModule","Budgets","Costs","OpenprojectAvatars","OpenprojectDocuments","OpenprojectGithubIntegration","OpenprojectGitlabIntegration","OpenprojectMeeting","OpenProjectStateModule","FogUploadService","performUpload","finishUpload","finishUrl","metadata","getType","fileSize","form_fields","completeUpload","LocalUploadService","registerCustomElement","createCustomElement","customElements","define","PreviewTrigger","topMenuService","keyboardShortcuts","OpenProjectModule","ngDoBootstrap","registerCustomElements","_injector","HTTP_INTERCEPTORS","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","firstErrorSpan","activateFlashNotice","activateFlashError","autoHideFlashMessage","flashCloseHandler","ajaxComplete","ajaxSend","csrf_meta_tag","setRequestHeader","ajaxStop","addClickEventToAllErrorMessages","resizeTo","error_focus","input_focus","unbind","activateFlash","ix","triggerTour","_triggerTour","tour","performAnchorHijacking","linkElement","hashPos","openExternalLinksInNewTab","initializeGlobalListeners","callbacks","marginBottom","scrollHeaderOnMobile","prevScrollPos","currentScrollPos","detectOnboardingTour","demoProjectsAvailable","currentTourPart","sessionStorage","tourCancelled","elementsByClassName","modalOverlay","demo","listenToSettingChanges","wasDisabled","vendor","langSelectSwitchData","settingName","newLang","textArea","storedValue","delivery_method","isNone","wasChecked","removeAttr","makeColorPreviews","previewColor","keyup","dangerZoneValidation","dangerZoneVerification","expectedValue","expectedText","actualValue","fixFragmentAnchors","initializer","ASSET_HOST","assetHost","configureErrorReporter","enableProdMode","initializeLocale","userLocale","defaultLocale","defaultlocale","firstdayofweek","firstWeekOfYear","firstweekofyear","i18njs","updateLocale","dow","doy","pluralization","_i18n","localeImports","chain","__NgCli_bootstrap_1","MainMenuController","Controller","targets","rootTarget","sidebarTarget","getActiveMenuName","markActive","descend","targetLi","toggleMenuState","ascend","activeItem","itemTargets","activeRoot","OpApplicationController","ApplicationController","dynamicTargetConnected","derivePath","application","OpDisableWhenCheckedController","reversed","Boolean","causeTargetConnected","toggleDisabled","causeTargetDisconnected","effectTargets","hasReversedValue","reversedValue","PrintController","triggerPrint","print","RefreshOnFormChangesController","refreshUrl","turboStreamUrl","triggerReload","refreshUrlValue","getSerializedFormData","triggerTurboStream","fetch","turboStreamUrlValue","renderStreamMessage","formTarget","Application","Stimulus","debug","Turbo","drive","visit","HTMLFormElement","dialog","webpackAsyncContext","__webpack_require__","webpackEmptyContext","webpackContext","webpackContextResolve","webpackContextKeys"],"sourceRoot":"webpack:///","x_google_ignoreList":[1363,1364,1365]}