From 0c6da8c62740f3e56f4d8b4924b4fb91a43a9254 Mon Sep 17 00:00:00 2001 From: Thomas Steur <tsteur@users.noreply.github.com> Date: Thu, 15 Dec 2016 15:21:43 +1300 Subject: [PATCH] Piwik should not reload page when applying a segment (#11013) * Revert "After Updating/Deleting/Adding a segment, force a refresh of the dashboard (#10969)" This reverts commit 401977c0b431c756209c64620f74b87fdbb07a50. * do not reload page when applying a segment * Fix JS error when segment name contains % --- .../SegmentEditor/javascripts/Segmentation.js | 44 ++++++++++++++++--- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/plugins/SegmentEditor/javascripts/Segmentation.js b/plugins/SegmentEditor/javascripts/Segmentation.js index 7930ae8c0e..88596ea184 100644 --- a/plugins/SegmentEditor/javascripts/Segmentation.js +++ b/plugins/SegmentEditor/javascripts/Segmentation.js @@ -271,7 +271,8 @@ Segmentation = (function($) { if( checkSelected == self.currentSegmentStr || checkSelected == decodeURIComponent(self.currentSegmentStr) - || checkSelected == decodeURIComponent(decodeURIComponent(self.currentSegmentStr))){ + || checkSelected == unescape(decodeURIComponent(self.currentSegmentStr)) + ) { injClass = 'class="segmentSelected"'; } listHtml += '<li data-idsegment="'+segment.idsegment+'" data-definition="'+ (segment.definition).replace(/"/g, '"') +'" ' @@ -1274,10 +1275,41 @@ $(document).ready(function() { } var self = this; - this.changeSegment = function(segmentDefinition) { + + this.uriEncodeSegmentDefinition = function (segmentDefinition) { segmentDefinition = cleanupSegmentDefinition(segmentDefinition); segmentDefinition = encodeURIComponent(segmentDefinition); + return segmentDefinition; + }; + + this.changeSegment = function(segmentDefinition) { + if (piwikHelper.isAngularRenderingThePage()) { + segmentDefinition = this.uriEncodeSegmentDefinition(segmentDefinition); + + angular.element(document).injector().invoke(function ($location, $rootScope) { + var $search = $location.search(); + + if (segmentDefinition !== $search.segment) { + // eg when using back button the date might be actually already changed in the URL and we do not + // want to change the URL again + $search.segment = segmentDefinition.replace(/%$/, '%25').replace(/%([^\d].)/g, "%25$1"); + $location.search($search); + setTimeout(function () { + try { + $rootScope.$apply(); + } catch (e) {} + }, 1); + } + + }); + return false; + } else { + return this.forceSegmentReload(segmentDefinition); + } + }; + this.forceSegmentReload = function (segmentDefinition) { + segmentDefinition = this.uriEncodeSegmentDefinition(segmentDefinition); return broadcast.propagateNewPage('segment=' + segmentDefinition, true); }; @@ -1311,7 +1343,7 @@ $(document).ready(function() { self.impl.markCurrentSegment(); self.$element.find('a.close').click(); - self.changeSegment(params.definition); + self.forceSegmentReload(params.definition); self.changeSegmentList(self.props.availableSegments); } @@ -1349,7 +1381,7 @@ $(document).ready(function() { self.impl.markCurrentSegment(); self.$element.find('a.close').click(); - self.changeSegment(params.definition); + self.forceSegmentReload(params.definition); self.changeSegmentList(self.props.availableSegments); } @@ -1387,7 +1419,7 @@ $(document).ready(function() { self.rebuild(); self.$element.find('a.close').click(); - self.changeSegment(''); + self.forceSegmentReload(''); $('.ui-dialog-content').dialog('close'); @@ -1431,7 +1463,7 @@ $(document).ready(function() { "addMethod": addSegment, "updateMethod": updateSegment, "deleteMethod": deleteSegment, - "segmentSelectMethod": function () { self.changeSegment.apply(this, arguments); }, + "segmentSelectMethod": function () { self.changeSegment.apply(self, arguments); }, "currentSegmentStr": segmentFromRequest, "translations": this.props.segmentTranslations }); -- GitLab