Creați un tablou de bord receptiv cu material unghiular și diagrame ng2

Publicat: 2022-03-10
Rezumat rapid ↬ Schematicile din Angular 9 sunt generatoare de cod care pot crea componente și modele în proiecte folosind șabloane și machete predeterminate. În acest articol, Zara Cooper explică cum să profitați de schemele din Angular Material și ng2-charts pentru a reduce substanțial timpul și munca necesare pentru construirea unui tablou de bord.

Crearea unui tablou de bord de la zero este adesea destul de complicată. Trebuie să creați instrumente pentru a colecta date despre articolele de interes. Odată colectate, aceste date trebuie să fie prezentate utilizatorilor dumneavoastră într-un mod ușor de înțeles și semnificativ. Implica o planificare complexă a datelor care trebuie incluse și a modului de afișare eficientă a acestora. Odată ce aveți un plan, implementarea designului este o sarcină masivă, mai ales că implică construirea mai multor componente.

Cu Angular Material și ng2-charts, puteți profita de scheme pentru a reduce efortul și timpul pe care îl puteți petrece construirea unui tablou de bord. Angular Material este livrat cu o serie de scheme pe care le puteți folosi pentru a genera un tablou de bord. În mod similar, ng2-charts oferă scheme pentru generarea mai multor componente ale diagramei. În acest articol, voi ilustra cum să folosiți atât diagramele ng2, cât și Materialul Angular pentru a configura un tablou de bord destul de rapid.

Un exemplu

Pentru a ilustra cum să construim un tablou de bord, vom lua exemplul unui magazin online care vinde articole din piele precum genți, portofele, suporturi pentru chei și așa mai departe. Proprietarul magazinului ar dori să urmărească informații precum de unde vin clienții în magazinul lor online, cum se vând produsele lor, cum se leagă sursele de trafic cu vânzările, printre altele.

Vom construi un tablou de bord pentru a afișa aceste informații și pentru a ajuta proprietarul magazinului să le analizeze. Tabloul de bord va conține patru mici carduri rezumative, patru tipuri diferite de diagrame și un tabel care listează cele mai recente comenzi efectuate. Cele patru carduri rezumative vor afișa informații precum venitul total din vânzări, valoarea medie a comenzii, numărul total de comenzi și numărul de clienți care revin. Graficele vor afișa numărul de unități vândute pentru fiecare produs, vânzările în funcție de sursa de trafic, sesiunile magazinului online de-a lungul timpului și vânzările pe săptămână.

Cerințe preliminare

Pentru a urma, va trebui să aveți instalat Angular CLI. Dacă nu îl aveți instalat, puteți afla cum să îl obțineți la cli.angular.io. Dacă nu porniți de la un proiect Angular preexistent, trebuie să generați unul rulând ng new <your project name> . De exemplu, pentru a crea un panou de administrare pentru magazinul menționat mai sus, vom rula:

 ng new store-admin-panel

Proiectul dvs. trebuie, de asemenea, să aibă rute configurate pentru el. Dacă porniți de la o aplicație nouă, selectați da atunci când vi se solicită să adăugați un modul de rutare unghiulară în timpul configurării proiectului de mai sus.

Mai multe după săritură! Continuați să citiți mai jos ↓

Adăugați material unghiular și diagrame Ng2 la proiectul dvs

Materialul Angular este livrat cu diverse scheme pentru generarea unei varietăți de componente utile, cum ar fi agende de adrese, arbori, tabele, navigare și așa mai departe. Pentru a adăuga material angular la proiectul dvs., rulați:

 ng add @angular/material

Alegeți o temă dintre opțiunile oferite în solicitările ulterioare. Apoi, vi se va solicita să alegeți dacă doriți să adăugați stiluri de tipografie Angular Material și animații de browser. Nu aveți nevoie de acestea și puteți răspunde doar nu.

În continuare, va trebui să instalați ng2-charts. ng2-charts necesită charts.js ca dependență. Pentru a instala ng2-charts, rulați:

 npm install ng2-charts --save

Apoi instalați charts.js:

 npm install chart.js --save

Pentru a accesa diagramele, adăugați ChartsModule la importurile lui AppModule .

 import { ChartsModule } from 'ng2-charts'; @NgModule({ imports: [ … ChartsModule, … ] })

