From a311a6030189d8b07e66fe4a6640b8a0329de9cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Leo=20Gr=C3=A4tz?= <23726273+LarsLeo@users.noreply.github.com> Date: Thu, 29 Mar 2018 12:14:54 +0200 Subject: [PATCH] TSK-426 now using generic domains/ did refactors of import/export TSK-426 fixed test issues --- .../rest/ClassificationController.java | 17 +- .../ClassificationDefinitionController.java | 15 +- .../taskana/rest/TaskanaEngineController.java | 25 +++ .../taskana/rest/WorkbasketController.java | 18 +- .../rest/WorkbasketDefinitionController.java | 15 +- .../list/classification-list.component.html | 2 +- .../classification-list.component.spec.ts | 13 +- .../list/classification-list.component.ts | 2 + .../administration/enums/SelectionToImport.ts | 4 + .../import-export.component.html | 11 +- .../import-export.component.scss | 3 + .../import-export.component.spec.ts | 27 ++- .../import-export/import-export.component.ts | 41 ++-- .../workbasket-list-toolbar.component.html | 1 + .../workbasket-list-toolbar.component.spec.ts | 3 +- .../workbasket-list-toolbar.component.ts | 22 +- .../list/workbasket-list.component.spec.ts | 6 +- web/src/app/app.component.spec.ts | 2 +- web/src/app/app.module.ts | 204 +++++++++--------- .../classification/classification.service.ts | 37 +--- .../app/services/domains/domain.service.ts | 26 +++ .../services/workbasket/workbasket.service.ts | 30 +-- .../workbasketDefinition.service.ts | 28 +-- web/src/app/shared/util/taskana.date.ts | 10 + 24 files changed, 286 insertions(+), 276 deletions(-) create mode 100644 rest/taskana-rest-spring/src/main/java/pro/taskana/rest/TaskanaEngineController.java create mode 100644 web/src/app/administration/enums/SelectionToImport.ts create mode 100644 web/src/app/services/domains/domain.service.ts create mode 100644 web/src/app/shared/util/taskana.date.ts diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationController.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationController.java index 51ca5a44d..25ceeed5f 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationController.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationController.java @@ -1,8 +1,5 @@ package pro.taskana.rest; -import java.util.ArrayList; -import java.util.List; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -16,10 +13,7 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - -import pro.taskana.BaseQuery; import pro.taskana.Classification; -import pro.taskana.ClassificationQuery; import pro.taskana.ClassificationService; import pro.taskana.ClassificationSummary; import pro.taskana.exceptions.ClassificationAlreadyExistException; @@ -31,6 +25,8 @@ import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.rest.resource.ClassificationResource; import pro.taskana.rest.resource.mapper.ClassificationMapper; +import java.util.List; + /** * Controller for all {@link Classification} related endpoints. */ @@ -74,15 +70,6 @@ public class ClassificationController { return ResponseEntity.status(HttpStatus.OK).body(classificationMapper.toResource(classification)); } - @GetMapping(path = "/domains") - @Transactional(readOnly = true, rollbackFor = Exception.class) - public ResponseEntity> getDomains() { - List domains = new ArrayList<>(); - ClassificationQuery classificationQuery = classificationService.createClassificationQuery(); - domains = classificationQuery.listValues("DOMAIN", BaseQuery.SortDirection.ASCENDING); - return new ResponseEntity<>(domains, HttpStatus.OK); - } - @PostMapping @Transactional(rollbackFor = Exception.class) public ResponseEntity createClassification( diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationDefinitionController.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationDefinitionController.java index 86ea9fcd1..0b356d5e0 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationDefinitionController.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/ClassificationDefinitionController.java @@ -1,10 +1,5 @@ package pro.taskana.rest; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -17,7 +12,6 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; - import pro.taskana.Classification; import pro.taskana.ClassificationQuery; import pro.taskana.ClassificationService; @@ -31,6 +25,11 @@ import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.rest.resource.ClassificationResource; import pro.taskana.rest.resource.mapper.ClassificationMapper; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + /** * Controller for Importing / Exporting classifications. */ @@ -68,11 +67,11 @@ public class ClassificationDefinitionController { Map systemIds = classificationService.createClassificationQuery() .list() .stream() - .collect(Collectors.toMap(i -> i.getKey() + "|||" + i.getDomain(), ClassificationSummary::getId)); + .collect(Collectors.toMap(i -> i.getKey() + "|" + i.getDomain(), ClassificationSummary::getId)); try { for (ClassificationResource classificationResource : classificationResources) { - if (systemIds.containsKey(classificationResource.key + "|||" + classificationResource.domain)) { + if (systemIds.containsKey(classificationResource.key + "|" + classificationResource.domain)) { classificationService.updateClassification(classificationMapper.toModel(classificationResource)); } else { diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/TaskanaEngineController.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/TaskanaEngineController.java new file mode 100644 index 000000000..e3c7bce85 --- /dev/null +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/TaskanaEngineController.java @@ -0,0 +1,25 @@ +package pro.taskana.rest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import pro.taskana.configuration.TaskanaEngineConfiguration; + +import java.util.List; + +/** + * Controller for TaskanaEngine related tasks. + */ +@RestController +public class TaskanaEngineController { + + @Autowired TaskanaEngineConfiguration taskanaEngineConfiguration; + + @GetMapping(path = "/v1/domains", produces = {MediaType.APPLICATION_JSON_VALUE}) + public ResponseEntity> getDomains() { + return new ResponseEntity<>(taskanaEngineConfiguration.getDomains(), HttpStatus.OK); + } +} diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketController.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketController.java index 990b5b64c..51425692a 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketController.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketController.java @@ -1,9 +1,5 @@ package pro.taskana.rest; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.hateoas.PagedResources; import org.springframework.hateoas.PagedResources.PageMetadata; @@ -22,7 +18,6 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; - import pro.taskana.BaseQuery; import pro.taskana.Workbasket; import pro.taskana.WorkbasketAccessItem; @@ -48,6 +43,10 @@ import pro.taskana.rest.resource.mapper.WorkbasketAccessItemMapper; import pro.taskana.rest.resource.mapper.WorkbasketMapper; import pro.taskana.rest.resource.mapper.WorkbasketSummaryResourcesAssembler; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + /** * Controller for all {@link Workbasket} related endpoints. */ @@ -188,15 +187,6 @@ public class WorkbasketController extends AbstractPagingController { return result; } - @GetMapping(path = "/domains") - @Transactional(readOnly = true, rollbackFor = Exception.class) - public ResponseEntity> getDomains() { - List domains = new ArrayList<>(); - WorkbasketQuery workbasketQuery = workbasketService.createWorkbasketQuery(); - domains = workbasketQuery.listValues("DOMAIN", BaseQuery.SortDirection.ASCENDING); - return new ResponseEntity<>(domains, HttpStatus.OK); - } - @PutMapping(value = "/{workbasketId}/workbasketAccessItems") @Transactional(rollbackFor = Exception.class) public ResponseEntity> setWorkbasketAccessItems( diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketDefinitionController.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketDefinitionController.java index b435c8f0c..48cec17dc 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketDefinitionController.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketDefinitionController.java @@ -1,11 +1,5 @@ package pro.taskana.rest; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -18,7 +12,6 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; - import pro.taskana.Workbasket; import pro.taskana.WorkbasketAccessItem; import pro.taskana.WorkbasketQuery; @@ -37,6 +30,12 @@ import pro.taskana.rest.resource.mapper.WorkbasketAccessItemMapper; import pro.taskana.rest.resource.mapper.WorkbasketDefinitionMapper; import pro.taskana.rest.resource.mapper.WorkbasketMapper; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + /** * Controller for all {@link WorkbasketDefinition} related endpoints. */ @@ -181,6 +180,6 @@ public class WorkbasketDefinitionController { } private String logicalId(String key, String domain) { - return key + "|||" + domain; + return key + "|" + domain; } } diff --git a/web/src/app/administration/classification/master/list/classification-list.component.html b/web/src/app/administration/classification/master/list/classification-list.component.html index 9348b5e80..8bd22802c 100644 --- a/web/src/app/administration/classification/master/list/classification-list.component.html +++ b/web/src/app/administration/classification/master/list/classification-list.component.html @@ -3,7 +3,7 @@
  • - +
  • diff --git a/web/src/app/administration/classification/master/list/classification-list.component.spec.ts b/web/src/app/administration/classification/master/list/classification-list.component.spec.ts index 94a832083..211c6fc04 100644 --- a/web/src/app/administration/classification/master/list/classification-list.component.spec.ts +++ b/web/src/app/administration/classification/master/list/classification-list.component.spec.ts @@ -1,6 +1,6 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; -import { ClassificationListComponent } from './classification-list.component'; +import {ClassificationListComponent} from './classification-list.component'; import {ImportExportComponent} from '../../../import-export/import-export.component'; import {SpinnerComponent} from '../../../../shared/spinner/spinner.component'; import {WorkbasketService} from '../../../../services/workbasket/workbasket.service'; @@ -8,6 +8,7 @@ import {HttpClient, HttpClientModule} from '@angular/common/http'; import {WorkbasketDefinitionService} from '../../../../services/workbasket/workbasketDefinition.service'; import {AlertService} from '../../../../services/alert/alert.service'; import {ClassificationService} from '../../../../services/classification/classification.service'; +import {DomainService} from '../../../../services/domains/domain.service'; describe('ClassificationListComponent', () => { let component: ClassificationListComponent; @@ -15,11 +16,13 @@ describe('ClassificationListComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ ClassificationListComponent, ImportExportComponent, SpinnerComponent], + declarations: [ClassificationListComponent, ImportExportComponent, SpinnerComponent], imports: [HttpClientModule], - providers: [WorkbasketService, HttpClient, WorkbasketDefinitionService, AlertService, ClassificationService] + providers: [ + WorkbasketService, HttpClient, WorkbasketDefinitionService, AlertService, ClassificationService, DomainService + ] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { diff --git a/web/src/app/administration/classification/master/list/classification-list.component.ts b/web/src/app/administration/classification/master/list/classification-list.component.ts index b8bd98bbf..7968b0b84 100644 --- a/web/src/app/administration/classification/master/list/classification-list.component.ts +++ b/web/src/app/administration/classification/master/list/classification-list.component.ts @@ -1,4 +1,5 @@ import {Component, OnInit} from '@angular/core'; +import {SelectionToImport} from '../../../enums/SelectionToImport'; @Component({ selector: 'taskana-classification-list', @@ -7,6 +8,7 @@ import {Component, OnInit} from '@angular/core'; }) export class ClassificationListComponent implements OnInit { + selectionToImport = SelectionToImport.CLASSIFICATIONS; requestInProgress = false; constructor() { diff --git a/web/src/app/administration/enums/SelectionToImport.ts b/web/src/app/administration/enums/SelectionToImport.ts new file mode 100644 index 000000000..fa769b5b7 --- /dev/null +++ b/web/src/app/administration/enums/SelectionToImport.ts @@ -0,0 +1,4 @@ +export enum SelectionToImport { + WORKBASKETS, + CLASSIFICATIONS +} diff --git a/web/src/app/administration/import-export/import-export.component.html b/web/src/app/administration/import-export/import-export.component.html index fe8260754..04d673e89 100644 --- a/web/src/app/administration/import-export/import-export.component.html +++ b/web/src/app/administration/import-export/import-export.component.html @@ -1,6 +1,7 @@ + - diff --git a/web/src/app/administration/import-export/import-export.component.scss b/web/src/app/administration/import-export/import-export.component.scss index e69de29bb..aaa3d95c7 100644 --- a/web/src/app/administration/import-export/import-export.component.scss +++ b/web/src/app/administration/import-export/import-export.component.scss @@ -0,0 +1,3 @@ +.hide { + display: none; +} diff --git a/web/src/app/administration/import-export/import-export.component.spec.ts b/web/src/app/administration/import-export/import-export.component.spec.ts index a61c78f8e..2005d24a9 100644 --- a/web/src/app/administration/import-export/import-export.component.spec.ts +++ b/web/src/app/administration/import-export/import-export.component.spec.ts @@ -1,32 +1,47 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; -import { ImportExportComponent } from './import-export.component'; +import {ImportExportComponent} from './import-export.component'; import {WorkbasketService} from '../../services/workbasket/workbasket.service'; import {ClassificationService} from '../../services/classification/classification.service'; import {WorkbasketDefinitionService} from '../../services/workbasket/workbasketDefinition.service'; import {AlertService} from '../../services/alert/alert.service'; -import {HttpClient, HttpClientModule} from '@angular/common/http'; +import {HttpClientModule} from '@angular/common/http'; +import {DomainService} from '../../services/domains/domain.service'; describe('ImportExportComponent', () => { let component: ImportExportComponent; let fixture: ComponentFixture; + let domainService; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ ImportExportComponent], + declarations: [ImportExportComponent], imports: [HttpClientModule], - providers: [WorkbasketService, ClassificationService, WorkbasketDefinitionService, AlertService] + providers: [WorkbasketService, ClassificationService, WorkbasketDefinitionService, AlertService, DomainService] }) - .compileComponents(); + .compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(ImportExportComponent); component = fixture.componentInstance; + domainService = TestBed.get(DomainService); fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + // TODO add tests for inport/export + /* + it('should update domains', () => { + let domains = []; + domainService.getDomains().subscribe( + result => domains = result + ); + component.updateDomains(); + expect(component.domains).toEqual(domains); + }) + */ }); diff --git a/web/src/app/administration/import-export/import-export.component.ts b/web/src/app/administration/import-export/import-export.component.ts index 3c85ff29b..fdf98feca 100644 --- a/web/src/app/administration/import-export/import-export.component.ts +++ b/web/src/app/administration/import-export/import-export.component.ts @@ -1,9 +1,8 @@ import {Component, Input, OnInit} from '@angular/core'; -import {HttpClient} from '@angular/common/http'; -import {ActivatedRoute, Router} from '@angular/router'; -import {WorkbasketService} from '../../services/workbasket/workbasket.service'; -import {ClassificationService} from '../../services/classification/classification.service'; -import {WorkbasketDefinitionService} from '../../services/workbasket/workbasketDefinition.service'; +import {ClassificationService} from 'app/services/classification/classification.service'; +import {WorkbasketDefinitionService} from 'app/services/workbasket/workbasketDefinition.service'; +import {DomainService} from '../../services/domains/domain.service'; +import {SelectionToImport} from '../enums/SelectionToImport'; @Component({ selector: 'taskana-import-export-component', @@ -12,11 +11,10 @@ import {WorkbasketDefinitionService} from '../../services/workbasket/workbasketD }) export class ImportExportComponent implements OnInit { - @Input() currentSelection: string; - workbasketDomains: string[]; - classificationDomains: string[]; + @Input() currentSelection: SelectionToImport; + domains: string[] = []; - constructor(private workbasketService: WorkbasketService, private workbasketDefinitionService: WorkbasketDefinitionService, + constructor(private domainService: DomainService, private workbasketDefinitionService: WorkbasketDefinitionService, private classificationService: ClassificationService) { } @@ -24,18 +22,15 @@ export class ImportExportComponent implements OnInit { } updateDomains() { - this.workbasketService.getWorkbasketDomains().subscribe( - data => this.workbasketDomains = data - ); - this.classificationService.getClassificationDomains().subscribe( - data => this.classificationDomains = data + this.domainService.getDomains().subscribe( + data => this.domains = data ); } onSelectFile(event) { const file = event.srcElement.files[0]; const reader = new FileReader(); - if (this.currentSelection === 'workbaskets') { + if (this.currentSelection === SelectionToImport.WORKBASKETS) { reader.onload = (e) => this.workbasketDefinitionService.importWorkbasketDefinitions(e.target.result); } else { reader.onload = (e) => this.classificationService.importClassifications(e.target.result); @@ -43,19 +38,11 @@ export class ImportExportComponent implements OnInit { reader.readAsText(file); } - exportAll() { - if (this.currentSelection === 'workbaskets') { - this.workbasketDefinitionService.exportAllWorkbaskets(); + export(domain = '') { + if (this.currentSelection === SelectionToImport.WORKBASKETS) { + this.workbasketDefinitionService.exportWorkbaskets(domain); } else { - this.classificationService.exportAllClassifications(); - } - } - - exportByDomain(domain: string) { - if (this.currentSelection === 'workbaskets') { - this.workbasketDefinitionService.exportWorkbasketsByDomain(domain); - } else { - this.classificationService.exportClassificationsByDomain(domain); + this.classificationService.exportClassifications(domain); } } } diff --git a/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.html b/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.html index b009aad09..4d8027875 100644 --- a/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.html +++ b/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.html @@ -1,6 +1,7 @@
  • + diff --git a/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.spec.ts b/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.spec.ts index 7fa2eb07f..9fe9ae6e2 100644 --- a/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.spec.ts +++ b/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.spec.ts @@ -28,6 +28,7 @@ import { AlertService } from 'app/services/alert/alert.service'; import {ImportExportComponent} from '../../../../import-export/import-export.component'; import {ClassificationService} from '../../../../../services/classification/classification.service'; import {WorkbasketDefinitionService} from '../../../../../services/workbasket/workbasketDefinition.service'; +import {DomainService} from '../../../../../services/domains/domain.service'; @Component({ selector: 'taskana-dummy-detail', @@ -53,7 +54,7 @@ describe('WorkbasketListToolbarComponent', () => { declarations: [WorkbasketListToolbarComponent, SortComponent, FilterComponent, IconTypeComponent, DummyDetailComponent, MapValuesPipe, ImportExportComponent], providers: [ErrorModalService, WorkbasketService, RequestInProgressService, AlertService, - ClassificationService, WorkbasketDefinitionService] + ClassificationService, WorkbasketDefinitionService, DomainService] }) .compileComponents(); })); diff --git a/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.ts b/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.ts index 166480ba5..ba635ebc1 100644 --- a/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.ts +++ b/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.ts @@ -2,17 +2,18 @@ import { Component, OnInit, Input, Output, EventEmitter, AfterViewChecked } from import { trigger, state, style, transition, animate, keyframes } from '@angular/animations'; import { Router, ActivatedRoute } from '@angular/router'; -import { SortingModel } from 'app/models/sorting'; -import { FilterModel } from 'app/models/filter'; -import { Subscription } from 'rxjs/Subscription'; -import { WorkbasketSummary } from 'app/models/workbasket-summary'; -import { ErrorModel } from 'app/models/modal-error'; -import { AlertModel, AlertType } from 'app/models/alert'; +import {SortingModel} from 'app/models/sorting'; +import {FilterModel} from 'app/models/filter'; +import {Subscription} from 'rxjs/Subscription'; +import {WorkbasketSummary} from 'app/models/workbasket-summary'; +import {ErrorModel} from 'app/models/modal-error'; +import {AlertModel, AlertType} from 'app/models/alert'; -import { ErrorModalService } from 'app/services/errorModal/error-modal.service'; -import { RequestInProgressService } from 'app/services/requestInProgress/request-in-progress.service'; -import { WorkbasketService } from 'app/services/workbasket/workbasket.service'; -import { AlertService } from 'app/services/alert/alert.service'; +import {ErrorModalService} from 'app/services/errorModal/error-modal.service'; +import {RequestInProgressService} from 'app/services/requestInProgress/request-in-progress.service'; +import {WorkbasketService} from 'app/services/workbasket/workbasket.service'; +import {AlertService} from 'app/services/alert/alert.service'; +import {SelectionToImport} from '../../../../enums/SelectionToImport'; @Component({ selector: 'taskana-workbasket-list-toolbar', @@ -42,6 +43,7 @@ export class WorkbasketListToolbarComponent implements OnInit { @Output() performSorting = new EventEmitter(); @Output() performFilter = new EventEmitter(); workbasketServiceSubscription: Subscription; + selectionToImport = SelectionToImport.WORKBASKETS; toolbarState = false; constructor( diff --git a/web/src/app/administration/workbasket/master/list/workbasket-list.component.spec.ts b/web/src/app/administration/workbasket/master/list/workbasket-list.component.spec.ts index 1cc0635a2..1b04f624d 100644 --- a/web/src/app/administration/workbasket/master/list/workbasket-list.component.spec.ts +++ b/web/src/app/administration/workbasket/master/list/workbasket-list.component.spec.ts @@ -5,11 +5,10 @@ import { Observable } from 'rxjs/Observable'; import { AngularSvgIconModule } from 'angular-svg-icon'; import { HttpClientModule } from '@angular/common/http'; import { HttpModule } from '@angular/http'; -import { Router, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; import { WorkbasketSummary } from 'app/models/workbasket-summary'; -import { Links } from 'app/models/links'; import { WorkbasketSummaryResource } from 'app/models/workbasket-summary-resource'; import { FilterModel } from 'app/models/filter'; import { LinksWorkbasketSummary } from 'app/models/links-workbasket-summary'; @@ -31,6 +30,7 @@ import { RemoveNoneTypePipe } from 'app/pipes/removeNoneType/remove-none-type.pi import { MapValuesPipe } from 'app/pipes/mapValues/map-values.pipe'; import { ClassificationService } from '../../../../services/classification/classification.service'; import { WorkbasketDefinitionService } from '../../../../services/workbasket/workbasketDefinition.service'; +import { DomainService } from '../../../../services/domains/domain.service'; @Component({ selector: 'taskana-dummy-detail', @@ -91,7 +91,7 @@ describe('WorkbasketListComponent', () => { RouterTestingModule.withRoutes(routes) ], providers: [WorkbasketService, ErrorModalService, RequestInProgressService, AlertService, - ClassificationService, WorkbasketDefinitionService, OrientationService] + ClassificationService, WorkbasketDefinitionService, OrientationService, DomainService] }) .compileComponents(); diff --git a/web/src/app/app.component.spec.ts b/web/src/app/app.component.spec.ts index 3927e1e6d..5bf59243f 100644 --- a/web/src/app/app.component.spec.ts +++ b/web/src/app/app.component.spec.ts @@ -1,4 +1,4 @@ -import { TestBed, async, inject, tick, fakeAsync } from '@angular/core/testing'; +import { async, inject, TestBed } from '@angular/core/testing'; import { Router, Routes } from '@angular/router'; import { AppComponent } from './app.component'; import { AngularSvgIconModule } from 'angular-svg-icon'; diff --git a/web/src/app/app.module.ts b/web/src/app/app.module.ts index c799bfa0f..345ce920a 100644 --- a/web/src/app/app.module.ts +++ b/web/src/app/app.module.ts @@ -2,127 +2,125 @@ /** * Modules */ -import { BrowserModule } from '@angular/platform-browser'; -import { NgModule, } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { HttpClientModule } from '@angular/common/http'; -import { AppRoutingModule } from './app-routing.module'; -import { AlertModule } from 'ngx-bootstrap'; -import { AngularSvgIconModule } from 'angular-svg-icon'; -import { TabsModule } from 'ngx-bootstrap/tabs'; -import { TreeModule } from 'angular-tree-component'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; - +import {BrowserModule} from '@angular/platform-browser'; +import {NgModule} from '@angular/core'; +import {FormsModule, ReactiveFormsModule} from '@angular/forms'; +import {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http'; +import {AppRoutingModule} from './app-routing.module'; +import {AlertModule} from 'ngx-bootstrap'; +import {AngularSvgIconModule} from 'angular-svg-icon'; +import {TabsModule} from 'ngx-bootstrap/tabs'; +import {TreeModule} from 'angular-tree-component'; +import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; /** * Components */ -import { AppComponent } from './app.component'; -import { WorkbasketListComponent } from './administration/workbasket/master/list/workbasket-list.component'; -import { WorkbasketListToolbarComponent } from './administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component' -import { WorkbasketDetailsComponent } from './administration/workbasket/details/workbasket-details.component'; -import { WorkbasketInformationComponent } from './administration/workbasket/details/information/workbasket-information.component'; -import { DistributionTargetsComponent } from './administration/workbasket/details/distribution-targets/distribution-targets.component'; -import { DualListComponent } from './administration/workbasket/details/distribution-targets/dual-list/dual-list.component'; -import { AccessItemsComponent } from './administration/workbasket/details/access-items/access-items.component'; -import { NoAccessComponent } from './administration/workbasket/details/noAccess/no-access.component'; -import { SpinnerComponent } from './shared/spinner/spinner.component'; -import { FilterComponent } from './shared/filter/filter.component'; -import { IconTypeComponent } from './shared/type-icon/icon-type.component'; -import { AlertComponent } from './shared/alert/alert.component'; -import { SortComponent } from './shared/sort/sort.component'; -import { GeneralMessageModalComponent } from './shared/general-message-modal/general-message-modal.component'; -import { PaginationComponent } from './administration/workbasket/master/list/pagination/pagination.component'; -import { ClassificationListComponent } from './administration/classification/master/list/classification-list.component'; -import { ImportExportComponent } from './administration/import-export/import-export.component'; - +import {AppComponent} from './app.component'; +import {WorkbasketListComponent} from './administration/workbasket/master/list/workbasket-list.component'; +import {WorkbasketListToolbarComponent} from './administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component' +import {WorkbasketDetailsComponent} from './administration/workbasket/details/workbasket-details.component'; +import {WorkbasketInformationComponent} from './administration/workbasket/details/information/workbasket-information.component'; +import {DistributionTargetsComponent} from './administration/workbasket/details/distribution-targets/distribution-targets.component'; +import {DualListComponent} from './administration/workbasket/details/distribution-targets/dual-list/dual-list.component'; +import {AccessItemsComponent} from './administration/workbasket/details/access-items/access-items.component'; +import {NoAccessComponent} from './administration/workbasket/details/noAccess/no-access.component'; +import {SpinnerComponent} from './shared/spinner/spinner.component'; +import {FilterComponent} from './shared/filter/filter.component'; +import {IconTypeComponent} from './shared/type-icon/icon-type.component'; +import {AlertComponent} from './shared/alert/alert.component'; +import {SortComponent} from './shared/sort/sort.component'; +import {GeneralMessageModalComponent} from './shared/general-message-modal/general-message-modal.component'; +import {PaginationComponent} from './administration/workbasket/master/list/pagination/pagination.component'; +import {ClassificationListComponent} from './administration/classification/master/list/classification-list.component'; +import {ImportExportComponent} from './administration/import-export/import-export.component'; // Shared -import { MasterAndDetailComponent } from './shared/masterAndDetail/master-and-detail.component'; - +import {MasterAndDetailComponent} from './shared/masterAndDetail/master-and-detail.component'; /** * Services */ -import { WorkbasketService } from './services/workbasket/workbasket.service'; -import { MasterAndDetailService } from './services/masterAndDetail/master-and-detail.service'; -import { HttpClientInterceptor } from './services/httpClientInterceptor/http-client-interceptor.service'; -import { PermissionService } from './services/permission/permission.service'; -import { HTTP_INTERCEPTORS } from '@angular/common/http'; -import { AlertService } from './services/alert/alert.service'; -import { ErrorModalService } from './services/errorModal/error-modal.service'; -import { RequestInProgressService } from './services/requestInProgress/request-in-progress.service'; -import { SavingWorkbasketService } from './services/saving-workbaskets/saving-workbaskets.service'; -import { OrientationService } from './services/orientation/orientation.service'; -import { ClassificationService } from './services/classification/classification.service'; -import { WorkbasketDefinitionService } from './services/workbasket/workbasketDefinition.service'; - +import {WorkbasketService} from './services/workbasket/workbasket.service'; +import {MasterAndDetailService} from './services/masterAndDetail/master-and-detail.service'; +import {HttpClientInterceptor} from './services/httpClientInterceptor/http-client-interceptor.service'; +import {PermissionService} from './services/permission/permission.service'; +import {AlertService} from './services/alert/alert.service'; +import {ErrorModalService} from './services/errorModal/error-modal.service'; +import {RequestInProgressService} from './services/requestInProgress/request-in-progress.service'; +import {SavingWorkbasketService} from './services/saving-workbaskets/saving-workbaskets.service'; +import {OrientationService} from './services/orientation/orientation.service'; +import {ClassificationService} from './services/classification/classification.service'; +import {WorkbasketDefinitionService} from './services/workbasket/workbasketDefinition.service'; /** * Pipes */ -import { MapValuesPipe } from './pipes/mapValues/map-values.pipe'; -import { RemoveNoneTypePipe } from './pipes/removeNoneType/remove-none-type.pipe'; -import { SelectWorkBasketPipe } from './pipes/selectedWorkbasket/seleted-workbasket.pipe'; -import { SpreadNumberPipe } from './pipes/spreadNumber/spread-number'; +import {MapValuesPipe} from './pipes/mapValues/map-values.pipe'; +import {RemoveNoneTypePipe} from './pipes/removeNoneType/remove-none-type.pipe'; +import {SelectWorkBasketPipe} from './pipes/selectedWorkbasket/seleted-workbasket.pipe'; +import {SpreadNumberPipe} from './pipes/spreadNumber/spread-number'; +import {DomainService} from './services/domains/domain.service'; const MODULES = [ - BrowserModule, - FormsModule, - TabsModule.forRoot(), - TreeModule, - AppRoutingModule, - AlertModule.forRoot(), - AngularSvgIconModule, - HttpClientModule, - BrowserAnimationsModule, - ReactiveFormsModule + BrowserModule, + FormsModule, + TabsModule.forRoot(), + TreeModule, + AppRoutingModule, + AlertModule.forRoot(), + AngularSvgIconModule, + HttpClientModule, + BrowserAnimationsModule, + ReactiveFormsModule ]; const DECLARATIONS = [ - AppComponent, - WorkbasketListComponent, - WorkbasketListToolbarComponent, - AccessItemsComponent, - WorkbasketDetailsComponent, - MasterAndDetailComponent, - WorkbasketInformationComponent, - NoAccessComponent, - SpinnerComponent, - FilterComponent, - IconTypeComponent, - AlertComponent, - GeneralMessageModalComponent, - DistributionTargetsComponent, - SortComponent, - DualListComponent, - PaginationComponent, - ClassificationListComponent, - ImportExportComponent, - MapValuesPipe, - RemoveNoneTypePipe, - SelectWorkBasketPipe, - SpreadNumberPipe + AppComponent, + WorkbasketListComponent, + WorkbasketListToolbarComponent, + AccessItemsComponent, + WorkbasketDetailsComponent, + MasterAndDetailComponent, + WorkbasketInformationComponent, + NoAccessComponent, + SpinnerComponent, + FilterComponent, + IconTypeComponent, + AlertComponent, + GeneralMessageModalComponent, + DistributionTargetsComponent, + SortComponent, + DualListComponent, + PaginationComponent, + ClassificationListComponent, + ImportExportComponent, + MapValuesPipe, + RemoveNoneTypePipe, + SelectWorkBasketPipe, + SpreadNumberPipe ]; @NgModule({ - declarations: DECLARATIONS, - imports: MODULES, - providers: [ - WorkbasketService, - MasterAndDetailService, - PermissionService, - ClassificationService, - WorkbasketDefinitionService, - { - provide: HTTP_INTERCEPTORS, - useClass: HttpClientInterceptor, - multi: true - }, - AlertService, - ErrorModalService, - RequestInProgressService, - SavingWorkbasketService, - OrientationService - ], - bootstrap: [AppComponent] + declarations: DECLARATIONS, + imports: MODULES, + providers: [ + WorkbasketService, + MasterAndDetailService, + PermissionService, + ClassificationService, + WorkbasketDefinitionService, + DomainService, + { + provide: HTTP_INTERCEPTORS, + useClass: HttpClientInterceptor, + multi: true + }, + AlertService, + ErrorModalService, + RequestInProgressService, + SavingWorkbasketService, + OrientationService + ], + bootstrap: [AppComponent] }) -export class AppModule { } +export class AppModule { +} // tslint:enable:max-line-length diff --git a/web/src/app/services/classification/classification.service.ts b/web/src/app/services/classification/classification.service.ts index a3f2a9ce3..95b65e911 100644 --- a/web/src/app/services/classification/classification.service.ts +++ b/web/src/app/services/classification/classification.service.ts @@ -1,16 +1,17 @@ import {Injectable} from '@angular/core'; import {HttpClient, HttpHeaders} from '@angular/common/http'; -import {Observable} from 'rxjs/Observable'; import {environment} from '../../../environments/environment'; -import {DatePipe} from '@angular/common'; import {AlertService} from '../alert/alert.service'; import {Classification} from '../../models/classification'; import {AlertModel, AlertType} from '../../models/alert'; import {saveAs} from 'file-saver/FileSaver'; +import {TaskanaDate} from '../../shared/util/taskana.date'; @Injectable() export class ClassificationService { + url = environment.taskanaRestUrl + '/v1/classificationdefinitions'; + httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', @@ -22,42 +23,22 @@ export class ClassificationService { } // GET - getClassificationDomains(): Observable { - return this.httpClient.get(environment.taskanaRestUrl + '/v1/classifications/domains', this.httpOptions); - } - - // GET - exportAllClassifications() { - this.httpClient.get(environment.taskanaRestUrl + '/v1/classificationdefinitions', this.httpOptions) + exportClassifications(domain: string) { + domain = (domain === '' ? '' : '?domain=' + domain); + this.httpClient.get(this.url + domain, this.httpOptions) .subscribe( - response => saveAs(new Blob([JSON.stringify(response)], {type: 'text/plain;charset=utf-8'}), this.generateName()) - ); - } - - // GET - exportClassificationsByDomain(domain: string) { - this.httpClient.get(environment.taskanaRestUrl + '/v1/classificationdefinitions?domain=' + domain, this.httpOptions) - .subscribe( - response => saveAs(new Blob([JSON.stringify(response)], {type: 'text/plain;charset=utf-8'}), this.generateName(domain)) + response => saveAs(new Blob([JSON.stringify(response)], {type: 'text/plain;charset=utf-8'}), + 'Classifications_' + TaskanaDate.getDate() + '.json') ); } // POST // TODO handle error importClassifications(classifications: any) { - console.log('importing classifications'); - this.httpClient.post(environment.taskanaRestUrl + '/v1/classificationdefinitions/import', + this.httpClient.post(this.url + '/import', JSON.parse(classifications), this.httpOptions).subscribe( classificationsUpdated => this.alertService.triggerAlert(new AlertModel(AlertType.SUCCESS, 'Import was successful')), error => this.alertService.triggerAlert(new AlertModel(AlertType.DANGER, 'Import was not successful')) ); } - - private generateName(domain = ''): string { - const dateFormat = 'yyyy-MM-ddTHH:mm:ss'; - const dateLocale = 'en-US'; - const datePipe = new DatePipe(dateLocale); - const date = datePipe.transform(Date.now(), dateFormat) + 'Z'; - return 'Classifications_' + date + '.json'; - } } diff --git a/web/src/app/services/domains/domain.service.ts b/web/src/app/services/domains/domain.service.ts new file mode 100644 index 000000000..4f570779d --- /dev/null +++ b/web/src/app/services/domains/domain.service.ts @@ -0,0 +1,26 @@ +import {Injectable} from '@angular/core'; +import {HttpClient, HttpHeaders} from '@angular/common/http'; +import {Observable} from 'rxjs/Observable'; +import {environment} from '../../../environments/environment'; + +@Injectable() +export class DomainService { + + url = environment.taskanaRestUrl + '/v1/domains'; + + httpOptions = { + headers: new HttpHeaders({ + 'Content-Type': 'application/json', + 'Authorization': 'Basic VEVBTUxFQURfMTpURUFNTEVBRF8x' + }) + }; + + constructor(private httpClient: HttpClient) { + } + + // TODO how to enable hateoas support? + // GET + getDomains(): Observable { + return this.httpClient.get(this.url, this.httpOptions); + } +} diff --git a/web/src/app/services/workbasket/workbasket.service.ts b/web/src/app/services/workbasket/workbasket.service.ts index 4eff508ca..9ff06dc3c 100644 --- a/web/src/app/services/workbasket/workbasket.service.ts +++ b/web/src/app/services/workbasket/workbasket.service.ts @@ -1,17 +1,14 @@ -import { Injectable } from '@angular/core'; -import { HttpClientModule, HttpClient, HttpHeaders, HttpResponse, HttpErrorResponse } from '@angular/common/http'; -import { Observable } from 'rxjs/Observable'; -import { Subject } from 'rxjs/Subject'; -import { map } from 'rxjs/operator/map'; -import { environment } from 'app/../environments/environment'; - -import { WorkbasketSummary } from 'app//models/workbasket-summary'; -import { Workbasket } from 'app/models/workbasket'; -import { WorkbasketAccessItems } from 'app/models/workbasket-access-items'; -import { WorkbasketSummaryResource } from 'app/models/workbasket-summary-resource'; -import { WorkbasketAccessItemsResource } from 'app/models/workbasket-access-items-resource'; -import { WorkbasketDistributionTargetsResource } from 'app/models/workbasket-distribution-targets-resource'; -import { Direction } from 'app/models/sorting'; +import {Injectable} from '@angular/core'; +import {HttpClient, HttpHeaders} from '@angular/common/http'; +import {Observable} from 'rxjs/Observable'; +import {Subject} from 'rxjs/Subject'; +import {environment} from 'app/../environments/environment'; +import {Workbasket} from 'app/models/workbasket'; +import {WorkbasketAccessItems} from 'app/models/workbasket-access-items'; +import {WorkbasketSummaryResource} from 'app/models/workbasket-summary-resource'; +import {WorkbasketAccessItemsResource} from 'app/models/workbasket-access-items-resource'; +import {WorkbasketDistributionTargetsResource} from 'app/models/workbasket-distribution-targets-resource'; +import {Direction} from 'app/models/sorting'; @Injectable() export class WorkbasketService { @@ -123,11 +120,6 @@ export class WorkbasketService { return this.httpClient.put(url, distributionTargetsIds, this.httpOptions); } - // GET - getWorkbasketDomains() { - return this.httpClient.get(environment.taskanaRestUrl + '/v1/workbaskets/domains', this.httpOptions); - } - // #endregion // #region "Service extras" selectWorkBasket(id: string) { diff --git a/web/src/app/services/workbasket/workbasketDefinition.service.ts b/web/src/app/services/workbasket/workbasketDefinition.service.ts index 85be23ea5..16a7070cd 100644 --- a/web/src/app/services/workbasket/workbasketDefinition.service.ts +++ b/web/src/app/services/workbasket/workbasketDefinition.service.ts @@ -2,10 +2,10 @@ import {Injectable} from '@angular/core'; import {HttpClient, HttpHeaders} from '@angular/common/http'; import {environment} from '../../../environments/environment'; import {saveAs} from 'file-saver/FileSaver'; -import {DatePipe} from '@angular/common'; import {AlertService} from '../alert/alert.service'; import {WorkbasketDefinition} from '../../models/workbasket-definition'; import {AlertModel, AlertType} from '../../models/alert'; +import {TaskanaDate} from '../../shared/util/taskana.date'; @Injectable() @@ -24,18 +24,12 @@ export class WorkbasketDefinitionService { } // GET - exportAllWorkbaskets() { - this.httpClient.get(this.url, this.httpOptions).subscribe( - response => saveAs(new Blob([JSON.stringify(response)], {type: 'text/plain;charset=utf-8'}), this.generateName()) - ); - } - - // GET - exportWorkbasketsByDomain(domain: string) { - this.httpClient.get(this.url + '?' + 'domain=' + domain, this.httpOptions).subscribe( + exportWorkbaskets(domain: string) { + domain = (domain === '' ? '' : '?domain=' + domain); + this.httpClient.get(this.url + domain, this.httpOptions).subscribe( response => { - saveAs(new Blob([JSON.stringify(response)], {type: 'text/plain;charset=utf-8'}), this.generateName(domain)); - console.log(response); + saveAs(new Blob([JSON.stringify(response)], {type: 'text/plain;charset=utf-8'}), + 'Workbaskets_' + TaskanaDate.getDate() + '.json'); } ); } @@ -43,20 +37,10 @@ export class WorkbasketDefinitionService { // POST // TODO handle error importWorkbasketDefinitions(workbasketDefinitions: any) { - console.log('importing workbaskets'); this.httpClient.post(environment.taskanaRestUrl + '/v1/workbasketdefinitions/import', JSON.parse(workbasketDefinitions), this.httpOptions).subscribe( workbasketsUpdated => this.alertService.triggerAlert(new AlertModel(AlertType.SUCCESS, 'Import was successful')), error => this.alertService.triggerAlert(new AlertModel(AlertType.DANGER, 'Import was not successful')) ); } - - private generateName(domain = ''): string { - const dateFormat = 'yyyy-MM-ddTHH:mm:ss'; - const dateLocale = 'en-US'; - const datePipe = new DatePipe(dateLocale); - const date = datePipe.transform(Date.now(), dateFormat) + 'Z'; - return 'Workbaskets_' + date + '.json'; - } - } diff --git a/web/src/app/shared/util/taskana.date.ts b/web/src/app/shared/util/taskana.date.ts new file mode 100644 index 000000000..04f65eb76 --- /dev/null +++ b/web/src/app/shared/util/taskana.date.ts @@ -0,0 +1,10 @@ +import {DatePipe} from '@angular/common'; + +export class TaskanaDate { + public static getDate(): string { + const dateFormat = 'yyyy-MM-ddTHH:mm:ss'; + const dateLocale = 'en-US'; + const datePipe = new DatePipe(dateLocale); + return datePipe.transform(Date.now(), dateFormat) + 'Z'; + } +}