diff options
-rw-r--r-- | lang/en.php | 1 | ||||
-rw-r--r-- | plugins/CoreHome/templates/broadcast.js | 89 | ||||
-rw-r--r-- | plugins/CoreHome/templates/datatable_rowactions.js | 38 | ||||
-rw-r--r-- | plugins/CoreHome/templates/popover.js | 5 | ||||
-rw-r--r-- | plugins/Transitions/templates/transitions.js | 10 |
5 files changed, 113 insertions, 30 deletions
diff --git a/lang/en.php b/lang/en.php index 9fe607ed47..ccb102ac56 100644 --- a/lang/en.php +++ b/lang/en.php @@ -1661,6 +1661,7 @@ And thank you for using Piwik!', 'RowEvolution_PickARow' => 'Pick a row to compare', 'RowEvolution_PickAnotherRow' => 'Pick another row to compare', 'RowEvolution_MultiRowEvolutionTitle' => 'Evolution of multiple rows', + 'Transitions_PluginDescription' => 'Reports about previous and following actions for each page URL.', 'Transitions_IncomingTraffic' => 'Incoming traffic', 'Transitions_OutgoingTraffic' => 'Outgoing traffic', 'Transitions_XOfAllPageviews' => '%s of all pageviews', diff --git a/plugins/CoreHome/templates/broadcast.js b/plugins/CoreHome/templates/broadcast.js index 15212ec707..6e2c22648c 100644 --- a/plugins/CoreHome/templates/broadcast.js +++ b/plugins/CoreHome/templates/broadcast.js @@ -27,6 +27,16 @@ var broadcast = { */ _isInit: false, + /** + * Last known hash parts + */ + currentHashParts: [null], + + /** + * Callbacks for second hash change + */ + secondHashHandlers: [], + /** * Initializes broadcast object * @return {void} @@ -60,19 +70,50 @@ var broadcast = { // Unbind any previously attached resize handlers $(window).off('resize'); - - // hash doesn't contain the first # character. - if( hash ) { - // restore ajax loaded state - broadcast.loadAjaxContent(hash); - - // Hack: make sure the "Widgets & Dashboard" is deleted on reload - $('#dashboardSettings').remove(); - $('#dashboardWidgetsArea').dashboard('destroy'); - } else { - // start page - $('#content').empty(); - } + + // hash doesn't contain the first # character. + if( hash ) { + var hashParts = hash.split('#'); + + var firstHashUpdated = (hashParts.length == 1); // i.e. no second hash yet + var secondHashUpdated = (hashParts.length > 1 && hashParts[0] == broadcast.currentHashParts[0]); + if (broadcast.currentHashParts[0] === null) { + // new page load + firstHashUpdated = true; + secondHashUpdated = (hashParts.length > 1); + } + + if (firstHashUpdated) { + Piwik_Popover.close(); + + if (hashParts[0] != broadcast.currentHashParts[0]) { + // restore ajax loaded state + broadcast.loadAjaxContent(hashParts[0]); + + // make sure the "Widgets & Dashboard" is deleted on reload + $('#dashboardSettings').remove(); + $('#dashboardWidgetsArea').dashboard('destroy'); + } + } + + if (secondHashUpdated && hashParts[1] == '') { + Piwik_Popover.close(); + } else if (secondHashUpdated) { + var secondHashParts = hashParts[1].split(':'); + var handlerName = secondHashParts[0]; + secondHashParts.shift(); + var param = secondHashParts.join(':'); + if (typeof broadcast.secondHashHandlers[handlerName] != 'undefined') { + broadcast.secondHashHandlers[handlerName](param); + } + } + + } else { + // start page + $('#content').empty(); + } + + broadcast.currentHashParts = hashParts; }, /** @@ -99,7 +140,7 @@ var broadcast = { var currentHashStr = broadcast.getHash(); ajaxUrl = ajaxUrl.replace(/^\?|&#/,''); - + var params_vals = ajaxUrl.split("&"); for( var i=0; i<params_vals.length; i++ ) { @@ -230,6 +271,24 @@ var broadcast = { return urlStr; }, + /** + * Update the part after the second hash + */ + propagateNewSecondHash: function(handlerName, value) + { + var url = window.location.href; + var urlParts = url.split('#'); + urlParts[2] = handlerName === false ? '' : handlerName + ':' + value; + window.location.href = urlParts.join('#'); + }, + + /** + * Add a handler for the secon hash + */ + addSecondHashHandler: function(handlerName, callback) { + this.secondHashHandlers[handlerName] = callback; + }, + /** * Loads the given url with ajax and replaces the content * @@ -427,7 +486,7 @@ var broadcast = { */ getHash: function () { - return broadcast.getHashFromUrl().replace(/^#/, ''); + return broadcast.getHashFromUrl().replace(/^#/, '').split('#')[0]; }, /** diff --git a/plugins/CoreHome/templates/datatable_rowactions.js b/plugins/CoreHome/templates/datatable_rowactions.js index 5bfd5448fd..33d0332656 100644 --- a/plugins/CoreHome/templates/datatable_rowactions.js +++ b/plugins/CoreHome/templates/datatable_rowactions.js @@ -16,6 +16,13 @@ var DataTable_RowActions_Registry = { registry: [], register: function(action) { + var createInstance = action.createInstance; + action.createInstance = function(dataTable) { + var instance = createInstance(dataTable); + instance.actionName = action.name; + return instance; + }; + this.registry.push(action); }, @@ -32,6 +39,14 @@ var DataTable_RowActions_Registry = { } } return available; + }, + + getActionByName: function(name) { + for (var i = 0; i < this.registry.length; i++) { + if (this.registry[i].name == name) { + return this.registry[i]; + } + } } }; @@ -85,6 +100,9 @@ function DataTable_RowAction(dataTable) { // has to be overridden in subclasses this.trEventName = 'piwikTriggerRowAction'; + + // set in registry + this.actionName = 'RowAction'; } /** Initialize a row when the table is loaded */ @@ -164,18 +182,22 @@ DataTable_RowAction.prototype.getLabelFromTr = function(tr) { /** * Base method for opening popovers. - * TODO: In the future, this method will remember the parameter in the url. - * After doing general things, doOpenPopover is called. + * This method will remember the parameter in the url and call doOpenPopover(). */ DataTable_RowAction.prototype.openPopover = function(parameter) { - // maybe add popover name / param after a second hash? - //var currentHashStr = broadcast.getHashFromUrl().replace(/^#/, ''); - //currentHashStr = broadcast.updateParamValue('foo=bar', currentHashStr); - //$.history.load(currentHashStr); - - this.doOpenPopover(parameter); + broadcast.propagateNewSecondHash('RowAction', this.actionName + ':' + parameter); }; +broadcast.addSecondHashHandler('RowAction', function(param) { + var paramParts = param.split(':'); + var rowActionName = paramParts[0]; + paramParts.shift(); + param = paramParts.join(':'); + + var rowAction = DataTable_RowActions_Registry.getActionByName(rowActionName); + rowAction.createInstance().doOpenPopover(param); +}); + /** To be overridden */ DataTable_RowAction.prototype.performAction = function(label, tr, e) { }; diff --git a/plugins/CoreHome/templates/popover.js b/plugins/CoreHome/templates/popover.js index 6ab058a252..4a131a64af 100644 --- a/plugins/CoreHome/templates/popover.js +++ b/plugins/CoreHome/templates/popover.js @@ -29,6 +29,7 @@ var Piwik_Popover = (function() { piwikHelper.abortQueueAjax(); $('.ui-widget-overlay').off('click.popover'); isOpen = false; + broadcast.propagateNewSecondHash(false); } }); @@ -121,7 +122,9 @@ var Piwik_Popover = (function() { /** Close the popover */ close: function() { - container.dialog('close'); + if (isOpen) { + container.dialog('close'); + } } }; diff --git a/plugins/Transitions/templates/transitions.js b/plugins/Transitions/templates/transitions.js index 75d299297f..9e82941c88 100644 --- a/plugins/Transitions/templates/transitions.js +++ b/plugins/Transitions/templates/transitions.js @@ -33,7 +33,6 @@ DataTable_RowActions_Transitions.prototype.doOpenPopover = function(link) { this.transitions.showPopover(); }; - DataTable_RowActions_Registry.register({ name: 'Transitions', @@ -235,7 +234,7 @@ Piwik_Transitions.prototype.renderEntries = function(onlyBg) { var self = this; var gradient = this.canvas.createHorizontalGradient('#CFEDCA', '#91DE83', 'left'); if (this.highlightedGroup == 'directEntries') { - gradient = this.canvas.createHorizontalGradient('#FAE2C0', '#FAD293', 'left') + gradient = this.canvas.createHorizontalGradient('#FAE2C0', '#FAD293', 'left'); } this.canvas.renderBox({ side: 'left', @@ -262,7 +261,7 @@ Piwik_Transitions.prototype.renderExits = function(onlyBg) { var self = this; var gradient = this.canvas.createHorizontalGradient('#CFEDCA', '#91DE83', 'right'); if (this.highlightedGroup == 'exits') { - gradient = this.canvas.createHorizontalGradient('#FAE2C0', '#FAD293', 'right') + gradient = this.canvas.createHorizontalGradient('#FAE2C0', '#FAD293', 'right'); } this.canvas.renderBox({ side: 'right', @@ -303,7 +302,7 @@ Piwik_Transitions.prototype.renderOpenGroup = function(groupName, side, onlyBg) var gradientOthers = this.canvas.createHorizontalGradient('#F5F3EB', '#E8E4D5', side); var gradientBackground = this.canvas.createHorizontalGradient('#FFFFFF', '#B0CAE8', side); if (groupName == this.highlightedGroup) { - gradientBackground = this.canvas.createHorizontalGradient('#FFFFFF', '#FAD293', side) + gradientBackground = this.canvas.createHorizontalGradient('#FFFFFF', '#FAD293', side); } // remember current offsets to reset them later for drawing the background @@ -409,7 +408,7 @@ Piwik_Transitions.prototype.renderClosedGroup = function(groupName, side, onlyBg var self = this; var gradient = this.canvas.createHorizontalGradient('#DDE4ED', '#9BBADE', side); if (groupName == this.highlightedGroup) { - gradient = this.canvas.createHorizontalGradient('#FAE2C0', '#FAD293', side) + gradient = this.canvas.createHorizontalGradient('#FAE2C0', '#FAD293', side); } var nbTransitionsVarName = groupName + 'NbTransitions'; @@ -443,7 +442,6 @@ Piwik_Transitions.prototype.renderClosedGroup = function(groupName, side, onlyBg /** Reload the entire popover for a different URL */ Piwik_Transitions.prototype.reloadPopover = function(url) { - Piwik_Popover.close(); this.rowAction.openPopover(url); }; |