În cele din urmă, instalați schemele ng2-charts ca dependență de dezvoltare, deoarece acestea nu sunt livrate implicit cu ng2-charts.

 npm install --save-dev ng2-charts-schematics

Generarea unei componente de navigare

În primul rând, va trebui să adăugăm o componentă de navigare pentru a ajuta utilizatorii să manevreze confortabil prin aplicație. Navigarea ar trebui să conțină link-uri către tabloul de bord și alte pagini care vor face parte din panoul de administrare. Materialul unghiular oferă o schemă care generează o componentă de navigare. Vom numi această componentă nav . Adăugarea unei navigații laterale la aplicație se realizează prin rularea:

 ng generate @angular/material:navigation nav

Pentru a lega alte rute în navigare, utilizați directiva routerLink și schimbați numele paginii din bara de instrumente, în funcție de ruta pe care se află un utilizator.

 // nav.component.ts ... menuItems = ['dashboard', 'sales', 'orders', 'customers', 'products'];
 <!--nav.component.html--> ... <mat-nav-list> <a *ngFor="let item of menuItems" mat-list-item [routerLink]="'/'+item"> {{item | titlecase}} </a> ...

Pentru a vedea această componentă, adăugați-o la app.component.html .

 <!--app.component.html--> <app-nav></app-nav>

Așa arată NavComponent .

Componenta de navigare
Componenta de navigare (previzualizare mare)

Deoarece navigarea va fi afișată alături de alte componente, adăugarea unei router-outlet ar ajuta la comutarea între celelalte componente diferite. În șablonul nav.component.html , imediat după închiderea </mat-toolbar> , înlocuiți comentariul <!-- Add Content Here --> cu <router-outlet></router-outlet> .

 <!--nav.component.html--> <mat-sidenav-container> ... <mat-sidenav-content> <mat-toolbar> ... </mat-toolbar> <router-outlet></router-outlet> </mat-sidenav-content> </mat-sidenav-container>

În capturile de ecran care urmează în acest articol, această componentă de navigare va fi omisă pentru a evidenția mai bine tabloul de bord pe care îl vom genera de dragul tutorialului. Dacă urmăriți în timp ce construiți acest tablou de bord, navigația va apărea în continuare așa cum este imaginea de mai sus în browser, cu tabloul de bord în interior.

Generați tabloul de bord

Cea mai importantă parte a tabloului de bord este aspectul acestuia. Trebuie să țină toate componentele menționate mai devreme și să răspundă atunci când este afișat pe diferite dispozitive. Pentru a genera aspectul tabloului de bord, va trebui să rulați schema @angular/material:dashboard . Va genera o componentă de tablou de bord receptivă. Treceți numele preferat pentru tabloul de bord în schema. În acest caz, să-i dash .

 ng generate @angular/material:dashboard dash

Pentru a vizualiza tabloul de bord nou generat în cadrul componentei nav, adăugați o rută pentru acesta la router.

 // app-routing.module.ts import { DashComponent } from './dash/dash.component'; const routes: Routes = [{ path: 'dashboard', component: DashComponent }]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] })

Odată terminat, pentru a vedea rezultatele, rulați npm start și mergeți la localhost:4200/dashboard . Ar trebui să vezi asta:

componentă tablou de bord generată
Componentă tablou de bord generată (previzualizare mare)

Schema generează patru carduri în șablon și le afișează într-o grilă receptivă. Angular Material CDK folosește pachetul Layout pentru a stila această grilă de card receptivă. Utilitarul BreakpointObserver al pachetului Layout evaluează interogările media și efectuează modificări UI pe baza acestora. Există diverse puncte de întrerupere disponibile, dar în cadrul componentei generate sunt acoperite doar două categorii. Breakpoints.Handset și alte interogări care nu se potrivesc. Pachetul Layout specifică 14 stări de întrerupere pe care le puteți utiliza pentru a personaliza capacitatea de răspuns a tabloului de bord.

 // dashboard.component.js ... cards = this.breakpointObserver.observe(Breakpoints.Handset).pipe( map(({ matches }) => { if (matches) { ... } ... }) );

Revenind la tabloul de bord, deoarece patru carduri rezumative, patru diagrame și un tabel vor fi pe tabloul de bord, avem nevoie de nouă carduri în total. Breakpoints.Handset și Breakpoints.Tablet pentru tabletă vor fi afișate într-o grilă cu o singură coloană unde:

  • Cele patru cărți de rezumat se vor întinde pe un rând.
  • Diagramele se vor întinde pe două rânduri.
  • Tabelul se va întinde pe patru rânduri.

