update Piwik to version 2.16 (fixes #91)
This commit is contained in:
parent
296343bf3b
commit
d885a4baa9
5833 changed files with 418860 additions and 226988 deletions
142
www/analytics/plugins/Live/javascripts/SegmentedVisitorLog.js
Normal file
142
www/analytics/plugins/Live/javascripts/SegmentedVisitorLog.js
Normal file
|
|
@ -0,0 +1,142 @@
|
|||
var SegmentedVisitorLog = function() {
|
||||
|
||||
function getDataTableFromApiMethod(apiMethod)
|
||||
{
|
||||
var div = $(require('piwik/UI').DataTable.getDataTableByReport(apiMethod));
|
||||
if (div.size() > 0 && div.data('uiControlObject')) {
|
||||
return div.data('uiControlObject');
|
||||
}
|
||||
}
|
||||
|
||||
function getLabelFromTr ($tr, apiMethod) {
|
||||
var label;
|
||||
|
||||
if (apiMethod && 0 === apiMethod.indexOf('Actions.')) {
|
||||
// for now only use this for Actions... I know a hack :( Otherwise in Search Engines
|
||||
// it would show "http://www.searchenginename.org" instead of "SearchEngineName"
|
||||
label = $tr.attr('data-url-label');
|
||||
}
|
||||
|
||||
if (!label) {
|
||||
label = $tr.find('.label .value').text();
|
||||
}
|
||||
|
||||
if (label) {
|
||||
label = $.trim(label);
|
||||
}
|
||||
|
||||
return label;
|
||||
}
|
||||
|
||||
|
||||
function getDimensionFromApiMethod(apiMethod)
|
||||
{
|
||||
if (!apiMethod) {
|
||||
return;
|
||||
}
|
||||
|
||||
var dataTable = getDataTableFromApiMethod(apiMethod);
|
||||
var metadata = getMetadataFromDataTable(dataTable);
|
||||
|
||||
if (metadata && metadata.dimension) {
|
||||
return metadata.dimension;
|
||||
}
|
||||
}
|
||||
|
||||
function getMetadataFromDataTable(dataTable)
|
||||
{
|
||||
if (dataTable) {
|
||||
|
||||
return dataTable.getReportMetadata();
|
||||
}
|
||||
}
|
||||
|
||||
function findTitleOfRowHavingRawSegmentValue(apiMethod, rawSegmentValue)
|
||||
{
|
||||
var $tr = $('[data-report="' + apiMethod + '"] tr[data-segment-filter="' + rawSegmentValue + '"]').first();
|
||||
|
||||
return getLabelFromTr($tr, apiMethod);
|
||||
}
|
||||
|
||||
function setPopoverTitle(apiMethod, segment, index) {
|
||||
var dataTable = getDataTableFromApiMethod(apiMethod);
|
||||
|
||||
if (!dataTable) {
|
||||
if (index < 15) {
|
||||
// this is needed when the popover is opened before the dataTable is there which can often
|
||||
// happen when opening the popover directly via URL (broadcast.popoverHandler)
|
||||
setTimeout(function () {
|
||||
setPopoverTitle(apiMethod, segment, index + 1);
|
||||
}, 150);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
var segmentName = getDimensionFromApiMethod(apiMethod);
|
||||
var segmentValue = findTitleOfRowHavingRawSegmentValue(apiMethod, segment);
|
||||
|
||||
if (!segmentName || (segment && segment.indexOf(';') > 0)) {
|
||||
segmentName = _pk_translate('General_Segment');
|
||||
var segmentParts = segment.split(';');
|
||||
segmentValue = segmentParts.join(' ' + _pk_translate('General_And') + ' ');
|
||||
}
|
||||
|
||||
segmentName = piwikHelper.escape(segmentName);
|
||||
segmentName = piwikHelper.htmlEntities(segmentName);
|
||||
segmentValue = piwikHelper.escape(segmentValue);
|
||||
segmentValue = piwikHelper.htmlEntities(segmentValue);
|
||||
segmentName = segmentName.replace(/(&)(#[0-9]{2,5};)/g, '&$2');
|
||||
segmentValue = segmentValue.replace(/(&)(#[0-9]{2,5};)/g, '&$2');
|
||||
|
||||
var title = _pk_translate('Live_SegmentedVisitorLogTitle', [segmentName, segmentValue]);
|
||||
|
||||
Piwik_Popover.setTitle(title);
|
||||
}
|
||||
|
||||
function show(apiMethod, segment, extraParams) {
|
||||
|
||||
// open the popover
|
||||
var box = Piwik_Popover.showLoading('Segmented Visitor Log');
|
||||
box.addClass('segmentedVisitorLogPopover');
|
||||
|
||||
|
||||
var callback = function (html) {
|
||||
Piwik_Popover.setContent(html);
|
||||
|
||||
// remove title returned from the server
|
||||
var title = box.find('h2[piwik-enriched-headline]');
|
||||
var defaultTitle = title.text();
|
||||
|
||||
if (title.size() > 0) {
|
||||
title.remove();
|
||||
}
|
||||
|
||||
Piwik_Popover.setTitle(defaultTitle);
|
||||
|
||||
setPopoverTitle(apiMethod, segment, 0);
|
||||
};
|
||||
|
||||
// prepare loading the popover contents
|
||||
var requestParams = {
|
||||
module: 'Live',
|
||||
action: 'indexVisitorLog',
|
||||
segment: segment,
|
||||
disableLink: 1,
|
||||
small: 1,
|
||||
hideProfileLink: 1
|
||||
};
|
||||
|
||||
$.extend(requestParams, extraParams);
|
||||
|
||||
var ajaxRequest = new ajaxHelper();
|
||||
ajaxRequest.addParams(requestParams, 'get');
|
||||
ajaxRequest.setCallback(callback);
|
||||
ajaxRequest.setFormat('html');
|
||||
ajaxRequest.send(false);
|
||||
}
|
||||
|
||||
return {
|
||||
show: show
|
||||
}
|
||||
}();
|
||||
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*!
|
||||
* Piwik - Web Analytics
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
|
|
@ -82,7 +82,7 @@
|
|||
|
||||
if (that.isStarted) {
|
||||
window.clearTimeout(that.updateInterval);
|
||||
if ($(that.element).closest('body').length) {
|
||||
if (that.element.length && $.contains(document, that.element[0])) {
|
||||
that.updateInterval = window.setTimeout(function() { that._update() }, that.currentInterval);
|
||||
}
|
||||
}
|
||||
|
|
@ -188,6 +188,14 @@
|
|||
window.clearTimeout(this.updateInterval);
|
||||
},
|
||||
|
||||
/**
|
||||
* Return true in case widget is started.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
started: function() {
|
||||
return this.isStarted;
|
||||
},
|
||||
|
||||
/**
|
||||
* Set the interval for refresh
|
||||
*
|
||||
|
|
@ -200,11 +208,20 @@
|
|||
});
|
||||
})(jQuery);
|
||||
|
||||
|
||||
$(function() {
|
||||
var refreshWidget = function (element, refreshAfterXSecs) {
|
||||
// if the widget has been removed from the DOM, abort
|
||||
if ($(element).parent().length == 0) {
|
||||
if (!element.length || !$.contains(document, element[0])) {
|
||||
return;
|
||||
}
|
||||
|
||||
function scheduleAnotherRequest()
|
||||
{
|
||||
setTimeout(function () { refreshWidget(element, refreshAfterXSecs); }, refreshAfterXSecs * 1000);
|
||||
}
|
||||
|
||||
if (Visibility.hidden()) {
|
||||
scheduleAnotherRequest();
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -249,8 +266,7 @@ $(function() {
|
|||
? translations['one_minute'] : translations['minutes'].replace('%s', lastMinutes);
|
||||
$(metrics[2]).text(lastMinutesText);
|
||||
|
||||
// schedule another request
|
||||
setTimeout(function () { refreshWidget(element, refreshAfterXSecs); }, refreshAfterXSecs * 1000);
|
||||
scheduleAnotherRequest();
|
||||
});
|
||||
ajaxRequest.send(true);
|
||||
};
|
||||
|
|
@ -271,18 +287,48 @@ $(function() {
|
|||
};
|
||||
});
|
||||
|
||||
|
||||
var pauseImage = "plugins/Live/images/pause.gif";
|
||||
var pauseDisabledImage = "plugins/Live/images/pause_disabled.gif";
|
||||
var playImage = "plugins/Live/images/play.gif";
|
||||
var playDisabledImage = "plugins/Live/images/play_disabled.gif";
|
||||
function onClickPause() {
|
||||
$('#pauseImage').attr('src', pauseImage);
|
||||
$('#playImage').attr('src', playDisabledImage);
|
||||
$('#pauseImage').hide();
|
||||
$('#playImage').show();
|
||||
return $('#visitsLive').liveWidget('stop');
|
||||
}
|
||||
function onClickPlay() {
|
||||
$('#playImage').attr('src', playImage);
|
||||
$('#pauseImage').attr('src', pauseDisabledImage);
|
||||
$('#playImage').hide();
|
||||
$('#pauseImage').show();
|
||||
return $('#visitsLive').liveWidget('start');
|
||||
}
|
||||
|
||||
(function () {
|
||||
if (!Visibility.isSupported()) {
|
||||
return;
|
||||
}
|
||||
|
||||
var isStoppedByBlur = false;
|
||||
|
||||
function isStarted()
|
||||
{
|
||||
return $('#visitsLive').liveWidget('started');
|
||||
}
|
||||
|
||||
function onTabBlur() {
|
||||
if (isStarted()) {
|
||||
isStoppedByBlur = true;
|
||||
onClickPause();
|
||||
}
|
||||
}
|
||||
|
||||
function onTabFocus() {
|
||||
if (isStoppedByBlur && !isStarted()) {
|
||||
isStoppedByBlur = false;
|
||||
onClickPlay();
|
||||
}
|
||||
}
|
||||
|
||||
Visibility.change(function (event, state) {
|
||||
if (Visibility.hidden()) {
|
||||
onTabBlur();
|
||||
} else {
|
||||
onTabFocus();
|
||||
}
|
||||
});
|
||||
})();
|
||||
166
www/analytics/plugins/Live/javascripts/rowaction.js
Normal file
166
www/analytics/plugins/Live/javascripts/rowaction.js
Normal file
|
|
@ -0,0 +1,166 @@
|
|||
/*!
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* @link http://piwik.org
|
||||
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
||||
*/
|
||||
|
||||
/**
|
||||
* This file registers the Overlay row action on the pages report.
|
||||
*/
|
||||
|
||||
(function () {
|
||||
|
||||
var actionName = 'SegmentVisitorLog';
|
||||
|
||||
function getRawSegmentValueFromRow(tr)
|
||||
{
|
||||
return $(tr).attr('data-segment-filter');
|
||||
}
|
||||
|
||||
function getDataTableFromApiMethod(apiMethod)
|
||||
{
|
||||
var div = $(require('piwik/UI').DataTable.getDataTableByReport(apiMethod));
|
||||
if (div.size() > 0 && div.data('uiControlObject')) {
|
||||
return div.data('uiControlObject');
|
||||
}
|
||||
}
|
||||
|
||||
function getMetadataFromDataTable(dataTable)
|
||||
{
|
||||
if (dataTable) {
|
||||
|
||||
return dataTable.getReportMetadata();
|
||||
}
|
||||
}
|
||||
|
||||
function getDimensionFromApiMethod(apiMethod)
|
||||
{
|
||||
if (!apiMethod) {
|
||||
return;
|
||||
}
|
||||
|
||||
var dataTable = getDataTableFromApiMethod(apiMethod);
|
||||
var metadata = getMetadataFromDataTable(dataTable);
|
||||
|
||||
if (metadata && metadata.dimension) {
|
||||
return metadata.dimension;
|
||||
}
|
||||
}
|
||||
|
||||
function DataTable_RowActions_SegmentVisitorLog(dataTable) {
|
||||
this.dataTable = dataTable;
|
||||
this.actionName = actionName;
|
||||
|
||||
// has to be overridden in subclasses
|
||||
this.trEventName = 'piwikTriggerSegmentVisitorLogAction';
|
||||
}
|
||||
|
||||
DataTable_RowActions_SegmentVisitorLog.prototype = new DataTable_RowAction();
|
||||
|
||||
DataTable_RowActions_SegmentVisitorLog.prototype.openPopover = function (apiMethod, segment, extraParams) {
|
||||
var urlParam = apiMethod + ':' + encodeURIComponent(segment) + ':' + encodeURIComponent(JSON.stringify(extraParams));
|
||||
|
||||
broadcast.propagateNewPopoverParameter('RowAction', actionName + ':' + urlParam);
|
||||
};
|
||||
|
||||
DataTable_RowActions_SegmentVisitorLog.prototype.trigger = function (tr, e, subTableLabel) {
|
||||
var segment = getRawSegmentValueFromRow(tr);
|
||||
|
||||
this.performAction(segment, tr, e);
|
||||
};
|
||||
|
||||
DataTable_RowActions_SegmentVisitorLog.prototype.performAction = function (segment, tr, e) {
|
||||
|
||||
var apiMethod = this.dataTable.param.module + '.' + this.dataTable.param.action;
|
||||
|
||||
this.openPopover(apiMethod, segment, {});
|
||||
};
|
||||
|
||||
DataTable_RowActions_SegmentVisitorLog.prototype.doOpenPopover = function (urlParam) {
|
||||
var urlParamParts = urlParam.split(':');
|
||||
|
||||
var apiMethod = urlParamParts.shift();
|
||||
var segment = decodeURIComponent(urlParamParts.shift());
|
||||
|
||||
var extraParamsString = urlParamParts.shift(),
|
||||
extraParams = {}; // 0/1 or "0"/"1"
|
||||
|
||||
try {
|
||||
extraParams = JSON.parse(decodeURIComponent(extraParamsString));
|
||||
} catch (e) {
|
||||
// assume the parameter is an int/string describing whether to use multi row evolution
|
||||
}
|
||||
|
||||
SegmentedVisitorLog.show(apiMethod, segment, extraParams);
|
||||
};
|
||||
|
||||
DataTable_RowActions_Registry.register({
|
||||
|
||||
name: actionName,
|
||||
|
||||
dataTableIcon: 'plugins/Live/images/visitorlog.png',
|
||||
dataTableIconHover: 'plugins/Live/images/visitorlog-hover.png',
|
||||
|
||||
order: 30,
|
||||
|
||||
dataTableIconTooltip: [
|
||||
_pk_translate('Live_RowActionTooltipTitle'),
|
||||
_pk_translate('Live_RowActionTooltipDefault')
|
||||
],
|
||||
|
||||
isAvailableOnReport: function (dataTableParams, undefined) {
|
||||
return true;
|
||||
},
|
||||
|
||||
isAvailableOnRow: function (dataTableParams, tr) {
|
||||
var value = getRawSegmentValueFromRow(tr)
|
||||
if ('undefined' === (typeof value)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var reportTitle = null;
|
||||
|
||||
var apiMethod = $(tr).parents('div.dataTable').last().attr('data-report');
|
||||
var dimension = getDimensionFromApiMethod(apiMethod);
|
||||
|
||||
if (dimension) {
|
||||
reportTitle = _pk_translate('Live_RowActionTooltipWithDimension', [dimension])
|
||||
} else {
|
||||
reportTitle = _pk_translate('Live_RowActionTooltipDefault');
|
||||
}
|
||||
|
||||
this.dataTableIconTooltip[1] = reportTitle;
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
createInstance: function (dataTable, param) {
|
||||
if (dataTable !== null && typeof dataTable.segmentVisitorLogInstance != 'undefined') {
|
||||
return dataTable.segmentVisitorLogInstance;
|
||||
}
|
||||
|
||||
if (dataTable === null && param) {
|
||||
// when segmented visitor log is triggered from the url (not a click on the data table)
|
||||
// we look for the data table instance in the dom
|
||||
var report = param.split(':')[0];
|
||||
var tempTable = getDataTableFromApiMethod(report);
|
||||
if (tempTable) {
|
||||
dataTable = tempTable;
|
||||
if (typeof dataTable.segmentVisitorLogInstance != 'undefined') {
|
||||
return dataTable.segmentVisitorLogInstance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var instance = new DataTable_RowActions_SegmentVisitorLog(dataTable);
|
||||
if (dataTable !== null) {
|
||||
dataTable.segmentVisitorLogInstance = instance;
|
||||
}
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
})();
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Piwik - Web Analytics
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* Visitor profile popup control.
|
||||
*
|
||||
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
/**
|
||||
* DataTable UI class for jqPlot graph datatable visualizations.
|
||||
*
|
||||
*
|
||||
* @constructor
|
||||
*/
|
||||
exports.VisitorLog = function (element) {
|
||||
|
|
@ -24,12 +24,54 @@
|
|||
|
||||
$.extend(exports.VisitorLog.prototype, dataTablePrototype, {
|
||||
|
||||
handleColumnHighlighting: function () {
|
||||
|
||||
},
|
||||
|
||||
setFixWidthToMakeEllipsisWork: function () {
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* Initializes this class.
|
||||
*/
|
||||
init: function () {
|
||||
dataTablePrototype.init.call(this);
|
||||
|
||||
$('.visitorLogIconWithDetails>img').each(function () {
|
||||
$(this).tooltip({
|
||||
items: 'img',
|
||||
track: true,
|
||||
show: false,
|
||||
hide: false,
|
||||
content: function () {
|
||||
return $('<ul>').html($('ul', $(this).closest('.visitorLogIconWithDetails')).html());
|
||||
},
|
||||
tooltipClass: 'small',
|
||||
open: function () {
|
||||
tooltipIsOpened = true;
|
||||
},
|
||||
close: function () {
|
||||
tooltipIsOpened = false;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$('.visitorLogTooltip').each(function () {
|
||||
$(this).tooltip({
|
||||
track: true,
|
||||
show: false,
|
||||
hide: false,
|
||||
tooltipClass: 'small',
|
||||
open: function () {
|
||||
tooltipIsOpened = true;
|
||||
},
|
||||
close: function () {
|
||||
tooltipIsOpened = false;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Replace duplicated page views by a NX count instead of using too much vertical space
|
||||
$("ol.visitorLog").each(function () {
|
||||
var prevelement;
|
||||
|
|
@ -44,7 +86,7 @@
|
|||
if (repeat.length) {
|
||||
repeat.html((parseInt(repeat.html()) + 1) + "x");
|
||||
} else {
|
||||
prevelement.append($("<em>2x</em>").attr({'class': 'repeat', 'title': _pk_translate('Live_PageRefreshed')}));
|
||||
prevelement.find('>div').prepend($("<em>2x</em>").attr({'class': 'repeat', 'title': _pk_translate('Live_PageRefreshed')}));
|
||||
}
|
||||
$(this).hide();
|
||||
} else {
|
||||
|
|
@ -56,7 +98,7 @@
|
|||
var tooltipIsOpened = false;
|
||||
|
||||
$('a', $this).on('focus', function () {
|
||||
// see http://dev.piwik.org/trac/ticket/4099
|
||||
// see https://github.com/piwik/piwik/issues/4099
|
||||
if (tooltipIsOpened) {
|
||||
$this.tooltip('close');
|
||||
}
|
||||
|
|
@ -86,4 +128,4 @@
|
|||
}
|
||||
});
|
||||
|
||||
})(jQuery, require);
|
||||
})(jQuery, require);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Piwik - Web Analytics
|
||||
* Piwik - free/libre analytics platform
|
||||
*
|
||||
* Visitor profile popup control.
|
||||
*
|
||||
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
/**
|
||||
* Sets up and handles events for the visitor profile popup.
|
||||
*
|
||||
*
|
||||
* @param {Element} element The HTML element returned by the Live.getVisitorLog controller
|
||||
* action. Should have the CSS class 'visitor-profile'.
|
||||
* @constructor
|
||||
|
|
@ -39,7 +39,7 @@
|
|||
* Instead broadcast.propagateNewPopoverParameter('visitorProfile', visitorId) should be
|
||||
* called. This would make sure the popover would be opened if the URL is copied and pasted
|
||||
* in a new tab/window.
|
||||
*
|
||||
*
|
||||
* @param {String} visitorId The string visitor ID.
|
||||
*/
|
||||
VisitorProfileControl.showPopover = function (visitorId) {
|
||||
|
|
@ -50,7 +50,7 @@
|
|||
if ($('.RealTimeMap').length > 0) {
|
||||
url += '&showMap=0';
|
||||
}
|
||||
|
||||
|
||||
Piwik_Popover.createPopupAndLoadUrl(url, _pk_translate('Live_VisitorProfile'), 'visitor-profile-popup');
|
||||
};
|
||||
|
||||
|
|
@ -133,6 +133,28 @@
|
|||
$exportLink.css('visibility', 'hidden');
|
||||
}
|
||||
});
|
||||
|
||||
var tooltipIsOpened = false;
|
||||
|
||||
$('a', $element).on('focus', function () {
|
||||
// see https://github.com/piwik/piwik/issues/4099
|
||||
if (tooltipIsOpened) {
|
||||
$element.tooltip('close');
|
||||
}
|
||||
});
|
||||
|
||||
$element.tooltip({
|
||||
track: true,
|
||||
show: false,
|
||||
hide: false,
|
||||
content: function() {
|
||||
var title = $(this).attr('title');
|
||||
return $('<a>').text( title ).html().replace(/\n/g, '<br />');
|
||||
},
|
||||
tooltipClass: 'small',
|
||||
open: function() { tooltipIsOpened = true; },
|
||||
close: function() { tooltipIsOpened = false; }
|
||||
});
|
||||
},
|
||||
|
||||
toggleMap: function () {
|
||||
|
|
@ -251,7 +273,7 @@
|
|||
},
|
||||
|
||||
_loadNextVisitor: function () {
|
||||
this._gotoAdjacentVisitor(this.$element.attr('data-next-visitor'));
|
||||
this._gotoAdjacentVisitor(this.$element.attr('data-next-visitor'));
|
||||
},
|
||||
|
||||
_gotoAdjacentVisitor: function (idVisitor) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue