125 lines
4.4 KiB
HTML
125 lines
4.4 KiB
HTML
<div class="container-fluid">
|
|
<div class="content">
|
|
<h3>Dashboard</h3>
|
|
|
|
<div>
|
|
<div class="row px-3 py-2">
|
|
|
|
<!-- Show a message if no sprints exist yet, with a link to the page where a new one can be created -->
|
|
<ng-container *ngIf="selectedSprint === undefined">
|
|
<h3 class="mr-3 text-primary">Alle Userstories</h3>
|
|
<a [routerLink]="['sprints']"
|
|
>Lege einen Sprint an, um Userstories zu organisieren.</a
|
|
>
|
|
</ng-container>
|
|
|
|
<ng-container *ngIf="selectedSprint !== undefined">
|
|
<h3
|
|
class="mr-3 text-primary"
|
|
*ngIf="selectedSprint === currentSprint"
|
|
>
|
|
Aktueller Sprint:
|
|
</h3>
|
|
<h3
|
|
class="mr-3 text-primary"
|
|
*ngIf="selectedSprint !== currentSprint"
|
|
>
|
|
Sprint:
|
|
</h3>
|
|
<h3 class="mr-3 custom-text-secondary">{{ selectedSprint.title }}</h3>
|
|
<h3 class="mr-3">
|
|
{{ toDateString(selectedSprint.startDate) }} -
|
|
{{ toDateString(selectedSprint.endDate) }}
|
|
</h3>
|
|
|
|
<label class="mr-3">
|
|
<select
|
|
class="select custom-select custom-text-secondary"
|
|
[(ngModel)]="selectedSprint"
|
|
>
|
|
<option class="bg-secondary text-dark" [ngValue]="currentSprint">
|
|
{{ currentSprint.title }} (aktuell)
|
|
</option>
|
|
<option value="" disabled="disabled"
|
|
>─────────────────────────</option
|
|
>
|
|
<option
|
|
class="text-dark"
|
|
*ngFor="let sprint of sprints"
|
|
[ngValue]="sprint"
|
|
>
|
|
<ng-container *ngIf="sprint === currentSprint">
|
|
{{ sprint.title }} (aktuell)
|
|
</ng-container>
|
|
<ng-container *ngIf="sprint !== currentSprint">
|
|
{{ sprint.title }} ({{ toDateString(sprint.startDate) }} -
|
|
{{ toDateString(sprint.endDate) }})
|
|
</ng-container>
|
|
</option>
|
|
</select>
|
|
</label>
|
|
|
|
<!-- If the active sprint is selected: Show the number of remaining days + urgency -->
|
|
<span class="mr-5"></span>
|
|
<h3
|
|
*ngIf="selectedSprint === currentSprint"
|
|
class="mr-3 custom-text-secondary"
|
|
[class.text-success]="getSprintUrgency() === 2"
|
|
[class.text-warning]="getSprintUrgency() === 1"
|
|
[class.text-danger]="getSprintUrgency() === 0"
|
|
>
|
|
Verbleibende Tage: {{ getRemainingDaysInSprint() }}
|
|
</h3>
|
|
</ng-container>
|
|
</div>
|
|
|
|
<div class="row">
|
|
|
|
<!-- Info on the userstories in the selected sprint -->
|
|
<div class="p-3 col-12 col-xl-6 col-lg-6 col-md-12 col-sm-12">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<span class="text-large">
|
|
Userstories
|
|
</span>
|
|
</div>
|
|
<div class="card-body">
|
|
<div
|
|
*ngIf="selectedSprint !== undefined && usedStatus.length === 0"
|
|
>
|
|
Zum Sprint "{{ selectedSprint.title }}" sind aktuell keine
|
|
Userstories vorhanden.
|
|
</div>
|
|
<canvas id="done-stories-chart"></canvas>
|
|
</div>
|
|
</div>
|
|
<div class="card-deck">
|
|
<div class="card text-center" *ngFor="let status of usedStatus">
|
|
<div class="card-header">
|
|
<span class="text-large">
|
|
{{ status.title }}
|
|
</span>
|
|
</div>
|
|
<div class="card-body">
|
|
<span class="text-very-large">
|
|
<b>{{ getNumberOfUserstoriesByStatus(status) }}</b>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="p-3 col-12 col-xl-6 col-lg-6 col-md-12 col-sm-12">
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<app-userstory-inner-table
|
|
[items]="selectedSprintUserstories"
|
|
></app-userstory-inner-table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|