Non- Breakpoints.Handset . Handset și non- Breakpoints.Tablet . Potrivirile pentru tabletă vor fi afișate în patru coloane unde:

  • Cele patru carduri rezumative se vor întinde pe un rând și o coloană.
  • Diagramele se vor întinde pe două rânduri și două coloane.
  • Tabelul se va întinde pe patru rânduri și patru coloane.

Ar trebui să arate ceva asemănător cu captura de ecran de mai jos în potrivirile non- Breakpoints.Handset și non- Breakpoints.Tablet . Pe meciurile Breakpoints.Handset și Breakpoints.Tablet , totul se va afișa într-o singură coloană.

componenta tabloului de bord cu carduri suplimentare
Componentă tablou de bord cu carduri suplimentare (previzualizare mare)

Creați o componentă card

În componenta tabloului de bord, toate cardurile sunt generate prin iterație. Pentru a preveni repetarea, la adăugarea tuturor componentelor noi, vom crea o componentă de card reutilizabilă. Componenta cardului va accepta un titlu ca intrare și va folosi ng-content pentru a adăuga în mod dinamic restul conținutului. Pentru a crea componenta cardului, rulați:

 ng gc card -m app --style css

Din șablonul componentului tabloului de bord, vom lua doar marcajul inclus în eticheta <mat-card> și îl vom plasa în șablonul cardului:

 <!--card.component.html--> <mat-card class="dashboard-card"> <mat-card-header> <mat-card-title> {{title}} <button mat-icon-button class="more-button" [matMenuTriggerFor]="menu" aria-label="Toggle menu"> <mat-icon>more_vert</mat-icon> </button> <mat-menu #menu="matMenu" xPosition="before"> <button mat-menu-item>Expand</button> <button mat-menu-item>Remove</button> </mat-menu> </mat-card-title> </mat-card-header> <mat-card-content class="dashboard-card-content"> <ng-content></ng-content> </mat-card-content> </mat-card>

Pentru a adăuga titlul ca intrare pe card:

 // card.component.ts import { Component, Input } from '@angular/core'; ... export class CardComponent{ @Input() title: string; ... }

Pentru a modela cardul:

 /*card.component.css*/ .more-button { position: absolute; top: 5px; right: 10px; } .dashboard-card { position: absolute; top: 15px; left: 15px; right: 15px; bottom: 15px; } .dashboard-card-content { text-align: center; flex-grow: 1; display: flex; flex-direction: column; align-items: center; max-height: 100%; justify-content: center; align-items: stretch; } mat-card { display: flex; flex-direction: column; }

Adăugarea cardurilor la tabloul de bord

Deoarece elementele tabloului de bord vor fi adăugate individual și nu prin iterație, componenta tabloului de bord trebuie modificată pentru a ține seama de acest lucru. În dashboard.component.ts , eliminați proprietatea cards și înlocuiți-o cu o proprietate cardLayout . Variabila cardLayout va defini numărul de coloane pentru lista grilă de materiale și câte rânduri și coloane se va întinde fiecare dintre cardurile tabloului de bord. Puncte de întrerupere. Breakpoints.Handset și Puncte de întrerupere. Breakpoints.Tablet de interogare pentru tabletă vor fi afișate într-o coloană, iar cele care nu se potrivesc se vor afișa în 4 coloane.

 // dashboard.component.js ... cardLayout = this.breakpointObserver.observe(Breakpoints.Handset).pipe( map(({ matches }) => { if (matches) { return { columns: 1, miniCard: { cols: 1, rows: 1 }, chart: { cols: 1, rows: 2 }, table: { cols: 1, rows: 4 }, }; } return { columns: 4, miniCard: { cols: 1, rows: 1 }, chart: { cols: 2, rows: 2 }, table: { cols: 4, rows: 4 }, }; }) ); ...

