moving table config into data attributes
This commit is contained in:
Родитель
e8a05ad932
Коммит
3d1655e50e
|
@ -4,21 +4,21 @@
|
|||
<div class="featured">
|
||||
<div class="featured-inner">
|
||||
<div class="featured-body tabular">
|
||||
<table class="stats-overview"><thead>
|
||||
<table class="stats-aggregate"><thead>
|
||||
<tr><th>{{_('Category')}}</th><th>Last 7 Days</th><th>7-14 Days Ago</th><th>{{_('All Time')}}</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="label">{{_('Total Downloads')}}</td>
|
||||
<td class="value"><span class="value" id="sum_range"></span><span class="change" id="sum_diff"></span></td>
|
||||
<td class="value"><span class="value" id="sum_prev_range"></span><span class="change" id="sum_prev_diff"></span></td>
|
||||
<td class="value"><span class="value" id="sum_all_time"></span><span class="change"> </span></td>
|
||||
<td class="value"><span class="value aggregate" id="sum_range"></span><span class="change" id="sum_diff"></span></td>
|
||||
<td class="value"><span class="value aggregate" id="sum_prev_range"></span><span class="change" id="sum_prev_diff"></span></td>
|
||||
<td class="value"><span class="value aggregate" id="sum_all_time"></span><span class="change"> </span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">{{_('Average Downloads/Day')}}</td>
|
||||
<td class="value"><span class="value" id="mean_range"></span><span class="change" id="mean_diff"></span></td>
|
||||
<td class="value"><span class="value" id="mean_prev_range"></span><span class="change" id="mean_prev_diff"></span></td>
|
||||
<td class="value"><span class="value" id="mean_all_time"></span><span class="change"> </span></td>
|
||||
<td class="value"><span class="value aggregate" id="mean_range"></span><span class="change" id="mean_diff"></span></td>
|
||||
<td class="value"><span class="value aggregate" id="mean_prev_range"></span><span class="change" id="mean_prev_diff"></span></td>
|
||||
<td class="value"><span class="value aggregate" id="mean_all_time"></span><span class="change"> </span></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
</div>
|
||||
|
@ -27,41 +27,23 @@
|
|||
<h3>{{_('Downloads by Date')}}</h3>
|
||||
<div class="statbox">
|
||||
<div class="tabular">
|
||||
<table class="bar-table">
|
||||
<table class="csv-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th
|
||||
data-field="date"
|
||||
data-format="date">
|
||||
{{_('Date')}}
|
||||
</th>
|
||||
<th
|
||||
data-field="count"
|
||||
data-format="number"
|
||||
data-bar_column="true"
|
||||
data-bar_width="65%">
|
||||
{{_('Count')}}
|
||||
</th>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block chartconfig %}
|
||||
<script>
|
||||
AMO.csvTableConfig = {
|
||||
el: $("table.bar-table")[0],
|
||||
report: "{{ report }}",
|
||||
columns: [{
|
||||
label: "{{_('Date')}}",
|
||||
field: 'date',
|
||||
format: function (value) {
|
||||
return Highcharts.dateFormat('%a, %b %e, %Y', new Date(value));
|
||||
}
|
||||
},
|
||||
{
|
||||
label: "{{_('Count')}}",
|
||||
field: 'count',
|
||||
format: function (value) {
|
||||
return Highcharts.numberFormat(value, 0);
|
||||
}
|
||||
}],
|
||||
barColumns: [{
|
||||
valueColumn: 2,
|
||||
barColor: '#26a2ce',
|
||||
className: 'bar',
|
||||
width: "65%"
|
||||
}]
|
||||
};
|
||||
AMO.aggregate_stats_field = {
|
||||
metric: "downloads",
|
||||
name: "count"
|
||||
};
|
||||
</script>
|
||||
{% endblock %}
|
|
@ -45,7 +45,10 @@
|
|||
Notable Stats and tips will go here.
|
||||
</aside>
|
||||
</div>
|
||||
<div class="primary statistics">
|
||||
<div class="primary statistics"
|
||||
data-report="{{ report }}"
|
||||
data-addon_id="{{ addon.id }}"
|
||||
>
|
||||
{% if true %}
|
||||
<div class="custom criteria hidden">
|
||||
<form>
|
||||
|
@ -80,15 +83,8 @@
|
|||
{% block js %}
|
||||
<script>
|
||||
(function () {
|
||||
var addon_id = {{ addon.id }};
|
||||
var stats_base_url = '{{ stats_base_url }}/';
|
||||
var reportName = '{{ report }}';
|
||||
AMO.getAddonId = function () { return addon_id };
|
||||
AMO.getStatsBaseURL = function () { return stats_base_url };
|
||||
AMO.getReportName = function () { return reportName };
|
||||
AMO.getSeriesList = function () {
|
||||
return AMO.seriesList || {"metric" : reportName, fields : ["count"]};
|
||||
};
|
||||
})();
|
||||
</script>
|
||||
{% block chartconfig %}
|
||||
|
|
|
@ -310,34 +310,34 @@ background:#003595;
|
|||
* bar-chart tables
|
||||
**/
|
||||
|
||||
.bar-table tbody {
|
||||
.csv-table tbody {
|
||||
display: none;
|
||||
}
|
||||
.bar-table tbody.selected {
|
||||
.csv-table tbody.selected {
|
||||
display: table-row-group;
|
||||
}
|
||||
|
||||
table.bar-table {
|
||||
table.csv-table {
|
||||
width: 100%;
|
||||
}
|
||||
table.bar-table td,
|
||||
table.bar-table th {
|
||||
table.csv-table td,
|
||||
table.csv-table th {
|
||||
text-align: right;
|
||||
}
|
||||
table.bar-table td.bar div {
|
||||
table.csv-table td.bar div {
|
||||
text-align: right;
|
||||
margin: 8px 0;
|
||||
line-height: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
table.bar-table td.bar,
|
||||
table.bar-table th.bar {
|
||||
table.csv-table td.bar,
|
||||
table.csv-table th.bar {
|
||||
border-left: 1px solid #8db9c7;
|
||||
padding: 0;
|
||||
}
|
||||
table.bar-table td:first-child,
|
||||
table.bar-table th:first-child {
|
||||
table.csv-table td:first-child,
|
||||
table.csv-table th:first-child {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
|
@ -357,37 +357,37 @@ aside.highlight {
|
|||
* Big table
|
||||
**/
|
||||
|
||||
table.stats-overview {
|
||||
table.stats-aggregate {
|
||||
width: 100%;
|
||||
margin-top: .5em;
|
||||
}
|
||||
|
||||
table.stats-overview thead th {
|
||||
table.stats-aggregate thead th {
|
||||
text-align: right;
|
||||
padding-right: 72px;
|
||||
line-height: 90%;
|
||||
}
|
||||
|
||||
table.stats-overview thead th:first-child {
|
||||
table.stats-aggregate thead th:first-child {
|
||||
text-align: left;
|
||||
padding-right: inherit;
|
||||
}
|
||||
|
||||
table.stats-overview tbody td {
|
||||
table.stats-aggregate tbody td {
|
||||
line-height: 120%;
|
||||
font-size: 140%;
|
||||
}
|
||||
|
||||
table.stats-overview tbody td.value {
|
||||
table.stats-aggregate tbody td.value {
|
||||
padding: 5px 0 3 0px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
table.stats-overview tbody td.label {
|
||||
table.stats-aggregate tbody td.label {
|
||||
padding-left: 2px;
|
||||
}
|
||||
|
||||
table.stats-overview tbody span.change {
|
||||
table.stats-aggregate tbody span.change {
|
||||
display: block;
|
||||
float: right;
|
||||
width: 54px;
|
||||
|
@ -397,10 +397,10 @@ table.stats-overview tbody span.change {
|
|||
padding-top: 2px;
|
||||
}
|
||||
|
||||
table.stats-overview tbody span.change.plus {
|
||||
table.stats-aggregate tbody span.change.plus {
|
||||
color: #00774d;
|
||||
}
|
||||
table.stats-overview tbody span.change.minus {
|
||||
table.stats-aggregate tbody span.change.minus {
|
||||
color: #850000;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +1,98 @@
|
|||
// (function () {
|
||||
$(document).ready(function () {
|
||||
|
||||
jQuery.fn.getData = function(name) {
|
||||
return this.attr("data-" + name);
|
||||
};
|
||||
|
||||
var addon_id = $(".primary").getData("addon_id");
|
||||
var reportName = $(".primary").getData("report");
|
||||
AMO.getAddonId = function () { return addon_id };
|
||||
AMO.getReportName = function () { return reportName };
|
||||
AMO.getSeriesList = function () {
|
||||
return AMO.seriesList || {"metric" : reportName, fields : ["count"]};
|
||||
};
|
||||
|
||||
t.go();
|
||||
|
||||
AMO.StatsManager.init();
|
||||
|
||||
t.lap("StatsManager init");
|
||||
|
||||
var report = AMO.getReportName();
|
||||
|
||||
$("#date-range-start").datepicker();
|
||||
$("#date-range-end").datepicker();
|
||||
|
||||
t.lap("datepicker init");
|
||||
|
||||
var rangeMenu = $(".criteria.range ul");
|
||||
|
||||
rangeMenu.click(function(e) {
|
||||
var $target = $(e.target).parent();
|
||||
var newRange = $target.attr("data-range");
|
||||
var $customRangeForm = $("div.custom.criteria");
|
||||
|
||||
if (newRange) {
|
||||
$(this).children("li.selected").removeClass("selected");
|
||||
$target.addClass("selected");
|
||||
|
||||
if (newRange == "custom") {
|
||||
$customRangeForm.removeClass("hidden").slideDown('fast');
|
||||
} else {
|
||||
$customRangeForm.slideUp('fast');
|
||||
AMO.StatsManager.getSeries(AMO.getSeriesList(), newRange, updateSeries);
|
||||
}
|
||||
}
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
$("#date-range-submit").click(function(e) {
|
||||
var start = new Date($("#date-range-start").val());
|
||||
var end = new Date($("#date-range-end").val());
|
||||
|
||||
range = {
|
||||
custom: true,
|
||||
start: start,
|
||||
end: end
|
||||
};
|
||||
|
||||
generateSeries(report, range, updateSeries);
|
||||
});
|
||||
|
||||
t.lap("events init");
|
||||
|
||||
var csv_table_el = $(".csv-table");
|
||||
if (csv_table_el.length) {
|
||||
csvTable = new PageTable(csv_table_el[0]);
|
||||
}
|
||||
|
||||
t.lap("csvtable init");
|
||||
|
||||
|
||||
LoadBar.on("Loading the latest data…");
|
||||
//Get initial dataset
|
||||
if (datastore[report] && datastore[report].maxdate) {
|
||||
var fetchStart = datastore[report].maxdate - millis("1 day");
|
||||
} else {
|
||||
var fetchStart = ago("30 days");
|
||||
}
|
||||
AMO.StatsManager._fetchData(report, fetchStart, today(), function () {
|
||||
if (AMO.aggregate_stats_field) {
|
||||
show_aggregate_stats(AMO.aggregate_stats_field, 30);
|
||||
}
|
||||
AMO.StatsManager.getSeries(AMO.getSeriesList(), "30 days", initCharts);
|
||||
LoadBar.off();
|
||||
csvTable.gotoPage(1);
|
||||
});
|
||||
|
||||
//initTopCharts();
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
var mainChart;
|
||||
|
||||
var _seriesCache = {};
|
||||
|
||||
function dayFormatter(x) { return Highcharts.dateFormat('%a, %b %e, %Y', x); }
|
||||
function weekFormatter(x) { return Highcharts.dateFormat('%b %e - ', x) + Highcharts.dateFormat('%b %e, %Y', x+7*24*60*60*1000); }
|
||||
function monthFormatter(x) { return Highcharts.dateFormat('%B %Y', x); }
|
||||
|
@ -121,84 +210,6 @@
|
|||
}
|
||||
|
||||
|
||||
$(document).ready(function () {
|
||||
|
||||
t.go();
|
||||
|
||||
AMO.StatsManager.init();
|
||||
|
||||
t.lap("StatsManager init");
|
||||
|
||||
var report = AMO.getReportName();
|
||||
|
||||
$("#date-range-start").datepicker();
|
||||
$("#date-range-end").datepicker();
|
||||
|
||||
t.lap("datepicker init");
|
||||
|
||||
var rangeMenu = $(".criteria.range ul");
|
||||
|
||||
rangeMenu.click(function(e) {
|
||||
var $target = $(e.target).parent();
|
||||
var newRange = $target.attr("data-range");
|
||||
var $customRangeForm = $("div.custom.criteria");
|
||||
|
||||
if (newRange) {
|
||||
$(this).children("li.selected").removeClass("selected");
|
||||
$target.addClass("selected");
|
||||
|
||||
if (newRange == "custom") {
|
||||
$customRangeForm.removeClass("hidden").slideDown('fast');
|
||||
} else {
|
||||
$customRangeForm.slideUp('fast');
|
||||
AMO.StatsManager.getSeries(AMO.getSeriesList(), newRange, updateSeries);
|
||||
}
|
||||
}
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
$("#date-range-submit").click(function(e) {
|
||||
var start = new Date($("#date-range-start").val());
|
||||
var end = new Date($("#date-range-end").val());
|
||||
|
||||
range = {
|
||||
custom: true,
|
||||
start: start,
|
||||
end: end
|
||||
};
|
||||
|
||||
generateSeries(report, range, updateSeries);
|
||||
});
|
||||
|
||||
t.lap("events init");
|
||||
|
||||
|
||||
if (AMO.csvTableConfig) {
|
||||
csvTable = new PageTable(AMO.csvTableConfig);
|
||||
}
|
||||
|
||||
t.lap("csvtable init");
|
||||
|
||||
|
||||
LoadBar.on("Loading the latest data…");
|
||||
//Get initial dataset
|
||||
if (datastore[report] && datastore[report].maxdate) {
|
||||
var fetchStart = datastore[report].maxdate - millis("1 day");
|
||||
} else {
|
||||
var fetchStart = ago("30 days");
|
||||
}
|
||||
AMO.StatsManager._fetchData(report, fetchStart, today(), function () {
|
||||
if (AMO.aggregate_stats_field) {
|
||||
show_aggregate_stats(AMO.aggregate_stats_field, 30);
|
||||
}
|
||||
AMO.StatsManager.getSeries(AMO.getSeriesList(), "30 days", initCharts);
|
||||
LoadBar.off();
|
||||
csvTable.gotoPage(1);
|
||||
});
|
||||
|
||||
//initTopCharts();
|
||||
|
||||
});
|
||||
|
||||
// })();
|
||||
|
||||
|
|
|
@ -7,9 +7,8 @@
|
|||
**/
|
||||
|
||||
|
||||
function PageTable(_cfg) {
|
||||
this.tableEl = $(_cfg.el);
|
||||
this.thead = $("<thead></thead>");
|
||||
function PageTable(_el) {
|
||||
this.tableEl = $(_el);
|
||||
this.paginator = {
|
||||
ol: $("<ol class='pagination'></ol>"),
|
||||
li: [],
|
||||
|
@ -20,22 +19,40 @@ function PageTable(_cfg) {
|
|||
};
|
||||
this.pages = [];
|
||||
this.currentpage = 0;
|
||||
this.columns = _cfg.columns;
|
||||
this.report = _cfg.report;
|
||||
this._cfg = _cfg;
|
||||
this.page_size = _cfg.page_size || 14;
|
||||
|
||||
//Make a header if necessary
|
||||
|
||||
var tr = $("<tr></tr>");
|
||||
for (var i=0; i<this.columns.length; i++) {
|
||||
var col = this.columns[i];
|
||||
tr.append("<th>" + col.label + "</th>");
|
||||
}
|
||||
|
||||
this.thead.append(tr);
|
||||
this.tableEl.append(this.thead);
|
||||
|
||||
this.format = {
|
||||
date: function (value) {
|
||||
return Highcharts.dateFormat('%a, %b %e, %Y', new Date(value));
|
||||
},
|
||||
number: function (value) {
|
||||
return Highcharts.numberFormat(value, 0);
|
||||
}
|
||||
};
|
||||
|
||||
var $th = $("thead th", this.tableEl);
|
||||
|
||||
var columns = [];
|
||||
var barColumns = [];
|
||||
$th.each(function (i, v) {
|
||||
$v = $(v);
|
||||
var col = {};
|
||||
col.field = $v.getData("field");
|
||||
col.format = $v.getData("format");
|
||||
if ($v.getData("bar_column")) {
|
||||
barColumns.push({
|
||||
valueColumn: i+1,
|
||||
barColor: '#26a2ce',
|
||||
className: 'bar',
|
||||
width: $v.getData("bar_width")
|
||||
});
|
||||
}
|
||||
columns.push(col);
|
||||
})
|
||||
this.columns = columns;
|
||||
|
||||
this.report = AMO.getReportName();
|
||||
this.page_size = 14;
|
||||
|
||||
//Set up paginator
|
||||
|
||||
this.paginator.ol.append(this.paginator.prev_li);
|
||||
|
@ -56,17 +73,18 @@ function PageTable(_cfg) {
|
|||
|
||||
//Set up a BarTable if needed
|
||||
|
||||
if (_cfg.barColumns) {
|
||||
dbg(barColumns);
|
||||
|
||||
if (barColumns.length) {
|
||||
this.barTable = new BarTable({
|
||||
el: this.tableEl,
|
||||
columns: _cfg.barColumns
|
||||
columns: barColumns
|
||||
})
|
||||
}
|
||||
}
|
||||
PageTable.prototype.gotoPage = function(num) {
|
||||
this.tableEl.parent().addClass("loading");
|
||||
if (this.pages[num]) {
|
||||
dbg(num);
|
||||
if (num > 0) {
|
||||
$("tbody.selected", this.tableEl).removeClass("selected");
|
||||
$("li.selected", this.paginator.ol).removeClass("selected");
|
||||
|
@ -112,9 +130,9 @@ PageTable.prototype.addPage = function (data) {
|
|||
for (var c=0; c<this.columns.length; c++) {
|
||||
col = this.columns[c];
|
||||
val = AMO.StatsManager.getField(row, col.field);
|
||||
attr = " value='" + val + "'";
|
||||
attr = " data-value='" + val + "'";
|
||||
if (col.format) {
|
||||
val = col.format(val);
|
||||
val = this.format[col.format](val);
|
||||
}
|
||||
page.push('<td', attr, '>', val, '</td>');
|
||||
}
|
||||
|
@ -131,6 +149,8 @@ PageTable.prototype.addPage = function (data) {
|
|||
|
||||
t.lap('done page');
|
||||
|
||||
console.log(page.html());
|
||||
|
||||
this.pages[data.page] = page;
|
||||
this.tableEl.append(page);
|
||||
if (this.barTable) {
|
||||
|
@ -204,8 +224,8 @@ BarTable.prototype.render = function(tbody) {
|
|||
for (var j=0; j<tds.length; j++) {
|
||||
if ($.inArray(j,ignore) < 0) {
|
||||
var td = $(tds[j]);
|
||||
if (td.attr('value')) {
|
||||
var val = parseFloat(td.attr('value'));
|
||||
if (td.getData('value')) {
|
||||
var val = parseFloat(td.getData('value'));
|
||||
} else {
|
||||
var val = parseFloat(td.text());
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче