HTMLcopy
1
<div id="container"></div>
CSScopy
8
1
html,
2
body,
3
#container {
4
width: 100%;
5
height: 100%;
6
margin: 0;
7
padding: 0;
8
}
JavaScriptcopy
x
1
anychart.onDocumentReady(function () {
2
// The data used in this sample can be obtained from the CDN
3
// https://cdn.anychart.com/samples/dashboards/cio-dashboard/data.js
4
var SARawData = getSARawData(); // eslint-disable-line no-undef
5
6
// System Availability accepted values. Columns are: ['System', 'Accepted Availability']
7
var SAAcceptedAvailability = [
8
['Network', 99],
9
['ERP', 98],
10
['Data Warehouse', 98],
11
['Web Site', 98],
12
['Email', 98],
13
['HR', 96],
14
['Problem Tracking', 93]
15
];
16
17
// CPU Capacity % for today. Columns are: ['DateTime', 'Capacity']
18
var HCCPUData = getHCCPUData(); // eslint-disable-line no-undef
19
20
// Storage Capacity % for last 12 month. Columns are: ['Month', 'Capacity']
21
var HCStorage = [
22
[Date.UTC(2013, 10), 61.2],
23
[Date.UTC(2013, 11), 64.1],
24
[Date.UTC(2014, 0), 65.8],
25
[Date.UTC(2014, 1), 67.5],
26
[Date.UTC(2014, 2), 69.0],
27
[Date.UTC(2014, 3), 70.3],
28
[Date.UTC(2014, 4), 71.6],
29
[Date.UTC(2014, 5), 71.4],
30
[Date.UTC(2014, 6), 73.0],
31
[Date.UTC(2014, 7), 73.2],
32
[Date.UTC(2014, 8), 73.8],
33
[Date.UTC(2014, 9), 74.6]
34
];
35
36
// Network Capacity % for last 12 month. Columns are: ['Month', 'Capacity']
37
var HCNetwork = [
38
[Date.UTC(2013, 10), 68.8],
39
[Date.UTC(2013, 11), 72.5],
40
[Date.UTC(2014, 0), 74.1],
41
[Date.UTC(2014, 1), 77.7],
42
[Date.UTC(2014, 2), 85.1],
43
[Date.UTC(2014, 3), 83.0],
44
[Date.UTC(2014, 4), 83.9],
45
[Date.UTC(2014, 5), 79.3],
46
[Date.UTC(2014, 6), 81.7],
47
[Date.UTC(2014, 7), 75.9],
48
[Date.UTC(2014, 8), 79.8],
49
[Date.UTC(2014, 9), 82.8]
50
];
51
52
var HCCPURanges = [0, 80, 90, 100];
53
var HCStorageRanges = [0, 60, 80, 100];
54
var HCNetworkRanges = [0, 60, 80, 100];
55
56
// The data used in this sample can be obtained from the CDN
57
// https://cdn.anychart.com/samples/dashboards/cio-dashboard/data.js
58
// Daily Network Traffic for different periods of time. Columns are ['Hour', 'Average Traffic'].
59
// These data are supposed to be pre-calculated by a server or something else.
60
// DNT for last six month.
61
var DNT6MonthAvgData = getDNT6MonthAvgData(); // eslint-disable-line no-undef
62
var DNTWeekAvgData = getDNTWeekAvgData(); // eslint-disable-line no-undef
63
var DNTYesterdayData = getDNTYesterdayData(); // eslint-disable-line no-undef
64
65
// Key Non-System Metrics report data:
66
// Summary expenses YTD. Columns are ['Month', 'Value'].
67
var KNSMExpensesData = [
68
[Date.UTC(2014, 0), 100000],
69
[Date.UTC(2014, 1), 97000],
70
[Date.UTC(2014, 2), 98000],
71
[Date.UTC(2014, 3), 98000],
72
[Date.UTC(2014, 4), 99000],
73
[Date.UTC(2014, 5), 100000],
74
[Date.UTC(2014, 6), 99000],
75
[Date.UTC(2014, 7), 98000],
76
[Date.UTC(2014, 8), 98000],
77
[Date.UTC(2014, 9), 97000]
78
];
79
80
// Customers satisfaction level YTD. Columns are ['Month', 'Satisfaction level'].
81
var KNSMSatisfactionData = [
82
[Date.UTC(2014, 0), 90],
83
[Date.UTC(2014, 1), 97],
84
[Date.UTC(2014, 2), 98],
85
[Date.UTC(2014, 3), 98],
86
[Date.UTC(2014, 4), 99],
87
[Date.UTC(2014, 5), 100],
88
[Date.UTC(2014, 6), 99],
89
[Date.UTC(2014, 7), 98],
90
[Date.UTC(2014, 8), 98],
91
[Date.UTC(2014, 9), 97]
92
];
93
94
// Level 1 Problems numbers YTD. Columns are ['Month', 'Number of Problems'].
95
var KNSMProblemsData = [
96
[Date.UTC(2014, 0), 45],
97
[Date.UTC(2014, 1), 97],
98
[Date.UTC(2014, 2), 95],
99
[Date.UTC(2014, 3), 87],
100
[Date.UTC(2014, 4), 99],
101
[Date.UTC(2014, 5), 78],
102
[Date.UTC(2014, 6), 99],
103
[Date.UTC(2014, 7), 86],
104
[Date.UTC(2014, 8), 98],
105
[Date.UTC(2014, 9), 97]
106
];
107
var KNSMBudgetTarget = 1175000;
108
var KNSMProblemsTarget = 100;
109
var KNSMExpensesRanges = [0, 90, 110, 150];
110
var KNSMSatisfactionRanges = [150, 100, 80, 0];
111
var KNSMProblemsRanges = [0, 90, 110, 150];
112
113
// Some Major Project Milestones for MPM report. Columns are ['Project', 'Milestone', 'Due date']
114
var MPMData = [
115
['ERP Upgrade', 'Full system test', Date.UTC(2014, 9, 24)],
116
['Add services data to DW', 'ETL coding', Date.UTC(2014, 9, 10)],
117
['Upgrade mainframe OS', 'Prepare plan', Date.UTC(2014, 9, 17)],
118
['Disaster recovery site', 'Install hardware', Date.UTC(2014, 9, 20)],
119
['Budgeting system', 'Hire team', Date.UTC(2014, 9, 2)],
120
['Web site face-lift', 'Move into production', Date.UTC(2014, 9, 22)]
121
];
122
123
// Some Projects for TPQ report. Columns are ['Project', 'Status', 'Funding approved', 'Schedule start']
124
var TPQData = [
125
[
126
'Professional service module',
127
'Pending available staff',
128
true,
129
Date.UTC(2014, 9, 22)
130
],
131
[
132
'Upgrade MS Office',
133
'Cost-benefit analysis',
134
false,
135
Date.UTC(2014, 11, 1)
136
],
137
[
138
'Failover for ERP',
139
'Preparing proposal',
140
false,
141
Date.UTC(2015, 0, 30)
142
],
143
[
144
'Upgrade data warehouse HW',
145
'Evaluating options',
146
true,
147
Date.UTC(2015, 1, 13)
148
],
149
[
150
'Executive dashboard',
151
'Vendor assessment',
152
false,
153
Date.UTC(2015, 4, 2)
154
]
155
];
156
157
// Utility functions for data ->
158
var Today = new Date(Date.UTC(2014, 9, 15));
159
160
var getDiffInDays = function (date1, date2) {
161
function isLeapYear(year) {
162
return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
163
}
164
165
function getNumberOfDaysInMonth(year, month) {
166
switch (month) {
167
case 1:
168
return isLeapYear(year) ? 29 : 28;
169
case 3:
170
case 5:
171
case 8:
172
case 10:
173
return 30;
174
default:
175
}
176
return 31;
177
}
178
179
function getNumberOfDaysInYear(year) {
180
return isLeapYear(year) ? 366 : 365;
181
}
182
183
var sign = 1;
184
if (date1.getTime() > date2.getTime()) {
185
var tmp = date1;
186
date1 = date2;
187
date2 = tmp;
188
sign = -1;
189
}
190
var y1 = date1.getUTCFullYear();
191
var y2 = date2.getUTCFullYear();
192
var m1 = date1.getUTCMonth();
193
var m2 = date2.getUTCMonth();
194
var d1 = date1.getUTCDate();
195
var d2 = date2.getUTCDate();
196
var result = 0;
197
var i;
198
if (y1 < y2) {
199
for (i = y1 + 1; i < y2; i++) result += getNumberOfDaysInYear(i);
200
for (i = m1 + 1; i < 12; i++) { result += getNumberOfDaysInMonth(y1, i); }
201
for (i = 0; i < m2; i++) result += getNumberOfDaysInMonth(y2, i);
202
result += getNumberOfDaysInMonth(y1, m1) - d1;
203
result += d2;
204
} else if (m1 < m2) {
205
for (i = m1 + 1; i < m2; i++) { result += getNumberOfDaysInMonth(y1, i); }
206
result += getNumberOfDaysInMonth(y1, m1) - d1;
207
result += d2;
208
} else {
209
result += d2 - d1;
210
}
211
return result * sign;
212
};
213
214
function filterBySystem(fieldValue) {
215
return function (value) {
216
return fieldValue === value;
217
};
218
}
219
220
// Utility functions for data ->
221
222
// Colors to use
223
var title1FontColor = '#e65100';
224
var title2FontColor = '#e65100';
225
var markerColor = '#e65100';
226
227
var infoFontColor = '#212121';
228
var normalFontColor = '#7c868e';
229
230
var chartColor = '#64b5f6';
231
var chartBulletColor = '#1976d2';
232
var borderColor = '#CECECE';
233
var borderLightColor = '#EAEAEA';
234
var rangeColors = ['#E6E6E6', '#D6D6D6', '#B8B8B8'];
235
236
// Helpers functions
237
function applyTitleCellSettings(cell, fontSize) {
238
if (!fontSize) fontSize = '14px';
239
cell.fontSize(fontSize);
240
cell.fontColor(title2FontColor);
241
}
242
243
function formatDate(value) {
244
var m = value.getMonth() + 1;
245
if (m < 10) m = '0' + m;
246
var d = value.getDate();
247
if (d < 10) d = '0' + d;
248
var y = value.getFullYear() - 2000;
249
return m + '/' + d + '/' + y;
250
}
251
252
function hRect(path, size) {
253
var x = Math.round(size / 2);
254
var y = Math.round(size / 2);
255
var width = size * 0.6;
256
path
257
.clear()
258
.moveTo(x - width / 2, y - 2)
259
.lineTo(x + width / 2, y - 2)
260
.lineTo(x + width / 2, y + 1)
261
.lineTo(x - width / 2, y + 1)
262
.close();
263
}
264
265
function vRect(path, size) {
266
path.clear();
267
var x = Math.round(size / 2);
268
var y = Math.round(size / 2);
269
var height = size * 0.8;
270
path
271
.clear()
272
.moveTo(x - 2, y - height / 2)
273
.lineTo(x - 2, y + height / 2)
274
.lineTo(x + 3, y + height / 2)
275
.lineTo(x + 3, y - height / 2)
276
.close();
277
}
278
279
var getLegend = function (items) {
280
var legend = anychart.standalones.legend();
281
legend
282
.fontSize('11px')
283
.fontFamily('\'Verdana\', Helvetica, Arial, sans-serif')
284
.itemsLayout('horizontal')
285
.fontColor(normalFontColor)
286
.iconTextSpacing(0)
287
.align('right')
288
.position('center-bottom')
289
.padding(0)
290
.margin(0, 0, 7, 0)
291
.itemsSpacing(3)
292
.title(false)
293
.titleSeparator(false)
294
.paginator(false)
295
.background(false)
296
.items(items);
297
return legend;
298
};
299
300
var getBulletChart = function (value, scale, ranges) {
301
var bullet = anychart.bullet([
302
{
303
value: value,
304
type: 'bar',
305
fill: chartBulletColor,
306
gap: 0.7
307
}
308
]);
309
bullet.scale(scale).padding(0, 0, 0, 0).margin(0);
310
bullet.range(0).from(ranges[0]).to(ranges[1]).fill(rangeColors[0]);
311
bullet.range(1).from(ranges[1]).to(ranges[2]).fill(rangeColors[1]);
312
bullet.range(2).from(ranges[2]).to(ranges[3]).fill(rangeColors[2]);
313
bullet
314
.title(false)
315
.width('100%')
316
.height('100%')
317
.margin('30%', 0, '30%', 0)
318
.axis(false)
319
.background(false);
320
return bullet;
321
};
322
323
var getBulletLightChart = function (scale, value, rangeValue) {
324
var bullet = anychart.bullet([
325
{
326
value: value,
327
type: 'line',
328
fill: chartBulletColor,
329
gap: 0.4
330
}
331
]);
332
bullet.scale(scale).padding(0).margin(0);
333
bullet.range(0).from(rangeValue).to(100).fill(rangeColors[1]);
334
bullet
335
.axis(false)
336
.width('100%')
337
.height('100%')
338
.margin('30%', 0, '30%', 0);
339
bullet.background().enabled(true).stroke(rangeColors[1]);
340
return bullet;
341
};
342
343
var getLineChart = function (data, ranges) {
344
var sparkline = anychart.sparkline(data);
345
sparkline.seriesType('line');
346
sparkline.stroke('1.5 ' + chartColor);
347
sparkline.padding(0);
348
if (ranges) {
349
sparkline
350
.rangeMarker(0)
351
.from(ranges[0])
352
.to(ranges[1])
353
.fill(rangeColors[1]);
354
}
355
return sparkline;
356
};
357
358
var getBulletScale = function (min, max) {
359
var bulletScale = anychart.scales.linear();
360
bulletScale.minimum(min).maximum(max);
361
return bulletScale;
362
};
363
364
var getBulletAxis = function (min, max) {
365
var axis = anychart.standalones.axes.linear();
366
axis.orientation('bottom').stroke(borderColor).title(false);
367
axis.scale(getBulletScale(min, max));
368
axis.ticks().stroke(borderColor);
369
axis.minorTicks(false);
370
axis.labels().fontSize('9px').padding(0);
371
return axis;
372
};
373
374
var getNoticeMarkersFactory = function (size) {
375
var markersFactory = anychart.standalones.markersFactory();
376
markersFactory
377
.anchor('center')
378
.position('center')
379
.type('circle')
380
.fill(markerColor)
381
.stroke(null)
382
.size(size);
383
return markersFactory;
384
};
385
386
function calcSum(view, fieldName) {
387
var sum = 0;
388
var iter = view.getIterator();
389
while (iter.advance()) {
390
sum += iter.get(fieldName);
391
}
392
return sum;
393
}
394
395
function getLastFieldValue(view, fieldName) {
396
var iterator = view.getIterator();
397
if (iterator.select(iterator.getRowsCount() - 1)) { return iterator.get(fieldName); }
398
return undefined;
399
}
400
401
function calcAvg(view, fieldName) {
402
return calcSum(view, fieldName) / view.getIterator().getRowsCount();
403
}
404
405
function formatNumber(value, decimalDigits) {
406
return value
407
.toFixed(decimalDigits || 2)
408
.replace(/\d(?=(\d{3})+\.)/g, '$&,');
409
}
410
411
// Drawing parts of dashboard
412
var systemAvailabilityTable = function (
413
rawData,
414
acceptedAvailabilities
415
) {
416
var table = anychart.standalones.table();
417
table.cellBorder(null).fontColor(normalFontColor);
418
var bulletLegend = getLegend([
419
{
420
index: 0,
421
text: 'Actual',
422
iconType: vRect,
423
iconStroke: 'none',
424
iconFill: chartBulletColor
425
},
426
{
427
index: 1,
428
text: 'Acceptable',
429
iconType: vRect,
430
iconStroke: 'none',
431
iconFill: rangeColors[1]
432
}
433
]);
434
var contents = [
435
[
436
'System Availability <span style="color: ' +
437
infoFontColor +
438
'; font-size: 11px;">(last 30 days)</span>',
439
null,
440
null,
441
bulletLegend,
442
null
443
],
444
['Last 12 Month', null, 'System', 'Availability %', null]
445
];
446
447
var rawView = anychart.data.set(rawData).mapAs({
448
System: 0,
449
Availability: 2,
450
x: 1,
451
value: 2
452
});
453
var bulletScale = getBulletScale(85, 100);
454
455
for (var i = 0; i < acceptedAvailabilities.length; i++) {
456
var system = acceptedAvailabilities[i][0];
457
var availability = acceptedAvailabilities[i][1];
458
var systemData = rawView.filter('System', filterBySystem(system));
459
var avgAvailability = calcAvg(systemData, 'Availability');
460
var line = getLineChart(systemData, false);
461
var marker = null;
462
if (avgAvailability < availability) { marker = getNoticeMarkersFactory(5).add(null); }
463
var bullet = getBulletLightChart(
464
bulletScale,
465
avgAvailability,
466
availability
467
);
468
contents.push([
469
line,
470
marker,
471
system,
472
bullet,
473
avgAvailability.toFixed(1) + '%'
474
]);
475
}
476
contents.push([null, null, null, getBulletAxis(0, 100), null]);
477
table.contents(contents).vAlign('middle').fontSize(11);
478
479
var nameCell = table.getCell(0, 0);
480
nameCell.colSpan(3).useHtml(true);
481
applyTitleCellSettings(nameCell);
482
483
var legendCell = table.getCell(0, 3);
484
legendCell.colSpan(2);
485
applyTitleCellSettings(legendCell);
486
487
table.getRow(0).height(30);
488
table
489
.getRow(1)
490
.height(20)
491
.fontColor(infoFontColor)
492
.cellBorder()
493
.bottom('2 ' + borderLightColor);
494
table.getRow(9).height(20);
495
table.getCol(1).width(15).hAlign('center');
496
table.getCol(2).maxWidth(110);
497
table.getCol(4).width(50).hAlign('right');
498
table.getCell(1, 3).colSpan(2).hAlign('right');
499
return table;
500
};
501
502
var hardwareOfCapacityTable = function () {
503
var table = anychart.standalones.table();
504
table.cellBorder(null).fontColor(normalFontColor);
505
var bulletLegend = getLegend([
506
{
507
index: 0,
508
text: 'Actual',
509
iconType: hRect,
510
iconFill: chartBulletColor
511
},
512
{
513
index: 1,
514
text: 'Good',
515
iconType: vRect,
516
iconFill: rangeColors[0]
517
},
518
{
519
index: 2,
520
text: 'Excessive',
521
iconType: vRect,
522
iconFill: rangeColors[1]
523
},
524
{
525
index: 3,
526
text: 'Critical',
527
iconType: vRect,
528
iconFill: rangeColors[2]
529
}
530
]);
531
var lines = [];
532
var bullets = [];
533
var averages = [];
534
var bulletScale = getBulletScale(0, 100);
535
bulletScale.ticks().count(3);
536
bulletScale.minorTicks().count(3);
537
538
for (var i = 0; i < 3; i++) {
539
var data = anychart.data.set(arguments[i]).mapAs();
540
var avg = calcAvg(data, 'value');
541
var ranges = arguments[3 + i];
542
lines.push(getLineChart(data, false));
543
bullets.push(getBulletChart(avg, bulletScale, ranges));
544
averages.push(avg.toFixed() + '%');
545
}
546
547
lines[0].xScale(
548
anychart.scales.dateTime().minimumGap(0).maximumGap(0).ticks([])
549
);
550
var contents = [
551
['Hardware % of Capacity', null, null, bulletLegend, null, null],
552
['CPU', 'Today', lines[0], 'Overall', bullets[0], averages[0]],
553
[
554
'Storage',
555
'Last 12 Months',
556
lines[1],
557
'Today',
558
bullets[1],
559
averages[1]
560
],
561
[
562
'Network',
563
'Last 12 Months',
564
lines[2],
565
'Today',
566
bullets[2],
567
averages[2]
568
]
569
];
570
571
contents.push([null, null, null, null, getBulletAxis(0, 100), null]);
572
table.contents(contents).vAlign('middle').fontSize(11);
573
table
574
.getRow(0)
575
.cellBorder()
576
.bottom('2 ' + borderLightColor);
577
578
var nameCell = table.getCell(0, 0);
579
nameCell.colSpan(3);
580
applyTitleCellSettings(nameCell);
581
var legendCell = table.getCell(0, 3);
582
legendCell.colSpan(3);
583
applyTitleCellSettings(legendCell);
584
585
table.getRow(0).height(30).cellPadding(0);
586
table.getRow(4).height(20);
587
table.getCol(3).hAlign('center');
588
table.getCol(0).maxWidth(60);
589
table.getCol(1).maxWidth(100);
590
table.getCol(3).maxWidth(65);
591
table.getCol(5).width(40).hAlign('right');
592
return table;
593
};
594
595
var DailyOfNetworkTrafficTable = function (
596
sixMonthsData,
597
weekData,
598
yesterdayData
599
) {
600
var chart = anychart.cartesian();
601
chart.palette([rangeColors[1], rangeColors[2], chartColor]);
602
chart.padding(0);
603
chart.crosshair().enabled(true).yLabel().enabled(false);
604
chart.crosshair().yStroke(null).xLabel().enabled(false);
605
chart.tooltip().positionMode('point');
606
chart.interactivity().hoverMode('by-x');
607
chart.tooltip().displayMode('union');
608
var setupLine = function (data, name) {
609
var line = chart.line(data);
610
line.name(name);
611
line.markers(false);
612
line.hovered().markers(false);
613
};
614
setupLine(sixMonthsData, 'Daily mean for last 6 month');
615
setupLine(weekData, 'Daily mean for last 7 days');
616
setupLine(yesterdayData, 'Yesterday');
617
618
var xAxisScale = anychart.scales.dateTime();
619
xAxisScale.minimum(Date.UTC(0, 0, 1, 0));
620
xAxisScale.maximum(Date.UTC(0, 0, 2, 0));
621
xAxisScale.ticks().interval(0, 0, 0, 6);
622
xAxisScale.minorTicks().interval(0, 0, 0, 1);
623
624
var bottomAxis = chart.xAxis(0);
625
bottomAxis
626
.scale(xAxisScale)
627
.staggerMode(false)
628
.overlapMode('allow-overlap');
629
bottomAxis.title(false);
630
bottomAxis.ticks(false);
631
bottomAxis.minorTicks().enabled(false);
632
bottomAxis
633
.minorLabels()
634
.enabled(true)
635
.fontSize(10)
636
.format(function (value) {
637
var date = new Date(value.tickValue);
638
var h = date.getUTCHours() % 12;
639
return h || 12;
640
});
641
bottomAxis
642
.labels()
643
.enabled(true)
644
.fontSize(10)
645
.format(function (value) {
646
var date = new Date(value.tickValue);
647
var hour = date.getUTCHours();
648
var h = hour % 12 || 12;
649
if (hour === 0 && date.getUTCDay() === 1) return h + '\nAM';
650
if (hour === 12) return h + '\nPM';
651
return h;
652
});
653
654
var topAxis = chart.xAxis(1);
655
topAxis.orientation('top');
656
topAxis.ticks().enabled(false);
657
topAxis.minorTicks().enabled(false);
658
topAxis.title().enabled(false);
659
topAxis.labels().enabled(false);
660
topAxis.minorLabels().enabled(false);
661
662
chart.yScale().maximumGap(0).minimumGap(0);
663
var leftAxis = chart.yAxis();
664
leftAxis.title().enabled(false);
665
leftAxis.minorTicks().enabled(false);
666
leftAxis
667
.labels()
668
.fontSize(10)
669
.format(function (value) {
670
return (value.tickValue / 1000).toFixed(0) + 'K';
671
});
672
chart.xGrid().scale(xAxisScale);
673
var legend = chart.legend();
674
legend
675
.enabled(true)
676
.fontSize(10)
677
.fontColor(normalFontColor)
678
.tooltip(false)
679
.align('right')
680
.padding(0)
681
.margin(3, 0, 5);
682
legend.paginator().enabled(false);
683
var contents = [
684
[
685
'Daily Network Traffic <span style="color: ' +
686
infoFontColor +
687
'; font-size: 11px;">(kilobytes)</span>'
688
],
689
[chart]
690
];
691
var table = anychart.standalones.table();
692
table.cellBorder(null).fontColor(normalFontColor);
693
table.contents(contents);
694
var nameCell = table.getCell(0, 0);
695
nameCell.useHtml(true);
696
applyTitleCellSettings(nameCell);
697
table.getRow(0).height(30).cellPadding(0);
698
table
699
.getRow(0)
700
.cellBorder()
701
.bottom('2 ' + borderLightColor);
702
return table;
703
};
704
705
var keyNonSystemMetricTable = function () {
706
var table = anychart.standalones.table();
707
table.cellBorder(null).fontColor(normalFontColor);
708
var bulletLegend = getLegend([
709
{
710
index: 0,
711
text: 'Actual',
712
iconType: hRect,
713
iconFill: chartBulletColor
714
},
715
{
716
index: 1,
717
text: 'Good',
718
iconType: vRect,
719
iconFill: rangeColors[0]
720
},
721
{
722
index: 2,
723
text: 'Excessive',
724
iconType: vRect,
725
iconFill: rangeColors[1]
726
},
727
{
728
index: 3,
729
text: 'Critical',
730
iconType: vRect,
731
iconFill: rangeColors[2]
732
}
733
]);
734
var contents = [
735
['Key Non-System Metrics', null, null, bulletLegend, null],
736
['Year-to-Date', null, 'Metric', '% of Target', 'Actual']
737
];
738
var views = [
739
anychart.data.set(KNSMExpensesData).mapAs(),
740
anychart.data.set(KNSMSatisfactionData).mapAs(),
741
anychart.data.set(KNSMProblemsData).mapAs()
742
];
743
var actualExpenses = calcSum(views[0], 'value');
744
var actualSatisfaction = getLastFieldValue(views[1], 'value');
745
var actualProblems = calcAvg(views[2], 'value');
746
747
var actualValues = [
748
actualExpenses /
749
((KNSMBudgetTarget / (KNSMExpensesData.length * 12)) * 100),
750
actualSatisfaction,
751
actualProblems
752
];
753
var actualTexts = [
754
'$' + formatNumber(actualExpenses / 1000, 1) + 'K',
755
actualSatisfaction + '/100',
756
actualProblems.toFixed(0)
757
];
758
var rangesForLines = [
759
[0, KNSMBudgetTarget / 12],
760
[KNSMSatisfactionRanges[0], KNSMSatisfactionRanges[1]],
761
[
762
KNSMProblemsRanges[0] / (100 * KNSMProblemsTarget),
763
KNSMProblemsRanges[2] / (100 * KNSMProblemsTarget)
764
]
765
];
766
var metrics = [
767
'Expenses YTD',
768
'Customer Satisfaction',
769
'Level 1 Problems'
770
];
771
var rangesList = [
772
KNSMExpensesRanges,
773
KNSMSatisfactionRanges,
774
KNSMProblemsRanges,
775
KNSMBudgetTarget
776
];
777
for (var i = 0; i < 3; i++) {
778
var ranges = rangesList[i];
779
var marker = null;
780
if (
781
actualValues[i] > Math.max(ranges[0], ranges[1]) ||
782
actualValues[i] < Math.min(ranges[0], ranges[1])
783
) { marker = getNoticeMarkersFactory(5).add(null); }
784
contents.push([
785
getLineChart(views[i], rangesForLines[i]),
786
marker,
787
metrics[i],
788
getBulletChart(actualValues[i], getBulletScale(0, 150), ranges),
789
actualTexts[i]
790
]);
791
}
792
contents.push([null, null, null, getBulletAxis(0, 150), null]);
793
794
table.contents(contents).vAlign('middle').fontSize(11);
795
796
var nameCell = table.getCell(0, 0);
797
nameCell.colSpan(3);
798
applyTitleCellSettings(nameCell);
799
800
var legendCell = table.getCell(0, 3);
801
legendCell.colSpan(2);
802
table
803
.getRow(1)
804
.fontColor(infoFontColor)
805
.cellBorder()
806
.bottom('2 ' + borderLightColor);
807
table.getRow(5).height(20);
808
table.getCol(0).cellPadding(['20%', 0, '20%', 0]);
809
table.getRow(0).height(30).cellPadding(0);
810
table.getRow(1).height(20).cellPadding(0);
811
table.getCol(1).width(20).hAlign('center').cellPadding([0, 0, 0, 5]);
812
table.getCol(2).maxWidth(135);
813
table.getCol(4).width(60).hAlign('right');
814
815
return table;
816
};
817
818
var majorProjectMileStonesTable = function () {
819
var table = anychart.standalones.table();
820
table.cellBorder(null).fontColor(normalFontColor).fontSize(11);
821
var contents = [
822
[
823
'Major Project Milestones <span style="color: ' +
824
infoFontColor +
825
'; font-size: 11px;">(by priority)</span>',
826
null,
827
null,
828
null
829
],
830
[null, 'Project', 'Milestone', 'Days Until/Past Due', 'Due Date']
831
];
832
var view = anychart.data
833
.set(MPMData)
834
.mapAs({ Project: [0], Milestone: [1], Due: [2] });
835
var iterator = view.getIterator();
836
837
while (iterator.advance()) {
838
var dueDate = new Date(iterator.get('Due'));
839
var diff = getDiffInDays(Today, dueDate);
840
var bullet = anychart.bullet([
841
{
842
value: diff,
843
type: 'bar',
844
gap: 0.4,
845
fill: diff >= 0 ? rangeColors[1] : chartBulletColor
846
}
847
]);
848
849
bullet.scale(getBulletScale(-20, 20)).padding(0).margin(0);
850
bullet.title().enabled(false);
851
bullet.axis().enabled(false);
852
bullet.background().enabled(false);
853
854
var marker;
855
if (diff <= -10) marker = getNoticeMarkersFactory(5).add(null);
856
else marker = null;
857
contents.push([
858
marker,
859
iterator.get('Project'),
860
iterator.get('Milestone'),
861
bullet,
862
formatDate(dueDate)
863
]);
864
}
865
contents.push([null, null, null, getBulletAxis(-20, 20), null]);
866
table.contents(contents);
867
868
var nameCell = table.getCell(0, 0);
869
nameCell.colSpan(5).hAlign('left').useHtml(true);
870
applyTitleCellSettings(nameCell);
871
872
table.getRow(0).height(30);
873
table
874
.getRow(1)
875
.height(20)
876
.fontColor(infoFontColor)
877
.cellBorder()
878
.bottom('2 ' + borderLightColor);
879
table.getRow(8).height(20);
880
881
table.getCol(0).width(20);
882
table.getCol(2).maxWidth(140);
883
table.getCol(3).maxWidth(130);
884
table.getCol(4).width(70).hAlign('right');
885
return table;
886
};
887
888
var TopProjectInTheQueueTable = function () {
889
var table = anychart.standalones.table(7, 5);
890
table.cellBorder(null).fontColor(normalFontColor).fontSize(11);
891
var contents = [
892
['5 Top Projects in the Queue', null, null, null, null],
893
[null, 'Project', 'Status', 'Approved', 'Sched.Start']
894
];
895
var view = anychart.data.set(TPQData).mapAs({
896
Project: [0],
897
Status: [1],
898
Approved: [2],
899
Start: [3]
900
});
901
var iterator = view.getIterator();
902
for (var i = 0; iterator.advance(); i++) {
903
contents.push([
904
(i + 1).toString(),
905
iterator.get('Project'),
906
iterator.get('Status'),
907
iterator.get('Approved') ? 'X' : null,
908
formatDate(new Date(iterator.get('Start')))
909
]);
910
}
911
var nameCell = table.getCell(0, 0);
912
nameCell.colSpan(5);
913
applyTitleCellSettings(nameCell);
914
table
915
.getRow(1)
916
.height(20)
917
.fontColor(infoFontColor)
918
.cellBorder()
919
.bottom('2 ' + borderLightColor);
920
table.getCol(0).width(20).hAlign('center').cellPadding(0);
921
table.getCol(3).width(85).hAlign('center');
922
table.getCol(4).width(100).hAlign('right');
923
table.getRow(0).height(30).hAlign('left');
924
table.contents(contents);
925
return table;
926
};
927
928
// Drawing dashboard
929
var tableMain;
930
var leftDataTable;
931
var rightDataTable;
932
var wideContents;
933
var slimContents;
934
935
// Creates left inside layout table
936
var drawLeftDataTable = function () {
937
var table = anychart.standalones.table(3, 1);
938
table.contents([
939
[systemAvailabilityTable(SARawData, SAAcceptedAvailability)],
940
[
941
hardwareOfCapacityTable(
942
HCCPUData,
943
HCStorage,
944
HCNetwork,
945
HCCPURanges,
946
HCNetworkRanges,
947
HCStorageRanges
948
)
949
],
950
[
951
DailyOfNetworkTrafficTable(
952
DNT6MonthAvgData,
953
DNTWeekAvgData,
954
DNTYesterdayData
955
)
956
]
957
]);
958
table.cellBorder(null).fontColor(normalFontColor);
959
table.getRow(0).height('45%');
960
table.getRow(1).height('25%');
961
table.getRow(2).height('30%');
962
return table;
963
};
964
965
// Creates right inside layout table
966
var drawRightDataTable = function () {
967
var table = anychart.standalones.table(3, 1);
968
table.contents([
969
[keyNonSystemMetricTable()],
970
[majorProjectMileStonesTable()],
971
[TopProjectInTheQueueTable()]
972
]);
973
table.cellBorder(null).fontColor(normalFontColor);
974
table.getRow(0).height('30%');
975
table.getRow(1).height('37%');
976
table.getRow(2).height('33%');
977
return table;
978
};
979
980
// Draws general layout table in stage
981
var drawMainTable = function () {
982
var stage = acgraph.create('container');
983
tableMain = anychart.standalones.table();
984
tableMain.cellBorder(null).fontColor(normalFontColor);
985
tableMain.container(stage);
986
tableMain.bounds(0, 0, '100%', '100%');
987
988
tableMain.getCol(0).cellPadding(0, 20, 0, 0);
989
tableMain
990
.getCol(1)
991
.cellPadding(0, 0, 0, 20)
992
.hAlign('right')
993
.fontColor(infoFontColor);
994
tableMain.getRow(0).height(20).vAlign('middle');
995
tableMain
996
.getRow(1)
997
.height(30)
998
.vAlign('middle')
999
.cellBorder()
1000
.bottom('4 ' + borderLightColor);
1001
tableMain.getCell(1, 0).fontColor(title1FontColor).fontSize(16);
1002
1003
tableMain.container(stage).draw();
1004
return tableMain;
1005
};
1006
1007
// Creates general layout table with two inside layout tables
1008
var fillInMainTable = function (flag, leftTable, rightTable) {
1009
if (flag === 'wide') {
1010
if (!wideContents) {
1011
wideContents = [
1012
[
1013
'This sample is based on the dashboard sample in "Information Dashboard Design: Displaying Data for At-a-Glance Monitoring" by Stephen Few',
1014
null
1015
],
1016
[
1017
'CIO Dashboard',
1018
'(As of ' +
1019
Today.toLocaleDateString('en-US', {
1020
year: 'numeric',
1021
month: 'long',
1022
day: 'numeric'
1023
}) +
1024
')'
1025
],
1026
[leftTable, rightTable]
1027
];
1028
}
1029
tableMain.contents(wideContents);
1030
var copyrightCell = tableMain.getCell(0, 0);
1031
copyrightCell.colSpan(2);
1032
} else {
1033
if (!slimContents) {
1034
slimContents = [
1035
[
1036
'This sample is based on the dashboard sample in "Information Dashboard Design: Displaying Data for At-a-Glance Monitoring" by Stephen Few'
1037
],
1038
[
1039
'CIO Dashboard (As of ' +
1040
Today.toLocaleDateString('en-US', {
1041
year: 'numeric',
1042
month: 'long',
1043
day: 'numeric'
1044
}) +
1045
')'
1046
],
1047
[leftTable],
1048
[rightTable]
1049
];
1050
}
1051
tableMain.contents(slimContents);
1052
}
1053
};
1054
1055
// Creates general layout tables
1056
tableMain = drawMainTable();
1057
leftDataTable = drawLeftDataTable();
1058
rightDataTable = drawRightDataTable();
1059
if (window.innerWidth > 768) { fillInMainTable('wide', leftDataTable, rightDataTable); }
1060
else {
1061
fillInMainTable('slim', leftDataTable, rightDataTable);
1062
}
1063
1064
// On resize changing layout to mobile version or conversely
1065
window.onresize = function () {
1066
if (tableMain.colsCount() === 1 && window.innerWidth > 767) {
1067
fillInMainTable('wide', leftDataTable, rightDataTable);
1068
} else if (tableMain.colsCount() === 2 && window.innerWidth <= 767) {
1069
fillInMainTable('slim', leftDataTable, rightDataTable);
1070
}
1071
};
1072
});