private function generateFavorites()
{
$baseHTML = $this->getBasedPage('favorites_dashboard');
$analyzers = Analyzer::getThemeAnalyzers('Preferences');
$donut = array();
$html = array();
foreach ($analyzers as $analyzer) {
$list = $this->datastore->getHashAnalyzer($analyzer);
$table = '';
$values = '';
$object = Analyzer::getInstance($analyzer);
$name = $object->getDescription()->getName();
$total = 0;
foreach ($list as $key => $value) {
$table .= '
<div class="clearfix">
<div class="block-cell">' . htmlentities($key, ENT_COMPAT | ENT_HTML401, 'UTF-8') . '</div>
<div class="block-cell text-center">' . $value . '</div>
</div>
';
$values[] = '{label:"' . $key . '", value:' . $value . '}';
$total += $value;
}
$nb = 4 - count($list);
for ($i = 0; $i < $nb; ++$i) {
$table .= '
<div class="clearfix">
<div class="block-cell"> </div>
<div class="block-cell text-center"> </div>
</div>
';
}
// Ignore if we have no occurrences
if ($total === 0) {
continue;
}
$values = implode(', ', $values);
$html[] = <<<HTML
<div class="col-md-3">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">{$name}</h3>
</div>
<div class="box-body chart-responsive">
<div id="donut-chart_{$name}"></div>
<div class="clearfix">
<div class="block-cell bold">Number</div>
<div class="block-cell bold text-center">Count</div>
</div>
{$table}
</div>
<!-- /.box-body -->
</div>
</div>
HTML;
if (count($html) % 4 === 0) {
$html[] = ' </div>
<div class="row">';
}
$donut[] = <<<JAVASCRIPT
Morris.Donut({
element: 'donut-chart_{$name}',
resize: true,
colors: ["#3c8dbc", "#f56954", "#00a65a", "#1424b8"],
data: [{$values}]
});
JAVASCRIPT;
}
$donut = implode("\n", $donut);
$donut = <<<JAVASCRIPT
<script>
\$(document).ready(function() {
{$donut}
Highcharts.theme = {
colors: ["#F56954", "#f7a35c", "#ffea6f", "#D2D6DE"],
chart: {
backgroundColor: null,
style: {
fontFamily: "Dosis, sans-serif"
}
},
title: {
style: {
fontSize: '16px',
fontWeight: 'bold',
textTransform: 'uppercase'
}
},
tooltip: {
borderWidth: 0,
backgroundColor: 'rgba(219,219,216,0.8)',
shadow: false
},
legend: {
itemStyle: {
fontWeight: 'bold',
fontSize: '13px'
}
},
xAxis: {
gridLineWidth: 1,
labels: {
style: {
fontSize: '12px'
}
}
},
yAxis: {
minorTickInterval: 'auto',
title: {
style: {
textTransform: 'uppercase'
}
},
labels: {
style: {
fontSize: '12px'
}
}
},
plotOptions: {
candlestick: {
lineColor: '#404048'
}
},
// General
background2: '#F0F0EA'
};
// Apply the theme
Highcharts.setOptions(Highcharts.theme);
\$('#filename').highcharts({
credits: {
enabled: false
},
exporting: {
enabled: false
},
chart: {
type: 'column'
},
title: {
text: ''
},
xAxis: {
categories: [SCRIPTDATAFILES]
},
yAxis: {
min: 0,
title: {
text: ''
},
stackLabels: {
enabled: false,
style: {
fontWeight: 'bold',
color: (Highcharts.theme && Highcharts.theme.textColor) || 'gray'
}
}
},
legend: {
align: 'right',
x: 0,
verticalAlign: 'top',
y: -10,
floating: false,
backgroundColor: (Highcharts.theme && Highcharts.theme.background2) || 'white',
borderColor: '#CCC',
borderWidth: 1,
shadow: false
},
tooltip: {
headerFormat: '<b>{point.x}</b><br/>',
pointFormat: '{series.name}: {point.y}<br/>Total: {point.stackTotal}'
},
plotOptions: {
column: {
stacking: 'normal',
dataLabels: {
enabled: false,
color: (Highcharts.theme && Highcharts.theme.dataLabelsColor) || 'white',
style: {
textShadow: '0 0 3px black'
}
}
}
},
series: [{
name: 'Critical',
data: [SCRIPTDATACRITICAL]
}, {
name: 'Major',
data: [SCRIPTDATAMAJOR]
}, {
name: 'Minor',
data: [SCRIPTDATAMINOR]
}, {
name: 'None',
data: [SCRIPTDATANONE]
}]
});
\$('#container').highcharts({
credits: {
enabled: false
},
exporting: {
enabled: false
},
chart: {
type: 'column'
},
title: {
text: ''
},
xAxis: {
categories: [SCRIPTDATAANALYZERLIST]
},
yAxis: {
min: 0,
title: {
text: ''
},
stackLabels: {
enabled: false,
style: {
fontWeight: 'bold',
color: (Highcharts.theme && Highcharts.theme.textColor) || 'gray'
}
}
},
legend: {
align: 'right',
x: 0,
verticalAlign: 'top',
y: -10,
floating: false,
backgroundColor: (Highcharts.theme && Highcharts.theme.background2) || 'white',
borderColor: '#CCC',
borderWidth: 1,
shadow: false
},
tooltip: {
headerFormat: '<b>{point.x}</b><br/>',
pointFormat: '{series.name}: {point.y}<br/>Total: {point.stackTotal}'
},
plotOptions: {
column: {
stacking: 'normal',
dataLabels: {
enabled: false,
color: (Highcharts.theme && Highcharts.theme.dataLabelsColor) || 'white',
style: {
textShadow: '0 0 3px black'
}
}
}
},
series: [{
name: 'Critical',
data: [SCRIPTDATAANALYZERCRITICAL]
}, {
name: 'Major',
data: [SCRIPTDATAANALYZERMAJOR]
}, {
name: 'Minor',
data: [SCRIPTDATAANALYZERMINOR]
}, {
name: 'None',
data: [SCRIPTDATAANALYZERNONE]
}]
});
});
</script>
JAVASCRIPT;
$html = '<div class="row">' . implode("\n", $html) . '</div>';
$baseHTML = $this->injectBloc($baseHTML, "FAVORITES", $html);
$baseHTML = $this->injectBloc($baseHTML, "BLOC-JS", $donut);
$this->putBasedPage('favorites_dashboard', $baseHTML);
$baseHTML = $this->getBasedPage('favorites_issues');
$preferencesJson = implode(', ', $this->getIssuesFaceted('Preferences'));
$blocjs = <<<JAVASCRIPT
<script src="facetedsearch.js"></script>
<script>
"use strict";
\$(document).ready(function() {
var data_items = [{$preferencesJson}];
var item_template =
'<tr>' +
'<td width="20%"><%= obj.analyzer %></td>' +
'<td width="20%"><%= obj.file + ":" + obj.line %></td>' +
'<td width="18%"><%= obj.code %></td>' +
'<td width="2%"><%= obj.code_detail %></td>' +
'<td width="7%" align="center"><%= obj.severity %></td>' +
'<td width="7%" align="center"><%= obj.complexity %></td>' +
'<td width="16%"><%= obj.recipe %></td>' +
'</tr>' +
'<tr class="fullcode">' +
'<td colspan="7" width="100%"><div class="analyzer_help"><%= obj.analyzer_help %></div><pre><code><%= obj.code_plus %></code><div class="text-right"><a target="_BLANK" href="codes.html?file=<%= obj.link_file %>" class="btn btn-info">View File</a></div></pre></td>' +
'</tr>';
var settings = {
items : data_items,
facets : {
'analyzer' : 'Analyzer',
'file' : 'File',
'severity' : 'Severity',
'complexity': 'Complexity',
'receipt' : 'Receipt'
},
facetContainer : '<div class="facetsearch btn-group" id=<%= id %> ></div>',
facetTitleTemplate : '<button class="facettitle multiselect dropdown-toggle btn btn-default" data-toggle="dropdown" title="None selected"><span class="multiselect-selected-text"><%= title %></span><b class="caret"></b></button>',
facetListContainer : '<ul class="facetlist multiselect-container dropdown-menu"></ul>',
listItemTemplate : '<li class=facetitem id="<%= id %>" data-analyzer="<%= data_analyzer %>" data-file="<%= data_file %>"><span class="check"></span><%= name %><span class=facetitemcount>(<%= count %>)</span></li>',
bottomContainer : '<div class=bottomline></div>',
resultSelector : '#results',
facetSelector : '#facets',
resultTemplate : item_template,
paginationCount : 50
}
\$.facetelize(settings);
var analyzerParam = window.location.search.split('analyzer=')[1];
var fileParam = window.location.search.split('file=')[1];
if(analyzerParam !== undefined) {
\$('#analyzer .facetlist').find("[data-analyzer='" + analyzerParam + "']").click();
}
if(fileParam !== undefined) {
\$('#file .facetlist').find("[data-file='" + fileParam + "']").click();
}
});
</script>
JAVASCRIPT;
$finalHTML = $this->injectBloc($baseHTML, 'BLOC-JS', $blocjs);
$this->putBasedPage('favorites_issues', $finalHTML);
}