În șablonul dash.component.html , înlocuiți valorile rowspan colspan elementelor mat-grid-tile și proprietatea cols a elementului mat-grid-list .

 <!--dash.component.html--> <div class="grid-container"> <h1 class="mat-h1">Dashboard</h1> <mat-grid-list cols="{{ ( cardLayout | async )?.columns }}" rowHeight="200px"> <!--Mini Cards--> <mat-grid-tile *ngFor="let i of [1, 2, 3, 4]" [colspan]="( cardLayout | async )?.miniCard.cols" [rowspan]="( cardLayout | async )?.miniCard.rows"> <app-card title="Card {{i}}"><div>Mini Card Content Here</div></app-card> </mat-grid-tile> <!--Charts--> <mat-grid-tile *ngFor="let i of [5, 6, 7, 8]" [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Card {{i}}"><div>Chart Content Here</div></app-card> </mat-grid-tile> <!--Table--> <mat-grid-tile [colspan]="( cardLayout | async )?.table.cols" [rowspan]="( cardLayout | async )?.table.rows"> <app-card title="Card 9"><div>Table Content Here</div></app-card> </mat-grid-tile> </mat-grid-list> </div>

Tabloul de bord va arăta exact ca cea mai recentă captură de ecran de mai sus.

Generarea graficelor

Cele patru diagrame de care avem nevoie pentru tabloul de bord sunt:

  • O diagramă radar a produselor în funcție de unitate vândută.
  • O diagramă circulară a vânzărilor în funcție de sursa de trafic.
  • O diagramă cu bare a sesiunilor de magazin online.
  • Un grafic cu linii de vânzări de-a lungul anului.

Similar cu crearea tabloului de bord, generarea componentelor diagramei implică rularea unei scheme. Folosind schemele ng2-charts, generați cele patru diagrame diferite. Le vom plasa într-un folder numit diagrame. Executați ng generate ng2-charts-schematics:<chart type> <chart name> .

 ng generate ng2-charts-schematics:radar charts/product-sales-chart ng generate ng2-charts-schematics:pie charts/sales-traffic-chart ng generate ng2-charts-schematics:line charts/annual-sales-chart ng generate ng2-charts-schematics:bar charts/store-sessions-chart

După rularea acestor comenzi, toate cele patru componente ale diagramei sunt generate și sunt populate cu date eșantion gata pentru afișare. În funcție de datele pe care doriți să le afișați, alegeți diagramele care se potrivesc cel mai mult nevoilor dvs. de vizualizare a datelor. Pentru fiecare dintre diagramele generate mai sus, adăugați clasa chartContainer la div -urile care includ elementul canvas în șabloanele de diagramă.

 <div class="chartContainer"> <canvas baseChart width="400" height="400"> ...

Apoi, adăugați acest stil la styles.css , astfel încât să poată fi accesibile tuturor componentelor diagramei.

 /*styles.css*/ ... .chartContainer canvas { max-height: 250px; width: auto; } .chartContainer{ height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; }

Adăugarea datelor la diagrame

Componentele grafice generate vin cu eșantion de date deja conectate. Dacă aveți servicii preexistente care vă oferă propriile date, puteți adăuga aceste date din ele la componentele diagramei. Diagramele au etichete pentru axa x, date sau seturi de date, un tip de diagramă, culori, o legendă, precum și alte opțiuni de personalizare. Pentru a furniza datele și etichetele diagramelor, creați un serviciu care va prelua date dintr-o sursă la alegere și le va returna într-o formă acceptată de diagrame. De exemplu, AnnualSalesChartComponent primește setul de date și etichetele din metoda SalesService a getSalesByMonth , care returnează o serie de vânzări pentru fiecare lună pentru anul curent. Puteți găsi acest serviciu aici și datele pe care le returnează aici. Injectați serviciul ca proprietate privată în constructorul AnnualSalesChartComponent . Apelați metoda care returnează datele de diagramă necesare de la serviciu în cadrul hook-ului de ciclu de viață ngOnInit .

 // annual-sales-chart.component.ts import { SalesService } from 'src/app/sales/sales.service'; ... export class AnnualSalesChartComponent implements OnInit { public salesChartData: ChartDataSets[] = [ { data: [], label: 'Total Sales' }, ]; public salesChartLabels: Label[] = []; ... constructor(private salesService: SalesService) { } ngOnInit() { this.salesService.getSalesByMonth().subscribe({ next: salesItems => { salesItems.forEach(li => { this.salesChartData[0].data.push(li.revenue); this.salesChartLabels.push(li.month); }); }, ... }); } }

Adăugarea diagramelor la tabloul de bord

Următorul pas implică adăugarea diagramelor în tabloul de bord, în dash.component.html . Iată cum arată:

 <!--dash.component.html--> ... <!--Charts--> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Monthly Revenue"> <app-annual-sale-chart></app-annual-sale-chart> </app-card> </mat-grid-tile> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Product Sales"> <app-product-sales-chart></app-product-sales-chart> </app-card> </mat-grid-tile> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Sales by Traffic Source"> <app-sales-traffic-chart></app-sales-traffic-chart> </app-card> </mat-grid-tile> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Online Store Sessions by Traffic Source"> <app-store-sessions-chart></app-store-sessions-chart> </app-card> </mat-grid-tile> ...

Așa arată tabloul de bord receptiv rezultat.

tablou de bord cu diagrame
Tabloul de bord cu diagrame (previzualizare mare)

Generarea unui tabel

Vom adăuga un tabel de comenzi pentru a oferi proprietarului magazinului o imagine de ansamblu asupra celor mai recente comenzi plasate și a stării acestora. Pentru a genera componenta tabel de comenzi, rulați schema:

 ng generate @angular/material:table orders-table

Aceasta va genera o componentă de tabel care va arăta astfel.

tabel generat de Angular Material schematic
Tabel generat de schema materialului unghiular (previzualizare mare)

Tabelele cu multe coloane pot fi dificil de făcut receptiv pentru vizualizările telefonului și tabletei. Când adăugați tabelul pe un card, faceți-l derulabil pe orizontală, astfel încât toate datele să poată fi vizualizate corect și să nu fie obstrucționate. Puteți face acest lucru adăugând stilul de mai jos la componenta tabelului:

 <!--table.component.html--> <div class="mat-elevation-z8 small-table"> <table mat-table class="full-width-table" matSort aria-label="Elements"> ...
 /*table.component.css*/ ... .small-table{ overflow-x: scroll !important; }

Pentru a adăuga tabelul la componenta liniuță:

 <!-- dashboard.component.html> ... <mat-grid-tile [colspan]="( cardLayout | async )?.table.cols" [rowspan]="( cardLayout | async )?.table.rows"> <app-card title="Latest Orders"> <app-orders-table></app-orders-table> </app-card> </mat-grid-tile> ...

Adăugarea datelor la tabel

Ca și în cazul diagramelor, puteți adăuga date la tabel în metoda ngOnInit dintr-un serviciu. În plus, va trebui să modificați sursa de date generată a tabelului pentru a consuma date din serviciu. Pentru a începe, injectați serviciul în constructorul de clasă al tabelului. Să luăm exemplul unui tabel care listează cele mai recente comenzi pentru acest tablou de bord. Pentru a obține date pentru tabel, să injectăm OrderService în constructorul OrdersTableComponent , să modificăm afirmația de tip MatTable a copilului vizualizării tabelului și să modificăm lista de coloane afișate pentru a reflecta o interfață de comandă. Dacă sunteți interesat de adăugarea datelor în tabel, le puteți găsi aici. Ultimul lucru implică obținerea lungimii totale a elementelor de date disponibile pentru a fi utilizate pentru a seta totalul în <mat-paginator> .

 // orders-table.component.ts import { OrderService } from '../orders.service'; import { Order } from '../order'; ... export class OrdersTableComponent implements AfterViewInit, OnInit { ... @ViewChild(MatTable) table: MatTable ; dataLength: number; displayedColumns = [ "id", "date", "name", "status", "orderTotal", "paymentMode", ]; ... constructor(private orderService: OrderService){} ngOnInit() { this.datasource = new OrdersTableDataSource(this.orderService); this.orderService.getOrderCount().subscribe({ next: orderCount => { this.dataLength = orderCount; }, ... }); } ... } // orders-table.component.ts import { OrderService } from '../orders.service'; import { Order } from '../order'; ... export class OrdersTableComponent implements AfterViewInit, OnInit { ... @ViewChild(MatTable) table: MatTable ; dataLength: number; displayedColumns = [ "id", "date", "name", "status", "orderTotal", "paymentMode", ]; ... constructor(private orderService: OrderService){} ngOnInit() { this.datasource = new OrdersTableDataSource(this.orderService); this.orderService.getOrderCount().subscribe({ next: orderCount => { this.dataLength = orderCount; }, ... }); } ... }

În continuare, va trebui să modificăm clasa OrdersTableDataSource pentru a accepta OrderService ca parametru în constructorul său. Va trebui să îi modificăm și metodele de connect și destroy . Metoda de connect conectează sursa de date la tabel și actualizează tabelul atunci când sunt emise noi elemente de date din fluxul returnează, în acest caz, o matrice de ordine observabilă. Constanta dataMutations combină primele evenimente de încărcare a datelor, paginare și sortare într-un singur flux pentru ca tabelul să le consume. Paginarea și sortarea sunt gestionate de partea serverului OrderService . Deci, trebuie să trecem offset-ul și dimensiunea paginii de la paginator și câmpul de sortare activ și direcția de sortare a proprietății de sortare la metoda getOrders a OrderService . Metoda de disconnect ar trebui utilizată pentru a închide orice conexiuni realizate și pentru a elibera resursele reținute în metoda de conectare.

 // orders-table.datasource.ts ... export class OrdersTableDataSource extends DataSource<Order> { paginator: MatPaginator; sort: MatSort; constructor(private orderService: OrderService) { super(); } connect(): Observable<Order[]> { const dataMutations = [ of('Initial load'), this.paginator.page, this.sort.sortChange ]; return merge(...dataMutations).pipe(mergeMap(() => { return this.orderService.getOrders( this.paginator.pageIndex * this.paginator.pageSize, this.paginator.pageSize, this.sort.active, this.sort.direction ); })); } disconnect() {} }

În șablonul de tabel de comenzi, inserați noile coloane și legați proprietatea length a <mat-paginator> la proprietatea dataLength . Pentru coloana de stare, utilizați un element <mat-chip> pentru o mai bună vizualizare a stării comenzii. Pentru a avea acces la <mat-chip> , adăugați MatChipsModule ca import în AppModule .

 <!-- orders-table.component.html --> <div class="mat-elevation-z8"> <table mat-table class="full-width-table" matSort aria-label="Elements"> <!-- Id Column --> <ng-container matColumnDef="id"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Id</th> <td mat-cell *matCellDef="let row">{{row.id}}</td> </ng-container> <!-- Date Column --> <ng-container matColumnDef="date"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Date</th> <td mat-cell *matCellDef="let row">{{row.date | date }}</td> </ng-container> <!-- Name Column --> <ng-container matColumnDef="name"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Name</th> <td mat-cell *matCellDef="let row">{{row.name}}</td> </ng-container> <!-- Order Total Column --> <ng-container matColumnDef="orderTotal"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Order Total</th> <td mat-cell *matCellDef="let row">{{row.orderTotal | currency}}</td> </ng-container> <!-- Payment Mode Column --> <ng-container matColumnDef="paymentMode"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Payment Mode</th> <td mat-cell *matCellDef="let row">{{row.paymentMode}}</td> </ng-container> <!-- Status Column --> <ng-container matColumnDef="status"> <th mat-header-cell *matHeaderCellDef mat-sort-header>Status</th> <td mat-cell *matCellDef="let row"> <mat-chip-list> <mat-chip color="{{ row.status == 'delivered' ? 'primary' : ( row.status == 'shipped' ? 'accent' : 'warn' ) }}" selected> {{row.status}} </mat-chip> </mat-chip-list> </td> </ng-container> <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr> <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr> </table> <mat-paginator #paginator [length]="dataLength" [pageIndex]="0" [pageSize]="5" [pageSizeOptions]="[5, 10, 15, 20]"> </mat-paginator> </div>

Odată ce datele au fost adăugate în tabel, așa va arăta tabloul de bord:

tablou de bord cu diagrame și tabel
Tablou de bord cu diagrame și tabel (previzualizare mare)

Crearea unei componente de mini card

Tot ce a mai rămas pentru a finaliza tabloul de bord este să populați cele patru carduri mici care stau în partea de sus. Având carduri rezumative mai mici ca parte a tabloului de bord, este ușor de evidențiat informații scurte care nu au nevoie de diagrame sau tabele întregi. În acest exemplu, cele patru mini carduri vor afișa vânzările totale, valoarea medie a comenzii, numărul total de comenzi și numărul de clienți care au revenit care au vizitat magazinul pentru ziua respectivă. Acesta este doar un exemplu. Aceste mini carduri nu pot fi generate ca în cazul navigației, aspectului tabloului de bord, diagramelor și tabelului. Nu au scheme. Mai jos vom analiza pe scurt cum să le creăm. Deși vom adăuga date specifice exemplului, puteți să le adăugați orice doriți sau să decideți să le eliminați cu totul. Pentru a începe, generați componenta mini-card , rulați:

 ng gc mini-card -m app --style css

Puteți găsi șablonul pentru componentă legat aici și stilul acestuia aici. Această componentă are opt proprietăți de intrare pe care le puteți afla cum să le adăugați aici. Pentru a obține date către componentele mini cardului, injectați serviciul care le oferă date în constructorul DashComponent . Atribuiți datele primite de la serviciu unei proprietăți a DashComponent . În acest caz, vom obține date de la StoreSummaryService și le vom atribui proprietății miniCardData . Iată cum:

 // dash.component.ts export class DashComponent implements OnInit{ ... miniCardData: StoreSummary[]; constructor(private breakpointObserver: BreakpointObserver, private summaryService: StoreSummaryService) {} ngOnInit() { this.summaryService.getStoreSummary().subscribe({ next: summaryData => { this.miniCardData = summaryData; } }); } }

Pentru a adăuga mini-cards la componenta liniuță și a le completa cu date de la serviciu:

 <!--dash.component.html--> ... <!--Mini Cards--> <mat-grid-tile *ngFor="let mc of miniCardData" [colspan]="( cardLayout | async )?.miniCard.cols" [rowspan]="( cardLayout | async )?.miniCard.rows"> <app-mini-card [title]="mc.title" [textValue]="mc.textValue" [value]="mc.value" [color]="mc.color" [percentValue]="mc.percentValue"></app-mini-card> </mat-grid-tile> ...

Captura de ecran de mai jos arată cum va arăta tabloul de bord cu mini-cardurile populate.

tablou de bord cu diagrame, tabele și mini-carduri
Tablou de bord cu diagrame, tabele și mini-carduri. (Previzualizare mare)

Punând Toate Împreună

În cele din urmă, șablonul componentului tabloului de bord ar trebui să conțină:

 <!-- dashboard.component.html --> <div class="grid-container"> <h1 class="mat-h1">Dashboard</h1> <mat-grid-list cols="{{ ( cardLayout | async )?.columns }}" rowHeight="200px"> <!--Mini Cards--> <mat-grid-tile *ngFor="let mc of miniCardData" [colspan]="( cardLayout | async )?.miniCard.cols" [rowspan]="( cardLayout | async )?.miniCard.rows"> <app-mini-card [icon]="mc.icon" [title]="mc.title" [value]="mc.value" [color]="mc.color" [isIncrease]="mc.isIncrease" duration="since last month" [percentValue]="mc.percentValue" [isCurrency]="mc. isCurrency"></app-mini-card> </mat-grid-tile> <!--Charts--> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Monthly Revenue"> <app-annual-sale-chart></app-annual-sale-chart> </app-card> </mat-grid-tile> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Product Sales"> <app-product-sales-chart></app-product-sales-chart> </app-card> </mat-grid-tile> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Sales by Traffic Source"> <app-sales-traffic-chart></app-sales-traffic-chart> </app-card> </mat-grid-tile> <mat-grid-tile [colspan]="( cardLayout | async )?.chart.cols" [rowspan]="( cardLayout | async )?.chart.rows"> <app-card title="Online Store Sessions by Traffic Source"> <app-store-sessions-chart></app-store-sessions-chart> </app-card> </mat-grid-tile> <!--Table--> <mat-grid-tile [colspan]="( cardLayout | async )?.table.cols" [rowspan]="( cardLayout | async )?.table.rows"> <app-card title="Latest Orders"> <app-orders-table></app-orders-table> </app-card> </mat-grid-tile> </mat-grid-list> </div>

Iată ce conține tabloul de bord rezultat.

tabloul de bord finalizat
Tabloul de bord finalizat (previzualizare mare)

Concluzie

Crearea tablourilor de bord implică o cantitate suficientă de muncă și planificare. O modalitate de a le face mai rapidă este să utilizați diferitele scheme oferite de Angular Material și ng2-charts. Cu aceste scheme, rularea unei comenzi va genera o componentă completă și poate duce la funcționarea destul de rapidă a unui tablou de bord. Acest lucru vă lasă mult mai mult timp pentru a vă concentra pe crearea de servicii de date și adăugarea acestora la componentele tabloului de bord.

Dacă doriți să aflați mai multe despre unele dintre schemele oferite de Angular Material, vizitați material.angular.io, iar pentru cele oferite de ng2-charts, vizitați site-ul lor legat aici.