diff --git a/tools/dashboard/package.json b/tools/dashboard/package.json
index 260fcef43a7..af31d40df74 100644
--- a/tools/dashboard/package.json
+++ b/tools/dashboard/package.json
@@ -20,8 +20,10 @@
"@angular/platform-browser": "^4.2.2",
"@angular/platform-browser-dynamic": "^4.2.2",
"@angular/router": "^4.2.2",
+ "@swimlane/ngx-charts": "^5.3.1",
"angularfire2": "^4.0.0-rc.1",
"core-js": "^2.4.1",
+ "d3": "^4.9.1",
"firebase": "^4.1.2",
"rxjs": "^5.1.0",
"zone.js": "^0.8.12"
diff --git a/tools/dashboard/src/app/dashboard-app.css b/tools/dashboard/src/app/dashboard-app.css
index e69de29bb2d..17b4b6497cb 100644
--- a/tools/dashboard/src/app/dashboard-app.css
+++ b/tools/dashboard/src/app/dashboard-app.css
@@ -0,0 +1,3 @@
+.dashboard-content {
+ margin: 16px;
+}
diff --git a/tools/dashboard/src/app/dashboard-app.html b/tools/dashboard/src/app/dashboard-app.html
index 6e581607a9f..7d15d5f449a 100644
--- a/tools/dashboard/src/app/dashboard-app.html
+++ b/tools/dashboard/src/app/dashboard-app.html
@@ -2,5 +2,6 @@
Angular Material - Board
-
Payload Test Data
-{{ payloads | async | json }}
+
diff --git a/tools/dashboard/src/app/dashboard-module.ts b/tools/dashboard/src/app/dashboard-module.ts
index 4d3b60556ab..a2992a0643d 100644
--- a/tools/dashboard/src/app/dashboard-module.ts
+++ b/tools/dashboard/src/app/dashboard-module.ts
@@ -5,6 +5,9 @@ import {NgModule} from '@angular/core';
import {DashboardApp} from './dashboard-app';
import {environment} from '../environments/environment';
import {MdToolbarModule} from '@angular/material';
+import {NgxChartsModule} from '@swimlane/ngx-charts';
+import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
+import {PayloadChart} from './payload-chart/payload-chart';
@NgModule({
exports: [
@@ -15,13 +18,16 @@ export class DashboardMaterialModule {}
@NgModule({
declarations: [
- DashboardApp
+ DashboardApp,
+ PayloadChart
],
imports: [
BrowserModule,
+ BrowserAnimationsModule,
AngularFireModule.initializeApp(environment.firebase),
AngularFireDatabaseModule,
- DashboardMaterialModule
+ DashboardMaterialModule,
+ NgxChartsModule
],
providers: [],
bootstrap: [DashboardApp]
diff --git a/tools/dashboard/src/app/data-definitions.ts b/tools/dashboard/src/app/data-definitions.ts
index e74b87744c9..4c14fdbf71b 100644
--- a/tools/dashboard/src/app/data-definitions.ts
+++ b/tools/dashboard/src/app/data-definitions.ts
@@ -2,13 +2,13 @@
export interface PayloadResult {
timestamp: number;
// Material bundles
- material_umd: string;
- material_umd_minified_uglify: string;
- material_fesm_2015: string;
- material_fesm_2014: string;
+ material_umd: number;
+ material_umd_minified_uglify: number;
+ material_fesm_2015: number;
+ material_fesm_2014: number;
// CDK bundles
- cdk_umd: string;
- cdk_umd_minified_uglify: string;
- cdk_fesm_2015: string;
- cdk_fesm_2014: string;
+ cdk_umd: number;
+ cdk_umd_minified_uglify: number;
+ cdk_fesm_2015: number;
+ cdk_fesm_2014: number;
}
diff --git a/tools/dashboard/src/app/payload-chart/ngx-definitions.ts b/tools/dashboard/src/app/payload-chart/ngx-definitions.ts
new file mode 100644
index 00000000000..88425217973
--- /dev/null
+++ b/tools/dashboard/src/app/payload-chart/ngx-definitions.ts
@@ -0,0 +1,9 @@
+export interface NgxChartResult {
+ name: string;
+ series: NgxChartItem[];
+}
+
+export interface NgxChartItem {
+ name: Date;
+ value: number|string;
+}
diff --git a/tools/dashboard/src/app/payload-chart/payload-chart.html b/tools/dashboard/src/app/payload-chart/payload-chart.html
new file mode 100644
index 00000000000..a2e715b74e2
--- /dev/null
+++ b/tools/dashboard/src/app/payload-chart/payload-chart.html
@@ -0,0 +1,14 @@
+
+
diff --git a/tools/dashboard/src/app/payload-chart/payload-chart.ts b/tools/dashboard/src/app/payload-chart/payload-chart.ts
new file mode 100644
index 00000000000..05727d7b913
--- /dev/null
+++ b/tools/dashboard/src/app/payload-chart/payload-chart.ts
@@ -0,0 +1,67 @@
+import {ChangeDetectionStrategy, Component, Input} from '@angular/core';
+import {PayloadResult} from '../data-definitions';
+import {NgxChartItem, NgxChartResult} from './ngx-definitions';
+
+@Component({
+ selector: 'payload-chart',
+ templateUrl: './payload-chart.html',
+ changeDetection: ChangeDetectionStrategy.OnPush
+})
+export class PayloadChart {
+
+ /** Color scheme for the payload graph. */
+ colorScheme = {
+ domain: ['#5AA454', '#A10A28', '#C7B42C', '#AAAAAA']
+ };
+
+ /** X-Axis label of the Chart. */
+ xAxisLabel = 'Date';
+
+ /** Y-Axis label of the Chart. */
+ yAxisLabel = 'Payload Size (kb)';
+
+ /** Chart data that is taken by NGX-Charts. */
+ chartData: NgxChartResult[];
+
+ /** Payload data that will be rendered in the chart. */
+ @Input()
+ set data(value: PayloadResult[]) {
+ this.chartData = this.createChartResults(value);
+ }
+
+ /** Creates a list of ngx-chart results of the Payload results. */
+ private createChartResults(data: PayloadResult[]) {
+ if (!data) {
+ return [];
+ }
+
+ // Data snapshot from Firebase is not ordered by timestamp. Before rendering the graph
+ // manually sort the results by their timestamp.
+ data = data.sort((a, b) => a.timestamp < b.timestamp ? -1 : 1);
+
+ const materialChartItems: NgxChartItem[] = [];
+ const cdkChartItems: NgxChartItem[] = [];
+
+ // Walk through every result entry and create a NgxChart item that can be rendered inside of
+ // the linear chart.
+ data.forEach(result => {
+ if (!result.material_fesm_2015 || !result.cdk_fesm_2015) {
+ return;
+ }
+
+ // Convert the timestamp of the payload result into a date because NGX-Charts can group
+ // dates in the x-axis.
+ const date = new Date(result.timestamp);
+
+ materialChartItems.push({ name: date, value: result.material_fesm_2015 });
+ cdkChartItems.push({ name: date, value: result.cdk_fesm_2015 });
+ });
+
+ return [
+ { name: 'Material', series: materialChartItems },
+ { name: 'CDK', series: cdkChartItems }
+ ];
+ }
+
+}
+
diff --git a/tools/dashboard/src/styles.css b/tools/dashboard/src/styles.css
index 4f236538007..62b0318fc4b 100644
--- a/tools/dashboard/src/styles.css
+++ b/tools/dashboard/src/styles.css
@@ -1,4 +1,5 @@
body, html {
margin: 0;
font-family: Roboto, Arial, sans-serif;
+ min-height: 100vh;
}