From 82712d44e35ccb38b35866a131775c7b64552e0d Mon Sep 17 00:00:00 2001 From: Henriette Dinger Date: Wed, 28 Nov 2018 14:08:26 +0100 Subject: [PATCH] =?UTF-8?q?Add=20=E2=80=9Erelated=20to=E2=80=9C=20relation?= =?UTF-8?q?=20when=20a=20WP=20is=20copied?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/wp-copy/wp-copy.controller.ts | 45 +++++++++++++++---- spec/features/work_packages/copy_spec.rb | 18 ++++++-- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/frontend/src/app/components/wp-copy/wp-copy.controller.ts b/frontend/src/app/components/wp-copy/wp-copy.controller.ts index 2feabc69ec6..d777d32dc50 100644 --- a/frontend/src/app/components/wp-copy/wp-copy.controller.ts +++ b/frontend/src/app/components/wp-copy/wp-copy.controller.ts @@ -30,18 +30,40 @@ import {take} from 'rxjs/operators'; import {WorkPackageResource} from 'core-app/modules/hal/resources/work-package-resource'; import {WorkPackageChangeset} from 'core-components/wp-edit-form/work-package-changeset'; import {WorkPackageCreateController} from 'core-components/wp-new/wp-create.controller'; +import {WorkPackageRelationsService} from "core-components/wp-relations/wp-relations.service"; +import {untilComponentDestroyed} from "ng2-rx-componentdestroyed"; export class WorkPackageCopyController extends WorkPackageCreateController { + private __initialized_at:Number; + private copiedWorkPackageId:string; + + private wpRelations:WorkPackageRelationsService = this.injector.get(WorkPackageRelationsService); + + ngOnInit() { + super.ngOnInit(); + + this.wpCreate.onNewWorkPackage() + .pipe( + untilComponentDestroyed(this) + ) + .subscribe((wp:WorkPackageResource) => { + if (wp.__initialized_at === this.__initialized_at) { + this.wpRelations.addCommonRelation(wp.id, 'relates', this.copiedWorkPackageId); + } + }); + } + protected newWorkPackageFromParams(stateParams:any) { + this.copiedWorkPackageId = stateParams.copiedFromWorkPackageId; return new Promise((resolve, reject) => { - this.wpCacheService.loadWorkPackage(stateParams.copiedFromWorkPackageId) + this.wpCacheService.loadWorkPackage(this.copiedWorkPackageId) .values$() .pipe( take(1) ) - .subscribe( - (wp:WorkPackageResource) => this.createCopyFrom(wp).then(resolve), - reject); + .subscribe((wp:WorkPackageResource) => { + this.createCopyFrom(wp).then(resolve, reject); + }); }); } @@ -50,9 +72,16 @@ export class WorkPackageCopyController extends WorkPackageCreateController { } private createCopyFrom(wp:WorkPackageResource) { - const changeset = this.wpEditing.changesetFor(wp); - return changeset.getForm().then((form:any) => { - return this.wpCreate.copyWorkPackage(form, wp.project.identifier); - }); + return this.wpEditing + .changesetFor(wp) + .getForm() + .then((form:any) => + this.wpCreate + .copyWorkPackage(form, wp.project.identifier) + .then((changeset) => { + this.__initialized_at = changeset.workPackage.__initialized_at; + return changeset; + }) + ); } } diff --git a/spec/features/work_packages/copy_spec.rb b/spec/features/work_packages/copy_spec.rb index 1177c7a306f..63ab02bb89c 100644 --- a/spec/features/work_packages/copy_spec.rb +++ b/spec/features/work_packages/copy_spec.rb @@ -44,9 +44,10 @@ RSpec.feature 'Work package copy', js: true, selenium: true do let(:create_role) do FactoryBot.create(:role, - permissions: [:view_work_packages, - :add_work_packages, - :edit_work_packages]) + permissions: %i[view_work_packages + add_work_packages + manage_work_package_relations + edit_work_packages]) end let(:type) { FactoryBot.create(:type) } let(:project) { FactoryBot.create(:project, types: [type]) } @@ -121,6 +122,11 @@ RSpec.feature 'Work package copy', js: true, selenium: true do work_package_page.expect_activity user, number: 1 work_package_page.expect_current_path + + work_package_page.visit_tab! :relations + expect_angular_frontend_initialized + expect(page).to have_selector('.relation-group--header', text: 'RELATED TO') + expect(page).to have_selector('.wp-relations--subject-field', text: original_work_package.subject) end scenario 'on split screen page' do @@ -152,5 +158,11 @@ RSpec.feature 'Work package copy', js: true, selenium: true do work_package_page.expect_activity user, number: 1 work_package_page.expect_current_path + + + work_package_page.visit_tab!('relations') + expect_angular_frontend_initialized + expect(page).to have_selector('.relation-group--header', text: 'RELATED TO') + expect(page).to have_selector('.wp-relations--subject-field', text: original_work_package.subject) end end