From c157b9912d64b3cef8a21984b2d041514dc904b7 Mon Sep 17 00:00:00 2001 From: Ray Tiley Date: Thu, 20 Mar 2014 19:45:53 -0500 Subject: [PATCH 1/3] [query-params-new] Issue - #4570 don't serialize null or undefined into url # Conflicts: # packages/ember/tests/routing/query_params_test.js # packages_es6/ember-routing/lib/system/route.js --- packages/ember-routing/lib/system/router.js | 4 +- .../ember/tests/routing/query_params_test.js | 57 +++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/packages/ember-routing/lib/system/router.js b/packages/ember-routing/lib/system/router.js index bc5b63a0c18..aada4183598 100644 --- a/packages/ember-routing/lib/system/router.js +++ b/packages/ember-routing/lib/system/router.js @@ -701,7 +701,9 @@ const EmberRouter = EmberObject.extend(Evented, { @param {String} type */ _serializeQueryParam(value, type) { - if (type === 'array') { + if (value === null || value === undefined) { + return null; + } else if (type === 'array') { return JSON.stringify(value); } diff --git a/packages/ember/tests/routing/query_params_test.js b/packages/ember/tests/routing/query_params_test.js index 279b23dd20c..81ca73dfc1e 100644 --- a/packages/ember/tests/routing/query_params_test.js +++ b/packages/ember/tests/routing/query_params_test.js @@ -1153,6 +1153,63 @@ moduleFor('Query Params - main', class extends QueryParamTestCase { }); } + test("Setting bound query pram property to null or undefined do not seralize to url", function() { + Router.map(function() { + this.route("home", { path: '/home' }); + }); + + App.HomeController = Ember.Controller.extend({ + queryParams: ['foo'], + foo: [1, 2] + }); + + startingURL = '/home'; + bootApplication(); + + var controller = container.lookup('controller:home'); + + deepEqual(controller.get('foo'), [1,2]); + equal(router.get('location.path'), "/home"); + + Ember.run(controller, 'set', 'foo', [1,3]); + equal(router.get('location.path'), "/home?foo=%5B1%2C3%5D"); + + Ember.run(router, 'transitionTo', '/home'); + deepEqual(controller.get('foo'), [1,2]); + + Ember.run(controller, 'set', 'foo', null); + equal(router.get('location.path'), "/home", "Setting property to null"); + + Ember.run(controller, 'set', 'foo', [1,3]); + equal(router.get('location.path'), "/home?foo=%5B1%2C3%5D"); + + Ember.run(controller, 'set', 'foo', undefined); + equal(router.get('location.path'), "/home", "Setting property to undefined"); + }); + + test("{{link-to}} with null or undefined qps do not get serialized into url", function() { + Ember.TEMPLATES.home = Ember.Handlebars.compile( + "{{link-to 'Home' 'home' (query-params foo=nullValue) id='null-link'}}" + + "{{link-to 'Home' 'home' (query-params foo=undefinedValue) id='undefined-link'}}"); + Router.map(function() { + this.route("home", { path: '/home' }); + }); + + App.HomeController = Ember.Controller.extend({ + queryParams: ['foo'], + foo: [], + nullValue: null, + undefinedValue: undefined + }); + + startingURL = '/home'; + bootApplication(); + + var controller = container.lookup('controller:home'); + equal(Ember.$('#null-link').attr('href'), "/home"); + equal(Ember.$('#undefined-link').attr('href'), "/home"); + }); + ['@test A child of a resource route still defaults to parent route\'s model even if the child route has a query param'](assert) { assert.expect(2); From 19ae330fd582ca3a9b97b70d16aceceb40f94261 Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Wed, 30 Aug 2017 16:18:05 +0200 Subject: [PATCH 2/3] Bring query params fix up to date. --- packages/ember-routing/lib/system/route.js | 7 +- packages/ember-routing/lib/system/router.js | 6 +- .../ember/tests/routing/query_params_test.js | 75 +++++++++---------- 3 files changed, 45 insertions(+), 43 deletions(-) diff --git a/packages/ember-routing/lib/system/route.js b/packages/ember-routing/lib/system/route.js index 3ed4700ed7d..eba584a9dca 100644 --- a/packages/ember-routing/lib/system/route.js +++ b/packages/ember-routing/lib/system/route.js @@ -848,7 +848,10 @@ let Route = EmberObject.extend(ActionHandler, Evented, { } else { if (presentKey) { svalue = params[presentKey]; - value = route.deserializeQueryParam(svalue, qp.urlKey, qp.type); + + if (svalue !== undefined) { + value = route.deserializeQueryParam(svalue, qp.urlKey, qp.type); + } } else { // No QP provided; use default value. svalue = qp.serializedDefaultValue; @@ -2127,7 +2130,7 @@ let Route = EmberObject.extend(ActionHandler, Evented, { } }); ``` - + @method disconnectOutlet @param {Object|String} options the options hash or outlet name @since 1.0.0 diff --git a/packages/ember-routing/lib/system/router.js b/packages/ember-routing/lib/system/router.js index aada4183598..60a5e095623 100644 --- a/packages/ember-routing/lib/system/router.js +++ b/packages/ember-routing/lib/system/router.js @@ -702,7 +702,7 @@ const EmberRouter = EmberObject.extend(Evented, { */ _serializeQueryParam(value, type) { if (value === null || value === undefined) { - return null; + return value; } else if (type === 'array') { return JSON.stringify(value); } @@ -739,7 +739,9 @@ const EmberRouter = EmberObject.extend(Evented, { @param {String} defaultType */ _deserializeQueryParam(value, defaultType) { - if (defaultType === 'boolean') { + if (value === null || value === undefined) { + return value; + } else if (defaultType === 'boolean') { return value === 'true'; } else if (defaultType === 'number') { return (Number(value)).valueOf(); diff --git a/packages/ember/tests/routing/query_params_test.js b/packages/ember/tests/routing/query_params_test.js index 81ca73dfc1e..5640658542b 100644 --- a/packages/ember/tests/routing/query_params_test.js +++ b/packages/ember/tests/routing/query_params_test.js @@ -1153,62 +1153,59 @@ moduleFor('Query Params - main', class extends QueryParamTestCase { }); } - test("Setting bound query pram property to null or undefined do not seralize to url", function() { - Router.map(function() { - this.route("home", { path: '/home' }); - }); + ['@test Setting bound query param property to null or undefined does not serialize to url'](assert) { + assert.expect(9); - App.HomeController = Ember.Controller.extend({ - queryParams: ['foo'], - foo: [1, 2] + this.router.map(function() { + this.route('home'); }); - startingURL = '/home'; - bootApplication(); + this.setSingleQPController('home', 'foo', [1, 2]); - var controller = container.lookup('controller:home'); + return this.visitAndAssert('/home').then(() => { + var controller = this.getController('home'); - deepEqual(controller.get('foo'), [1,2]); - equal(router.get('location.path'), "/home"); + assert.deepEqual(controller.get('foo'), [1,2]); + this.assertCurrentPath('/home'); - Ember.run(controller, 'set', 'foo', [1,3]); - equal(router.get('location.path'), "/home?foo=%5B1%2C3%5D"); + this.setAndFlush(controller, 'foo', emberA([1,3])); + this.assertCurrentPath('/home?foo=%5B1%2C3%5D'); - Ember.run(router, 'transitionTo', '/home'); - deepEqual(controller.get('foo'), [1,2]); + return this.transitionTo('/home').then(() => { + assert.deepEqual(controller.get('foo'), [1,2]); + this.assertCurrentPath('/home'); - Ember.run(controller, 'set', 'foo', null); - equal(router.get('location.path'), "/home", "Setting property to null"); + this.setAndFlush(controller, 'foo', null); + this.assertCurrentPath('/home', 'Setting property to null'); - Ember.run(controller, 'set', 'foo', [1,3]); - equal(router.get('location.path'), "/home?foo=%5B1%2C3%5D"); + this.setAndFlush(controller, 'foo', emberA([1,3])); + this.assertCurrentPath('/home?foo=%5B1%2C3%5D'); - Ember.run(controller, 'set', 'foo', undefined); - equal(router.get('location.path'), "/home", "Setting property to undefined"); - }); + this.setAndFlush(controller, 'foo', undefined); + this.assertCurrentPath('/home', 'Setting property to undefined'); + }); + }); + } - test("{{link-to}} with null or undefined qps do not get serialized into url", function() { - Ember.TEMPLATES.home = Ember.Handlebars.compile( - "{{link-to 'Home' 'home' (query-params foo=nullValue) id='null-link'}}" + - "{{link-to 'Home' 'home' (query-params foo=undefinedValue) id='undefined-link'}}"); - Router.map(function() { - this.route("home", { path: '/home' }); + ['@test {{link-to}} with null or undefined QPs does not get serialized into url'](assert) { + assert.expect(3); + + this.addTemplate('home', '{{link-to \'Home\' \'home\' (query-params foo=nullValue) id=\'null-link\'}}{{link-to \'Home\' \'home\' (query-params foo=undefinedValue) id=\'undefined-link\'}}'); + + this.router.map(function() { + this.route('home'); }); - App.HomeController = Ember.Controller.extend({ - queryParams: ['foo'], - foo: [], + this.setSingleQPController('home', 'foo', [], { nullValue: null, undefinedValue: undefined }); - startingURL = '/home'; - bootApplication(); - - var controller = container.lookup('controller:home'); - equal(Ember.$('#null-link').attr('href'), "/home"); - equal(Ember.$('#undefined-link').attr('href'), "/home"); - }); + return this.visitAndAssert('/home').then(() => { + assert.equal(this.$('#null-link').attr('href'), '/home'); + assert.equal(this.$('#undefined-link').attr('href'), '/home'); + }); + } ['@test A child of a resource route still defaults to parent route\'s model even if the child route has a query param'](assert) { assert.expect(2); From 1c8c6ecad42228e94deffb7672fc6de905fca007 Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Wed, 30 Aug 2017 16:23:33 +0200 Subject: [PATCH 3/3] Fix: passing some query params via router service --- packages/ember-routing/lib/system/router.js | 2 +- .../router_service_test/transitionTo_test.js | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/ember-routing/lib/system/router.js b/packages/ember-routing/lib/system/router.js index 60a5e095623..8e5e8ba7c22 100644 --- a/packages/ember-routing/lib/system/router.js +++ b/packages/ember-routing/lib/system/router.js @@ -976,7 +976,7 @@ const EmberRouter = EmberObject.extend(Evented, { return true; } - if (_fromRouterService) { + if (_fromRouterService && presentProp !== false) { return false; } diff --git a/packages/ember/tests/routing/router_service_test/transitionTo_test.js b/packages/ember/tests/routing/router_service_test/transitionTo_test.js index ab98ce08570..06186a22373 100644 --- a/packages/ember/tests/routing/router_service_test/transitionTo_test.js +++ b/packages/ember/tests/routing/router_service_test/transitionTo_test.js @@ -256,6 +256,26 @@ if (EMBER_ROUTING_ROUTER_SERVICE) { }); } + ['@test RouterService#transitionTo with unspecified query params'](assert) { + assert.expect(1); + + this.add('controller:parent.child', Controller.extend({ + queryParams: ['sort', 'page', 'category', 'extra'], + sort: 'ASC', + page: null, + category: undefined + })); + + let queryParams = this.buildQueryParams({ sort: 'ASC' }); + + return this.visit('/').then(() => { + return this.routerService.transitionTo('parent.child', queryParams); + }) + .then(() => { + assert.equal(this.routerService.get('currentURL'), '/child?sort=ASC'); + }); + } + ['@test RouterService#transitionTo with aliased query params uses the original provided key'](assert) { assert.expect(1);