TSK-404 allow workbasket list filtering while selection is applied.
This commit is contained in:
parent
a311a60301
commit
5864d70e0b
|
@ -54,6 +54,7 @@ public class WorkbasketMapper {
|
|||
.withRel("distributionTargets"));
|
||||
resource.add(linkTo(methodOn(WorkbasketController.class).getWorkbasketAccessItems(wb.getId()))
|
||||
.withRel("accessItems"));
|
||||
resource.add(linkTo(WorkbasketController.class).withRel("allWorkbaskets"));
|
||||
return resource;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
import {async, ComponentFixture, TestBed} from '@angular/core/testing';
|
||||
|
||||
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';
|
||||
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 '../../../../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';
|
||||
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';
|
||||
|
||||
describe('ClassificationListComponent', () => {
|
||||
let component: ClassificationListComponent;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {Component, OnInit} from '@angular/core';
|
||||
import {SelectionToImport} from '../../../enums/SelectionToImport';
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { ImportType } from 'app/models/import-type';
|
||||
|
||||
@Component({
|
||||
selector: 'taskana-classification-list',
|
||||
|
@ -8,7 +8,7 @@ import {SelectionToImport} from '../../../enums/SelectionToImport';
|
|||
})
|
||||
export class ClassificationListComponent implements OnInit {
|
||||
|
||||
selectionToImport = SelectionToImport.CLASSIFICATIONS;
|
||||
selectionToImport = ImportType.CLASSIFICATIONS;
|
||||
requestInProgress = false;
|
||||
|
||||
constructor() {
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
<!-- TODO: fix position of import button -->
|
||||
<input #selectedFile type="file" (change)="onSelectFile($event)"
|
||||
class="hide"/>
|
||||
<button class="btn btn-default glyphicon glyphicon-upload" type="button" title="Import"
|
||||
(click)="selectedFile.click()"></button>
|
||||
|
||||
<div class="dropdown" style="display: inline">
|
||||
<button type="button" title="Export" class="btn btn-default dropdown-toggle"
|
||||
data-toggle="dropdown" aria-haspopup="true" aria-expanded="true"
|
||||
(click)="updateDomains()">
|
||||
<span class="glyphicon glyphicon-download"></span>
|
||||
</button>
|
||||
|
||||
<ul class="dropdown-menu">
|
||||
<li>
|
||||
<a class="dropdown-item" (click)="export()"><label>All Domains</label></a>
|
||||
</li>
|
||||
<div role="separator" class="divider"></div>
|
||||
<li *ngFor="let domain of domains">
|
||||
<a class="dropdown-item"
|
||||
(click)="export(domain)"><label>{{domain === '' ? 'Master' : domain}}</label></a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
|
@ -51,7 +51,7 @@ export class AccessItemsComponent implements OnChanges, OnDestroy {
|
|||
private savingWorkbaskets: SavingWorkbasketService) { }
|
||||
|
||||
ngOnChanges(changes: SimpleChanges): void {
|
||||
if (changes.active.currentValue === 'accessItems' && !this.initialized) {
|
||||
if (!this.initialized && changes.active && changes.active.currentValue === 'accessItems') {
|
||||
this.init();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,7 +60,7 @@ export class DistributionTargetsComponent implements OnChanges, OnDestroy {
|
|||
private errorModalService: ErrorModalService) { }
|
||||
|
||||
ngOnChanges(changes: SimpleChanges): void {
|
||||
if (changes.active.currentValue === 'distributionTargets' && !this.initialized) {
|
||||
if (!this.initialized && changes.active && changes.active.currentValue === 'distributionTargets' ) {
|
||||
this.init();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,8 +7,8 @@ import { HttpClientModule } from '@angular/common/http';
|
|||
import { HttpModule, JsonpModule } from '@angular/http';
|
||||
import { RouterTestingModule } from '@angular/router/testing';
|
||||
import { Observable } from 'rxjs/Observable';
|
||||
import {Component} from '@angular/core';
|
||||
import {Routes} from '@angular/router';
|
||||
import { Component } from '@angular/core';
|
||||
import { Routes } from '@angular/router';
|
||||
|
||||
import { Workbasket } from 'app/models/workbasket';
|
||||
import { ICONTYPES } from 'app/models/type';
|
||||
|
@ -26,15 +26,15 @@ import { SavingWorkbasketService, SavingInformation } from 'app/services/saving-
|
|||
import { AlertService } from 'app/services/alert/alert.service';
|
||||
|
||||
@Component({
|
||||
selector: 'taskana-dummy-detail',
|
||||
template: 'dummydetail'
|
||||
selector: 'taskana-dummy-detail',
|
||||
template: 'dummydetail'
|
||||
})
|
||||
export class DummyDetailComponent {
|
||||
}
|
||||
|
||||
const routes: Routes = [
|
||||
{ path: ':id', component: DummyDetailComponent, outlet: 'detail' },
|
||||
{ path: 'someNewId', component: DummyDetailComponent }
|
||||
{ path: ':id', component: DummyDetailComponent, outlet: 'detail' },
|
||||
{ path: 'someNewId', component: DummyDetailComponent }
|
||||
];
|
||||
|
||||
describe('InformationComponent', () => {
|
||||
|
@ -94,7 +94,9 @@ describe('InformationComponent', () => {
|
|||
expect(component.workbasketClone).toBeUndefined();
|
||||
component.workbasket = new Workbasket('id', 'created', 'keyModified', 'domain', ICONTYPES.TOPIC, 'modified', 'name', 'description',
|
||||
'owner', 'custom1', 'custom2', 'custom3', 'custom4', 'orgLevel1', 'orgLevel2', 'orgLevel3', 'orgLevel4', null);
|
||||
component.ngOnInit();
|
||||
component.ngOnChanges(
|
||||
undefined
|
||||
);
|
||||
fixture.detectChanges();
|
||||
expect(component.workbasket.workbasketId).toEqual(component.workbasketClone.workbasketId);
|
||||
});
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { Component, OnInit, Input, Output, OnDestroy } from '@angular/core';
|
||||
import { Component, OnInit, Input, Output, OnDestroy, OnChanges, SimpleChanges } from '@angular/core';
|
||||
import { DatePipe } from '@angular/common';
|
||||
import { ActivatedRoute, Params, Router, NavigationStart } from '@angular/router';
|
||||
import { Subscription } from 'rxjs/Subscription';
|
||||
|
@ -23,7 +23,7 @@ const dateLocale = 'en-US';
|
|||
templateUrl: './workbasket-information.component.html',
|
||||
styleUrls: ['./workbasket-information.component.scss']
|
||||
})
|
||||
export class WorkbasketInformationComponent implements OnInit, OnDestroy {
|
||||
export class WorkbasketInformationComponent implements OnChanges, OnDestroy {
|
||||
|
||||
@Input()
|
||||
workbasket: Workbasket;
|
||||
|
@ -50,7 +50,7 @@ export class WorkbasketInformationComponent implements OnInit, OnDestroy {
|
|||
this.allTypes = IconTypeComponent.allTypes;
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
ngOnChanges(changes: SimpleChanges): void {
|
||||
this.workbasketClone = { ...this.workbasket };
|
||||
if (this.action === ACTION.CREATE) {
|
||||
this.badgeMessage = 'Creating new workbasket';
|
||||
|
|
|
@ -100,30 +100,23 @@ export class WorkbasketDetailsComponent implements OnInit, OnDestroy {
|
|||
|
||||
private getWorkbasketInformation(workbasketIdSelected: string, copyId: string = undefined) {
|
||||
this.requestInProgress = true;
|
||||
this.service.getWorkBasketsSummary().subscribe((workbasketSummary: WorkbasketSummaryResource) => {
|
||||
if (!workbasketIdSelected && this.action === ACTION.CREATE) { // CREATE
|
||||
this.workbasket = new Workbasket(undefined);
|
||||
this.workbasket._links.self = workbasketSummary._links.allWorkbaskets;
|
||||
this.requestInProgress = false;
|
||||
} else if (!workbasketIdSelected && this.action === ACTION.COPY) { // COPY
|
||||
this.workbasket = { ...this.workbasketCopy };
|
||||
this.workbasket._links.self = workbasketSummary._links.allWorkbaskets;
|
||||
this.workbasket.workbasketId = undefined;
|
||||
this.requestInProgress = false;
|
||||
}
|
||||
|
||||
const workbasketSummarySelected = this.getWorkbasketSummaryById(workbasketSummary._embedded.workbaskets, workbasketIdSelected);
|
||||
if (workbasketSummarySelected && workbasketSummarySelected._links) {
|
||||
this.workbasketSubscription = this.service.getWorkBasket(workbasketSummarySelected._links.self.href).subscribe(workbasket => {
|
||||
this.workbasket = workbasket;
|
||||
this.requestInProgress = false;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private getWorkbasketSummaryById(workbasketSummary: Array<WorkbasketSummary>, selectedId: string): WorkbasketSummary {
|
||||
return workbasketSummary.find((summary => summary.workbasketId === selectedId));
|
||||
if (!workbasketIdSelected && this.action === ACTION.CREATE) { // CREATE
|
||||
this.workbasket = new Workbasket(undefined);
|
||||
this.workbasket._links.self = this.workbasket._links.allWorkbasketUrl;
|
||||
this.requestInProgress = false;
|
||||
} else if (!workbasketIdSelected && this.action === ACTION.COPY) { // COPY
|
||||
this.workbasket = { ...this.workbasketCopy };
|
||||
this.workbasket._links.self = this.workbasket._links.allWorkbasketUrl;
|
||||
this.workbasket.workbasketId = undefined;
|
||||
this.requestInProgress = false;
|
||||
}
|
||||
if (workbasketIdSelected) {
|
||||
this.workbasketSubscription = this.service.getWorkBasket(workbasketIdSelected).subscribe(workbasket => {
|
||||
this.workbasket = workbasket;
|
||||
this.requestInProgress = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
ngOnDestroy(): void {
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
<li id="wb-action-toolbar" class="list-group-item tab-align">
|
||||
<div class="row">
|
||||
<div class="col-xs-9">
|
||||
<taskana-import-export-component [currentSelection]="selectionToImport"></taskana-import-export-component>
|
||||
<button type="button" (click)="addWorkbasket()" data-toggle="tooltip" title="Add" class="btn btn-default">
|
||||
<span class="glyphicon glyphicon-plus green" aria-hidden="true"></span>
|
||||
</button>
|
||||
|
@ -14,18 +13,17 @@
|
|||
<button *ngIf="workbasketIdSelected" type="button" (click)="removeWorkbasket()" data-toggle="tooltip" title="Remove" class="btn btn-default remove">
|
||||
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
|
||||
</button>
|
||||
<taskana-import-export-component [currentSelection]="'workbaskets'"></taskana-import-export-component>
|
||||
<taskana-import-export-component [currentSelection]="'workbaskets'"></taskana-import-export-component>
|
||||
</div>
|
||||
<div class="pull-right margin-right">
|
||||
<taskana-sort (performSorting)="sorting($event)"></taskana-sort>
|
||||
<div class="clearfix btn-group">
|
||||
<button class="btn btn-default collapsed" type="button" id="collapsedMenufilterWb" aria-expanded="false" (click)="toolbarState=!toolbarState">
|
||||
<span class="glyphicon glyphicon-filter blue"></span>
|
||||
</button>
|
||||
</div>
|
||||
<button class="btn btn-default collapsed" type="button" id="collapsedMenufilterWb" aria-expanded="false" (click)="toolbarState=!toolbarState">
|
||||
<span class="glyphicon glyphicon-filter blue"></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div [@toggle]="toolbarState" *ngIf="toolbarState" class="row no-overflow">
|
||||
<taskana-filter (performFilter)="filtering($event)"></taskana-filter>
|
||||
</div>
|
||||
</li>
|
||||
</li>
|
|
@ -18,6 +18,7 @@ import { SortComponent } from 'app/shared/sort/sort.component';
|
|||
import { FilterComponent } from 'app/shared/filter/filter.component';
|
||||
import { IconTypeComponent } from 'app/shared/type-icon/icon-type.component';
|
||||
import { WorkbasketListToolbarComponent } from './workbasket-list-toolbar.component';
|
||||
import { ImportExportComponent } from 'app/shared/import-export/import-export.component';
|
||||
|
||||
import { MapValuesPipe } from 'app/pipes/mapValues/map-values.pipe';
|
||||
|
||||
|
@ -25,10 +26,9 @@ 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 {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';
|
||||
import { ClassificationService } from 'app/services/classification/classification.service';
|
||||
import { WorkbasketDefinitionService } from 'app/services/workbasket/workbasketDefinition.service';
|
||||
import { DomainService } from 'app/services/domains/domain.service';
|
||||
|
||||
@Component({
|
||||
selector: 'taskana-dummy-detail',
|
||||
|
@ -54,7 +54,7 @@ describe('WorkbasketListToolbarComponent', () => {
|
|||
declarations: [WorkbasketListToolbarComponent, SortComponent,
|
||||
FilterComponent, IconTypeComponent, DummyDetailComponent, MapValuesPipe, ImportExportComponent],
|
||||
providers: [ErrorModalService, WorkbasketService, RequestInProgressService, AlertService,
|
||||
ClassificationService, WorkbasketDefinitionService, DomainService]
|
||||
ClassificationService, WorkbasketDefinitionService, DomainService]
|
||||
})
|
||||
.compileComponents();
|
||||
}));
|
||||
|
|
|
@ -2,18 +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 {SelectionToImport} from '../../../../enums/SelectionToImport';
|
||||
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 { ImportType } from 'app/models/import-type';
|
||||
|
||||
@Component({
|
||||
selector: 'taskana-workbasket-list-toolbar',
|
||||
|
@ -30,7 +30,7 @@ import {SelectionToImport} from '../../../../enums/SelectionToImport';
|
|||
style({ opacity: 0.5, height: '50px' }),
|
||||
style({ opacity: 0, height: '0px' })])))
|
||||
]
|
||||
)],
|
||||
)],
|
||||
templateUrl: './workbasket-list-toolbar.component.html',
|
||||
styleUrls: ['./workbasket-list-toolbar.component.scss']
|
||||
})
|
||||
|
@ -39,11 +39,11 @@ export class WorkbasketListToolbarComponent implements OnInit {
|
|||
|
||||
@Input() workbaskets: Array<WorkbasketSummary>;
|
||||
@Input() workbasketIdSelected: string;
|
||||
@Input() workbasketIdSelectedChanged: string;
|
||||
@Output() workbasketIdSelectedChanged: string;
|
||||
@Output() performSorting = new EventEmitter<SortingModel>();
|
||||
@Output() performFilter = new EventEmitter<FilterModel>();
|
||||
workbasketServiceSubscription: Subscription;
|
||||
selectionToImport = SelectionToImport.WORKBASKETS;
|
||||
selectionToImport = ImportType.WORKBASKETS;
|
||||
toolbarState = false;
|
||||
|
||||
constructor(
|
||||
|
@ -66,6 +66,7 @@ export class WorkbasketListToolbarComponent implements OnInit {
|
|||
}
|
||||
|
||||
addWorkbasket() {
|
||||
this.workbasketIdSelected = undefined;
|
||||
this.router.navigate([{ outlets: { detail: ['new-workbasket'] } }], { relativeTo: this.route });
|
||||
}
|
||||
|
||||
|
@ -85,6 +86,7 @@ export class WorkbasketListToolbarComponent implements OnInit {
|
|||
}
|
||||
|
||||
copyWorkbasket() {
|
||||
this.workbasketIdSelected = undefined;
|
||||
this.router.navigate([{ outlets: { detail: ['copy-workbasket'] } }], { relativeTo: this.route });
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,9 @@
|
|||
<taskana-spinner [isRunning]="requestInProgress" class="centered-horizontally"></taskana-spinner>
|
||||
<div>
|
||||
<ul #wbList id="wb-list-container" class="list-group">
|
||||
|
||||
<li class="list-group-item no-border">
|
||||
<div class="row"></div>
|
||||
</li>
|
||||
<li class="list-group-item" *ngFor="let workbasket of workbaskets" [class.active]="workbasket.workbasketId == selectedId"
|
||||
type="text" (click)="selectWorkbasket(workbasket.workbasketId)">
|
||||
<div class="row">
|
||||
|
|
|
@ -34,3 +34,7 @@ li > div.row > dl {
|
|||
li > div.row > dl:first-child {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.no-border {
|
||||
border-top: none;
|
||||
}
|
||||
|
|
|
@ -24,13 +24,13 @@ import { WorkbasketListToolbarComponent } from './workbasket-list-toolbar/workba
|
|||
import { IconTypeComponent } from 'app/shared/type-icon/icon-type.component';
|
||||
import { SpinnerComponent } from 'app/shared/spinner/spinner.component';
|
||||
import { SortComponent } from 'app/shared/sort/sort.component';
|
||||
import { ImportExportComponent } from '../../../import-export/import-export.component';
|
||||
import { ImportExportComponent } from 'app/shared/import-export/import-export.component';
|
||||
|
||||
import { RemoveNoneTypePipe } from 'app/pipes/removeNoneType/remove-none-type.pipe';
|
||||
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';
|
||||
import { WorkbasketDefinitionService } from 'app/services/workbasket/workbasketDefinition.service';
|
||||
import { ClassificationService } from 'app/services/classification/classification.service';
|
||||
import { DomainService } from 'app/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, DomainService]
|
||||
WorkbasketDefinitionService, OrientationService, DomainService, ClassificationService]
|
||||
})
|
||||
.compileComponents();
|
||||
|
||||
|
@ -131,24 +131,24 @@ describe('WorkbasketListComponent', () => {
|
|||
expect(debugElement.querySelector('#wb-list-container')).toBeDefined();
|
||||
expect(debugElement.querySelector('#collapsedMenufilterWb')).toBeDefined();
|
||||
expect(debugElement.querySelector('taskana-filter')).toBeDefined();
|
||||
expect(debugElement.querySelectorAll('#wb-list-container > li').length).toBe(2);
|
||||
expect(debugElement.querySelectorAll('#wb-list-container > li').length).toBe(3);
|
||||
});
|
||||
|
||||
it('should have two workbasketsummary rows created with the second one selected.', fakeAsync(() => {
|
||||
tick(0);
|
||||
fixture.detectChanges();
|
||||
fixture.whenStable().then(() => {
|
||||
expect(debugElement.querySelectorAll('#wb-list-container > li').length).toBe(2);
|
||||
expect(debugElement.querySelectorAll('#wb-list-container > li')[0].getAttribute('class')).toBe('list-group-item');
|
||||
expect(debugElement.querySelectorAll('#wb-list-container > li')[1].getAttribute('class')).toBe('list-group-item active');
|
||||
expect(debugElement.querySelectorAll('#wb-list-container > li').length).toBe(3);
|
||||
expect(debugElement.querySelectorAll('#wb-list-container > li')[1].getAttribute('class')).toBe('list-group-item');
|
||||
expect(debugElement.querySelectorAll('#wb-list-container > li')[2].getAttribute('class')).toBe('list-group-item active');
|
||||
})
|
||||
|
||||
}));
|
||||
|
||||
it('should have two workbasketsummary rows created with two different icons: user and users', () => {
|
||||
expect(debugElement.querySelectorAll('#wb-list-container > li')[0]
|
||||
.querySelector('svg-icon').getAttribute('ng-reflect-src')).toBe('./assets/icons/user.svg');
|
||||
expect(debugElement.querySelectorAll('#wb-list-container > li')[1]
|
||||
.querySelector('svg-icon').getAttribute('ng-reflect-src')).toBe('./assets/icons/user.svg');
|
||||
expect(debugElement.querySelectorAll('#wb-list-container > li')[2]
|
||||
.querySelector('svg-icon').getAttribute('ng-reflect-src')).toBe('./assets/icons/users.svg');
|
||||
});
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import {
|
||||
Component, OnInit, EventEmitter, OnDestroy,
|
||||
HostListener, ViewChild, ElementRef, AfterViewChecked
|
||||
HostListener, ViewChild, ElementRef, AfterViewChecked, ChangeDetectorRef
|
||||
} from '@angular/core';
|
||||
import { Router, ActivatedRoute } from '@angular/router';
|
||||
import { Subscription } from 'rxjs/Subscription';
|
||||
|
@ -40,7 +40,8 @@ export class WorkbasketListComponent implements OnInit, OnDestroy {
|
|||
private workbasketService: WorkbasketService,
|
||||
private router: Router,
|
||||
private route: ActivatedRoute,
|
||||
private orientationService: OrientationService) { }
|
||||
private orientationService: OrientationService,
|
||||
private cd: ChangeDetectorRef) { }
|
||||
|
||||
ngOnInit() {
|
||||
this.requestInProgress = true;
|
||||
|
@ -59,10 +60,6 @@ export class WorkbasketListComponent implements OnInit, OnDestroy {
|
|||
|
||||
selectWorkbasket(id: string) {
|
||||
this.selectedId = id;
|
||||
if (!this.selectedId) {
|
||||
this.router.navigate(['/workbaskets']);
|
||||
return
|
||||
}
|
||||
this.router.navigate([{ outlets: { detail: [this.selectedId] } }], { relativeTo: this.route });
|
||||
}
|
||||
|
||||
|
@ -84,7 +81,7 @@ export class WorkbasketListComponent implements OnInit, OnDestroy {
|
|||
private refreshWorkbasketList() {
|
||||
const toolbarSize = this.toolbarElement.nativeElement.offsetHeight;
|
||||
const cardHeight = 75;
|
||||
const unusedHeight = 140
|
||||
const unusedHeight = 145
|
||||
const totalHeight = window.innerHeight;
|
||||
const cards = Math.round((totalHeight - (unusedHeight + toolbarSize)) / cardHeight);
|
||||
this.workbasketService.pageSize = cards;
|
||||
|
@ -102,17 +99,9 @@ export class WorkbasketListComponent implements OnInit, OnDestroy {
|
|||
this.workbasketsResource = resultList;
|
||||
this.workbaskets = resultList._embedded ? resultList._embedded.workbaskets : [];
|
||||
this.requestInProgress = false;
|
||||
this.unSelectWorkbasket();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private unSelectWorkbasket(): void {
|
||||
if (!this.workbaskets.find(wb => wb.workbasketId === this.selectedId)) {
|
||||
this.selectWorkbasket(undefined);
|
||||
}
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
if (this.workBasketSummarySubscription) { this.workBasketSummarySubscription.unsubscribe(); }
|
||||
if (this.workbasketServiceSubscription) { this.workbasketServiceSubscription.unsubscribe(); }
|
||||
|
|
|
@ -32,7 +32,7 @@ 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 {ImportExportComponent} from './shared/import-export/import-export.component';
|
||||
// Shared
|
||||
import {MasterAndDetailComponent} from './shared/masterAndDetail/master-and-detail.component';
|
||||
/**
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
export enum SelectionToImport {
|
||||
export enum ImportType {
|
||||
WORKBASKETS,
|
||||
CLASSIFICATIONS
|
||||
}
|
|
@ -2,6 +2,7 @@ export class Links {
|
|||
constructor(
|
||||
public self: { 'href': string } = undefined,
|
||||
public distributionTargets: { 'href': string } = undefined,
|
||||
public accessItems: { 'href': string } = undefined
|
||||
public accessItems: { 'href': string } = undefined,
|
||||
public allWorkbasketUrl: { 'href': string } = undefined
|
||||
) { }
|
||||
}
|
||||
|
|
|
@ -77,8 +77,8 @@ export class WorkbasketService {
|
|||
|
||||
}
|
||||
// GET
|
||||
getWorkBasket(url: string): Observable<Workbasket> {
|
||||
return this.httpClient.get<Workbasket>(url, this.httpOptions);
|
||||
getWorkBasket(id: string): Observable<Workbasket> {
|
||||
return this.httpClient.get<Workbasket>(`${environment.taskanaRestUrl}/v1/workbaskets/${id}`, this.httpOptions);
|
||||
}
|
||||
// POST
|
||||
createWorkbasket(url: string, workbasket: Workbasket): Observable<Workbasket> {
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
<input #selectedFile type="file" (change)="onSelectFile($event)" class="hide" />
|
||||
<button class="btn btn-default glyphicon glyphicon-upload" type="button" title="Import" (click)="selectedFile.click()"></button>
|
||||
|
||||
<div class="dropdown" style="display: inline">
|
||||
<button type="button" title="Export" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true"
|
||||
aria-expanded="true" (click)="updateDomains()">
|
||||
<span class="glyphicon glyphicon-download"></span>
|
||||
</button>
|
||||
|
||||
<ul class="dropdown-menu">
|
||||
<li>
|
||||
<a class="dropdown-item" (click)="export()">
|
||||
<label>All Domains</label>
|
||||
</a>
|
||||
</li>
|
||||
<div role="separator" class="divider"></div>
|
||||
<li *ngFor="let domain of domains">
|
||||
<a class="dropdown-item" (click)="export(domain)">
|
||||
<label>{{domain === '' ? 'Master' : domain}}</label>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
|
@ -33,15 +33,4 @@ describe('ImportExportComponent', () => {
|
|||
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);
|
||||
})
|
||||
*/
|
||||
});
|
|
@ -1,8 +1,8 @@
|
|||
import {Component, Input, OnInit} from '@angular/core';
|
||||
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';
|
||||
import { Component, Input, OnInit } from '@angular/core';
|
||||
import { ClassificationService } from 'app/services/classification/classification.service';
|
||||
import { WorkbasketDefinitionService } from 'app/services/workbasket/workbasketDefinition.service';
|
||||
import { DomainService } from 'app/services/domains/domain.service';
|
||||
import { ImportType } from 'app/models/import-type';
|
||||
|
||||
@Component({
|
||||
selector: 'taskana-import-export-component',
|
||||
|
@ -11,11 +11,11 @@ import {SelectionToImport} from '../enums/SelectionToImport';
|
|||
})
|
||||
export class ImportExportComponent implements OnInit {
|
||||
|
||||
@Input() currentSelection: SelectionToImport;
|
||||
@Input() currentSelection: ImportType;
|
||||
domains: string[] = [];
|
||||
|
||||
constructor(private domainService: DomainService, private workbasketDefinitionService: WorkbasketDefinitionService,
|
||||
private classificationService: ClassificationService) {
|
||||
private classificationService: ClassificationService) {
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
|
@ -30,7 +30,7 @@ export class ImportExportComponent implements OnInit {
|
|||
onSelectFile(event) {
|
||||
const file = event.srcElement.files[0];
|
||||
const reader = new FileReader();
|
||||
if (this.currentSelection === SelectionToImport.WORKBASKETS) {
|
||||
if (this.currentSelection === ImportType.WORKBASKETS) {
|
||||
reader.onload = <Event>(e) => this.workbasketDefinitionService.importWorkbasketDefinitions(e.target.result);
|
||||
} else {
|
||||
reader.onload = <Event>(e) => this.classificationService.importClassifications(e.target.result);
|
||||
|
@ -39,7 +39,7 @@ export class ImportExportComponent implements OnInit {
|
|||
}
|
||||
|
||||
export(domain = '') {
|
||||
if (this.currentSelection === SelectionToImport.WORKBASKETS) {
|
||||
if (this.currentSelection === ImportType.WORKBASKETS) {
|
||||
this.workbasketDefinitionService.exportWorkbaskets(domain);
|
||||
} else {
|
||||
this.classificationService.exportClassifications(domain);
|
|
@ -230,6 +230,11 @@
|
|||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.navbar-inverse {
|
||||
box-shadow: 0px 1px 10px -1px rgb(51, 93, 125);
|
||||
border: none;
|
||||
}
|
||||
|
||||
taskana-workbasket-information, taskana-workbasket-access-items, taskana-workbaskets-distribution-targets {
|
||||
&> .panel{
|
||||
border: none;
|
||||
|
|
Loading…
Reference in New Issue