Conteúdo
- Task: Corrigir texto “Nenhum tarefa cadastradas”
- Task: Corrigir Upper Data conclusão
- Task: Testar reuse route
- User: Testar exclusão de um usuário com tarefa
- Explicar o que é o Apache ECharts e o ngx-echarts
- Alterar nome do arquivo default para dashboard
- Copiar scss
- Explicar sobre os pré-processadores
- Implementar os cards totalizadores
- Explicar Grid Bootstrap
- Apresentar a criação do dash
- Testar a tela criada
- Módulo surpresa
Material de apoio
dashboard.component.scss
@import '../../@theme/styles/themes';
@include nb-install-component() {
.card-dash {
padding-right: 5px;
padding-left: 5px;
}
nb-card {
flex-direction: row;
align-items: center;
height: 6rem;
overflow: visible;
.title {
font-size: 1rem;
}
.total {
font-size: 1.3rem;
}
.icon-container {
height: 100%;
padding: 0.625rem;
}
.icon {
display: flex;
align-items: center;
justify-content: center;
width: 5.75rem;
height: 4.75rem;
font-size: 3.75rem;
border-radius: nb-theme(card-border-radius);
transition: width 0.4s ease;
transform: translate3d(0, 0, 0);
}&:hover {
.title {
font-size: 1.1rem;
}
cursor: pointer;
}&.off {
.icon {
color: white;
&.blue {
background-color: #3498db;
}
&.yellow {
background-color: #f1c40f;
}
&.green {
background-color: #2ecc71;
}
&.gray {
background-color: #bdc3c7;
}
}
}
}
}
dashboard.component.ts
import { Component } from '@angular/core';
import { Router } from '@angular/router';
import { idUserLogged } from 'app/app.component';
import {
StatusEnum, Task, TaskFilterEnum,
} from 'app/models/task';
import { DashService } from 'app/services/dash.service';
import { EChartsOption } from 'echarts';
@Component({
selector: 'dashboard',
styleUrls: ['dashboard.component.scss'],
templateUrl: './dashboard.component.html',
})
export class DashboardComponent {
totalMyTask = 0;
totalOpened = 0;
totalFinished = 0;
totalAll = 0;
optionMyTask: EChartsOption;
optionTaskResponsible: EChartsOption;
constructor(private dashService: DashService, private router: Router) {
this.dashService.list().subscribe((res) => {
this.setTotalDash(res.body, idUserLogged);
this.setOptionMyTask(res.body, idUserLogged);
this.setOptionTaskResponsible(res.body);
});
}
private setTotalDash(tasks: Task[], idUserLogged: string): void {
this.totalMyTask = tasks.filter((task) => task.responsible._id === idUserLogged).length;
this.totalOpened = tasks.filter((task) => task.status === StatusEnum.OPEN).length;
this.totalFinished = tasks.filter((task) => task.status === StatusEnum.FINISHED).length;
this.totalAll = tasks.length;
}
private setOptionMyTask(tasks: Task[], idUserLogged: string): void {
this.optionMyTask = {
title: {
text: 'Minhas tarefas',
left: 15,
},
tooltip: {
trigger: 'item',
},
legend: {
bottom: 20,
left: 'center',
},
series: [
{
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
label: {
show: false,
position: 'center',
},
emphasis: {
label: {
show: true,
fontSize: '20',
fontWeight: 'bold',
},
},
labelLine: {
show: false,
},
data: this.getDataOptionMyTask(tasks, idUserLogged),
},
],
};
}
private getDataOptionMyTask(tasks: Task[], idUserLogged: string) {
const opened = tasks.filter((task) => (task.status === StatusEnum.OPEN && task.responsible._id === idUserLogged)).length;
const finished = tasks.filter((task) => (task.status === StatusEnum.FINISHED && task.responsible._id === idUserLogged)).length;
return [
{ value: opened, name: 'Em Aberto', itemStyle: { color: '#f1c40f' } },
{ value: finished, name: 'Finalizadas', itemStyle: { color: '#2ecc71' } },
];
}
private setOptionTaskResponsible(tasks: Task[]): void {
this.optionTaskResponsible = {
title: {
text: 'Tarefas por responsável',
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow',
},
},
legend: {
data: ['Em Aberto', 'Finalizadas'],
bottom: 20,
left: 'center',
},
grid: {
bottom: '15%',
containLabel: true,
},
xAxis: {
type: 'value',
boundaryGap: [0, 0.01],
},
yAxis: this.getyAxisOptionTaskResponsible(tasks),
series: this.getSeriesOptionTaskResponsible(tasks),
};
}
private getyAxisOptionTaskResponsible(tasks: Task[]): { type, data } {
const names = [...new Set(tasks.map((task) => task.responsible.name))];
return { type: 'category', data: names };
}
private getSeriesOptionTaskResponsible(tasks: Task[]): any {
const dataOpened = [];
const dataFinished = [];
const ids = [...new Set(tasks.map((task) => task.responsible._id))];
ids.forEach((id) => {
dataOpened.push(tasks.filter((task) => (task.status === StatusEnum.OPEN && task.responsible._id === id)).length);
dataFinished.push(tasks.filter((task) => (task.status === StatusEnum.FINISHED && task.responsible._id === id)).length);
});
return [
{
name: 'Em Aberto',
type: 'bar',
data: dataOpened,
color: '#f1c40f',
},
{
name: 'Finalizadas',
type: 'bar',
data: dataFinished,
color: '#2ecc71',
},
];
}
public btnGoToMy() {
this.goTo(TaskFilterEnum.MY);
}
public btnGoToOpened() {
this.goTo(TaskFilterEnum.OPENED);
}
public btnGoToFinished() {
this.goTo(TaskFilterEnum.FINISHED);
}
public btnGoToAll() {
this.goTo(TaskFilterEnum.ALL);
}
private goTo(filter: TaskFilterEnum) {
this.router.navigateByUrl(`/pages/task?filter=${filter}`);
}
}
Referências
- Apache ECharts
- Ngx-echarts
- Sass vs. LESS vs. Stylus: Batalha dos Pré-processadores
- Grid Bootstrap
- Exemplos ECharts
- Nebular Icon
Código fonte
Ementa completa
Curso Full-Stack 100% JavaScript