crmRouteBinder - Remove params from url if they equal their defaults
authorColeman Watts <coleman@civicrm.org>
Tue, 7 May 2019 17:59:02 +0000 (13:59 -0400)
committerColeman Watts <coleman@civicrm.org>
Tue, 7 May 2019 17:59:02 +0000 (13:59 -0400)
ang/crmRouteBinder.js

index 0dd232dd637c5a56f2060f80b4b9eb5ce19e99f0..a8563fd0c1deaf17e41c8357eecc4b8cfbce051d 100644 (file)
         registerGlobalListener($injector);
 
         options.format = options.format || 'json';
-        var fmt = formats[options.format];
+        var fmt = _.clone(formats[options.format]);
         if (options.deep) {
           fmt.watcher = '$watch';
         }
         if (options.default === undefined) {
           options.default = fmt.default;
         }
-        var _scope = this;
+        var value,
+          _scope = this,
+          $route = $injector.get('$route'),
+          $timeout = $injector.get('$timeout');
 
-        var $route = $injector.get('$route'), $timeout = $injector.get('$timeout');
-
-        var value;
         if (options.param in $route.current.params) {
           value = fmt.decode($route.current.params[options.param]);
         }
         // Keep the URL bar up-to-date.
         _scope[fmt.watcher](options.expr, function (newValue) {
           var encValue = fmt.encode(newValue);
-          if ($route.current.params[options.param] === encValue) return;
+          if (!_.isEqual(newValue, options.default) && $route.current.params[options.param] === encValue) {
+            return;
+          }
 
           pendingUpdates = pendingUpdates || {};
           pendingUpdates[options.param] = encValue;
           var p = angular.extend({}, $route.current.params, pendingUpdates);
-          angular.forEach(ignorable, function(v,k){ if (p[k] === v) delete p[k]; });
+
+          angular.forEach(ignorable, function(v, k) {
+            if (p[k] === v) {
+              delete p[k];
+            }
+          });
+
+          // Remove params from url if they equal their defaults
+          if (_.isEqual(newValue, options.default)) {
+            p[options.param] = null;
+          }
+
           $route.updateParams(p);
 
           if (activeTimer) $timeout.cancel(activeTimer);