update and setting
This commit is contained in:
parent
d09fd9f926
commit
91a96d5c16
@ -22,7 +22,7 @@ class Refund
|
|||||||
"seller" => "dedo",
|
"seller" => "dedo",
|
||||||
"total" => "Rp. 11000",
|
"total" => "Rp. 11000",
|
||||||
"date" => "August 19, 2023 ",
|
"date" => "August 19, 2023 ",
|
||||||
"status"=>"Process Refund"
|
"status"=>"Refund Success"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"orderId" => "INV-2313",
|
"orderId" => "INV-2313",
|
||||||
@ -38,7 +38,7 @@ class Refund
|
|||||||
"seller" => "dedo",
|
"seller" => "dedo",
|
||||||
"total" => "Rp. 14000",
|
"total" => "Rp. 14000",
|
||||||
"date" => "July 18, 2023 ",
|
"date" => "July 18, 2023 ",
|
||||||
"status"=>"Process Refund"
|
"status"=>"Refunds Refused"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"orderId" => "INV-9090",
|
"orderId" => "INV-9090",
|
||||||
@ -46,7 +46,7 @@ class Refund
|
|||||||
"seller" => "dado",
|
"seller" => "dado",
|
||||||
"total" => "Rp. 45000",
|
"total" => "Rp. 45000",
|
||||||
"date" => "June 19, 2023 ",
|
"date" => "June 19, 2023 ",
|
||||||
"status"=>"Process Refund"
|
"status"=>"Refunds Refused"
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -10,15 +10,43 @@ class Users
|
|||||||
private static $list_users=[
|
private static $list_users=[
|
||||||
[
|
[
|
||||||
"userId" => "U1290",
|
"userId" => "U1290",
|
||||||
"nik" => "214141413414131414",
|
|
||||||
"fullname" => "Tsalsabila Jilhan Haura",
|
"fullname" => "Tsalsabila Jilhan Haura",
|
||||||
"email" => "jilhanhaura07@gmail.com",
|
"email" => "jilhanhaura07@gmail.com",
|
||||||
"gender" => "Female",
|
"gender" => "Female",
|
||||||
"date" => "August 23, 2023",
|
"date" => "August 23, 2023",
|
||||||
"status" => "Finished"
|
"status" => "Finished"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"userId" => "U4567",
|
||||||
|
"fullname" => "Boncel",
|
||||||
|
"email" => "boncel@gmail.com",
|
||||||
|
"gender" => "Male",
|
||||||
|
"date" => "August 22, 2023",
|
||||||
|
"status" => "Progress"
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
public static function listUsers(){
|
public static function listUsers(){
|
||||||
return self::$list_users;
|
return self::$list_users;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static $detail_user=[
|
||||||
|
[
|
||||||
|
"userId" => "91029138",
|
||||||
|
"nik" => "214141413414131414",
|
||||||
|
"name" => "Jilhan Haura",
|
||||||
|
"gender" => "Female",
|
||||||
|
"religion" => "Muslim",
|
||||||
|
"bloodType" => "AB",
|
||||||
|
"email" => "jilhanhaura07@gmail.com",
|
||||||
|
"phoneNumber" => "08909098102099",
|
||||||
|
"province" => "Sumatera Barat",
|
||||||
|
"city" => "Padang",
|
||||||
|
"district" => "Padang",
|
||||||
|
"village" => "Balai Baru",
|
||||||
|
"detail" => "Jl Simpang komplek polda balai baru"
|
||||||
|
]
|
||||||
|
];
|
||||||
|
public static function detailUser(){
|
||||||
|
return self::$detail_user;
|
||||||
|
}
|
||||||
}
|
}
|
@ -53,18 +53,29 @@ class transaction
|
|||||||
|
|
||||||
private static $detail_transaction=[
|
private static $detail_transaction=[
|
||||||
[
|
[
|
||||||
"tracking_number" => "09102919209",
|
"idTransaction" => "INV-76899",
|
||||||
"orderId" => "INV-9090",
|
"side" =>"SELL",
|
||||||
"status"=>"Pending",
|
"marketPair"=>"IDR",
|
||||||
"estimated" => "June 20, 2023",
|
"email" =>"JilhanHaura07@gmail.com",
|
||||||
"tracking_detail1"=> "August 10: processed payment",
|
"amountTransaction" => "Rp. 900000",
|
||||||
"tracking_detail2"=> "August 12: payment in system",
|
"feeTransaction" =>"10%",
|
||||||
"tracking_detail3"=> "August 14: payment has been received by the seller",
|
"total" => "68,00989.00 IDR",
|
||||||
|
"paymentDetail" => "Bank",
|
||||||
|
"bankName" => "BNI",
|
||||||
|
"accountNumber" => "123",
|
||||||
|
"statusTransaction" => "Success"
|
||||||
|
|
||||||
|
|
||||||
|
// "tracking_number" => "09102919209",
|
||||||
|
// "orderId" => "INV-9090",
|
||||||
|
// "status"=>"Pending",
|
||||||
|
// "estimated" => "June 20, 2023",
|
||||||
|
// "tracking_detail1"=> "August 10: processed payment",
|
||||||
|
// "tracking_detail2"=> "August 12: payment in system",
|
||||||
|
// "tracking_detail3"=> "August 14: payment has been received by the seller",
|
||||||
],
|
],
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
public static function allTransactions()
|
public static function allTransactions()
|
||||||
{
|
{
|
||||||
return self::$list_transaction;
|
return self::$list_transaction;
|
||||||
|
@ -13,7 +13,12 @@ return new class extends Migration
|
|||||||
{
|
{
|
||||||
Schema::create('refunds', function (Blueprint $table) {
|
Schema::create('refunds', function (Blueprint $table) {
|
||||||
$table->id();
|
$table->id();
|
||||||
$table->timestamps();
|
$table->int('orderId');
|
||||||
|
$table->string('customerName');
|
||||||
|
$table->string('sellerName');
|
||||||
|
$table->string('total');
|
||||||
|
$table->timestamps('dueDate');
|
||||||
|
$table->string('status');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1075
package-lock.json
generated
Normal file
1075
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -9,5 +9,8 @@
|
|||||||
"axios": "^1.1.2",
|
"axios": "^1.1.2",
|
||||||
"laravel-vite-plugin": "^0.8.0",
|
"laravel-vite-plugin": "^0.8.0",
|
||||||
"vite": "^4.0.0"
|
"vite": "^4.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"datatables.net-dt": "^1.13.6"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ a:not(.btn-social-icon):not(.btn-social):not(.page-link) .fab {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.bg-primary {
|
.bg-primary {
|
||||||
background-color: #900C3F !important;
|
background-color: #BA2760 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bg-secondary {
|
.bg-secondary {
|
||||||
@ -797,9 +797,9 @@ select.form-control:not([size]):not([multiple]) {
|
|||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.alert.alert-primary {
|
/* .alert.alert-primary {
|
||||||
background-color: #900C3F;
|
background-color: #900C3F;
|
||||||
}
|
} */
|
||||||
|
|
||||||
.alert.alert-secondary {
|
.alert.alert-secondary {
|
||||||
background-color: #cdd3d8;
|
background-color: #cdd3d8;
|
||||||
@ -914,7 +914,13 @@ select.form-control:not([size]):not([multiple]) {
|
|||||||
padding-right: 10px;
|
padding-right: 10px;
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
.card .card-header ul {
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 28px;
|
||||||
|
/* padding-left: 150px; */
|
||||||
|
margin-left: 250px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
.card .card-header h4+.card-header-action,
|
.card .card-header h4+.card-header-action,
|
||||||
.card .card-header h4+.card-header-form {
|
.card .card-header h4+.card-header-form {
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -2331,7 +2337,10 @@ h6 .badge {
|
|||||||
left: 0;
|
left: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 115px;
|
height: 115px;
|
||||||
background-color: #900C3F;
|
/* background-image: url('/public/assets/images/bg-web.png'); */
|
||||||
|
background: rgb(144, 12, 63);
|
||||||
|
/* background: linear-gradient(90deg, rgb(144, 12, 63) 0%, rgb(186, 39, 96) 100%, rgb(161, 9, 73) 100%); */
|
||||||
|
|
||||||
z-index: -1;
|
z-index: -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3058,6 +3067,7 @@ a.bb {
|
|||||||
|
|
||||||
.gradient-bottom {
|
.gradient-bottom {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
height: 550px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.gradient-bottom:after {
|
.gradient-bottom:after {
|
||||||
@ -4208,3 +4218,112 @@ body:not(.sidebar-mini) .sidebar-style-2 .sidebar-menu li.active ul.dropdown-men
|
|||||||
width: 20px;
|
width: 20px;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.table th {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table .th-sort-asc::after {
|
||||||
|
content: "\25b4";
|
||||||
|
}
|
||||||
|
|
||||||
|
.table .th-sort-desc::after {
|
||||||
|
content: "\25be";
|
||||||
|
}
|
||||||
|
|
||||||
|
.table .th-sort-asc::after,
|
||||||
|
.table .th-sort-desc::after {
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table .th-sort-asc,
|
||||||
|
.table .th-sort-desc {
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
/* CSS khusus untuk switch */
|
||||||
|
|
||||||
|
/* For switch styles */
|
||||||
|
.switch {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: 40px;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.switch input {
|
||||||
|
opacity: 0;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider {
|
||||||
|
position: absolute;
|
||||||
|
cursor: pointer;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background-color: #ff5e57;
|
||||||
|
-webkit-transition: .4s;
|
||||||
|
transition: .4s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider:before {
|
||||||
|
position: absolute;
|
||||||
|
content: "";
|
||||||
|
height: 16px;
|
||||||
|
width: 16px;
|
||||||
|
left: 2px;
|
||||||
|
bottom: 2px;
|
||||||
|
background-color: white;
|
||||||
|
-webkit-transition: .4s;
|
||||||
|
transition: .4s;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:checked + .slider {
|
||||||
|
background-color: #32ff7e;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:focus + .slider {
|
||||||
|
box-shadow: 0 0 1px #32ff7e;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:checked + .slider:before {
|
||||||
|
transform: translateX(20px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.round {
|
||||||
|
border-radius: 34px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider.round:before {
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
/* CSS khusus untuk alert */
|
||||||
|
.alert {
|
||||||
|
position: relative;
|
||||||
|
margin-right: 30px;
|
||||||
|
margin-left: 30px;
|
||||||
|
/* margin-bottom: 20px; */
|
||||||
|
border: 1px solid transparent;
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
}
|
||||||
|
.alert-primary {
|
||||||
|
color: #004085;
|
||||||
|
background-color: #cce5ff;
|
||||||
|
border-color: #b8daff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-dismissible {
|
||||||
|
padding-right: 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-close {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
right: 0;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
padding: 0.5rem 1rem;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
BIN
public/assets/images/bg-web.png
Normal file
BIN
public/assets/images/bg-web.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
26
public/assets/images/illustration_backgrounds.svg
Normal file
26
public/assets/images/illustration_backgrounds.svg
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<svg width="1181" height="244" viewBox="0 0 1181 244" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<mask id="mask0_227_12316" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="2" y="2" width="1179" height="242">
|
||||||
|
<path d="M2.8894 2.35156H1181V243.142H2.8894V2.35156Z" fill="white"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask0_227_12316)">
|
||||||
|
<path d="M1047.44 17.0875C1000.64 13.9376 966.174 38.9274 930.591 63.2079C886.889 93.0366 837.228 111.561 782.195 95.7215C733.176 81.6131 695.878 46.0322 650.202 24.7491C604.332 3.37598 549.896 -2.843 499.505 7.53667C471.21 13.3679 444.55 24.1316 417.42 33.3847C286.246 78.1415 140.375 101.152 3.34485 73.9184V242.829H1180.92V49.9374C1119.63 42.2464 1093.74 20.2007 1047.44 17.0875Z" fill="#BA2760"/>
|
||||||
|
</g>
|
||||||
|
<mask id="mask1_227_12316" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="1181" height="244">
|
||||||
|
<path d="M0 0H1181V243.143H0V0Z" fill="white"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask1_227_12316)">
|
||||||
|
<path d="M1180.92 126.055C1120.33 126.752 1051.84 122.492 993.029 113.329C965.292 109.008 937.504 103.523 911.953 92.9371C878.967 79.2697 850.169 57.3029 815.202 48.4247C785.959 40.9983 753.686 43.5951 726.394 55.5754C700.444 66.9659 679.614 86.0914 654.123 98.2813C615.362 116.81 569.504 117.787 525.578 118.34C465.212 119.098 401.172 119.004 349.667 90.7961C299.114 63.1139 263.649 9.92367 205.131 1.54533C167.852 -3.79152 131.066 11.0502 96.9417 25.5134C65.7421 38.7379 34.5466 51.9624 3.34695 65.1869V242.828H-0.0294189H1180.92V126.055Z" fill="#A10949"/>
|
||||||
|
</g>
|
||||||
|
<mask id="mask2_227_12316" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="2" y="66" width="1179" height="178">
|
||||||
|
<path d="M2.8894 66.8062H1181V243.143H2.8894V66.8062Z" fill="white"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask2_227_12316)">
|
||||||
|
<path d="M1176.51 108.389C1149.17 95.7745 1120.38 82.7264 1089.45 79.2549C1056.69 75.5757 1028.02 88.7561 999.993 102.401C940.96 131.14 823.249 186.828 758.371 145.317C742.628 135.248 732.954 119.329 719.086 107.246C618.726 19.8181 495.283 96.471 394.189 134.843C354.655 149.849 310.079 160.625 266.999 154.675C188.409 143.825 117.684 85.5309 3.34485 88.2765V242.828H1180.92V110.624C1179.46 109.804 1177.96 109.056 1176.51 108.389Z" fill="#900C3F"/>
|
||||||
|
</g>
|
||||||
|
<mask id="mask3_227_12316" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="2" y="139" width="1179" height="105">
|
||||||
|
<path d="M2.8894 139.258H1181V243.143H2.8894V139.258Z" fill="white"/>
|
||||||
|
</mask>
|
||||||
|
<g mask="url(#mask3_227_12316)">
|
||||||
|
<path d="M1180.82 213.266C1119.27 219.913 1062.06 182.737 1000.24 178.531C959.072 175.73 918.199 187.734 876.928 186.709C793.596 184.634 716.622 130.023 634.201 141.231C595.196 146.539 560.446 166.221 522.163 174.765C427.877 195.805 331.776 147.074 234.606 146.778C161.556 146.555 74.6445 171.731 3.34485 156.233V242.828H1180.92L1180.82 213.266Z" fill="#900C3F"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.7 KiB |
@ -1,101 +1,118 @@
|
|||||||
"use strict";
|
// Set new default font family and font color to mimic Bootstrap's default styling
|
||||||
|
Chart.defaults.global.defaultFontFamily = 'Nunito', '-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif';
|
||||||
|
Chart.defaults.global.defaultFontColor = '#858796';
|
||||||
|
|
||||||
var statistics_chart = document.getElementById("myChart").getContext('2d');
|
function number_format(number, decimals, dec_point, thousands_sep) {
|
||||||
|
// * example: number_format(1234.56, 2, ',', ' ');
|
||||||
var myChart = new Chart(statistics_chart, {
|
// * return: '1 234,56'
|
||||||
type: 'line',
|
number = (number + '').replace(',', '').replace(' ', '');
|
||||||
data: {
|
var n = !isFinite(+number) ? 0 : +number,
|
||||||
labels: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
|
prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
|
||||||
datasets: [{
|
sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
|
||||||
label: 'Statistics',
|
dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
|
||||||
data: [640, 387, 530, 302, 430, 270, 488],
|
s = '',
|
||||||
borderWidth: 5,
|
toFixedFix = function (n, prec) {
|
||||||
borderColor: '#6777ef',
|
var k = Math.pow(10, prec);
|
||||||
backgroundColor: 'transparent',
|
return '' + Math.round(n * k) / k;
|
||||||
pointBackgroundColor: '#fff',
|
};
|
||||||
pointBorderColor: '#6777ef',
|
// Fix for IE parseFloat(0.55).toFixed(0) = 0;
|
||||||
pointRadius: 4
|
s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
|
||||||
}]
|
if (s[0].length > 3) {
|
||||||
},
|
s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
|
||||||
options: {
|
}
|
||||||
legend: {
|
if ((s[1] || '').length < prec) {
|
||||||
display: false
|
s[1] = s[1] || '';
|
||||||
},
|
s[1] += new Array(prec - s[1].length + 1).join('0');
|
||||||
scales: {
|
}
|
||||||
yAxes: [{
|
return s.join(dec);
|
||||||
gridLines: {
|
|
||||||
display: false,
|
|
||||||
drawBorder: false,
|
|
||||||
},
|
|
||||||
ticks: {
|
|
||||||
stepSize: 150
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
xAxes: [{
|
|
||||||
gridLines: {
|
|
||||||
color: '#fbfbfb',
|
|
||||||
lineWidth: 2
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
},
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#visitorMap').vectorMap(
|
|
||||||
{
|
|
||||||
map: 'world_en',
|
|
||||||
backgroundColor: '#ffffff',
|
|
||||||
borderColor: '#f2f2f2',
|
|
||||||
borderOpacity: .8,
|
|
||||||
borderWidth: 1,
|
|
||||||
hoverColor: '#000',
|
|
||||||
hoverOpacity: .8,
|
|
||||||
color: '#ddd',
|
|
||||||
normalizeFunction: 'linear',
|
|
||||||
selectedRegions: false,
|
|
||||||
showTooltip: true,
|
|
||||||
pins: {
|
|
||||||
id: '<div class="jqvmap-circle"></div>',
|
|
||||||
my: '<div class="jqvmap-circle"></div>',
|
|
||||||
th: '<div class="jqvmap-circle"></div>',
|
|
||||||
sy: '<div class="jqvmap-circle"></div>',
|
|
||||||
eg: '<div class="jqvmap-circle"></div>',
|
|
||||||
ae: '<div class="jqvmap-circle"></div>',
|
|
||||||
nz: '<div class="jqvmap-circle"></div>',
|
|
||||||
tl: '<div class="jqvmap-circle"></div>',
|
|
||||||
ng: '<div class="jqvmap-circle"></div>',
|
|
||||||
si: '<div class="jqvmap-circle"></div>',
|
|
||||||
pa: '<div class="jqvmap-circle"></div>',
|
|
||||||
au: '<div class="jqvmap-circle"></div>',
|
|
||||||
ca: '<div class="jqvmap-circle"></div>',
|
|
||||||
tr: '<div class="jqvmap-circle"></div>',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// weather
|
|
||||||
getWeather();
|
|
||||||
setInterval(getWeather, 600000);
|
|
||||||
|
|
||||||
function getWeather() {
|
|
||||||
$.simpleWeather({
|
|
||||||
location: 'Bogor, Indonesia',
|
|
||||||
unit: 'c',
|
|
||||||
success: function(weather) {
|
|
||||||
var html = '';
|
|
||||||
html += '<div class="weather">';
|
|
||||||
html += '<div class="weather-icon text-primary"><span class="wi wi-yahoo-' + weather.code + '"></span></div>';
|
|
||||||
html += '<div class="weather-desc">';
|
|
||||||
html += '<h4>' + weather.temp + '°' + weather.units.temp + '</h4>';
|
|
||||||
html += '<div class="weather-text">' + weather.currently + '</div>';
|
|
||||||
html += '<ul><li>' + weather.city + ', ' + weather.region + '</li>';
|
|
||||||
html += '<li> <i class="wi wi-strong-wind"></i> ' + weather.wind.speed+' '+weather.units.speed + '</li></ul>';
|
|
||||||
html += '</div>';
|
|
||||||
html += '</div>';
|
|
||||||
|
|
||||||
$("#myWeather").html(html);
|
|
||||||
},
|
|
||||||
error: function(error) {
|
|
||||||
$("#myWeather").html('<div class="alert alert-danger">'+error+'</div>');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Area Chart Example
|
||||||
|
var ctx = document.getElementById("myChart1");
|
||||||
|
var myLineChart = new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
|
||||||
|
datasets: [{
|
||||||
|
label: "Earnings",
|
||||||
|
lineTension: 0.3,
|
||||||
|
backgroundColor: "rgba(78, 115, 223, 0.05)",
|
||||||
|
borderColor: "rgba(78, 115, 223, 1)",
|
||||||
|
pointRadius: 3,
|
||||||
|
pointBackgroundColor: "rgba(78, 115, 223, 1)",
|
||||||
|
pointBorderColor: "rgba(78, 115, 223, 1)",
|
||||||
|
pointHoverRadius: 3,
|
||||||
|
pointHoverBackgroundColor: "rgba(78, 115, 223, 1)",
|
||||||
|
pointHoverBorderColor: "rgba(78, 115, 223, 1)",
|
||||||
|
pointHitRadius: 10,
|
||||||
|
pointBorderWidth: 2,
|
||||||
|
data: [0, 10000, 5000, 15000, 10000, 20000, 15000, 25000, 20000, 30000, 25000, 40000],
|
||||||
|
}],
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
maintainAspectRatio: false,
|
||||||
|
layout: {
|
||||||
|
padding: {
|
||||||
|
left: 10,
|
||||||
|
right: 25,
|
||||||
|
top: 25,
|
||||||
|
bottom: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
time: {
|
||||||
|
unit: 'date'
|
||||||
|
},
|
||||||
|
gridLines: {
|
||||||
|
display: false,
|
||||||
|
drawBorder: false
|
||||||
|
},
|
||||||
|
ticks: {
|
||||||
|
maxTicksLimit: 7
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
ticks: {
|
||||||
|
maxTicksLimit: 5,
|
||||||
|
padding: 10,
|
||||||
|
// Include a dollar sign in the ticks
|
||||||
|
callback: function (value, index, values) {
|
||||||
|
return 'Rp.' + number_format(value);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
gridLines: {
|
||||||
|
color: "rgb(234, 236, 244)",
|
||||||
|
zeroLineColor: "rgb(234, 236, 244)",
|
||||||
|
drawBorder: false,
|
||||||
|
borderDash: [2],
|
||||||
|
zeroLineBorderDash: [2]
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
display: false
|
||||||
|
},
|
||||||
|
tooltips: {
|
||||||
|
backgroundColor: "rgb(255,255,255)",
|
||||||
|
bodyFontColor: "#858796",
|
||||||
|
titleMarginBottom: 10,
|
||||||
|
titleFontColor: '#6e707e',
|
||||||
|
titleFontSize: 14,
|
||||||
|
borderColor: '#dddfeb',
|
||||||
|
borderWidth: 1,
|
||||||
|
xPadding: 15,
|
||||||
|
yPadding: 15,
|
||||||
|
displayColors: false,
|
||||||
|
intersect: false,
|
||||||
|
mode: 'index',
|
||||||
|
caretPadding: 10,
|
||||||
|
callbacks: {
|
||||||
|
label: function (tooltipItem, chart) {
|
||||||
|
var datasetLabel = chart.datasets[tooltipItem.datasetIndex].label || '';
|
||||||
|
return datasetLabel + ': Rp. ' + number_format(tooltipItem.yLabel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
@ -1,62 +1,62 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var ctx = document.getElementById("myChart").getContext('2d');
|
var ctx = document.getElementById("myChart1").getContext('2d');
|
||||||
var myChart = new Chart(ctx, {
|
var myChart = new Chart(ctx, {
|
||||||
type: 'line',
|
type: 'line',
|
||||||
data: {
|
data: {
|
||||||
labels: ["January", "February", "March", "April", "May", "June", "July", "August"],
|
labels: ["January", "February", "March", "April", "May", "June", "July", "August"],
|
||||||
datasets: [{
|
datasets: [{
|
||||||
label: 'Sales',
|
label: 'Sales',
|
||||||
data: [3200, 1800, 4305, 3022, 6310, 5120, 5880, 6154],
|
data: [3200, 1800, 4305, 3022, 6310, 5120, 5880, 6154],
|
||||||
borderWidth: 2,
|
borderWidth: 2,
|
||||||
backgroundColor: 'rgba(63,82,227,.8)',
|
backgroundColor: 'rgba(63,82,227,.8)',
|
||||||
borderWidth: 0,
|
borderWidth: 0,
|
||||||
borderColor: 'transparent',
|
borderColor: 'transparent',
|
||||||
pointBorderWidth: 0,
|
pointBorderWidth: 0,
|
||||||
pointRadius: 3.5,
|
pointRadius: 3.5,
|
||||||
pointBackgroundColor: 'transparent',
|
pointBackgroundColor: 'transparent',
|
||||||
pointHoverBackgroundColor: 'rgba(63,82,227,.8)',
|
pointHoverBackgroundColor: 'rgba(63,82,227,.8)',
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Budget',
|
|
||||||
data: [2207, 3403, 2200, 5025, 2302, 4208, 3880, 4880],
|
|
||||||
borderWidth: 2,
|
|
||||||
backgroundColor: 'rgba(254,86,83,.7)',
|
|
||||||
borderWidth: 0,
|
|
||||||
borderColor: 'transparent',
|
|
||||||
pointBorderWidth: 0 ,
|
|
||||||
pointRadius: 3.5,
|
|
||||||
pointBackgroundColor: 'transparent',
|
|
||||||
pointHoverBackgroundColor: 'rgba(254,86,83,.8)',
|
|
||||||
}]
|
|
||||||
},
|
|
||||||
options: {
|
|
||||||
legend: {
|
|
||||||
display: false
|
|
||||||
},
|
|
||||||
scales: {
|
|
||||||
yAxes: [{
|
|
||||||
gridLines: {
|
|
||||||
// display: false,
|
|
||||||
drawBorder: false,
|
|
||||||
color: '#f2f2f2',
|
|
||||||
},
|
},
|
||||||
ticks: {
|
{
|
||||||
beginAtZero: true,
|
label: 'Budget',
|
||||||
stepSize: 1500,
|
data: [2207, 3403, 2200, 5025, 2302, 4208, 3880, 4880],
|
||||||
callback: function(value, index, values) {
|
borderWidth: 2,
|
||||||
return '$' + value;
|
backgroundColor: 'rgba(254,86,83,.7)',
|
||||||
}
|
borderWidth: 0,
|
||||||
}
|
borderColor: 'transparent',
|
||||||
}],
|
pointBorderWidth: 0,
|
||||||
xAxes: [{
|
pointRadius: 3.5,
|
||||||
gridLines: {
|
pointBackgroundColor: 'transparent',
|
||||||
display: false,
|
pointHoverBackgroundColor: 'rgba(254,86,83,.8)',
|
||||||
tickMarkLength: 15,
|
}]
|
||||||
}
|
|
||||||
}]
|
|
||||||
},
|
},
|
||||||
}
|
options: {
|
||||||
|
legend: {
|
||||||
|
display: false
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
yAxes: [{
|
||||||
|
gridLines: {
|
||||||
|
// display: false,
|
||||||
|
drawBorder: false,
|
||||||
|
color: '#f2f2f2',
|
||||||
|
},
|
||||||
|
ticks: {
|
||||||
|
beginAtZero: true,
|
||||||
|
stepSize: 1500,
|
||||||
|
callback: function (value, index, values) {
|
||||||
|
return '$' + value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
xAxes: [{
|
||||||
|
gridLines: {
|
||||||
|
display: false,
|
||||||
|
tickMarkLength: 15,
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var balance_chart = document.getElementById("balance-chart").getContext('2d');
|
var balance_chart = document.getElementById("balance-chart").getContext('2d');
|
||||||
@ -66,54 +66,54 @@ balance_chart_bg_color.addColorStop(0, 'rgba(63,82,227,.2)');
|
|||||||
balance_chart_bg_color.addColorStop(1, 'rgba(63,82,227,0)');
|
balance_chart_bg_color.addColorStop(1, 'rgba(63,82,227,0)');
|
||||||
|
|
||||||
var myChart = new Chart(balance_chart, {
|
var myChart = new Chart(balance_chart, {
|
||||||
type: 'line',
|
type: 'line',
|
||||||
data: {
|
data: {
|
||||||
labels: ['16-07-2018', '17-07-2018', '18-07-2018', '19-07-2018', '20-07-2018', '21-07-2018', '22-07-2018', '23-07-2018', '24-07-2018', '25-07-2018', '26-07-2018', '27-07-2018', '28-07-2018', '29-07-2018', '30-07-2018', '31-07-2018'],
|
labels: ['16-07-2018', '17-07-2018', '18-07-2018', '19-07-2018', '20-07-2018', '21-07-2018', '22-07-2018', '23-07-2018', '24-07-2018', '25-07-2018', '26-07-2018', '27-07-2018', '28-07-2018', '29-07-2018', '30-07-2018', '31-07-2018'],
|
||||||
datasets: [{
|
datasets: [{
|
||||||
label: 'Balance',
|
label: 'Balance',
|
||||||
data: [50, 61, 80, 50, 72, 52, 60, 41, 30, 45, 70, 40, 93, 63, 50, 62],
|
data: [50, 61, 80, 50, 72, 52, 60, 41, 30, 45, 70, 40, 93, 63, 50, 62],
|
||||||
backgroundColor: balance_chart_bg_color,
|
backgroundColor: balance_chart_bg_color,
|
||||||
borderWidth: 3,
|
borderWidth: 3,
|
||||||
borderColor: 'rgba(63,82,227,1)',
|
borderColor: 'rgba(63,82,227,1)',
|
||||||
pointBorderWidth: 0,
|
pointBorderWidth: 0,
|
||||||
pointBorderColor: 'transparent',
|
pointBorderColor: 'transparent',
|
||||||
pointRadius: 3,
|
pointRadius: 3,
|
||||||
pointBackgroundColor: 'transparent',
|
pointBackgroundColor: 'transparent',
|
||||||
pointHoverBackgroundColor: 'rgba(63,82,227,1)',
|
pointHoverBackgroundColor: 'rgba(63,82,227,1)',
|
||||||
}]
|
}]
|
||||||
},
|
|
||||||
options: {
|
|
||||||
layout: {
|
|
||||||
padding: {
|
|
||||||
bottom: -1,
|
|
||||||
left: -1
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
legend: {
|
options: {
|
||||||
display: false
|
layout: {
|
||||||
},
|
padding: {
|
||||||
scales: {
|
bottom: -1,
|
||||||
yAxes: [{
|
left: -1
|
||||||
gridLines: {
|
}
|
||||||
display: false,
|
|
||||||
drawBorder: false,
|
|
||||||
},
|
},
|
||||||
ticks: {
|
legend: {
|
||||||
beginAtZero: true,
|
display: false
|
||||||
display: false
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
xAxes: [{
|
|
||||||
gridLines: {
|
|
||||||
drawBorder: false,
|
|
||||||
display: false,
|
|
||||||
},
|
},
|
||||||
ticks: {
|
scales: {
|
||||||
display: false
|
yAxes: [{
|
||||||
}
|
gridLines: {
|
||||||
}]
|
display: false,
|
||||||
},
|
drawBorder: false,
|
||||||
}
|
},
|
||||||
|
ticks: {
|
||||||
|
beginAtZero: true,
|
||||||
|
display: false
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
xAxes: [{
|
||||||
|
gridLines: {
|
||||||
|
drawBorder: false,
|
||||||
|
display: false,
|
||||||
|
},
|
||||||
|
ticks: {
|
||||||
|
display: false
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var sales_chart = document.getElementById("sales-chart").getContext('2d');
|
var sales_chart = document.getElementById("sales-chart").getContext('2d');
|
||||||
@ -123,72 +123,72 @@ balance_chart_bg_color.addColorStop(0, 'rgba(63,82,227,.2)');
|
|||||||
balance_chart_bg_color.addColorStop(1, 'rgba(63,82,227,0)');
|
balance_chart_bg_color.addColorStop(1, 'rgba(63,82,227,0)');
|
||||||
|
|
||||||
var myChart = new Chart(sales_chart, {
|
var myChart = new Chart(sales_chart, {
|
||||||
type: 'line',
|
type: 'line',
|
||||||
data: {
|
data: {
|
||||||
labels: ['16-07-2018', '17-07-2018', '18-07-2018', '19-07-2018', '20-07-2018', '21-07-2018', '22-07-2018', '23-07-2018', '24-07-2018', '25-07-2018', '26-07-2018', '27-07-2018', '28-07-2018', '29-07-2018', '30-07-2018', '31-07-2018'],
|
labels: ['16-07-2018', '17-07-2018', '18-07-2018', '19-07-2018', '20-07-2018', '21-07-2018', '22-07-2018', '23-07-2018', '24-07-2018', '25-07-2018', '26-07-2018', '27-07-2018', '28-07-2018', '29-07-2018', '30-07-2018', '31-07-2018'],
|
||||||
datasets: [{
|
datasets: [{
|
||||||
label: 'Sales',
|
label: 'Sales',
|
||||||
data: [70, 62, 44, 40, 21, 63, 82, 52, 50, 31, 70, 50, 91, 63, 51, 60],
|
data: [70, 62, 44, 40, 21, 63, 82, 52, 50, 31, 70, 50, 91, 63, 51, 60],
|
||||||
borderWidth: 2,
|
borderWidth: 2,
|
||||||
backgroundColor: balance_chart_bg_color,
|
backgroundColor: balance_chart_bg_color,
|
||||||
borderWidth: 3,
|
borderWidth: 3,
|
||||||
borderColor: 'rgba(63,82,227,1)',
|
borderColor: 'rgba(63,82,227,1)',
|
||||||
pointBorderWidth: 0,
|
pointBorderWidth: 0,
|
||||||
pointBorderColor: 'transparent',
|
pointBorderColor: 'transparent',
|
||||||
pointRadius: 3,
|
pointRadius: 3,
|
||||||
pointBackgroundColor: 'transparent',
|
pointBackgroundColor: 'transparent',
|
||||||
pointHoverBackgroundColor: 'rgba(63,82,227,1)',
|
pointHoverBackgroundColor: 'rgba(63,82,227,1)',
|
||||||
}]
|
}]
|
||||||
},
|
|
||||||
options: {
|
|
||||||
layout: {
|
|
||||||
padding: {
|
|
||||||
bottom: -1,
|
|
||||||
left: -1
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
legend: {
|
options: {
|
||||||
display: false
|
layout: {
|
||||||
},
|
padding: {
|
||||||
scales: {
|
bottom: -1,
|
||||||
yAxes: [{
|
left: -1
|
||||||
gridLines: {
|
}
|
||||||
display: false,
|
|
||||||
drawBorder: false,
|
|
||||||
},
|
},
|
||||||
ticks: {
|
legend: {
|
||||||
beginAtZero: true,
|
display: false
|
||||||
display: false
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
xAxes: [{
|
|
||||||
gridLines: {
|
|
||||||
drawBorder: false,
|
|
||||||
display: false,
|
|
||||||
},
|
},
|
||||||
ticks: {
|
scales: {
|
||||||
display: false
|
yAxes: [{
|
||||||
}
|
gridLines: {
|
||||||
}]
|
display: false,
|
||||||
},
|
drawBorder: false,
|
||||||
}
|
},
|
||||||
|
ticks: {
|
||||||
|
beginAtZero: true,
|
||||||
|
display: false
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
xAxes: [{
|
||||||
|
gridLines: {
|
||||||
|
drawBorder: false,
|
||||||
|
display: false,
|
||||||
|
},
|
||||||
|
ticks: {
|
||||||
|
display: false
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$("#products-carousel").owlCarousel({
|
$("#products-carousel").owlCarousel({
|
||||||
items: 3,
|
items: 3,
|
||||||
margin: 10,
|
margin: 10,
|
||||||
autoplay: true,
|
autoplay: true,
|
||||||
autoplayTimeout: 5000,
|
autoplayTimeout: 5000,
|
||||||
loop: true,
|
loop: true,
|
||||||
responsive: {
|
responsive: {
|
||||||
0: {
|
0: {
|
||||||
items: 2
|
items: 2
|
||||||
},
|
},
|
||||||
768: {
|
768: {
|
||||||
items: 2
|
items: 2
|
||||||
},
|
},
|
||||||
1200: {
|
1200: {
|
||||||
items: 3
|
items: 3
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
64
public/assets/js/tablesort.js
Normal file
64
public/assets/js/tablesort.js
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/**
|
||||||
|
* Sorts a HTML table.
|
||||||
|
*
|
||||||
|
* @param {HTMLTableElement} table The table to sort
|
||||||
|
* @param {number} column The index of the column to sort
|
||||||
|
* @param {boolean} asc Determines if the sorting will be in ascending
|
||||||
|
*/
|
||||||
|
// function sortTableByColumn(table, column, asc = true) {
|
||||||
|
// const dirModifier = asc ? 1 : -1;
|
||||||
|
// const tBody = table.tBodies[0];
|
||||||
|
// const rows = Array.from(tBody.querySelectorAll("tr"));
|
||||||
|
|
||||||
|
// // Sort each row
|
||||||
|
// const sortedRows = rows.sort((a, b) => {
|
||||||
|
// const aColText = a.querySelector(`td:nth-child(${column + 1})`).textContent.trim();
|
||||||
|
// const bColText = b.querySelector(`td:nth-child(${column + 1})`).textContent.trim();
|
||||||
|
|
||||||
|
// return aColText > bColText ? (1 * dirModifier) : (-1 * dirModifier);
|
||||||
|
// });
|
||||||
|
|
||||||
|
// // Remove all existing TRs from the table
|
||||||
|
// while (tBody.firstChild) {
|
||||||
|
// tBody.removeChild(tBody.firstChild);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // Re-add the newly sorted rows
|
||||||
|
// tBody.append(...sortedRows);
|
||||||
|
|
||||||
|
// // Remember how the column is currently sorted
|
||||||
|
// table.querySelectorAll("th").forEach(th => th.classList.remove("th-sort-asc", "th-sort-desc"));
|
||||||
|
// table.querySelector(`th:nth-child(${column + 1})`).classList.toggle("th-sort-asc", asc);
|
||||||
|
// table.querySelector(`th:nth-child(${column + 1})`).classList.toggle("th-sort-desc", !asc);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// document.querySelectorAll(".table th").forEach(headerCell => {
|
||||||
|
// headerCell.addEventListener("click", () => {
|
||||||
|
// const tableElement = headerCell.parentElement.parentElement.parentElement;
|
||||||
|
// const headerIndex = Array.prototype.indexOf.call(headerCell.parentElement.children, headerCell);
|
||||||
|
// const currentIsAscending = headerCell.classList.contains("th-sort-asc");
|
||||||
|
|
||||||
|
// sortTableByColumn(tableElement, headerIndex, !currentIsAscending);
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
|
||||||
|
function sortTable(n) {
|
||||||
|
var table = document.querySelector('#table'),
|
||||||
|
thead = document.querySelector('thead'),
|
||||||
|
tbody = table.querySelector('tbody'),
|
||||||
|
bRows = [...tbody.rows],
|
||||||
|
desc = false;
|
||||||
|
tbody.innerHTML = '';
|
||||||
|
|
||||||
|
bRows.sort((a, b) => {
|
||||||
|
console.log(a, b.innerHTML);
|
||||||
|
let x = a.getElementsByTagName('td')[n].innerHTML.toLowerCase(),
|
||||||
|
y = b.getElementsByTagName('td')[n].innerHTML.toLowerCase();
|
||||||
|
return x < y ? -1 : 1;
|
||||||
|
});
|
||||||
|
bRows.map((bRows) => {
|
||||||
|
// tbody.appendChild(bRows);
|
||||||
|
console.log(bRows.innerHTML);
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
23
public/vendors/Chart.js/.bower.json
vendored
Normal file
23
public/vendors/Chart.js/.bower.json
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "Chart.js",
|
||||||
|
"version": "2.1.4",
|
||||||
|
"description": "Simple HTML5 Charts using the canvas element",
|
||||||
|
"homepage": "https://github.com/chartjs/Chart.js",
|
||||||
|
"author": "nnnick",
|
||||||
|
"license": "MIT",
|
||||||
|
"main": [
|
||||||
|
"dist/Chart.js"
|
||||||
|
],
|
||||||
|
"devDependencies": {
|
||||||
|
"jquery": "~2.1.4"
|
||||||
|
},
|
||||||
|
"_release": "2.1.4",
|
||||||
|
"_resolution": {
|
||||||
|
"type": "version",
|
||||||
|
"tag": "v2.1.4",
|
||||||
|
"commit": "40d76b6a7ba14aeac69b05ad15d713c3402867b2"
|
||||||
|
},
|
||||||
|
"_source": "https://github.com/nnnick/Chart.js.git",
|
||||||
|
"_target": "^2.0.2",
|
||||||
|
"_originalSource": "Chart.js"
|
||||||
|
}
|
18
public/vendors/Chart.js/.codeclimate.yml
vendored
Normal file
18
public/vendors/Chart.js/.codeclimate.yml
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
engines:
|
||||||
|
duplication:
|
||||||
|
enabled: true
|
||||||
|
config:
|
||||||
|
languages:
|
||||||
|
- javascript
|
||||||
|
eslint:
|
||||||
|
enabled: true
|
||||||
|
fixme:
|
||||||
|
enabled: true
|
||||||
|
ratings:
|
||||||
|
paths:
|
||||||
|
- "src/**/*.js"
|
||||||
|
exclude_paths:
|
||||||
|
- dist/**/*
|
||||||
|
- node_modules/**/*
|
||||||
|
- test/**/*
|
||||||
|
- coverage/**/*
|
10
public/vendors/Chart.js/.editorconfig
vendored
Normal file
10
public/vendors/Chart.js/.editorconfig
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# http://editorconfig.org
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = false
|
1
public/vendors/Chart.js/.eslintignore
vendored
Normal file
1
public/vendors/Chart.js/.eslintignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
**/*{.,-}min.js
|
213
public/vendors/Chart.js/.eslintrc
vendored
Normal file
213
public/vendors/Chart.js/.eslintrc
vendored
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
ecmaFeatures:
|
||||||
|
modules: true
|
||||||
|
jsx: true
|
||||||
|
|
||||||
|
env:
|
||||||
|
amd: true
|
||||||
|
browser: true
|
||||||
|
es6: true
|
||||||
|
jquery: true
|
||||||
|
node: true
|
||||||
|
|
||||||
|
# http://eslint.org/docs/rules/
|
||||||
|
rules:
|
||||||
|
# Possible Errors
|
||||||
|
comma-dangle: [2, never]
|
||||||
|
no-cond-assign: 2
|
||||||
|
no-console: 0
|
||||||
|
no-constant-condition: 2
|
||||||
|
no-control-regex: 2
|
||||||
|
no-debugger: 2
|
||||||
|
no-dupe-args: 2
|
||||||
|
no-dupe-keys: 2
|
||||||
|
no-duplicate-case: 2
|
||||||
|
no-empty: 2
|
||||||
|
no-empty-character-class: 2
|
||||||
|
no-ex-assign: 2
|
||||||
|
no-extra-boolean-cast: 2
|
||||||
|
no-extra-parens: 0
|
||||||
|
no-extra-semi: 2
|
||||||
|
no-func-assign: 2
|
||||||
|
no-inner-declarations: [2, functions]
|
||||||
|
no-invalid-regexp: 2
|
||||||
|
no-irregular-whitespace: 2
|
||||||
|
no-negated-in-lhs: 2
|
||||||
|
no-obj-calls: 2
|
||||||
|
no-regex-spaces: 2
|
||||||
|
no-sparse-arrays: 2
|
||||||
|
no-unexpected-multiline: 2
|
||||||
|
no-unreachable: 2
|
||||||
|
use-isnan: 2
|
||||||
|
valid-jsdoc: 0
|
||||||
|
valid-typeof: 2
|
||||||
|
|
||||||
|
# Best Practices
|
||||||
|
accessor-pairs: 2
|
||||||
|
block-scoped-var: 0
|
||||||
|
complexity: [2, 6]
|
||||||
|
consistent-return: 0
|
||||||
|
curly: 0
|
||||||
|
default-case: 0
|
||||||
|
dot-location: 0
|
||||||
|
dot-notation: 0
|
||||||
|
eqeqeq: 2
|
||||||
|
guard-for-in: 2
|
||||||
|
no-alert: 2
|
||||||
|
no-caller: 2
|
||||||
|
no-case-declarations: 2
|
||||||
|
no-div-regex: 2
|
||||||
|
no-else-return: 0
|
||||||
|
no-empty-label: 2
|
||||||
|
no-empty-pattern: 2
|
||||||
|
no-eq-null: 2
|
||||||
|
no-eval: 2
|
||||||
|
no-extend-native: 2
|
||||||
|
no-extra-bind: 2
|
||||||
|
no-fallthrough: 2
|
||||||
|
no-floating-decimal: 0
|
||||||
|
no-implicit-coercion: 0
|
||||||
|
no-implied-eval: 2
|
||||||
|
no-invalid-this: 0
|
||||||
|
no-iterator: 2
|
||||||
|
no-labels: 0
|
||||||
|
no-lone-blocks: 2
|
||||||
|
no-loop-func: 2
|
||||||
|
no-magic-number: 0
|
||||||
|
no-multi-spaces: 0
|
||||||
|
no-multi-str: 0
|
||||||
|
no-native-reassign: 2
|
||||||
|
no-new-func: 2
|
||||||
|
no-new-wrappers: 2
|
||||||
|
no-new: 2
|
||||||
|
no-octal-escape: 2
|
||||||
|
no-octal: 2
|
||||||
|
no-proto: 2
|
||||||
|
no-redeclare: 2
|
||||||
|
no-return-assign: 2
|
||||||
|
no-script-url: 2
|
||||||
|
no-self-compare: 2
|
||||||
|
no-sequences: 0
|
||||||
|
no-throw-literal: 0
|
||||||
|
no-unused-expressions: 2
|
||||||
|
no-useless-call: 2
|
||||||
|
no-useless-concat: 2
|
||||||
|
no-void: 2
|
||||||
|
no-warning-comments: 0
|
||||||
|
no-with: 2
|
||||||
|
radix: 2
|
||||||
|
vars-on-top: 0
|
||||||
|
wrap-iife: 2
|
||||||
|
yoda: 0
|
||||||
|
|
||||||
|
# Strict
|
||||||
|
strict: 0
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
init-declarations: 0
|
||||||
|
no-catch-shadow: 2
|
||||||
|
no-delete-var: 2
|
||||||
|
no-label-var: 2
|
||||||
|
no-shadow-restricted-names: 2
|
||||||
|
no-shadow: 0
|
||||||
|
no-undef-init: 2
|
||||||
|
no-undef: 0
|
||||||
|
no-undefined: 0
|
||||||
|
no-unused-vars: 0
|
||||||
|
no-use-before-define: 0
|
||||||
|
|
||||||
|
# Node.js and CommonJS
|
||||||
|
callback-return: 2
|
||||||
|
global-require: 2
|
||||||
|
handle-callback-err: 2
|
||||||
|
no-mixed-requires: 0
|
||||||
|
no-new-require: 0
|
||||||
|
no-path-concat: 2
|
||||||
|
no-process-exit: 2
|
||||||
|
no-restricted-modules: 0
|
||||||
|
no-sync: 0
|
||||||
|
|
||||||
|
# Stylistic Issues
|
||||||
|
array-bracket-spacing: 0
|
||||||
|
block-spacing: 0
|
||||||
|
brace-style: 0
|
||||||
|
camelcase: 0
|
||||||
|
comma-spacing: 0
|
||||||
|
comma-style: 0
|
||||||
|
computed-property-spacing: 0
|
||||||
|
consistent-this: 0
|
||||||
|
eol-last: 0
|
||||||
|
func-names: 0
|
||||||
|
func-style: 0
|
||||||
|
id-length: 0
|
||||||
|
id-match: 0
|
||||||
|
indent: 0
|
||||||
|
jsx-quotes: 0
|
||||||
|
key-spacing: 0
|
||||||
|
linebreak-style: 0
|
||||||
|
lines-around-comment: 0
|
||||||
|
max-depth: 0
|
||||||
|
max-len: 0
|
||||||
|
max-nested-callbacks: 0
|
||||||
|
max-params: 0
|
||||||
|
max-statements: [2, 30]
|
||||||
|
new-cap: 0
|
||||||
|
new-parens: 0
|
||||||
|
newline-after-var: 0
|
||||||
|
no-array-constructor: 0
|
||||||
|
no-bitwise: 0
|
||||||
|
no-continue: 0
|
||||||
|
no-inline-comments: 0
|
||||||
|
no-lonely-if: 0
|
||||||
|
no-mixed-spaces-and-tabs: 0
|
||||||
|
no-multiple-empty-lines: 0
|
||||||
|
no-negated-condition: 0
|
||||||
|
no-nested-ternary: 0
|
||||||
|
no-new-object: 0
|
||||||
|
no-plusplus: 0
|
||||||
|
no-restricted-syntax: 0
|
||||||
|
no-spaced-func: 0
|
||||||
|
no-ternary: 0
|
||||||
|
no-trailing-spaces: 0
|
||||||
|
no-underscore-dangle: 0
|
||||||
|
no-unneeded-ternary: 0
|
||||||
|
object-curly-spacing: 0
|
||||||
|
one-var: 0
|
||||||
|
operator-assignment: 0
|
||||||
|
operator-linebreak: 0
|
||||||
|
padded-blocks: 0
|
||||||
|
quote-props: 0
|
||||||
|
quotes: 0
|
||||||
|
require-jsdoc: 0
|
||||||
|
semi-spacing: 0
|
||||||
|
semi: 0
|
||||||
|
sort-vars: 0
|
||||||
|
space-after-keywords: 0
|
||||||
|
space-before-blocks: 0
|
||||||
|
space-before-function-paren: 0
|
||||||
|
space-before-keywords: 0
|
||||||
|
space-in-parens: 0
|
||||||
|
space-infix-ops: 0
|
||||||
|
space-return-throw-case: 0
|
||||||
|
space-unary-ops: 0
|
||||||
|
spaced-comment: 0
|
||||||
|
wrap-regex: 0
|
||||||
|
|
||||||
|
# ECMAScript 6
|
||||||
|
arrow-body-style: 0
|
||||||
|
arrow-parens: 0
|
||||||
|
arrow-spacing: 0
|
||||||
|
constructor-super: 0
|
||||||
|
generator-star-spacing: 0
|
||||||
|
no-arrow-condition: 0
|
||||||
|
no-class-assign: 0
|
||||||
|
no-const-assign: 0
|
||||||
|
no-dupe-class-members: 0
|
||||||
|
no-this-before-super: 0
|
||||||
|
no-var: 0
|
||||||
|
object-shorthand: 0
|
||||||
|
prefer-arrow-callback: 0
|
||||||
|
prefer-const: 0
|
||||||
|
prefer-reflect: 0
|
||||||
|
prefer-spread: 0
|
||||||
|
prefer-template: 0
|
||||||
|
require-yield: 0
|
2
public/vendors/Chart.js/.github/ISSUE_TEMPLATE.md
vendored
Normal file
2
public/vendors/Chart.js/.github/ISSUE_TEMPLATE.md
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
- [ ] I have read the [guidelines for contributing](https://github.com/chartjs/Chart.js/blob/master/CONTRIBUTING.md)
|
||||||
|
- [ ] I have included an example of my issue on a website such as [JS Bin](http://jsbin.com/), [JS Fiddle](http://jsfiddle.net/), or [Codepen](http://codepen.io/pen/). ([Template](http://codepen.io/pen?template=JXVYzq))
|
2
public/vendors/Chart.js/.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
2
public/vendors/Chart.js/.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
- [ ] I have read the [guidelines for contributing](https://github.com/chartjs/Chart.js/blob/master/CONTRIBUTING.md)
|
||||||
|
- [ ] I have included an example of my changes on a website such as [JS Bin](http://jsbin.com/), [JS Fiddle](http://jsfiddle.net/), or [Codepen](http://codepen.io/pen/). ([Template](http://codepen.io/pen?template=JXVYzq))
|
13
public/vendors/Chart.js/.gitignore
vendored
Normal file
13
public/vendors/Chart.js/.gitignore
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
node_modules/*
|
||||||
|
custom/*
|
||||||
|
|
||||||
|
docs/index.md
|
||||||
|
|
||||||
|
bower_components/
|
||||||
|
|
||||||
|
coverage/*
|
||||||
|
.idea
|
||||||
|
nbproject/*
|
30
public/vendors/Chart.js/.travis.yml
vendored
Normal file
30
public/vendors/Chart.js/.travis.yml
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
language: node_js
|
||||||
|
node_js:
|
||||||
|
- "5.10"
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- "export CHROME_BIN=/usr/bin/google-chrome"
|
||||||
|
- "export DISPLAY=:99.0"
|
||||||
|
- "sh -e /etc/init.d/xvfb start"
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- npm install
|
||||||
|
|
||||||
|
script:
|
||||||
|
- gulp test
|
||||||
|
- gulp coverage
|
||||||
|
- cat ./coverage/lcov.info | ./node_modules/.bin/coveralls
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
slack: chartjs:pcfCZR6ugg5TEcaLtmIfQYuA
|
||||||
|
|
||||||
|
sudo: required
|
||||||
|
dist: trusty
|
||||||
|
|
||||||
|
addons:
|
||||||
|
firefox: latest
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- google-chrome
|
||||||
|
packages:
|
||||||
|
- google-chrome-stable
|
64
public/vendors/Chart.js/CONTRIBUTING.md
vendored
Normal file
64
public/vendors/Chart.js/CONTRIBUTING.md
vendored
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
Contributing to Chart.js
|
||||||
|
========================
|
||||||
|
|
||||||
|
Contributions to Chart.js are welcome and encouraged, but please have a look through the guidelines in this document before raising an issue, or writing code for the project.
|
||||||
|
|
||||||
|
|
||||||
|
Using issues
|
||||||
|
------------
|
||||||
|
|
||||||
|
The [issue tracker](https://github.com/chartjs/Chart.js/issues) is the preferred channel for reporting bugs, requesting new features and submitting pull requests.
|
||||||
|
|
||||||
|
If you're suggesting a new chart type, please take a look at [writing new chart types](https://github.com/chartjs/Chart.js/blob/master/docs/07-Advanced.md#writing-new-chart-types) in the documentation or consider [creating a plugin](https://github.com/chartjs/Chart.js/blob/master/docs/07-Advanced.md#creating-plugins).
|
||||||
|
|
||||||
|
To keep the library lightweight for everyone, it's unlikely we'll add many more chart types to the core of Chart.js, but issues are a good medium to design and spec out how new chart types could work and look.
|
||||||
|
|
||||||
|
Please do not use issues for support requests. For help using Chart.js, please take a look at the [`chartjs`](http://stackoverflow.com/questions/tagged/chartjs) tag on Stack Overflow.
|
||||||
|
|
||||||
|
|
||||||
|
Reporting bugs
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Well structured, detailed bug reports are hugely valuable for the project.
|
||||||
|
|
||||||
|
Guidlines for reporting bugs:
|
||||||
|
|
||||||
|
- Check the issue search to see if it has already been reported
|
||||||
|
- Isolate the problem to a simple test case
|
||||||
|
- Provide a demonstration of the problem on [JS Bin](http://jsbin.com) or similar
|
||||||
|
|
||||||
|
Please provide any additional details associated with the bug, if it's browser or screen density specific, or only happens with a certain configuration or data.
|
||||||
|
|
||||||
|
|
||||||
|
Local development
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Run `npm install` to install all the libraries, then run `gulp dev --test` to build and run tests as you make changes.
|
||||||
|
|
||||||
|
|
||||||
|
Pull requests
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Clear, concise pull requests are excellent at continuing the project's community driven growth. But please review [these guidelines](https://github.com/blog/1943-how-to-write-the-perfect-pull-request) and the guidelines below before starting work on the project.
|
||||||
|
|
||||||
|
Be advised that **Chart.js 1.0.2 is in feature-complete status**. Pull requests adding new features to the 1.x branch will be disregarded.
|
||||||
|
|
||||||
|
Guidelines:
|
||||||
|
|
||||||
|
- Please create an issue first:
|
||||||
|
- For bugs, we can discuss the fixing approach
|
||||||
|
- For enhancements, we can discuss if it is within the project scope and avoid duplicate effort
|
||||||
|
- Please make changes to the files in [`/src`](https://github.com/chartjs/Chart.js/tree/master/src), not `Chart.js` or `Chart.min.js` in the repo root directory, this avoids merge conflicts
|
||||||
|
- Tabs for indentation, not spaces please
|
||||||
|
- If adding new functionality, please also update the relevant `.md` file in [`/docs`](https://github.com/chartjs/Chart.js/tree/master/docs)
|
||||||
|
- Please make your commits in logical sections with clear commit messages
|
||||||
|
|
||||||
|
Joining the project
|
||||||
|
-------------
|
||||||
|
- Active committers and contributors are invited to introduce yourself and request commit access to this project. Please send an email to hello@nickdownie.com or file an issue.
|
||||||
|
- We have a very active Slack community that you can join at https://chartjs-slack-automation.herokuapp.com. If you think you can help, we'd love to have you!
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
By contributing your code, you agree to license your contribution under the [MIT license](https://github.com/chartjs/Chart.js/blob/master/LICENSE.md).
|
8
public/vendors/Chart.js/LICENSE.md
vendored
Normal file
8
public/vendors/Chart.js/LICENSE.md
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
Copyright (c) 2013-2016 Nick Downie
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
38
public/vendors/Chart.js/README.md
vendored
Normal file
38
public/vendors/Chart.js/README.md
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# Chart.js
|
||||||
|
|
||||||
|
[](https://travis-ci.org/chartjs/Chart.js) [](https://codeclimate.com/github/nnnick/Chart.js) [](https://coveralls.io/github/chartjs/Chart.js?branch=master)
|
||||||
|
|
||||||
|
[](https://chartjs-slack-automation.herokuapp.com/)
|
||||||
|
|
||||||
|
*Simple HTML5 Charts using the canvas element* [chartjs.org](http://www.chartjs.org)
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
To download a zip, go to the Chart.js on Github
|
||||||
|
|
||||||
|
To install via npm / bower:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install chart.js --save
|
||||||
|
bower install Chart.js --save
|
||||||
|
```
|
||||||
|
CDN: https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.4/Chart.min.js
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
You can find documentation at [www.chartjs.org/docs](http://www.chartjs.org/docs). The markdown files that build the site are available under `/docs`. Previous version documentation is available at [www.chartjs.org/docs/#notes-previous-versions](http://www.chartjs.org/docs/#notes-previous-versions).
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Before submitting an issue or a pull request to the project, please take a moment to look over the [contributing guidelines](https://github.com/chartjs/Chart.js/blob/master/CONTRIBUTING.md) first.
|
||||||
|
|
||||||
|
For support using Chart.js, please post questions with the [`chartjs` tag on Stack Overflow](http://stackoverflow.com/questions/tagged/chartjs).
|
||||||
|
|
||||||
|
## Building and Testing
|
||||||
|
`gulp build`, `gulp test`
|
||||||
|
|
||||||
|
Thanks to [BrowserStack](https://browserstack.com) for allowing our team to test on thousands of browsers.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Chart.js is available under the [MIT license](http://opensource.org/licenses/MIT).
|
14
public/vendors/Chart.js/bower.json
vendored
Normal file
14
public/vendors/Chart.js/bower.json
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "Chart.js",
|
||||||
|
"version": "2.1.4",
|
||||||
|
"description": "Simple HTML5 Charts using the canvas element",
|
||||||
|
"homepage": "https://github.com/chartjs/Chart.js",
|
||||||
|
"author": "nnnick",
|
||||||
|
"license": "MIT",
|
||||||
|
"main": [
|
||||||
|
"dist/Chart.js"
|
||||||
|
],
|
||||||
|
"devDependencies": {
|
||||||
|
"jquery": "~2.1.4"
|
||||||
|
}
|
||||||
|
}
|
26
public/vendors/Chart.js/composer.json
vendored
Normal file
26
public/vendors/Chart.js/composer.json
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"name": "nnnick/chartjs",
|
||||||
|
"type": "library",
|
||||||
|
"description": "Simple HTML5 charts using the canvas element.",
|
||||||
|
"keywords": [
|
||||||
|
"chart",
|
||||||
|
"js"
|
||||||
|
],
|
||||||
|
"homepage": "http://www.chartjs.org/",
|
||||||
|
"license": "MIT",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "NICK DOWNIE",
|
||||||
|
"email": "hello@nickdownie.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"minimum-stability": "stable",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"release/2.0": "v2.0-dev"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
4
public/vendors/Chart.js/config.jshintrc
vendored
Normal file
4
public/vendors/Chart.js/config.jshintrc
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"node": true,
|
||||||
|
"predef": [ "require", "module" ]
|
||||||
|
}
|
13946
public/vendors/Chart.js/dist/Chart.bundle.js
vendored
Normal file
13946
public/vendors/Chart.js/dist/Chart.bundle.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
16
public/vendors/Chart.js/dist/Chart.bundle.min.js
vendored
Normal file
16
public/vendors/Chart.js/dist/Chart.bundle.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
9907
public/vendors/Chart.js/dist/Chart.js
vendored
Normal file
9907
public/vendors/Chart.js/dist/Chart.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
14
public/vendors/Chart.js/dist/Chart.min.js
vendored
Normal file
14
public/vendors/Chart.js/dist/Chart.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
120
public/vendors/Chart.js/docs/00-Getting-Started.md
vendored
Normal file
120
public/vendors/Chart.js/docs/00-Getting-Started.md
vendored
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
---
|
||||||
|
title: Getting started
|
||||||
|
anchor: getting-started
|
||||||
|
---
|
||||||
|
|
||||||
|
### Download Chart.js
|
||||||
|
|
||||||
|
To download a zip, go to [Chart.js on Github](https://github.com/chartjs/Chart.js) and choose the version that is right for your application.
|
||||||
|
* [Standard build](https://raw.githubusercontent.com/chartjs/Chart.js/master/dist/Chart.js) (~31kB gzipped)
|
||||||
|
* [Bundled with Moment.js](https://raw.githubusercontent.com/chartjs/Chart.js/master/dist/Chart.bundle.js) (~45kB gzipped)
|
||||||
|
* [CDN Versions](https://cdnjs.com/libraries/Chart.js)
|
||||||
|
|
||||||
|
To install via npm / bower:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install chart.js --save
|
||||||
|
```
|
||||||
|
```bash
|
||||||
|
bower install Chart.js --save
|
||||||
|
```
|
||||||
|
|
||||||
|
### Selecting the Correct Build
|
||||||
|
|
||||||
|
Chart.js provides two different builds that are available for your use. The `Chart.js` and `Chart.min.js` files include Chart.js and the accompanying color parsing library. If this version is used and you require the use of the time axis, [Moment.js](http://momentjs.com/) will need to be included before Chart.js.
|
||||||
|
|
||||||
|
The `Chart.bundle.js` and `Chart.bundle.min.js` builds include Moment.js in a single file. This version should be used if you require time axes and want a single file to include, select this version. Do not use this build if your application already includes Moment.js. If you do, Moment.js will be included twice, increasing the page load time and potentially introducing version issues.
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
To import Chart.js using an old-school script tag:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script src="Chart.js"></script>
|
||||||
|
<script>
|
||||||
|
var myChart = new Chart({...})
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
To import Chart.js using an awesome module loader:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
|
||||||
|
// Using CommonJS
|
||||||
|
var Chart = require('src/chart.js')
|
||||||
|
var myChart = new Chart({...})
|
||||||
|
|
||||||
|
// ES6
|
||||||
|
import Chart from 'src/chart.js'
|
||||||
|
let myChart = new Chart({...})
|
||||||
|
|
||||||
|
// Using requirejs
|
||||||
|
require(['path/to/Chartjs'], function(Chart){
|
||||||
|
var myChart = new Chart({...})
|
||||||
|
})
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### Creating a Chart
|
||||||
|
|
||||||
|
To create a chart, we need to instantiate the `Chart` class. To do this, we need to pass in the node, jQuery instance, or 2d context of the canvas of where we want to draw the chart. Here's an example.
|
||||||
|
|
||||||
|
```html
|
||||||
|
<canvas id="myChart" width="400" height="400"></canvas>
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Any of the following formats may be used
|
||||||
|
var ctx = document.getElementById("myChart");
|
||||||
|
var ctx = document.getElementById("myChart").getContext("2d");
|
||||||
|
var ctx = $("#myChart");
|
||||||
|
```
|
||||||
|
|
||||||
|
Once you have the element or context, you're ready to instantiate a pre-defined chart-type or create your own!
|
||||||
|
|
||||||
|
The following example instantiates a bar chart showing the number of votes for different colors and the y-axis starting at 0.
|
||||||
|
|
||||||
|
```html
|
||||||
|
<canvas id="myChart" width="400" height="400"></canvas>
|
||||||
|
<script>
|
||||||
|
var ctx = document.getElementById("myChart");
|
||||||
|
var myChart = new Chart(ctx, {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
|
||||||
|
datasets: [{
|
||||||
|
label: '# of Votes',
|
||||||
|
data: [12, 19, 3, 5, 2, 3],
|
||||||
|
backgroundColor: [
|
||||||
|
'rgba(255, 99, 132, 0.2)',
|
||||||
|
'rgba(54, 162, 235, 0.2)',
|
||||||
|
'rgba(255, 206, 86, 0.2)',
|
||||||
|
'rgba(75, 192, 192, 0.2)',
|
||||||
|
'rgba(153, 102, 255, 0.2)',
|
||||||
|
'rgba(255, 159, 64, 0.2)'
|
||||||
|
],
|
||||||
|
borderColor: [
|
||||||
|
'rgba(255,99,132,1)',
|
||||||
|
'rgba(54, 162, 235, 1)',
|
||||||
|
'rgba(255, 206, 86, 1)',
|
||||||
|
'rgba(75, 192, 192, 1)',
|
||||||
|
'rgba(153, 102, 255, 1)',
|
||||||
|
'rgba(255, 159, 64, 1)'
|
||||||
|
],
|
||||||
|
borderWidth: 1
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
scales: {
|
||||||
|
yAxes: [{
|
||||||
|
ticks: {
|
||||||
|
beginAtZero:true
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
It's that easy to get started using Chart.js! From here you can explore the many options that can help you customise your charts with scales, tooltips, labels, colors, custom actions, and much more.
|
408
public/vendors/Chart.js/docs/01-Chart-Configuration.md
vendored
Normal file
408
public/vendors/Chart.js/docs/01-Chart-Configuration.md
vendored
Normal file
@ -0,0 +1,408 @@
|
|||||||
|
---
|
||||||
|
title: Chart Configuration
|
||||||
|
anchor: chart-configuration
|
||||||
|
---
|
||||||
|
|
||||||
|
Chart.js provides a number of options for changing the behaviour of created charts. These configuration options can be changed on a per chart basis by passing in an options object when creating the chart. Alternatively, the global configuration can be changed which will be used by all charts created after that point.
|
||||||
|
|
||||||
|
### Creating a Chart with Options
|
||||||
|
|
||||||
|
To create a chart with configuration options, simply pass an object containing your configuration to the constructor. In the example below, a line chart is created and configured to not be responsive.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var chartInstance = new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: data,
|
||||||
|
options: {
|
||||||
|
responsive: false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Global Configuration
|
||||||
|
|
||||||
|
This concept was introduced in Chart.js 1.0 to keep configuration DRY, and allow for changing options globally across chart types, avoiding the need to specify options for each instance, or the default for a particular chart type.
|
||||||
|
|
||||||
|
Chart.js merges the options object passed to the chart with the global configuration using chart type defaults and scales defaults appropriately. This way you can be as specific as you would like in your individual chart configuration, while still changing the defaults for all chart types where applicable. The global general options are defined in `Chart.defaults.global`. The defaults for each chart type are discussed in the documentation for that chart type.
|
||||||
|
|
||||||
|
The following example would set the hover mode to 'single' for all charts where this was not overridden by the chart type defaults or the options passed to the constructor on creation.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
Chart.defaults.global.hover.mode = 'single';
|
||||||
|
|
||||||
|
// Hover mode is set to single because it was not overridden here
|
||||||
|
var chartInstanceHoverModeSingle = new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: data,
|
||||||
|
});
|
||||||
|
|
||||||
|
// This chart would have the hover mode that was passed in
|
||||||
|
var chartInstanceDifferentHoverMode = new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: data,
|
||||||
|
options: {
|
||||||
|
hover: {
|
||||||
|
// Overrides the global setting
|
||||||
|
mode: 'label'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Global Font Settings
|
||||||
|
|
||||||
|
There are 4 special global settings that can change all of the fonts on the chart. These options are in `Chart.defaults.global`.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
defaultFontColor | Color | '#666' | Default font color for all text
|
||||||
|
defaultFontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Default font family for all text
|
||||||
|
defaultFontSize | Number | 12 | Default font size (in px) for text. Does not apply to radialLinear scale point labels
|
||||||
|
defaultFontStyle | String | 'normal' | Default font style. Does not apply to tooltip title or footer. Does not apply to chart title
|
||||||
|
|
||||||
|
### Common Chart Configuration
|
||||||
|
|
||||||
|
The following options are applicable to all charts. The can be set on the [global configuration](#chart-configuration-global-configuration), or they can be passed to the chart constructor.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
responsive | Boolean | true | Resizes when the canvas container does.
|
||||||
|
responsiveAnimationDuration | Number | 0 | Duration in milliseconds it takes to animate to new size after a resize event.
|
||||||
|
maintainAspectRatio | Boolean | true | Maintain the original canvas aspect ratio `(width / height)` when resizing
|
||||||
|
events | Array[String] | `["mousemove", "mouseout", "click", "touchstart", "touchmove", "touchend"]` | Events that the chart should listen to for tooltips and hovering
|
||||||
|
onClick | Function | null | Called if the event is of type 'mouseup' or 'click'. Called in the context of the chart and passed an array of active elements
|
||||||
|
legendCallback | Function | ` function (chart) { }` | Function to generate a legend. Receives the chart object to generate a legend from. Default implementation returns an HTML string.
|
||||||
|
|
||||||
|
### Title Configuration
|
||||||
|
|
||||||
|
The title configuration is passed into the `options.title` namespace. The global options for the chart title is defined in `Chart.defaults.global.title`.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
display | Boolean | false | Display the title block
|
||||||
|
position | String | 'top' | Position of the title. Only 'top' or 'bottom' are currently allowed
|
||||||
|
fullWidth | Boolean | true | Marks that this box should take the full width of the canvas (pushing down other boxes)
|
||||||
|
fontSize | Number | 12 | Font size inherited from global configuration
|
||||||
|
fontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family inherited from global configuration
|
||||||
|
fontColor | Color | "#666" | Font color inherited from global configuration
|
||||||
|
fontStyle | String | 'bold' | Font styling of the title.
|
||||||
|
padding | Number | 10 | Number of pixels to add above and below the title text
|
||||||
|
text | String | '' | Title text
|
||||||
|
|
||||||
|
#### Example Usage
|
||||||
|
|
||||||
|
The example below would enable a title of 'Custom Chart Title' on the chart that is created.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var chartInstance = new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: data,
|
||||||
|
options: {
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Custom Chart Title'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Legend Configuration
|
||||||
|
|
||||||
|
The legend configuration is passed into the `options.legend` namespace. The global options for the chart legend is defined in `Chart.defaults.global.legend`.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
display | Boolean | true | Is the legend displayed
|
||||||
|
position | String | 'top' | Position of the legend. Options are 'top' or 'bottom'
|
||||||
|
fullWidth | Boolean | true | Marks that this box should take the full width of the canvas (pushing down other boxes)
|
||||||
|
onClick | Function | `function(event, legendItem) {}` | A callback that is called when a click is registered on top of a label item
|
||||||
|
labels |Object|-| See the [Legend Label Configuration](#chart-configuration-legend-label-configuration) section below.
|
||||||
|
|
||||||
|
#### Legend Label Configuration
|
||||||
|
|
||||||
|
The legend label configuration is nested below the legend configuration using the `labels` key.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
boxWidth | Number | 40 | Width of coloured box
|
||||||
|
fontSize | Number | 12 | Font size inherited from global configuration
|
||||||
|
fontStyle | String | "normal" | Font style inherited from global configuration
|
||||||
|
fontColor | Color | "#666" | Font color inherited from global configuration
|
||||||
|
fontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family inherited from global configuration
|
||||||
|
padding | Number | 10 | Padding between rows of colored boxes
|
||||||
|
generateLabels: | Function | `function(chart) { }` | Generates legend items for each thing in the legend. Default implementation returns the text + styling for the color box. See [Legend Item](#chart-configuration-legend-item-interface) for details.
|
||||||
|
|
||||||
|
#### Legend Item Interface
|
||||||
|
|
||||||
|
Items passed to the legend `onClick` function are the ones returned from `labels.generateLabels`. These items must implement the following interface.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
// Label that will be displayed
|
||||||
|
text: String,
|
||||||
|
|
||||||
|
// Fill style of the legend box
|
||||||
|
fillStyle: Color,
|
||||||
|
|
||||||
|
// If true, this item represents a hidden dataset. Label will be rendered with a strike-through effect
|
||||||
|
hidden: Boolean,
|
||||||
|
|
||||||
|
// For box border. See https://developer.mozilla.org/en/docs/Web/API/CanvasRenderingContext2D/lineCap
|
||||||
|
lineCap: String,
|
||||||
|
|
||||||
|
// For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash
|
||||||
|
lineDash: Array[Number],
|
||||||
|
|
||||||
|
// For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset
|
||||||
|
lineDashOffset: Number,
|
||||||
|
|
||||||
|
// For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin
|
||||||
|
lineJoin: String,
|
||||||
|
|
||||||
|
// Width of box border
|
||||||
|
lineWidth: Number,
|
||||||
|
|
||||||
|
// Stroke style of the legend box
|
||||||
|
strokeStyle: Color
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
|
||||||
|
The following example will create a chart with the legend enabled and turn all of the text red in color.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var chartInstance = new Chart(ctx, {
|
||||||
|
type: 'bar',
|
||||||
|
data: data,
|
||||||
|
options: {
|
||||||
|
legend: {
|
||||||
|
display: true,
|
||||||
|
labels: {
|
||||||
|
fontColor: 'rgb(255, 99, 132)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tooltip Configuration
|
||||||
|
|
||||||
|
The title configuration is passed into the `options.tooltips` namespace. The global options for the chart tooltips is defined in `Chart.defaults.global.title`.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
enabled | Boolean | true | Are tooltips
|
||||||
|
custom | Function | null | See [section](#chart-configuration-custom-tooltips) below
|
||||||
|
mode | String | 'single' | Sets which elements appear in the tooltip. Acceptable options are `'single'` or `'label'`. `single` highlights the closest element. `label` highlights elements in all datasets at the same `X` value.
|
||||||
|
backgroundColor | Color | 'rgba(0,0,0,0.8)' | Background color of the tooltip
|
||||||
|
titleFontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family for tooltip title inherited from global font family
|
||||||
|
titleFontSize | Number | 12 | Font size for tooltip title inherited from global font size
|
||||||
|
titleFontStyle | String | "bold" |
|
||||||
|
titleFontColor | Color | "#fff" | Font color for tooltip title
|
||||||
|
titleSpacing | Number | 2 | Spacing to add to top and bottom of each title line.
|
||||||
|
titleMarginBottom | Number | 6 | Margin to add on bottom of title section
|
||||||
|
bodyFontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family for tooltip items inherited from global font family
|
||||||
|
bodyFontSize | Number | 12 | Font size for tooltip items inherited from global font size
|
||||||
|
bodyFontStyle | String | "normal" |
|
||||||
|
bodyFontColor | Color | "#fff" | Font color for tooltip items.
|
||||||
|
bodySpacing | Number | 2 | Spacing to add to top and bottom of each tooltip item
|
||||||
|
footerFontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family for tooltip footer inherited from global font family.
|
||||||
|
footerFontSize | Number | 12 | Font size for tooltip footer inherited from global font size.
|
||||||
|
footerFontStyle | String | "bold" | Font style for tooltip footer.
|
||||||
|
footerFontColor | Color | "#fff" | Font color for tooltip footer.
|
||||||
|
footerSpacing | Number | 2 | Spacing to add to top and bottom of each footer line.
|
||||||
|
footerMarginTop | Number | 6 | Margin to add before drawing the footer
|
||||||
|
xPadding | Number | 6 | Padding to add on left and right of tooltip
|
||||||
|
yPadding | Number | 6 | Padding to add on top and bottom of tooltip
|
||||||
|
caretSize | Number | 5 | Size, in px, of the tooltip arrow
|
||||||
|
cornerRadius | Number | 6 | Radius of tooltip corner curves
|
||||||
|
multiKeyBackground | Color | "#fff" | Color to draw behind the colored boxes when multiple items are in the tooltip
|
||||||
|
callbacks | Object | | See the [callbacks section](#chart-configuration-tooltip-callbacks) below
|
||||||
|
|
||||||
|
#### Tooltip Callbacks
|
||||||
|
|
||||||
|
The tooltip label configuration is nested below the tooltip configuration using the `callbacks` key. The tooltip has the following callbacks for providing text. For all functions, 'this' will be the tooltip object created from the Chart.Tooltip constructor.
|
||||||
|
|
||||||
|
All functions are called with the same arguments: a [tooltip item](#chart-configuration-tooltip-item-interface) and the data object passed to the chart. All functions must return either a string or an array of strings. Arrays of strings are treated as multiple lines of text.
|
||||||
|
|
||||||
|
Callback | Arguments | Description
|
||||||
|
--- | --- | ---
|
||||||
|
beforeTitle | `Array[tooltipItem], data` | Text to render before the title
|
||||||
|
title | `Array[tooltipItem], data` | Text to render as the title
|
||||||
|
afterTitle | `Array[tooltipItem], data` | Text to render after the title
|
||||||
|
beforeBody | `Array[tooltipItem], data` | Text to render before the body section
|
||||||
|
beforeLabel | `tooltipItem, data` | Text to render before an individual label
|
||||||
|
label | `tooltipItem, data` | Text to render for an individual item in the tooltip
|
||||||
|
afterLabel | `tooltipItem, data` | Text to render after an individual label
|
||||||
|
afterBody | `Array[tooltipItem], data` | Text to render after the body section
|
||||||
|
beforeFooter | `Array[tooltipItem], data` | Text to render before the footer section
|
||||||
|
footer | `Array[tooltipItem], data` | Text to render as the footer
|
||||||
|
afterFooter | `Array[tooltipItem], data` | Text to render after the footer section
|
||||||
|
|
||||||
|
#### Tooltip Item Interface
|
||||||
|
|
||||||
|
The tooltip items passed to the tooltip callbacks implement the following interface.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
// X Value of the tooltip as a string
|
||||||
|
xLabel: String,
|
||||||
|
|
||||||
|
// Y value of the tooltip as a string
|
||||||
|
yLabel: String,
|
||||||
|
|
||||||
|
// Index of the dataset the item comes from
|
||||||
|
datasetIndex: Number,
|
||||||
|
|
||||||
|
// Index of this data item in the dataset
|
||||||
|
index: Number
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Hover Configuration
|
||||||
|
|
||||||
|
The hover configuration is passed into the `options.hover` namespace. The global hover configuration is at `Chart.defaults.global.hover`.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
mode | String | 'single' | Sets which elements hover. Acceptable options are `'single'`, `'label'`, or `'dataset'`. `single` highlights the closest element. `label` highlights elements in all datasets at the same `X` value. `dataset` highlights the closest dataset.
|
||||||
|
animationDuration | Number | 400 | Duration in milliseconds it takes to animate hover style changes
|
||||||
|
onHover | Function | null | Called when any of the events fire. Called in the context of the chart and passed an array of active elements (bars, points, etc)
|
||||||
|
|
||||||
|
### Animation Configuration
|
||||||
|
|
||||||
|
The following animation options are available. The global options for are defined in `Chart.defaults.global.animation`.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- |:---:| --- | ---
|
||||||
|
duration | Number | 1000 | The number of milliseconds an animation takes.
|
||||||
|
easing | String | "easeOutQuart" | Easing function to use.
|
||||||
|
onProgress | Function | none | Callback called on each step of an animation. Passed a single argument, an object, containing the chart instance and an object with details of the animation.
|
||||||
|
onComplete | Function | none | Callback called at the end of an animation. Passed the same arguments as `onProgress`
|
||||||
|
|
||||||
|
#### Animation Callbacks
|
||||||
|
|
||||||
|
The `onProgress` and `onComplete` callbacks are useful for synchronizing an external draw to the chart animation. The callback is passed an object that implements the following interface. An example usage of these callbacks can be found on [Github](https://github.com/chartjs/Chart.js/blob/master/samples/AnimationCallbacks/progress-bar.html). This sample displays a progress bar showing how far along the animation is.
|
||||||
|
|
||||||
|
```javscript
|
||||||
|
{
|
||||||
|
// Chart object
|
||||||
|
chartInstance,
|
||||||
|
|
||||||
|
// Contains details of the on-going animation
|
||||||
|
animationObject,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Animation Object
|
||||||
|
|
||||||
|
The animation object passed to the callbacks is of type `Chart.Animation`. The object has the following parameters.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
// Current Animation frame number
|
||||||
|
currentStep: Number,
|
||||||
|
|
||||||
|
// Number of animation frames
|
||||||
|
numSteps: Number,
|
||||||
|
|
||||||
|
// Animation easing to use
|
||||||
|
easing: String,
|
||||||
|
|
||||||
|
// Function that renders the chart
|
||||||
|
render: Function,
|
||||||
|
|
||||||
|
// User callback
|
||||||
|
onAnimationProgress: Function,
|
||||||
|
|
||||||
|
// User callback
|
||||||
|
onAnimationComplete: Function
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Element Configuration
|
||||||
|
|
||||||
|
The global options for elements are defined in `Chart.defaults.global.elements`.
|
||||||
|
|
||||||
|
Options can be configured for four different types of elements; arc, lines, points, and rectangles. When set, these options apply to all objects of that type unless specifically overridden by the configuration attached to a dataset.
|
||||||
|
|
||||||
|
#### Arc Configuration
|
||||||
|
|
||||||
|
Arcs are used in the polar area, doughnut and pie charts. They can be configured with the following options. The global arc options are stored in `Chart.defaults.global.elements.arc`.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
backgroundColor | Color | 'rgba(0,0,0,0.1)' | Default fill color for arcs. Inherited from the global default
|
||||||
|
borderColor | Color | '#fff' | Default stroke color for arcs
|
||||||
|
borderWidth | Number | 2 | Default stroke width for arcs
|
||||||
|
|
||||||
|
#### Line Configuration
|
||||||
|
|
||||||
|
Line elements are used to represent the line in a line chart. The global line options are stored in `Chart.defaults.global.elements.line`.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
tension | Number | 0.4 | Default bezier curve tension. Set to `0` for no bezier curves.
|
||||||
|
backgroundColor | Color | 'rgba(0,0,0,0.1)' | Default line fill color
|
||||||
|
borderWidth | Number | 3 | Default line stroke width
|
||||||
|
borderColor | Color | 'rgba(0,0,0,0.1)' | Default line stroke color
|
||||||
|
borderCapStyle | String | 'butt' | Default line cap style. See [MDN](https://developer.mozilla.org/en/docs/Web/API/CanvasRenderingContext2D/lineCap)
|
||||||
|
borderDash | Array | `[]` | Default line dash. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash)
|
||||||
|
borderDashOffset | Number | 0.0 | Default line dash offset. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset)
|
||||||
|
borderJoinStyle | String | 'miter' | Default line join style. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin)
|
||||||
|
fill | Boolean | true | If true, the line is filled.
|
||||||
|
|
||||||
|
#### Point Configuration
|
||||||
|
|
||||||
|
Point elements are used to represent the points in a line chart or a bubble chart. The global point options are stored in `Chart.defaults.global.elements.point`.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
radius | Number | 3 | Default point radius
|
||||||
|
pointStyle | String | 'circle' | Default point style
|
||||||
|
backgroundColor | Color | 'rgba(0,0,0,0.1)' | Default point fill color
|
||||||
|
borderWidth | Number | 1 | Default point stroke width
|
||||||
|
borderColor | Color | 'rgba(0,0,0,0.1)' | Default point stroke color
|
||||||
|
hitRadius | Number | 1 | Extra radius added to point radius for hit detection
|
||||||
|
hoverRadius | Number | 4 | Default point radius when hovered
|
||||||
|
hoverBorderWidth | Number | 1 | Default stroke width when hovered
|
||||||
|
|
||||||
|
#### Rectangle Configuration
|
||||||
|
|
||||||
|
Rectangle elements are used to represent the bars in a bar chart. The global rectangle options are stored in `Chart.defaults.global.elements.rectange`.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
backgroundColor | Color | 'rgba(0,0,0,0.1)' | Default bar fill color
|
||||||
|
borderWidth | Number | 0 | Default bar stroke width
|
||||||
|
borderColor | Color | 'rgba(0,0,0,0.1)' | Default bar stroke color
|
||||||
|
borderSkipped | String | 'bottom' | Default skipped (excluded) border for rectangle. Can be one of `bottom`, `left`, `top`, `right`
|
||||||
|
|
||||||
|
### Colors
|
||||||
|
|
||||||
|
When supplying colors to Chart options, you can use a number of formats. You can specify the color as a string in hexadecimal, RGB, or HSL notations. If a color is needed, but not specified, Chart.js will use the global default color. This color is stored at `Chart.defaults.global.defaultColor`. It is initially set to 'rgb(0, 0, 0, 0.1)';
|
||||||
|
|
||||||
|
You can also pass a [CanvasGradient](https://developer.mozilla.org/en-US/docs/Web/API/CanvasGradient) object. You will need to create this before passing to the chart, but using it you can achieve some interesting effects.
|
||||||
|
|
||||||
|
The final option is to pass a [CanvasPattern](https://developer.mozilla.org/en-US/docs/Web/API/CanvasPattern) object. For example, if you wanted to fill a dataset with a pattern from an image you could do the following.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var img = new Image();
|
||||||
|
img.src = 'https://example.com/my_image.png';
|
||||||
|
img.onload = function() {
|
||||||
|
var ctx = document.getElementById('canvas').getContext('2d');
|
||||||
|
var fillPattern = ctx.createPattern(img, 'repeat');
|
||||||
|
|
||||||
|
var chart = new Chart(ctx, {
|
||||||
|
data: {
|
||||||
|
labels: ['Item 1', 'Item 2', 'Item 3'],
|
||||||
|
datasets: [{
|
||||||
|
data: [10, 20, 30],
|
||||||
|
backgroundColor: fillPattern
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
357
public/vendors/Chart.js/docs/02-Scales.md
vendored
Normal file
357
public/vendors/Chart.js/docs/02-Scales.md
vendored
Normal file
@ -0,0 +1,357 @@
|
|||||||
|
---
|
||||||
|
title: Scales
|
||||||
|
anchor: scales
|
||||||
|
---
|
||||||
|
|
||||||
|
Scales in v2.0 of Chart.js are significantly more powerful, but also different than those of v1.0.
|
||||||
|
* Multiple X & Y axes are supported.
|
||||||
|
* A built-in label auto-skip feature detects would-be overlapping ticks and labels and removes every nth label to keep things displaying normally.
|
||||||
|
* Scale titles are supported
|
||||||
|
* New scale types can be extended without writing an entirely new chart type
|
||||||
|
|
||||||
|
|
||||||
|
### Common Configuration
|
||||||
|
|
||||||
|
Every scale extends a core scale class with the following options:
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
type | String | Chart specific. | Type of scale being employed. Custom scales can be created and registered with a string key. Options: ["category"](#scales-category-scale), ["linear"](#scales-linear-scale), ["logarithmic"](#scales-logarithmic-scale), ["time"](#scales-time-scale), ["radialLinear"](#scales-radial-linear-scale)
|
||||||
|
display | Boolean | true | If true, show the scale including gridlines, ticks, and labels. Overrides *gridLines.display*, *scaleLabel.display*, and *ticks.display*.
|
||||||
|
position | String | "left" | Position of the scale. Possible values are 'top', 'left', 'bottom' and 'right'.
|
||||||
|
beforeUpdate | Function | undefined | Callback called before the update process starts. Passed a single argument, the scale instance.
|
||||||
|
beforeSetDimensions | Function | undefined | Callback that runs before dimensions are set. Passed a single argument, the scale instance.
|
||||||
|
afterSetDimensions | Function | undefined | Callback that runs after dimensions are set. Passed a single argument, the scale instance.
|
||||||
|
beforeDataLimits | Function | undefined | Callback that runs before data limits are determined. Passed a single argument, the scale instance.
|
||||||
|
afterDataLimits | Function | undefined | Callback that runs after data limits are determined. Passed a single argument, the scale instance.
|
||||||
|
beforeBuildTicks | Function | undefined | Callback that runs before ticks are created. Passed a single argument, the scale instance.
|
||||||
|
afterBuildTicks | Function | undefined | Callback that runs after ticks are created. Useful for filtering ticks. Passed a single argument, the scale instance.
|
||||||
|
beforeTickToLabelConversion | Function | undefined | Callback that runs before ticks are converted into strings. Passed a single argument, the scale instance.
|
||||||
|
afterTickToLabelConversion | Function | undefined | Callback that runs after ticks are converted into strings. Passed a single argument, the scale instance.
|
||||||
|
beforeCalculateTickRotation | Function | undefined | Callback that runs before tick rotation is determined. Passed a single argument, the scale instance.
|
||||||
|
afterCalculateTickRotation | Function | undefined | Callback that runs after tick rotation is determined. Passed a single argument, the scale instance.
|
||||||
|
beforeFit | Function | undefined | Callback that runs before the scale fits to the canvas. Passed a single argument, the scale instance.
|
||||||
|
afterFit | Function | undefined | Callback that runs after the scale fits to the canvas. Passed a single argument, the scale instance.
|
||||||
|
afterUpdate | Function | undefined | Callback that runs at the end of the update process. Passed a single argument, the scale instance.
|
||||||
|
**gridLines** | Object | - | See [grid line configuration](#scales-grid-line-configuration) section.
|
||||||
|
**scaleLabel** | Object | | See [scale title configuration](#scales-scale-title-configuration) section.
|
||||||
|
**ticks** | Object | | See [ticks configuration](#scales-ticks-configuration) section.
|
||||||
|
|
||||||
|
#### Grid Line Configuration
|
||||||
|
|
||||||
|
The grid line configuration is nested under the scale configuration in the `gridLines` key. It defines options for the grid lines that run perpendicular to the axis.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
display | Boolean | true |
|
||||||
|
color | Color | "rgba(0, 0, 0, 0.1)" | Color of the grid lines.
|
||||||
|
lineWidth | Number | 1 | Stroke width of grid lines
|
||||||
|
drawBorder | Boolean | true | If true draw border on the edge of the chart
|
||||||
|
drawOnChartArea | Boolean | true | If true, draw lines on the chart area inside the axis lines. This is useful when there are multiple axes and you need to control which grid lines are drawn
|
||||||
|
drawTicks | Boolean | true | If true, draw lines beside the ticks in the axis area beside the chart.
|
||||||
|
tickMarkLength | Number | 10 | Length in pixels that the grid lines will draw into the axis area.
|
||||||
|
zeroLineWidth | Number | 1 | Stroke width of the grid line for the first index (index 0).
|
||||||
|
zeroLineColor | Color | "rgba(0, 0, 0, 0.25)" | Stroke color of the grid line for the first index (index 0).
|
||||||
|
offsetGridLines | Boolean | false | If true, offset labels from grid lines.
|
||||||
|
|
||||||
|
#### Scale Title Configuration
|
||||||
|
|
||||||
|
The grid line configuration is nested under the scale configuration in the `scaleLabel` key. It defines options for the scale title.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
display | Boolean | false |
|
||||||
|
labelString | String | "" | The text for the title. (i.e. "# of People", "Response Choices")
|
||||||
|
fontColor | Color | "#666" | Font color for the scale title.
|
||||||
|
fontFamily| String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family for the scale title, follows CSS font-family options.
|
||||||
|
fontSize | Number | 12 | Font size for the scale title.
|
||||||
|
fontStyle | String | "normal" | Font style for the scale title, follows CSS font-style options (i.e. normal, italic, oblique, initial, inherit).
|
||||||
|
|
||||||
|
#### Tick Configuration
|
||||||
|
|
||||||
|
The grid line configuration is nested under the scale configuration in the `ticks` key. It defines options for the tick marks that are generated by the axis.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
autoSkip | Boolean | true | If true, automatically calculates how many labels that can be shown and hides labels accordingly. Turn it off to show all labels no matter what
|
||||||
|
callback | Function | `function(value) { return '' + value; } ` | Returns the string representation of the tick value as it should be displayed on the chart. See [callback](#scales-creating-custom-tick-formats) section below.
|
||||||
|
display | Boolean | true | If true, show the ticks.
|
||||||
|
fontColor | Color | "#666" | Font color for the tick labels.
|
||||||
|
fontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family for the tick labels, follows CSS font-family options.
|
||||||
|
fontSize | Number | 12 | Font size for the tick labels.
|
||||||
|
fontStyle | String | "normal" | Font style for the tick labels, follows CSS font-style options (i.e. normal, italic, oblique, initial, inherit).
|
||||||
|
labelOffset | Number | 0 | Distance in pixels to offset the label from the centre point of the tick (in the y direction for the x axis, and the x direction for the y axis). *Note: this can cause labels at the edges to be cropped by the edge of the canvas*
|
||||||
|
maxRotation | Number | 90 | Maximum rotation for tick labels when rotating to condense labels. Note: Rotation doesn't occur until necessary. *Note: Only applicable to horizontal scales.*
|
||||||
|
minRotation | Number | 0 | Minimum rotation for tick labels. *Note: Only applicable to horizontal scales.*
|
||||||
|
mirror | Boolean | false | Flips tick labels around axis, displaying the labels inside the chart instead of outside. *Note: Only applicable to vertical scales.*
|
||||||
|
padding | Number | 10 | Padding between the tick label and the axis. *Note: Only applicable to horizontal scales.*
|
||||||
|
reverse | Boolean | false | Reverses order of tick labels.
|
||||||
|
|
||||||
|
#### Creating Custom Tick Formats
|
||||||
|
|
||||||
|
The `callback` method may be used for advanced tick customization. In the following example, every label of the Y axis would be displayed in scientific notation.
|
||||||
|
|
||||||
|
If the callback returns `null` or `undefined` the associated grid line will be hidden.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var chartInstance = new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: data,
|
||||||
|
options: {
|
||||||
|
scales: {
|
||||||
|
yAxes: [{
|
||||||
|
ticks: {
|
||||||
|
// Create scientific notation labels
|
||||||
|
callback: function(value, index, values) {
|
||||||
|
return value.toExponential();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Category Scale
|
||||||
|
|
||||||
|
The category scale will be familiar to those who have used v1.0. Labels are drawn in from the labels array included in the chart data.
|
||||||
|
|
||||||
|
#### Configuration Options
|
||||||
|
|
||||||
|
The category scale has the following additional options that can be set.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
ticks.min | String | - | The minimum item to display. Must be a value in the `labels` array
|
||||||
|
ticks.max | String | - | The maximum item to display. Must be a value in the `labels` array
|
||||||
|
gridLines.offsetGridLines | Boolean | - | If true, labels are shifted to be between grid lines. This is used in the bar chart.
|
||||||
|
|
||||||
|
|
||||||
|
### Linear Scale
|
||||||
|
|
||||||
|
The linear scale is use to chart numerical data. It can be placed on either the x or y axis. The scatter chart type automatically configures a line chart to use one of these scales for the x axis. As the name suggests, linear interpolation is used to determine where a value lies on the axis.
|
||||||
|
|
||||||
|
#### Configuration Options
|
||||||
|
|
||||||
|
The following options are provided by the linear scale. They are all located in the `ticks` sub options.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
beginAtZero | Boolean | - | if true, scale will inclulde 0 if it is not already included.
|
||||||
|
min | Number | - | User defined minimum number for the scale, overrides minimum value from data.
|
||||||
|
max | Number | - | User defined maximum number for the scale, overrides maximum value from data.
|
||||||
|
maxTicksLimit | Number | 11 | Maximum number of ticks and gridlines to show. If not defined, it will limit to 11 ticks but will show all gridlines.
|
||||||
|
stepSize | Number | - | User defined fixed step size for the scale. If set, the scale ticks will be enumerated by multiple of stepSize, having one tick per increment. If not set, the ticks are labeled automatically using the nice numbers algorithm.
|
||||||
|
stepSize | Number | - | if defined, it can be used along with the min and the max to give a custom number of steps. See the example below.
|
||||||
|
suggestedMax | Number | - | User defined maximum number for the scale, overrides maximum value *except for if* it is lower than the maximum value.
|
||||||
|
suggestedMin | Number | - | User defined minimum number for the scale, overrides minimum value *except for if* it is higher than the minimum value.
|
||||||
|
|
||||||
|
#### Example Configuration
|
||||||
|
|
||||||
|
The following example creates a line chart with a vertical axis that goes from 0 to 5 in 0.5 sized steps.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var chartInstance = new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: data,
|
||||||
|
options: {
|
||||||
|
scales: {
|
||||||
|
yAxes: [{
|
||||||
|
ticks: {
|
||||||
|
max: 5,
|
||||||
|
min: 0,
|
||||||
|
stepSize: 0.5
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Logarithmic Scale
|
||||||
|
|
||||||
|
The logarithmic scale is use to chart numerical data. It can be placed on either the x or y axis. As the name suggests, logarithmic interpolation is used to determine where a value lies on the axis.
|
||||||
|
|
||||||
|
#### Configuration Options
|
||||||
|
|
||||||
|
The following options are provided by the logarithmic scale. They are all located in the `ticks` sub options.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
min | Number | - | User defined minimum number for the scale, overrides minimum value from data.
|
||||||
|
max | Number | - | User defined maximum number for the scale, overrides maximum value from data.
|
||||||
|
|
||||||
|
#### Example Configuration
|
||||||
|
|
||||||
|
The following example creates a chart with a logarithmic X axis that ranges from 1 to 1000.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var chartInstance = new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: data,
|
||||||
|
options: {
|
||||||
|
xAxes: [{
|
||||||
|
type: 'logarithmic',
|
||||||
|
position: 'bottom',
|
||||||
|
ticks: {
|
||||||
|
min: 1,
|
||||||
|
max: 1000
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Time Scale
|
||||||
|
|
||||||
|
The time scale is used to display times and dates. It can only be placed on the X axis. When building its ticks, it will automatically calculate the most comfortable unit base on the size of the scale.
|
||||||
|
|
||||||
|
#### Configuration Options
|
||||||
|
|
||||||
|
The following options are provided by the logarithmic scale. They are all located in the `time` sub options.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
displayFormats | Object | - | See [Display Formats](#scales-display-formats) section below.
|
||||||
|
isoWeekday | Boolean | false | If true and the unit is set to 'week', iso weekdays will be used.
|
||||||
|
max | [Time](#scales-date-formats) | - | If defined, this will override the data maximum
|
||||||
|
min | [Time](#scales-date-formats) | - | If defined, this will override the data minimum
|
||||||
|
parser | String or Function | - | If defined as a string, it is interpreted as a custom format to be used by moment to parse the date. If this is a function, it must return a moment.js object given the appropriate data value.
|
||||||
|
round | String | - | If defined, dates will be rounded to the start of this unit. See [Time Units](#scales-time-units) below for the allowed units.
|
||||||
|
tooltipFormat | String | '' | The moment js format string to use for the tooltip.
|
||||||
|
unit | String | - | If defined, will force the unit to be a certain type. See [Time Units](#scales-time-units) section below for details.
|
||||||
|
unitStepSize | Number | 1 | The number of units between grid lines.
|
||||||
|
|
||||||
|
#### Date Formats
|
||||||
|
|
||||||
|
When providing data for the time scale, Chart.js supports all of the formats that Moment.js accepts. See [Moment.js docs](http://momentjs.com/docs/#/parsing/) for details.
|
||||||
|
|
||||||
|
#### Display Formats
|
||||||
|
|
||||||
|
The following display formats are used to configure how different time units are formed into strings for the axis tick marks. See [moment.js](http://momentjs.com/docs/#/displaying/format/) for the allowable format strings.
|
||||||
|
|
||||||
|
Name | Default
|
||||||
|
--- | ---
|
||||||
|
millisecond | 'SSS [ms]'
|
||||||
|
second | 'h:mm:ss a'
|
||||||
|
minute | 'h:mm:ss a'
|
||||||
|
hour | 'MMM D, hA'
|
||||||
|
day | 'll'
|
||||||
|
week | 'll'
|
||||||
|
month | 'MMM YYYY'
|
||||||
|
quarter | '[Q]Q - YYYY'
|
||||||
|
year | 'YYYY'
|
||||||
|
|
||||||
|
For example, to set the display format for the 'quarter' unit to show the month and year, the following config would be passed to the chart constructor.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var chartInstance = new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: data,
|
||||||
|
options: {
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
type: 'time',
|
||||||
|
time: {
|
||||||
|
displayFormats: {
|
||||||
|
quarter: 'MMM YYYY'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Time Units
|
||||||
|
|
||||||
|
The following time measurements are supported. The names can be passed as strings to the `time.unit` config option to force a certain unit.
|
||||||
|
|
||||||
|
* millisecond
|
||||||
|
* second
|
||||||
|
* minute
|
||||||
|
* hour
|
||||||
|
* day
|
||||||
|
* week
|
||||||
|
* month
|
||||||
|
* quarter
|
||||||
|
* year
|
||||||
|
|
||||||
|
For example, to create a chart with a time scale that always displayed units per month, the following config could be used.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var chartInstance = new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: data,
|
||||||
|
options: {
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
time: {
|
||||||
|
unit: 'month'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Radial Linear Scale
|
||||||
|
|
||||||
|
The radial linear scale is used specifically for the radar and polar are chart types. It overlays the chart area, rather than being positioned on one of the edges.
|
||||||
|
|
||||||
|
#### Configuration Options
|
||||||
|
|
||||||
|
The following additional configuration options are provided by the radial linear scale.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
lineArc | Boolean | false | If true, circular arcs are used else straight lines are used. The former is used by the polar area chart and the latter by the radar chart
|
||||||
|
angleLines | Object | - | See the [Angle Lines](#scales-angle-line-options) section below for details.
|
||||||
|
pointLabels | Object | - | See the [Point Label](#scales-point-label) section below for details.
|
||||||
|
ticks | Object | - | See the Ticks table below for options.
|
||||||
|
|
||||||
|
#### Angle Line Options
|
||||||
|
|
||||||
|
The following options are used to configure angled lines that radiate from the center of the chart to the point labels. They can be found in the `angleLines` sub options. Note that these options only apply if `lineArc` is false.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
display | Boolean | true | If true, angle lines are shown.
|
||||||
|
color | Color | 'rgba(0, 0, 0, 0.1)' | Color of angled lines
|
||||||
|
lineWidth | Number | 1 | Width of angled lines
|
||||||
|
|
||||||
|
#### Point Label Options
|
||||||
|
|
||||||
|
The following options are used to configure the point labels that are shown on the perimeter of the scale. They can be found in the `pointLabel` sub options. Note that these options only apply if `lineArc` is false.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
callback | Function | - | Callback function to transform data label to axis label
|
||||||
|
fontColor | Color | '#666' | Font color
|
||||||
|
fontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family to render
|
||||||
|
fontSize | Number | 10 | Font size in pixels
|
||||||
|
fontStyle | String | 'normal' | Font Style to use
|
||||||
|
|
||||||
|
|
||||||
|
#### Tick Options
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
backdropColor | Color | 'rgba(255, 255, 255, 0.75)' | Color of label backdrops
|
||||||
|
backdropPaddingX | Number | 2 | Horizontal padding of label backdrop
|
||||||
|
backdropPaddingY | Number | 2 | Vertical padding of label backdrop
|
||||||
|
maxTicksLimit | Number | 11 | Maximum number of ticks and gridlines to show. If not defined, it will limit to 11 ticks but will show all gridlines.
|
||||||
|
showLabelBackdrop | Boolean | true | If true, draw a background behind the tick labels
|
||||||
|
|
||||||
|
### Update Default Scale config
|
||||||
|
|
||||||
|
The default configuration for a scale can be easily changed using the scale service. Pass in a partial configuration that will be merged with the current scale default configuration.
|
||||||
|
|
||||||
|
For example, to set the minimum value of 0 for all linear scales, you would do the following. Any linear scales created after this time would now have a minimum of 0.
|
||||||
|
```
|
||||||
|
Chart.scaleService.updateScaleDefaults('linear', {
|
||||||
|
ticks: {
|
||||||
|
min: 0
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
179
public/vendors/Chart.js/docs/03-Line-Chart.md
vendored
Normal file
179
public/vendors/Chart.js/docs/03-Line-Chart.md
vendored
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
---
|
||||||
|
title: Line Chart
|
||||||
|
anchor: line-chart
|
||||||
|
---
|
||||||
|
### Introduction
|
||||||
|
A line chart is a way of plotting data points on a line. Often, it is used to show trend data, and the comparison of two data sets.
|
||||||
|
|
||||||
|
<div class="canvas-holder">
|
||||||
|
<canvas width="250" height="125"></canvas>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
### Example Usage
|
||||||
|
```javascript
|
||||||
|
var myLineChart = new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: data,
|
||||||
|
options: options
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively a line chart can be created using syntax similar to the v1.0 syntax
|
||||||
|
```javascript
|
||||||
|
var myLineChart = Chart.Line(ctx, {
|
||||||
|
data: data,
|
||||||
|
options: options
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Structure
|
||||||
|
|
||||||
|
The following options can be included in a line chart dataset to configure options for that specific dataset.
|
||||||
|
|
||||||
|
All point* properties can be specified as an array. If these are set to an array value, the first value applies to the first point, the second value to the second point, and so on.
|
||||||
|
|
||||||
|
Property | Type | Usage
|
||||||
|
--- | --- | ---
|
||||||
|
data | See [data point](#line-chart-data-points) section | The data to plot in a line
|
||||||
|
label | `String` | The label for the dataset which appears in the legend and tooltips
|
||||||
|
xAxisID | `String` | The ID of the x axis to plot this dataset on
|
||||||
|
yAxisID | `String` | The ID of the y axis to plot this dataset on
|
||||||
|
fill | `Boolean` | If true, fill the area under the line
|
||||||
|
lineTension | `Number` | Bezier curve tension of the line. Set to 0 to draw straightlines. *Note* This was renamed from 'tension' but the old name still works.
|
||||||
|
backgroundColor | `Color` | The fill color under the line. See [Colors](#getting-started-colors)
|
||||||
|
borderWidth | `Number` | The width of the line in pixels
|
||||||
|
borderColor | `Color` | The color of the line.
|
||||||
|
borderCapStyle | `String` | Cap style of the line. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap)
|
||||||
|
borderDash | `Array<Number>` | Length and spacing of dashes. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash)
|
||||||
|
borderDashOffset | `Number` | Offset for line dashes. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset)
|
||||||
|
borderJoinStyle | `String` | Line joint style. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin)
|
||||||
|
pointBorderColor | `Color or Array<Color>` | The border color for points.
|
||||||
|
pointBackgroundColor | `Color or Array<Color>` | The fill color for points
|
||||||
|
pointBorderWidth | `Number or Array<Number>` | The width of the point border in pixels
|
||||||
|
pointRadius | `Number or Array<Number>` | The radius of the point shape. If set to 0, nothing is rendered.
|
||||||
|
pointHoverRadius | `Number or Array<Number>` | The radius of the point when hovered
|
||||||
|
pointHitRadius | `Number or Array<Number>` | The pixel size of the non-displayed point that reacts to mouse events
|
||||||
|
pointHoverBackgroundColor | `Color or Array<Color>` | Point background color when hovered
|
||||||
|
pointHoverBorderColor | `Color or Array<Color>` | Point border color when hovered
|
||||||
|
pointHoverBorderWidth | `Number or Array<Number>` | Border width of point when hovered
|
||||||
|
pointStyle | `String, Array<String>, Image, Array<Image>` | The style of point. Options are 'circle', 'triangle', 'rect', 'rectRot', 'cross', 'crossRot', 'star', 'line', and 'dash'. If the option is an image, that image is drawn on the canvas using `drawImage`.
|
||||||
|
|
||||||
|
An example data object using these attributes is shown below.
|
||||||
|
```javascript
|
||||||
|
var data = {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [
|
||||||
|
{
|
||||||
|
label: "My First dataset",
|
||||||
|
fill: false,
|
||||||
|
lineTension: 0.1,
|
||||||
|
backgroundColor: "rgba(75,192,192,0.4)",
|
||||||
|
borderColor: "rgba(75,192,192,1)",
|
||||||
|
borderCapStyle: 'butt',
|
||||||
|
borderDash: [],
|
||||||
|
borderDashOffset: 0.0,
|
||||||
|
borderJoinStyle: 'miter',
|
||||||
|
pointBorderColor: "rgba(75,192,192,1)",
|
||||||
|
pointBackgroundColor: "#fff",
|
||||||
|
pointBorderWidth: 1,
|
||||||
|
pointHoverRadius: 5,
|
||||||
|
pointHoverBackgroundColor: "rgba(75,192,192,1)",
|
||||||
|
pointHoverBorderColor: "rgba(220,220,220,1)",
|
||||||
|
pointHoverBorderWidth: 2,
|
||||||
|
pointRadius: 1,
|
||||||
|
pointHitRadius: 10,
|
||||||
|
data: [65, 59, 80, 81, 56, 55, 40],
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
The line chart usually requires an array of labels. This labels are shown on the X axis. There must be one label for each data point. More labels than datapoints are allowed, in which case the line ends at the last data point.
|
||||||
|
The data for line charts is broken up into an array of datasets. Each dataset has a colour for the fill, a colour for the line and colours for the points and strokes of the points. These colours are strings just like CSS. You can use RGBA, RGB, HEX or HSL notation.
|
||||||
|
|
||||||
|
The label key on each dataset is optional, and can be used when generating a scale for the chart.
|
||||||
|
|
||||||
|
### Data Points
|
||||||
|
|
||||||
|
The data passed to the chart can be passed in two formats. The most common method is to pass the data array as an array of numbers. In this case, the `data.labels` array must be specified and must contain a label for each point.
|
||||||
|
|
||||||
|
The alternate is used for sparse datasets. Data is specified using an object containing `x` and `y` properties. This is used for scatter charts as documented below.
|
||||||
|
|
||||||
|
### Scatter Line Charts
|
||||||
|
|
||||||
|
Scatter line charts can be created by changing the X axis to a linear axis. To use a scatter chart, data must be passed as objects containing X and Y properties. The example below creates a scatter chart with 3 points.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var scatterChart = new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
datasets: [{
|
||||||
|
label: 'Scatter Dataset',
|
||||||
|
data: [{
|
||||||
|
x: -10,
|
||||||
|
y: 0
|
||||||
|
}, {
|
||||||
|
x: 0,
|
||||||
|
y: 10
|
||||||
|
}, {
|
||||||
|
x: 10,
|
||||||
|
y: 5
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
type: 'linear',
|
||||||
|
position: 'bottom'
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Chart Options
|
||||||
|
|
||||||
|
These are the customisation options specific to Line charts. These options are merged with the [global chart configuration options](#chart-configuration-global-configuration), and form the options of the chart.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
showLines | Boolean | true | If false, the lines between points are not drawn
|
||||||
|
|
||||||
|
You can override these for your `Chart` instance by passing a member `options` into the `Line` method.
|
||||||
|
|
||||||
|
For example, we could have a line chart display without an X axis by doing the following. The config merge is smart enough to handle arrays so that you do not need to specify all axis settings to change one thing.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: data,
|
||||||
|
options: {
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
display: false
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
We can also change these defaults values for each Line type that is created, this object is available at `Chart.defaults.line`.
|
||||||
|
|
||||||
|
### Stacked Charts
|
||||||
|
|
||||||
|
Stacked area charts can be created by setting the Y axis to a stacked configuration. The following example would have stacked lines.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var stackedLine = new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: data,
|
||||||
|
options: {
|
||||||
|
scales: {
|
||||||
|
yAxes: [{
|
||||||
|
stacked: true
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
160
public/vendors/Chart.js/docs/04-Bar-Chart.md
vendored
Normal file
160
public/vendors/Chart.js/docs/04-Bar-Chart.md
vendored
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
---
|
||||||
|
title: Bar Chart
|
||||||
|
anchor: bar-chart
|
||||||
|
---
|
||||||
|
|
||||||
|
### Introduction
|
||||||
|
A bar chart is a way of showing data as bars.
|
||||||
|
|
||||||
|
It is sometimes used to show trend data, and the comparison of multiple data sets side by side.
|
||||||
|
|
||||||
|
<div class="canvas-holder">
|
||||||
|
<canvas width="250" height="125"></canvas>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
### Example Usage
|
||||||
|
```javascript
|
||||||
|
var myBarChart = new Chart(ctx, {
|
||||||
|
type: 'bar',
|
||||||
|
data: data,
|
||||||
|
options: options
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
Or if you want horizontal bars.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var myBarChart = new Chart(ctx, {
|
||||||
|
type: 'horizontalBar',
|
||||||
|
data: data,
|
||||||
|
options: options
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Structure
|
||||||
|
The following options can be included in a bar chart dataset to configure options for that specific dataset.
|
||||||
|
|
||||||
|
Some properties can be specified as an array. If these are set to an array value, the first value applies to the first bar, the second value to the second bar, and so on.
|
||||||
|
|
||||||
|
Property | Type | Usage
|
||||||
|
--- | --- | ---
|
||||||
|
data | `Array<Number>` | The data to plot as bars
|
||||||
|
label | `String` | The label for the dataset which appears in the legend and tooltips
|
||||||
|
xAxisID | `String` | The ID of the x axis to plot this dataset on
|
||||||
|
yAxisID | `String` | The ID of the y axis to plot this dataset on
|
||||||
|
backgroundColor | `Color or Array<Color>` | The fill color of the bars. See [Colors](#getting-started-colors)
|
||||||
|
borderColor | `Color or Array<Color>` | Bar border color
|
||||||
|
borderWidth | `Number or Array<Number>` | Border width of bar in pixels
|
||||||
|
borderSkipped | `String or Array<String>` | Which edge to skip drawing the border for. Options are 'bottom', 'left', 'top', and 'right'
|
||||||
|
hoverBackgroundColor | `Color or Array<Color>` | Bar background color when hovered
|
||||||
|
hoverBorderColor | `Color or Array<Color>` | Bar border color when hovered
|
||||||
|
hoverBorderWidth | `Number or Array<Number>` | Border width of bar when hovered
|
||||||
|
|
||||||
|
An example data object using these attributes is shown below.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var data = {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [
|
||||||
|
{
|
||||||
|
label: "My First dataset",
|
||||||
|
backgroundColor: "rgba(255,99,132,0.2)",
|
||||||
|
borderColor: "rgba(255,99,132,1)",
|
||||||
|
borderWidth: 1,
|
||||||
|
hoverBackgroundColor: "rgba(255,99,132,0.4)",
|
||||||
|
hoverBorderColor: "rgba(255,99,132,1)",
|
||||||
|
data: [65, 59, 80, 81, 56, 55, 40],
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
```
|
||||||
|
The bar chart has the a very similar data structure to the line chart, and has an array of datasets, each with colours and an array of data.
|
||||||
|
We have an array of labels too for display. In the example, we are showing the same data as the previous line chart example.
|
||||||
|
|
||||||
|
### Chart Options
|
||||||
|
|
||||||
|
These are the customisation options specific to Bar charts. These options are merged with the [global chart configuration options](#global-chart-configuration), and form the options of the chart.
|
||||||
|
|
||||||
|
The default options for bar chart are defined in `Chart.defaults.bar`.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- |:---:| --- | ---
|
||||||
|
*hover*.mode | String | "label" | Label's hover mode. "label" is used since the x axis displays data by the index in the dataset.
|
||||||
|
scales | Object | - | -
|
||||||
|
*scales*.xAxes | Array | | The bar chart officially supports only 1 x-axis but uses an array to keep the API consistent. Use a scatter chart if you need multiple x axes.
|
||||||
|
*Options for xAxes* | | |
|
||||||
|
type | String | "Category" | As defined in [Scales](#scales-category-scale).
|
||||||
|
display | Boolean | true | If true, show the scale.
|
||||||
|
id | String | "x-axis-0" | Id of the axis so that data can bind to it
|
||||||
|
stacked | Boolean | false | If true, bars are stacked on the x-axis
|
||||||
|
categoryPercentage | Number | 0.8 | Percent (0-1) of the available width (the space between the gridlines for small datasets) for each data-point to use for the bars. [Read More](#bar-chart-barpercentage-vs-categorypercentage)
|
||||||
|
barPercentage | Number | 0.9 | Percent (0-1) of the available width each bar should be within the category percentage. 1.0 will take the whole category width and put the bars right next to each other. [Read More](#bar-chart-barpercentage-vs-categorypercentage)
|
||||||
|
gridLines | Object | [See Scales](#scales) |
|
||||||
|
*gridLines*.offsetGridLines | Boolean | true | If true, the bars for a particular data point fall between the grid lines. If false, the grid line will go right down the middle of the bars.
|
||||||
|
| | |
|
||||||
|
*scales*.yAxes | Array | `[{ type: "linear" }]` |
|
||||||
|
*Options for xAxes* | | |
|
||||||
|
type | String | "linear" | As defined in [Scales](#scales-linear-scale).
|
||||||
|
display | Boolean | true | If true, show the scale.
|
||||||
|
id | String | "y-axis-0" | Id of the axis so that data can bind to it.
|
||||||
|
stacked | Boolean | false | If true, bars are stacked on the y-axis
|
||||||
|
|
||||||
|
You can override these for your `Chart` instance by passing a second argument into the `Bar` method as an object with the keys you want to override.
|
||||||
|
|
||||||
|
For example, we could have a bar chart without a stroke on each bar by doing the following:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
new Chart(ctx, {
|
||||||
|
type: "bar",
|
||||||
|
data: data,
|
||||||
|
options: {
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
stacked: true
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
stacked: true
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// This will create a chart with all of the default options, merged from the global config,
|
||||||
|
// and the Bar chart defaults but this particular instance will have `stacked` set to true
|
||||||
|
// for both x and y axes.
|
||||||
|
```
|
||||||
|
|
||||||
|
We can also change these defaults values for each Bar type that is created, this object is available at `Chart.defaults.bar`. For horizontal bars, this object is available at `Chart.defaults.horizontalBar`.
|
||||||
|
|
||||||
|
The default options for horizontal bar charts are defined in `Chart.defaults.horizontalBar` and are same as those of the bar chart, but with `xAxes` and `yAxes` swapped and the following additional options.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- |:---:| --- | ---
|
||||||
|
*Options for xAxes* | | |
|
||||||
|
position | String | "bottom" |
|
||||||
|
*Options for yAxes* | | |
|
||||||
|
position | String | "left" |
|
||||||
|
|
||||||
|
### barPercentage vs categoryPercentage
|
||||||
|
|
||||||
|
The following shows the relationship between the bar percentage option and the category percentage option.
|
||||||
|
|
||||||
|
```text
|
||||||
|
// categoryPercentage: 1.0
|
||||||
|
// barPercentage: 1.0
|
||||||
|
Bar: | 1.0 | 1.0 |
|
||||||
|
Category: | 1.0 |
|
||||||
|
Sample: |===========|
|
||||||
|
|
||||||
|
// categoryPercentage: 1.0
|
||||||
|
// barPercentage: 0.5
|
||||||
|
Bar: |.5| |.5|
|
||||||
|
Category: | 1.0 |
|
||||||
|
Sample: |==============|
|
||||||
|
|
||||||
|
// categoryPercentage: 0.5
|
||||||
|
// barPercentage: 1.0
|
||||||
|
Bar: |1.||1.|
|
||||||
|
Category: | .5 |
|
||||||
|
Sample: |==============|
|
||||||
|
```
|
124
public/vendors/Chart.js/docs/05-Radar-Chart.md
vendored
Normal file
124
public/vendors/Chart.js/docs/05-Radar-Chart.md
vendored
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
---
|
||||||
|
title: Radar Chart
|
||||||
|
anchor: radar-chart
|
||||||
|
---
|
||||||
|
|
||||||
|
### Introduction
|
||||||
|
A radar chart is a way of showing multiple data points and the variation between them.
|
||||||
|
|
||||||
|
They are often useful for comparing the points of two or more different data sets.
|
||||||
|
|
||||||
|
<div class="canvas-holder">
|
||||||
|
<canvas width="250" height="125"></canvas>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
### Example Usage
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var myRadarChart = new Chart(ctx, {
|
||||||
|
type: 'radar',
|
||||||
|
data: data,
|
||||||
|
options: options
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Structure
|
||||||
|
|
||||||
|
The following options can be included in a radar chart dataset to configure options for that specific dataset.
|
||||||
|
|
||||||
|
All point* properties can be specified as an array. If these are set to an array value, the first value applies to the first point, the second value to the second point, and so on.
|
||||||
|
|
||||||
|
Property | Type | Usage
|
||||||
|
--- | --- | ---
|
||||||
|
data | `Array<Number>` | The data to plot in a line
|
||||||
|
label | `String` | The label for the dataset which appears in the legend and tooltips
|
||||||
|
fill | `Boolean` | If true, fill the area under the line
|
||||||
|
lineTension | `Number` | Bezier curve tension of the line. Set to 0 to draw straightlines. *Note* This was renamed from 'tension' but the old name still works.
|
||||||
|
backgroundColor | `Color` | The fill color under the line. See [Colors](#getting-started-colors)
|
||||||
|
borderWidth | `Number` | The width of the line in pixels
|
||||||
|
borderColor | `Color` | The color of the line.
|
||||||
|
borderCapStyle | `String` | Cap style of the line. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap)
|
||||||
|
borderDash | `Array<Number>` | Length and spacing of dashes. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash)
|
||||||
|
borderDashOffset | `Number` | Offset for line dashes. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset)
|
||||||
|
borderJoinStyle | `String` | Line joint style. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin)
|
||||||
|
pointBorderColor | `Color or Array<Color>` | The border color for points.
|
||||||
|
pointBackgroundColor | `Color or Array<Color>` | The fill color for points
|
||||||
|
pointBorderWidth | `Number or Array<Number>` | The width of the point border in pixels
|
||||||
|
pointRadius | `Number or Array<Number>` | The radius of the point shape. If set to 0, nothing is rendered.
|
||||||
|
pointHoverRadius | `Number or Array<Number>` | The radius of the point when hovered
|
||||||
|
hitRadius | `Number or Array<Number>` | The pixel size of the non-displayed point that reacts to mouse events
|
||||||
|
pointHoverBackgroundColor | `Color or Array<Color>` | Point background color when hovered
|
||||||
|
pointHoverBorderColor | `Color or Array<Color>` | Point border color when hovered
|
||||||
|
pointHoverBorderWidth | `Number or Array<Number>` | Border width of point when hovered
|
||||||
|
pointStyle | `String or Array<String>` | The style of point. Options include 'circle', 'triangle', 'rect', 'rectRot', 'cross', 'crossRot', 'star', 'line', and 'dash'
|
||||||
|
|
||||||
|
An example data object using these attributes is shown below.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var data = {
|
||||||
|
labels: ["Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running"],
|
||||||
|
datasets: [
|
||||||
|
{
|
||||||
|
label: "My First dataset",
|
||||||
|
backgroundColor: "rgba(179,181,198,0.2)",
|
||||||
|
borderColor: "rgba(179,181,198,1)",
|
||||||
|
pointBackgroundColor: "rgba(179,181,198,1)",
|
||||||
|
pointBorderColor: "#fff",
|
||||||
|
pointHoverBackgroundColor: "#fff",
|
||||||
|
pointHoverBorderColor: "rgba(179,181,198,1)",
|
||||||
|
data: [65, 59, 90, 81, 56, 55, 40]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "My Second dataset",
|
||||||
|
backgroundColor: "rgba(255,99,132,0.2)",
|
||||||
|
borderColor: "rgba(255,99,132,1)",
|
||||||
|
pointBackgroundColor: "rgba(255,99,132,1)",
|
||||||
|
pointBorderColor: "#fff",
|
||||||
|
pointHoverBackgroundColor: "#fff",
|
||||||
|
pointHoverBorderColor: "rgba(255,99,132,1)",
|
||||||
|
data: [28, 48, 40, 19, 96, 27, 100]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
```
|
||||||
|
For a radar chart, to provide context of what each point means, we include an array of strings that show around each point in the chart.
|
||||||
|
For the radar chart data, we have an array of datasets. Each of these is an object, with a fill colour, a stroke colour, a colour for the fill of each point, and a colour for the stroke of each point. We also have an array of data values.
|
||||||
|
The label key on each dataset is optional, and can be used when generating a scale for the chart.
|
||||||
|
|
||||||
|
|
||||||
|
### Chart Options
|
||||||
|
|
||||||
|
These are the customisation options specific to Radar charts. These options are merged with the [global chart configuration options](#global-chart-configuration), and form the options of the chart.
|
||||||
|
|
||||||
|
The default options for radar chart are defined in `Chart.defaults.radar`.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
scale | Object | [See Scales](#scales) and [Defaults for Radial Linear Scale](#scales-radial-linear-scale) | Options for the one scale used on the chart. Use this to style the ticks, labels, and grid lines.
|
||||||
|
*scale*.type | String |"radialLinear" | As defined in ["Radial Linear"](#scales-radial-linear-scale).
|
||||||
|
*elements*.line | Object | | Options for all line elements used on the chart, as defined in the global elements, duplicated here to show Radar chart specific defaults.
|
||||||
|
*elements.line*.lineTension | Number | 0 | Tension exhibited by lines when calculating splineCurve. Setting to 0 creates straight lines.
|
||||||
|
|
||||||
|
You can override these for your `Chart` instance by passing a second argument into the `Radar` method as an object with the keys you want to override.
|
||||||
|
|
||||||
|
For example, we could have a radar chart without a point for each on piece of data by doing the following:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
new Chart(ctx, {
|
||||||
|
type: "radar",
|
||||||
|
data: data,
|
||||||
|
options: {
|
||||||
|
scale: {
|
||||||
|
reverse: true,
|
||||||
|
ticks: {
|
||||||
|
beginAtZero: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// This will create a chart with all of the default options, merged from the global config,
|
||||||
|
// and the Radar chart defaults but this particular instance's scale will be reversed as
|
||||||
|
// well as the ticks beginning at zero.
|
||||||
|
```
|
||||||
|
|
||||||
|
We can also change these defaults values for each Radar type that is created, this object is available at `Chart.defaults.radar`.
|
108
public/vendors/Chart.js/docs/06-Polar-Area-Chart.md
vendored
Normal file
108
public/vendors/Chart.js/docs/06-Polar-Area-Chart.md
vendored
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
---
|
||||||
|
title: Polar Area Chart
|
||||||
|
anchor: polar-area-chart
|
||||||
|
---
|
||||||
|
### Introduction
|
||||||
|
Polar area charts are similar to pie charts, but each segment has the same angle - the radius of the segment differs depending on the value.
|
||||||
|
|
||||||
|
This type of chart is often useful when we want to show a comparison data similar to a pie chart, but also show a scale of values for context.
|
||||||
|
|
||||||
|
<div class="canvas-holder">
|
||||||
|
<canvas width="250" height="125"></canvas>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
### Example Usage
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
new Chart(ctx, {
|
||||||
|
data: data,
|
||||||
|
type: 'polarArea',
|
||||||
|
options: options
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Structure
|
||||||
|
|
||||||
|
The following options can be included in a polar area chart dataset to configure options for that specific dataset.
|
||||||
|
|
||||||
|
Some properties are specified as arrays. The first value applies to the first bar, the second value to the second bar, and so on.
|
||||||
|
|
||||||
|
Property | Type | Usage
|
||||||
|
--- | --- | ---
|
||||||
|
data | `Array<Number>` | The data to plot as bars
|
||||||
|
label | `String` | The label for the dataset which appears in the legend and tooltips
|
||||||
|
backgroundColor | `Array<Color>` | The fill color of the arcs. See [Colors](#getting-started-colors)
|
||||||
|
borderColor | `Array<Color>` | Arc border color
|
||||||
|
borderWidth | `Array<Number>` | Border width of arcs in pixels
|
||||||
|
hoverBackgroundColor | `Array<Color>` | Arc background color when hovered
|
||||||
|
hoverBorderColor | `Array<Color>` | Arc border color when hovered
|
||||||
|
hoverBorderWidth | `Array<Number>` | Border width of arc when hovered
|
||||||
|
|
||||||
|
An example data object using these attributes is shown below.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var data = {
|
||||||
|
datasets: [{
|
||||||
|
data: [
|
||||||
|
11,
|
||||||
|
16,
|
||||||
|
7,
|
||||||
|
3,
|
||||||
|
14
|
||||||
|
],
|
||||||
|
backgroundColor: [
|
||||||
|
"#FF6384",
|
||||||
|
"#4BC0C0",
|
||||||
|
"#FFCE56",
|
||||||
|
"#E7E9ED",
|
||||||
|
"#36A2EB"
|
||||||
|
],
|
||||||
|
label: 'My dataset' // for legend
|
||||||
|
}],
|
||||||
|
labels: [
|
||||||
|
"Red",
|
||||||
|
"Green",
|
||||||
|
"Yellow",
|
||||||
|
"Grey",
|
||||||
|
"Blue"
|
||||||
|
]
|
||||||
|
};
|
||||||
|
```
|
||||||
|
As you can see, for the chart data you pass in an array of objects, with a value and a colour. The value attribute should be a number, while the color attribute should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL.
|
||||||
|
|
||||||
|
### Chart Options
|
||||||
|
|
||||||
|
These are the customisation options specific to Polar Area charts. These options are merged with the [global chart configuration options](#global-chart-configuration), and form the options of the chart.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
scale | Object | [See Scales](#scales) and [Defaults for Radial Linear Scale](#scales-radial-linear-scale) | Options for the one scale used on the chart. Use this to style the ticks, labels, and grid.
|
||||||
|
*scale*.type | String |"radialLinear" | As defined in ["Radial Linear"](#scales-radial-linear-scale).
|
||||||
|
*scale*.lineArc | Boolean | true | When true, lines are circular.
|
||||||
|
*animation*.animateRotate | Boolean |true | If true, will animate the rotation of the chart.
|
||||||
|
*animation*.animateScale | Boolean | true | If true, will animate scaling the chart.
|
||||||
|
*legend*.*labels*.generateLabels | Function | `function(data) {} ` | Returns labels for each the legend
|
||||||
|
*legend*.onClick | Function | function(event, legendItem) {} ` | Handles clicking an individual legend item
|
||||||
|
legendCallback | Function | `function(chart) ` | Generates the HTML legend via calls to `generateLegend`
|
||||||
|
|
||||||
|
You can override these for your `Chart` instance by passing a second argument into the `PolarArea` method as an object with the keys you want to override.
|
||||||
|
|
||||||
|
For example, we could have a polar area chart with a black stroke on each segment like so:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
new Chart(ctx, {
|
||||||
|
data: data,
|
||||||
|
type: "polarArea",
|
||||||
|
options: {
|
||||||
|
elements: {
|
||||||
|
arc: {
|
||||||
|
borderColor: "#000000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// This will create a chart with all of the default options, merged from the global config,
|
||||||
|
// and the PolarArea chart defaults but this particular instance will have `elements.arc.borderColor` set to `"#000000"`.
|
||||||
|
```
|
||||||
|
|
||||||
|
We can also change these defaults values for each PolarArea type that is created, this object is available at `Chart.defaults.polarArea`.
|
113
public/vendors/Chart.js/docs/07-Pie-Doughnut-Chart.md
vendored
Normal file
113
public/vendors/Chart.js/docs/07-Pie-Doughnut-Chart.md
vendored
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
---
|
||||||
|
title: Pie & Doughnut Charts
|
||||||
|
anchor: doughnut-pie-chart
|
||||||
|
---
|
||||||
|
### Introduction
|
||||||
|
Pie and doughnut charts are probably the most commonly used chart there are. They are divided into segments, the arc of each segment shows the proportional value of each piece of data.
|
||||||
|
|
||||||
|
They are excellent at showing the relational proportions between data.
|
||||||
|
|
||||||
|
Pie and doughnut charts are effectively the same class in Chart.js, but have one different default value - their `cutoutPercentage`. This equates what percentage of the inner should be cut out. This defaults to `0` for pie charts, and `50` for doughnuts.
|
||||||
|
|
||||||
|
They are also registered under two aliases in the `Chart` core. Other than their different default value, and different alias, they are exactly the same.
|
||||||
|
|
||||||
|
<div class="canvas-holder half">
|
||||||
|
<canvas width="250" height="125"></canvas>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="canvas-holder half">
|
||||||
|
<canvas width="250" height="125"></canvas>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
### Example Usage
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// For a pie chart
|
||||||
|
var myPieChart = new Chart(ctx,{
|
||||||
|
type: 'pie',
|
||||||
|
data: data,
|
||||||
|
options: options
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// And for a doughnut chart
|
||||||
|
var myDoughnutChart = new Chart(ctx, {
|
||||||
|
type: 'doughnut',
|
||||||
|
data: data,
|
||||||
|
options: options
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Structure
|
||||||
|
|
||||||
|
Property | Type | Usage
|
||||||
|
--- | --- | ---
|
||||||
|
data | `Array<Number>` | The data to plot as bars
|
||||||
|
label | `String` | The label for the dataset which appears in the legend and tooltips
|
||||||
|
backgroundColor | `Array<Color>` | The fill color of the arcs. See [Colors](#getting-started-colors)
|
||||||
|
borderColor | `Array<Color>` | Arc border color
|
||||||
|
borderWidth | `Array<Number>` | Border width of arcs in pixels
|
||||||
|
hoverBackgroundColor | `Array<Color>` | Arc background color when hovered
|
||||||
|
hoverBorderColor | `Array<Color>` | Arc border color when hovered
|
||||||
|
hoverBorderWidth | `Array<Number>` | Border width of arc when hovered
|
||||||
|
|
||||||
|
An example data object using these attributes is shown below.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var data = {
|
||||||
|
labels: [
|
||||||
|
"Red",
|
||||||
|
"Blue",
|
||||||
|
"Yellow"
|
||||||
|
],
|
||||||
|
datasets: [
|
||||||
|
{
|
||||||
|
data: [300, 50, 100],
|
||||||
|
backgroundColor: [
|
||||||
|
"#FF6384",
|
||||||
|
"#36A2EB",
|
||||||
|
"#FFCE56"
|
||||||
|
],
|
||||||
|
hoverBackgroundColor: [
|
||||||
|
"#FF6384",
|
||||||
|
"#36A2EB",
|
||||||
|
"#FFCE56"
|
||||||
|
]
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
For a pie chart, datasets need to contain an array of data points. The data points should be a number, Chart.js will total all of the numbers and calculate the relative proportion of each. You can also add an array of background colors. The color attributes should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL.
|
||||||
|
|
||||||
|
### Chart Options
|
||||||
|
|
||||||
|
These are the customisation options specific to Pie & Doughnut charts. These options are merged with the [global chart configuration options](#global-chart-configuration), and form the options of the chart.
|
||||||
|
|
||||||
|
Name | Type | Default | Description
|
||||||
|
--- | --- | --- | ---
|
||||||
|
cutoutPercentage | Number | 50 - for doughnut, 0 - for pie | The percentage of the chart that is cut out of the middle.
|
||||||
|
rotation | Number | -0.5 * Math.PI | Starting angle to draw arcs from
|
||||||
|
circumference | Number | 2 * Math.PI | Sweep to allow arcs to cover
|
||||||
|
*animation*.animateRotate | Boolean |true | If true, will animate the rotation of the chart.
|
||||||
|
*animation*.animateScale | Boolean | false | If true, will animate scaling the Doughnut from the centre.
|
||||||
|
*legend*.*labels*.generateLabels | Function | `function(chart) {} ` | Returns a label for each item to be displayed on the legend.
|
||||||
|
*legend*.onClick | Function | function(event, legendItem) {} ` | Handles clicking an individual legend item
|
||||||
|
|
||||||
|
You can override these for your `Chart` instance by passing a second argument into the `Doughnut` method as an object with the keys you want to override.
|
||||||
|
|
||||||
|
For example, we could have a doughnut chart that animates by scaling out from the centre like so:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
new Chart(ctx,{
|
||||||
|
type:"doughnut",
|
||||||
|
animation:{
|
||||||
|
animateScale:true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// This will create a chart with all of the default options, merged from the global config,
|
||||||
|
// and the Doughnut chart defaults but this particular instance will have `animateScale` set to `true`.
|
||||||
|
```
|
||||||
|
|
||||||
|
We can also change these default values for each Doughnut type that is created, this object is available at `Chart.defaults.doughnut`. Pie charts also have a clone of these defaults available to change at `Chart.defaults.pie`, with the only difference being `cutoutPercentage` being set to 0.
|
100
public/vendors/Chart.js/docs/08-Bubble-Chart.md
vendored
Normal file
100
public/vendors/Chart.js/docs/08-Bubble-Chart.md
vendored
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
---
|
||||||
|
title: Bubble Chart
|
||||||
|
anchor: bubble-chart
|
||||||
|
---
|
||||||
|
### Introduction
|
||||||
|
A bubble chart is used to display three dimensions of data at the same time. The location of the bubble is determined by the first two dimensions and the corresponding horizontal and vertical axes. The third dimension is represented by the size of the individual bubbles.
|
||||||
|
|
||||||
|
<div class="canvas-holder">
|
||||||
|
<canvas width="250" height="125"></canvas>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
### Example Usage
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// For a bubble chart
|
||||||
|
var myBubbleChart = new Chart(ctx,{
|
||||||
|
type: 'bubble',
|
||||||
|
data: data,
|
||||||
|
options: options
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Structure
|
||||||
|
|
||||||
|
Property | Type | Usage
|
||||||
|
--- | --- | ---
|
||||||
|
data | `Array<BubbleDataObject>` | The data to plot as bubbles. See [Data format](#bubble-chart-data-format)
|
||||||
|
label | `String` | The label for the dataset which appears in the legend and tooltips
|
||||||
|
backgroundColor | `Color Array<Color>` | The fill color of the bubbles.
|
||||||
|
borderColor | `Color or Array<Color>` | The stroke color of the bubbles.
|
||||||
|
borderWidth | `Number or Array<Number>` | The stroke width of bubble in pixels.
|
||||||
|
hoverBackgroundColor | `Color or Array<Color>` | The fill color of the bubbles when hovered.
|
||||||
|
hoverBorderColor | `Color or Array<Color>` | The stroke color of the bubbles when hovered.
|
||||||
|
hoverBorderWidth | `Number or Array<Number>` | The stroke width of the bubbles when hovered.
|
||||||
|
hoverRadius | `Number or Array<Number>` | Additional radius to add to data radius on hover.
|
||||||
|
|
||||||
|
An example data object using these attributes is shown below. This example creates a single dataset with 2 different bubbles.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var data = {
|
||||||
|
datasets: [
|
||||||
|
{
|
||||||
|
label: 'First Dataset',
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
x: 20,
|
||||||
|
y: 30,
|
||||||
|
r: 15
|
||||||
|
},
|
||||||
|
{
|
||||||
|
x: 40,
|
||||||
|
y: 10,
|
||||||
|
r: 10
|
||||||
|
}
|
||||||
|
],
|
||||||
|
backgroundColor:"#FF6384",
|
||||||
|
hoverBackgroundColor: "#FF6384",
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Object
|
||||||
|
|
||||||
|
Data for the bubble chart is passed in the form of an object. The object must implement the following interface. It is important to note that the radius property, `r` is **not** scaled by the chart. It is the raw radius in pixels of the bubble that is drawn on the canvas.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
// X Value
|
||||||
|
x: <Number>,
|
||||||
|
|
||||||
|
// Y Value
|
||||||
|
y: <Number>,
|
||||||
|
|
||||||
|
// Radius of bubble. This is not scaled.
|
||||||
|
r: <Number>
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Chart Options
|
||||||
|
|
||||||
|
The bubble chart has no unique configuration options. To configure options common to all of the bubbles, the point element options are used.
|
||||||
|
|
||||||
|
For example, to give all bubbles a 1px wide black border, the following options would be used.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
new Chart(ctx,{
|
||||||
|
type:"bubble",
|
||||||
|
options: {
|
||||||
|
elements: {
|
||||||
|
points: {
|
||||||
|
borderWidth: 1,
|
||||||
|
borderColor: 'rgb(0, 0, 0)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
We can also change the default values for the Bubble chart type. Doing so will give all bubble charts created after this point the new defaults. The default configuration for the bubble chart can be accessed at `Chart.defaults.bubble`.
|
425
public/vendors/Chart.js/docs/09-Advanced.md
vendored
Normal file
425
public/vendors/Chart.js/docs/09-Advanced.md
vendored
Normal file
@ -0,0 +1,425 @@
|
|||||||
|
---
|
||||||
|
title: Advanced usage
|
||||||
|
anchor: advanced-usage
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
### Prototype Methods
|
||||||
|
|
||||||
|
For each chart, there are a set of global prototype methods on the shared `ChartType` which you may find useful. These are available on all charts created with Chart.js, but for the examples, let's use a line chart we've made.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// For example:
|
||||||
|
var myLineChart = new Chart(ctx, config);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### .destroy()
|
||||||
|
|
||||||
|
Use this to destroy any chart instances that are created. This will clean up any references stored to the chart object within Chart.js, along with any associated event listeners attached by Chart.js.
|
||||||
|
This must be called before the canvas is reused for a new chart.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Destroys a specific chart instance
|
||||||
|
myLineChart.destroy();
|
||||||
|
```
|
||||||
|
|
||||||
|
#### .update(duration, lazy)
|
||||||
|
|
||||||
|
Triggers an update of the chart. This can be safely called after replacing the entire data object. This will update all scales, legends, and then re-render the chart.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// duration is the time for the animation of the redraw in miliseconds
|
||||||
|
// lazy is a boolean. if true, the animation can be interupted by other animations
|
||||||
|
myLineChart.data.datasets[0].data[2] = 50; // Would update the first dataset's value of 'March' to be 50
|
||||||
|
myLineChart.update(); // Calling update now animates the position of March from 90 to 50.
|
||||||
|
```
|
||||||
|
|
||||||
|
#### .render(duration, lazy)
|
||||||
|
|
||||||
|
Triggers a redraw of all chart elements. Note, this does not update elements for new data. Use `.update()` in that case.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// duration is the time for the animation of the redraw in miliseconds
|
||||||
|
// lazy is a boolean. if true, the animation can be interupted by other animations
|
||||||
|
myLineChart.render(duration, lazy);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### .stop()
|
||||||
|
|
||||||
|
Use this to stop any current animation loop. This will pause the chart during any current animation frame. Call `.render()` to re-animate.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Stops the charts animation loop at its current frame
|
||||||
|
myLineChart.stop();
|
||||||
|
// => returns 'this' for chainability
|
||||||
|
```
|
||||||
|
|
||||||
|
#### .resize()
|
||||||
|
|
||||||
|
Use this to manually resize the canvas element. This is run each time the canvas container is resized, but you can call this method manually if you change the size of the canvas nodes container element.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Resizes & redraws to fill its container element
|
||||||
|
myLineChart.resize();
|
||||||
|
// => returns 'this' for chainability
|
||||||
|
```
|
||||||
|
|
||||||
|
#### .clear()
|
||||||
|
|
||||||
|
Will clear the chart canvas. Used extensively internally between animation frames, but you might find it useful.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Will clear the canvas that myLineChart is drawn on
|
||||||
|
myLineChart.clear();
|
||||||
|
// => returns 'this' for chainability
|
||||||
|
```
|
||||||
|
|
||||||
|
#### .toBase64Image()
|
||||||
|
|
||||||
|
This returns a base 64 encoded string of the chart in it's current state.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
myLineChart.toBase64Image();
|
||||||
|
// => returns png data url of the image on the canvas
|
||||||
|
```
|
||||||
|
|
||||||
|
#### .generateLegend()
|
||||||
|
|
||||||
|
Returns an HTML string of a legend for that chart. The legend is generated from the `legendCallback` in the options.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
myLineChart.generateLegend();
|
||||||
|
// => returns HTML string of a legend for this chart
|
||||||
|
```
|
||||||
|
|
||||||
|
#### .getElementAtEvent(e)
|
||||||
|
|
||||||
|
Calling `getElementAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the single element at the event position. If there are multiple items within range, only the first is returned
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
myLineChart.getElementAtEvent(e);
|
||||||
|
// => returns the first element at the event point.
|
||||||
|
```
|
||||||
|
|
||||||
|
#### .getElementsAtEvent(e)
|
||||||
|
|
||||||
|
Looks for the element under the event point, then returns all elements at the same data index. This is used internally for 'label' mode highlighting.
|
||||||
|
|
||||||
|
Calling `getElementsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the point elements that are at that the same position of that event.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
canvas.onclick = function(evt){
|
||||||
|
var activePoints = myLineChart.getElementsAtEvent(evt);
|
||||||
|
// => activePoints is an array of points on the canvas that are at the same position as the click event.
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application.
|
||||||
|
|
||||||
|
#### .getDatasetAtEvent(e)
|
||||||
|
|
||||||
|
Looks for the element under the event point, then returns all elements from that dataset. This is used internally for 'dataset' mode highlighting
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
myLineChart.getDatasetAtEvent(e);
|
||||||
|
// => returns an array of elements
|
||||||
|
```
|
||||||
|
|
||||||
|
### External Tooltips
|
||||||
|
|
||||||
|
You can enable custom tooltips in the global or chart configuration like so:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var myPieChart = new Chart(ctx, {
|
||||||
|
type: 'pie',
|
||||||
|
data: data,
|
||||||
|
options: {
|
||||||
|
tooltips: {
|
||||||
|
custom: function(tooltip) {
|
||||||
|
// tooltip will be false if tooltip is not visible or should be hidden
|
||||||
|
if (!tooltip) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, tooltip will be an object with all tooltip properties like:
|
||||||
|
|
||||||
|
// tooltip.caretSize
|
||||||
|
// tooltip.caretPadding
|
||||||
|
// tooltip.chart
|
||||||
|
// tooltip.cornerRadius
|
||||||
|
// tooltip.fillColor
|
||||||
|
// tooltip.font...
|
||||||
|
// tooltip.text
|
||||||
|
// tooltip.x
|
||||||
|
// tooltip.y
|
||||||
|
// etc...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
See `sample/line-customTooltips.html` for examples on how to get started.
|
||||||
|
|
||||||
|
### Writing New Scale Types
|
||||||
|
|
||||||
|
Starting with Chart.js 2.0 scales can be individually extended. Scales should always derive from Chart.Scale.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var MyScale = Chart.Scale.extend({
|
||||||
|
/* extensions ... */
|
||||||
|
});
|
||||||
|
|
||||||
|
// MyScale is now derived from Chart.Scale
|
||||||
|
```
|
||||||
|
|
||||||
|
Once you have created your scale class, you need to register it with the global chart object so that it can be used. A default config for the scale may be provided when registering the constructor. The first parameter to the register function is a string key that is used later to identify which scale type to use for a chart.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
Chart.scaleService.registerScaleType('myScale', MyScale, defaultConfigObject);
|
||||||
|
```
|
||||||
|
|
||||||
|
To use the new scale, simply pass in the string key to the config when creating a chart.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var lineChart = new Chart(ctx, {
|
||||||
|
data: data,
|
||||||
|
type: 'line',
|
||||||
|
options: {
|
||||||
|
scales: {
|
||||||
|
yAxes: [{
|
||||||
|
type: 'myScale' // this is the same key that was passed to the registerScaleType function
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Scale Properties
|
||||||
|
|
||||||
|
Scale instances are given the following properties during the fitting process.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
left: Number, // left edge of the scale bounding box
|
||||||
|
right: Number, // right edge of the bounding box'
|
||||||
|
top: Number,
|
||||||
|
bottom: Number,
|
||||||
|
width: Number, // the same as right - left
|
||||||
|
height: Number, // the same as bottom - top
|
||||||
|
|
||||||
|
// Margin on each side. Like css, this is outside the bounding box.
|
||||||
|
margins: {
|
||||||
|
left: Number,
|
||||||
|
right: Number,
|
||||||
|
top: Number,
|
||||||
|
bottom: Number,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Amount of padding on the inside of the bounding box (like CSS)
|
||||||
|
paddingLeft: Number,
|
||||||
|
paddingRight: Number,
|
||||||
|
paddingTop: Number,
|
||||||
|
paddingBottom: Number,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Scale Interface
|
||||||
|
To work with Chart.js, custom scale types must implement the following interface.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
// Determines the data limits. Should set this.min and this.max to be the data max/min
|
||||||
|
determineDataLimits: function() {},
|
||||||
|
|
||||||
|
// Generate tick marks. this.chart is the chart instance. The data object can be accessed as this.chart.data
|
||||||
|
// buildTicks() should create a ticks array on the axis instance, if you intend to use any of the implementations from the base class
|
||||||
|
buildTicks: function() {},
|
||||||
|
|
||||||
|
// Get the value to show for the data at the given index of the the given dataset, ie this.chart.data.datasets[datasetIndex].data[index]
|
||||||
|
getLabelForIndex: function(index, datasetIndex) {},
|
||||||
|
|
||||||
|
// Get the pixel (x coordinate for horizontal axis, y coordinate for vertical axis) for a given value
|
||||||
|
// @param index: index into the ticks array
|
||||||
|
// @param includeOffset: if true, get the pixel halway between the given tick and the next
|
||||||
|
getPixelForTick: function(index, includeOffset) {},
|
||||||
|
|
||||||
|
// Get the pixel (x coordinate for horizontal axis, y coordinate for vertical axis) for a given value
|
||||||
|
// @param value : the value to get the pixel for
|
||||||
|
// @param index : index into the data array of the value
|
||||||
|
// @param datasetIndex : index of the dataset the value comes from
|
||||||
|
// @param includeOffset : if true, get the pixel halway between the given tick and the next
|
||||||
|
getPixelForValue: function(value, index, datasetIndex, includeOffset) {}
|
||||||
|
|
||||||
|
// Get the value for a given pixel (x coordinate for horizontal axis, y coordinate for vertical axis)
|
||||||
|
// @param pixel : pixel value
|
||||||
|
getValueForPixel: function(pixel) {}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Optionally, the following methods may also be overwritten, but an implementation is already provided by the `Chart.Scale` base class.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Transform the ticks array of the scale instance into strings. The default implementation simply calls this.options.ticks.callback(numericalTick, index, ticks);
|
||||||
|
convertTicksToLabels: function() {},
|
||||||
|
|
||||||
|
// Determine how much the labels will rotate by. The default implementation will only rotate labels if the scale is horizontal.
|
||||||
|
calculateTickRotation: function() {},
|
||||||
|
|
||||||
|
// Fits the scale into the canvas.
|
||||||
|
// this.maxWidth and this.maxHeight will tell you the maximum dimensions the scale instance can be. Scales should endeavour to be as efficient as possible with canvas space.
|
||||||
|
// this.margins is the amount of space you have on either side of your scale that you may expand in to. This is used already for calculating the best label rotation
|
||||||
|
// You must set this.minSize to be the size of your scale. It must be an object containing 2 properties: width and height.
|
||||||
|
// You must set this.width to be the width and this.height to be the height of the scale
|
||||||
|
fit: function() {},
|
||||||
|
|
||||||
|
// Draws the scale onto the canvas. this.(left|right|top|bottom) will have been populated to tell you the area on the canvas to draw in
|
||||||
|
// @param chartArea : an object containing four properties: left, right, top, bottom. This is the rectangle that lines, bars, etc will be drawn in. It may be used, for example, to draw grid lines.
|
||||||
|
draw: function(chartArea) {},
|
||||||
|
```
|
||||||
|
|
||||||
|
The Core.Scale base class also has some utility functions that you may find useful.
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
// Returns true if the scale instance is horizontal
|
||||||
|
isHorizontal: function() {},
|
||||||
|
|
||||||
|
// Get the correct value from the value from this.chart.data.datasets[x].data[]
|
||||||
|
// If dataValue is an object, returns .x or .y depending on the return of isHorizontal()
|
||||||
|
// If the value is undefined, returns NaN
|
||||||
|
// Otherwise returns the value.
|
||||||
|
// Note that in all cases, the returned value is not guaranteed to be a Number
|
||||||
|
getRightValue: function(dataValue) {},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Writing New Chart Types
|
||||||
|
|
||||||
|
Chart.js 2.0 introduces the concept of controllers for each dataset. Like scales, new controllers can be written as needed.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
Chart.controllers.MyType = Chart.DatasetController.extend({
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// Now we can create a new instance of our chart, using the Chart.js API
|
||||||
|
new Chart(ctx, {
|
||||||
|
// this is the string the constructor was registered at, ie Chart.controllers.MyType
|
||||||
|
type: 'MyType',
|
||||||
|
data: data,
|
||||||
|
options: options
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Dataset Controller Interface
|
||||||
|
|
||||||
|
Dataset controllers must implement the following interface.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
// Create elements for each piece of data in the dataset. Store elements in an array on the dataset as dataset.metaData
|
||||||
|
addElements: function() {},
|
||||||
|
|
||||||
|
// Create a single element for the data at the given index and reset its state
|
||||||
|
addElementAndReset: function(index) {},
|
||||||
|
|
||||||
|
// Draw the representation of the dataset
|
||||||
|
// @param ease : if specified, this number represents how far to transition elements. See the implementation of draw() in any of the provided controllers to see how this should be used
|
||||||
|
draw: function(ease) {},
|
||||||
|
|
||||||
|
// Remove hover styling from the given element
|
||||||
|
removeHoverStyle: function(element) {},
|
||||||
|
|
||||||
|
// Add hover styling to the given element
|
||||||
|
setHoverStyle: function(element) {},
|
||||||
|
|
||||||
|
// Update the elements in response to new data
|
||||||
|
// @param reset : if true, put the elements into a reset state so they can animate to their final values
|
||||||
|
update: function(reset) {},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The following methods may optionally be overridden by derived dataset controllers
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
// Initializes the controller
|
||||||
|
initialize: function(chart, datasetIndex) {},
|
||||||
|
|
||||||
|
// Ensures that the dataset represented by this controller is linked to a scale. Overridden to helpers.noop in the polar area and doughnut controllers as these
|
||||||
|
// chart types using a single scale
|
||||||
|
linkScales: function() {},
|
||||||
|
|
||||||
|
// Called by the main chart controller when an update is triggered. The default implementation handles the number of data points changing and creating elements appropriately.
|
||||||
|
buildOrUpdateElements: function() {}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extending Existing Chart Types
|
||||||
|
|
||||||
|
Extending or replacing an existing controller type is easy. Simply replace the constructor for one of the built in types with your own.
|
||||||
|
|
||||||
|
The built in controller types are:
|
||||||
|
* `Chart.controllers.line`
|
||||||
|
* `Chart.controllers.bar`
|
||||||
|
* `Chart.controllers.radar`
|
||||||
|
* `Chart.controllers.doughnut`
|
||||||
|
* `Chart.controllers.polarArea`
|
||||||
|
* `Chart.controllers.bubble`
|
||||||
|
|
||||||
|
#### Bar Controller
|
||||||
|
The bar controller has a special property that you should be aware of. To correctly calculate the width of a bar, the controller must determine the number of datasets that map to bars. To do this, the bar controller attaches a property `bar` to the dataset during initialization. If you are creating a replacement or updated bar controller, you should do the same. This will ensure that charts with regular bars and your new derived bars will work seamlessly.
|
||||||
|
|
||||||
|
### Creating Plugins
|
||||||
|
|
||||||
|
Starting with v2.1.0, you can create plugins for chart.js. To register your plugin, simply call `Chart.pluginService.register` and pass your plugin in.
|
||||||
|
Plugins will be called at the following times
|
||||||
|
* Start of initialization
|
||||||
|
* End of initialization
|
||||||
|
* Start of update
|
||||||
|
* After the chart scales have calculated
|
||||||
|
* End of update (before render occurs)
|
||||||
|
* Start of draw
|
||||||
|
* End of draw
|
||||||
|
* Before an animation is started
|
||||||
|
|
||||||
|
Plugins should derive from Chart.PluginBase and implement the following interface
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
beforeInit: function(chartInstance) { },
|
||||||
|
afterInit: function(chartInstance) { },
|
||||||
|
|
||||||
|
beforeUpdate: function(chartInstance) { },
|
||||||
|
afterScaleUpdate: function(chartInstance) { }
|
||||||
|
afterUpdate: function(chartInstance) { },
|
||||||
|
|
||||||
|
// This is called at the start of a render. It is only called once, even if the animation will run for a number of frames. Use beforeDraw or afterDraw
|
||||||
|
// to do something on each animation frame
|
||||||
|
beforeRender: function(chartInstance) { },
|
||||||
|
|
||||||
|
// Easing is for animation
|
||||||
|
beforeDraw: function(chartInstance, easing) { },
|
||||||
|
afterDraw: function(chartInstance, easing) { }
|
||||||
|
|
||||||
|
destroy: function(chartInstance) { }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building Chart.js
|
||||||
|
|
||||||
|
Chart.js uses <a href="http://gulpjs.com/" target="_blank">gulp</a> to build the library into a single JavaScript file.
|
||||||
|
|
||||||
|
Firstly, we need to ensure development dependencies are installed. With node and npm installed, after cloning the Chart.js repo to a local directory, and navigating to that directory in the command line, we can run the following:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
npm install -g gulp
|
||||||
|
```
|
||||||
|
|
||||||
|
This will install the local development dependencies for Chart.js, along with a CLI for the JavaScript task runner <a href="http://gulpjs.com/" target="_blank">gulp</a>.
|
||||||
|
|
||||||
|
Now, we can run the `gulp build` task.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gulp build
|
||||||
|
```
|
35
public/vendors/Chart.js/docs/10-Notes.md
vendored
Normal file
35
public/vendors/Chart.js/docs/10-Notes.md
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
title: Notes
|
||||||
|
anchor: notes
|
||||||
|
---
|
||||||
|
### Previous versions
|
||||||
|
|
||||||
|
Please note - documentation for previous versions are available on the GitHub repo. Version 1.x may continue to receive updates for bug fixes or high priority items.
|
||||||
|
|
||||||
|
- [1.x Documentation](https://github.com/chartjs/Chart.js/tree/v1.1.1/docs)
|
||||||
|
|
||||||
|
### Browser support
|
||||||
|
|
||||||
|
Chart.js offers support for all browsers where canvas is supported.
|
||||||
|
|
||||||
|
Browser support for the canvas element is available in all modern & major mobile browsers <a href="http://caniuse.com/#feat=canvas" target="_blank">(http://caniuse.com/#feat=canvas)</a>.
|
||||||
|
|
||||||
|
Thanks to <a href="https://browserstack.com" target="_blank">BrowserStack</a> for allowing our team to test on thousands of browsers.
|
||||||
|
|
||||||
|
|
||||||
|
### Bugs & issues
|
||||||
|
|
||||||
|
Please report these on the GitHub page - at <a href="https://github.com/chartjs/Chart.js" target="_blank">github.com/chartjs/Chart.js</a>. If you could include a link to a simple <a href="http://jsbin.com/" target="_blank">jsbin</a> or similar to demonstrate the issue, that'd be really helpful.
|
||||||
|
|
||||||
|
|
||||||
|
### Contributing
|
||||||
|
New contributions to the library are welcome, just a couple of guidelines:
|
||||||
|
|
||||||
|
- Tabs for indentation, not spaces please.
|
||||||
|
- Please ensure you're changing the individual files in `/src`, not the concatenated output in the `Chart.js` file in the root of the repo.
|
||||||
|
- Please check that your code will pass `jshint` code standards, `gulp jshint` will run this for you.
|
||||||
|
- Please keep pull requests concise, and document new functionality in the relevant `.md` file.
|
||||||
|
- Consider whether your changes are useful for all users, or if creating a Chart.js extension would be more appropriate.
|
||||||
|
|
||||||
|
### License
|
||||||
|
Chart.js is open source and available under the <a href="http://opensource.org/licenses/MIT" target="_blank">MIT license</a>.
|
226
public/vendors/Chart.js/gulpfile.js
vendored
Normal file
226
public/vendors/Chart.js/gulpfile.js
vendored
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
var gulp = require('gulp'),
|
||||||
|
concat = require('gulp-concat'),
|
||||||
|
uglify = require('gulp-uglify'),
|
||||||
|
util = require('gulp-util'),
|
||||||
|
jshint = require('gulp-jshint'),
|
||||||
|
size = require('gulp-size'),
|
||||||
|
connect = require('gulp-connect'),
|
||||||
|
replace = require('gulp-replace'),
|
||||||
|
htmlv = require('gulp-html-validator'),
|
||||||
|
insert = require('gulp-insert'),
|
||||||
|
inquirer = require('inquirer'),
|
||||||
|
semver = require('semver'),
|
||||||
|
exec = require('child_process').exec,
|
||||||
|
fs = require('fs'),
|
||||||
|
package = require('./package.json'),
|
||||||
|
bower = require('./bower.json'),
|
||||||
|
karma = require('gulp-karma'),
|
||||||
|
browserify = require('browserify'),
|
||||||
|
streamify = require('gulp-streamify'),
|
||||||
|
source = require('vinyl-source-stream'),
|
||||||
|
merge = require('merge-stream');
|
||||||
|
|
||||||
|
var srcDir = './src/';
|
||||||
|
var outDir = './dist/';
|
||||||
|
|
||||||
|
var header = "/*!\n" +
|
||||||
|
" * Chart.js\n" +
|
||||||
|
" * http://chartjs.org/\n" +
|
||||||
|
" * Version: {{ version }}\n" +
|
||||||
|
" *\n" +
|
||||||
|
" * Copyright 2016 Nick Downie\n" +
|
||||||
|
" * Released under the MIT license\n" +
|
||||||
|
" * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md\n" +
|
||||||
|
" */\n";
|
||||||
|
|
||||||
|
var preTestFiles = [
|
||||||
|
'./node_modules/moment/min/moment.min.js',
|
||||||
|
];
|
||||||
|
|
||||||
|
var testFiles = [
|
||||||
|
'./test/mockContext.js',
|
||||||
|
'./test/*.js',
|
||||||
|
|
||||||
|
// Disable tests which need to be rewritten based on changes introduced by
|
||||||
|
// the following changes: https://github.com/chartjs/Chart.js/pull/2346
|
||||||
|
'!./test/core.layoutService.tests.js',
|
||||||
|
'!./test/defaultConfig.tests.js',
|
||||||
|
];
|
||||||
|
|
||||||
|
gulp.task('build', buildTask);
|
||||||
|
gulp.task('coverage', coverageTask);
|
||||||
|
gulp.task('watch', watchTask);
|
||||||
|
gulp.task('bump', bumpTask);
|
||||||
|
gulp.task('release', ['build'], releaseTask);
|
||||||
|
gulp.task('jshint', jshintTask);
|
||||||
|
gulp.task('test', ['jshint', 'validHTML', 'unittest']);
|
||||||
|
gulp.task('size', ['library-size', 'module-sizes']);
|
||||||
|
gulp.task('server', serverTask);
|
||||||
|
gulp.task('validHTML', validHTMLTask);
|
||||||
|
gulp.task('unittest', unittestTask);
|
||||||
|
gulp.task('unittestWatch', unittestWatchTask);
|
||||||
|
gulp.task('library-size', librarySizeTask);
|
||||||
|
gulp.task('module-sizes', moduleSizesTask);
|
||||||
|
gulp.task('_open', _openTask);
|
||||||
|
gulp.task('dev', ['server', 'default']);
|
||||||
|
|
||||||
|
gulp.task('default', ['build', 'watch']);
|
||||||
|
|
||||||
|
|
||||||
|
function buildTask() {
|
||||||
|
|
||||||
|
var bundled = browserify('./src/chart.js')
|
||||||
|
.bundle()
|
||||||
|
.pipe(source('Chart.bundle.js'))
|
||||||
|
.pipe(insert.prepend(header))
|
||||||
|
.pipe(streamify(replace('{{ version }}', package.version)))
|
||||||
|
.pipe(gulp.dest(outDir))
|
||||||
|
.pipe(streamify(uglify()))
|
||||||
|
.pipe(insert.prepend(header))
|
||||||
|
.pipe(streamify(replace('{{ version }}', package.version)))
|
||||||
|
.pipe(streamify(concat('Chart.bundle.min.js')))
|
||||||
|
.pipe(gulp.dest(outDir));
|
||||||
|
|
||||||
|
var nonBundled = browserify('./src/chart.js')
|
||||||
|
.ignore('moment')
|
||||||
|
.bundle()
|
||||||
|
.pipe(source('Chart.js'))
|
||||||
|
.pipe(insert.prepend(header))
|
||||||
|
.pipe(streamify(replace('{{ version }}', package.version)))
|
||||||
|
.pipe(gulp.dest(outDir))
|
||||||
|
.pipe(streamify(uglify()))
|
||||||
|
.pipe(insert.prepend(header))
|
||||||
|
.pipe(streamify(replace('{{ version }}', package.version)))
|
||||||
|
.pipe(streamify(concat('Chart.min.js')))
|
||||||
|
.pipe(gulp.dest(outDir));
|
||||||
|
|
||||||
|
return merge(bundled, nonBundled);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Usage : gulp bump
|
||||||
|
* Prompts: Version increment to bump
|
||||||
|
* Output: - New version number written into package.json & bower.json
|
||||||
|
*/
|
||||||
|
function bumpTask(complete) {
|
||||||
|
util.log('Current version:', util.colors.cyan(package.version));
|
||||||
|
var choices = ['major', 'premajor', 'minor', 'preminor', 'patch', 'prepatch', 'prerelease'].map(function(versionType) {
|
||||||
|
return versionType + ' (v' + semver.inc(package.version, versionType) + ')';
|
||||||
|
});
|
||||||
|
inquirer.prompt({
|
||||||
|
type: 'list',
|
||||||
|
name: 'version',
|
||||||
|
message: 'What version update would you like?',
|
||||||
|
choices: choices
|
||||||
|
}, function(res) {
|
||||||
|
var increment = res.version.split(' ')[0],
|
||||||
|
newVersion = semver.inc(package.version, increment),
|
||||||
|
oldVersion = package.version;
|
||||||
|
|
||||||
|
// Set the new versions into the bower/package object
|
||||||
|
package.version = newVersion;
|
||||||
|
bower.version = newVersion;
|
||||||
|
|
||||||
|
// Write these to their own files, then build the output
|
||||||
|
fs.writeFileSync('package.json', JSON.stringify(package, null, 2));
|
||||||
|
fs.writeFileSync('bower.json', JSON.stringify(bower, null, 2));
|
||||||
|
|
||||||
|
var oldCDN = 'https://cdnjs.cloudflare.com/ajax/libs/Chart.js/'+oldVersion+'/Chart.min.js',
|
||||||
|
newCDN = 'https://cdnjs.cloudflare.com/ajax/libs/Chart.js/'+newVersion+'/Chart.min.js';
|
||||||
|
|
||||||
|
gulp.src(['./README.md'])
|
||||||
|
.pipe(replace(oldCDN, newCDN))
|
||||||
|
.pipe(gulp.dest('./'));
|
||||||
|
|
||||||
|
complete();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function releaseTask() {
|
||||||
|
exec('git tag -a v' + package.version);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function jshintTask() {
|
||||||
|
return gulp.src(srcDir + '**/*.js')
|
||||||
|
.pipe(jshint('config.jshintrc'))
|
||||||
|
.pipe(jshint.reporter('jshint-stylish'))
|
||||||
|
.pipe(jshint.reporter('fail'));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function validHTMLTask() {
|
||||||
|
return gulp.src('samples/*.html')
|
||||||
|
.pipe(htmlv());
|
||||||
|
}
|
||||||
|
|
||||||
|
function startTest() {
|
||||||
|
var files = ['./src/**/*.js'];
|
||||||
|
Array.prototype.unshift.apply(files, preTestFiles);
|
||||||
|
Array.prototype.push.apply(files, testFiles);
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
function unittestTask() {
|
||||||
|
return gulp.src(startTest())
|
||||||
|
.pipe(karma({
|
||||||
|
configFile: 'karma.conf.ci.js',
|
||||||
|
action: 'run'
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
function unittestWatchTask() {
|
||||||
|
return gulp.src(startTest())
|
||||||
|
.pipe(karma({
|
||||||
|
configFile: 'karma.conf.js',
|
||||||
|
action: 'watch'
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
function coverageTask() {
|
||||||
|
return gulp.src(startTest())
|
||||||
|
.pipe(karma({
|
||||||
|
configFile: 'karma.coverage.conf.js',
|
||||||
|
action: 'run'
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
function librarySizeTask() {
|
||||||
|
return gulp.src('dist/Chart.bundle.min.js')
|
||||||
|
.pipe(size({
|
||||||
|
gzip: true
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
function moduleSizesTask() {
|
||||||
|
return gulp.src(srcDir + '**/*.js')
|
||||||
|
.pipe(uglify({
|
||||||
|
preserveComments: 'some'
|
||||||
|
}))
|
||||||
|
.pipe(size({
|
||||||
|
showFiles: true,
|
||||||
|
gzip: true
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
function watchTask() {
|
||||||
|
if (util.env.test) {
|
||||||
|
return gulp.watch('./src/**', ['build', 'unittest', 'unittestWatch']);
|
||||||
|
}
|
||||||
|
return gulp.watch('./src/**', ['build']);
|
||||||
|
}
|
||||||
|
|
||||||
|
function serverTask() {
|
||||||
|
connect.server({
|
||||||
|
port: 8000
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convenience task for opening the project straight from the command line
|
||||||
|
|
||||||
|
function _openTask() {
|
||||||
|
exec('open http://localhost:8000');
|
||||||
|
exec('subl .');
|
||||||
|
}
|
25
public/vendors/Chart.js/karma.conf.ci.js
vendored
Normal file
25
public/vendors/Chart.js/karma.conf.ci.js
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
module.exports = function(config) {
|
||||||
|
var configuration = {
|
||||||
|
browsers: ['Firefox'],
|
||||||
|
customLaunchers: {
|
||||||
|
Chrome_travis_ci: {
|
||||||
|
base: 'Chrome',
|
||||||
|
flags: ['--no-sandbox']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
frameworks: ['browserify', 'jasmine'],
|
||||||
|
reporters: ['progress', 'html'],
|
||||||
|
preprocessors: {
|
||||||
|
'src/**/*.js': ['browserify']
|
||||||
|
},
|
||||||
|
browserify: {
|
||||||
|
debug: true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (process.env.TRAVIS) {
|
||||||
|
configuration.browsers.push('Chrome_travis_ci');
|
||||||
|
}
|
||||||
|
|
||||||
|
config.set(configuration);
|
||||||
|
};
|
14
public/vendors/Chart.js/karma.conf.js
vendored
Normal file
14
public/vendors/Chart.js/karma.conf.js
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
module.exports = function(config) {
|
||||||
|
config.set({
|
||||||
|
browsers: ['Chrome', 'Firefox'],
|
||||||
|
frameworks: ['browserify', 'jasmine'],
|
||||||
|
reporters: ['progress', 'html'],
|
||||||
|
|
||||||
|
preprocessors: {
|
||||||
|
'src/**/*.js': ['browserify']
|
||||||
|
},
|
||||||
|
browserify: {
|
||||||
|
debug: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
43
public/vendors/Chart.js/karma.coverage.conf.js
vendored
Normal file
43
public/vendors/Chart.js/karma.coverage.conf.js
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
module.exports = function(config) {
|
||||||
|
var configuration = {
|
||||||
|
browsers: ['Firefox'],
|
||||||
|
|
||||||
|
frameworks: ['browserify', 'jasmine'],
|
||||||
|
|
||||||
|
preprocessors: {
|
||||||
|
'src/**/*.js': ['browserify']
|
||||||
|
},
|
||||||
|
browserify: {
|
||||||
|
debug: true,
|
||||||
|
transform: [['browserify-istanbul', {
|
||||||
|
instrumenterConfig: {
|
||||||
|
embed: true
|
||||||
|
}
|
||||||
|
}]]
|
||||||
|
},
|
||||||
|
|
||||||
|
reporters: ['progress', 'coverage'],
|
||||||
|
coverageReporter: {
|
||||||
|
dir: 'coverage/',
|
||||||
|
reporters: [
|
||||||
|
{ type: 'html', subdir: 'report-html' },
|
||||||
|
{ type: 'lcovonly', subdir: '.', file: 'lcov.info' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// If on the CI, use the CI chrome launcher
|
||||||
|
if (process.env.TRAVIS) {
|
||||||
|
configuration.browsers.push('Chrome_travis_ci');
|
||||||
|
configuration.customLaunchers = {
|
||||||
|
Chrome_travis_ci: {
|
||||||
|
base: 'Chrome',
|
||||||
|
flags: ['--no-sandbox']
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
configuration.browsers.push('Chrome');
|
||||||
|
}
|
||||||
|
|
||||||
|
config.set(configuration);
|
||||||
|
};
|
53
public/vendors/Chart.js/package.json
vendored
Normal file
53
public/vendors/Chart.js/package.json
vendored
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
{
|
||||||
|
"name": "chart.js",
|
||||||
|
"homepage": "http://www.chartjs.org",
|
||||||
|
"description": "Simple HTML5 charts using the canvas element.",
|
||||||
|
"version": "2.1.4",
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "src/chart.js",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/chartjs/Chart.js.git"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"browserify": "^13.0.0",
|
||||||
|
"browserify-istanbul": "^0.2.1",
|
||||||
|
"coveralls": "^2.11.6",
|
||||||
|
"gulp": "3.9.x",
|
||||||
|
"gulp-concat": "~2.1.x",
|
||||||
|
"gulp-connect": "~2.0.5",
|
||||||
|
"gulp-html-validator": "^0.0.2",
|
||||||
|
"gulp-insert": "~0.5.0",
|
||||||
|
"gulp-jshint": "~1.5.1",
|
||||||
|
"gulp-karma": "0.0.4",
|
||||||
|
"gulp-replace": "^0.4.0",
|
||||||
|
"gulp-size": "~0.4.0",
|
||||||
|
"gulp-streamify": "^1.0.2",
|
||||||
|
"gulp-uglify": "~0.2.x",
|
||||||
|
"gulp-umd": "~0.2.0",
|
||||||
|
"gulp-util": "~2.2.x",
|
||||||
|
"inquirer": "^0.5.1",
|
||||||
|
"jasmine": "^2.3.2",
|
||||||
|
"jasmine-core": "^2.3.4",
|
||||||
|
"jquery": "^2.1.4",
|
||||||
|
"jshint-stylish": "~2.1.0",
|
||||||
|
"karma": "^0.12.37",
|
||||||
|
"karma-browserify": "^5.0.1",
|
||||||
|
"karma-chrome-launcher": "^0.2.0",
|
||||||
|
"karma-coverage": "^0.5.1",
|
||||||
|
"karma-firefox-launcher": "^0.1.6",
|
||||||
|
"karma-jasmine": "^0.3.6",
|
||||||
|
"karma-jasmine-html-reporter": "^0.1.8",
|
||||||
|
"merge-stream": "^1.0.0",
|
||||||
|
"semver": "^3.0.1",
|
||||||
|
"vinyl-source-stream": "^1.1.0",
|
||||||
|
"watchify": "^3.7.0"
|
||||||
|
},
|
||||||
|
"spm": {
|
||||||
|
"main": "Chart.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"chartjs-color": "^2.0.0",
|
||||||
|
"moment": "^2.10.6"
|
||||||
|
}
|
||||||
|
}
|
170
public/vendors/Chart.js/samples/AnimationCallbacks/progress-bar.html
vendored
Normal file
170
public/vendors/Chart.js/samples/AnimationCallbacks/progress-bar.html
vendored
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title> Animation Callbacks </title>
|
||||||
|
<script src="../../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width: 75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
<progress id="animationProgress" max="1" value="0" style="width: 100%"></progress>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
||||||
|
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var $progress = $('#animationProgress');
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset ",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
fill: false,
|
||||||
|
borderDash: [5, 5],
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset ",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:"Chart.js Line Chart - Animation Progress Bar"
|
||||||
|
},
|
||||||
|
animation: {
|
||||||
|
duration: 2000,
|
||||||
|
onProgress: function(animation) {
|
||||||
|
$progress.attr({
|
||||||
|
value: animation.animationObject.currentStep / animation.animationObject.numSteps,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onComplete: function(animation) {
|
||||||
|
window.setTimeout(function() {
|
||||||
|
$progress.attr({
|
||||||
|
value: 0
|
||||||
|
});
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
tooltips: {
|
||||||
|
mode: 'label',
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
scaleLabel: {
|
||||||
|
show: true,
|
||||||
|
labelString: 'Month'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
scaleLabel: {
|
||||||
|
show: true,
|
||||||
|
labelString: 'Value'
|
||||||
|
},
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.borderColor = randomColor(0.4);
|
||||||
|
dataset.backgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderColor = randomColor(0.7);
|
||||||
|
dataset.pointBackgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myLine = new Chart(ctx, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return randomScalingFactor();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var newDataset = {
|
||||||
|
label: 'Dataset ' + config.data.datasets.length,
|
||||||
|
borderColor: randomColor(0.4),
|
||||||
|
backgroundColor: randomColor(0.5),
|
||||||
|
pointBorderColor: randomColor(0.7),
|
||||||
|
pointBackgroundColor: randomColor(0.5),
|
||||||
|
pointBorderWidth: 1,
|
||||||
|
data: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.labels.length; ++index) {
|
||||||
|
newDataset.data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
config.data.datasets.push(newDataset);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
var month = MONTHS[config.data.labels.length % MONTHS.length];
|
||||||
|
config.data.labels.push(month);
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data.push(randomScalingFactor());
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
config.data.datasets.splice(0, 1);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.labels.splice(-1, 1); // remove the label first
|
||||||
|
|
||||||
|
config.data.datasets.forEach(function(dataset, datasetIndex) {
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
143
public/vendors/Chart.js/samples/bar-horizontal.html
vendored
Normal file
143
public/vendors/Chart.js/samples/bar-horizontal.html
vendored
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Horizontal Bar Chart</title>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="container" style="width: 75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
||||||
|
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return (Math.random() > 0.5 ? 1.0 : -1.0) * Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function() {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',.7)';
|
||||||
|
};
|
||||||
|
|
||||||
|
var horizontalBarChartData = {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
label: 'Dataset 1',
|
||||||
|
backgroundColor: "rgba(220,220,220,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}, {
|
||||||
|
hidden: true,
|
||||||
|
label: 'Dataset 2',
|
||||||
|
backgroundColor: "rgba(151,187,205,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}, {
|
||||||
|
label: 'Dataset 3',
|
||||||
|
backgroundColor: "rgba(151,187,205,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}]
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myHorizontalBar = new Chart(ctx, {
|
||||||
|
type: 'horizontalBar',
|
||||||
|
data: horizontalBarChartData,
|
||||||
|
options: {
|
||||||
|
// Elements options apply to all of the options unless overridden in a dataset
|
||||||
|
// In this case, we are setting the border of each horizontal bar to be 2px wide and green
|
||||||
|
elements: {
|
||||||
|
rectangle: {
|
||||||
|
borderWidth: 2,
|
||||||
|
borderColor: 'rgb(0, 255, 0)',
|
||||||
|
borderSkipped: 'left'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
responsive: true,
|
||||||
|
legend: {
|
||||||
|
position: 'top',
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Chart.js Horizontal Bar Chart'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
var zero = Math.random() < 0.2 ? true : false;
|
||||||
|
$.each(horizontalBarChartData.datasets, function(i, dataset) {
|
||||||
|
dataset.backgroundColor = randomColor();
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return zero ? 0.0 : randomScalingFactor();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
window.myHorizontalBar.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var newDataset = {
|
||||||
|
label: 'Dataset ' + horizontalBarChartData.datasets.length,
|
||||||
|
backgroundColor: randomColor(),
|
||||||
|
data: []
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < horizontalBarChartData.labels.length; ++index) {
|
||||||
|
newDataset.data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
horizontalBarChartData.datasets.push(newDataset);
|
||||||
|
window.myHorizontalBar.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (horizontalBarChartData.datasets.length > 0) {
|
||||||
|
var month = MONTHS[horizontalBarChartData.labels.length % MONTHS.length];
|
||||||
|
horizontalBarChartData.labels.push(month);
|
||||||
|
|
||||||
|
for (var index = 0; index < horizontalBarChartData.datasets.length; ++index) {
|
||||||
|
horizontalBarChartData.datasets[index].data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
window.myHorizontalBar.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
horizontalBarChartData.datasets.splice(0, 1);
|
||||||
|
window.myHorizontalBar.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
horizontalBarChartData.labels.splice(-1, 1); // remove the label first
|
||||||
|
|
||||||
|
horizontalBarChartData.datasets.forEach(function (dataset, datasetIndex) {
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myHorizontalBar.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
102
public/vendors/Chart.js/samples/bar-multi-axis.html
vendored
Normal file
102
public/vendors/Chart.js/samples/bar-multi-axis.html
vendored
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Bar Chart Multi Axis</title>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width: 75%">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<script>
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return (Math.random() > 0.5 ? 1.0 : -1.0) * Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function() {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',.7)';
|
||||||
|
};
|
||||||
|
|
||||||
|
var barChartData = {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
label: 'Dataset 1',
|
||||||
|
backgroundColor: "rgba(220,220,220,0.5)",
|
||||||
|
yAxisID: "y-axis-1",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}, {
|
||||||
|
label: 'Dataset 2',
|
||||||
|
backgroundColor: "rgba(151,187,205,0.5)",
|
||||||
|
yAxisID: "y-axis-2",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}, {
|
||||||
|
label: 'Dataset 3',
|
||||||
|
backgroundColor: [randomColor(), randomColor(), randomColor(), randomColor(), randomColor(), randomColor(), randomColor()],
|
||||||
|
yAxisID: "y-axis-1",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}]
|
||||||
|
|
||||||
|
};
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myBar = Chart.Bar(ctx, {
|
||||||
|
data: barChartData,
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
hoverMode: 'label',
|
||||||
|
hoverAnimationDuration: 400,
|
||||||
|
stacked: false,
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:"Chart.js Bar Chart - Multi Axis"
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
yAxes: [{
|
||||||
|
type: "linear", // only linear but allow scale type registration. This allows extensions to exist solely for log scale for instance
|
||||||
|
display: true,
|
||||||
|
position: "left",
|
||||||
|
id: "y-axis-1",
|
||||||
|
}, {
|
||||||
|
type: "linear", // only linear but allow scale type registration. This allows extensions to exist solely for log scale for instance
|
||||||
|
display: true,
|
||||||
|
position: "right",
|
||||||
|
id: "y-axis-2",
|
||||||
|
gridLines: {
|
||||||
|
drawOnChartArea: false
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(barChartData.datasets, function(i, dataset) {
|
||||||
|
if (Chart.helpers.isArray(dataset.backgroundColor)) {
|
||||||
|
dataset.backgroundColor= [randomColor(), randomColor(), randomColor(), randomColor(), randomColor(), randomColor(), randomColor()];
|
||||||
|
} else {
|
||||||
|
dataset.backgroundColor= randomColor();
|
||||||
|
}
|
||||||
|
|
||||||
|
dataset.data = [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()];
|
||||||
|
|
||||||
|
});
|
||||||
|
window.myBar.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
84
public/vendors/Chart.js/samples/bar-stacked.html
vendored
Normal file
84
public/vendors/Chart.js/samples/bar-stacked.html
vendored
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Stacked Bar Chart</title>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width: 75%">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<script>
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return (Math.random() > 0.5 ? 1.0 : -1.0) * Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
|
||||||
|
var barChartData = {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
label: 'Dataset 1',
|
||||||
|
backgroundColor: "rgba(220,220,220,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}, {
|
||||||
|
label: 'Dataset 2',
|
||||||
|
backgroundColor: "rgba(151,187,205,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}, {
|
||||||
|
label: 'Dataset 3',
|
||||||
|
backgroundColor: "rgba(151,187,205,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}]
|
||||||
|
|
||||||
|
};
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myBar = new Chart(ctx, {
|
||||||
|
type: 'bar',
|
||||||
|
data: barChartData,
|
||||||
|
options: {
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:"Chart.js Bar Chart - Stacked"
|
||||||
|
},
|
||||||
|
tooltips: {
|
||||||
|
mode: 'label'
|
||||||
|
},
|
||||||
|
responsive: true,
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
stacked: true,
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
stacked: true
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(barChartData.datasets, function(i, dataset) {
|
||||||
|
dataset.backgroundColor = 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',.7)';
|
||||||
|
dataset.data = [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()];
|
||||||
|
|
||||||
|
});
|
||||||
|
window.myBar.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
144
public/vendors/Chart.js/samples/bar.html
vendored
Normal file
144
public/vendors/Chart.js/samples/bar.html
vendored
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Bar Chart</title>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="container" style="width: 75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
||||||
|
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return (Math.random() > 0.5 ? 1.0 : -1.0) * Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function() {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',.7)';
|
||||||
|
};
|
||||||
|
|
||||||
|
var barChartData = {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
label: 'Dataset 1',
|
||||||
|
backgroundColor: "rgba(220,220,220,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}, {
|
||||||
|
hidden: true,
|
||||||
|
label: 'Dataset 2',
|
||||||
|
backgroundColor: "rgba(151,187,205,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}, {
|
||||||
|
label: 'Dataset 3',
|
||||||
|
backgroundColor: "rgba(151,187,205,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}]
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myBar = new Chart(ctx, {
|
||||||
|
type: 'bar',
|
||||||
|
data: barChartData,
|
||||||
|
options: {
|
||||||
|
// Elements options apply to all of the options unless overridden in a dataset
|
||||||
|
// In this case, we are setting the border of each bar to be 2px wide and green
|
||||||
|
elements: {
|
||||||
|
rectangle: {
|
||||||
|
borderWidth: 2,
|
||||||
|
borderColor: 'rgb(0, 255, 0)',
|
||||||
|
borderSkipped: 'bottom'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
responsive: true,
|
||||||
|
legend: {
|
||||||
|
position: 'top',
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Chart.js Bar Chart'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
var zero = Math.random() < 0.2 ? true : false;
|
||||||
|
$.each(barChartData.datasets, function(i, dataset) {
|
||||||
|
dataset.backgroundColor = randomColor();
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return zero ? 0.0 : randomScalingFactor();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
window.myBar.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var newDataset = {
|
||||||
|
label: 'Dataset ' + barChartData.datasets.length,
|
||||||
|
backgroundColor: randomColor(),
|
||||||
|
data: []
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < barChartData.labels.length; ++index) {
|
||||||
|
newDataset.data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
barChartData.datasets.push(newDataset);
|
||||||
|
window.myBar.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (barChartData.datasets.length > 0) {
|
||||||
|
var month = MONTHS[barChartData.labels.length % MONTHS.length];
|
||||||
|
barChartData.labels.push(month);
|
||||||
|
|
||||||
|
for (var index = 0; index < barChartData.datasets.length; ++index) {
|
||||||
|
//window.myBar.addData(randomScalingFactor(), index);
|
||||||
|
barChartData.datasets[index].data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
window.myBar.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
barChartData.datasets.splice(0, 1);
|
||||||
|
window.myBar.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
barChartData.labels.splice(-1, 1); // remove the label first
|
||||||
|
|
||||||
|
barChartData.datasets.forEach(function(dataset, datasetIndex) {
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myBar.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
192
public/vendors/Chart.js/samples/bubble.html
vendored
Normal file
192
public/vendors/Chart.js/samples/bubble.html
vendored
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Bubble Chart</title>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<style type="text/css">
|
||||||
|
canvas{
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="container" style="width: 75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var DEFAULT_DATASET_SIZE = 7;
|
||||||
|
|
||||||
|
var addedCount = 0;
|
||||||
|
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return (Math.random() > 0.5 ? 1.0 : -1.0) * Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function() {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',.7)';
|
||||||
|
};
|
||||||
|
|
||||||
|
var bubbleChartData = {
|
||||||
|
animation: {
|
||||||
|
duration: 10000
|
||||||
|
},
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset",
|
||||||
|
backgroundColor: randomColor(),
|
||||||
|
data: [{
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset",
|
||||||
|
backgroundColor: randomColor(),
|
||||||
|
data: [{
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myChart = new Chart(ctx, {
|
||||||
|
type: 'bubble',
|
||||||
|
data: bubbleChartData,
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:'Chart.js Bubble Chart'
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
var zero = Math.random() < 0.2 ? true : false;
|
||||||
|
$.each(bubbleChartData.datasets, function(i, dataset) {
|
||||||
|
dataset.backgroundColor = randomColor();
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
});
|
||||||
|
window.myChart.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
++addedCount;
|
||||||
|
var newDataset = {
|
||||||
|
label: "My added dataset " + addedCount,
|
||||||
|
backgroundColor: randomColor(),
|
||||||
|
data: []
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < DEFAULT_DATASET_SIZE; ++index) {
|
||||||
|
newDataset.data.push({
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
bubbleChartData.datasets.push(newDataset);
|
||||||
|
window.myChart.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (bubbleChartData.datasets.length > 0) {
|
||||||
|
for (var index = 0; index < bubbleChartData.datasets.length; ++index) {
|
||||||
|
bubbleChartData.datasets[index].data.push({
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
r: Math.abs(randomScalingFactor()) / 5,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
window.myChart.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
bubbleChartData.datasets.splice(0, 1);
|
||||||
|
window.myChart.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
|
||||||
|
bubbleChartData.datasets.forEach(function(dataset, datasetIndex) {
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myChart.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
80
public/vendors/Chart.js/samples/combo-bar-line.html
vendored
Normal file
80
public/vendors/Chart.js/samples/combo-bar-line.html
vendored
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Combo Bar-Line Chart</title>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width: 75%">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<script>
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return (Math.random() > 0.5 ? 1.0 : -1.0) * Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
|
||||||
|
var barChartData = {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
type: 'bar',
|
||||||
|
label: 'Dataset 1',
|
||||||
|
backgroundColor: "rgba(151,187,205,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
borderColor: 'white',
|
||||||
|
borderWidth: 2
|
||||||
|
}, {
|
||||||
|
type: 'line',
|
||||||
|
label: 'Dataset 2',
|
||||||
|
backgroundColor: "rgba(151,187,205,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
borderColor: 'white',
|
||||||
|
borderWidth: 2
|
||||||
|
}, {
|
||||||
|
type: 'bar',
|
||||||
|
label: 'Dataset 3',
|
||||||
|
backgroundColor: "rgba(220,220,220,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}, ]
|
||||||
|
|
||||||
|
};
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myBar = new Chart(ctx, {
|
||||||
|
type: 'bar',
|
||||||
|
data: barChartData,
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Chart.js Combo Bar Line Chart'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(barChartData.datasets, function(i, dataset) {
|
||||||
|
dataset.backgroundColor = 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',.7)';
|
||||||
|
dataset.data = [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()];
|
||||||
|
|
||||||
|
});
|
||||||
|
window.myBar.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
95
public/vendors/Chart.js/samples/data_label_combo-bar-line.html
vendored
Normal file
95
public/vendors/Chart.js/samples/data_label_combo-bar-line.html
vendored
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Combo Bar-Line Chart</title>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width: 75%">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<script>
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return (Math.random() > 0.5 ? 1.0 : -1.0) * Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
|
||||||
|
var barChartData = {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
type: 'bar',
|
||||||
|
label: 'Dataset 1',
|
||||||
|
backgroundColor: "rgba(151,187,205,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
borderColor: 'white',
|
||||||
|
borderWidth: 2
|
||||||
|
}, {
|
||||||
|
type: 'line',
|
||||||
|
label: 'Dataset 2',
|
||||||
|
backgroundColor: "rgba(151,187,205,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
borderColor: 'white',
|
||||||
|
borderWidth: 2
|
||||||
|
}, {
|
||||||
|
type: 'bar',
|
||||||
|
label: 'Dataset 3',
|
||||||
|
backgroundColor: "rgba(220,220,220,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}, ]
|
||||||
|
|
||||||
|
};
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myBar = new Chart(ctx, {
|
||||||
|
type: 'bar',
|
||||||
|
data: barChartData,
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Chart.js Combo Bar Line Chart'
|
||||||
|
},
|
||||||
|
animation: {
|
||||||
|
onComplete: function () {
|
||||||
|
var chartInstance = this.chart;
|
||||||
|
var ctx = chartInstance.ctx;
|
||||||
|
ctx.textAlign = "center";
|
||||||
|
|
||||||
|
Chart.helpers.each(this.data.datasets.forEach(function (dataset, i) {
|
||||||
|
var meta = chartInstance.controller.getDatasetMeta(i);
|
||||||
|
Chart.helpers.each(meta.data.forEach(function (bar, index) {
|
||||||
|
ctx.fillText(dataset.data[index], bar._model.x, bar._model.y - 10);
|
||||||
|
}),this)
|
||||||
|
}),this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(barChartData.datasets, function(i, dataset) {
|
||||||
|
dataset.backgroundColor = 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',.7)';
|
||||||
|
dataset.data = [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()];
|
||||||
|
|
||||||
|
});
|
||||||
|
window.myBar.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
154
public/vendors/Chart.js/samples/different-point-sizes.html
vendored
Normal file
154
public/vendors/Chart.js/samples/different-point-sizes.html
vendored
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Line Chart</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 100 * (Math.random() > 0.5 ? -1 : 1));
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
label: "dataset - big points",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
fill: false,
|
||||||
|
borderDash: [5, 5],
|
||||||
|
pointRadius: 15,
|
||||||
|
pointHoverRadius: 10,
|
||||||
|
}, {
|
||||||
|
label: "dataset - individual point sizes",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
fill: false,
|
||||||
|
borderDash: [5, 5],
|
||||||
|
pointRadius: [2, 4, 6, 18, 0, 12, 20],
|
||||||
|
}, {
|
||||||
|
label: "dataset - large pointHoverRadius",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
fill: false,
|
||||||
|
pointHoverRadius: 30,
|
||||||
|
}, {
|
||||||
|
label: "dataset - large pointHitRadius",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
fill: false,
|
||||||
|
pointHitRadius: 20,
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
legend: {
|
||||||
|
position: 'bottom',
|
||||||
|
},
|
||||||
|
hover: {
|
||||||
|
mode: 'label'
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
display: true,
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'Month'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
display: true,
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'Value'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Chart.js Line Chart - Different point sizes'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
var background = randomColor(0.5);
|
||||||
|
dataset.borderColor = background;
|
||||||
|
dataset.backgroundColor = background;
|
||||||
|
dataset.pointBorderColor = background;
|
||||||
|
dataset.pointBackgroundColor = background;
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myLine = new Chart(ctx, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return randomScalingFactor();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
var month = MONTHS[config.data.labels.length % MONTHS.length];
|
||||||
|
config.data.labels.push(month);
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data.push(randomScalingFactor());
|
||||||
|
if (Array.isArray(dataset.pointRadius)) {
|
||||||
|
dataset.pointRadius.push(Math.random() * 30);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.labels.splice(-1, 1); // remove the label first
|
||||||
|
|
||||||
|
config.data.datasets.forEach(function(dataset, datasetIndex) {
|
||||||
|
dataset.data.pop();
|
||||||
|
if (Array.isArray(dataset.pointRadius)) {
|
||||||
|
dataset.pointRadius.pop();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
180
public/vendors/Chart.js/samples/doughnut.html
vendored
Normal file
180
public/vendors/Chart.js/samples/doughnut.html
vendored
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Doughnut Chart</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="canvas-holder" style="width:75%">
|
||||||
|
<canvas id="chart-area" />
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'doughnut',
|
||||||
|
data: {
|
||||||
|
datasets: [{
|
||||||
|
data: [
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
],
|
||||||
|
backgroundColor: [
|
||||||
|
"#F7464A",
|
||||||
|
"#46BFBD",
|
||||||
|
"#FDB45C",
|
||||||
|
"#949FB1",
|
||||||
|
"#4D5360",
|
||||||
|
],
|
||||||
|
label: 'Dataset 1'
|
||||||
|
}, {
|
||||||
|
hidden: true,
|
||||||
|
data: [
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
],
|
||||||
|
backgroundColor: [
|
||||||
|
"#F7464A",
|
||||||
|
"#46BFBD",
|
||||||
|
"#FDB45C",
|
||||||
|
"#949FB1",
|
||||||
|
"#4D5360",
|
||||||
|
],
|
||||||
|
label: 'Dataset 2'
|
||||||
|
}, {
|
||||||
|
data: [
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
],
|
||||||
|
backgroundColor: [
|
||||||
|
"#F7464A",
|
||||||
|
"#46BFBD",
|
||||||
|
"#FDB45C",
|
||||||
|
"#949FB1",
|
||||||
|
"#4D5360",
|
||||||
|
],
|
||||||
|
label: 'Dataset 3'
|
||||||
|
}],
|
||||||
|
labels: [
|
||||||
|
"Red",
|
||||||
|
"Green",
|
||||||
|
"Yellow",
|
||||||
|
"Grey",
|
||||||
|
"Dark Grey"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
legend: {
|
||||||
|
position: 'top',
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Chart.js Doughnut Chart'
|
||||||
|
},
|
||||||
|
animation: {
|
||||||
|
animateScale: true,
|
||||||
|
animateRotate: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("chart-area").getContext("2d");
|
||||||
|
window.myDoughnut = new Chart(ctx, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return randomScalingFactor();
|
||||||
|
});
|
||||||
|
|
||||||
|
dataset.backgroundColor = dataset.backgroundColor.map(function() {
|
||||||
|
return randomColor(0.7);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myDoughnut.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var newDataset = {
|
||||||
|
backgroundColor: [],
|
||||||
|
data: [],
|
||||||
|
label: 'New dataset ' + config.data.datasets.length,
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.labels.length; ++index) {
|
||||||
|
newDataset.data.push(randomScalingFactor());
|
||||||
|
newDataset.backgroundColor.push(randomColor(0.7));
|
||||||
|
}
|
||||||
|
|
||||||
|
config.data.datasets.push(newDataset);
|
||||||
|
window.myDoughnut.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
config.data.labels.push('data #' + config.data.labels.length);
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(index, dataset) {
|
||||||
|
dataset.data.push(randomScalingFactor());
|
||||||
|
dataset.backgroundColor.push(randomColor(0.7));
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myDoughnut.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
config.data.datasets.splice(0, 1);
|
||||||
|
window.myDoughnut.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.labels.splice(-1, 1); // remove the label first
|
||||||
|
|
||||||
|
config.data.datasets.forEach(function(dataset, datasetIndex) {
|
||||||
|
dataset.data.pop();
|
||||||
|
dataset.backgroundColor.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myDoughnut.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
141
public/vendors/Chart.js/samples/line-customTooltips.html
vendored
Normal file
141
public/vendors/Chart.js/samples/line-customTooltips.html
vendored
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Line Chart with Custom Tooltips</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas{
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
#chartjs-tooltip {
|
||||||
|
opacity: 1;
|
||||||
|
position: absolute;
|
||||||
|
background: rgba(0, 0, 0, .7);
|
||||||
|
color: white;
|
||||||
|
border-radius: 3px;
|
||||||
|
-webkit-transition: all .1s ease;
|
||||||
|
transition: all .1s ease;
|
||||||
|
pointer-events: none;
|
||||||
|
-webkit-transform: translate(-50%, 0);
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.chartjs-tooltip-key {
|
||||||
|
display: inline-block;
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="canvas-holder1" style="width:75%;">
|
||||||
|
<canvas id="chart1"/>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
window.count = 0;
|
||||||
|
Chart.defaults.global.pointHitDetectionRadius = 1;
|
||||||
|
var customTooltips = function(tooltip) {
|
||||||
|
|
||||||
|
// Tooltip Element
|
||||||
|
var tooltipEl = $('#chartjs-tooltip');
|
||||||
|
|
||||||
|
if (!tooltipEl[0]) {
|
||||||
|
$('body').append('<div id="chartjs-tooltip"></div>');
|
||||||
|
tooltipEl = $('#chartjs-tooltip');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hide if no tooltip
|
||||||
|
if (!tooltip.opacity) {
|
||||||
|
tooltipEl.css({
|
||||||
|
opacity: 0
|
||||||
|
});
|
||||||
|
$('.chartjs-wrap canvas')
|
||||||
|
.each(function(index, el) {
|
||||||
|
$(el).css('cursor', 'default');
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$(this._chart.canvas).css('cursor', 'pointer');
|
||||||
|
|
||||||
|
// Set caret Position
|
||||||
|
tooltipEl.removeClass('above below no-transform');
|
||||||
|
if (tooltip.yAlign) {
|
||||||
|
tooltipEl.addClass(tooltip.yAlign);
|
||||||
|
} else {
|
||||||
|
tooltipEl.addClass('no-transform');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set Text
|
||||||
|
if (tooltip.body) {
|
||||||
|
var innerHtml = [
|
||||||
|
(tooltip.beforeTitle || []).join('\n'), (tooltip.title || []).join('\n'), (tooltip.afterTitle || []).join('\n'), (tooltip.beforeBody || []).join('\n'), (tooltip.body || []).join('\n'), (tooltip.afterBody || []).join('\n'), (tooltip.beforeFooter || [])
|
||||||
|
.join('\n'), (tooltip.footer || []).join('\n'), (tooltip.afterFooter || []).join('\n')
|
||||||
|
];
|
||||||
|
tooltipEl.html(innerHtml.join('\n'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find Y Location on page
|
||||||
|
var top = 0;
|
||||||
|
if (tooltip.yAlign) {
|
||||||
|
if (tooltip.yAlign == 'above') {
|
||||||
|
top = tooltip.y - tooltip.caretHeight - tooltip.caretPadding;
|
||||||
|
} else {
|
||||||
|
top = tooltip.y + tooltip.caretHeight + tooltip.caretPadding;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var position = $(this._chart.canvas)[0].getBoundingClientRect();
|
||||||
|
|
||||||
|
// Display, position, and set styles for font
|
||||||
|
tooltipEl.css({
|
||||||
|
opacity: 1,
|
||||||
|
width: tooltip.width ? (tooltip.width + 'px') : 'auto',
|
||||||
|
left: position.left + tooltip.x + 'px',
|
||||||
|
top: position.top + top + 'px',
|
||||||
|
fontFamily: tooltip._fontFamily,
|
||||||
|
fontSize: tooltip.fontSize,
|
||||||
|
fontStyle: tooltip._fontStyle,
|
||||||
|
padding: tooltip.yPadding + 'px ' + tooltip.xPadding + 'px',
|
||||||
|
});
|
||||||
|
};
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var lineChartData = {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var chartEl = document.getElementById("chart1");
|
||||||
|
window.myLine = new Chart(chartEl, {
|
||||||
|
type: 'line',
|
||||||
|
data: lineChartData,
|
||||||
|
options: {
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:'Chart.js Line Chart - Custom Tooltips'
|
||||||
|
},
|
||||||
|
tooltips: {
|
||||||
|
enabled: false,
|
||||||
|
custom: customTooltips
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
172
public/vendors/Chart.js/samples/line-legend.html
vendored
Normal file
172
public/vendors/Chart.js/samples/line-legend.html
vendored
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Line Chart</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 100 * (Math.random() > 0.5 ? -1 : 1));
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
fill: false,
|
||||||
|
borderDash: [5, 5],
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
fill: false,
|
||||||
|
borderDash: [5, 5],
|
||||||
|
}, {
|
||||||
|
label: "My Third dataset - No bezier",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
lineTension: 0,
|
||||||
|
fill: false,
|
||||||
|
}, {
|
||||||
|
label: "My Fourth dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
fill: false,
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
legend: {
|
||||||
|
position: 'bottom',
|
||||||
|
},
|
||||||
|
hover: {
|
||||||
|
mode: 'label'
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
display: true,
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'Month'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
display: true,
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'Value'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Chart.js Line Chart - Legend'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
var background = randomColor(0.5);
|
||||||
|
dataset.borderColor = background;
|
||||||
|
dataset.backgroundColor = background;
|
||||||
|
dataset.pointBorderColor = background;
|
||||||
|
dataset.pointBackgroundColor = background;
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myLine = new Chart(ctx, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return randomScalingFactor();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var background = randomColor(0.5);
|
||||||
|
var newDataset = {
|
||||||
|
label: 'Dataset ' + config.data.datasets.length,
|
||||||
|
borderColor: background,
|
||||||
|
backgroundColor: background,
|
||||||
|
pointBorderColor: background,
|
||||||
|
pointBackgroundColor: background,
|
||||||
|
pointBorderWidth: 1,
|
||||||
|
fill: false,
|
||||||
|
data: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.labels.length; ++index) {
|
||||||
|
newDataset.data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
config.data.datasets.push(newDataset);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
var month = MONTHS[config.data.labels.length % MONTHS.length];
|
||||||
|
config.data.labels.push(month);
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data.push(randomScalingFactor());
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
config.data.datasets.splice(0, 1);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.labels.splice(-1, 1); // remove the label first
|
||||||
|
|
||||||
|
config.data.datasets.forEach(function(dataset, datasetIndex) {
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
152
public/vendors/Chart.js/samples/line-logarithmic.html
vendored
Normal file
152
public/vendors/Chart.js/samples/line-logarithmic.html
vendored
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Line Chart</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
||||||
|
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.ceil(Math.random() * 10.0) * Math.pow(10, Math.ceil(Math.random() * 5));
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
fill: false,
|
||||||
|
borderDash: [5, 5],
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:'Chart.js Line Chart - Logarithmic'
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
display: true,
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'x axis'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
display: true,
|
||||||
|
type: 'logarithmic',
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'y axis'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.borderColor = randomColor(0.4);
|
||||||
|
dataset.backgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderColor = randomColor(0.7);
|
||||||
|
dataset.pointBackgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myLine = new Chart(ctx, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return randomScalingFactor();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var newDataset = {
|
||||||
|
label: 'Dataset ' + config.data.datasets.length,
|
||||||
|
borderColor: randomColor(0.4),
|
||||||
|
backgroundColor: randomColor(0.5),
|
||||||
|
pointBorderColor: randomColor(0.7),
|
||||||
|
pointBackgroundColor: randomColor(0.5),
|
||||||
|
pointBorderWidth: 1,
|
||||||
|
data: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.labels.length; ++index) {
|
||||||
|
newDataset.data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
config.data.datasets.push(newDataset);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
var month = MONTHS[config.data.labels.length % MONTHS.length];
|
||||||
|
config.data.labels.push(month);
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.datasets.length; ++index) {
|
||||||
|
config.data.datasets[index].data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
config.data.datasets.splice(0, 1);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.labels.splice(-1, 1); // remove the label first
|
||||||
|
|
||||||
|
config.data.datasets.forEach(function(dataset, datasetIndex) {
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
101
public/vendors/Chart.js/samples/line-multi-axis.html
vendored
Normal file
101
public/vendors/Chart.js/samples/line-multi-axis.html
vendored
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Line Chart Multiple Axes</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<script>
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 100 * (Math.random() > 0.5 ? -1 : 1));
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + Math.round(Math.random() * 255) + ',' + Math.round(Math.random() * 255) + ',' + Math.round(Math.random() * 255) + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var lineChartData = {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
yAxisID: "y-axis-1",
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
yAxisID: "y-axis-2"
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(lineChartData.datasets, function(i, dataset) {
|
||||||
|
dataset.borderColor = randomColor(0.4);
|
||||||
|
dataset.backgroundColor = randomColor(1);
|
||||||
|
dataset.pointBorderColor = randomColor(0.7);
|
||||||
|
dataset.pointBackgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myLine = Chart.Line(ctx, {
|
||||||
|
data: lineChartData,
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
hoverMode: 'label',
|
||||||
|
stacked: false,
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:'Chart.js Line Chart - Multi Axis'
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
display: true,
|
||||||
|
gridLines: {
|
||||||
|
offsetGridLines: false
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
type: "linear", // only linear but allow scale type registration. This allows extensions to exist solely for log scale for instance
|
||||||
|
display: true,
|
||||||
|
position: "left",
|
||||||
|
id: "y-axis-1",
|
||||||
|
}, {
|
||||||
|
type: "linear", // only linear but allow scale type registration. This allows extensions to exist solely for log scale for instance
|
||||||
|
display: true,
|
||||||
|
position: "right",
|
||||||
|
id: "y-axis-2",
|
||||||
|
|
||||||
|
// grid line settings
|
||||||
|
gridLines: {
|
||||||
|
drawOnChartArea: false, // only want the grid lines for one axis to show up
|
||||||
|
},
|
||||||
|
}],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
lineChartData.datasets[0].data = [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()];
|
||||||
|
|
||||||
|
lineChartData.datasets[1].data = [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()];
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
164
public/vendors/Chart.js/samples/line-skip-points.html
vendored
Normal file
164
public/vendors/Chart.js/samples/line-skip-points.html
vendored
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Line Chart</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
||||||
|
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 100);
|
||||||
|
//return 0;
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset",
|
||||||
|
|
||||||
|
// Skip a point in the middle
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), NaN, randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
fill: true,
|
||||||
|
borderDash: [5, 5],
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset",
|
||||||
|
|
||||||
|
// Skip first and last points
|
||||||
|
data: [NaN, randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), NaN],
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:'Chart.js Line Chart - Skip Points'
|
||||||
|
},
|
||||||
|
tooltips: {
|
||||||
|
mode: 'label',
|
||||||
|
},
|
||||||
|
hover: {
|
||||||
|
mode: 'label'
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
display: true,
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'Month'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
display: true,
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'Value'
|
||||||
|
},
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.borderColor = randomColor(0.4);
|
||||||
|
dataset.backgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderColor = randomColor(0.7);
|
||||||
|
dataset.pointBackgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myLine = new Chart(ctx, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return randomScalingFactor();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var newDataset = {
|
||||||
|
label: 'Dataset ' + config.data.datasets.length,
|
||||||
|
borderColor: randomColor(0.4),
|
||||||
|
backgroundColor: randomColor(0.5),
|
||||||
|
pointBorderColor: randomColor(0.7),
|
||||||
|
pointBackgroundColor: randomColor(0.5),
|
||||||
|
pointBorderWidth: 1,
|
||||||
|
data: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.labels.length; ++index) {
|
||||||
|
newDataset.data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
config.data.datasets.push(newDataset);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
var month = MONTHS[config.data.labels.length % MONTHS.length];
|
||||||
|
config.data.labels.push(month);
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data.push(randomScalingFactor());
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
config.data.datasets.splice(0, 1);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.labels.splice(-1, 1); // remove the label first
|
||||||
|
|
||||||
|
config.data.datasets.forEach(function(dataset, datasetIndex) {
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
163
public/vendors/Chart.js/samples/line-stacked-area.html
vendored
Normal file
163
public/vendors/Chart.js/samples/line-stacked-area.html
vendored
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Line Chart</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
||||||
|
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 100 * (Math.random() > 0.5 ? -1 : 1));
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '1') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
}, {
|
||||||
|
label: "My Third dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
}, {
|
||||||
|
label: "My Third dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:"Chart.js Line Chart - Stacked Area"
|
||||||
|
},
|
||||||
|
tooltips: {
|
||||||
|
mode: 'label',
|
||||||
|
},
|
||||||
|
hover: {
|
||||||
|
mode: 'label'
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'Month'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
stacked: true,
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'Value'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
var color = randomColor(1);
|
||||||
|
dataset.borderColor = color;
|
||||||
|
dataset.backgroundColor = color;
|
||||||
|
dataset.pointBorderColor = color;
|
||||||
|
dataset.pointBackgroundColor = color;
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myLine = new Chart(ctx, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return randomScalingFactor();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var newDataset = {
|
||||||
|
label: 'Dataset ' + config.data.datasets.length,
|
||||||
|
borderColor: randomColor(0.4),
|
||||||
|
backgroundColor: randomColor(0.5),
|
||||||
|
pointBorderColor: randomColor(0.7),
|
||||||
|
pointBackgroundColor: randomColor(0.5),
|
||||||
|
pointBorderWidth: 1,
|
||||||
|
data: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.labels.length; ++index) {
|
||||||
|
newDataset.data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
config.data.datasets.push(newDataset);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
var month = MONTHS[config.data.labels.length % MONTHS.length];
|
||||||
|
config.data.labels.push(month);
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data.push(randomScalingFactor());
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
config.data.datasets.splice(0, 1);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.labels.splice(-1, 1); // remove the label first
|
||||||
|
|
||||||
|
config.data.datasets.forEach(function(dataset, datasetIndex) {
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
151
public/vendors/Chart.js/samples/line-x-axis-filter.html
vendored
Normal file
151
public/vendors/Chart.js/samples/line-x-axis-filter.html
vendored
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Chart with xAxis Filtering</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
||||||
|
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 50 * (Math.random() > 0.5 ? 1 : 1)) + 50;
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
fill: false,
|
||||||
|
borderDash: [5, 5],
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:"Chart.js Line Chart - X-Axis Filter"
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
display: true,
|
||||||
|
ticks: {
|
||||||
|
userCallback: function(dataLabel, index) {
|
||||||
|
return index % 2 === 0 ? dataLabel : '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
display: true,
|
||||||
|
beginAtZero: false
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.borderColor = randomColor(0.4);
|
||||||
|
dataset.backgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderColor = randomColor(0.7);
|
||||||
|
dataset.pointBackgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myLine = new Chart(ctx, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return randomScalingFactor();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var newDataset = {
|
||||||
|
label: 'Dataset ' + config.data.datasets.length,
|
||||||
|
borderColor: randomColor(0.4),
|
||||||
|
backgroundColor: randomColor(0.5),
|
||||||
|
pointBorderColor: randomColor(0.7),
|
||||||
|
pointBackgroundColor: randomColor(0.5),
|
||||||
|
pointBorderWidth: 1,
|
||||||
|
data: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.labels.length; ++index) {
|
||||||
|
newDataset.data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
config.data.datasets.push(newDataset);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
var month = MONTHS[config.data.labels.length % MONTHS.length];
|
||||||
|
config.data.labels.push(month);
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.datasets.length; ++index) {
|
||||||
|
config.data.datasets[index].data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
config.data.datasets.splice(0, 1);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.labels.splice(-1, 1); // remove the label first
|
||||||
|
|
||||||
|
config.data.datasets.forEach(function(dataset, datasetIndex) {
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
218
public/vendors/Chart.js/samples/line.html
vendored
Normal file
218
public/vendors/Chart.js/samples/line.html
vendored
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Line Chart</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas{
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="changeDataObject">Change Data Object</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
||||||
|
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 100);
|
||||||
|
//return 0;
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
fill: false,
|
||||||
|
borderDash: [5, 5],
|
||||||
|
}, {
|
||||||
|
hidden: true,
|
||||||
|
label: 'hidden dataset',
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:'Chart.js Line Chart'
|
||||||
|
},
|
||||||
|
tooltips: {
|
||||||
|
mode: 'label',
|
||||||
|
callbacks: {
|
||||||
|
// beforeTitle: function() {
|
||||||
|
// return '...beforeTitle';
|
||||||
|
// },
|
||||||
|
// afterTitle: function() {
|
||||||
|
// return '...afterTitle';
|
||||||
|
// },
|
||||||
|
// beforeBody: function() {
|
||||||
|
// return '...beforeBody';
|
||||||
|
// },
|
||||||
|
// afterBody: function() {
|
||||||
|
// return '...afterBody';
|
||||||
|
// },
|
||||||
|
// beforeFooter: function() {
|
||||||
|
// return '...beforeFooter';
|
||||||
|
// },
|
||||||
|
// footer: function() {
|
||||||
|
// return 'Footer';
|
||||||
|
// },
|
||||||
|
// afterFooter: function() {
|
||||||
|
// return '...afterFooter';
|
||||||
|
// },
|
||||||
|
}
|
||||||
|
},
|
||||||
|
hover: {
|
||||||
|
mode: 'dataset'
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
display: true,
|
||||||
|
scaleLabel: {
|
||||||
|
show: true,
|
||||||
|
labelString: 'Month'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
display: true,
|
||||||
|
scaleLabel: {
|
||||||
|
show: true,
|
||||||
|
labelString: 'Value'
|
||||||
|
},
|
||||||
|
ticks: {
|
||||||
|
suggestedMin: -10,
|
||||||
|
suggestedMax: 250,
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.borderColor = randomColor(0.4);
|
||||||
|
dataset.backgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderColor = randomColor(0.7);
|
||||||
|
dataset.pointBackgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myLine = new Chart(ctx, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return randomScalingFactor();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#changeDataObject').click(function() {
|
||||||
|
config.data = {
|
||||||
|
labels: ["July", "August", "September", "October", "November", "December"],
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
fill: false,
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset",
|
||||||
|
fill: false,
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.borderColor = randomColor(0.4);
|
||||||
|
dataset.backgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderColor = randomColor(0.7);
|
||||||
|
dataset.pointBackgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Update the chart
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var newDataset = {
|
||||||
|
label: 'Dataset ' + config.data.datasets.length,
|
||||||
|
borderColor: randomColor(0.4),
|
||||||
|
backgroundColor: randomColor(0.5),
|
||||||
|
pointBorderColor: randomColor(0.7),
|
||||||
|
pointBackgroundColor: randomColor(0.5),
|
||||||
|
pointBorderWidth: 1,
|
||||||
|
data: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.labels.length; ++index) {
|
||||||
|
newDataset.data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
config.data.datasets.push(newDataset);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
var month = MONTHS[config.data.labels.length % MONTHS.length];
|
||||||
|
config.data.labels.push(month);
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data.push(randomScalingFactor());
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
config.data.datasets.splice(0, 1);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.labels.splice(-1, 1); // remove the label first
|
||||||
|
|
||||||
|
config.data.datasets.forEach(function(dataset, datasetIndex) {
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
174
public/vendors/Chart.js/samples/pie-customTooltips.html
vendored
Normal file
174
public/vendors/Chart.js/samples/pie-customTooltips.html
vendored
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Pie Chart with Custom Tooltips</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
#canvas-holder {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 50px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
#chartjs-tooltip {
|
||||||
|
opacity: 1;
|
||||||
|
position: absolute;
|
||||||
|
background: rgba(0, 0, 0, .7);
|
||||||
|
color: white;
|
||||||
|
padding: 3px;
|
||||||
|
border-radius: 3px;
|
||||||
|
-webkit-transition: all .1s ease;
|
||||||
|
transition: all .1s ease;
|
||||||
|
pointer-events: none;
|
||||||
|
-webkit-transform: translate(-50%, 0);
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
}
|
||||||
|
#chartjs-tooltip.below {
|
||||||
|
-webkit-transform: translate(-50%, 0);
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
}
|
||||||
|
#chartjs-tooltip.below:before {
|
||||||
|
border: solid;
|
||||||
|
border-color: #111 transparent;
|
||||||
|
border-color: rgba(0, 0, 0, .8) transparent;
|
||||||
|
border-width: 0 8px 8px 8px;
|
||||||
|
bottom: 1em;
|
||||||
|
content: "";
|
||||||
|
display: block;
|
||||||
|
left: 50%;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 99;
|
||||||
|
-webkit-transform: translate(-50%, -100%);
|
||||||
|
transform: translate(-50%, -100%);
|
||||||
|
}
|
||||||
|
#chartjs-tooltip.above {
|
||||||
|
-webkit-transform: translate(-50%, -100%);
|
||||||
|
transform: translate(-50%, -100%);
|
||||||
|
}
|
||||||
|
#chartjs-tooltip.above:before {
|
||||||
|
border: solid;
|
||||||
|
border-color: #111 transparent;
|
||||||
|
border-color: rgba(0, 0, 0, .8) transparent;
|
||||||
|
border-width: 8px 8px 0 8px;
|
||||||
|
bottom: 1em;
|
||||||
|
content: "";
|
||||||
|
display: block;
|
||||||
|
left: 50%;
|
||||||
|
top: 100%;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 99;
|
||||||
|
-webkit-transform: translate(-50%, 0);
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="canvas-holder">
|
||||||
|
<canvas id="chart-area1" width="50" height="50" />
|
||||||
|
</div>
|
||||||
|
<div id="canvas-holder">
|
||||||
|
<canvas id="chart-area2" width="300" height="300" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="chartjs-tooltip"></div>
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
Chart.defaults.global.customTooltips = function(tooltip) {
|
||||||
|
|
||||||
|
// Tooltip Element
|
||||||
|
var tooltipEl = $('#chartjs-tooltip');
|
||||||
|
|
||||||
|
// Hide if no tooltip
|
||||||
|
if (!tooltip) {
|
||||||
|
tooltipEl.css({
|
||||||
|
opacity: 0
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set caret Position
|
||||||
|
tooltipEl.removeClass('above below');
|
||||||
|
tooltipEl.addClass(tooltip.yAlign);
|
||||||
|
|
||||||
|
// Set Text
|
||||||
|
tooltipEl.html(tooltip.text);
|
||||||
|
|
||||||
|
// Find Y Location on page
|
||||||
|
var top;
|
||||||
|
if (tooltip.yAlign == 'above') {
|
||||||
|
top = tooltip.y - tooltip.caretHeight - tooltip.caretPadding;
|
||||||
|
} else {
|
||||||
|
top = tooltip.y + tooltip.caretHeight + tooltip.caretPadding;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Function to find absolution position of the element and not just it's relative position
|
||||||
|
function getPosition (element) {
|
||||||
|
var top = 0, left = 0;
|
||||||
|
do {
|
||||||
|
top += element.offsetTop || 0;
|
||||||
|
left += element.offsetLeft || 0;
|
||||||
|
element = element.offsetParent;
|
||||||
|
} while (element);
|
||||||
|
|
||||||
|
return {
|
||||||
|
top: top,
|
||||||
|
left: left
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
//Finding absolute position of the chart canvas
|
||||||
|
var position = getPosition(tooltip.chart.canvas)
|
||||||
|
|
||||||
|
// Display, position, and set styles for font
|
||||||
|
tooltipEl.css({
|
||||||
|
opacity: 1,
|
||||||
|
left: position.left + tooltip.x + 'px',
|
||||||
|
top: position.top + top + 'px',
|
||||||
|
fontFamily: tooltip.fontFamily,
|
||||||
|
fontSize: tooltip.fontSize,
|
||||||
|
fontStyle: tooltip.fontStyle,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
var pieData = [{
|
||||||
|
value: 300,
|
||||||
|
color: "#F7464A",
|
||||||
|
highlight: "#FF5A5E",
|
||||||
|
label: "Red"
|
||||||
|
}, {
|
||||||
|
value: 50,
|
||||||
|
color: "#46BFBD",
|
||||||
|
highlight: "#5AD3D1",
|
||||||
|
label: "Green"
|
||||||
|
}, {
|
||||||
|
value: 100,
|
||||||
|
color: "#FDB45C",
|
||||||
|
highlight: "#FFC870",
|
||||||
|
label: "Yellow"
|
||||||
|
}, {
|
||||||
|
value: 40,
|
||||||
|
color: "#949FB1",
|
||||||
|
highlight: "#A8B3C5",
|
||||||
|
label: "Grey"
|
||||||
|
}, {
|
||||||
|
value: 120,
|
||||||
|
color: "#4D5360",
|
||||||
|
highlight: "#616774",
|
||||||
|
label: "Dark Grey"
|
||||||
|
}];
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx1 = document.getElementById("chart-area1").getContext("2d");
|
||||||
|
window.myPie = new Chart(ctx1).Pie(pieData);
|
||||||
|
|
||||||
|
var ctx2 = document.getElementById("chart-area2").getContext("2d");
|
||||||
|
window.myPie = new Chart(ctx2).Pie(pieData);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
122
public/vendors/Chart.js/samples/pie.html
vendored
Normal file
122
public/vendors/Chart.js/samples/pie.html
vendored
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Pie Chart</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="canvas-holder" style="width:50%">
|
||||||
|
<canvas id="chart-area" width="300" height="300" />
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<script>
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'pie',
|
||||||
|
data: {
|
||||||
|
datasets: [{
|
||||||
|
data: [
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
],
|
||||||
|
backgroundColor: [
|
||||||
|
"#F7464A",
|
||||||
|
"#46BFBD",
|
||||||
|
"#FDB45C",
|
||||||
|
"#949FB1",
|
||||||
|
"#4D5360",
|
||||||
|
],
|
||||||
|
}, {
|
||||||
|
data: [
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
],
|
||||||
|
backgroundColor: [
|
||||||
|
"#F7464A",
|
||||||
|
"#46BFBD",
|
||||||
|
"#FDB45C",
|
||||||
|
"#949FB1",
|
||||||
|
"#4D5360",
|
||||||
|
],
|
||||||
|
}, {
|
||||||
|
data: [
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
],
|
||||||
|
backgroundColor: [
|
||||||
|
"#F7464A",
|
||||||
|
"#46BFBD",
|
||||||
|
"#FDB45C",
|
||||||
|
"#949FB1",
|
||||||
|
"#4D5360",
|
||||||
|
],
|
||||||
|
}],
|
||||||
|
labels: [
|
||||||
|
"Red",
|
||||||
|
"Green",
|
||||||
|
"Yellow",
|
||||||
|
"Grey",
|
||||||
|
"Dark Grey"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("chart-area").getContext("2d");
|
||||||
|
window.myPie = new Chart(ctx, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, piece) {
|
||||||
|
$.each(piece.data, function(j, value) {
|
||||||
|
config.data.datasets[i].data[j] = randomScalingFactor();
|
||||||
|
config.data.datasets[i].backgroundColor[j] = randomColor(0.7);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
window.myPie.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var newDataset = {
|
||||||
|
backgroundColor: [randomColor(0.7), randomColor(0.7), randomColor(0.7), randomColor(0.7), randomColor(0.7)],
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
};
|
||||||
|
|
||||||
|
config.data.datasets.push(newDataset);
|
||||||
|
window.myPie.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
config.data.datasets.splice(0, 1);
|
||||||
|
window.myPie.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
124
public/vendors/Chart.js/samples/polar-area.html
vendored
Normal file
124
public/vendors/Chart.js/samples/polar-area.html
vendored
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Polar Area Chart</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="canvas-holder" style="width:75%">
|
||||||
|
<canvas id="chart-area"></canvas>
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
data: {
|
||||||
|
datasets: [{
|
||||||
|
data: [
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
randomScalingFactor(),
|
||||||
|
],
|
||||||
|
backgroundColor: [
|
||||||
|
"#F7464A",
|
||||||
|
"#46BFBD",
|
||||||
|
"#FDB45C",
|
||||||
|
"#949FB1",
|
||||||
|
"#4D5360",
|
||||||
|
],
|
||||||
|
label: 'My dataset' // for legend
|
||||||
|
}],
|
||||||
|
labels: [
|
||||||
|
"Red",
|
||||||
|
"Green",
|
||||||
|
"Yellow",
|
||||||
|
"Grey",
|
||||||
|
"Dark Grey"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
legend: {
|
||||||
|
position: 'top',
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Chart.js Polar Area Chart'
|
||||||
|
},
|
||||||
|
scale: {
|
||||||
|
ticks: {
|
||||||
|
beginAtZero: true
|
||||||
|
},
|
||||||
|
reverse: false
|
||||||
|
},
|
||||||
|
animation: {
|
||||||
|
animateRotate: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("chart-area");
|
||||||
|
window.myPolarArea = Chart.PolarArea(ctx, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, piece) {
|
||||||
|
$.each(piece.data, function(j, value) {
|
||||||
|
config.data.datasets[i].data[j] = randomScalingFactor();
|
||||||
|
config.data.datasets[i].backgroundColor[j] = randomColor();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
window.myPolarArea.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
config.data.labels.push('dataset #' + config.data.labels.length);
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.backgroundColor.push(randomColor());
|
||||||
|
dataset.data.push(randomScalingFactor());
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myPolarArea.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.labels.pop(); // remove the label first
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.backgroundColor.pop();
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myPolarArea.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
145
public/vendors/Chart.js/samples/radar-skip-points.html
vendored
Normal file
145
public/vendors/Chart.js/samples/radar-skip-points.html
vendored
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Radar Chart</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'radar',
|
||||||
|
data: {
|
||||||
|
labels: ["Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running"],
|
||||||
|
datasets: [{
|
||||||
|
label: "Skip first dataset",
|
||||||
|
borderColor: 'rgb(255, 0, 0)',
|
||||||
|
backgroundColor: "rgba(255,255,0,0.5)",
|
||||||
|
pointBackgroundColor: "rgba(220,220,220,1)",
|
||||||
|
data: [NaN, randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}, {
|
||||||
|
label: "Skip mid dataset",
|
||||||
|
borderColor: 'rgb(255, 0, 255)',
|
||||||
|
backgroundColor: "rgba(0, 255, 0, 0.5)",
|
||||||
|
pointBackgroundColor: "rgba(151,187,205,1)",
|
||||||
|
hoverPointBackgroundColor: "#fff",
|
||||||
|
pointHighlightStroke: "rgba(151,187,205,1)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), NaN, randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
},{
|
||||||
|
label: "Skip last dataset",
|
||||||
|
borderColor: 'rgb(0, 255, 255)',
|
||||||
|
backgroundColor: "rgba(0, 0, 255, 0.5)",
|
||||||
|
pointBackgroundColor: "rgba(151,187,205,1)",
|
||||||
|
hoverPointBackgroundColor: "#fff",
|
||||||
|
pointHighlightStroke: "rgba(151,187,205,1)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), NaN]
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:"Chart.js Radar Chart - Skip Points"
|
||||||
|
},
|
||||||
|
elements: {
|
||||||
|
line: {
|
||||||
|
tension: 0.0,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
scale: {
|
||||||
|
beginAtZero: true,
|
||||||
|
reverse: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
window.myRadar = new Chart(document.getElementById("canvas"), config);
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return randomScalingFactor();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myRadar.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var newDataset = {
|
||||||
|
label: 'Dataset ' + config.data.datasets.length,
|
||||||
|
borderColor: randomColor(0.4),
|
||||||
|
backgroundColor: randomColor(0.5),
|
||||||
|
pointBorderColor: randomColor(0.7),
|
||||||
|
pointBackgroundColor: randomColor(0.5),
|
||||||
|
pointBorderWidth: 1,
|
||||||
|
data: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.labels.length; ++index) {
|
||||||
|
newDataset.data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
config.data.datasets.push(newDataset);
|
||||||
|
window.myRadar.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
config.data.labels.push('dataset #' + config.data.labels.length);
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function (i, dataset) {
|
||||||
|
dataset.data.push(randomScalingFactor());
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myRadar.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
config.data.datasets.splice(0, 1);
|
||||||
|
window.myRadar.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.labels.pop(); // remove the label first
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myRadar.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
139
public/vendors/Chart.js/samples/radar.html
vendored
Normal file
139
public/vendors/Chart.js/samples/radar.html
vendored
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Radar Chart</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'radar',
|
||||||
|
data: {
|
||||||
|
labels: ["Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running"],
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset",
|
||||||
|
backgroundColor: "rgba(220,220,220,0.2)",
|
||||||
|
pointBackgroundColor: "rgba(220,220,220,1)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}, {
|
||||||
|
label: 'Hidden dataset',
|
||||||
|
hidden: true,
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset",
|
||||||
|
backgroundColor: "rgba(151,187,205,0.2)",
|
||||||
|
pointBackgroundColor: "rgba(151,187,205,1)",
|
||||||
|
hoverPointBackgroundColor: "#fff",
|
||||||
|
pointHighlightStroke: "rgba(151,187,205,1)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
},]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
legend: {
|
||||||
|
position: 'top',
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Chart.js Radar Chart'
|
||||||
|
},
|
||||||
|
scale: {
|
||||||
|
reverse: false,
|
||||||
|
ticks: {
|
||||||
|
beginAtZero: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
window.myRadar = new Chart(document.getElementById("canvas"), config);
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return randomScalingFactor();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myRadar.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var newDataset = {
|
||||||
|
label: 'Dataset ' + config.data.datasets.length,
|
||||||
|
borderColor: randomColor(0.4),
|
||||||
|
backgroundColor: randomColor(0.5),
|
||||||
|
pointBorderColor: randomColor(0.7),
|
||||||
|
pointBackgroundColor: randomColor(0.5),
|
||||||
|
pointBorderWidth: 1,
|
||||||
|
data: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.labels.length; ++index) {
|
||||||
|
newDataset.data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
config.data.datasets.push(newDataset);
|
||||||
|
window.myRadar.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
config.data.labels.push('dataset #' + config.data.labels.length);
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function (i, dataset) {
|
||||||
|
dataset.data.push(randomScalingFactor());
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myRadar.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
config.data.datasets.splice(0, 1);
|
||||||
|
window.myRadar.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.labels.pop(); // remove the label first
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myRadar.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
185
public/vendors/Chart.js/samples/scatter-logX.html
vendored
Normal file
185
public/vendors/Chart.js/samples/scatter-logX.html
vendored
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Scatter Chart</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%">
|
||||||
|
<div>
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 10.0) * Math.pow(10, Math.ceil(Math.random() * 5));
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + Math.round(Math.random() * 255) + ',' + Math.round(Math.random() * 255) + ',' + Math.round(Math.random() * 255) + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var scatterChartData = {
|
||||||
|
datasets: [{
|
||||||
|
label: "V(node2)",
|
||||||
|
data: [{
|
||||||
|
x: 1,
|
||||||
|
y: -1.711e-2,
|
||||||
|
}, {
|
||||||
|
x: 1.26,
|
||||||
|
y: -2.708e-2,
|
||||||
|
}, {
|
||||||
|
x: 1.58,
|
||||||
|
y: -4.285e-2,
|
||||||
|
}, {
|
||||||
|
x: 2.0,
|
||||||
|
y: -6.772e-2,
|
||||||
|
}, {
|
||||||
|
x: 2.51,
|
||||||
|
y: -1.068e-1,
|
||||||
|
}, {
|
||||||
|
x: 3.16,
|
||||||
|
y: -1.681e-1,
|
||||||
|
}, {
|
||||||
|
x: 3.98,
|
||||||
|
y: -2.635e-1,
|
||||||
|
}, {
|
||||||
|
x: 5.01,
|
||||||
|
y: -4.106e-1,
|
||||||
|
}, {
|
||||||
|
x: 6.31,
|
||||||
|
y: -6.339e-1,
|
||||||
|
}, {
|
||||||
|
x: 7.94,
|
||||||
|
y: -9.659e-1,
|
||||||
|
}, {
|
||||||
|
x: 10.00,
|
||||||
|
y: -1.445,
|
||||||
|
}, {
|
||||||
|
x: 12.6,
|
||||||
|
y: -2.110,
|
||||||
|
}, {
|
||||||
|
x: 15.8,
|
||||||
|
y: -2.992,
|
||||||
|
}, {
|
||||||
|
x: 20.0,
|
||||||
|
y: -4.102,
|
||||||
|
}, {
|
||||||
|
x: 25.1,
|
||||||
|
y: -5.429,
|
||||||
|
}, {
|
||||||
|
x: 31.6,
|
||||||
|
y: -6.944,
|
||||||
|
}, {
|
||||||
|
x: 39.8,
|
||||||
|
y: -8.607,
|
||||||
|
}, {
|
||||||
|
x: 50.1,
|
||||||
|
y: -1.038e1,
|
||||||
|
}, {
|
||||||
|
x: 63.1,
|
||||||
|
y: -1.223e1,
|
||||||
|
}, {
|
||||||
|
x: 79.4,
|
||||||
|
y: -1.413e1,
|
||||||
|
}, {
|
||||||
|
x: 100.00,
|
||||||
|
y: -1.607e1,
|
||||||
|
}, {
|
||||||
|
x: 126,
|
||||||
|
y: -1.803e1,
|
||||||
|
}, {
|
||||||
|
x: 158,
|
||||||
|
y: -2e1,
|
||||||
|
}, {
|
||||||
|
x: 200,
|
||||||
|
y: -2.199e1,
|
||||||
|
}, {
|
||||||
|
x: 251,
|
||||||
|
y: -2.398e1,
|
||||||
|
}, {
|
||||||
|
x: 316,
|
||||||
|
y: -2.597e1,
|
||||||
|
}, {
|
||||||
|
x: 398,
|
||||||
|
y: -2.797e1,
|
||||||
|
}, {
|
||||||
|
x: 501,
|
||||||
|
y: -2.996e1,
|
||||||
|
}, {
|
||||||
|
x: 631,
|
||||||
|
y: -3.196e1,
|
||||||
|
}, {
|
||||||
|
x: 794,
|
||||||
|
y: -3.396e1,
|
||||||
|
}, {
|
||||||
|
x: 1000,
|
||||||
|
y: -3.596e1,
|
||||||
|
},]
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(scatterChartData.datasets, function(i, dataset) {
|
||||||
|
dataset.borderColor = randomColor(0.4);
|
||||||
|
dataset.backgroundColor = randomColor(0.1);
|
||||||
|
dataset.pointBorderColor = randomColor(0.7);
|
||||||
|
dataset.pointBackgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myScatter = Chart.Scatter(ctx, {
|
||||||
|
data: scatterChartData,
|
||||||
|
options: {
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Chart.js Scatter Chart - Logarithmic X-Axis'
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
type: 'logarithmic',
|
||||||
|
position: 'bottom',
|
||||||
|
ticks: {
|
||||||
|
userCallback: function(tick) {
|
||||||
|
var remain = tick / (Math.pow(10, Math.floor(Chart.helpers.log10(tick))));
|
||||||
|
if (remain === 1 || remain === 2 || remain === 5) {
|
||||||
|
return tick.toString() + "Hz";
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
},
|
||||||
|
scaleLabel: {
|
||||||
|
labelString: 'Frequency',
|
||||||
|
display: true,
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
type: 'linear',
|
||||||
|
ticks: {
|
||||||
|
userCallback: function(tick) {
|
||||||
|
return tick.toString() + "dB";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
scaleLabel: {
|
||||||
|
labelString: 'Voltage',
|
||||||
|
display: true
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
186
public/vendors/Chart.js/samples/scatter-multi-axis.html
vendored
Normal file
186
public/vendors/Chart.js/samples/scatter-multi-axis.html
vendored
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Scatter Chart Multi Axis</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%">
|
||||||
|
<div>
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<script>
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return (Math.random() > 0.5 ? 1.0 : -1.0) * Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + Math.round(Math.random() * 255) + ',' + Math.round(Math.random() * 255) + ',' + Math.round(Math.random() * 255) + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var scatterChartData = {
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset",
|
||||||
|
xAxisID: "x-axis-1",
|
||||||
|
yAxisID: "y-axis-1",
|
||||||
|
data: [{
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset",
|
||||||
|
xAxisID: "x-axis-1",
|
||||||
|
yAxisID: "y-axis-2",
|
||||||
|
data: [{
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(scatterChartData.datasets, function(i, dataset) {
|
||||||
|
dataset.borderColor = randomColor(0.4);
|
||||||
|
dataset.backgroundColor = randomColor(0.1);
|
||||||
|
dataset.pointBorderColor = randomColor(0.7);
|
||||||
|
dataset.pointBackgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myScatter = Chart.Scatter(ctx, {
|
||||||
|
data: scatterChartData,
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
hoverMode: 'single',
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Chart.js Scatter Chart - Multi Axis'
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
position: "bottom",
|
||||||
|
gridLines: {
|
||||||
|
zeroLineColor: "rgba(0,0,0,1)"
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
type: "linear", // only linear but allow scale type registration. This allows extensions to exist solely for log scale for instance
|
||||||
|
display: true,
|
||||||
|
position: "left",
|
||||||
|
id: "y-axis-1",
|
||||||
|
}, {
|
||||||
|
type: "linear", // only linear but allow scale type registration. This allows extensions to exist solely for log scale for instance
|
||||||
|
display: true,
|
||||||
|
position: "right",
|
||||||
|
reverse: true,
|
||||||
|
id: "y-axis-2",
|
||||||
|
|
||||||
|
// grid line settings
|
||||||
|
gridLines: {
|
||||||
|
drawOnChartArea: false, // only want the grid lines for one axis to show up
|
||||||
|
},
|
||||||
|
}],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
scatterChartData.datasets[0].data = [{
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}];
|
||||||
|
scatterChartData.datasets[1].data = [{
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}];
|
||||||
|
window.myScatter.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
177
public/vendors/Chart.js/samples/scatter.html
vendored
Normal file
177
public/vendors/Chart.js/samples/scatter.html
vendored
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Scatter Chart</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%">
|
||||||
|
<div>
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<script>
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return (Math.random() > 0.5 ? 1.0 : -1.0) * Math.round(Math.random() * 100);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + Math.round(Math.random() * 255) + ',' + Math.round(Math.random() * 255) + ',' + Math.round(Math.random() * 255) + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var scatterChartData = {
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset",
|
||||||
|
data: [{
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset",
|
||||||
|
data: [{
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(scatterChartData.datasets, function(i, dataset) {
|
||||||
|
dataset.borderColor = randomColor(0.4);
|
||||||
|
dataset.backgroundColor = randomColor(0.1);
|
||||||
|
dataset.pointBorderColor = randomColor(0.7);
|
||||||
|
dataset.pointBackgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myScatter = Chart.Scatter(ctx, {
|
||||||
|
data: scatterChartData,
|
||||||
|
options: {
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Chart.js Scatter Chart'
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
position: 'top',
|
||||||
|
gridLines: {
|
||||||
|
zeroLineColor: "rgba(0,255,0,1)"
|
||||||
|
},
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'x axis'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
position: 'right',
|
||||||
|
gridLines: {
|
||||||
|
zeroLineColor: "rgba(0,255,0,1)"
|
||||||
|
},
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'y axis'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
scatterChartData.datasets[0].data = [{
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}];
|
||||||
|
scatterChartData.datasets[1].data = [{
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}, {
|
||||||
|
x: randomScalingFactor(),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
}]
|
||||||
|
window.myScatter.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
165
public/vendors/Chart.js/samples/timeScale/combo-time-scale.html
vendored
Normal file
165
public/vendors/Chart.js/samples/timeScale/combo-time-scale.html
vendored
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Line Chart - Combo Time Scale</title>
|
||||||
|
<script src="../../node_modules/moment/min/moment.min.js"></script>
|
||||||
|
<script src="../../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var timeFormat = 'MM/DD/YYYY HH:mm';
|
||||||
|
|
||||||
|
function randomScalingFactor() {
|
||||||
|
return Math.round(Math.random() * 100 * (Math.random() > 0.5 ? -1 : 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
function randomColorFactor() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
function randomColor(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
function newDateString(days) {
|
||||||
|
return moment().add(days, 'd').format(timeFormat);
|
||||||
|
}
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
labels: [newDateString(0), newDateString(1), newDateString(2), newDateString(3), newDateString(4), newDateString(5), newDateString(6)],
|
||||||
|
datasets: [{
|
||||||
|
type: 'bar',
|
||||||
|
label: 'Dataset 1',
|
||||||
|
backgroundColor: "rgba(151,187,205,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
borderColor: 'white',
|
||||||
|
borderWidth: 2
|
||||||
|
}, {
|
||||||
|
type: 'bar',
|
||||||
|
label: 'Dataset 2',
|
||||||
|
backgroundColor: "rgba(151,187,205,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
borderColor: 'white',
|
||||||
|
borderWidth: 2
|
||||||
|
}, {
|
||||||
|
type: 'line',
|
||||||
|
label: 'Dataset 3',
|
||||||
|
backgroundColor: "rgba(220,220,220,0.5)",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()]
|
||||||
|
}, ]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
showLines: true,
|
||||||
|
responsive: true,
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:"Chart.js Combo Time Scale"
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
type: "time",
|
||||||
|
display: true,
|
||||||
|
time: {
|
||||||
|
format: timeFormat,
|
||||||
|
// round: 'day'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.borderColor = randomColor(0.4);
|
||||||
|
dataset.backgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderColor = randomColor(0.7);
|
||||||
|
dataset.pointBackgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myLine = new Chart(ctx, config);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return randomScalingFactor();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var newDataset = {
|
||||||
|
label: 'Dataset ' + config.data.datasets.length,
|
||||||
|
borderColor: randomColor(0.4),
|
||||||
|
backgroundColor: randomColor(0.5),
|
||||||
|
pointBorderColor: randomColor(0.7),
|
||||||
|
pointBackgroundColor: randomColor(0.5),
|
||||||
|
pointBorderWidth: 1,
|
||||||
|
data: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.labels.length; ++index) {
|
||||||
|
newDataset.data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
config.data.datasets.push(newDataset);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
config.data.labels.push(newDateString(config.data.labels.length));
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.datasets.length; ++index) {
|
||||||
|
config.data.datasets[index].data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
config.data.datasets.splice(0, 1);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.labels.splice(-1, 1); // remove the label first
|
||||||
|
|
||||||
|
config.data.datasets.forEach(function(dataset, datasetIndex) {
|
||||||
|
config.data.datasets[datasetIndex].data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
163
public/vendors/Chart.js/samples/timeScale/line-time-point-data.html
vendored
Normal file
163
public/vendors/Chart.js/samples/timeScale/line-time-point-data.html
vendored
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Time Scale Point Data</title>
|
||||||
|
<script src="../../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
function randomScalingFactor() {
|
||||||
|
return Math.round(Math.random() * 100 * (Math.random() > 0.5 ? -1 : 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
function randomColorFactor() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
function randomColor(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
function newDate(days) {
|
||||||
|
return moment().add(days, 'd').toDate();
|
||||||
|
}
|
||||||
|
|
||||||
|
function newDateString(days) {
|
||||||
|
return moment().add(days, 'd').format();
|
||||||
|
}
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
datasets: [{
|
||||||
|
label: "Dataset with string point data",
|
||||||
|
data: [{
|
||||||
|
x: newDateString(0),
|
||||||
|
y: randomScalingFactor()
|
||||||
|
}, {
|
||||||
|
x: newDateString(2),
|
||||||
|
y: randomScalingFactor()
|
||||||
|
}, {
|
||||||
|
x: newDateString(4),
|
||||||
|
y: randomScalingFactor()
|
||||||
|
}, {
|
||||||
|
x: newDateString(5),
|
||||||
|
y: randomScalingFactor()
|
||||||
|
}],
|
||||||
|
fill: false
|
||||||
|
}, {
|
||||||
|
label: "Dataset with date object point data",
|
||||||
|
data: [{
|
||||||
|
x: newDate(0),
|
||||||
|
y: randomScalingFactor()
|
||||||
|
}, {
|
||||||
|
x: newDate(2),
|
||||||
|
y: randomScalingFactor()
|
||||||
|
}, {
|
||||||
|
x: newDate(4),
|
||||||
|
y: randomScalingFactor()
|
||||||
|
}, {
|
||||||
|
x: newDate(5),
|
||||||
|
y: randomScalingFactor()
|
||||||
|
}],
|
||||||
|
fill: false
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:"Chart.js Time Point Data"
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
type: "time",
|
||||||
|
display: true,
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'Date'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
display: true,
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'value'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.borderColor = randomColor(0.4);
|
||||||
|
dataset.backgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderColor = randomColor(0.7);
|
||||||
|
dataset.pointBackgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myLine = new Chart(ctx, config);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
$.each(dataset.data, function(j, dataObj) {
|
||||||
|
dataObj.y = randomScalingFactor();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
var lastTime = myLine.scales['x-axis-0'].labelMoments[0].length ? myLine.scales['x-axis-0'].labelMoments[0][myLine.scales['x-axis-0'].labelMoments[0].length - 1] : moment();
|
||||||
|
var newTime = lastTime
|
||||||
|
.clone()
|
||||||
|
.add(1, 'day')
|
||||||
|
.format('MM/DD/YYYY HH:mm');
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.datasets.length; ++index) {
|
||||||
|
config.data.datasets[index].data.push({
|
||||||
|
x: newTime,
|
||||||
|
y: randomScalingFactor()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.datasets.forEach(function(dataset, datasetIndex) {
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
198
public/vendors/Chart.js/samples/timeScale/line-time-scale.html
vendored
Normal file
198
public/vendors/Chart.js/samples/timeScale/line-time-scale.html
vendored
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Line Chart</title>
|
||||||
|
<script src="../../node_modules/moment/min/moment.min.js"></script>
|
||||||
|
<script src="../../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var timeFormat = 'MM/DD/YYYY HH:mm';
|
||||||
|
|
||||||
|
function randomScalingFactor() {
|
||||||
|
return Math.round(Math.random() * 100 * (Math.random() > 0.5 ? -1 : 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
function randomColorFactor() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
function randomColor(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
function newDate(days) {
|
||||||
|
return moment().add(days, 'd').toDate();
|
||||||
|
}
|
||||||
|
|
||||||
|
function newDateString(days) {
|
||||||
|
return moment().add(days, 'd').format(timeFormat);
|
||||||
|
}
|
||||||
|
|
||||||
|
function newTimestamp(days) {
|
||||||
|
return moment().add(days, 'd').unix();
|
||||||
|
}
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
labels: [newDate(0), newDate(1), newDate(2), newDate(3), newDate(4), newDate(5), newDate(6)], // Date Objects
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
fill: false,
|
||||||
|
borderDash: [5, 5],
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
}, {
|
||||||
|
label: "Dataset with point data",
|
||||||
|
data: [{
|
||||||
|
x: newDateString(0),
|
||||||
|
y: randomScalingFactor()
|
||||||
|
}, {
|
||||||
|
x: newDateString(5),
|
||||||
|
y: randomScalingFactor()
|
||||||
|
}, {
|
||||||
|
x: newDateString(7),
|
||||||
|
y: randomScalingFactor()
|
||||||
|
}, {
|
||||||
|
x: newDateString(15),
|
||||||
|
y: randomScalingFactor()
|
||||||
|
}],
|
||||||
|
fill: false
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:"Chart.js Time Scale"
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
type: "time",
|
||||||
|
time: {
|
||||||
|
format: timeFormat,
|
||||||
|
// round: 'day'
|
||||||
|
tooltipFormat: 'll HH:mm'
|
||||||
|
},
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'Date'
|
||||||
|
}
|
||||||
|
}, ],
|
||||||
|
yAxes: [{
|
||||||
|
scaleLabel: {
|
||||||
|
display: true,
|
||||||
|
labelString: 'value'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.borderColor = randomColor(0.4);
|
||||||
|
dataset.backgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderColor = randomColor(0.7);
|
||||||
|
dataset.pointBackgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myLine = new Chart(ctx, config);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
$.each(dataset.data, function(j, dataObj) {
|
||||||
|
if (typeof dataObj === 'object') {
|
||||||
|
dataObj.y = randomScalingFactor();
|
||||||
|
} else {
|
||||||
|
dataset.data[j] = randomScalingFactor();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var newDataset = {
|
||||||
|
label: 'Dataset ' + config.data.datasets.length,
|
||||||
|
borderColor: randomColor(0.4),
|
||||||
|
backgroundColor: randomColor(0.5),
|
||||||
|
pointBorderColor: randomColor(0.7),
|
||||||
|
pointBackgroundColor: randomColor(0.5),
|
||||||
|
pointBorderWidth: 1,
|
||||||
|
data: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.labels.length; ++index) {
|
||||||
|
newDataset.data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
config.data.datasets.push(newDataset);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
config.data.labels.push(newDate(config.data.labels.length));
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.datasets.length; ++index) {
|
||||||
|
if (typeof config.data.datasets[index].data[0] === "object") {
|
||||||
|
config.data.datasets[index].data.push({
|
||||||
|
x: newDate(config.data.datasets[index].data.length),
|
||||||
|
y: randomScalingFactor(),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
config.data.datasets[index].data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
config.data.datasets.splice(0, 1);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.labels.splice(-1, 1); // remove the label first
|
||||||
|
|
||||||
|
config.data.datasets.forEach(function(dataset, datasetIndex) {
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
183
public/vendors/Chart.js/samples/tooltip-hooks.html
vendored
Normal file
183
public/vendors/Chart.js/samples/tooltip-hooks.html
vendored
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Line Chart</title>
|
||||||
|
<script src="../dist/Chart.bundle.js"></script>
|
||||||
|
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||||
|
<style>
|
||||||
|
canvas {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div style="width:75%;">
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<button id="randomizeData">Randomize Data</button>
|
||||||
|
<button id="addDataset">Add Dataset</button>
|
||||||
|
<button id="removeDataset">Remove Dataset</button>
|
||||||
|
<button id="addData">Add Data</button>
|
||||||
|
<button id="removeData">Remove Data</button>
|
||||||
|
<script>
|
||||||
|
var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
||||||
|
|
||||||
|
var randomScalingFactor = function() {
|
||||||
|
return Math.round(Math.random() * 100 * (Math.random() > 0.5 ? -1 : 1));
|
||||||
|
};
|
||||||
|
var randomColorFactor = function() {
|
||||||
|
return Math.round(Math.random() * 255);
|
||||||
|
};
|
||||||
|
var randomColor = function(opacity) {
|
||||||
|
return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
|
||||||
|
};
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
||||||
|
datasets: [{
|
||||||
|
label: "My First dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
fill: false,
|
||||||
|
borderDash: [5, 5],
|
||||||
|
}, {
|
||||||
|
label: "My Second dataset",
|
||||||
|
data: [randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor(), randomScalingFactor()],
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
title:{
|
||||||
|
display:true,
|
||||||
|
text:"Chart.js Line Chart - Tooltip Hooks"
|
||||||
|
},
|
||||||
|
tooltips: {
|
||||||
|
mode: 'label',
|
||||||
|
callbacks: {
|
||||||
|
beforeTitle: function() {
|
||||||
|
return '...beforeTitle';
|
||||||
|
},
|
||||||
|
afterTitle: function() {
|
||||||
|
return '...afterTitle';
|
||||||
|
},
|
||||||
|
beforeBody: function() {
|
||||||
|
return '...beforeBody';
|
||||||
|
},
|
||||||
|
afterBody: function() {
|
||||||
|
return '...afterBody';
|
||||||
|
},
|
||||||
|
beforeFooter: function() {
|
||||||
|
return '...beforeFooter';
|
||||||
|
},
|
||||||
|
footer: function() {
|
||||||
|
return 'Footer';
|
||||||
|
},
|
||||||
|
afterFooter: function() {
|
||||||
|
return '...afterFooter';
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
hover: {
|
||||||
|
mode: 'label'
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
display: true,
|
||||||
|
scaleLabel: {
|
||||||
|
show: true,
|
||||||
|
labelString: 'Month'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
display: true,
|
||||||
|
scaleLabel: {
|
||||||
|
show: true,
|
||||||
|
labelString: 'Value'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.borderColor = randomColor(0.4);
|
||||||
|
dataset.backgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderColor = randomColor(0.7);
|
||||||
|
dataset.pointBackgroundColor = randomColor(0.5);
|
||||||
|
dataset.pointBorderWidth = 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
var ctx = document.getElementById("canvas").getContext("2d");
|
||||||
|
window.myLine = new Chart(ctx, config);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
$('#randomizeData').click(function() {
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data = dataset.data.map(function() {
|
||||||
|
return randomScalingFactor();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addDataset').click(function() {
|
||||||
|
var newDataset = {
|
||||||
|
label: 'Dataset ' + config.data.datasets.length,
|
||||||
|
borderColor: randomColor(0.4),
|
||||||
|
backgroundColor: randomColor(0.5),
|
||||||
|
pointBorderColor: randomColor(0.7),
|
||||||
|
pointBackgroundColor: randomColor(0.5),
|
||||||
|
pointBorderWidth: 1,
|
||||||
|
data: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var index = 0; index < config.data.labels.length; ++index) {
|
||||||
|
newDataset.data.push(randomScalingFactor());
|
||||||
|
}
|
||||||
|
|
||||||
|
config.data.datasets.push(newDataset);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addData').click(function() {
|
||||||
|
if (config.data.datasets.length > 0) {
|
||||||
|
var month = MONTHS[config.data.labels.length % MONTHS.length];
|
||||||
|
config.data.labels.push(month);
|
||||||
|
|
||||||
|
$.each(config.data.datasets, function(i, dataset) {
|
||||||
|
dataset.data.push(randomScalingFactor());
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeDataset').click(function() {
|
||||||
|
config.data.datasets.splice(0, 1);
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#removeData').click(function() {
|
||||||
|
config.data.labels.splice(-1, 1); // remove the label first
|
||||||
|
|
||||||
|
config.data.datasets.forEach(function(dataset, datasetIndex) {
|
||||||
|
dataset.data.pop();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.myLine.update();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
44
public/vendors/Chart.js/src/chart.js
vendored
Normal file
44
public/vendors/Chart.js/src/chart.js
vendored
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
var Chart = require('./core/core.js')();
|
||||||
|
|
||||||
|
require('./core/core.helpers')(Chart);
|
||||||
|
require('./core/core.element')(Chart);
|
||||||
|
require('./core/core.animation')(Chart);
|
||||||
|
require('./core/core.controller')(Chart);
|
||||||
|
require('./core/core.datasetController')(Chart);
|
||||||
|
require('./core/core.layoutService')(Chart);
|
||||||
|
require('./core/core.legend')(Chart);
|
||||||
|
require('./core/core.plugin.js')(Chart);
|
||||||
|
require('./core/core.scale')(Chart);
|
||||||
|
require('./core/core.scaleService')(Chart);
|
||||||
|
require('./core/core.title')(Chart);
|
||||||
|
require('./core/core.tooltip')(Chart);
|
||||||
|
|
||||||
|
require('./elements/element.arc')(Chart);
|
||||||
|
require('./elements/element.line')(Chart);
|
||||||
|
require('./elements/element.point')(Chart);
|
||||||
|
require('./elements/element.rectangle')(Chart);
|
||||||
|
|
||||||
|
require('./scales/scale.category')(Chart);
|
||||||
|
require('./scales/scale.linear')(Chart);
|
||||||
|
require('./scales/scale.logarithmic')(Chart);
|
||||||
|
require('./scales/scale.radialLinear')(Chart);
|
||||||
|
require('./scales/scale.time')(Chart);
|
||||||
|
|
||||||
|
// Controllers must be loaded after elements
|
||||||
|
// See Chart.core.datasetController.dataElementType
|
||||||
|
require('./controllers/controller.bar')(Chart);
|
||||||
|
require('./controllers/controller.bubble')(Chart);
|
||||||
|
require('./controllers/controller.doughnut')(Chart);
|
||||||
|
require('./controllers/controller.line')(Chart);
|
||||||
|
require('./controllers/controller.polarArea')(Chart);
|
||||||
|
require('./controllers/controller.radar')(Chart);
|
||||||
|
|
||||||
|
require('./charts/Chart.Bar')(Chart);
|
||||||
|
require('./charts/Chart.Bubble')(Chart);
|
||||||
|
require('./charts/Chart.Doughnut')(Chart);
|
||||||
|
require('./charts/Chart.Line')(Chart);
|
||||||
|
require('./charts/Chart.PolarArea')(Chart);
|
||||||
|
require('./charts/Chart.Radar')(Chart);
|
||||||
|
require('./charts/Chart.Scatter')(Chart);
|
||||||
|
|
||||||
|
window.Chart = module.exports = Chart;
|
11
public/vendors/Chart.js/src/charts/Chart.Bar.js
vendored
Normal file
11
public/vendors/Chart.js/src/charts/Chart.Bar.js
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
Chart.Bar = function(context, config) {
|
||||||
|
config.type = 'bar';
|
||||||
|
|
||||||
|
return new Chart(context, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
10
public/vendors/Chart.js/src/charts/Chart.Bubble.js
vendored
Normal file
10
public/vendors/Chart.js/src/charts/Chart.Bubble.js
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
Chart.Bubble = function(context, config) {
|
||||||
|
config.type = 'bubble';
|
||||||
|
return new Chart(context, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
11
public/vendors/Chart.js/src/charts/Chart.Doughnut.js
vendored
Normal file
11
public/vendors/Chart.js/src/charts/Chart.Doughnut.js
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
Chart.Doughnut = function(context, config) {
|
||||||
|
config.type = 'doughnut';
|
||||||
|
|
||||||
|
return new Chart(context, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
11
public/vendors/Chart.js/src/charts/Chart.Line.js
vendored
Normal file
11
public/vendors/Chart.js/src/charts/Chart.Line.js
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
Chart.Line = function(context, config) {
|
||||||
|
config.type = 'line';
|
||||||
|
|
||||||
|
return new Chart(context, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
11
public/vendors/Chart.js/src/charts/Chart.PolarArea.js
vendored
Normal file
11
public/vendors/Chart.js/src/charts/Chart.PolarArea.js
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
Chart.PolarArea = function(context, config) {
|
||||||
|
config.type = 'polarArea';
|
||||||
|
|
||||||
|
return new Chart(context, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
12
public/vendors/Chart.js/src/charts/Chart.Radar.js
vendored
Normal file
12
public/vendors/Chart.js/src/charts/Chart.Radar.js
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
Chart.Radar = function(context, config) {
|
||||||
|
config.options = Chart.helpers.configMerge({ aspectRatio: 1 }, config.options);
|
||||||
|
config.type = 'radar';
|
||||||
|
|
||||||
|
return new Chart(context, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
47
public/vendors/Chart.js/src/charts/Chart.Scatter.js
vendored
Normal file
47
public/vendors/Chart.js/src/charts/Chart.Scatter.js
vendored
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
var defaultConfig = {
|
||||||
|
hover: {
|
||||||
|
mode: 'single'
|
||||||
|
},
|
||||||
|
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
type: "linear", // scatter should not use a category axis
|
||||||
|
position: "bottom",
|
||||||
|
id: "x-axis-1" // need an ID so datasets can reference the scale
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
type: "linear",
|
||||||
|
position: "left",
|
||||||
|
id: "y-axis-1"
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
|
||||||
|
tooltips: {
|
||||||
|
callbacks: {
|
||||||
|
title: function(tooltipItems, data) {
|
||||||
|
// Title doesn't make sense for scatter since we format the data as a point
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
label: function(tooltipItem, data) {
|
||||||
|
return '(' + tooltipItem.xLabel + ', ' + tooltipItem.yLabel + ')';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Register the default config for this type
|
||||||
|
Chart.defaults.scatter = defaultConfig;
|
||||||
|
|
||||||
|
// Scatter charts use line controllers
|
||||||
|
Chart.controllers.scatter = Chart.controllers.line;
|
||||||
|
|
||||||
|
Chart.Scatter = function(context, config) {
|
||||||
|
config.type = 'scatter';
|
||||||
|
return new Chart(context, config);
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
569
public/vendors/Chart.js/src/controllers/controller.bar.js
vendored
Normal file
569
public/vendors/Chart.js/src/controllers/controller.bar.js
vendored
Normal file
@ -0,0 +1,569 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
var helpers = Chart.helpers;
|
||||||
|
|
||||||
|
Chart.defaults.bar = {
|
||||||
|
hover: {
|
||||||
|
mode: "label"
|
||||||
|
},
|
||||||
|
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
type: "category",
|
||||||
|
|
||||||
|
// Specific to Bar Controller
|
||||||
|
categoryPercentage: 0.8,
|
||||||
|
barPercentage: 0.9,
|
||||||
|
|
||||||
|
// grid line settings
|
||||||
|
gridLines: {
|
||||||
|
offsetGridLines: true
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
type: "linear"
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Chart.controllers.bar = Chart.DatasetController.extend({
|
||||||
|
|
||||||
|
dataElementType: Chart.elements.Rectangle,
|
||||||
|
|
||||||
|
initialize: function(chart, datasetIndex) {
|
||||||
|
Chart.DatasetController.prototype.initialize.call(this, chart, datasetIndex);
|
||||||
|
|
||||||
|
// Use this to indicate that this is a bar dataset.
|
||||||
|
this.getMeta().bar = true;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Get the number of datasets that display bars. We use this to correctly calculate the bar width
|
||||||
|
getBarCount: function getBarCount() {
|
||||||
|
var barCount = 0;
|
||||||
|
helpers.each(this.chart.data.datasets, function(dataset, datasetIndex) {
|
||||||
|
var meta = this.chart.getDatasetMeta(datasetIndex);
|
||||||
|
if (meta.bar && this.chart.isDatasetVisible(datasetIndex)) {
|
||||||
|
++barCount;
|
||||||
|
}
|
||||||
|
}, this);
|
||||||
|
return barCount;
|
||||||
|
},
|
||||||
|
|
||||||
|
update: function update(reset) {
|
||||||
|
helpers.each(this.getMeta().data, function(rectangle, index) {
|
||||||
|
this.updateElement(rectangle, index, reset);
|
||||||
|
}, this);
|
||||||
|
},
|
||||||
|
|
||||||
|
updateElement: function updateElement(rectangle, index, reset) {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var xScale = this.getScaleForId(meta.xAxisID);
|
||||||
|
var yScale = this.getScaleForId(meta.yAxisID);
|
||||||
|
var scaleBase = yScale.getBasePixel();
|
||||||
|
var rectangleElementOptions = this.chart.options.elements.rectangle;
|
||||||
|
var custom = rectangle.custom || {};
|
||||||
|
var dataset = this.getDataset();
|
||||||
|
|
||||||
|
helpers.extend(rectangle, {
|
||||||
|
// Utility
|
||||||
|
_xScale: xScale,
|
||||||
|
_yScale: yScale,
|
||||||
|
_datasetIndex: this.index,
|
||||||
|
_index: index,
|
||||||
|
|
||||||
|
// Desired view properties
|
||||||
|
_model: {
|
||||||
|
x: this.calculateBarX(index, this.index),
|
||||||
|
y: reset ? scaleBase : this.calculateBarY(index, this.index),
|
||||||
|
|
||||||
|
// Tooltip
|
||||||
|
label: this.chart.data.labels[index],
|
||||||
|
datasetLabel: dataset.label,
|
||||||
|
|
||||||
|
// Appearance
|
||||||
|
base: reset ? scaleBase : this.calculateBarBase(this.index, index),
|
||||||
|
width: this.calculateBarWidth(index),
|
||||||
|
backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor),
|
||||||
|
borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleElementOptions.borderSkipped,
|
||||||
|
borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor),
|
||||||
|
borderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
rectangle.pivot();
|
||||||
|
},
|
||||||
|
|
||||||
|
calculateBarBase: function(datasetIndex, index) {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var yScale = this.getScaleForId(meta.yAxisID);
|
||||||
|
var base = 0;
|
||||||
|
|
||||||
|
if (yScale.options.stacked) {
|
||||||
|
var chart = this.chart;
|
||||||
|
var datasets = chart.data.datasets;
|
||||||
|
var value = datasets[datasetIndex].data[index];
|
||||||
|
|
||||||
|
if (value < 0) {
|
||||||
|
for (var i = 0; i < datasetIndex; i++) {
|
||||||
|
var negDS = datasets[i];
|
||||||
|
var negDSMeta = chart.getDatasetMeta(i);
|
||||||
|
if (negDSMeta.bar && negDSMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {
|
||||||
|
base += negDS.data[index] < 0 ? negDS.data[index] : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (var j = 0; j < datasetIndex; j++) {
|
||||||
|
var posDS = datasets[j];
|
||||||
|
var posDSMeta = chart.getDatasetMeta(j);
|
||||||
|
if (posDSMeta.bar && posDSMeta.yAxisID === yScale.id && chart.isDatasetVisible(j)) {
|
||||||
|
base += posDS.data[index] > 0 ? posDS.data[index] : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return yScale.getPixelForValue(base);
|
||||||
|
}
|
||||||
|
|
||||||
|
return yScale.getBasePixel();
|
||||||
|
},
|
||||||
|
|
||||||
|
getRuler: function(index) {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var xScale = this.getScaleForId(meta.xAxisID);
|
||||||
|
var datasetCount = this.getBarCount();
|
||||||
|
|
||||||
|
var tickWidth;
|
||||||
|
|
||||||
|
if (xScale.options.type === 'category') {
|
||||||
|
tickWidth = xScale.getPixelForTick(index + 1) - xScale.getPixelForTick(index);
|
||||||
|
} else {
|
||||||
|
// Average width
|
||||||
|
tickWidth = xScale.width / xScale.ticks.length;
|
||||||
|
}
|
||||||
|
var categoryWidth = tickWidth * xScale.options.categoryPercentage;
|
||||||
|
var categorySpacing = (tickWidth - (tickWidth * xScale.options.categoryPercentage)) / 2;
|
||||||
|
var fullBarWidth = categoryWidth / datasetCount;
|
||||||
|
|
||||||
|
if (xScale.ticks.length !== this.chart.data.labels.length) {
|
||||||
|
var perc = xScale.ticks.length / this.chart.data.labels.length;
|
||||||
|
fullBarWidth = fullBarWidth * perc;
|
||||||
|
}
|
||||||
|
|
||||||
|
var barWidth = fullBarWidth * xScale.options.barPercentage;
|
||||||
|
var barSpacing = fullBarWidth - (fullBarWidth * xScale.options.barPercentage);
|
||||||
|
|
||||||
|
return {
|
||||||
|
datasetCount: datasetCount,
|
||||||
|
tickWidth: tickWidth,
|
||||||
|
categoryWidth: categoryWidth,
|
||||||
|
categorySpacing: categorySpacing,
|
||||||
|
fullBarWidth: fullBarWidth,
|
||||||
|
barWidth: barWidth,
|
||||||
|
barSpacing: barSpacing
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
calculateBarWidth: function(index) {
|
||||||
|
var xScale = this.getScaleForId(this.getMeta().xAxisID);
|
||||||
|
var ruler = this.getRuler(index);
|
||||||
|
return xScale.options.stacked ? ruler.categoryWidth : ruler.barWidth;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Get bar index from the given dataset index accounting for the fact that not all bars are visible
|
||||||
|
getBarIndex: function(datasetIndex) {
|
||||||
|
var barIndex = 0;
|
||||||
|
var meta, j;
|
||||||
|
|
||||||
|
for (j = 0; j < datasetIndex; ++j) {
|
||||||
|
meta = this.chart.getDatasetMeta(j);
|
||||||
|
if (meta.bar && this.chart.isDatasetVisible(j)) {
|
||||||
|
++barIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return barIndex;
|
||||||
|
},
|
||||||
|
|
||||||
|
calculateBarX: function(index, datasetIndex) {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var xScale = this.getScaleForId(meta.xAxisID);
|
||||||
|
var barIndex = this.getBarIndex(datasetIndex);
|
||||||
|
|
||||||
|
var ruler = this.getRuler(index);
|
||||||
|
var leftTick = xScale.getPixelForValue(null, index, datasetIndex, this.chart.isCombo);
|
||||||
|
leftTick -= this.chart.isCombo ? (ruler.tickWidth / 2) : 0;
|
||||||
|
|
||||||
|
if (xScale.options.stacked) {
|
||||||
|
return leftTick + (ruler.categoryWidth / 2) + ruler.categorySpacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
return leftTick +
|
||||||
|
(ruler.barWidth / 2) +
|
||||||
|
ruler.categorySpacing +
|
||||||
|
(ruler.barWidth * barIndex) +
|
||||||
|
(ruler.barSpacing / 2) +
|
||||||
|
(ruler.barSpacing * barIndex);
|
||||||
|
},
|
||||||
|
|
||||||
|
calculateBarY: function(index, datasetIndex) {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var yScale = this.getScaleForId(meta.yAxisID);
|
||||||
|
var value = this.getDataset().data[index];
|
||||||
|
|
||||||
|
if (yScale.options.stacked) {
|
||||||
|
|
||||||
|
var sumPos = 0,
|
||||||
|
sumNeg = 0;
|
||||||
|
|
||||||
|
for (var i = 0; i < datasetIndex; i++) {
|
||||||
|
var ds = this.chart.data.datasets[i];
|
||||||
|
var dsMeta = this.chart.getDatasetMeta(i);
|
||||||
|
if (dsMeta.bar && dsMeta.yAxisID === yScale.id && this.chart.isDatasetVisible(i)) {
|
||||||
|
if (ds.data[index] < 0) {
|
||||||
|
sumNeg += ds.data[index] || 0;
|
||||||
|
} else {
|
||||||
|
sumPos += ds.data[index] || 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value < 0) {
|
||||||
|
return yScale.getPixelForValue(sumNeg + value);
|
||||||
|
} else {
|
||||||
|
return yScale.getPixelForValue(sumPos + value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return yScale.getPixelForValue(value);
|
||||||
|
},
|
||||||
|
|
||||||
|
draw: function(ease) {
|
||||||
|
var easingDecimal = ease || 1;
|
||||||
|
helpers.each(this.getMeta().data, function(rectangle, index) {
|
||||||
|
var d = this.getDataset().data[index];
|
||||||
|
if (d !== null && d !== undefined && !isNaN(d)) {
|
||||||
|
rectangle.transition(easingDecimal).draw();
|
||||||
|
}
|
||||||
|
}, this);
|
||||||
|
},
|
||||||
|
|
||||||
|
setHoverStyle: function(rectangle) {
|
||||||
|
var dataset = this.chart.data.datasets[rectangle._datasetIndex];
|
||||||
|
var index = rectangle._index;
|
||||||
|
|
||||||
|
var custom = rectangle.custom || {};
|
||||||
|
var model = rectangle._model;
|
||||||
|
model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));
|
||||||
|
model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor));
|
||||||
|
model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);
|
||||||
|
},
|
||||||
|
|
||||||
|
removeHoverStyle: function(rectangle) {
|
||||||
|
var dataset = this.chart.data.datasets[rectangle._datasetIndex];
|
||||||
|
var index = rectangle._index;
|
||||||
|
var custom = rectangle.custom || {};
|
||||||
|
var model = rectangle._model;
|
||||||
|
var rectangleElementOptions = this.chart.options.elements.rectangle;
|
||||||
|
|
||||||
|
model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor);
|
||||||
|
model.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor);
|
||||||
|
model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// including horizontalBar in the bar file, instead of a file of its own
|
||||||
|
// it extends bar (like pie extends doughnut)
|
||||||
|
Chart.defaults.horizontalBar = {
|
||||||
|
hover: {
|
||||||
|
mode: "label"
|
||||||
|
},
|
||||||
|
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
type: "linear",
|
||||||
|
position: "bottom"
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
position: "left",
|
||||||
|
type: "category",
|
||||||
|
|
||||||
|
// Specific to Horizontal Bar Controller
|
||||||
|
categoryPercentage: 0.8,
|
||||||
|
barPercentage: 0.9,
|
||||||
|
|
||||||
|
// grid line settings
|
||||||
|
gridLines: {
|
||||||
|
offsetGridLines: true
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
elements: {
|
||||||
|
rectangle: {
|
||||||
|
borderSkipped: 'left'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
tooltips: {
|
||||||
|
callbacks: {
|
||||||
|
title: function(tooltipItems, data) {
|
||||||
|
// Pick first xLabel for now
|
||||||
|
var title = '';
|
||||||
|
|
||||||
|
if (tooltipItems.length > 0) {
|
||||||
|
if (tooltipItems[0].yLabel) {
|
||||||
|
title = tooltipItems[0].yLabel;
|
||||||
|
} else if (data.labels.length > 0 && tooltipItems[0].index < data.labels.length) {
|
||||||
|
title = data.labels[tooltipItems[0].index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return title;
|
||||||
|
},
|
||||||
|
label: function(tooltipItem, data) {
|
||||||
|
var datasetLabel = data.datasets[tooltipItem.datasetIndex].label || '';
|
||||||
|
return datasetLabel + ': ' + tooltipItem.xLabel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Chart.controllers.horizontalBar = Chart.controllers.bar.extend({
|
||||||
|
updateElement: function updateElement(rectangle, index, reset, numBars) {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var xScale = this.getScaleForId(meta.xAxisID);
|
||||||
|
var yScale = this.getScaleForId(meta.yAxisID);
|
||||||
|
var scaleBase = xScale.getBasePixel();
|
||||||
|
var custom = rectangle.custom || {};
|
||||||
|
var dataset = this.getDataset();
|
||||||
|
var rectangleElementOptions = this.chart.options.elements.rectangle;
|
||||||
|
|
||||||
|
helpers.extend(rectangle, {
|
||||||
|
// Utility
|
||||||
|
_xScale: xScale,
|
||||||
|
_yScale: yScale,
|
||||||
|
_datasetIndex: this.index,
|
||||||
|
_index: index,
|
||||||
|
|
||||||
|
// Desired view properties
|
||||||
|
_model: {
|
||||||
|
x: reset ? scaleBase : this.calculateBarX(index, this.index),
|
||||||
|
y: this.calculateBarY(index, this.index),
|
||||||
|
|
||||||
|
// Tooltip
|
||||||
|
label: this.chart.data.labels[index],
|
||||||
|
datasetLabel: dataset.label,
|
||||||
|
|
||||||
|
// Appearance
|
||||||
|
base: reset ? scaleBase : this.calculateBarBase(this.index, index),
|
||||||
|
height: this.calculateBarHeight(index),
|
||||||
|
backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor),
|
||||||
|
borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleElementOptions.borderSkipped,
|
||||||
|
borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor),
|
||||||
|
borderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth)
|
||||||
|
},
|
||||||
|
|
||||||
|
draw: function () {
|
||||||
|
|
||||||
|
var ctx = this._chart.ctx;
|
||||||
|
var vm = this._view;
|
||||||
|
|
||||||
|
var halfHeight = vm.height / 2,
|
||||||
|
topY = vm.y - halfHeight,
|
||||||
|
bottomY = vm.y + halfHeight,
|
||||||
|
right = vm.base - (vm.base - vm.x),
|
||||||
|
halfStroke = vm.borderWidth / 2;
|
||||||
|
|
||||||
|
// Canvas doesn't allow us to stroke inside the width so we can
|
||||||
|
// adjust the sizes to fit if we're setting a stroke on the line
|
||||||
|
if (vm.borderWidth) {
|
||||||
|
topY += halfStroke;
|
||||||
|
bottomY -= halfStroke;
|
||||||
|
right += halfStroke;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.beginPath();
|
||||||
|
|
||||||
|
ctx.fillStyle = vm.backgroundColor;
|
||||||
|
ctx.strokeStyle = vm.borderColor;
|
||||||
|
ctx.lineWidth = vm.borderWidth;
|
||||||
|
|
||||||
|
// Corner points, from bottom-left to bottom-right clockwise
|
||||||
|
// | 1 2 |
|
||||||
|
// | 0 3 |
|
||||||
|
var corners = [
|
||||||
|
[vm.base, bottomY],
|
||||||
|
[vm.base, topY],
|
||||||
|
[right, topY],
|
||||||
|
[right, bottomY]
|
||||||
|
];
|
||||||
|
|
||||||
|
// Find first (starting) corner with fallback to 'bottom'
|
||||||
|
var borders = ['bottom', 'left', 'top', 'right'];
|
||||||
|
var startCorner = borders.indexOf(vm.borderSkipped, 0);
|
||||||
|
if (startCorner === -1)
|
||||||
|
startCorner = 0;
|
||||||
|
|
||||||
|
function cornerAt(index) {
|
||||||
|
return corners[(startCorner + index) % 4];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw rectangle from 'startCorner'
|
||||||
|
ctx.moveTo.apply(ctx, cornerAt(0));
|
||||||
|
for (var i = 1; i < 4; i++)
|
||||||
|
ctx.lineTo.apply(ctx, cornerAt(i));
|
||||||
|
|
||||||
|
ctx.fill();
|
||||||
|
if (vm.borderWidth) {
|
||||||
|
ctx.stroke();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
inRange: function (mouseX, mouseY) {
|
||||||
|
var vm = this._view;
|
||||||
|
var inRange = false;
|
||||||
|
|
||||||
|
if (vm) {
|
||||||
|
if (vm.x < vm.base) {
|
||||||
|
inRange = (mouseY >= vm.y - vm.height / 2 && mouseY <= vm.y + vm.height / 2) && (mouseX >= vm.x && mouseX <= vm.base);
|
||||||
|
} else {
|
||||||
|
inRange = (mouseY >= vm.y - vm.height / 2 && mouseY <= vm.y + vm.height / 2) && (mouseX >= vm.base && mouseX <= vm.x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return inRange;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
rectangle.pivot();
|
||||||
|
},
|
||||||
|
|
||||||
|
calculateBarBase: function (datasetIndex, index) {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var xScale = this.getScaleForId(meta.xAxisID);
|
||||||
|
var base = 0;
|
||||||
|
|
||||||
|
if (xScale.options.stacked) {
|
||||||
|
|
||||||
|
var value = this.chart.data.datasets[datasetIndex].data[index];
|
||||||
|
|
||||||
|
if (value < 0) {
|
||||||
|
for (var i = 0; i < datasetIndex; i++) {
|
||||||
|
var negDS = this.chart.data.datasets[i];
|
||||||
|
var negDSMeta = this.chart.getDatasetMeta(i);
|
||||||
|
if (negDSMeta.bar && negDSMeta.xAxisID === xScale.id && this.chart.isDatasetVisible(i)) {
|
||||||
|
base += negDS.data[index] < 0 ? negDS.data[index] : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (var j = 0; j < datasetIndex; j++) {
|
||||||
|
var posDS = this.chart.data.datasets[j];
|
||||||
|
var posDSMeta = this.chart.getDatasetMeta(j);
|
||||||
|
if (posDSMeta.bar && posDSMeta.xAxisID === xScale.id && this.chart.isDatasetVisible(j)) {
|
||||||
|
base += posDS.data[index] > 0 ? posDS.data[index] : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return xScale.getPixelForValue(base);
|
||||||
|
}
|
||||||
|
|
||||||
|
return xScale.getBasePixel();
|
||||||
|
},
|
||||||
|
|
||||||
|
getRuler: function (index) {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var yScale = this.getScaleForId(meta.yAxisID);
|
||||||
|
var datasetCount = this.getBarCount();
|
||||||
|
|
||||||
|
var tickHeight;
|
||||||
|
if (yScale.options.type === 'category') {
|
||||||
|
tickHeight = yScale.getPixelForTick(index + 1) - yScale.getPixelForTick(index);
|
||||||
|
} else {
|
||||||
|
// Average width
|
||||||
|
tickHeight = yScale.width / yScale.ticks.length;
|
||||||
|
}
|
||||||
|
var categoryHeight = tickHeight * yScale.options.categoryPercentage;
|
||||||
|
var categorySpacing = (tickHeight - (tickHeight * yScale.options.categoryPercentage)) / 2;
|
||||||
|
var fullBarHeight = categoryHeight / datasetCount;
|
||||||
|
|
||||||
|
if (yScale.ticks.length !== this.chart.data.labels.length) {
|
||||||
|
var perc = yScale.ticks.length / this.chart.data.labels.length;
|
||||||
|
fullBarHeight = fullBarHeight * perc;
|
||||||
|
}
|
||||||
|
|
||||||
|
var barHeight = fullBarHeight * yScale.options.barPercentage;
|
||||||
|
var barSpacing = fullBarHeight - (fullBarHeight * yScale.options.barPercentage);
|
||||||
|
|
||||||
|
return {
|
||||||
|
datasetCount: datasetCount,
|
||||||
|
tickHeight: tickHeight,
|
||||||
|
categoryHeight: categoryHeight,
|
||||||
|
categorySpacing: categorySpacing,
|
||||||
|
fullBarHeight: fullBarHeight,
|
||||||
|
barHeight: barHeight,
|
||||||
|
barSpacing: barSpacing,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
calculateBarHeight: function (index) {
|
||||||
|
var yScale = this.getScaleForId(this.getMeta().yAxisID);
|
||||||
|
var ruler = this.getRuler(index);
|
||||||
|
return yScale.options.stacked ? ruler.categoryHeight : ruler.barHeight;
|
||||||
|
},
|
||||||
|
|
||||||
|
calculateBarX: function (index, datasetIndex) {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var xScale = this.getScaleForId(meta.xAxisID);
|
||||||
|
var value = this.getDataset().data[index];
|
||||||
|
|
||||||
|
if (xScale.options.stacked) {
|
||||||
|
|
||||||
|
var sumPos = 0,
|
||||||
|
sumNeg = 0;
|
||||||
|
|
||||||
|
for (var i = 0; i < datasetIndex; i++) {
|
||||||
|
var ds = this.chart.data.datasets[i];
|
||||||
|
var dsMeta = this.chart.getDatasetMeta(i);
|
||||||
|
if (dsMeta.bar && dsMeta.xAxisID === xScale.id && this.chart.isDatasetVisible(i)) {
|
||||||
|
if (ds.data[index] < 0) {
|
||||||
|
sumNeg += ds.data[index] || 0;
|
||||||
|
} else {
|
||||||
|
sumPos += ds.data[index] || 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value < 0) {
|
||||||
|
return xScale.getPixelForValue(sumNeg + value);
|
||||||
|
} else {
|
||||||
|
return xScale.getPixelForValue(sumPos + value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return xScale.getPixelForValue(value);
|
||||||
|
},
|
||||||
|
|
||||||
|
calculateBarY: function (index, datasetIndex) {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var yScale = this.getScaleForId(meta.yAxisID);
|
||||||
|
var barIndex = this.getBarIndex(datasetIndex);
|
||||||
|
|
||||||
|
var ruler = this.getRuler(index);
|
||||||
|
var topTick = yScale.getPixelForValue(null, index, datasetIndex, this.chart.isCombo);
|
||||||
|
topTick -= this.chart.isCombo ? (ruler.tickHeight / 2) : 0;
|
||||||
|
|
||||||
|
if (yScale.options.stacked) {
|
||||||
|
return topTick + (ruler.categoryHeight / 2) + ruler.categorySpacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
return topTick +
|
||||||
|
(ruler.barHeight / 2) +
|
||||||
|
ruler.categorySpacing +
|
||||||
|
(ruler.barHeight * barIndex) +
|
||||||
|
(ruler.barSpacing / 2) +
|
||||||
|
(ruler.barSpacing * barIndex);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
122
public/vendors/Chart.js/src/controllers/controller.bubble.js
vendored
Normal file
122
public/vendors/Chart.js/src/controllers/controller.bubble.js
vendored
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
var helpers = Chart.helpers;
|
||||||
|
|
||||||
|
Chart.defaults.bubble = {
|
||||||
|
hover: {
|
||||||
|
mode: "single"
|
||||||
|
},
|
||||||
|
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
type: "linear", // bubble should probably use a linear scale by default
|
||||||
|
position: "bottom",
|
||||||
|
id: "x-axis-0" // need an ID so datasets can reference the scale
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
type: "linear",
|
||||||
|
position: "left",
|
||||||
|
id: "y-axis-0"
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
|
||||||
|
tooltips: {
|
||||||
|
callbacks: {
|
||||||
|
title: function(tooltipItems, data) {
|
||||||
|
// Title doesn't make sense for scatter since we format the data as a point
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
label: function(tooltipItem, data) {
|
||||||
|
var datasetLabel = data.datasets[tooltipItem.datasetIndex].label || '';
|
||||||
|
var dataPoint = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
|
||||||
|
return datasetLabel + ': (' + dataPoint.x + ', ' + dataPoint.y + ', ' + dataPoint.r + ')';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Chart.controllers.bubble = Chart.DatasetController.extend({
|
||||||
|
|
||||||
|
dataElementType: Chart.elements.Point,
|
||||||
|
|
||||||
|
update: function update(reset) {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var points = meta.data;
|
||||||
|
|
||||||
|
// Update Points
|
||||||
|
helpers.each(points, function(point, index) {
|
||||||
|
this.updateElement(point, index, reset);
|
||||||
|
}, this);
|
||||||
|
},
|
||||||
|
|
||||||
|
updateElement: function(point, index, reset) {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var xScale = this.getScaleForId(meta.xAxisID);
|
||||||
|
var yScale = this.getScaleForId(meta.yAxisID);
|
||||||
|
|
||||||
|
var custom = point.custom || {};
|
||||||
|
var dataset = this.getDataset();
|
||||||
|
var data = dataset.data[index];
|
||||||
|
var pointElementOptions = this.chart.options.elements.point;
|
||||||
|
|
||||||
|
helpers.extend(point, {
|
||||||
|
// Utility
|
||||||
|
_xScale: xScale,
|
||||||
|
_yScale: yScale,
|
||||||
|
_datasetIndex: this.index,
|
||||||
|
_index: index,
|
||||||
|
|
||||||
|
// Desired view properties
|
||||||
|
_model: {
|
||||||
|
x: reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(data, index, this.index, this.chart.isCombo),
|
||||||
|
y: reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, this.index),
|
||||||
|
// Appearance
|
||||||
|
radius: reset ? 0 : custom.radius ? custom.radius : this.getRadius(data),
|
||||||
|
backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, pointElementOptions.backgroundColor),
|
||||||
|
borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, pointElementOptions.borderColor),
|
||||||
|
borderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, pointElementOptions.borderWidth),
|
||||||
|
|
||||||
|
// Tooltip
|
||||||
|
hitRadius: custom.hitRadius ? custom.hitRadius : helpers.getValueAtIndexOrDefault(dataset.hitRadius, index, pointElementOptions.hitRadius)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var model = point._model;
|
||||||
|
model.skip = custom.skip ? custom.skip : (isNaN(model.x) || isNaN(model.y));
|
||||||
|
|
||||||
|
point.pivot();
|
||||||
|
},
|
||||||
|
|
||||||
|
getRadius: function(value) {
|
||||||
|
return value.r || this.chart.options.elements.point.radius;
|
||||||
|
},
|
||||||
|
|
||||||
|
setHoverStyle: function(point) {
|
||||||
|
// Point
|
||||||
|
var dataset = this.chart.data.datasets[point._datasetIndex];
|
||||||
|
var index = point._index;
|
||||||
|
var custom = point.custom || {};
|
||||||
|
var model = point._model;
|
||||||
|
|
||||||
|
model.radius = custom.hoverRadius ? custom.hoverRadius : (helpers.getValueAtIndexOrDefault(dataset.hoverRadius, index, this.chart.options.elements.point.hoverRadius)) + this.getRadius(this.getDataset().data[point._index]);
|
||||||
|
model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));
|
||||||
|
model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor));
|
||||||
|
model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);
|
||||||
|
},
|
||||||
|
|
||||||
|
removeHoverStyle: function(point) {
|
||||||
|
var dataset = this.chart.data.datasets[point._datasetIndex];
|
||||||
|
var index = point._index;
|
||||||
|
var custom = point.custom || {};
|
||||||
|
var model = point._model;
|
||||||
|
var pointElementOptions = this.chart.options.elements.point;
|
||||||
|
|
||||||
|
model.radius = custom.radius ? custom.radius : this.getRadius(dataset.data[point._index]);
|
||||||
|
model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, pointElementOptions.backgroundColor);
|
||||||
|
model.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, pointElementOptions.borderColor);
|
||||||
|
model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, pointElementOptions.borderWidth);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
271
public/vendors/Chart.js/src/controllers/controller.doughnut.js
vendored
Normal file
271
public/vendors/Chart.js/src/controllers/controller.doughnut.js
vendored
Normal file
@ -0,0 +1,271 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
var helpers = Chart.helpers,
|
||||||
|
defaults = Chart.defaults;
|
||||||
|
|
||||||
|
defaults.doughnut = {
|
||||||
|
animation: {
|
||||||
|
//Boolean - Whether we animate the rotation of the Doughnut
|
||||||
|
animateRotate: true,
|
||||||
|
//Boolean - Whether we animate scaling the Doughnut from the centre
|
||||||
|
animateScale: false
|
||||||
|
},
|
||||||
|
aspectRatio: 1,
|
||||||
|
hover: {
|
||||||
|
mode: 'single'
|
||||||
|
},
|
||||||
|
legendCallback: function(chart) {
|
||||||
|
var text = [];
|
||||||
|
text.push('<ul class="' + chart.id + '-legend">');
|
||||||
|
|
||||||
|
var data = chart.data;
|
||||||
|
var datasets = data.datasets;
|
||||||
|
var labels = data.labels;
|
||||||
|
|
||||||
|
if (datasets.length) {
|
||||||
|
for (var i = 0; i < datasets[0].data.length; ++i) {
|
||||||
|
text.push('<li><span style="background-color:' + datasets[0].backgroundColor[i] + '"></span>');
|
||||||
|
if (labels[i]) {
|
||||||
|
text.push(labels[i]);
|
||||||
|
}
|
||||||
|
text.push('</li>');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
text.push('</ul>');
|
||||||
|
return text.join("");
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
labels: {
|
||||||
|
generateLabels: function(chart) {
|
||||||
|
var data = chart.data;
|
||||||
|
if (data.labels.length && data.datasets.length) {
|
||||||
|
return data.labels.map(function(label, i) {
|
||||||
|
var meta = chart.getDatasetMeta(0);
|
||||||
|
var ds = data.datasets[0];
|
||||||
|
var arc = meta.data[i];
|
||||||
|
var custom = arc.custom || {};
|
||||||
|
var getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;
|
||||||
|
var arcOpts = chart.options.elements.arc;
|
||||||
|
var fill = custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);
|
||||||
|
var stroke = custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);
|
||||||
|
var bw = custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);
|
||||||
|
|
||||||
|
return {
|
||||||
|
text: label,
|
||||||
|
fillStyle: fill,
|
||||||
|
strokeStyle: stroke,
|
||||||
|
lineWidth: bw,
|
||||||
|
hidden: isNaN(ds.data[i]) || meta.data[i].hidden,
|
||||||
|
|
||||||
|
// Extra data used for toggling the correct item
|
||||||
|
index: i
|
||||||
|
};
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onClick: function(e, legendItem) {
|
||||||
|
var index = legendItem.index;
|
||||||
|
var chart = this.chart;
|
||||||
|
var i, ilen, meta;
|
||||||
|
|
||||||
|
for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {
|
||||||
|
meta = chart.getDatasetMeta(i);
|
||||||
|
meta.data[index].hidden = !meta.data[index].hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
chart.update();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
//The percentage of the chart that we cut out of the middle.
|
||||||
|
cutoutPercentage: 50,
|
||||||
|
|
||||||
|
//The rotation of the chart, where the first data arc begins.
|
||||||
|
rotation: Math.PI * -0.5,
|
||||||
|
|
||||||
|
//The total circumference of the chart.
|
||||||
|
circumference: Math.PI * 2.0,
|
||||||
|
|
||||||
|
// Need to override these to give a nice default
|
||||||
|
tooltips: {
|
||||||
|
callbacks: {
|
||||||
|
title: function() {
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
label: function(tooltipItem, data) {
|
||||||
|
return data.labels[tooltipItem.index] + ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
defaults.pie = helpers.clone(defaults.doughnut);
|
||||||
|
helpers.extend(defaults.pie, {
|
||||||
|
cutoutPercentage: 0
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
Chart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({
|
||||||
|
|
||||||
|
dataElementType: Chart.elements.Arc,
|
||||||
|
|
||||||
|
linkScales: helpers.noop,
|
||||||
|
|
||||||
|
// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly
|
||||||
|
getRingIndex: function getRingIndex(datasetIndex) {
|
||||||
|
var ringIndex = 0;
|
||||||
|
|
||||||
|
for (var j = 0; j < datasetIndex; ++j) {
|
||||||
|
if (this.chart.isDatasetVisible(j)) {
|
||||||
|
++ringIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ringIndex;
|
||||||
|
},
|
||||||
|
|
||||||
|
update: function update(reset) {
|
||||||
|
var _this = this;
|
||||||
|
var chart = _this.chart,
|
||||||
|
chartArea = chart.chartArea,
|
||||||
|
opts = chart.options,
|
||||||
|
arcOpts = opts.elements.arc,
|
||||||
|
availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth,
|
||||||
|
availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth,
|
||||||
|
minSize = Math.min(availableWidth, availableHeight),
|
||||||
|
offset = {
|
||||||
|
x: 0,
|
||||||
|
y: 0
|
||||||
|
},
|
||||||
|
meta = _this.getMeta(),
|
||||||
|
cutoutPercentage = opts.cutoutPercentage,
|
||||||
|
circumference = opts.circumference;
|
||||||
|
|
||||||
|
// If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc
|
||||||
|
if (circumference < Math.PI * 2.0) {
|
||||||
|
var startAngle = opts.rotation % (Math.PI * 2.0);
|
||||||
|
startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);
|
||||||
|
var endAngle = startAngle + circumference;
|
||||||
|
var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};
|
||||||
|
var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};
|
||||||
|
var contains0 = (startAngle <= 0 && 0 <= endAngle) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);
|
||||||
|
var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle);
|
||||||
|
var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);
|
||||||
|
var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle);
|
||||||
|
var cutout = cutoutPercentage / 100.0;
|
||||||
|
var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))};
|
||||||
|
var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))};
|
||||||
|
var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};
|
||||||
|
minSize = Math.min(availableWidth / size.width, availableHeight / size.height);
|
||||||
|
offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};
|
||||||
|
}
|
||||||
|
|
||||||
|
chart.outerRadius = Math.max(minSize / 2, 0);
|
||||||
|
chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 1, 0);
|
||||||
|
chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();
|
||||||
|
chart.offsetX = offset.x * chart.outerRadius;
|
||||||
|
chart.offsetY = offset.y * chart.outerRadius;
|
||||||
|
|
||||||
|
meta.total = _this.calculateTotal();
|
||||||
|
|
||||||
|
_this.outerRadius = chart.outerRadius - (chart.radiusLength * _this.getRingIndex(_this.index));
|
||||||
|
_this.innerRadius = _this.outerRadius - chart.radiusLength;
|
||||||
|
|
||||||
|
helpers.each(meta.data, function(arc, index) {
|
||||||
|
_this.updateElement(arc, index, reset);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
updateElement: function(arc, index, reset) {
|
||||||
|
var _this = this;
|
||||||
|
var chart = _this.chart,
|
||||||
|
chartArea = chart.chartArea,
|
||||||
|
opts = chart.options,
|
||||||
|
animationOpts = opts.animation,
|
||||||
|
arcOpts = opts.elements.arc,
|
||||||
|
centerX = (chartArea.left + chartArea.right) / 2,
|
||||||
|
centerY = (chartArea.top + chartArea.bottom) / 2,
|
||||||
|
startAngle = opts.rotation, // non reset case handled later
|
||||||
|
endAngle = opts.rotation, // non reset case handled later
|
||||||
|
dataset = _this.getDataset(),
|
||||||
|
circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : _this.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)),
|
||||||
|
innerRadius = reset && animationOpts.animateScale ? 0 : _this.innerRadius,
|
||||||
|
outerRadius = reset && animationOpts.animateScale ? 0 : _this.outerRadius,
|
||||||
|
custom = arc.custom || {},
|
||||||
|
valueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;
|
||||||
|
|
||||||
|
helpers.extend(arc, {
|
||||||
|
// Utility
|
||||||
|
_datasetIndex: _this.index,
|
||||||
|
_index: index,
|
||||||
|
|
||||||
|
// Desired view properties
|
||||||
|
_model: {
|
||||||
|
x: centerX + chart.offsetX,
|
||||||
|
y: centerY + chart.offsetY,
|
||||||
|
startAngle: startAngle,
|
||||||
|
endAngle: endAngle,
|
||||||
|
circumference: circumference,
|
||||||
|
outerRadius: outerRadius,
|
||||||
|
innerRadius: innerRadius,
|
||||||
|
label: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var model = arc._model;
|
||||||
|
model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(dataset.backgroundColor, index, arcOpts.backgroundColor);
|
||||||
|
model.hoverBackgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, arcOpts.hoverBackgroundColor);
|
||||||
|
model.borderWidth = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(dataset.borderWidth, index, arcOpts.borderWidth);
|
||||||
|
model.borderColor = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(dataset.borderColor, index, arcOpts.borderColor);
|
||||||
|
|
||||||
|
// Set correct angles if not resetting
|
||||||
|
if (!reset || !animationOpts.animateRotate) {
|
||||||
|
if (index === 0) {
|
||||||
|
model.startAngle = opts.rotation;
|
||||||
|
} else {
|
||||||
|
model.startAngle = _this.getMeta().data[index - 1]._model.endAngle;
|
||||||
|
}
|
||||||
|
|
||||||
|
model.endAngle = model.startAngle + model.circumference;
|
||||||
|
}
|
||||||
|
|
||||||
|
arc.pivot();
|
||||||
|
},
|
||||||
|
|
||||||
|
removeHoverStyle: function(arc) {
|
||||||
|
Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);
|
||||||
|
},
|
||||||
|
|
||||||
|
calculateTotal: function() {
|
||||||
|
var dataset = this.getDataset();
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var total = 0;
|
||||||
|
var value;
|
||||||
|
|
||||||
|
helpers.each(meta.data, function(element, index) {
|
||||||
|
value = dataset.data[index];
|
||||||
|
if (!isNaN(value) && !element.hidden) {
|
||||||
|
total += Math.abs(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return total;
|
||||||
|
},
|
||||||
|
|
||||||
|
calculateCircumference: function(value) {
|
||||||
|
var total = this.getMeta().total;
|
||||||
|
if (total > 0 && !isNaN(value)) {
|
||||||
|
return (Math.PI * 2.0) * (value / total);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
306
public/vendors/Chart.js/src/controllers/controller.line.js
vendored
Normal file
306
public/vendors/Chart.js/src/controllers/controller.line.js
vendored
Normal file
@ -0,0 +1,306 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
var helpers = Chart.helpers;
|
||||||
|
|
||||||
|
Chart.defaults.line = {
|
||||||
|
showLines: true,
|
||||||
|
|
||||||
|
hover: {
|
||||||
|
mode: "label"
|
||||||
|
},
|
||||||
|
|
||||||
|
scales: {
|
||||||
|
xAxes: [{
|
||||||
|
type: "category",
|
||||||
|
id: 'x-axis-0'
|
||||||
|
}],
|
||||||
|
yAxes: [{
|
||||||
|
type: "linear",
|
||||||
|
id: 'y-axis-0'
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Chart.controllers.line = Chart.DatasetController.extend({
|
||||||
|
|
||||||
|
datasetElementType: Chart.elements.Line,
|
||||||
|
|
||||||
|
dataElementType: Chart.elements.Point,
|
||||||
|
|
||||||
|
addElementAndReset: function(index) {
|
||||||
|
var me = this;
|
||||||
|
var options = me.chart.options;
|
||||||
|
|
||||||
|
Chart.DatasetController.prototype.addElementAndReset.call(me, index);
|
||||||
|
|
||||||
|
// Make sure bezier control points are updated
|
||||||
|
if (options.showLines && options.elements.line.tension !== 0) {
|
||||||
|
me.updateBezierControlPoints();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
update: function update(reset) {
|
||||||
|
var me = this;
|
||||||
|
var meta = me.getMeta();
|
||||||
|
var line = meta.dataset;
|
||||||
|
var points = meta.data || [];
|
||||||
|
var options = me.chart.options;
|
||||||
|
var lineElementOptions = options.elements.line;
|
||||||
|
var scale = me.getScaleForId(meta.yAxisID);
|
||||||
|
var i, ilen, dataset, custom;
|
||||||
|
|
||||||
|
// Update Line
|
||||||
|
if (options.showLines) {
|
||||||
|
dataset = me.getDataset();
|
||||||
|
custom = line.custom || {};
|
||||||
|
|
||||||
|
// Compatibility: If the properties are defined with only the old name, use those values
|
||||||
|
if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {
|
||||||
|
dataset.lineTension = dataset.tension;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Utility
|
||||||
|
line._scale = scale;
|
||||||
|
line._datasetIndex = me.index;
|
||||||
|
// Data
|
||||||
|
line._children = points;
|
||||||
|
// Model
|
||||||
|
line._model = {
|
||||||
|
// Appearance
|
||||||
|
tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, lineElementOptions.tension),
|
||||||
|
backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),
|
||||||
|
borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),
|
||||||
|
borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),
|
||||||
|
borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),
|
||||||
|
borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),
|
||||||
|
borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),
|
||||||
|
borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),
|
||||||
|
fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),
|
||||||
|
// Scale
|
||||||
|
scaleTop: scale.top,
|
||||||
|
scaleBottom: scale.bottom,
|
||||||
|
scaleZero: scale.getBasePixel()
|
||||||
|
};
|
||||||
|
|
||||||
|
line.pivot();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update Points
|
||||||
|
for (i=0, ilen=points.length; i<ilen; ++i) {
|
||||||
|
me.updateElement(points[i], i, reset);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.showLines && lineElementOptions.tension !== 0) {
|
||||||
|
me.updateBezierControlPoints();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
getPointBackgroundColor: function(point, index) {
|
||||||
|
var backgroundColor = this.chart.options.elements.point.backgroundColor;
|
||||||
|
var dataset = this.getDataset();
|
||||||
|
var custom = point.custom || {};
|
||||||
|
|
||||||
|
if (custom.backgroundColor) {
|
||||||
|
backgroundColor = custom.backgroundColor;
|
||||||
|
} else if (dataset.pointBackgroundColor) {
|
||||||
|
backgroundColor = helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor);
|
||||||
|
} else if (dataset.backgroundColor) {
|
||||||
|
backgroundColor = dataset.backgroundColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
return backgroundColor;
|
||||||
|
},
|
||||||
|
|
||||||
|
getPointBorderColor: function(point, index) {
|
||||||
|
var borderColor = this.chart.options.elements.point.borderColor;
|
||||||
|
var dataset = this.getDataset();
|
||||||
|
var custom = point.custom || {};
|
||||||
|
|
||||||
|
if (custom.borderColor) {
|
||||||
|
borderColor = custom.borderColor;
|
||||||
|
} else if (dataset.pointBorderColor) {
|
||||||
|
borderColor = helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor);
|
||||||
|
} else if (dataset.borderColor) {
|
||||||
|
borderColor = dataset.borderColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
return borderColor;
|
||||||
|
},
|
||||||
|
|
||||||
|
getPointBorderWidth: function(point, index) {
|
||||||
|
var borderWidth = this.chart.options.elements.point.borderWidth;
|
||||||
|
var dataset = this.getDataset();
|
||||||
|
var custom = point.custom || {};
|
||||||
|
|
||||||
|
if (custom.borderWidth) {
|
||||||
|
borderWidth = custom.borderWidth;
|
||||||
|
} else if (dataset.pointBorderWidth) {
|
||||||
|
borderWidth = helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth);
|
||||||
|
} else if (dataset.borderWidth) {
|
||||||
|
borderWidth = dataset.borderWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
return borderWidth;
|
||||||
|
},
|
||||||
|
|
||||||
|
updateElement: function(point, index, reset) {
|
||||||
|
var me = this;
|
||||||
|
var meta = me.getMeta();
|
||||||
|
var custom = point.custom || {};
|
||||||
|
var dataset = me.getDataset();
|
||||||
|
var datasetIndex = me.index;
|
||||||
|
var value = dataset.data[index];
|
||||||
|
var yScale = me.getScaleForId(meta.yAxisID);
|
||||||
|
var xScale = me.getScaleForId(meta.xAxisID);
|
||||||
|
var pointOptions = me.chart.options.elements.point;
|
||||||
|
var x, y;
|
||||||
|
|
||||||
|
// Compatibility: If the properties are defined with only the old name, use those values
|
||||||
|
if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {
|
||||||
|
dataset.pointRadius = dataset.radius;
|
||||||
|
}
|
||||||
|
if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {
|
||||||
|
dataset.pointHitRadius = dataset.hitRadius;
|
||||||
|
}
|
||||||
|
|
||||||
|
x = xScale.getPixelForValue(value, index, datasetIndex, me.chart.isCombo);
|
||||||
|
y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex, me.chart.isCombo);
|
||||||
|
|
||||||
|
// Utility
|
||||||
|
point._xScale = xScale;
|
||||||
|
point._yScale = yScale;
|
||||||
|
point._datasetIndex = datasetIndex;
|
||||||
|
point._index = index;
|
||||||
|
|
||||||
|
// Desired view properties
|
||||||
|
point._model = {
|
||||||
|
x: x,
|
||||||
|
y: y,
|
||||||
|
skip: custom.skip || isNaN(x) || isNaN(y),
|
||||||
|
// Appearance
|
||||||
|
radius: custom.radius || helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius),
|
||||||
|
pointStyle: custom.pointStyle || helpers.getValueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle),
|
||||||
|
backgroundColor: me.getPointBackgroundColor(point, index),
|
||||||
|
borderColor: me.getPointBorderColor(point, index),
|
||||||
|
borderWidth: me.getPointBorderWidth(point, index),
|
||||||
|
tension: meta.dataset._model ? meta.dataset._model.tension : 0,
|
||||||
|
// Tooltip
|
||||||
|
hitRadius: custom.hitRadius || helpers.getValueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius)
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
calculatePointY: function(value, index, datasetIndex, isCombo) {
|
||||||
|
var me = this;
|
||||||
|
var chart = me.chart;
|
||||||
|
var meta = me.getMeta();
|
||||||
|
var yScale = me.getScaleForId(meta.yAxisID);
|
||||||
|
var sumPos = 0;
|
||||||
|
var sumNeg = 0;
|
||||||
|
var i, ds, dsMeta;
|
||||||
|
|
||||||
|
if (yScale.options.stacked) {
|
||||||
|
for (i = 0; i < datasetIndex; i++) {
|
||||||
|
ds = chart.data.datasets[i];
|
||||||
|
dsMeta = chart.getDatasetMeta(i);
|
||||||
|
if (dsMeta.type === 'line' && chart.isDatasetVisible(i)) {
|
||||||
|
if (ds.data[index] < 0) {
|
||||||
|
sumNeg += ds.data[index] || 0;
|
||||||
|
} else {
|
||||||
|
sumPos += ds.data[index] || 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value < 0) {
|
||||||
|
return yScale.getPixelForValue(sumNeg + value);
|
||||||
|
} else {
|
||||||
|
return yScale.getPixelForValue(sumPos + value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return yScale.getPixelForValue(value);
|
||||||
|
},
|
||||||
|
|
||||||
|
updateBezierControlPoints: function() {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var area = this.chart.chartArea;
|
||||||
|
var points = meta.data || [];
|
||||||
|
var i, ilen, point, model, controlPoints;
|
||||||
|
|
||||||
|
for (i=0, ilen=points.length; i<ilen; ++i) {
|
||||||
|
point = points[i];
|
||||||
|
model = point._model;
|
||||||
|
controlPoints = helpers.splineCurve(
|
||||||
|
helpers.previousItem(points, i)._model,
|
||||||
|
model,
|
||||||
|
helpers.nextItem(points, i)._model,
|
||||||
|
meta.dataset._model.tension
|
||||||
|
);
|
||||||
|
|
||||||
|
// Prevent the bezier going outside of the bounds of the graph
|
||||||
|
model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, area.right), area.left);
|
||||||
|
model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, area.bottom), area.top);
|
||||||
|
model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, area.right), area.left);
|
||||||
|
model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, area.bottom), area.top);
|
||||||
|
|
||||||
|
// Now pivot the point for animation
|
||||||
|
point.pivot();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
draw: function(ease) {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var points = meta.data || [];
|
||||||
|
var easingDecimal = ease || 1;
|
||||||
|
var i, ilen;
|
||||||
|
|
||||||
|
// Transition Point Locations
|
||||||
|
for (i=0, ilen=points.length; i<ilen; ++i) {
|
||||||
|
points[i].transition(easingDecimal);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transition and Draw the line
|
||||||
|
if (this.chart.options.showLines) {
|
||||||
|
meta.dataset.transition(easingDecimal).draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw the points
|
||||||
|
for (i=0, ilen=points.length; i<ilen; ++i) {
|
||||||
|
points[i].draw();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
setHoverStyle: function(point) {
|
||||||
|
// Point
|
||||||
|
var dataset = this.chart.data.datasets[point._datasetIndex];
|
||||||
|
var index = point._index;
|
||||||
|
var custom = point.custom || {};
|
||||||
|
var model = point._model;
|
||||||
|
|
||||||
|
model.radius = custom.hoverRadius || helpers.getValueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);
|
||||||
|
model.backgroundColor = custom.hoverBackgroundColor || helpers.getValueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));
|
||||||
|
model.borderColor = custom.hoverBorderColor || helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));
|
||||||
|
model.borderWidth = custom.hoverBorderWidth || helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);
|
||||||
|
},
|
||||||
|
|
||||||
|
removeHoverStyle: function(point) {
|
||||||
|
var me = this;
|
||||||
|
var dataset = me.chart.data.datasets[point._datasetIndex];
|
||||||
|
var index = point._index;
|
||||||
|
var custom = point.custom || {};
|
||||||
|
var model = point._model;
|
||||||
|
|
||||||
|
// Compatibility: If the properties are defined with only the old name, use those values
|
||||||
|
if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {
|
||||||
|
dataset.pointRadius = dataset.radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
model.radius = custom.radius || helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius);
|
||||||
|
model.backgroundColor = me.getPointBackgroundColor(point, index);
|
||||||
|
model.borderColor = me.getPointBorderColor(point, index);
|
||||||
|
model.borderWidth = me.getPointBorderWidth(point, index);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
229
public/vendors/Chart.js/src/controllers/controller.polarArea.js
vendored
Normal file
229
public/vendors/Chart.js/src/controllers/controller.polarArea.js
vendored
Normal file
@ -0,0 +1,229 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
var helpers = Chart.helpers;
|
||||||
|
|
||||||
|
Chart.defaults.polarArea = {
|
||||||
|
|
||||||
|
scale: {
|
||||||
|
type: "radialLinear",
|
||||||
|
lineArc: true // so that lines are circular
|
||||||
|
},
|
||||||
|
|
||||||
|
//Boolean - Whether to animate the rotation of the chart
|
||||||
|
animation: {
|
||||||
|
animateRotate: true,
|
||||||
|
animateScale: true
|
||||||
|
},
|
||||||
|
|
||||||
|
aspectRatio: 1,
|
||||||
|
legendCallback: function(chart) {
|
||||||
|
var text = [];
|
||||||
|
text.push('<ul class="' + chart.id + '-legend">');
|
||||||
|
|
||||||
|
var data = chart.data;
|
||||||
|
var datasets = data.datasets;
|
||||||
|
var labels = data.labels;
|
||||||
|
|
||||||
|
if (datasets.length) {
|
||||||
|
for (var i = 0; i < datasets[0].data.length; ++i) {
|
||||||
|
text.push('<li><span style="background-color:' + datasets[0].backgroundColor[i] + '">');
|
||||||
|
if (labels[i]) {
|
||||||
|
text.push(labels[i]);
|
||||||
|
}
|
||||||
|
text.push('</span></li>');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
text.push('</ul>');
|
||||||
|
return text.join("");
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
labels: {
|
||||||
|
generateLabels: function(chart) {
|
||||||
|
var data = chart.data;
|
||||||
|
if (data.labels.length && data.datasets.length) {
|
||||||
|
return data.labels.map(function(label, i) {
|
||||||
|
var meta = chart.getDatasetMeta(0);
|
||||||
|
var ds = data.datasets[0];
|
||||||
|
var arc = meta.data[i];
|
||||||
|
var custom = arc.custom || {};
|
||||||
|
var getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;
|
||||||
|
var arcOpts = chart.options.elements.arc;
|
||||||
|
var fill = custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);
|
||||||
|
var stroke = custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);
|
||||||
|
var bw = custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);
|
||||||
|
|
||||||
|
return {
|
||||||
|
text: label,
|
||||||
|
fillStyle: fill,
|
||||||
|
strokeStyle: stroke,
|
||||||
|
lineWidth: bw,
|
||||||
|
hidden: isNaN(ds.data[i]) || meta.data[i].hidden,
|
||||||
|
|
||||||
|
// Extra data used for toggling the correct item
|
||||||
|
index: i
|
||||||
|
};
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onClick: function(e, legendItem) {
|
||||||
|
var index = legendItem.index;
|
||||||
|
var chart = this.chart;
|
||||||
|
var i, ilen, meta;
|
||||||
|
|
||||||
|
for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {
|
||||||
|
meta = chart.getDatasetMeta(i);
|
||||||
|
meta.data[index].hidden = !meta.data[index].hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
chart.update();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Need to override these to give a nice default
|
||||||
|
tooltips: {
|
||||||
|
callbacks: {
|
||||||
|
title: function() {
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
label: function(tooltipItem, data) {
|
||||||
|
return data.labels[tooltipItem.index] + ': ' + tooltipItem.yLabel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Chart.controllers.polarArea = Chart.DatasetController.extend({
|
||||||
|
|
||||||
|
dataElementType: Chart.elements.Arc,
|
||||||
|
|
||||||
|
linkScales: helpers.noop,
|
||||||
|
|
||||||
|
update: function update(reset) {
|
||||||
|
var _this = this;
|
||||||
|
var chart = _this.chart;
|
||||||
|
var chartArea = chart.chartArea;
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var opts = chart.options;
|
||||||
|
var arcOpts = opts.elements.arc;
|
||||||
|
var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);
|
||||||
|
chart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0);
|
||||||
|
chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);
|
||||||
|
chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();
|
||||||
|
|
||||||
|
_this.outerRadius = chart.outerRadius - (chart.radiusLength * _this.index);
|
||||||
|
_this.innerRadius = _this.outerRadius - chart.radiusLength;
|
||||||
|
|
||||||
|
meta.count = _this.countVisibleElements();
|
||||||
|
|
||||||
|
helpers.each(meta.data, function(arc, index) {
|
||||||
|
_this.updateElement(arc, index, reset);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
updateElement: function(arc, index, reset) {
|
||||||
|
var _this = this;
|
||||||
|
var chart = _this.chart;
|
||||||
|
var chartArea = chart.chartArea;
|
||||||
|
var dataset = _this.getDataset();
|
||||||
|
var opts = chart.options;
|
||||||
|
var animationOpts = opts.animation;
|
||||||
|
var arcOpts = opts.elements.arc;
|
||||||
|
var custom = arc.custom || {};
|
||||||
|
var scale = chart.scale;
|
||||||
|
var getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;
|
||||||
|
var labels = chart.data.labels;
|
||||||
|
|
||||||
|
var circumference = _this.calculateCircumference(dataset.data[index]);
|
||||||
|
var centerX = (chartArea.left + chartArea.right) / 2;
|
||||||
|
var centerY = (chartArea.top + chartArea.bottom) / 2;
|
||||||
|
|
||||||
|
// If there is NaN data before us, we need to calculate the starting angle correctly.
|
||||||
|
// We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data
|
||||||
|
var visibleCount = 0;
|
||||||
|
var meta = _this.getMeta();
|
||||||
|
for (var i = 0; i < index; ++i) {
|
||||||
|
if (!isNaN(dataset.data[i]) && !meta.data[i].hidden) {
|
||||||
|
++visibleCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var distance = arc.hidden? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);
|
||||||
|
var startAngle = (-0.5 * Math.PI) + (circumference * visibleCount);
|
||||||
|
var endAngle = startAngle + (arc.hidden? 0 : circumference);
|
||||||
|
|
||||||
|
var resetModel = {
|
||||||
|
x: centerX,
|
||||||
|
y: centerY,
|
||||||
|
innerRadius: 0,
|
||||||
|
outerRadius: animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]),
|
||||||
|
startAngle: animationOpts.animateRotate ? Math.PI * -0.5 : startAngle,
|
||||||
|
endAngle: animationOpts.animateRotate ? Math.PI * -0.5 : endAngle,
|
||||||
|
|
||||||
|
backgroundColor: custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(dataset.backgroundColor, index, arcOpts.backgroundColor),
|
||||||
|
borderWidth: custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(dataset.borderWidth, index, arcOpts.borderWidth),
|
||||||
|
borderColor: custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(dataset.borderColor, index, arcOpts.borderColor),
|
||||||
|
|
||||||
|
label: getValueAtIndexOrDefault(labels, index, labels[index])
|
||||||
|
};
|
||||||
|
|
||||||
|
helpers.extend(arc, {
|
||||||
|
// Utility
|
||||||
|
_datasetIndex: _this.index,
|
||||||
|
_index: index,
|
||||||
|
_scale: scale,
|
||||||
|
|
||||||
|
// Desired view properties
|
||||||
|
_model: reset ? resetModel : {
|
||||||
|
x: centerX,
|
||||||
|
y: centerY,
|
||||||
|
innerRadius: 0,
|
||||||
|
outerRadius: distance,
|
||||||
|
startAngle: startAngle,
|
||||||
|
endAngle: endAngle,
|
||||||
|
|
||||||
|
backgroundColor: custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(dataset.backgroundColor, index, arcOpts.backgroundColor),
|
||||||
|
borderWidth: custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(dataset.borderWidth, index, arcOpts.borderWidth),
|
||||||
|
borderColor: custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(dataset.borderColor, index, arcOpts.borderColor),
|
||||||
|
|
||||||
|
label: getValueAtIndexOrDefault(labels, index, labels[index])
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
arc.pivot();
|
||||||
|
},
|
||||||
|
|
||||||
|
removeHoverStyle: function(arc) {
|
||||||
|
Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);
|
||||||
|
},
|
||||||
|
|
||||||
|
countVisibleElements: function() {
|
||||||
|
var dataset = this.getDataset();
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var count = 0;
|
||||||
|
|
||||||
|
helpers.each(meta.data, function(element, index) {
|
||||||
|
if (!isNaN(dataset.data[index]) && !element.hidden) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return count;
|
||||||
|
},
|
||||||
|
|
||||||
|
calculateCircumference: function(value) {
|
||||||
|
var count = this.getMeta().count;
|
||||||
|
if (count > 0 && !isNaN(value)) {
|
||||||
|
return (2 * Math.PI) / count;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
186
public/vendors/Chart.js/src/controllers/controller.radar.js
vendored
Normal file
186
public/vendors/Chart.js/src/controllers/controller.radar.js
vendored
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
var helpers = Chart.helpers;
|
||||||
|
|
||||||
|
Chart.defaults.radar = {
|
||||||
|
scale: {
|
||||||
|
type: "radialLinear"
|
||||||
|
},
|
||||||
|
elements: {
|
||||||
|
line: {
|
||||||
|
tension: 0 // no bezier in radar
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Chart.controllers.radar = Chart.DatasetController.extend({
|
||||||
|
|
||||||
|
datasetElementType: Chart.elements.Line,
|
||||||
|
|
||||||
|
dataElementType: Chart.elements.Point,
|
||||||
|
|
||||||
|
linkScales: helpers.noop,
|
||||||
|
|
||||||
|
addElementAndReset: function(index) {
|
||||||
|
Chart.DatasetController.prototype.addElementAndReset.call(this, index);
|
||||||
|
|
||||||
|
// Make sure bezier control points are updated
|
||||||
|
this.updateBezierControlPoints();
|
||||||
|
},
|
||||||
|
|
||||||
|
update: function update(reset) {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var line = meta.dataset;
|
||||||
|
var points = meta.data;
|
||||||
|
var custom = line.custom || {};
|
||||||
|
var dataset = this.getDataset();
|
||||||
|
var lineElementOptions = this.chart.options.elements.line;
|
||||||
|
var scale = this.chart.scale;
|
||||||
|
|
||||||
|
// Compatibility: If the properties are defined with only the old name, use those values
|
||||||
|
if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {
|
||||||
|
dataset.lineTension = dataset.tension;
|
||||||
|
}
|
||||||
|
|
||||||
|
helpers.extend(meta.dataset, {
|
||||||
|
// Utility
|
||||||
|
_datasetIndex: this.index,
|
||||||
|
// Data
|
||||||
|
_children: points,
|
||||||
|
_loop: true,
|
||||||
|
// Model
|
||||||
|
_model: {
|
||||||
|
// Appearance
|
||||||
|
tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, lineElementOptions.tension),
|
||||||
|
backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),
|
||||||
|
borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),
|
||||||
|
borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),
|
||||||
|
fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),
|
||||||
|
borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),
|
||||||
|
borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),
|
||||||
|
borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),
|
||||||
|
borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),
|
||||||
|
|
||||||
|
// Scale
|
||||||
|
scaleTop: scale.top,
|
||||||
|
scaleBottom: scale.bottom,
|
||||||
|
scaleZero: scale.getBasePosition()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
meta.dataset.pivot();
|
||||||
|
|
||||||
|
// Update Points
|
||||||
|
helpers.each(points, function(point, index) {
|
||||||
|
this.updateElement(point, index, reset);
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
|
||||||
|
// Update bezier control points
|
||||||
|
this.updateBezierControlPoints();
|
||||||
|
},
|
||||||
|
updateElement: function(point, index, reset) {
|
||||||
|
var custom = point.custom || {};
|
||||||
|
var dataset = this.getDataset();
|
||||||
|
var scale = this.chart.scale;
|
||||||
|
var pointElementOptions = this.chart.options.elements.point;
|
||||||
|
var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);
|
||||||
|
|
||||||
|
helpers.extend(point, {
|
||||||
|
// Utility
|
||||||
|
_datasetIndex: this.index,
|
||||||
|
_index: index,
|
||||||
|
_scale: scale,
|
||||||
|
|
||||||
|
// Desired view properties
|
||||||
|
_model: {
|
||||||
|
x: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales
|
||||||
|
y: reset ? scale.yCenter : pointPosition.y,
|
||||||
|
|
||||||
|
// Appearance
|
||||||
|
tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.tension, this.chart.options.elements.line.tension),
|
||||||
|
radius: custom.radius ? custom.radius : helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),
|
||||||
|
backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),
|
||||||
|
borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),
|
||||||
|
borderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth),
|
||||||
|
pointStyle: custom.pointStyle ? custom.pointStyle : helpers.getValueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle),
|
||||||
|
|
||||||
|
// Tooltip
|
||||||
|
hitRadius: custom.hitRadius ? custom.hitRadius : helpers.getValueAtIndexOrDefault(dataset.hitRadius, index, pointElementOptions.hitRadius)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
point._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y));
|
||||||
|
},
|
||||||
|
updateBezierControlPoints: function() {
|
||||||
|
var chartArea = this.chart.chartArea;
|
||||||
|
var meta = this.getMeta();
|
||||||
|
|
||||||
|
helpers.each(meta.data, function(point, index) {
|
||||||
|
var model = point._model;
|
||||||
|
var controlPoints = helpers.splineCurve(
|
||||||
|
helpers.previousItem(meta.data, index, true)._model,
|
||||||
|
model,
|
||||||
|
helpers.nextItem(meta.data, index, true)._model,
|
||||||
|
model.tension
|
||||||
|
);
|
||||||
|
|
||||||
|
// Prevent the bezier going outside of the bounds of the graph
|
||||||
|
model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left);
|
||||||
|
model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top);
|
||||||
|
|
||||||
|
model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left);
|
||||||
|
model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top);
|
||||||
|
|
||||||
|
// Now pivot the point for animation
|
||||||
|
point.pivot();
|
||||||
|
}, this);
|
||||||
|
},
|
||||||
|
|
||||||
|
draw: function(ease) {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var easingDecimal = ease || 1;
|
||||||
|
|
||||||
|
// Transition Point Locations
|
||||||
|
helpers.each(meta.data, function(point, index) {
|
||||||
|
point.transition(easingDecimal);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Transition and Draw the line
|
||||||
|
meta.dataset.transition(easingDecimal).draw();
|
||||||
|
|
||||||
|
// Draw the points
|
||||||
|
helpers.each(meta.data, function(point) {
|
||||||
|
point.draw();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
setHoverStyle: function(point) {
|
||||||
|
// Point
|
||||||
|
var dataset = this.chart.data.datasets[point._datasetIndex];
|
||||||
|
var custom = point.custom || {};
|
||||||
|
var index = point._index;
|
||||||
|
var model = point._model;
|
||||||
|
|
||||||
|
model.radius = custom.hoverRadius ? custom.hoverRadius : helpers.getValueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);
|
||||||
|
model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));
|
||||||
|
model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));
|
||||||
|
model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);
|
||||||
|
},
|
||||||
|
|
||||||
|
removeHoverStyle: function(point) {
|
||||||
|
var dataset = this.chart.data.datasets[point._datasetIndex];
|
||||||
|
var custom = point.custom || {};
|
||||||
|
var index = point._index;
|
||||||
|
var model = point._model;
|
||||||
|
var pointElementOptions = this.chart.options.elements.point;
|
||||||
|
|
||||||
|
model.radius = custom.radius ? custom.radius : helpers.getValueAtIndexOrDefault(dataset.radius, index, pointElementOptions.radius);
|
||||||
|
model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor);
|
||||||
|
model.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor);
|
||||||
|
model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
129
public/vendors/Chart.js/src/core/core.animation.js
vendored
Normal file
129
public/vendors/Chart.js/src/core/core.animation.js
vendored
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
/*global window: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
var helpers = Chart.helpers;
|
||||||
|
|
||||||
|
Chart.defaults.global.animation = {
|
||||||
|
duration: 1000,
|
||||||
|
easing: "easeOutQuart",
|
||||||
|
onProgress: helpers.noop,
|
||||||
|
onComplete: helpers.noop
|
||||||
|
};
|
||||||
|
|
||||||
|
Chart.Animation = Chart.Element.extend({
|
||||||
|
currentStep: null, // the current animation step
|
||||||
|
numSteps: 60, // default number of steps
|
||||||
|
easing: "", // the easing to use for this animation
|
||||||
|
render: null, // render function used by the animation service
|
||||||
|
|
||||||
|
onAnimationProgress: null, // user specified callback to fire on each step of the animation
|
||||||
|
onAnimationComplete: null // user specified callback to fire when the animation finishes
|
||||||
|
});
|
||||||
|
|
||||||
|
Chart.animationService = {
|
||||||
|
frameDuration: 17,
|
||||||
|
animations: [],
|
||||||
|
dropFrames: 0,
|
||||||
|
request: null,
|
||||||
|
addAnimation: function(chartInstance, animationObject, duration, lazy) {
|
||||||
|
|
||||||
|
if (!lazy) {
|
||||||
|
chartInstance.animating = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var index = 0; index < this.animations.length; ++index) {
|
||||||
|
if (this.animations[index].chartInstance === chartInstance) {
|
||||||
|
// replacing an in progress animation
|
||||||
|
this.animations[index].animationObject = animationObject;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.animations.push({
|
||||||
|
chartInstance: chartInstance,
|
||||||
|
animationObject: animationObject
|
||||||
|
});
|
||||||
|
|
||||||
|
// If there are no animations queued, manually kickstart a digest, for lack of a better word
|
||||||
|
if (this.animations.length === 1) {
|
||||||
|
this.requestAnimationFrame();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Cancel the animation for a given chart instance
|
||||||
|
cancelAnimation: function(chartInstance) {
|
||||||
|
var index = helpers.findIndex(this.animations, function(animationWrapper) {
|
||||||
|
return animationWrapper.chartInstance === chartInstance;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (index !== -1) {
|
||||||
|
this.animations.splice(index, 1);
|
||||||
|
chartInstance.animating = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
requestAnimationFrame: function() {
|
||||||
|
var me = this;
|
||||||
|
if (me.request === null) {
|
||||||
|
// Skip animation frame requests until the active one is executed.
|
||||||
|
// This can happen when processing mouse events, e.g. 'mousemove'
|
||||||
|
// and 'mouseout' events will trigger multiple renders.
|
||||||
|
me.request = helpers.requestAnimFrame.call(window, function() {
|
||||||
|
me.request = null;
|
||||||
|
me.startDigest();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
startDigest: function() {
|
||||||
|
|
||||||
|
var startTime = Date.now();
|
||||||
|
var framesToDrop = 0;
|
||||||
|
|
||||||
|
if (this.dropFrames > 1) {
|
||||||
|
framesToDrop = Math.floor(this.dropFrames);
|
||||||
|
this.dropFrames = this.dropFrames % 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
var i = 0;
|
||||||
|
while (i < this.animations.length) {
|
||||||
|
if (this.animations[i].animationObject.currentStep === null) {
|
||||||
|
this.animations[i].animationObject.currentStep = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.animations[i].animationObject.currentStep += 1 + framesToDrop;
|
||||||
|
|
||||||
|
if (this.animations[i].animationObject.currentStep > this.animations[i].animationObject.numSteps) {
|
||||||
|
this.animations[i].animationObject.currentStep = this.animations[i].animationObject.numSteps;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.animations[i].animationObject.render(this.animations[i].chartInstance, this.animations[i].animationObject);
|
||||||
|
if (this.animations[i].animationObject.onAnimationProgress && this.animations[i].animationObject.onAnimationProgress.call) {
|
||||||
|
this.animations[i].animationObject.onAnimationProgress.call(this.animations[i].chartInstance, this.animations[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.animations[i].animationObject.currentStep === this.animations[i].animationObject.numSteps) {
|
||||||
|
if (this.animations[i].animationObject.onAnimationComplete && this.animations[i].animationObject.onAnimationComplete.call) {
|
||||||
|
this.animations[i].animationObject.onAnimationComplete.call(this.animations[i].chartInstance, this.animations[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// executed the last frame. Remove the animation.
|
||||||
|
this.animations[i].chartInstance.animating = false;
|
||||||
|
|
||||||
|
this.animations.splice(i, 1);
|
||||||
|
} else {
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var endTime = Date.now();
|
||||||
|
var dropFrames = (endTime - startTime) / this.frameDuration;
|
||||||
|
|
||||||
|
this.dropFrames += dropFrames;
|
||||||
|
|
||||||
|
// Do we have more stuff to animate?
|
||||||
|
if (this.animations.length > 0) {
|
||||||
|
this.requestAnimationFrame();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
603
public/vendors/Chart.js/src/core/core.controller.js
vendored
Normal file
603
public/vendors/Chart.js/src/core/core.controller.js
vendored
Normal file
@ -0,0 +1,603 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
var helpers = Chart.helpers;
|
||||||
|
//Create a dictionary of chart types, to allow for extension of existing types
|
||||||
|
Chart.types = {};
|
||||||
|
|
||||||
|
//Store a reference to each instance - allowing us to globally resize chart instances on window resize.
|
||||||
|
//Destroy method on the chart will remove the instance of the chart from this reference.
|
||||||
|
Chart.instances = {};
|
||||||
|
|
||||||
|
// Controllers available for dataset visualization eg. bar, line, slice, etc.
|
||||||
|
Chart.controllers = {};
|
||||||
|
|
||||||
|
// The main controller of a chart
|
||||||
|
Chart.Controller = function(instance) {
|
||||||
|
|
||||||
|
this.chart = instance;
|
||||||
|
this.config = instance.config;
|
||||||
|
this.options = this.config.options = helpers.configMerge(Chart.defaults.global, Chart.defaults[this.config.type], this.config.options || {});
|
||||||
|
this.id = helpers.uid();
|
||||||
|
|
||||||
|
Object.defineProperty(this, 'data', {
|
||||||
|
get: function() {
|
||||||
|
return this.config.data;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//Add the chart instance to the global namespace
|
||||||
|
Chart.instances[this.id] = this;
|
||||||
|
|
||||||
|
if (this.options.responsive) {
|
||||||
|
// Silent resize before chart draws
|
||||||
|
this.resize(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.initialize();
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
helpers.extend(Chart.Controller.prototype, {
|
||||||
|
|
||||||
|
initialize: function initialize() {
|
||||||
|
// Before init plugin notification
|
||||||
|
Chart.pluginService.notifyPlugins('beforeInit', [this]);
|
||||||
|
|
||||||
|
this.bindEvents();
|
||||||
|
|
||||||
|
// Make sure controllers are built first so that each dataset is bound to an axis before the scales
|
||||||
|
// are built
|
||||||
|
this.ensureScalesHaveIDs();
|
||||||
|
this.buildOrUpdateControllers();
|
||||||
|
this.buildScales();
|
||||||
|
this.buildSurroundingItems();
|
||||||
|
this.updateLayout();
|
||||||
|
this.resetElements();
|
||||||
|
this.initToolTip();
|
||||||
|
this.update();
|
||||||
|
|
||||||
|
// After init plugin notification
|
||||||
|
Chart.pluginService.notifyPlugins('afterInit', [this]);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
clear: function clear() {
|
||||||
|
helpers.clear(this.chart);
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
stop: function stop() {
|
||||||
|
// Stops any current animation loop occuring
|
||||||
|
Chart.animationService.cancelAnimation(this);
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
resize: function resize(silent) {
|
||||||
|
var canvas = this.chart.canvas;
|
||||||
|
var newWidth = helpers.getMaximumWidth(this.chart.canvas);
|
||||||
|
var newHeight = (this.options.maintainAspectRatio && isNaN(this.chart.aspectRatio) === false && isFinite(this.chart.aspectRatio) && this.chart.aspectRatio !== 0) ? newWidth / this.chart.aspectRatio : helpers.getMaximumHeight(this.chart.canvas);
|
||||||
|
|
||||||
|
var sizeChanged = this.chart.width !== newWidth || this.chart.height !== newHeight;
|
||||||
|
|
||||||
|
if (!sizeChanged)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
canvas.width = this.chart.width = newWidth;
|
||||||
|
canvas.height = this.chart.height = newHeight;
|
||||||
|
|
||||||
|
helpers.retinaScale(this.chart);
|
||||||
|
|
||||||
|
if (!silent) {
|
||||||
|
this.stop();
|
||||||
|
this.update(this.options.responsiveAnimationDuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
ensureScalesHaveIDs: function ensureScalesHaveIDs() {
|
||||||
|
var options = this.options;
|
||||||
|
var scalesOptions = options.scales || {};
|
||||||
|
var scaleOptions = options.scale;
|
||||||
|
|
||||||
|
helpers.each(scalesOptions.xAxes, function(xAxisOptions, index) {
|
||||||
|
xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index);
|
||||||
|
});
|
||||||
|
|
||||||
|
helpers.each(scalesOptions.yAxes, function(yAxisOptions, index) {
|
||||||
|
yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (scaleOptions) {
|
||||||
|
scaleOptions.id = scaleOptions.id || 'scale';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds a map of scale ID to scale object for future lookup.
|
||||||
|
*/
|
||||||
|
buildScales: function buildScales() {
|
||||||
|
var me = this;
|
||||||
|
var options = me.options;
|
||||||
|
var scales = me.scales = {};
|
||||||
|
var items = [];
|
||||||
|
|
||||||
|
if (options.scales) {
|
||||||
|
items = items.concat(
|
||||||
|
(options.scales.xAxes || []).map(function(xAxisOptions) {
|
||||||
|
return { options: xAxisOptions, dtype: 'category' }; }),
|
||||||
|
(options.scales.yAxes || []).map(function(yAxisOptions) {
|
||||||
|
return { options: yAxisOptions, dtype: 'linear' }; }));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.scale) {
|
||||||
|
items.push({ options: options.scale, dtype: 'radialLinear', isDefault: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
helpers.each(items, function(item, index) {
|
||||||
|
var scaleOptions = item.options;
|
||||||
|
var scaleType = helpers.getValueOrDefault(scaleOptions.type, item.dtype);
|
||||||
|
var scaleClass = Chart.scaleService.getScaleConstructor(scaleType);
|
||||||
|
if (!scaleClass) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var scale = new scaleClass({
|
||||||
|
id: scaleOptions.id,
|
||||||
|
options: scaleOptions,
|
||||||
|
ctx: me.chart.ctx,
|
||||||
|
chart: me
|
||||||
|
});
|
||||||
|
|
||||||
|
scales[scale.id] = scale;
|
||||||
|
|
||||||
|
// TODO(SB): I think we should be able to remove this custom case (options.scale)
|
||||||
|
// and consider it as a regular scale part of the "scales"" map only! This would
|
||||||
|
// make the logic easier and remove some useless? custom code.
|
||||||
|
if (item.isDefault) {
|
||||||
|
me.scale = scale;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Chart.scaleService.addScalesToLayout(this);
|
||||||
|
},
|
||||||
|
|
||||||
|
buildSurroundingItems: function() {
|
||||||
|
if (this.options.title) {
|
||||||
|
this.titleBlock = new Chart.Title({
|
||||||
|
ctx: this.chart.ctx,
|
||||||
|
options: this.options.title,
|
||||||
|
chart: this
|
||||||
|
});
|
||||||
|
|
||||||
|
Chart.layoutService.addBox(this, this.titleBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.options.legend) {
|
||||||
|
this.legend = new Chart.Legend({
|
||||||
|
ctx: this.chart.ctx,
|
||||||
|
options: this.options.legend,
|
||||||
|
chart: this
|
||||||
|
});
|
||||||
|
|
||||||
|
Chart.layoutService.addBox(this, this.legend);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
updateLayout: function() {
|
||||||
|
Chart.layoutService.update(this, this.chart.width, this.chart.height);
|
||||||
|
},
|
||||||
|
|
||||||
|
buildOrUpdateControllers: function buildOrUpdateControllers() {
|
||||||
|
var types = [];
|
||||||
|
var newControllers = [];
|
||||||
|
|
||||||
|
helpers.each(this.data.datasets, function(dataset, datasetIndex) {
|
||||||
|
var meta = this.getDatasetMeta(datasetIndex);
|
||||||
|
if (!meta.type) {
|
||||||
|
meta.type = dataset.type || this.config.type;
|
||||||
|
}
|
||||||
|
|
||||||
|
types.push(meta.type);
|
||||||
|
|
||||||
|
if (meta.controller) {
|
||||||
|
meta.controller.updateIndex(datasetIndex);
|
||||||
|
} else {
|
||||||
|
meta.controller = new Chart.controllers[meta.type](this, datasetIndex);
|
||||||
|
newControllers.push(meta.controller);
|
||||||
|
}
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
if (types.length > 1) {
|
||||||
|
for (var i = 1; i < types.length; i++) {
|
||||||
|
if (types[i] !== types[i - 1]) {
|
||||||
|
this.isCombo = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return newControllers;
|
||||||
|
},
|
||||||
|
|
||||||
|
resetElements: function resetElements() {
|
||||||
|
helpers.each(this.data.datasets, function(dataset, datasetIndex) {
|
||||||
|
this.getDatasetMeta(datasetIndex).controller.reset();
|
||||||
|
}, this);
|
||||||
|
},
|
||||||
|
|
||||||
|
update: function update(animationDuration, lazy) {
|
||||||
|
Chart.pluginService.notifyPlugins('beforeUpdate', [this]);
|
||||||
|
|
||||||
|
// In case the entire data object changed
|
||||||
|
this.tooltip._data = this.data;
|
||||||
|
|
||||||
|
// Make sure dataset controllers are updated and new controllers are reset
|
||||||
|
var newControllers = this.buildOrUpdateControllers();
|
||||||
|
|
||||||
|
// Make sure all dataset controllers have correct meta data counts
|
||||||
|
helpers.each(this.data.datasets, function(dataset, datasetIndex) {
|
||||||
|
this.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
Chart.layoutService.update(this, this.chart.width, this.chart.height);
|
||||||
|
|
||||||
|
// Apply changes to the dataets that require the scales to have been calculated i.e BorderColor chages
|
||||||
|
Chart.pluginService.notifyPlugins('afterScaleUpdate', [this]);
|
||||||
|
|
||||||
|
// Can only reset the new controllers after the scales have been updated
|
||||||
|
helpers.each(newControllers, function(controller) {
|
||||||
|
controller.reset();
|
||||||
|
});
|
||||||
|
|
||||||
|
// This will loop through any data and do the appropriate element update for the type
|
||||||
|
helpers.each(this.data.datasets, function(dataset, datasetIndex) {
|
||||||
|
this.getDatasetMeta(datasetIndex).controller.update();
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
// Do this before render so that any plugins that need final scale updates can use it
|
||||||
|
Chart.pluginService.notifyPlugins('afterUpdate', [this]);
|
||||||
|
|
||||||
|
this.render(animationDuration, lazy);
|
||||||
|
},
|
||||||
|
|
||||||
|
render: function render(duration, lazy) {
|
||||||
|
Chart.pluginService.notifyPlugins('beforeRender', [this]);
|
||||||
|
|
||||||
|
var animationOptions = this.options.animation;
|
||||||
|
if (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) {
|
||||||
|
var animation = new Chart.Animation();
|
||||||
|
animation.numSteps = (duration || animationOptions.duration) / 16.66; //60 fps
|
||||||
|
animation.easing = animationOptions.easing;
|
||||||
|
|
||||||
|
// render function
|
||||||
|
animation.render = function(chartInstance, animationObject) {
|
||||||
|
var easingFunction = helpers.easingEffects[animationObject.easing];
|
||||||
|
var stepDecimal = animationObject.currentStep / animationObject.numSteps;
|
||||||
|
var easeDecimal = easingFunction(stepDecimal);
|
||||||
|
|
||||||
|
chartInstance.draw(easeDecimal, stepDecimal, animationObject.currentStep);
|
||||||
|
};
|
||||||
|
|
||||||
|
// user events
|
||||||
|
animation.onAnimationProgress = animationOptions.onProgress;
|
||||||
|
animation.onAnimationComplete = animationOptions.onComplete;
|
||||||
|
|
||||||
|
Chart.animationService.addAnimation(this, animation, duration, lazy);
|
||||||
|
} else {
|
||||||
|
this.draw();
|
||||||
|
if (animationOptions && animationOptions.onComplete && animationOptions.onComplete.call) {
|
||||||
|
animationOptions.onComplete.call(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
draw: function(ease) {
|
||||||
|
var easingDecimal = ease || 1;
|
||||||
|
this.clear();
|
||||||
|
|
||||||
|
Chart.pluginService.notifyPlugins('beforeDraw', [this, easingDecimal]);
|
||||||
|
|
||||||
|
// Draw all the scales
|
||||||
|
helpers.each(this.boxes, function(box) {
|
||||||
|
box.draw(this.chartArea);
|
||||||
|
}, this);
|
||||||
|
if (this.scale) {
|
||||||
|
this.scale.draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clip out the chart area so that anything outside does not draw. This is necessary for zoom and pan to function
|
||||||
|
var context = this.chart.ctx;
|
||||||
|
context.save();
|
||||||
|
context.beginPath();
|
||||||
|
context.rect(this.chartArea.left, this.chartArea.top, this.chartArea.right - this.chartArea.left, this.chartArea.bottom - this.chartArea.top);
|
||||||
|
context.clip();
|
||||||
|
|
||||||
|
// Draw each dataset via its respective controller (reversed to support proper line stacking)
|
||||||
|
helpers.each(this.data.datasets, function(dataset, datasetIndex) {
|
||||||
|
if (this.isDatasetVisible(datasetIndex)) {
|
||||||
|
this.getDatasetMeta(datasetIndex).controller.draw(ease);
|
||||||
|
}
|
||||||
|
}, this, true);
|
||||||
|
|
||||||
|
// Restore from the clipping operation
|
||||||
|
context.restore();
|
||||||
|
|
||||||
|
// Finally draw the tooltip
|
||||||
|
this.tooltip.transition(easingDecimal).draw();
|
||||||
|
|
||||||
|
Chart.pluginService.notifyPlugins('afterDraw', [this, easingDecimal]);
|
||||||
|
},
|
||||||
|
|
||||||
|
// Get the single element that was clicked on
|
||||||
|
// @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw
|
||||||
|
getElementAtEvent: function(e) {
|
||||||
|
var eventPosition = helpers.getRelativePosition(e, this.chart);
|
||||||
|
var elementsArray = [];
|
||||||
|
|
||||||
|
helpers.each(this.data.datasets, function(dataset, datasetIndex) {
|
||||||
|
if (this.isDatasetVisible(datasetIndex)) {
|
||||||
|
var meta = this.getDatasetMeta(datasetIndex);
|
||||||
|
helpers.each(meta.data, function(element, index) {
|
||||||
|
if (element.inRange(eventPosition.x, eventPosition.y)) {
|
||||||
|
elementsArray.push(element);
|
||||||
|
return elementsArray;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
return elementsArray;
|
||||||
|
},
|
||||||
|
|
||||||
|
getElementsAtEvent: function(e) {
|
||||||
|
var eventPosition = helpers.getRelativePosition(e, this.chart);
|
||||||
|
var elementsArray = [];
|
||||||
|
|
||||||
|
var found = (function() {
|
||||||
|
if (this.data.datasets) {
|
||||||
|
for (var i = 0; i < this.data.datasets.length; i++) {
|
||||||
|
var meta = this.getDatasetMeta(i);
|
||||||
|
if (this.isDatasetVisible(i)) {
|
||||||
|
for (var j = 0; j < meta.data.length; j++) {
|
||||||
|
if (meta.data[j].inRange(eventPosition.x, eventPosition.y)) {
|
||||||
|
return meta.data[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).call(this);
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
return elementsArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
helpers.each(this.data.datasets, function(dataset, datasetIndex) {
|
||||||
|
if (this.isDatasetVisible(datasetIndex)) {
|
||||||
|
var meta = this.getDatasetMeta(datasetIndex);
|
||||||
|
elementsArray.push(meta.data[found._index]);
|
||||||
|
}
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
return elementsArray;
|
||||||
|
},
|
||||||
|
|
||||||
|
getElementsAtEventForMode: function(e, mode) {
|
||||||
|
var me = this;
|
||||||
|
switch (mode) {
|
||||||
|
case 'single':
|
||||||
|
return me.getElementAtEvent(e);
|
||||||
|
case 'label':
|
||||||
|
return me.getElementsAtEvent(e);
|
||||||
|
case 'dataset':
|
||||||
|
return me.getDatasetAtEvent(e);
|
||||||
|
default:
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
getDatasetAtEvent: function(e) {
|
||||||
|
var elementsArray = this.getElementAtEvent(e);
|
||||||
|
|
||||||
|
if (elementsArray.length > 0) {
|
||||||
|
elementsArray = this.getDatasetMeta(elementsArray[0]._datasetIndex).data;
|
||||||
|
}
|
||||||
|
|
||||||
|
return elementsArray;
|
||||||
|
},
|
||||||
|
|
||||||
|
getDatasetMeta: function(datasetIndex) {
|
||||||
|
var dataset = this.data.datasets[datasetIndex];
|
||||||
|
if (!dataset._meta) {
|
||||||
|
dataset._meta = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
var meta = dataset._meta[this.id];
|
||||||
|
if (!meta) {
|
||||||
|
meta = dataset._meta[this.id] = {
|
||||||
|
type: null,
|
||||||
|
data: [],
|
||||||
|
dataset: null,
|
||||||
|
controller: null,
|
||||||
|
hidden: null, // See isDatasetVisible() comment
|
||||||
|
xAxisID: null,
|
||||||
|
yAxisID: null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return meta;
|
||||||
|
},
|
||||||
|
|
||||||
|
getVisibleDatasetCount: function() {
|
||||||
|
var count = 0;
|
||||||
|
for (var i = 0, ilen = this.data.datasets.length; i<ilen; ++i) {
|
||||||
|
if (this.isDatasetVisible(i)) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
},
|
||||||
|
|
||||||
|
isDatasetVisible: function(datasetIndex) {
|
||||||
|
var meta = this.getDatasetMeta(datasetIndex);
|
||||||
|
|
||||||
|
// meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,
|
||||||
|
// the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.
|
||||||
|
return typeof meta.hidden === 'boolean'? !meta.hidden : !this.data.datasets[datasetIndex].hidden;
|
||||||
|
},
|
||||||
|
|
||||||
|
generateLegend: function generateLegend() {
|
||||||
|
return this.options.legendCallback(this);
|
||||||
|
},
|
||||||
|
|
||||||
|
destroy: function destroy() {
|
||||||
|
this.clear();
|
||||||
|
helpers.unbindEvents(this, this.events);
|
||||||
|
helpers.removeResizeListener(this.chart.canvas.parentNode);
|
||||||
|
|
||||||
|
// Reset canvas height/width attributes
|
||||||
|
var canvas = this.chart.canvas;
|
||||||
|
canvas.width = this.chart.width;
|
||||||
|
canvas.height = this.chart.height;
|
||||||
|
|
||||||
|
// if we scaled the canvas in response to a devicePixelRatio !== 1, we need to undo that transform here
|
||||||
|
if (this.chart.originalDevicePixelRatio !== undefined) {
|
||||||
|
this.chart.ctx.scale(1 / this.chart.originalDevicePixelRatio, 1 / this.chart.originalDevicePixelRatio);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset to the old style since it may have been changed by the device pixel ratio changes
|
||||||
|
canvas.style.width = this.chart.originalCanvasStyleWidth;
|
||||||
|
canvas.style.height = this.chart.originalCanvasStyleHeight;
|
||||||
|
|
||||||
|
Chart.pluginService.notifyPlugins('destroy', [this]);
|
||||||
|
|
||||||
|
delete Chart.instances[this.id];
|
||||||
|
},
|
||||||
|
|
||||||
|
toBase64Image: function toBase64Image() {
|
||||||
|
return this.chart.canvas.toDataURL.apply(this.chart.canvas, arguments);
|
||||||
|
},
|
||||||
|
|
||||||
|
initToolTip: function initToolTip() {
|
||||||
|
this.tooltip = new Chart.Tooltip({
|
||||||
|
_chart: this.chart,
|
||||||
|
_chartInstance: this,
|
||||||
|
_data: this.data,
|
||||||
|
_options: this.options
|
||||||
|
}, this);
|
||||||
|
},
|
||||||
|
|
||||||
|
bindEvents: function bindEvents() {
|
||||||
|
helpers.bindEvents(this, this.options.events, function(evt) {
|
||||||
|
this.eventHandler(evt);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
updateHoverStyle: function(elements, mode, enabled) {
|
||||||
|
var method = enabled? 'setHoverStyle' : 'removeHoverStyle';
|
||||||
|
var element, i, ilen;
|
||||||
|
|
||||||
|
switch (mode) {
|
||||||
|
case 'single':
|
||||||
|
elements = [ elements[0] ];
|
||||||
|
break;
|
||||||
|
case 'label':
|
||||||
|
case 'dataset':
|
||||||
|
// elements = elements;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// unsupported mode
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0, ilen=elements.length; i<ilen; ++i) {
|
||||||
|
element = elements[i];
|
||||||
|
if (element) {
|
||||||
|
this.getDatasetMeta(element._datasetIndex).controller[method](element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
eventHandler: function eventHandler(e) {
|
||||||
|
var me = this;
|
||||||
|
var tooltip = me.tooltip;
|
||||||
|
var options = me.options || {};
|
||||||
|
var hoverOptions = options.hover;
|
||||||
|
var tooltipsOptions = options.tooltips;
|
||||||
|
|
||||||
|
me.lastActive = me.lastActive || [];
|
||||||
|
me.lastTooltipActive = me.lastTooltipActive || [];
|
||||||
|
|
||||||
|
// Find Active Elements for hover and tooltips
|
||||||
|
if (e.type === 'mouseout') {
|
||||||
|
me.active = [];
|
||||||
|
me.tooltipActive = [];
|
||||||
|
} else {
|
||||||
|
me.active = me.getElementsAtEventForMode(e, hoverOptions.mode);
|
||||||
|
me.tooltipActive = me.getElementsAtEventForMode(e, tooltipsOptions.mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
// On Hover hook
|
||||||
|
if (hoverOptions.onHover) {
|
||||||
|
hoverOptions.onHover.call(me, me.active);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.type === 'mouseup' || e.type === 'click') {
|
||||||
|
if (options.onClick) {
|
||||||
|
options.onClick.call(me, e, me.active);
|
||||||
|
}
|
||||||
|
if (me.legend && me.legend.handleEvent) {
|
||||||
|
me.legend.handleEvent(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove styling for last active (even if it may still be active)
|
||||||
|
if (me.lastActive.length) {
|
||||||
|
me.updateHoverStyle(me.lastActive, hoverOptions.mode, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Built in hover styling
|
||||||
|
if (me.active.length && hoverOptions.mode) {
|
||||||
|
me.updateHoverStyle(me.active, hoverOptions.mode, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Built in Tooltips
|
||||||
|
if (tooltipsOptions.enabled || tooltipsOptions.custom) {
|
||||||
|
tooltip.initialize();
|
||||||
|
tooltip._active = me.tooltipActive;
|
||||||
|
tooltip.update(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hover animations
|
||||||
|
tooltip.pivot();
|
||||||
|
|
||||||
|
if (!me.animating) {
|
||||||
|
// If entering, leaving, or changing elements, animate the change via pivot
|
||||||
|
if (!helpers.arrayEquals(me.active, me.lastActive) ||
|
||||||
|
!helpers.arrayEquals(me.tooltipActive, me.lastTooltipActive)) {
|
||||||
|
|
||||||
|
me.stop();
|
||||||
|
|
||||||
|
if (tooltipsOptions.enabled || tooltipsOptions.custom) {
|
||||||
|
tooltip.update(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// We only need to render at this point. Updating will cause scales to be
|
||||||
|
// recomputed generating flicker & using more memory than necessary.
|
||||||
|
me.render(hoverOptions.animationDuration, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remember Last Actives
|
||||||
|
me.lastActive = me.active;
|
||||||
|
me.lastTooltipActive = me.tooltipActive;
|
||||||
|
return me;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
163
public/vendors/Chart.js/src/core/core.datasetController.js
vendored
Normal file
163
public/vendors/Chart.js/src/core/core.datasetController.js
vendored
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
var helpers = Chart.helpers;
|
||||||
|
var noop = helpers.noop;
|
||||||
|
|
||||||
|
// Base class for all dataset controllers (line, bar, etc)
|
||||||
|
Chart.DatasetController = function(chart, datasetIndex) {
|
||||||
|
this.initialize.call(this, chart, datasetIndex);
|
||||||
|
};
|
||||||
|
|
||||||
|
helpers.extend(Chart.DatasetController.prototype, {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Element type used to generate a meta dataset (e.g. Chart.element.Line).
|
||||||
|
* @type {Chart.core.element}
|
||||||
|
*/
|
||||||
|
datasetElementType: null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Element type used to generate a meta data (e.g. Chart.element.Point).
|
||||||
|
* @type {Chart.core.element}
|
||||||
|
*/
|
||||||
|
dataElementType: null,
|
||||||
|
|
||||||
|
initialize: function(chart, datasetIndex) {
|
||||||
|
this.chart = chart;
|
||||||
|
this.index = datasetIndex;
|
||||||
|
this.linkScales();
|
||||||
|
this.addElements();
|
||||||
|
},
|
||||||
|
|
||||||
|
updateIndex: function(datasetIndex) {
|
||||||
|
this.index = datasetIndex;
|
||||||
|
},
|
||||||
|
|
||||||
|
linkScales: function() {
|
||||||
|
var meta = this.getMeta();
|
||||||
|
var dataset = this.getDataset();
|
||||||
|
|
||||||
|
if (meta.xAxisID === null) {
|
||||||
|
meta.xAxisID = dataset.xAxisID || this.chart.options.scales.xAxes[0].id;
|
||||||
|
}
|
||||||
|
if (meta.yAxisID === null) {
|
||||||
|
meta.yAxisID = dataset.yAxisID || this.chart.options.scales.yAxes[0].id;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
getDataset: function() {
|
||||||
|
return this.chart.data.datasets[this.index];
|
||||||
|
},
|
||||||
|
|
||||||
|
getMeta: function() {
|
||||||
|
return this.chart.getDatasetMeta(this.index);
|
||||||
|
},
|
||||||
|
|
||||||
|
getScaleForId: function(scaleID) {
|
||||||
|
return this.chart.scales[scaleID];
|
||||||
|
},
|
||||||
|
|
||||||
|
reset: function() {
|
||||||
|
this.update(true);
|
||||||
|
},
|
||||||
|
|
||||||
|
createMetaDataset: function() {
|
||||||
|
var me = this;
|
||||||
|
var type = me.datasetElementType;
|
||||||
|
return type && new type({
|
||||||
|
_chart: me.chart.chart,
|
||||||
|
_datasetIndex: me.index
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
createMetaData: function(index) {
|
||||||
|
var me = this;
|
||||||
|
var type = me.dataElementType;
|
||||||
|
return type && new type({
|
||||||
|
_chart: me.chart.chart,
|
||||||
|
_datasetIndex: me.index,
|
||||||
|
_index: index
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
addElements: function() {
|
||||||
|
var me = this;
|
||||||
|
var meta = me.getMeta();
|
||||||
|
var data = me.getDataset().data || [];
|
||||||
|
var metaData = meta.data;
|
||||||
|
var i, ilen;
|
||||||
|
|
||||||
|
for (i=0, ilen=data.length; i<ilen; ++i) {
|
||||||
|
metaData[i] = metaData[i] || me.createMetaData(meta, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
meta.dataset = meta.dataset || me.createMetaDataset();
|
||||||
|
},
|
||||||
|
|
||||||
|
addElementAndReset: function(index) {
|
||||||
|
var me = this;
|
||||||
|
var element = me.createMetaData(index);
|
||||||
|
me.getMeta().data.splice(index, 0, element);
|
||||||
|
me.updateElement(element, index, true);
|
||||||
|
},
|
||||||
|
|
||||||
|
buildOrUpdateElements: function buildOrUpdateElements() {
|
||||||
|
// Handle the number of data points changing
|
||||||
|
var meta = this.getMeta(),
|
||||||
|
md = meta.data,
|
||||||
|
numData = this.getDataset().data.length,
|
||||||
|
numMetaData = md.length;
|
||||||
|
|
||||||
|
// Make sure that we handle number of datapoints changing
|
||||||
|
if (numData < numMetaData) {
|
||||||
|
// Remove excess bars for data points that have been removed
|
||||||
|
md.splice(numData, numMetaData - numData);
|
||||||
|
} else if (numData > numMetaData) {
|
||||||
|
// Add new elements
|
||||||
|
for (var index = numMetaData; index < numData; ++index) {
|
||||||
|
this.addElementAndReset(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
update: noop,
|
||||||
|
|
||||||
|
draw: function(ease) {
|
||||||
|
var easingDecimal = ease || 1;
|
||||||
|
helpers.each(this.getMeta().data, function(element, index) {
|
||||||
|
element.transition(easingDecimal).draw();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
removeHoverStyle: function(element, elementOpts) {
|
||||||
|
var dataset = this.chart.data.datasets[element._datasetIndex],
|
||||||
|
index = element._index,
|
||||||
|
custom = element.custom || {},
|
||||||
|
valueOrDefault = helpers.getValueAtIndexOrDefault,
|
||||||
|
color = helpers.color,
|
||||||
|
model = element._model;
|
||||||
|
|
||||||
|
model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);
|
||||||
|
model.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);
|
||||||
|
model.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);
|
||||||
|
},
|
||||||
|
|
||||||
|
setHoverStyle: function(element) {
|
||||||
|
var dataset = this.chart.data.datasets[element._datasetIndex],
|
||||||
|
index = element._index,
|
||||||
|
custom = element.custom || {},
|
||||||
|
valueOrDefault = helpers.getValueAtIndexOrDefault,
|
||||||
|
color = helpers.color,
|
||||||
|
getHoverColor = helpers.getHoverColor,
|
||||||
|
model = element._model;
|
||||||
|
|
||||||
|
model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor));
|
||||||
|
model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor));
|
||||||
|
model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Chart.DatasetController.extend = helpers.inherits;
|
||||||
|
};
|
95
public/vendors/Chart.js/src/core/core.element.js
vendored
Normal file
95
public/vendors/Chart.js/src/core/core.element.js
vendored
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
var helpers = Chart.helpers;
|
||||||
|
|
||||||
|
Chart.elements = {};
|
||||||
|
|
||||||
|
Chart.Element = function(configuration) {
|
||||||
|
helpers.extend(this, configuration);
|
||||||
|
this.initialize.apply(this, arguments);
|
||||||
|
};
|
||||||
|
helpers.extend(Chart.Element.prototype, {
|
||||||
|
initialize: function() {
|
||||||
|
this.hidden = false;
|
||||||
|
},
|
||||||
|
pivot: function() {
|
||||||
|
if (!this._view) {
|
||||||
|
this._view = helpers.clone(this._model);
|
||||||
|
}
|
||||||
|
this._start = helpers.clone(this._view);
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
transition: function(ease) {
|
||||||
|
if (!this._view) {
|
||||||
|
this._view = helpers.clone(this._model);
|
||||||
|
}
|
||||||
|
|
||||||
|
// No animation -> No Transition
|
||||||
|
if (ease === 1) {
|
||||||
|
this._view = this._model;
|
||||||
|
this._start = null;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this._start) {
|
||||||
|
this.pivot();
|
||||||
|
}
|
||||||
|
|
||||||
|
helpers.each(this._model, function(value, key) {
|
||||||
|
|
||||||
|
if (key[0] === '_') {
|
||||||
|
// Only non-underscored properties
|
||||||
|
}
|
||||||
|
|
||||||
|
// Init if doesn't exist
|
||||||
|
else if (!this._view.hasOwnProperty(key)) {
|
||||||
|
if (typeof value === 'number' && !isNaN(this._view[key])) {
|
||||||
|
this._view[key] = value * ease;
|
||||||
|
} else {
|
||||||
|
this._view[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// No unnecessary computations
|
||||||
|
else if (value === this._view[key]) {
|
||||||
|
// It's the same! Woohoo!
|
||||||
|
}
|
||||||
|
|
||||||
|
// Color transitions if possible
|
||||||
|
else if (typeof value === 'string') {
|
||||||
|
try {
|
||||||
|
var color = helpers.color(this._model[key]).mix(helpers.color(this._start[key]), ease);
|
||||||
|
this._view[key] = color.rgbString();
|
||||||
|
} catch (err) {
|
||||||
|
this._view[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Number transitions
|
||||||
|
else if (typeof value === 'number') {
|
||||||
|
var startVal = this._start[key] !== undefined && isNaN(this._start[key]) === false ? this._start[key] : 0;
|
||||||
|
this._view[key] = ((this._model[key] - startVal) * ease) + startVal;
|
||||||
|
}
|
||||||
|
// Everything else
|
||||||
|
else {
|
||||||
|
this._view[key] = value;
|
||||||
|
}
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
tooltipPosition: function() {
|
||||||
|
return {
|
||||||
|
x: this._model.x,
|
||||||
|
y: this._model.y
|
||||||
|
};
|
||||||
|
},
|
||||||
|
hasValue: function() {
|
||||||
|
return helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Chart.Element.extend = helpers.inherits;
|
||||||
|
|
||||||
|
};
|
978
public/vendors/Chart.js/src/core/core.helpers.js
vendored
Normal file
978
public/vendors/Chart.js/src/core/core.helpers.js
vendored
Normal file
@ -0,0 +1,978 @@
|
|||||||
|
/*global window: false */
|
||||||
|
/*global document: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var color = require('chartjs-color');
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
//Global Chart helpers object for utility methods and classes
|
||||||
|
var helpers = Chart.helpers = {};
|
||||||
|
|
||||||
|
//-- Basic js utility methods
|
||||||
|
helpers.each = function(loopable, callback, self, reverse) {
|
||||||
|
// Check to see if null or undefined firstly.
|
||||||
|
var i, len;
|
||||||
|
if (helpers.isArray(loopable)) {
|
||||||
|
len = loopable.length;
|
||||||
|
if (reverse) {
|
||||||
|
for (i = len - 1; i >= 0; i--) {
|
||||||
|
callback.call(self, loopable[i], i);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
callback.call(self, loopable[i], i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (typeof loopable === 'object') {
|
||||||
|
var keys = Object.keys(loopable);
|
||||||
|
len = keys.length;
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
callback.call(self, loopable[keys[i]], keys[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
helpers.clone = function(obj) {
|
||||||
|
var objClone = {};
|
||||||
|
helpers.each(obj, function(value, key) {
|
||||||
|
if (helpers.isArray(value)) {
|
||||||
|
objClone[key] = value.slice(0);
|
||||||
|
} else if (typeof value === 'object' && value !== null) {
|
||||||
|
objClone[key] = helpers.clone(value);
|
||||||
|
} else {
|
||||||
|
objClone[key] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return objClone;
|
||||||
|
};
|
||||||
|
helpers.extend = function(base) {
|
||||||
|
var len = arguments.length;
|
||||||
|
var additionalArgs = [];
|
||||||
|
for (var i = 1; i < len; i++) {
|
||||||
|
additionalArgs.push(arguments[i]);
|
||||||
|
}
|
||||||
|
helpers.each(additionalArgs, function(extensionObject) {
|
||||||
|
helpers.each(extensionObject, function(value, key) {
|
||||||
|
base[key] = value;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return base;
|
||||||
|
};
|
||||||
|
// Need a special merge function to chart configs since they are now grouped
|
||||||
|
helpers.configMerge = function(_base) {
|
||||||
|
var base = helpers.clone(_base);
|
||||||
|
helpers.each(Array.prototype.slice.call(arguments, 1), function(extension) {
|
||||||
|
helpers.each(extension, function(value, key) {
|
||||||
|
if (key === 'scales') {
|
||||||
|
// Scale config merging is complex. Add out own function here for that
|
||||||
|
base[key] = helpers.scaleMerge(base.hasOwnProperty(key) ? base[key] : {}, value);
|
||||||
|
|
||||||
|
} else if (key === 'scale') {
|
||||||
|
// Used in polar area & radar charts since there is only one scale
|
||||||
|
base[key] = helpers.configMerge(base.hasOwnProperty(key) ? base[key] : {}, Chart.scaleService.getScaleDefaults(value.type), value);
|
||||||
|
} else if (base.hasOwnProperty(key) && helpers.isArray(base[key]) && helpers.isArray(value)) {
|
||||||
|
// In this case we have an array of objects replacing another array. Rather than doing a strict replace,
|
||||||
|
// merge. This allows easy scale option merging
|
||||||
|
var baseArray = base[key];
|
||||||
|
|
||||||
|
helpers.each(value, function(valueObj, index) {
|
||||||
|
|
||||||
|
if (index < baseArray.length) {
|
||||||
|
if (typeof baseArray[index] === 'object' && baseArray[index] !== null && typeof valueObj === 'object' && valueObj !== null) {
|
||||||
|
// Two objects are coming together. Do a merge of them.
|
||||||
|
baseArray[index] = helpers.configMerge(baseArray[index], valueObj);
|
||||||
|
} else {
|
||||||
|
// Just overwrite in this case since there is nothing to merge
|
||||||
|
baseArray[index] = valueObj;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
baseArray.push(valueObj); // nothing to merge
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
} else if (base.hasOwnProperty(key) && typeof base[key] === "object" && base[key] !== null && typeof value === "object") {
|
||||||
|
// If we are overwriting an object with an object, do a merge of the properties.
|
||||||
|
base[key] = helpers.configMerge(base[key], value);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// can just overwrite the value in this case
|
||||||
|
base[key] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return base;
|
||||||
|
};
|
||||||
|
helpers.extendDeep = function(_base) {
|
||||||
|
return _extendDeep.apply(this, arguments);
|
||||||
|
|
||||||
|
function _extendDeep(dst) {
|
||||||
|
helpers.each(arguments, function(obj) {
|
||||||
|
if (obj !== dst) {
|
||||||
|
helpers.each(obj, function(value, key) {
|
||||||
|
if (dst[key] && dst[key].constructor && dst[key].constructor === Object) {
|
||||||
|
_extendDeep(dst[key], value);
|
||||||
|
} else {
|
||||||
|
dst[key] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
helpers.scaleMerge = function(_base, extension) {
|
||||||
|
var base = helpers.clone(_base);
|
||||||
|
|
||||||
|
helpers.each(extension, function(value, key) {
|
||||||
|
if (key === 'xAxes' || key === 'yAxes') {
|
||||||
|
// These properties are arrays of items
|
||||||
|
if (base.hasOwnProperty(key)) {
|
||||||
|
helpers.each(value, function(valueObj, index) {
|
||||||
|
var axisType = helpers.getValueOrDefault(valueObj.type, key === 'xAxes' ? 'category' : 'linear');
|
||||||
|
var axisDefaults = Chart.scaleService.getScaleDefaults(axisType);
|
||||||
|
if (index >= base[key].length || !base[key][index].type) {
|
||||||
|
base[key].push(helpers.configMerge(axisDefaults, valueObj));
|
||||||
|
} else if (valueObj.type && valueObj.type !== base[key][index].type) {
|
||||||
|
// Type changed. Bring in the new defaults before we bring in valueObj so that valueObj can override the correct scale defaults
|
||||||
|
base[key][index] = helpers.configMerge(base[key][index], axisDefaults, valueObj);
|
||||||
|
} else {
|
||||||
|
// Type is the same
|
||||||
|
base[key][index] = helpers.configMerge(base[key][index], valueObj);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
base[key] = [];
|
||||||
|
helpers.each(value, function(valueObj) {
|
||||||
|
var axisType = helpers.getValueOrDefault(valueObj.type, key === 'xAxes' ? 'category' : 'linear');
|
||||||
|
base[key].push(helpers.configMerge(Chart.scaleService.getScaleDefaults(axisType), valueObj));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if (base.hasOwnProperty(key) && typeof base[key] === "object" && base[key] !== null && typeof value === "object") {
|
||||||
|
// If we are overwriting an object with an object, do a merge of the properties.
|
||||||
|
base[key] = helpers.configMerge(base[key], value);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// can just overwrite the value in this case
|
||||||
|
base[key] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return base;
|
||||||
|
};
|
||||||
|
helpers.getValueAtIndexOrDefault = function(value, index, defaultValue) {
|
||||||
|
if (value === undefined || value === null) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (helpers.isArray(value)) {
|
||||||
|
return index < value.length ? value[index] : defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
helpers.getValueOrDefault = function(value, defaultValue) {
|
||||||
|
return value === undefined ? defaultValue : value;
|
||||||
|
};
|
||||||
|
helpers.indexOf = function(arrayToSearch, item) {
|
||||||
|
if (Array.prototype.indexOf) {
|
||||||
|
return arrayToSearch.indexOf(item);
|
||||||
|
} else {
|
||||||
|
for (var i = 0; i < arrayToSearch.length; i++) {
|
||||||
|
if (arrayToSearch[i] === item)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
helpers.where = function(collection, filterCallback) {
|
||||||
|
if (helpers.isArray(collection) && Array.prototype.filter) {
|
||||||
|
return collection.filter(filterCallback);
|
||||||
|
} else {
|
||||||
|
var filtered = [];
|
||||||
|
|
||||||
|
helpers.each(collection, function(item) {
|
||||||
|
if (filterCallback(item)) {
|
||||||
|
filtered.push(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return filtered;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
helpers.findIndex = function(arrayToSearch, callback, thisArg) {
|
||||||
|
var index = -1;
|
||||||
|
if (Array.prototype.findIndex) {
|
||||||
|
index = arrayToSearch.findIndex(callback, thisArg);
|
||||||
|
} else {
|
||||||
|
for (var i = 0; i < arrayToSearch.length; ++i) {
|
||||||
|
thisArg = thisArg !== undefined ? thisArg : arrayToSearch;
|
||||||
|
|
||||||
|
if (callback.call(thisArg, arrayToSearch[i], i, arrayToSearch)) {
|
||||||
|
index = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return index;
|
||||||
|
};
|
||||||
|
helpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {
|
||||||
|
// Default to start of the array
|
||||||
|
if (startIndex === undefined || startIndex === null) {
|
||||||
|
startIndex = -1;
|
||||||
|
}
|
||||||
|
for (var i = startIndex + 1; i < arrayToSearch.length; i++) {
|
||||||
|
var currentItem = arrayToSearch[i];
|
||||||
|
if (filterCallback(currentItem)) {
|
||||||
|
return currentItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
helpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {
|
||||||
|
// Default to end of the array
|
||||||
|
if (startIndex === undefined || startIndex === null) {
|
||||||
|
startIndex = arrayToSearch.length;
|
||||||
|
}
|
||||||
|
for (var i = startIndex - 1; i >= 0; i--) {
|
||||||
|
var currentItem = arrayToSearch[i];
|
||||||
|
if (filterCallback(currentItem)) {
|
||||||
|
return currentItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
helpers.inherits = function(extensions) {
|
||||||
|
//Basic javascript inheritance based on the model created in Backbone.js
|
||||||
|
var parent = this;
|
||||||
|
var ChartElement = (extensions && extensions.hasOwnProperty("constructor")) ? extensions.constructor : function() {
|
||||||
|
return parent.apply(this, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
var Surrogate = function() {
|
||||||
|
this.constructor = ChartElement;
|
||||||
|
};
|
||||||
|
Surrogate.prototype = parent.prototype;
|
||||||
|
ChartElement.prototype = new Surrogate();
|
||||||
|
|
||||||
|
ChartElement.extend = helpers.inherits;
|
||||||
|
|
||||||
|
if (extensions) {
|
||||||
|
helpers.extend(ChartElement.prototype, extensions);
|
||||||
|
}
|
||||||
|
|
||||||
|
ChartElement.__super__ = parent.prototype;
|
||||||
|
|
||||||
|
return ChartElement;
|
||||||
|
};
|
||||||
|
helpers.noop = function() {};
|
||||||
|
helpers.uid = (function() {
|
||||||
|
var id = 0;
|
||||||
|
return function() {
|
||||||
|
return id++;
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
helpers.warn = function(str) {
|
||||||
|
//Method for warning of errors
|
||||||
|
if (console && typeof console.warn === "function") {
|
||||||
|
console.warn(str);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
//-- Math methods
|
||||||
|
helpers.isNumber = function(n) {
|
||||||
|
return !isNaN(parseFloat(n)) && isFinite(n);
|
||||||
|
};
|
||||||
|
helpers.almostEquals = function(x, y, epsilon) {
|
||||||
|
return Math.abs(x - y) < epsilon;
|
||||||
|
};
|
||||||
|
helpers.max = function(array) {
|
||||||
|
return array.reduce(function(max, value) {
|
||||||
|
if (!isNaN(value)) {
|
||||||
|
return Math.max(max, value);
|
||||||
|
} else {
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
}, Number.NEGATIVE_INFINITY);
|
||||||
|
};
|
||||||
|
helpers.min = function(array) {
|
||||||
|
return array.reduce(function(min, value) {
|
||||||
|
if (!isNaN(value)) {
|
||||||
|
return Math.min(min, value);
|
||||||
|
} else {
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
}, Number.POSITIVE_INFINITY);
|
||||||
|
};
|
||||||
|
helpers.sign = function(x) {
|
||||||
|
if (Math.sign) {
|
||||||
|
return Math.sign(x);
|
||||||
|
} else {
|
||||||
|
x = +x; // convert to a number
|
||||||
|
if (x === 0 || isNaN(x)) {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
return x > 0 ? 1 : -1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
helpers.log10 = function(x) {
|
||||||
|
if (Math.log10) {
|
||||||
|
return Math.log10(x);
|
||||||
|
} else {
|
||||||
|
return Math.log(x) / Math.LN10;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
helpers.toRadians = function(degrees) {
|
||||||
|
return degrees * (Math.PI / 180);
|
||||||
|
};
|
||||||
|
helpers.toDegrees = function(radians) {
|
||||||
|
return radians * (180 / Math.PI);
|
||||||
|
};
|
||||||
|
// Gets the angle from vertical upright to the point about a centre.
|
||||||
|
helpers.getAngleFromPoint = function(centrePoint, anglePoint) {
|
||||||
|
var distanceFromXCenter = anglePoint.x - centrePoint.x,
|
||||||
|
distanceFromYCenter = anglePoint.y - centrePoint.y,
|
||||||
|
radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);
|
||||||
|
|
||||||
|
var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);
|
||||||
|
|
||||||
|
if (angle < (-0.5 * Math.PI)) {
|
||||||
|
angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
angle: angle,
|
||||||
|
distance: radialDistanceFromCenter
|
||||||
|
};
|
||||||
|
};
|
||||||
|
helpers.aliasPixel = function(pixelWidth) {
|
||||||
|
return (pixelWidth % 2 === 0) ? 0 : 0.5;
|
||||||
|
};
|
||||||
|
helpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) {
|
||||||
|
//Props to Rob Spencer at scaled innovation for his post on splining between points
|
||||||
|
//http://scaledinnovation.com/analytics/splines/aboutSplines.html
|
||||||
|
|
||||||
|
// This function must also respect "skipped" points
|
||||||
|
|
||||||
|
var previous = firstPoint.skip ? middlePoint : firstPoint,
|
||||||
|
current = middlePoint,
|
||||||
|
next = afterPoint.skip ? middlePoint : afterPoint;
|
||||||
|
|
||||||
|
var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));
|
||||||
|
var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));
|
||||||
|
|
||||||
|
var s01 = d01 / (d01 + d12);
|
||||||
|
var s12 = d12 / (d01 + d12);
|
||||||
|
|
||||||
|
// If all points are the same, s01 & s02 will be inf
|
||||||
|
s01 = isNaN(s01) ? 0 : s01;
|
||||||
|
s12 = isNaN(s12) ? 0 : s12;
|
||||||
|
|
||||||
|
var fa = t * s01; // scaling factor for triangle Ta
|
||||||
|
var fb = t * s12;
|
||||||
|
|
||||||
|
return {
|
||||||
|
previous: {
|
||||||
|
x: current.x - fa * (next.x - previous.x),
|
||||||
|
y: current.y - fa * (next.y - previous.y)
|
||||||
|
},
|
||||||
|
next: {
|
||||||
|
x: current.x + fb * (next.x - previous.x),
|
||||||
|
y: current.y + fb * (next.y - previous.y)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
helpers.nextItem = function(collection, index, loop) {
|
||||||
|
if (loop) {
|
||||||
|
return index >= collection.length - 1 ? collection[0] : collection[index + 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];
|
||||||
|
};
|
||||||
|
helpers.previousItem = function(collection, index, loop) {
|
||||||
|
if (loop) {
|
||||||
|
return index <= 0 ? collection[collection.length - 1] : collection[index - 1];
|
||||||
|
}
|
||||||
|
return index <= 0 ? collection[0] : collection[index - 1];
|
||||||
|
};
|
||||||
|
// Implementation of the nice number algorithm used in determining where axis labels will go
|
||||||
|
helpers.niceNum = function(range, round) {
|
||||||
|
var exponent = Math.floor(helpers.log10(range));
|
||||||
|
var fraction = range / Math.pow(10, exponent);
|
||||||
|
var niceFraction;
|
||||||
|
|
||||||
|
if (round) {
|
||||||
|
if (fraction < 1.5) {
|
||||||
|
niceFraction = 1;
|
||||||
|
} else if (fraction < 3) {
|
||||||
|
niceFraction = 2;
|
||||||
|
} else if (fraction < 7) {
|
||||||
|
niceFraction = 5;
|
||||||
|
} else {
|
||||||
|
niceFraction = 10;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (fraction <= 1.0) {
|
||||||
|
niceFraction = 1;
|
||||||
|
} else if (fraction <= 2) {
|
||||||
|
niceFraction = 2;
|
||||||
|
} else if (fraction <= 5) {
|
||||||
|
niceFraction = 5;
|
||||||
|
} else {
|
||||||
|
niceFraction = 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return niceFraction * Math.pow(10, exponent);
|
||||||
|
};
|
||||||
|
//Easing functions adapted from Robert Penner's easing equations
|
||||||
|
//http://www.robertpenner.com/easing/
|
||||||
|
var easingEffects = helpers.easingEffects = {
|
||||||
|
linear: function(t) {
|
||||||
|
return t;
|
||||||
|
},
|
||||||
|
easeInQuad: function(t) {
|
||||||
|
return t * t;
|
||||||
|
},
|
||||||
|
easeOutQuad: function(t) {
|
||||||
|
return -1 * t * (t - 2);
|
||||||
|
},
|
||||||
|
easeInOutQuad: function(t) {
|
||||||
|
if ((t /= 1 / 2) < 1) {
|
||||||
|
return 1 / 2 * t * t;
|
||||||
|
}
|
||||||
|
return -1 / 2 * ((--t) * (t - 2) - 1);
|
||||||
|
},
|
||||||
|
easeInCubic: function(t) {
|
||||||
|
return t * t * t;
|
||||||
|
},
|
||||||
|
easeOutCubic: function(t) {
|
||||||
|
return 1 * ((t = t / 1 - 1) * t * t + 1);
|
||||||
|
},
|
||||||
|
easeInOutCubic: function(t) {
|
||||||
|
if ((t /= 1 / 2) < 1) {
|
||||||
|
return 1 / 2 * t * t * t;
|
||||||
|
}
|
||||||
|
return 1 / 2 * ((t -= 2) * t * t + 2);
|
||||||
|
},
|
||||||
|
easeInQuart: function(t) {
|
||||||
|
return t * t * t * t;
|
||||||
|
},
|
||||||
|
easeOutQuart: function(t) {
|
||||||
|
return -1 * ((t = t / 1 - 1) * t * t * t - 1);
|
||||||
|
},
|
||||||
|
easeInOutQuart: function(t) {
|
||||||
|
if ((t /= 1 / 2) < 1) {
|
||||||
|
return 1 / 2 * t * t * t * t;
|
||||||
|
}
|
||||||
|
return -1 / 2 * ((t -= 2) * t * t * t - 2);
|
||||||
|
},
|
||||||
|
easeInQuint: function(t) {
|
||||||
|
return 1 * (t /= 1) * t * t * t * t;
|
||||||
|
},
|
||||||
|
easeOutQuint: function(t) {
|
||||||
|
return 1 * ((t = t / 1 - 1) * t * t * t * t + 1);
|
||||||
|
},
|
||||||
|
easeInOutQuint: function(t) {
|
||||||
|
if ((t /= 1 / 2) < 1) {
|
||||||
|
return 1 / 2 * t * t * t * t * t;
|
||||||
|
}
|
||||||
|
return 1 / 2 * ((t -= 2) * t * t * t * t + 2);
|
||||||
|
},
|
||||||
|
easeInSine: function(t) {
|
||||||
|
return -1 * Math.cos(t / 1 * (Math.PI / 2)) + 1;
|
||||||
|
},
|
||||||
|
easeOutSine: function(t) {
|
||||||
|
return 1 * Math.sin(t / 1 * (Math.PI / 2));
|
||||||
|
},
|
||||||
|
easeInOutSine: function(t) {
|
||||||
|
return -1 / 2 * (Math.cos(Math.PI * t / 1) - 1);
|
||||||
|
},
|
||||||
|
easeInExpo: function(t) {
|
||||||
|
return (t === 0) ? 1 : 1 * Math.pow(2, 10 * (t / 1 - 1));
|
||||||
|
},
|
||||||
|
easeOutExpo: function(t) {
|
||||||
|
return (t === 1) ? 1 : 1 * (-Math.pow(2, -10 * t / 1) + 1);
|
||||||
|
},
|
||||||
|
easeInOutExpo: function(t) {
|
||||||
|
if (t === 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (t === 1) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if ((t /= 1 / 2) < 1) {
|
||||||
|
return 1 / 2 * Math.pow(2, 10 * (t - 1));
|
||||||
|
}
|
||||||
|
return 1 / 2 * (-Math.pow(2, -10 * --t) + 2);
|
||||||
|
},
|
||||||
|
easeInCirc: function(t) {
|
||||||
|
if (t >= 1) {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
return -1 * (Math.sqrt(1 - (t /= 1) * t) - 1);
|
||||||
|
},
|
||||||
|
easeOutCirc: function(t) {
|
||||||
|
return 1 * Math.sqrt(1 - (t = t / 1 - 1) * t);
|
||||||
|
},
|
||||||
|
easeInOutCirc: function(t) {
|
||||||
|
if ((t /= 1 / 2) < 1) {
|
||||||
|
return -1 / 2 * (Math.sqrt(1 - t * t) - 1);
|
||||||
|
}
|
||||||
|
return 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1);
|
||||||
|
},
|
||||||
|
easeInElastic: function(t) {
|
||||||
|
var s = 1.70158;
|
||||||
|
var p = 0;
|
||||||
|
var a = 1;
|
||||||
|
if (t === 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if ((t /= 1) === 1) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (!p) {
|
||||||
|
p = 1 * 0.3;
|
||||||
|
}
|
||||||
|
if (a < Math.abs(1)) {
|
||||||
|
a = 1;
|
||||||
|
s = p / 4;
|
||||||
|
} else {
|
||||||
|
s = p / (2 * Math.PI) * Math.asin(1 / a);
|
||||||
|
}
|
||||||
|
return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));
|
||||||
|
},
|
||||||
|
easeOutElastic: function(t) {
|
||||||
|
var s = 1.70158;
|
||||||
|
var p = 0;
|
||||||
|
var a = 1;
|
||||||
|
if (t === 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if ((t /= 1) === 1) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (!p) {
|
||||||
|
p = 1 * 0.3;
|
||||||
|
}
|
||||||
|
if (a < Math.abs(1)) {
|
||||||
|
a = 1;
|
||||||
|
s = p / 4;
|
||||||
|
} else {
|
||||||
|
s = p / (2 * Math.PI) * Math.asin(1 / a);
|
||||||
|
}
|
||||||
|
return a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1;
|
||||||
|
},
|
||||||
|
easeInOutElastic: function(t) {
|
||||||
|
var s = 1.70158;
|
||||||
|
var p = 0;
|
||||||
|
var a = 1;
|
||||||
|
if (t === 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if ((t /= 1 / 2) === 2) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (!p) {
|
||||||
|
p = 1 * (0.3 * 1.5);
|
||||||
|
}
|
||||||
|
if (a < Math.abs(1)) {
|
||||||
|
a = 1;
|
||||||
|
s = p / 4;
|
||||||
|
} else {
|
||||||
|
s = p / (2 * Math.PI) * Math.asin(1 / a);
|
||||||
|
}
|
||||||
|
if (t < 1) {
|
||||||
|
return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));
|
||||||
|
}
|
||||||
|
return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1;
|
||||||
|
},
|
||||||
|
easeInBack: function(t) {
|
||||||
|
var s = 1.70158;
|
||||||
|
return 1 * (t /= 1) * t * ((s + 1) * t - s);
|
||||||
|
},
|
||||||
|
easeOutBack: function(t) {
|
||||||
|
var s = 1.70158;
|
||||||
|
return 1 * ((t = t / 1 - 1) * t * ((s + 1) * t + s) + 1);
|
||||||
|
},
|
||||||
|
easeInOutBack: function(t) {
|
||||||
|
var s = 1.70158;
|
||||||
|
if ((t /= 1 / 2) < 1) {
|
||||||
|
return 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s));
|
||||||
|
}
|
||||||
|
return 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);
|
||||||
|
},
|
||||||
|
easeInBounce: function(t) {
|
||||||
|
return 1 - easingEffects.easeOutBounce(1 - t);
|
||||||
|
},
|
||||||
|
easeOutBounce: function(t) {
|
||||||
|
if ((t /= 1) < (1 / 2.75)) {
|
||||||
|
return 1 * (7.5625 * t * t);
|
||||||
|
} else if (t < (2 / 2.75)) {
|
||||||
|
return 1 * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75);
|
||||||
|
} else if (t < (2.5 / 2.75)) {
|
||||||
|
return 1 * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375);
|
||||||
|
} else {
|
||||||
|
return 1 * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
easeInOutBounce: function(t) {
|
||||||
|
if (t < 1 / 2) {
|
||||||
|
return easingEffects.easeInBounce(t * 2) * 0.5;
|
||||||
|
}
|
||||||
|
return easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
//Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
|
||||||
|
helpers.requestAnimFrame = (function() {
|
||||||
|
return window.requestAnimationFrame ||
|
||||||
|
window.webkitRequestAnimationFrame ||
|
||||||
|
window.mozRequestAnimationFrame ||
|
||||||
|
window.oRequestAnimationFrame ||
|
||||||
|
window.msRequestAnimationFrame ||
|
||||||
|
function(callback) {
|
||||||
|
return window.setTimeout(callback, 1000 / 60);
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
helpers.cancelAnimFrame = (function() {
|
||||||
|
return window.cancelAnimationFrame ||
|
||||||
|
window.webkitCancelAnimationFrame ||
|
||||||
|
window.mozCancelAnimationFrame ||
|
||||||
|
window.oCancelAnimationFrame ||
|
||||||
|
window.msCancelAnimationFrame ||
|
||||||
|
function(callback) {
|
||||||
|
return window.clearTimeout(callback, 1000 / 60);
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
//-- DOM methods
|
||||||
|
helpers.getRelativePosition = function(evt, chart) {
|
||||||
|
var mouseX, mouseY;
|
||||||
|
var e = evt.originalEvent || evt,
|
||||||
|
canvas = evt.currentTarget || evt.srcElement,
|
||||||
|
boundingRect = canvas.getBoundingClientRect();
|
||||||
|
|
||||||
|
var touches = e.touches;
|
||||||
|
if (touches && touches.length > 0) {
|
||||||
|
mouseX = touches[0].clientX;
|
||||||
|
mouseY = touches[0].clientY;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
mouseX = e.clientX;
|
||||||
|
mouseY = e.clientY;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scale mouse coordinates into canvas coordinates
|
||||||
|
// by following the pattern laid out by 'jerryj' in the comments of
|
||||||
|
// http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/
|
||||||
|
var paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left'));
|
||||||
|
var paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top'));
|
||||||
|
var paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right'));
|
||||||
|
var paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom'));
|
||||||
|
var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;
|
||||||
|
var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;
|
||||||
|
|
||||||
|
// We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However
|
||||||
|
// the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here
|
||||||
|
mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio);
|
||||||
|
mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio);
|
||||||
|
|
||||||
|
return {
|
||||||
|
x: mouseX,
|
||||||
|
y: mouseY
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
helpers.addEvent = function(node, eventType, method) {
|
||||||
|
if (node.addEventListener) {
|
||||||
|
node.addEventListener(eventType, method);
|
||||||
|
} else if (node.attachEvent) {
|
||||||
|
node.attachEvent("on" + eventType, method);
|
||||||
|
} else {
|
||||||
|
node["on" + eventType] = method;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
helpers.removeEvent = function(node, eventType, handler) {
|
||||||
|
if (node.removeEventListener) {
|
||||||
|
node.removeEventListener(eventType, handler, false);
|
||||||
|
} else if (node.detachEvent) {
|
||||||
|
node.detachEvent("on" + eventType, handler);
|
||||||
|
} else {
|
||||||
|
node["on" + eventType] = helpers.noop;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
helpers.bindEvents = function(chartInstance, arrayOfEvents, handler) {
|
||||||
|
// Create the events object if it's not already present
|
||||||
|
var events = chartInstance.events = chartInstance.events || {};
|
||||||
|
|
||||||
|
helpers.each(arrayOfEvents, function(eventName) {
|
||||||
|
events[eventName] = function() {
|
||||||
|
handler.apply(chartInstance, arguments);
|
||||||
|
};
|
||||||
|
helpers.addEvent(chartInstance.chart.canvas, eventName, events[eventName]);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
helpers.unbindEvents = function(chartInstance, arrayOfEvents) {
|
||||||
|
var canvas = chartInstance.chart.canvas;
|
||||||
|
helpers.each(arrayOfEvents, function(handler, eventName) {
|
||||||
|
helpers.removeEvent(canvas, eventName, handler);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// Private helper function to convert max-width/max-height values that may be percentages into a number
|
||||||
|
function parseMaxStyle(styleValue, node, parentProperty) {
|
||||||
|
var valueInPixels;
|
||||||
|
if (typeof(styleValue) === 'string') {
|
||||||
|
valueInPixels = parseInt(styleValue, 10);
|
||||||
|
|
||||||
|
if (styleValue.indexOf('%') != -1) {
|
||||||
|
// percentage * size in dimension
|
||||||
|
valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
valueInPixels = styleValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return valueInPixels;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns if the given value contains an effective constraint.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function isConstrainedValue(value) {
|
||||||
|
return value !== undefined && value !== null && value !== 'none';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private helper to get a constraint dimension
|
||||||
|
// @param domNode : the node to check the constraint on
|
||||||
|
// @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight)
|
||||||
|
// @param percentageProperty : property of parent to use when calculating width as a percentage
|
||||||
|
// @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser
|
||||||
|
function getConstraintDimension(domNode, maxStyle, percentageProperty) {
|
||||||
|
var view = document.defaultView;
|
||||||
|
var parentNode = domNode.parentNode;
|
||||||
|
var constrainedNode = view.getComputedStyle(domNode)[maxStyle];
|
||||||
|
var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];
|
||||||
|
var hasCNode = isConstrainedValue(constrainedNode);
|
||||||
|
var hasCContainer = isConstrainedValue(constrainedContainer);
|
||||||
|
var infinity = Number.POSITIVE_INFINITY;
|
||||||
|
|
||||||
|
if (hasCNode || hasCContainer) {
|
||||||
|
return Math.min(
|
||||||
|
hasCNode? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity,
|
||||||
|
hasCContainer? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'none';
|
||||||
|
}
|
||||||
|
// returns Number or undefined if no constraint
|
||||||
|
helpers.getConstraintWidth = function(domNode) {
|
||||||
|
return getConstraintDimension(domNode, 'max-width', 'clientWidth');
|
||||||
|
};
|
||||||
|
// returns Number or undefined if no constraint
|
||||||
|
helpers.getConstraintHeight = function(domNode) {
|
||||||
|
return getConstraintDimension(domNode, 'max-height', 'clientHeight');
|
||||||
|
};
|
||||||
|
helpers.getMaximumWidth = function(domNode) {
|
||||||
|
var container = domNode.parentNode;
|
||||||
|
var padding = parseInt(helpers.getStyle(container, 'padding-left')) + parseInt(helpers.getStyle(container, 'padding-right'));
|
||||||
|
var w = container.clientWidth - padding;
|
||||||
|
var cw = helpers.getConstraintWidth(domNode);
|
||||||
|
return isNaN(cw)? w : Math.min(w, cw);
|
||||||
|
};
|
||||||
|
helpers.getMaximumHeight = function(domNode) {
|
||||||
|
var container = domNode.parentNode;
|
||||||
|
var padding = parseInt(helpers.getStyle(container, 'padding-top')) + parseInt(helpers.getStyle(container, 'padding-bottom'));
|
||||||
|
var h = container.clientHeight - padding;
|
||||||
|
var ch = helpers.getConstraintHeight(domNode);
|
||||||
|
return isNaN(ch)? h : Math.min(h, ch);
|
||||||
|
};
|
||||||
|
helpers.getStyle = function(el, property) {
|
||||||
|
return el.currentStyle ?
|
||||||
|
el.currentStyle[property] :
|
||||||
|
document.defaultView.getComputedStyle(el, null).getPropertyValue(property);
|
||||||
|
};
|
||||||
|
helpers.retinaScale = function(chart) {
|
||||||
|
var ctx = chart.ctx;
|
||||||
|
var canvas = chart.canvas;
|
||||||
|
var width = canvas.width;
|
||||||
|
var height = canvas.height;
|
||||||
|
var pixelRatio = chart.currentDevicePixelRatio = window.devicePixelRatio || 1;
|
||||||
|
|
||||||
|
if (pixelRatio !== 1) {
|
||||||
|
canvas.height = height * pixelRatio;
|
||||||
|
canvas.width = width * pixelRatio;
|
||||||
|
ctx.scale(pixelRatio, pixelRatio);
|
||||||
|
|
||||||
|
// Store the device pixel ratio so that we can go backwards in `destroy`.
|
||||||
|
// The devicePixelRatio changes with zoom, so there are no guarantees that it is the same
|
||||||
|
// when destroy is called
|
||||||
|
chart.originalDevicePixelRatio = chart.originalDevicePixelRatio || pixelRatio;
|
||||||
|
}
|
||||||
|
|
||||||
|
canvas.style.width = width + 'px';
|
||||||
|
canvas.style.height = height + 'px';
|
||||||
|
};
|
||||||
|
//-- Canvas methods
|
||||||
|
helpers.clear = function(chart) {
|
||||||
|
chart.ctx.clearRect(0, 0, chart.width, chart.height);
|
||||||
|
};
|
||||||
|
helpers.fontString = function(pixelSize, fontStyle, fontFamily) {
|
||||||
|
return fontStyle + " " + pixelSize + "px " + fontFamily;
|
||||||
|
};
|
||||||
|
helpers.longestText = function(ctx, font, arrayOfStrings, cache) {
|
||||||
|
cache = cache || {};
|
||||||
|
var data = cache.data = cache.data || {};
|
||||||
|
var gc = cache.garbageCollect = cache.garbageCollect || [];
|
||||||
|
|
||||||
|
if (cache.font !== font) {
|
||||||
|
data = cache.data = {};
|
||||||
|
gc = cache.garbageCollect = [];
|
||||||
|
cache.font = font;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.font = font;
|
||||||
|
var longest = 0;
|
||||||
|
helpers.each(arrayOfStrings, function(string) {
|
||||||
|
// Undefined strings should not be measured
|
||||||
|
if (string !== undefined && string !== null) {
|
||||||
|
var textWidth = data[string];
|
||||||
|
if (!textWidth) {
|
||||||
|
textWidth = data[string] = ctx.measureText(string).width;
|
||||||
|
gc.push(string);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (textWidth > longest) {
|
||||||
|
longest = textWidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var gcLen = gc.length / 2;
|
||||||
|
if (gcLen > arrayOfStrings.length) {
|
||||||
|
for (var i = 0; i < gcLen; i++) {
|
||||||
|
delete data[gc[i]];
|
||||||
|
}
|
||||||
|
gc.splice(0, gcLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
return longest;
|
||||||
|
};
|
||||||
|
helpers.drawRoundedRectangle = function(ctx, x, y, width, height, radius) {
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.moveTo(x + radius, y);
|
||||||
|
ctx.lineTo(x + width - radius, y);
|
||||||
|
ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
|
||||||
|
ctx.lineTo(x + width, y + height - radius);
|
||||||
|
ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
|
||||||
|
ctx.lineTo(x + radius, y + height);
|
||||||
|
ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
|
||||||
|
ctx.lineTo(x, y + radius);
|
||||||
|
ctx.quadraticCurveTo(x, y, x + radius, y);
|
||||||
|
ctx.closePath();
|
||||||
|
};
|
||||||
|
helpers.color = function(c) {
|
||||||
|
if (!color) {
|
||||||
|
console.log('Color.js not found!');
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* global CanvasGradient */
|
||||||
|
if (c instanceof CanvasGradient) {
|
||||||
|
return color(Chart.defaults.global.defaultColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
return color(c);
|
||||||
|
};
|
||||||
|
helpers.addResizeListener = function(node, callback) {
|
||||||
|
// Hide an iframe before the node
|
||||||
|
var hiddenIframe = document.createElement('iframe');
|
||||||
|
var hiddenIframeClass = 'chartjs-hidden-iframe';
|
||||||
|
|
||||||
|
if (hiddenIframe.classlist) {
|
||||||
|
// can use classlist
|
||||||
|
hiddenIframe.classlist.add(hiddenIframeClass);
|
||||||
|
} else {
|
||||||
|
hiddenIframe.setAttribute('class', hiddenIframeClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the style
|
||||||
|
var style = hiddenIframe.style;
|
||||||
|
style.width = '100%';
|
||||||
|
style.display = 'block';
|
||||||
|
style.border = 0;
|
||||||
|
style.height = 0;
|
||||||
|
style.margin = 0;
|
||||||
|
style.position = 'absolute';
|
||||||
|
style.left = 0;
|
||||||
|
style.right = 0;
|
||||||
|
style.top = 0;
|
||||||
|
style.bottom = 0;
|
||||||
|
|
||||||
|
// Insert the iframe so that contentWindow is available
|
||||||
|
node.insertBefore(hiddenIframe, node.firstChild);
|
||||||
|
|
||||||
|
(hiddenIframe.contentWindow || hiddenIframe).onresize = function() {
|
||||||
|
if (callback) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
helpers.removeResizeListener = function(node) {
|
||||||
|
var hiddenIframe = node.querySelector('.chartjs-hidden-iframe');
|
||||||
|
|
||||||
|
// Remove the resize detect iframe
|
||||||
|
if (hiddenIframe) {
|
||||||
|
hiddenIframe.parentNode.removeChild(hiddenIframe);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
helpers.isArray = function(obj) {
|
||||||
|
if (!Array.isArray) {
|
||||||
|
return Object.prototype.toString.call(obj) === '[object Array]';
|
||||||
|
}
|
||||||
|
return Array.isArray(obj);
|
||||||
|
};
|
||||||
|
//! @see http://stackoverflow.com/a/14853974
|
||||||
|
helpers.arrayEquals = function(a0, a1) {
|
||||||
|
var i, ilen, v0, v1;
|
||||||
|
|
||||||
|
if (!a0 || !a1 || a0.length != a1.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0, ilen=a0.length; i < ilen; ++i) {
|
||||||
|
v0 = a0[i];
|
||||||
|
v1 = a1[i];
|
||||||
|
|
||||||
|
if (v0 instanceof Array && v1 instanceof Array) {
|
||||||
|
if (!helpers.arrayEquals(v0, v1)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (v0 != v1) {
|
||||||
|
// NOTE: two different object instances will never be equal: {x:20} != {x:20}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
helpers.pushAllIfDefined = function(element, array) {
|
||||||
|
if (typeof element === "undefined") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (helpers.isArray(element)) {
|
||||||
|
array.push.apply(array, element);
|
||||||
|
} else {
|
||||||
|
array.push(element);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
helpers.callCallback = function(fn, args, _tArg) {
|
||||||
|
if (fn && typeof fn.call === 'function') {
|
||||||
|
fn.apply(_tArg, args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
helpers.getHoverColor = function(color) {
|
||||||
|
/* global CanvasPattern */
|
||||||
|
return (color instanceof CanvasPattern) ?
|
||||||
|
color :
|
||||||
|
helpers.color(color).saturate(0.5).darken(0.1).rgbString();
|
||||||
|
};
|
||||||
|
};
|
104
public/vendors/Chart.js/src/core/core.js
vendored
Normal file
104
public/vendors/Chart.js/src/core/core.js
vendored
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function() {
|
||||||
|
|
||||||
|
//Occupy the global variable of Chart, and create a simple base class
|
||||||
|
var Chart = function(context, config) {
|
||||||
|
this.config = config;
|
||||||
|
|
||||||
|
// Support a jQuery'd canvas element
|
||||||
|
if (context.length && context[0].getContext) {
|
||||||
|
context = context[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support a canvas domnode
|
||||||
|
if (context.getContext) {
|
||||||
|
context = context.getContext("2d");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.ctx = context;
|
||||||
|
this.canvas = context.canvas;
|
||||||
|
|
||||||
|
// Figure out what the size of the chart will be.
|
||||||
|
// If the canvas has a specified width and height, we use those else
|
||||||
|
// we look to see if the canvas node has a CSS width and height.
|
||||||
|
// If there is still no height, fill the parent container
|
||||||
|
this.width = context.canvas.width || parseInt(Chart.helpers.getStyle(context.canvas, 'width')) || Chart.helpers.getMaximumWidth(context.canvas);
|
||||||
|
this.height = context.canvas.height || parseInt(Chart.helpers.getStyle(context.canvas, 'height')) || Chart.helpers.getMaximumHeight(context.canvas);
|
||||||
|
|
||||||
|
this.aspectRatio = this.width / this.height;
|
||||||
|
|
||||||
|
if (isNaN(this.aspectRatio) || isFinite(this.aspectRatio) === false) {
|
||||||
|
// If the canvas has no size, try and figure out what the aspect ratio will be.
|
||||||
|
// Some charts prefer square canvases (pie, radar, etc). If that is specified, use that
|
||||||
|
// else use the canvas default ratio of 2
|
||||||
|
this.aspectRatio = config.aspectRatio !== undefined ? config.aspectRatio : 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store the original style of the element so we can set it back
|
||||||
|
this.originalCanvasStyleWidth = context.canvas.style.width;
|
||||||
|
this.originalCanvasStyleHeight = context.canvas.style.height;
|
||||||
|
|
||||||
|
// High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale.
|
||||||
|
Chart.helpers.retinaScale(this);
|
||||||
|
|
||||||
|
if (config) {
|
||||||
|
this.controller = new Chart.Controller(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always bind this so that if the responsive state changes we still work
|
||||||
|
var _this = this;
|
||||||
|
Chart.helpers.addResizeListener(context.canvas.parentNode, function() {
|
||||||
|
if (_this.controller && _this.controller.config.options.responsive) {
|
||||||
|
_this.controller.resize();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return this.controller ? this.controller : this;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
//Globally expose the defaults to allow for user updating/changing
|
||||||
|
Chart.defaults = {
|
||||||
|
global: {
|
||||||
|
responsive: true,
|
||||||
|
responsiveAnimationDuration: 0,
|
||||||
|
maintainAspectRatio: true,
|
||||||
|
events: ["mousemove", "mouseout", "click", "touchstart", "touchmove"],
|
||||||
|
hover: {
|
||||||
|
onHover: null,
|
||||||
|
mode: 'single',
|
||||||
|
animationDuration: 400
|
||||||
|
},
|
||||||
|
onClick: null,
|
||||||
|
defaultColor: 'rgba(0,0,0,0.1)',
|
||||||
|
defaultFontColor: '#666',
|
||||||
|
defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
|
||||||
|
defaultFontSize: 12,
|
||||||
|
defaultFontStyle: 'normal',
|
||||||
|
showLines: true,
|
||||||
|
|
||||||
|
// Element defaults defined in element extensions
|
||||||
|
elements: {},
|
||||||
|
|
||||||
|
// Legend callback string
|
||||||
|
legendCallback: function(chart) {
|
||||||
|
var text = [];
|
||||||
|
text.push('<ul class="' + chart.id + '-legend">');
|
||||||
|
for (var i = 0; i < chart.data.datasets.length; i++) {
|
||||||
|
text.push('<li><span style="background-color:' + chart.data.datasets[i].backgroundColor + '"></span>');
|
||||||
|
if (chart.data.datasets[i].label) {
|
||||||
|
text.push(chart.data.datasets[i].label);
|
||||||
|
}
|
||||||
|
text.push('</li>');
|
||||||
|
}
|
||||||
|
text.push('</ul>');
|
||||||
|
|
||||||
|
return text.join("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return Chart;
|
||||||
|
|
||||||
|
};
|
323
public/vendors/Chart.js/src/core/core.layoutService.js
vendored
Normal file
323
public/vendors/Chart.js/src/core/core.layoutService.js
vendored
Normal file
@ -0,0 +1,323 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
var helpers = Chart.helpers;
|
||||||
|
|
||||||
|
// The layout service is very self explanatory. It's responsible for the layout within a chart.
|
||||||
|
// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need
|
||||||
|
// It is this service's responsibility of carrying out that layout.
|
||||||
|
Chart.layoutService = {
|
||||||
|
defaults: {},
|
||||||
|
|
||||||
|
// Register a box to a chartInstance. A box is simply a reference to an object that requires layout. eg. Scales, Legend, Plugins.
|
||||||
|
addBox: function(chartInstance, box) {
|
||||||
|
if (!chartInstance.boxes) {
|
||||||
|
chartInstance.boxes = [];
|
||||||
|
}
|
||||||
|
chartInstance.boxes.push(box);
|
||||||
|
},
|
||||||
|
|
||||||
|
removeBox: function(chartInstance, box) {
|
||||||
|
if (!chartInstance.boxes) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
chartInstance.boxes.splice(chartInstance.boxes.indexOf(box), 1);
|
||||||
|
},
|
||||||
|
|
||||||
|
// The most important function
|
||||||
|
update: function(chartInstance, width, height) {
|
||||||
|
|
||||||
|
if (!chartInstance) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var xPadding = 0;
|
||||||
|
var yPadding = 0;
|
||||||
|
|
||||||
|
var leftBoxes = helpers.where(chartInstance.boxes, function(box) {
|
||||||
|
return box.options.position === "left";
|
||||||
|
});
|
||||||
|
var rightBoxes = helpers.where(chartInstance.boxes, function(box) {
|
||||||
|
return box.options.position === "right";
|
||||||
|
});
|
||||||
|
var topBoxes = helpers.where(chartInstance.boxes, function(box) {
|
||||||
|
return box.options.position === "top";
|
||||||
|
});
|
||||||
|
var bottomBoxes = helpers.where(chartInstance.boxes, function(box) {
|
||||||
|
return box.options.position === "bottom";
|
||||||
|
});
|
||||||
|
|
||||||
|
// Boxes that overlay the chartarea such as the radialLinear scale
|
||||||
|
var chartAreaBoxes = helpers.where(chartInstance.boxes, function(box) {
|
||||||
|
return box.options.position === "chartArea";
|
||||||
|
});
|
||||||
|
|
||||||
|
// Ensure that full width boxes are at the very top / bottom
|
||||||
|
topBoxes.sort(function(a, b) {
|
||||||
|
return (b.options.fullWidth ? 1 : 0) - (a.options.fullWidth ? 1 : 0);
|
||||||
|
});
|
||||||
|
bottomBoxes.sort(function(a, b) {
|
||||||
|
return (a.options.fullWidth ? 1 : 0) - (b.options.fullWidth ? 1 : 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Essentially we now have any number of boxes on each of the 4 sides.
|
||||||
|
// Our canvas looks like the following.
|
||||||
|
// The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and
|
||||||
|
// B1 is the bottom axis
|
||||||
|
// There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays
|
||||||
|
// These locations are single-box locations only, when trying to register a chartArea location that is already taken,
|
||||||
|
// an error will be thrown.
|
||||||
|
//
|
||||||
|
// |----------------------------------------------------|
|
||||||
|
// | T1 (Full Width) |
|
||||||
|
// |----------------------------------------------------|
|
||||||
|
// | | | T2 | |
|
||||||
|
// | |----|-------------------------------------|----|
|
||||||
|
// | | | C1 | | C2 | |
|
||||||
|
// | | |----| |----| |
|
||||||
|
// | | | | |
|
||||||
|
// | L1 | L2 | ChartArea (C0) | R1 |
|
||||||
|
// | | | | |
|
||||||
|
// | | |----| |----| |
|
||||||
|
// | | | C3 | | C4 | |
|
||||||
|
// | |----|-------------------------------------|----|
|
||||||
|
// | | | B1 | |
|
||||||
|
// |----------------------------------------------------|
|
||||||
|
// | B2 (Full Width) |
|
||||||
|
// |----------------------------------------------------|
|
||||||
|
//
|
||||||
|
// What we do to find the best sizing, we do the following
|
||||||
|
// 1. Determine the minimum size of the chart area.
|
||||||
|
// 2. Split the remaining width equally between each vertical axis
|
||||||
|
// 3. Split the remaining height equally between each horizontal axis
|
||||||
|
// 4. Give each layout the maximum size it can be. The layout will return it's minimum size
|
||||||
|
// 5. Adjust the sizes of each axis based on it's minimum reported size.
|
||||||
|
// 6. Refit each axis
|
||||||
|
// 7. Position each axis in the final location
|
||||||
|
// 8. Tell the chart the final location of the chart area
|
||||||
|
// 9. Tell any axes that overlay the chart area the positions of the chart area
|
||||||
|
|
||||||
|
// Step 1
|
||||||
|
var chartWidth = width - (2 * xPadding);
|
||||||
|
var chartHeight = height - (2 * yPadding);
|
||||||
|
var chartAreaWidth = chartWidth / 2; // min 50%
|
||||||
|
var chartAreaHeight = chartHeight / 2; // min 50%
|
||||||
|
|
||||||
|
// Step 2
|
||||||
|
var verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length);
|
||||||
|
|
||||||
|
// Step 3
|
||||||
|
var horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length);
|
||||||
|
|
||||||
|
// Step 4
|
||||||
|
var maxChartAreaWidth = chartWidth;
|
||||||
|
var maxChartAreaHeight = chartHeight;
|
||||||
|
var minBoxSizes = [];
|
||||||
|
|
||||||
|
helpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize);
|
||||||
|
|
||||||
|
function getMinimumBoxSize(box) {
|
||||||
|
var minSize;
|
||||||
|
var isHorizontal = box.isHorizontal();
|
||||||
|
|
||||||
|
if (isHorizontal) {
|
||||||
|
minSize = box.update(box.options.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight);
|
||||||
|
maxChartAreaHeight -= minSize.height;
|
||||||
|
} else {
|
||||||
|
minSize = box.update(verticalBoxWidth, chartAreaHeight);
|
||||||
|
maxChartAreaWidth -= minSize.width;
|
||||||
|
}
|
||||||
|
|
||||||
|
minBoxSizes.push({
|
||||||
|
horizontal: isHorizontal,
|
||||||
|
minSize: minSize,
|
||||||
|
box: box
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could
|
||||||
|
// be if the axes are drawn at their minimum sizes.
|
||||||
|
|
||||||
|
// Steps 5 & 6
|
||||||
|
var totalLeftBoxesWidth = xPadding;
|
||||||
|
var totalRightBoxesWidth = xPadding;
|
||||||
|
var totalTopBoxesHeight = yPadding;
|
||||||
|
var totalBottomBoxesHeight = yPadding;
|
||||||
|
|
||||||
|
// Update, and calculate the left and right margins for the horizontal boxes
|
||||||
|
helpers.each(leftBoxes.concat(rightBoxes), fitBox);
|
||||||
|
|
||||||
|
helpers.each(leftBoxes, function(box) {
|
||||||
|
totalLeftBoxesWidth += box.width;
|
||||||
|
});
|
||||||
|
|
||||||
|
helpers.each(rightBoxes, function(box) {
|
||||||
|
totalRightBoxesWidth += box.width;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set the Left and Right margins for the horizontal boxes
|
||||||
|
helpers.each(topBoxes.concat(bottomBoxes), fitBox);
|
||||||
|
|
||||||
|
// Function to fit a box
|
||||||
|
function fitBox(box) {
|
||||||
|
var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBoxSize) {
|
||||||
|
return minBoxSize.box === box;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (minBoxSize) {
|
||||||
|
if (box.isHorizontal()) {
|
||||||
|
var scaleMargin = {
|
||||||
|
left: totalLeftBoxesWidth,
|
||||||
|
right: totalRightBoxesWidth,
|
||||||
|
top: 0,
|
||||||
|
bottom: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
// Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends
|
||||||
|
// on the margin. Sometimes they need to increase in size slightly
|
||||||
|
box.update(box.options.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);
|
||||||
|
} else {
|
||||||
|
box.update(minBoxSize.minSize.width, maxChartAreaHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Figure out how much margin is on the top and bottom of the vertical boxes
|
||||||
|
helpers.each(topBoxes, function(box) {
|
||||||
|
totalTopBoxesHeight += box.height;
|
||||||
|
});
|
||||||
|
|
||||||
|
helpers.each(bottomBoxes, function(box) {
|
||||||
|
totalBottomBoxesHeight += box.height;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Let the left layout know the final margin
|
||||||
|
helpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox);
|
||||||
|
|
||||||
|
function finalFitVerticalBox(box) {
|
||||||
|
var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBoxSize) {
|
||||||
|
return minBoxSize.box === box;
|
||||||
|
});
|
||||||
|
|
||||||
|
var scaleMargin = {
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
top: totalTopBoxesHeight,
|
||||||
|
bottom: totalBottomBoxesHeight
|
||||||
|
};
|
||||||
|
|
||||||
|
if (minBoxSize) {
|
||||||
|
box.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)
|
||||||
|
totalLeftBoxesWidth = xPadding;
|
||||||
|
totalRightBoxesWidth = xPadding;
|
||||||
|
totalTopBoxesHeight = yPadding;
|
||||||
|
totalBottomBoxesHeight = yPadding;
|
||||||
|
|
||||||
|
helpers.each(leftBoxes, function(box) {
|
||||||
|
totalLeftBoxesWidth += box.width;
|
||||||
|
});
|
||||||
|
|
||||||
|
helpers.each(rightBoxes, function(box) {
|
||||||
|
totalRightBoxesWidth += box.width;
|
||||||
|
});
|
||||||
|
|
||||||
|
helpers.each(topBoxes, function(box) {
|
||||||
|
totalTopBoxesHeight += box.height;
|
||||||
|
});
|
||||||
|
helpers.each(bottomBoxes, function(box) {
|
||||||
|
totalBottomBoxesHeight += box.height;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Figure out if our chart area changed. This would occur if the dataset layout label rotation
|
||||||
|
// changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do
|
||||||
|
// without calling `fit` again
|
||||||
|
var newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight;
|
||||||
|
var newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth;
|
||||||
|
|
||||||
|
if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {
|
||||||
|
helpers.each(leftBoxes, function(box) {
|
||||||
|
box.height = newMaxChartAreaHeight;
|
||||||
|
});
|
||||||
|
|
||||||
|
helpers.each(rightBoxes, function(box) {
|
||||||
|
box.height = newMaxChartAreaHeight;
|
||||||
|
});
|
||||||
|
|
||||||
|
helpers.each(topBoxes, function(box) {
|
||||||
|
if (!box.options.fullWidth) {
|
||||||
|
box.width = newMaxChartAreaWidth;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
helpers.each(bottomBoxes, function(box) {
|
||||||
|
if (!box.options.fullWidth) {
|
||||||
|
box.width = newMaxChartAreaWidth;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
maxChartAreaHeight = newMaxChartAreaHeight;
|
||||||
|
maxChartAreaWidth = newMaxChartAreaWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 7 - Position the boxes
|
||||||
|
var left = xPadding;
|
||||||
|
var top = yPadding;
|
||||||
|
var right = 0;
|
||||||
|
var bottom = 0;
|
||||||
|
|
||||||
|
helpers.each(leftBoxes.concat(topBoxes), placeBox);
|
||||||
|
|
||||||
|
// Account for chart width and height
|
||||||
|
left += maxChartAreaWidth;
|
||||||
|
top += maxChartAreaHeight;
|
||||||
|
|
||||||
|
helpers.each(rightBoxes, placeBox);
|
||||||
|
helpers.each(bottomBoxes, placeBox);
|
||||||
|
|
||||||
|
function placeBox(box) {
|
||||||
|
if (box.isHorizontal()) {
|
||||||
|
box.left = box.options.fullWidth ? xPadding : totalLeftBoxesWidth;
|
||||||
|
box.right = box.options.fullWidth ? width - xPadding : totalLeftBoxesWidth + maxChartAreaWidth;
|
||||||
|
box.top = top;
|
||||||
|
box.bottom = top + box.height;
|
||||||
|
|
||||||
|
// Move to next point
|
||||||
|
top = box.bottom;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
box.left = left;
|
||||||
|
box.right = left + box.width;
|
||||||
|
box.top = totalTopBoxesHeight;
|
||||||
|
box.bottom = totalTopBoxesHeight + maxChartAreaHeight;
|
||||||
|
|
||||||
|
// Move to next point
|
||||||
|
left = box.right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 8
|
||||||
|
chartInstance.chartArea = {
|
||||||
|
left: totalLeftBoxesWidth,
|
||||||
|
top: totalTopBoxesHeight,
|
||||||
|
right: totalLeftBoxesWidth + maxChartAreaWidth,
|
||||||
|
bottom: totalTopBoxesHeight + maxChartAreaHeight
|
||||||
|
};
|
||||||
|
|
||||||
|
// Step 9
|
||||||
|
helpers.each(chartAreaBoxes, function(box) {
|
||||||
|
box.left = chartInstance.chartArea.left;
|
||||||
|
box.top = chartInstance.chartArea.top;
|
||||||
|
box.right = chartInstance.chartArea.right;
|
||||||
|
box.bottom = chartInstance.chartArea.bottom;
|
||||||
|
|
||||||
|
box.update(maxChartAreaWidth, maxChartAreaHeight);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
350
public/vendors/Chart.js/src/core/core.legend.js
vendored
Normal file
350
public/vendors/Chart.js/src/core/core.legend.js
vendored
Normal file
@ -0,0 +1,350 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
|
||||||
|
var helpers = Chart.helpers;
|
||||||
|
var noop = helpers.noop;
|
||||||
|
|
||||||
|
Chart.defaults.global.legend = {
|
||||||
|
|
||||||
|
display: true,
|
||||||
|
position: 'top',
|
||||||
|
fullWidth: true, // marks that this box should take the full width of the canvas (pushing down other boxes)
|
||||||
|
reverse: false,
|
||||||
|
|
||||||
|
// a callback that will handle
|
||||||
|
onClick: function(e, legendItem) {
|
||||||
|
var index = legendItem.datasetIndex;
|
||||||
|
var ci = this.chart;
|
||||||
|
var meta = ci.getDatasetMeta(index);
|
||||||
|
|
||||||
|
// See controller.isDatasetVisible comment
|
||||||
|
meta.hidden = meta.hidden === null? !ci.data.datasets[index].hidden : null;
|
||||||
|
|
||||||
|
// We hid a dataset ... rerender the chart
|
||||||
|
ci.update();
|
||||||
|
},
|
||||||
|
|
||||||
|
labels: {
|
||||||
|
boxWidth: 40,
|
||||||
|
padding: 10,
|
||||||
|
// Generates labels shown in the legend
|
||||||
|
// Valid properties to return:
|
||||||
|
// text : text to display
|
||||||
|
// fillStyle : fill of coloured box
|
||||||
|
// strokeStyle: stroke of coloured box
|
||||||
|
// hidden : if this legend item refers to a hidden item
|
||||||
|
// lineCap : cap style for line
|
||||||
|
// lineDash
|
||||||
|
// lineDashOffset :
|
||||||
|
// lineJoin :
|
||||||
|
// lineWidth :
|
||||||
|
generateLabels: function(chart) {
|
||||||
|
var data = chart.data;
|
||||||
|
return helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {
|
||||||
|
return {
|
||||||
|
text: dataset.label,
|
||||||
|
fillStyle: dataset.backgroundColor,
|
||||||
|
hidden: !chart.isDatasetVisible(i),
|
||||||
|
lineCap: dataset.borderCapStyle,
|
||||||
|
lineDash: dataset.borderDash,
|
||||||
|
lineDashOffset: dataset.borderDashOffset,
|
||||||
|
lineJoin: dataset.borderJoinStyle,
|
||||||
|
lineWidth: dataset.borderWidth,
|
||||||
|
strokeStyle: dataset.borderColor,
|
||||||
|
|
||||||
|
// Below is extra data used for toggling the datasets
|
||||||
|
datasetIndex: i
|
||||||
|
};
|
||||||
|
}, this) : [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Chart.Legend = Chart.Element.extend({
|
||||||
|
|
||||||
|
initialize: function(config) {
|
||||||
|
helpers.extend(this, config);
|
||||||
|
|
||||||
|
// Contains hit boxes for each dataset (in dataset order)
|
||||||
|
this.legendHitBoxes = [];
|
||||||
|
|
||||||
|
// Are we in doughnut mode which has a different data type
|
||||||
|
this.doughnutMode = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
// These methods are ordered by lifecyle. Utilities then follow.
|
||||||
|
// Any function defined here is inherited by all legend types.
|
||||||
|
// Any function can be extended by the legend type
|
||||||
|
|
||||||
|
beforeUpdate: noop,
|
||||||
|
update: function(maxWidth, maxHeight, margins) {
|
||||||
|
|
||||||
|
// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)
|
||||||
|
this.beforeUpdate();
|
||||||
|
|
||||||
|
// Absorb the master measurements
|
||||||
|
this.maxWidth = maxWidth;
|
||||||
|
this.maxHeight = maxHeight;
|
||||||
|
this.margins = margins;
|
||||||
|
|
||||||
|
// Dimensions
|
||||||
|
this.beforeSetDimensions();
|
||||||
|
this.setDimensions();
|
||||||
|
this.afterSetDimensions();
|
||||||
|
// Labels
|
||||||
|
this.beforeBuildLabels();
|
||||||
|
this.buildLabels();
|
||||||
|
this.afterBuildLabels();
|
||||||
|
|
||||||
|
// Fit
|
||||||
|
this.beforeFit();
|
||||||
|
this.fit();
|
||||||
|
this.afterFit();
|
||||||
|
//
|
||||||
|
this.afterUpdate();
|
||||||
|
|
||||||
|
return this.minSize;
|
||||||
|
},
|
||||||
|
afterUpdate: noop,
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
beforeSetDimensions: noop,
|
||||||
|
setDimensions: function() {
|
||||||
|
// Set the unconstrained dimension before label rotation
|
||||||
|
if (this.isHorizontal()) {
|
||||||
|
// Reset position before calculating rotation
|
||||||
|
this.width = this.maxWidth;
|
||||||
|
this.left = 0;
|
||||||
|
this.right = this.width;
|
||||||
|
} else {
|
||||||
|
this.height = this.maxHeight;
|
||||||
|
|
||||||
|
// Reset position before calculating rotation
|
||||||
|
this.top = 0;
|
||||||
|
this.bottom = this.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset padding
|
||||||
|
this.paddingLeft = 0;
|
||||||
|
this.paddingTop = 0;
|
||||||
|
this.paddingRight = 0;
|
||||||
|
this.paddingBottom = 0;
|
||||||
|
|
||||||
|
// Reset minSize
|
||||||
|
this.minSize = {
|
||||||
|
width: 0,
|
||||||
|
height: 0
|
||||||
|
};
|
||||||
|
},
|
||||||
|
afterSetDimensions: noop,
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
beforeBuildLabels: noop,
|
||||||
|
buildLabels: function() {
|
||||||
|
this.legendItems = this.options.labels.generateLabels.call(this, this.chart);
|
||||||
|
if(this.options.reverse){
|
||||||
|
this.legendItems.reverse();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
afterBuildLabels: noop,
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
beforeFit: noop,
|
||||||
|
fit: function() {
|
||||||
|
var opts = this.options;
|
||||||
|
var labelOpts = opts.labels;
|
||||||
|
var display = opts.display;
|
||||||
|
|
||||||
|
var ctx = this.ctx;
|
||||||
|
|
||||||
|
var globalDefault = Chart.defaults.global,
|
||||||
|
itemOrDefault = helpers.getValueOrDefault,
|
||||||
|
fontSize = itemOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize),
|
||||||
|
fontStyle = itemOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle),
|
||||||
|
fontFamily = itemOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily),
|
||||||
|
labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);
|
||||||
|
|
||||||
|
// Reset hit boxes
|
||||||
|
var hitboxes = this.legendHitBoxes = [];
|
||||||
|
|
||||||
|
var minSize = this.minSize;
|
||||||
|
var isHorizontal = this.isHorizontal();
|
||||||
|
|
||||||
|
if (isHorizontal) {
|
||||||
|
minSize.width = this.maxWidth; // fill all the width
|
||||||
|
minSize.height = display ? 10 : 0;
|
||||||
|
} else {
|
||||||
|
minSize.width = display ? 10 : 0;
|
||||||
|
minSize.height = this.maxHeight; // fill all the height
|
||||||
|
}
|
||||||
|
|
||||||
|
// Increase sizes here
|
||||||
|
if (display) {
|
||||||
|
if (isHorizontal) {
|
||||||
|
// Labels
|
||||||
|
|
||||||
|
// Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one
|
||||||
|
var lineWidths = this.lineWidths = [0];
|
||||||
|
var totalHeight = this.legendItems.length ? fontSize + (labelOpts.padding) : 0;
|
||||||
|
|
||||||
|
ctx.textAlign = "left";
|
||||||
|
ctx.textBaseline = 'top';
|
||||||
|
ctx.font = labelFont;
|
||||||
|
|
||||||
|
helpers.each(this.legendItems, function(legendItem, i) {
|
||||||
|
var width = labelOpts.boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
|
||||||
|
if (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= this.width) {
|
||||||
|
totalHeight += fontSize + (labelOpts.padding);
|
||||||
|
lineWidths[lineWidths.length] = this.left;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store the hitbox width and height here. Final position will be updated in `draw`
|
||||||
|
hitboxes[i] = {
|
||||||
|
left: 0,
|
||||||
|
top: 0,
|
||||||
|
width: width,
|
||||||
|
height: fontSize
|
||||||
|
};
|
||||||
|
|
||||||
|
lineWidths[lineWidths.length - 1] += width + labelOpts.padding;
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
minSize.height += totalHeight;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// TODO vertical
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.width = minSize.width;
|
||||||
|
this.height = minSize.height;
|
||||||
|
},
|
||||||
|
afterFit: noop,
|
||||||
|
|
||||||
|
// Shared Methods
|
||||||
|
isHorizontal: function() {
|
||||||
|
return this.options.position === "top" || this.options.position === "bottom";
|
||||||
|
},
|
||||||
|
|
||||||
|
// Actualy draw the legend on the canvas
|
||||||
|
draw: function() {
|
||||||
|
var opts = this.options;
|
||||||
|
var labelOpts = opts.labels;
|
||||||
|
var globalDefault = Chart.defaults.global,
|
||||||
|
lineDefault = globalDefault.elements.line,
|
||||||
|
legendWidth = this.width,
|
||||||
|
lineWidths = this.lineWidths;
|
||||||
|
|
||||||
|
if (opts.display) {
|
||||||
|
var ctx = this.ctx,
|
||||||
|
cursor = {
|
||||||
|
x: this.left + ((legendWidth - lineWidths[0]) / 2),
|
||||||
|
y: this.top + labelOpts.padding,
|
||||||
|
line: 0
|
||||||
|
},
|
||||||
|
itemOrDefault = helpers.getValueOrDefault,
|
||||||
|
fontColor = itemOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor),
|
||||||
|
fontSize = itemOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize),
|
||||||
|
fontStyle = itemOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle),
|
||||||
|
fontFamily = itemOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily),
|
||||||
|
labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);
|
||||||
|
|
||||||
|
// Horizontal
|
||||||
|
if (this.isHorizontal()) {
|
||||||
|
// Labels
|
||||||
|
ctx.textAlign = "left";
|
||||||
|
ctx.textBaseline = 'top';
|
||||||
|
ctx.lineWidth = 0.5;
|
||||||
|
ctx.strokeStyle = fontColor; // for strikethrough effect
|
||||||
|
ctx.fillStyle = fontColor; // render in correct colour
|
||||||
|
ctx.font = labelFont;
|
||||||
|
|
||||||
|
var boxWidth = labelOpts.boxWidth,
|
||||||
|
hitboxes = this.legendHitBoxes;
|
||||||
|
|
||||||
|
helpers.each(this.legendItems, function(legendItem, i) {
|
||||||
|
var textWidth = ctx.measureText(legendItem.text).width,
|
||||||
|
width = boxWidth + (fontSize / 2) + textWidth,
|
||||||
|
x = cursor.x,
|
||||||
|
y = cursor.y;
|
||||||
|
|
||||||
|
if (x + width >= legendWidth) {
|
||||||
|
y = cursor.y += fontSize + (labelOpts.padding);
|
||||||
|
cursor.line++;
|
||||||
|
x = cursor.x = this.left + ((legendWidth - lineWidths[cursor.line]) / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the ctx for the box
|
||||||
|
ctx.save();
|
||||||
|
|
||||||
|
ctx.fillStyle = itemOrDefault(legendItem.fillStyle, globalDefault.defaultColor);
|
||||||
|
ctx.lineCap = itemOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);
|
||||||
|
ctx.lineDashOffset = itemOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);
|
||||||
|
ctx.lineJoin = itemOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);
|
||||||
|
ctx.lineWidth = itemOrDefault(legendItem.lineWidth, lineDefault.borderWidth);
|
||||||
|
ctx.strokeStyle = itemOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);
|
||||||
|
|
||||||
|
if (ctx.setLineDash) {
|
||||||
|
// IE 9 and 10 do not support line dash
|
||||||
|
ctx.setLineDash(itemOrDefault(legendItem.lineDash, lineDefault.borderDash));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw the box
|
||||||
|
ctx.strokeRect(x, y, boxWidth, fontSize);
|
||||||
|
ctx.fillRect(x, y, boxWidth, fontSize);
|
||||||
|
|
||||||
|
ctx.restore();
|
||||||
|
|
||||||
|
hitboxes[i].left = x;
|
||||||
|
hitboxes[i].top = y;
|
||||||
|
|
||||||
|
// Fill the actual label
|
||||||
|
ctx.fillText(legendItem.text, boxWidth + (fontSize / 2) + x, y);
|
||||||
|
|
||||||
|
if (legendItem.hidden) {
|
||||||
|
// Strikethrough the text if hidden
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.lineWidth = 2;
|
||||||
|
ctx.moveTo(boxWidth + (fontSize / 2) + x, y + (fontSize / 2));
|
||||||
|
ctx.lineTo(boxWidth + (fontSize / 2) + x + textWidth, y + (fontSize / 2));
|
||||||
|
ctx.stroke();
|
||||||
|
}
|
||||||
|
|
||||||
|
cursor.x += width + (labelOpts.padding);
|
||||||
|
}, this);
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Handle an event
|
||||||
|
handleEvent: function(e) {
|
||||||
|
var position = helpers.getRelativePosition(e, this.chart.chart),
|
||||||
|
x = position.x,
|
||||||
|
y = position.y,
|
||||||
|
opts = this.options;
|
||||||
|
|
||||||
|
if (x >= this.left && x <= this.right && y >= this.top && y <= this.bottom) {
|
||||||
|
// See if we are touching one of the dataset boxes
|
||||||
|
var lh = this.legendHitBoxes;
|
||||||
|
for (var i = 0; i < lh.length; ++i) {
|
||||||
|
var hitBox = lh[i];
|
||||||
|
|
||||||
|
if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {
|
||||||
|
// Touching an element
|
||||||
|
if (opts.onClick) {
|
||||||
|
opts.onClick.call(this, e, this.legendItems[i]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
61
public/vendors/Chart.js/src/core/core.plugin.js
vendored
Normal file
61
public/vendors/Chart.js/src/core/core.plugin.js
vendored
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function(Chart) {
|
||||||
|
var helpers = Chart.helpers;
|
||||||
|
|
||||||
|
// Plugins are stored here
|
||||||
|
Chart.plugins = [];
|
||||||
|
Chart.pluginService = {
|
||||||
|
// Register a new plugin
|
||||||
|
register: function(plugin) {
|
||||||
|
var p = Chart.plugins;
|
||||||
|
if (p.indexOf(plugin) === -1) {
|
||||||
|
p.push(plugin);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Remove a registered plugin
|
||||||
|
remove: function(plugin) {
|
||||||
|
var p = Chart.plugins;
|
||||||
|
var idx = p.indexOf(plugin);
|
||||||
|
if (idx !== -1) {
|
||||||
|
p.splice(idx, 1);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Iterate over all plugins
|
||||||
|
notifyPlugins: function(method, args, scope) {
|
||||||
|
helpers.each(Chart.plugins, function(plugin) {
|
||||||
|
if (plugin[method] && typeof plugin[method] === 'function') {
|
||||||
|
plugin[method].apply(scope, args);
|
||||||
|
}
|
||||||
|
}, scope);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var noop = helpers.noop;
|
||||||
|
Chart.PluginBase = Chart.Element.extend({
|
||||||
|
// Plugin methods. All functions are passed the chart instance
|
||||||
|
|
||||||
|
// Called at start of chart init
|
||||||
|
beforeInit: noop,
|
||||||
|
|
||||||
|
// Called at end of chart init
|
||||||
|
afterInit: noop,
|
||||||
|
|
||||||
|
// Called at start of update
|
||||||
|
beforeUpdate: noop,
|
||||||
|
|
||||||
|
// Called at end of update
|
||||||
|
afterUpdate: noop,
|
||||||
|
|
||||||
|
// Called at start of draw
|
||||||
|
beforeDraw: noop,
|
||||||
|
|
||||||
|
// Called at end of draw
|
||||||
|
afterDraw: noop,
|
||||||
|
|
||||||
|
// Called during destroy
|
||||||
|
destroy: noop
|
||||||
|
});
|
||||||
|
};
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user