Aprimora UI das notificações e adiciona filtros
This commit is contained in:
parent
cce651eef9
commit
8a12a2e0d0
|
|
@ -191,6 +191,7 @@
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
color: rgba(17, 18, 20, 0.9);
|
color: rgba(17, 18, 20, 0.9);
|
||||||
|
border-bottom: 1px solid rgba(0,0,0,0.06);
|
||||||
}
|
}
|
||||||
|
|
||||||
.see-all {
|
.see-all {
|
||||||
|
|
@ -222,6 +223,12 @@
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
padding: 10px 12px;
|
padding: 10px 12px;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
|
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-1px);
|
||||||
|
box-shadow: 0 10px 20px rgba(0,0,0,0.08);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification-tag {
|
.notification-tag {
|
||||||
|
|
@ -267,6 +274,12 @@
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
color: rgba(17, 18, 20, 0.8);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border-color: rgba(3, 15, 170, 0.35);
|
||||||
|
color: #030faa;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.options-menu {
|
.options-menu {
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,32 @@
|
||||||
<h2>Notificações</h2>
|
<h2>Notificações</h2>
|
||||||
<p>Acompanhe vencimentos e avisos recentes.</p>
|
<p>Acompanhe vencimentos e avisos recentes.</p>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="filters">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="filter-btn"
|
||||||
|
[class.active]="filter === 'todas'"
|
||||||
|
(click)="setFilter('todas')"
|
||||||
|
>
|
||||||
|
Todas
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="filter-btn warning"
|
||||||
|
[class.active]="filter === 'aVencer'"
|
||||||
|
(click)="setFilter('aVencer')"
|
||||||
|
>
|
||||||
|
A vencer
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="filter-btn danger"
|
||||||
|
[class.active]="filter === 'vencidas'"
|
||||||
|
(click)="setFilter('vencidas')"
|
||||||
|
>
|
||||||
|
Vencidas
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="state" *ngIf="loading">Carregando notificações...</div>
|
<div class="state" *ngIf="loading">Carregando notificações...</div>
|
||||||
|
|
@ -13,9 +39,12 @@
|
||||||
<div class="state" *ngIf="!loading && !error && notifications.length === 0">
|
<div class="state" *ngIf="!loading && !error && notifications.length === 0">
|
||||||
Nenhuma notificação encontrada.
|
Nenhuma notificação encontrada.
|
||||||
</div>
|
</div>
|
||||||
|
<div class="state" *ngIf="!loading && !error && notifications.length > 0 && filteredNotifications.length === 0">
|
||||||
|
Nenhuma notificação para o filtro selecionado.
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="notifications-grid" *ngIf="!loading && !error && notifications.length > 0">
|
<div class="notifications-grid" *ngIf="!loading && !error && filteredNotifications.length > 0">
|
||||||
<article class="notification-card" *ngFor="let n of notifications">
|
<article class="notification-card" *ngFor="let n of filteredNotifications">
|
||||||
<div class="card-head">
|
<div class="card-head">
|
||||||
<span class="tag" [class.danger]="n.tipo === 'Vencido'" [class.warn]="n.tipo === 'AVencer'">
|
<span class="tag" [class.danger]="n.tipo === 'Vencido'" [class.warn]="n.tipo === 'AVencer'">
|
||||||
{{ n.tipo === 'Vencido' ? 'Vencido' : 'A vencer' }}
|
{{ n.tipo === 'Vencido' ? 'Vencido' : 'A vencer' }}
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,11 @@
|
||||||
|
|
||||||
.page-head {
|
.page-head {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: flex-end;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
|
gap: 16px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
|
|
@ -36,6 +38,42 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.filters {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter-btn {
|
||||||
|
border: 1px solid rgba(0,0,0,0.08);
|
||||||
|
background: #fff;
|
||||||
|
padding: 8px 14px;
|
||||||
|
border-radius: 999px;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 12px;
|
||||||
|
color: rgba(17, 18, 20, 0.7);
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
border-color: rgba(3, 15, 170, 0.4);
|
||||||
|
background: rgba(3, 15, 170, 0.08);
|
||||||
|
color: #030faa;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.warning.active {
|
||||||
|
border-color: rgba(227, 61, 207, 0.45);
|
||||||
|
background: rgba(227, 61, 207, 0.12);
|
||||||
|
color: #8b2a7d;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.danger.active {
|
||||||
|
border-color: rgba(239, 68, 68, 0.45);
|
||||||
|
background: rgba(239, 68, 68, 0.12);
|
||||||
|
color: #b91c1c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.state {
|
.state {
|
||||||
padding: 12px 14px;
|
padding: 12px 14px;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
|
|
@ -61,6 +99,12 @@
|
||||||
border: 1px solid rgba(0,0,0,0.08);
|
border: 1px solid rgba(0,0,0,0.08);
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
box-shadow: 0 18px 36px rgba(0,0,0,0.08);
|
box-shadow: 0 18px 36px rgba(0,0,0,0.08);
|
||||||
|
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 22px 44px rgba(0,0,0,0.12);
|
||||||
|
}
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
margin: 12px 0 8px;
|
margin: 12px 0 8px;
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import { NotificationsService, NotificationDto } from '../../services/notificati
|
||||||
})
|
})
|
||||||
export class Notificacoes implements OnInit {
|
export class Notificacoes implements OnInit {
|
||||||
notifications: NotificationDto[] = [];
|
notifications: NotificationDto[] = [];
|
||||||
|
filter: 'todas' | 'vencidas' | 'aVencer' = 'todas';
|
||||||
loading = false;
|
loading = false;
|
||||||
error = false;
|
error = false;
|
||||||
|
|
||||||
|
|
@ -31,6 +32,20 @@ export class Notificacoes implements OnInit {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setFilter(value: 'todas' | 'vencidas' | 'aVencer') {
|
||||||
|
this.filter = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
get filteredNotifications() {
|
||||||
|
if (this.filter === 'vencidas') {
|
||||||
|
return this.notifications.filter(n => n.tipo === 'Vencido');
|
||||||
|
}
|
||||||
|
if (this.filter === 'aVencer') {
|
||||||
|
return this.notifications.filter(n => n.tipo === 'AVencer');
|
||||||
|
}
|
||||||
|
return this.notifications;
|
||||||
|
}
|
||||||
|
|
||||||
private loadNotifications() {
|
private loadNotifications() {
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
this.error = false;
|
this.error = false;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue