import {Component, HostBinding, OnInit} from '@angular/core'; import {Title} from '@angular/platform-browser'; import {ActivatedRoute} from '@angular/router'; import {KanbanBoard, KanbanEntry, KanbanService,} from '../shared'; import {slideInOutAnimation} from '../../shared/slide-in-out-animation'; import {AnimationDirection, SettingsService} from '../../shared/service/settings.service'; @Component({ selector: 'app-kanban-board', templateUrl: './kanban-board.component.html', styleUrls: ['./kanban-board.component.css'], animations: [slideInOutAnimation] }) export class KanbanBoardComponent implements OnInit { @HostBinding('@slideInOutAnimation') public get slideInOutAnimation() { return this.settingService.animationDirection === AnimationDirection.RIGHT ? {value: 'right', params: {offsetEnter: 100, offsetLeave: -100}} : {value: 'left', params: {offsetEnter: -100, offsetLeave: 100}}; } constructor(private titleService: Title, private route: ActivatedRoute, private kanbanService: KanbanService, private settingService: SettingsService) { } /** * Set page title, and handle preloaded kanbanBoard data */ ngOnInit() { this.titleService.setTitle(`${this.settingService.team.name} : Kanban board`); this.route.data.subscribe((data: { kanbanBoard: KanbanBoard, }) => { this.kanbanBoard = data.kanbanBoard; }); } get kanbanBoard(): KanbanBoard { return this.kanbanService.kanbanBoard; } set kanbanBoard(kanbanBoard: KanbanBoard) { this.kanbanService.kanbanBoard = kanbanBoard; } get inprogressWipLimit(): number { return this.settingService.team.inprogressColumn.wipLimit; } get inprogressWipCount(): number { return this.kanbanBoard.inProgress.filter( (entry: KanbanEntry) => entry.labels.every( label => label.toUpperCase() !== 'BLOCKED' ) ).length; } /** * Set 'over-wip' class on inprogress row if its over the wip limit * This excludes issues marked as BLOCKED with labels * * @returns {{over-wip: boolean}} */ get inprogressWipClass() { return { 'over-wip': this.inprogressWipCount > this.settingService.team.inprogressColumn.wipLimit, }; } get verificationWipLimit(): number { return this.settingService.team.verificationColumn.wipLimit; } get verificationWipCount(): number { return this.kanbanBoard.verification.filter( (entry: KanbanEntry) => entry.labels.every( label => label.toUpperCase() !== 'BLOCKED' ) ).length; } /** * Set 'over-wip' class on verification row if its over the wip limit * This excludes issues marked as BLOCKED with labels * * @returns {{over-wip: boolean}} */ get verificationWipClass() { return { 'over-wip': this.verificationWipCount > this.settingService.team.verificationColumn.wipLimit, }; } get backlogLabel(): string { return this.settingService.team.backlogColumn.label; } get inProgressLabel(): string { return this.settingService.team.inprogressColumn.label; } get verificationLabel(): string { return this.settingService.team.verificationColumn.label; } get doneLabel(): string { return this.settingService.team.doneColumn.label; } }