Skip to content

Commit

Permalink
fix matomo-org#4796 anchor links do not work after merging AngularJS
Browse files Browse the repository at this point in the history
  • Loading branch information
tsteur committed Mar 12, 2014
1 parent ad29373 commit 37de7c8
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 1 deletion.
1 change: 1 addition & 0 deletions plugins/CoreHome/CoreHome.php
Expand Up @@ -111,6 +111,7 @@ public function getJsFiles(&$jsFiles)
$jsFiles[] = "plugins/CoreHome/angularjs/common/directives/focusif.js";

$jsFiles[] = "plugins/CoreHome/angularjs/piwikApp.js";
$jsFiles[] = "plugins/CoreHome/angularjs/anchorLinkFix.js";

$jsFiles[] = "plugins/CoreHome/angularjs/siteselector/siteselector-model.js";
$jsFiles[] = "plugins/CoreHome/angularjs/siteselector/siteselector-controller.js";
Expand Down
108 changes: 108 additions & 0 deletions plugins/CoreHome/angularjs/anchorLinkFix.js
@@ -0,0 +1,108 @@
/*!
* Piwik - Web Analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/

/**
* See http://dev.piwik.org/trac/ticket/4795 "linking to #hash tag does not work after merging AngularJS"
*/
(function () {

function scrollToAnchorNode($node)
{
$.scrollTo($node, 20);
}

function preventDefaultIfEventExists(event)
{
if (event) {
event.preventDefault();
}
}

function scrollToAnchorIfPossible(hash, event)
{
if (!hash) {
return;
}

if (-1 !== hash.indexOf('&')) {
return;
}

var $node = $('#' + hash);

if ($node && $node.length) {
scrollToAnchorNode($node);
preventDefaultIfEventExists(event);
return;
}

var $node = $('a[name='+ hash + ']')

if ($node && $node.length) {
scrollToAnchorNode($node);
preventDefaultIfEventExists(event);
}
}

function isLinkWithinSamePage(location, newUrl)
{
if (location && location.origin && -1 === newUrl.indexOf(location.origin)) {
// link to different domain
return false;
}

if (location && location.pathname && -1 === newUrl.indexOf(location.pathname)) {
// link to different path
return false;
}

if (location && location.search && -1 === newUrl.indexOf(location.search)) {
// link with different search
return false;
}

return true;
}

function handleScrollToAnchorIfPresentOnPageLoad()
{
if (location.hash.substr(0, 2) == '#/') {
var hash = location.hash.substr(2);
scrollToAnchorIfPossible(hash, null);
}
}

function handleScrollToAnchorAfterPageLoad()
{
angular.module('piwikApp').run(['$rootScope', function ($rootScope) {

$rootScope.$on('$locationChangeStart', function (event, newUrl, oldUrl, $location) {

if (!newUrl) {
return;
}

var hashPos = newUrl.indexOf('#/');
if (-1 === hashPos) {
return;
}

if (!isLinkWithinSamePage(this.location, newUrl)) {
return;
}

var hash = newUrl.substr(hashPos + 2);

scrollToAnchorIfPossible(hash, event);
});
}]);
}

handleScrollToAnchorAfterPageLoad();
$(handleScrollToAnchorIfPresentOnPageLoad);

})();
9 changes: 8 additions & 1 deletion plugins/CoreHome/angularjs/piwikApp.js
@@ -1,3 +1,10 @@
/*!
* Piwik - Web Analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/

angular.module('piwikApp', [
'ngSanitize',
'ngAnimate',
Expand All @@ -6,4 +13,4 @@ angular.module('piwikApp', [
'piwikApp.directive',
'piwikApp.filter'
]);
angular.module('app', []);
angular.module('app', []);

0 comments on commit 37de7c8

Please sign in to comment.