diff --git a/plugins/Actions/Actions.php b/plugins/Actions/Actions.php index 557e4c77b87cc519d1188799928ce8b7c0628d0b..dfd773bea4ff8f6095ef6e2a8294e264f9d98bc0 100644 --- a/plugins/Actions/Actions.php +++ b/plugins/Actions/Actions.php @@ -105,6 +105,7 @@ class Actions extends \Piwik\Plugin public function getJsFiles(&$jsFiles) { $jsFiles[] = "plugins/Actions/javascripts/actionsDataTable.js"; + $jsFiles[] = "plugins/Actions/javascripts/rowactions.js"; } public function isSiteSearchEnabled($idSites, $idSite) diff --git a/plugins/Actions/javascripts/rowactions.js b/plugins/Actions/javascripts/rowactions.js new file mode 100644 index 0000000000000000000000000000000000000000..33050b90edf1f37790260fff863c1912e7518a46 --- /dev/null +++ b/plugins/Actions/javascripts/rowactions.js @@ -0,0 +1,65 @@ +$(function () { + + function isActionsModule(params) + { + return params.module == 'Actions'; + } + + function isPageUrlReport(params) { + var action = params.action; + + return isActionsModule(params) && + (action == 'getPageUrls' || action == 'getEntryPageUrls' || action == 'getExitPageUrls' || action == 'getPageUrlsFollowingSiteSearch'); + }; + + function isPageTitleReport(params) { + var action = params.action; + + return isActionsModule(params) && (action == 'getPageTitles' || action == 'getPageTitlesFollowingSiteSearch'); + }; + + function getLinkForTransitionAndOverlayPopover(tr) + { + var link = tr.find('> td:first > a').attr('href'); + link = $('<textarea>').html(link).val(); // remove html entities + return link; + } + + DataTable_RowActions_Transitions.registerReport({ + isAvailableOnReport: function (dataTableParams) { + return isPageUrlReport(dataTableParams); + }, + isAvailableOnRow: function (dataTableParams, tr) { + return isPageUrlReport(dataTableParams) && tr.find('> td:first span.label').parent().is('a') + }, + trigger: function (tr, e, subTableLabel) { + var link = getLinkForTransitionAndOverlayPopover(tr); + this.openPopover('url:' + link); + } + }); + + DataTable_RowActions_Transitions.registerReport({ + isAvailableOnReport: function (dataTableParams) { + return isPageTitleReport(dataTableParams); + }, + isAvailableOnRow: function (dataTableParams, tr) { + return isPageTitleReport(dataTableParams); + }, + trigger: function (tr, e, subTableLabel) { + DataTable_RowAction.prototype.trigger.apply(this, [tr, e, subTableLabel]); + } + }); + + DataTable_RowActions_Overlay.registerReport({ + isAvailableOnReport: function (dataTableParams) { + return isPageUrlReport(dataTableParams); + }, + onClick: function (actionA, tr, e) { + return { + link: getLinkForTransitionAndOverlayPopover(tr), + segment: null + } + } + }); + +}); \ No newline at end of file diff --git a/plugins/Overlay/javascripts/rowaction.js b/plugins/Overlay/javascripts/rowaction.js index 8f11c736d02dd973d4060a2aa163e366f7be5ebe..de063b990e14ac57028c5f9e1abc32d4ecc0a812 100644 --- a/plugins/Overlay/javascripts/rowaction.js +++ b/plugins/Overlay/javascripts/rowaction.js @@ -15,39 +15,47 @@ function DataTable_RowActions_Overlay(dataTable) { DataTable_RowActions_Overlay.prototype = new DataTable_RowAction; +DataTable_RowActions_Overlay.registeredReports = []; +DataTable_RowActions_Overlay.registerReport = function (handler) { + DataTable_RowActions_Overlay.registeredReports.push(handler); +} + + DataTable_RowActions_Overlay.prototype.onClick = function (actionA, tr, e) { if (!actionA.data('overlay-manipulated')) { actionA.data('overlay-manipulated', 1); var segment, link; - if (DataTable_RowActions_Transitions.isActionCustomDimensionReport(this.dataTable.param)) { - - link = this.getLabelFromTr(tr); - if (link && link.substr(0, 1) === '@') { - link = link.substr(1); + var i = 0; + for (i; i < DataTable_RowActions_Overlay.registeredReports.length; i++) { + var report = DataTable_RowActions_Overlay.registeredReports[i]; + if (report + && report.onClick + && report.isAvailableOnReport + && report.isAvailableOnReport(this.dataTable.param)) { + var result = report.onClick.apply(this, arguments); + + if (!result || !result.link) { + return; + } + + link = result.link; + if (result.segment) { + segment = result.segment; + } + break; } - - link = 'http://' + unescape(link); - - var subtable = tr.closest('table'); - if (subtable.is('.subDataTable')) { - var prev = subtable.closest('tr').prev(); - segment = prev.attr('data-segment-filter'); - } - } else { - - link = tr.find('> td:first > a').attr('href'); - link = $('<textarea>').html(link).val(); // remove html entities } + if (link) { + var href = Overlay_Helper.getOverlayLink(this.dataTable.param.idSite, 'month', 'today', segment, link); - var href = Overlay_Helper.getOverlayLink(this.dataTable.param.idSite, 'month', 'today', segment, link); - - actionA.attr({ - target: '_blank', - href: href - }); + actionA.attr({ + target: '_blank', + href: href + }); + } } return true; @@ -77,11 +85,17 @@ DataTable_RowActions_Registry.register({ return false; } - if (DataTable_RowActions_Transitions.isActionCustomDimensionReport(dataTableParams)) { - return true; + var i = 0; + for (i; i < DataTable_RowActions_Overlay.registeredReports.length; i++) { + var report = DataTable_RowActions_Overlay.registeredReports[i]; + if (report + && report.isAvailableOnReport + && report.isAvailableOnReport(dataTableParams)) { + return true; + } } - return DataTable_RowActions_Transitions.isPageUrlReport(dataTableParams.module, dataTableParams.action); + return false; }, isAvailableOnRow: function (dataTableParams, tr) { diff --git a/plugins/Transitions/javascripts/transitions.js b/plugins/Transitions/javascripts/transitions.js index a11f6860c617768ea909785f9c97e8242b2950e8..20a4e7febffb67fd9f9772b432910cc3c334939b 100644 --- a/plugins/Transitions/javascripts/transitions.js +++ b/plugins/Transitions/javascripts/transitions.js @@ -30,44 +30,25 @@ DataTable_RowActions_Transitions.isPageTitleReport = function (module, action) { return module == 'Actions' && (action == 'getPageTitles' || action == 'getPageTitlesFollowingSiteSearch'); }; -DataTable_RowActions_Transitions.isActionCustomDimensionReport = function (params) { - return params.module == 'CustomDimensions' && params.action == 'getCustomDimension' && params.scopeOfDimension && params.scopeOfDimension === 'action'; -}; +DataTable_RowActions_Transitions.registeredReports = []; +DataTable_RowActions_Transitions.registerReport = function (handler) { + DataTable_RowActions_Transitions.registeredReports.push(handler); +} DataTable_RowActions_Transitions.prototype.trigger = function (tr, e, subTableLabel) { - var link = tr.find('> td:first > a').attr('href'); - link = $('<textarea>').html(link).val(); // remove html entities - - var module = this.dataTable.param.module; - var action = this.dataTable.param.action; - if (DataTable_RowActions_Transitions.isPageUrlReport(module, action)) { - this.openPopover('url:' + link); - } else if (DataTable_RowActions_Transitions.isPageTitleReport(module, action)) { - DataTable_RowAction.prototype.trigger.apply(this, [tr, e, subTableLabel]); - } else if (DataTable_RowActions_Transitions.isActionCustomDimensionReport(this.dataTable.param)) { - - var label = this.getLabelFromTr(tr); - if (label && label.substr(0, 1) === '@') { - label = label.substr(1); - } - - var subtable = tr.closest('table'); - if (subtable.is('.subDataTable')) { - var prev = subtable.closest('tr').prev(); - var segment = prev.attr('data-segment-filter'); - if (segment) { - label = unescape(label); - if (this.transitions === null) { - this.transitions = new Piwik_Transitions('url', label, this, segment); - } else { - this.transitions.reset('url', label, segment); - } - this.transitions.showPopover(); - } + var i = 0; + for (i; i < DataTable_RowActions_Transitions.registeredReports.length; i++) { + var report = DataTable_RowActions_Transitions.registeredReports[i]; + if (report + && report.trigger + && report.isAvailableOnReport + && report.isAvailableOnReport(this.dataTable.param)) { + report.trigger.apply(this, arguments); + return; } - } else { - alert('Transitions can\'t be used on this report.'); } + + alert('Transitions can\'t be used on this report.'); }; DataTable_RowActions_Transitions.prototype.performAction = function (label, tr, e) { @@ -118,11 +99,17 @@ DataTable_RowActions_Registry.register({ }, isAvailableOnReport: function (dataTableParams) { - return ( - DataTable_RowActions_Transitions.isPageUrlReport(dataTableParams.module, dataTableParams.action) || - DataTable_RowActions_Transitions.isPageTitleReport(dataTableParams.module, dataTableParams.action) || - DataTable_RowActions_Transitions.isActionCustomDimensionReport(dataTableParams) - ); + var i = 0; + for (i; i < DataTable_RowActions_Transitions.registeredReports.length; i++) { + var report = DataTable_RowActions_Transitions.registeredReports[i]; + if (report + && report.isAvailableOnReport + && report.isAvailableOnReport(dataTableParams)) { + return true; + } + } + + return false; }, isAvailableOnRow: function (dataTableParams, tr) { @@ -130,16 +117,18 @@ DataTable_RowActions_Registry.register({ // not available on groups (i.e. folders) return false; } - if (DataTable_RowActions_Transitions.isPageUrlReport(dataTableParams.module, dataTableParams.action) - && !tr.find('> td:first span.label').parent().is('a')) { - // not on page url without link (i.e. "Page URL not defined") - return false; - } - if (DataTable_RowActions_Transitions.isActionCustomDimensionReport(dataTableParams) - && !tr.parents('table').first().hasClass('subDataTable')) { - // only show it in subtables of custom dimensions - return false; + + var i = 0; + for (i; i < DataTable_RowActions_Transitions.registeredReports.length; i++) { + var report = DataTable_RowActions_Transitions.registeredReports[i]; + if (report + && report.isAvailableOnRow + && report.isAvailableOnReport + && report.isAvailableOnReport(dataTableParams)) { + return report.isAvailableOnRow(dataTableParams, tr); + } } + return true; }