diff --git a/web/.angular-cli.json b/web/.angular-cli.json
index 52f0ca8ca..886ad2b27 100644
--- a/web/.angular-cli.json
+++ b/web/.angular-cli.json
@@ -19,9 +19,7 @@
"testTsconfig": "tsconfig.spec.json",
"prefix": "app",
"styles": [
- "../node_modules/bootstrap-sass/assets/stylesheets/_bootstrap.scss",
- "./assets/_site.scss",
- "./assets/_forms.scss"
+ "./assets/_styles.scss"
],
"scripts": [
"../node_modules/jquery/dist/jquery.min.js",
diff --git a/web/package-lock.json b/web/package-lock.json
index 87abc474b..d82e8ecf5 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -571,13 +571,20 @@
"integrity": "sha512-wIRpoQ3PwytxA4MRe9cgmdytXrHgTGUuTdmIFtAQvCcftUSWWkzkVaXF1QSlFip6ipHf/YacdJHFYXpnW2lWPQ=="
},
"angular-tree-component": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/angular-tree-component/-/angular-tree-component-7.0.1.tgz",
- "integrity": "sha1-/I0OctjDS4cTGjuivTKtIJRWiaw=",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/angular-tree-component/-/angular-tree-component-7.1.0.tgz",
+ "integrity": "sha512-i0Kk4gnuU+i6p5ZsIcDcGrtHPnDLOyHk8Vqez6IpSuOLvVPZ3Y7/Y1MEOoj7Nx6qRU5NuuVaPLy2idOEB7ClRw==",
"requires": {
- "lodash": "4.17.4",
- "mobx": "3.4.1",
+ "lodash": "4.17.5",
+ "mobx": "3.6.2",
"mobx-angular": "2.1.1"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
+ }
}
},
"ansi-html": {
@@ -7259,9 +7266,9 @@
}
},
"mobx": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/mobx/-/mobx-3.4.1.tgz",
- "integrity": "sha1-N6vl7ogtQBgo2fJsbBovR2FLu+8="
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/mobx/-/mobx-3.6.2.tgz",
+ "integrity": "sha512-Dq3boJFLpZEvuh5a/MbHLUIyN9XobKWIb0dBfkNOJffNkE3vtuY0C9kSDVpfH8BB0BPkVw8g22qCv7d05LEhKg=="
},
"mobx-angular": {
"version": "2.1.1",
diff --git a/web/package.json b/web/package.json
index 1807b593c..f64a92677 100644
--- a/web/package.json
+++ b/web/package.json
@@ -25,7 +25,7 @@
"@angular/router": "5.2.1",
"file-saver": "1.3.3",
"angular-svg-icon": "5.0.0",
- "angular-tree-component": "7.0.1",
+ "angular-tree-component": "7.1.0",
"bootstrap": "3.3.7",
"bootstrap-sass": "3.3.7",
"core-js": "2.5.3",
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 8bd22802c..1b0568e85 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
@@ -1,40 +1,20 @@
-
-
-
+
\ No newline at end of file
diff --git a/web/src/app/administration/classification/master/list/classification-list.component.scss b/web/src/app/administration/classification/master/list/classification-list.component.scss
index 661be407c..34a43965c 100644
--- a/web/src/app/administration/classification/master/list/classification-list.component.scss
+++ b/web/src/app/administration/classification/master/list/classification-list.component.scss
@@ -2,21 +2,15 @@
height: calc(100vh - 55px);
}
-.row.list-group {
- margin-left: 2px;
+.list-group-item {
+ padding: 5px 0px;
+ border: none;
}
-.list-group > li {
- border-left: none;
- border-right: none;
-}
+.tab-align{
+ margin-bottom: 0px;
-a > label {
- height: 2em;
- width: 100%;
-}
-
-.tab-align {
- border-bottom: 1px solid #ddd;
- padding-bottom: 12px;
+ &>div{
+ margin: 6px 0px;
+ }
}
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 e324ebdcc..2bf053a86 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,25 +1,46 @@
-import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import { Component, Input } from '@angular/core';
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { HttpClient, HttpClientModule } from '@angular/common/http';
+import { Observable } from 'rxjs/Observable';
-import {ClassificationListComponent} from './classification-list.component';
-import {ImportExportComponent} from 'app/shared/import-export/import-export.component';
-import {SpinnerComponent} from 'app/shared/spinner/spinner.component';
-import {WorkbasketService} from 'app/services/workbasket/workbasket.service';
-import {HttpClient, HttpClientModule} from '@angular/common/http';
-import {WorkbasketDefinitionService} from 'app/services/workbasket/workbasketDefinition.service';
-import {AlertService} from 'app/services/alert/alert.service';
-import {ClassificationService} from 'app/services/classification/classification.service';
-import {DomainService} from 'app/services/domains/domain.service';
+import { TreeNode } from 'app/models/tree-node';
+
+import { ClassificationListComponent } from './classification-list.component';
+import { ImportExportComponent } from 'app/shared/import-export/import-export.component';
+import { SpinnerComponent } from 'app/shared/spinner/spinner.component';
+import { ClassificationTypesSelectorComponent } from 'app/shared/classification-types-selector/classification-types-selector.component';
+import { MapValuesPipe } from 'app/pipes/mapValues/map-values.pipe';
+
+import { WorkbasketService } from 'app/services/workbasket/workbasket.service';
+import { WorkbasketDefinitionService } from 'app/services/workbasket-definition/workbasket-definition.service';
+import { AlertService } from 'app/services/alert/alert.service';
+import { ClassificationsService } from 'app/services/classifications/classifications.service';
+import { ClassificationDefinitionService } from 'app/services/classification-definition/classification-definition.service';
+import { DomainService } from 'app/services/domains/domain.service';
+
+@Component({
+ selector: 'taskana-tree',
+ template: ''
+})
+class TreeComponent {
+ @Input() treeNodes;
+}
describe('ClassificationListComponent', () => {
let component: ClassificationListComponent;
let fixture: ComponentFixture;
+ const treeNodes: Array = new Array(new TreeNode());
+ const classificationTypes: Map = new Map([['type1', 'type1'], ['type2', 'type2']])
+ let classificationsSpy, classificationsTypesSpy;
+ let classificationsService;
beforeEach(async(() => {
TestBed.configureTestingModule({
- declarations: [ClassificationListComponent, ImportExportComponent, SpinnerComponent],
+ declarations: [ClassificationListComponent, ImportExportComponent, SpinnerComponent, ClassificationTypesSelectorComponent,
+ TreeComponent, MapValuesPipe],
imports: [HttpClientModule],
providers: [
- WorkbasketService, HttpClient, WorkbasketDefinitionService, AlertService, ClassificationService, DomainService
+ HttpClient, WorkbasketDefinitionService, AlertService, ClassificationsService, DomainService, ClassificationDefinitionService
]
})
.compileComponents();
@@ -28,6 +49,9 @@ describe('ClassificationListComponent', () => {
beforeEach(() => {
fixture = TestBed.createComponent(ClassificationListComponent);
component = fixture.componentInstance;
+ classificationsService = TestBed.get(ClassificationsService);
+ classificationsSpy = spyOn(classificationsService, 'getClassifications').and.returnValue(Observable.of(treeNodes));
+ classificationsTypesSpy = spyOn(classificationsService, 'getClassificationTypes').and.returnValue(Observable.of(classificationTypes));
fixture.detectChanges();
});
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 56df57762..c765f40d3 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,19 +1,55 @@
-import { Component, OnInit } from '@angular/core';
+import { Component, OnInit, OnDestroy } from '@angular/core';
+import { Subscription } from 'rxjs/Subscription';
+
import { ImportType } from 'app/models/import-type';
+import { Classification } from 'app/models/classification';
+import { TreeNode } from 'app/models/tree-node';
+
+import { ClassificationsService } from 'app/services/classifications/classifications.service';
@Component({
- selector: 'taskana-classification-list',
- templateUrl: './classification-list.component.html',
- styleUrls: ['./classification-list.component.scss']
+ selector: 'taskana-classification-list',
+ templateUrl: './classification-list.component.html',
+ styleUrls: ['./classification-list.component.scss']
})
-export class ClassificationListComponent implements OnInit {
+export class ClassificationListComponent implements OnInit, OnDestroy {
- selectionToImport = ImportType.CLASSIFICATIONS;
- requestInProgress = false;
- constructor() {
- }
+ selectionToImport = ImportType.CLASSIFICATIONS;
+ requestInProgress = false;
- ngOnInit() {
- }
+ classifications: Array = [];
+ classificationsTypes: Map = new Map();
+ classificationTypeSelected: string;
+ classificationServiceSubscription: Subscription;
+ classificationTypeServiceSubscription: Subscription;
+ constructor(private classificationService: ClassificationsService) {
+ }
+
+ ngOnInit() {
+ this.classificationServiceSubscription = this.classificationService.getClassifications()
+ .subscribe((classifications: Array) => {
+ this.classifications = classifications;
+ this.classificationTypeServiceSubscription = this.classificationService.getClassificationTypes()
+ .subscribe((classificationsTypes: Map) => {
+ this.classificationsTypes = classificationsTypes;
+ this.classificationTypeSelected = this.classifications[0].type;
+ });
+ });
+ }
+
+ selectClassificationType(classificationTypeSelected: string) {
+ this.classificationService.getClassifications(true, classificationTypeSelected)
+ .subscribe((classifications: Array) => {
+ this.classifications = classifications;
+ });
+ }
+
+ addClassification() { }
+ removeClassification() { }
+
+ ngOnDestroy(): void {
+ if (this.classificationServiceSubscription) { this.classificationServiceSubscription.unsubscribe(); }
+ if (this.classificationTypeServiceSubscription) { this.classificationTypeServiceSubscription.unsubscribe(); }
+ }
}
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 60426ac54..d43dd5bf6 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
@@ -7,9 +7,6 @@
-
diff --git a/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.scss b/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.scss
index 96c05108f..4e1feae22 100644
--- a/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.scss
+++ b/web/src/app/administration/workbasket/master/list/workbasket-list-toolbar/workbasket-list-toolbar.component.scss
@@ -1,11 +1,11 @@
.list-group-item {
- padding: 0px 15px;
+ padding: 5px 0px;
border: none;
}
.tab-align{
margin-bottom: 0px;
- padding: 0px;
+
&>div{
margin: 6px 0px;
}
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 df5df8523..662001f6d 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
@@ -26,8 +26,8 @@ import { ErrorModalService } from 'app/services/errorModal/error-modal.service';
import { WorkbasketService } from 'app/services/workbasket/workbasket.service';
import { RequestInProgressService } from 'app/services/requestInProgress/request-in-progress.service';
import { AlertService } from 'app/services/alert/alert.service';
-import { ClassificationService } from 'app/services/classification/classification.service';
-import { WorkbasketDefinitionService } from 'app/services/workbasket/workbasketDefinition.service';
+import { ClassificationDefinitionService } from 'app/services/classification-definition/classification-definition.service';
+import { WorkbasketDefinitionService } from 'app/services/workbasket-definition/workbasket-definition.service';
import { DomainService } from 'app/services/domains/domain.service';
@Component({
@@ -54,7 +54,7 @@ describe('WorkbasketListToolbarComponent', () => {
declarations: [WorkbasketListToolbarComponent, SortComponent,
FilterComponent, IconTypeComponent, DummyDetailComponent, MapValuesPipe, ImportExportComponent],
providers: [ErrorModalService, WorkbasketService, RequestInProgressService, AlertService,
- ClassificationService, WorkbasketDefinitionService, DomainService]
+ ClassificationDefinitionService, WorkbasketDefinitionService, DomainService]
})
.compileComponents();
}));
diff --git a/web/src/app/administration/workbasket/master/list/workbasket-list.component.html b/web/src/app/administration/workbasket/master/list/workbasket-list.component.html
index 6508c5748..07fdce0e1 100644
--- a/web/src/app/administration/workbasket/master/list/workbasket-list.component.html
+++ b/web/src/app/administration/workbasket/master/list/workbasket-list.component.html
@@ -7,7 +7,7 @@
- -
+
-
- div.row > dl:first-child {
margin-left: 10px;
}
-.no-border {
+.no-space {
border-top: none;
+ padding: 0px
}
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 ae610a551..7afa13772 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
@@ -28,8 +28,8 @@ import { ImportExportComponent } from 'app/shared/import-export/import-export.co
import { RemoveNoneTypePipe } from 'app/pipes/removeNoneType/remove-none-type.pipe';
import { MapValuesPipe } from 'app/pipes/mapValues/map-values.pipe';
-import { WorkbasketDefinitionService } from 'app/services/workbasket/workbasketDefinition.service';
-import { ClassificationService } from 'app/services/classification/classification.service';
+import { WorkbasketDefinitionService } from 'app/services/workbasket-definition/workbasket-definition.service';
+import { ClassificationDefinitionService } from 'app/services/classification-definition/classification-definition.service';
import { DomainService } from 'app/services/domains/domain.service';
@Component({
@@ -91,7 +91,7 @@ describe('WorkbasketListComponent', () => {
RouterTestingModule.withRoutes(routes)
],
providers: [WorkbasketService, ErrorModalService, RequestInProgressService, AlertService,
- WorkbasketDefinitionService, OrientationService, DomainService, ClassificationService]
+ WorkbasketDefinitionService, OrientationService, DomainService, ClassificationDefinitionService]
})
.compileComponents();
diff --git a/web/src/app/app-routing.module.ts b/web/src/app/app-routing.module.ts
index 28540b78c..c3145a76a 100644
--- a/web/src/app/app-routing.module.ts
+++ b/web/src/app/app-routing.module.ts
@@ -3,13 +3,13 @@ import { RouterModule, Routes } from '@angular/router';
import { AppComponent } from './app.component';
import { WorkbasketListComponent } from './administration/workbasket/master/list/workbasket-list.component';
import { WorkbasketDetailsComponent } from './administration/workbasket/details/workbasket-details.component';
-import { MasterAndDetailComponent } from './shared/masterAndDetail/master-and-detail.component';
+import { MasterAndDetailComponent } from './shared/master-and-detail/master-and-detail.component';
import { NoAccessComponent } from './administration/workbasket/details/noAccess/no-access.component';
import {ClassificationListComponent} from './administration/classification/master/list/classification-list.component';
const appRoutes: Routes = [
{
- path: 'workbaskets',
+ path: 'administration/workbaskets',
component: MasterAndDetailComponent,
children: [
{
@@ -30,7 +30,7 @@ const appRoutes: Routes = [
]
},
{
- path: 'classifications',
+ path: 'administration/classifications',
component: MasterAndDetailComponent,
children: [
{
@@ -42,7 +42,7 @@ const appRoutes: Routes = [
},
{
path: '',
- redirectTo: 'workbaskets',
+ redirectTo: 'administration/workbaskets',
pathMatch: 'full'
}
];
diff --git a/web/src/app/app.component.html b/web/src/app/app.component.html
index bfdaf9b59..f43517e59 100644
--- a/web/src/app/app.component.html
+++ b/web/src/app/app.component.html
@@ -12,10 +12,10 @@
diff --git a/web/src/app/app.component.spec.ts b/web/src/app/app.component.spec.ts
index 5bf59243f..52532b714 100644
--- a/web/src/app/app.component.spec.ts
+++ b/web/src/app/app.component.spec.ts
@@ -9,6 +9,7 @@ import { ErrorModalService } from './services/errorModal/error-modal.service';
import { RequestInProgressService } from './services/requestInProgress/request-in-progress.service';
import { AlertService } from './services/alert/alert.service';
import { OrientationService } from './services/orientation/orientation.service';
+import { SelectedRouteService } from './services/selected-route/selected-route';
import { GeneralMessageModalComponent } from './shared/general-message-modal/general-message-modal.component'
import { SpinnerComponent } from './shared/spinner/spinner.component'
@@ -20,7 +21,7 @@ describe('AppComponent', () => {
let app, fixture, debugElement;
const routes: Routes = [
- { path: 'categories', component: AppComponent }
+ { path: 'classifications', component: AppComponent }
];
beforeEach(async(() => {
@@ -33,7 +34,7 @@ describe('AppComponent', () => {
RouterTestingModule.withRoutes(routes),
HttpClientModule
],
- providers: [ErrorModalService, RequestInProgressService, AlertService, OrientationService]
+ providers: [ErrorModalService, RequestInProgressService, AlertService, OrientationService, SelectedRouteService]
}).compileComponents();
fixture = TestBed.createComponent(AppComponent);
@@ -59,11 +60,11 @@ describe('AppComponent', () => {
expect(debugElement.querySelector('ul p a').textContent).toContain('Taskana administration');
}));
- it('should call Router.navigateByUrl("categories") and workbasketRoute should be false', (inject([Router], (router: Router) => {
+ it('should call Router.navigateByUrl("classifications") and workbasketRoute should be false', (inject([Router], (router: Router) => {
expect(app.workbasketsRoute).toBe(true);
fixture.detectChanges();
- router.navigateByUrl(`/categories`);
+ router.navigateByUrl(`/classifications`);
expect(app.workbasketsRoute).toBe(false);
})));
diff --git a/web/src/app/app.component.ts b/web/src/app/app.component.ts
index 548371184..5b76d8866 100644
--- a/web/src/app/app.component.ts
+++ b/web/src/app/app.component.ts
@@ -1,19 +1,21 @@
-import { Component, OnInit, HostListener } from '@angular/core';
+import { Component, OnInit, HostListener, OnDestroy } from '@angular/core';
import { environment } from '../environments/environment';
import { Router, NavigationStart } from '@angular/router';
+import { Subscription } from 'rxjs/Subscription';
import { ErrorModel } from './models/modal-error';
import { ErrorModalService } from './services/errorModal/error-modal.service';
import { RequestInProgressService } from './services/requestInProgress/request-in-progress.service';
import { OrientationService } from './services/orientation/orientation.service';
+import { SelectedRouteService } from './services/selected-route/selected-route';
@Component({
selector: 'taskana-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
-export class AppComponent implements OnInit {
+export class AppComponent implements OnInit, OnDestroy {
title = 'Taskana administration';
adminUrl: string = environment.taskanaAdminUrl;
@@ -23,9 +25,15 @@ export class AppComponent implements OnInit {
modalErrorMessage = '';
modalTitle = '';
+ selectedRoute = '';
requestInProgress = false;
+ errorModalSubscription: Subscription;
+ requestInProgressSubscription: Subscription;
+ selectedRouteSubscription: Subscription;
+ routerSubscription: Subscription;
+
@HostListener('window:resize', ['$event'])
onResize(event) {
this.orientationService.onResize();
@@ -35,25 +43,38 @@ export class AppComponent implements OnInit {
private router: Router,
private errorModalService: ErrorModalService,
private requestInProgressService: RequestInProgressService,
- private orientationService: OrientationService) {
+ private orientationService: OrientationService,
+ private selectedRouteService: SelectedRouteService) {
}
ngOnInit() {
- this.router.events.subscribe(event => {
+
+ this.routerSubscription = this.router.events.subscribe(event => {
if (event instanceof NavigationStart) {
- if (event.url.indexOf('categories') !== -1) {
- this.workbasketsRoute = false;
- }
+ this.selectedRouteService.selectRoute(event);
}
});
-
- this.errorModalService.getError().subscribe((error: ErrorModel) => {
+ this.errorModalSubscription = this.errorModalService.getError().subscribe((error: ErrorModel) => {
this.modalErrorMessage = error.message;
this.modalTitle = error.title;
})
- this.requestInProgressService.getRequestInProgress().subscribe((value: boolean) => {
+ this.requestInProgressSubscription = this.requestInProgressService.getRequestInProgress().subscribe((value: boolean) => {
this.requestInProgress = value;
})
+
+ this.selectedRouteSubscription = this.selectedRouteService.getSelectedRoute().subscribe((value: string) => {
+ if (value.indexOf('classifications') !== -1) {
+ this.workbasketsRoute = false;
+ }
+ this.selectedRoute = value;
+ })
+ }
+
+ ngOnDestroy() {
+ if (this.routerSubscription) { this.routerSubscription.unsubscribe(); }
+ if (this.errorModalSubscription) { this.errorModalSubscription.unsubscribe(); }
+ if (this.requestInProgressSubscription) { this.requestInProgressSubscription.unsubscribe(); }
+ if (this.selectedRouteSubscription) { this.selectedRouteSubscription.unsubscribe(); }
}
}
diff --git a/web/src/app/app.module.ts b/web/src/app/app.module.ts
index f27254ef6..f813ca0fb 100644
--- a/web/src/app/app.module.ts
+++ b/web/src/app/app.module.ts
@@ -2,61 +2,66 @@
/**
* Modules
*/
-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';
+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 './shared/import-export/import-export.component';
-// Shared
-import {MasterAndDetailComponent} from './shared/masterAndDetail/master-and-detail.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 './shared/import-export/import-export.component';
+import { MasterAndDetailComponent } from './shared/master-and-detail/master-and-detail.component';
+import { ClassificationTypesSelectorComponent } from './shared/classification-types-selector/classification-types-selector.component';
+import { TreeComponent } from './shared/tree/tree.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 {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 { ClassificationDefinitionService } from './services/classification-definition/classification-definition.service';
+import { WorkbasketDefinitionService } from './services/workbasket-definition/workbasket-definition.service';
+import { SelectedRouteService } from './services/selected-route/selected-route';
+import { ClassificationsService } from './services/classifications/classifications.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 {DomainService} from './services/domains/domain.service';
+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,
@@ -91,6 +96,8 @@ const DECLARATIONS = [
PaginationComponent,
ClassificationListComponent,
ImportExportComponent,
+ TreeComponent,
+ ClassificationTypesSelectorComponent,
MapValuesPipe,
RemoveNoneTypePipe,
SelectWorkBasketPipe,
@@ -104,7 +111,7 @@ const DECLARATIONS = [
WorkbasketService,
MasterAndDetailService,
PermissionService,
- ClassificationService,
+ ClassificationDefinitionService,
WorkbasketDefinitionService,
DomainService,
{
@@ -116,7 +123,9 @@ const DECLARATIONS = [
ErrorModalService,
RequestInProgressService,
SavingWorkbasketService,
- OrientationService
+ OrientationService,
+ SelectedRouteService,
+ ClassificationsService
],
bootstrap: [AppComponent]
})
diff --git a/web/src/app/models/classification-definition.ts b/web/src/app/models/classification-definition.ts
new file mode 100644
index 000000000..6e27518f5
--- /dev/null
+++ b/web/src/app/models/classification-definition.ts
@@ -0,0 +1,24 @@
+export class ClassificationDefinition {
+ constructor(public classificationId: string,
+ public key: string,
+ public parentId: string,
+ public category: string,
+ public domain: string,
+ public isValidInDomain: boolean,
+ public created: string,
+ public modifies: string,
+ public name: string,
+ public description: string,
+ public priority: number,
+ public serviceLevel: string,
+ public applicationEntryPoint: string,
+ public custom1: string,
+ public custom2: string,
+ public custom3: string,
+ public custom4: string,
+ public custom5: string,
+ public custom6: string,
+ public custom7: string,
+ public custom8: string) {
+ }
+}
diff --git a/web/src/app/models/classification.ts b/web/src/app/models/classification.ts
index acb43acde..0fd875006 100644
--- a/web/src/app/models/classification.ts
+++ b/web/src/app/models/classification.ts
@@ -1,24 +1,12 @@
export class Classification {
- constructor(public classificationId: string,
- public key: string,
- public parentId: string,
- public category: string,
- public domain: string,
- public isValidInDomain: boolean,
- public created: string,
- public modifies: string,
- public name: string,
- public description: string,
- public priority: number,
- public serviceLevel: string,
- public applicationEntryPoint: string,
- public custom1: string,
- public custom2: string,
- public custom3: string,
- public custom4: string,
- public custom5: string,
- public custom6: string,
- public custom7: string,
- public custom8: string) {
+ constructor(public id: string,
+ public key: string,
+ public category: string,
+ public type: string,
+ public domain: string,
+ public name: string,
+ public parentId: string,
+ public priority: number,
+ public serviceLevel: string) {
}
}
diff --git a/web/src/app/models/tree-node.ts b/web/src/app/models/tree-node.ts
new file mode 100644
index 000000000..589c98161
--- /dev/null
+++ b/web/src/app/models/tree-node.ts
@@ -0,0 +1,16 @@
+import { Classification } from 'app/models/classification';
+
+export class TreeNode extends Classification {
+ constructor(public id: string = '',
+ public key: string = '',
+ public category: string = '',
+ public type: string = '',
+ public domain: string = '',
+ public name: string = '',
+ public parentId: string = '',
+ public priority: number = 0,
+ public serviceLevel: string = '',
+ public children: Array = undefined) {
+ super(id, key, category, type, domain, name, parentId, priority, serviceLevel);
+ }
+}
diff --git a/web/src/app/services/classification/classification.service.ts b/web/src/app/services/classification-definition/classification-definition.service.ts
similarity index 87%
rename from web/src/app/services/classification/classification.service.ts
rename to web/src/app/services/classification-definition/classification-definition.service.ts
index 95b65e911..38b458d71 100644
--- a/web/src/app/services/classification/classification.service.ts
+++ b/web/src/app/services/classification-definition/classification-definition.service.ts
@@ -2,13 +2,13 @@ import {Injectable} from '@angular/core';
import {HttpClient, HttpHeaders} from '@angular/common/http';
import {environment} from '../../../environments/environment';
import {AlertService} from '../alert/alert.service';
-import {Classification} from '../../models/classification';
+import {ClassificationDefinition} from '../../models/classification-definition';
import {AlertModel, AlertType} from '../../models/alert';
import {saveAs} from 'file-saver/FileSaver';
import {TaskanaDate} from '../../shared/util/taskana.date';
@Injectable()
-export class ClassificationService {
+export class ClassificationDefinitionService {
url = environment.taskanaRestUrl + '/v1/classificationdefinitions';
@@ -25,7 +25,7 @@ export class ClassificationService {
// GET
exportClassifications(domain: string) {
domain = (domain === '' ? '' : '?domain=' + domain);
- this.httpClient.get(this.url + domain, this.httpOptions)
+ this.httpClient.get(this.url + domain, this.httpOptions)
.subscribe(
response => saveAs(new Blob([JSON.stringify(response)], {type: 'text/plain;charset=utf-8'}),
'Classifications_' + TaskanaDate.getDate() + '.json')
diff --git a/web/src/app/services/classifications/classifications.service.ts b/web/src/app/services/classifications/classifications.service.ts
new file mode 100644
index 000000000..f187972fd
--- /dev/null
+++ b/web/src/app/services/classifications/classifications.service.ts
@@ -0,0 +1,84 @@
+import { Injectable } from '@angular/core';
+import { HttpClient, HttpHeaders } from '@angular/common/http';
+import { environment } from '../../../environments/environment';
+
+import { Classification } from 'app/models/classification';
+import { TreeNode } from 'app/models/tree-node';
+import { Observable } from 'rxjs/Observable';
+import { Subject } from 'rxjs/Subject';
+
+@Injectable()
+export class ClassificationsService {
+
+ url = environment.taskanaRestUrl + '/v1/classifications';
+
+ httpOptions = {
+ headers: new HttpHeaders({
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Basic VEVBTUxFQURfMTpURUFNTEVBRF8x'
+ })
+ };
+
+ private classificationRef: Observable>;
+ private classificationTypes: Array;
+
+ constructor(private httpClient: HttpClient) {
+ }
+
+ // GET
+ getClassifications(forceRequest = false, type = 'TASK', domain = ''): Observable> {
+ if (!forceRequest && this.classificationRef) {
+ return this.classificationRef.map((response: Array) => {
+ return this.buildHierarchy(response, type, domain);
+ });
+ }
+ this.classificationRef = this.httpClient.get>(`${environment.taskanaRestUrl}/v1/classifications`,
+ this.httpOptions);
+
+ return this.classificationRef.map((response: Array) => {
+ return this.buildHierarchy(response, type, domain);
+ });
+ }
+
+ getClassificationTypes(): Observable