From 1be76d066c99ef0b91cd01a3bebec4310dc35b0f Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Thu, 24 May 2018 23:41:39 +0200 Subject: [PATCH] FIX: forces boolean when content is only "true" && "false" --- .../components/edit-category-settings.hbs | 2 +- .../select-kit/components/multi-select.js.es6 | 2 +- .../select-kit/components/select-kit.js.es6 | 3 ++- .../components/single-select.js.es6 | 2 +- .../select-kit/mixins/utils.js.es6 | 13 +++++++++ .../components/single-select-test.js.es6 | 27 +++++++++++++++++++ 6 files changed, 45 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/discourse/templates/components/edit-category-settings.hbs b/app/assets/javascripts/discourse/templates/components/edit-category-settings.hbs index 2e657aa1562..36e6bfc0b4c 100644 --- a/app/assets/javascripts/discourse/templates/components/edit-category-settings.hbs +++ b/app/assets/javascripts/discourse/templates/components/edit-category-settings.hbs @@ -69,7 +69,7 @@
{{combo-box valueAttribute="value" content=availableSorts value=category.sort_order none="category.sort_options.default"}} {{#unless isDefaultSortOrder}} - {{combo-box valueAttribute="value" content=sortAscendingOptions value=category.sort_ascending none="category.sort_options.default"}} + {{combo-box castBoolean=true valueAttribute="value" content=sortAscendingOptions value=category.sort_ascending none="category.sort_options.default"}} {{/unless}}
diff --git a/app/assets/javascripts/select-kit/components/multi-select.js.es6 b/app/assets/javascripts/select-kit/components/multi-select.js.es6 index 9a9453445b5..8e7622e1e3b 100644 --- a/app/assets/javascripts/select-kit/components/multi-select.js.es6 +++ b/app/assets/javascripts/select-kit/components/multi-select.js.es6 @@ -79,7 +79,7 @@ export default SelectKitComponent.extend({ shouldDisplayFilter() { return true; }, _beforeWillComputeValues(values) { - return values.map(v => this._castInteger(v === "" ? null : v)); + return values.map(v => this._cast(v === "" ? null : v)); }, willComputeValues(values) { return values; }, computeValues(values) { return values; }, diff --git a/app/assets/javascripts/select-kit/components/select-kit.js.es6 b/app/assets/javascripts/select-kit/components/select-kit.js.es6 index a45da128fdd..172bd9e4b1a 100644 --- a/app/assets/javascripts/select-kit/components/select-kit.js.es6 +++ b/app/assets/javascripts/select-kit/components/select-kit.js.es6 @@ -62,6 +62,7 @@ export default Ember.Component.extend(UtilsMixin, PluginApiMixin, DomHelpersMixi horizontalOffset: 0, fullWidthOnMobile: false, castInteger: false, + castBoolean: false, allowAny: false, allowInitialValueMutation: false, content: null, @@ -169,7 +170,7 @@ export default Ember.Component.extend(UtilsMixin, PluginApiMixin, DomHelpersMixi } let computedContentItem = { - value: this._castInteger(this.valueForContentItem(contentItem)), + value: this._cast(this.valueForContentItem(contentItem)), name: name || this._nameForContent(contentItem), locked: false, created: options.created || false, diff --git a/app/assets/javascripts/select-kit/components/single-select.js.es6 b/app/assets/javascripts/select-kit/components/single-select.js.es6 index 65e73840adf..e10ae018aa0 100644 --- a/app/assets/javascripts/select-kit/components/single-select.js.es6 +++ b/app/assets/javascripts/select-kit/components/single-select.js.es6 @@ -63,7 +63,7 @@ export default SelectKitComponent.extend({ switch (typeof value) { case "string": case "number": - return this._castInteger(value === "" ? null : value); + return this._cast(value === "" ? null : value); default: return value; } diff --git a/app/assets/javascripts/select-kit/mixins/utils.js.es6 b/app/assets/javascripts/select-kit/mixins/utils.js.es6 index 11f4418cf4a..ad61c7926bd 100644 --- a/app/assets/javascripts/select-kit/mixins/utils.js.es6 +++ b/app/assets/javascripts/select-kit/mixins/utils.js.es6 @@ -27,6 +27,19 @@ export default Ember.Mixin.create({ return !isNaN(parseFloat(input)) && isFinite(input); }, + _cast(value) { + if (value === this.noneValue) return value; + return this._castInteger(this._castBoolean(value)); + }, + + _castBoolean(value) { + if (this.get("castBoolean") && Ember.isPresent(value) && typeof(value) === "string") { + return value === "true"; + } + + return value; + }, + _castInteger(value) { if (this.get("castInteger") && Ember.isPresent(value) && this._isNumeric(value)) { return parseInt(value, 10); diff --git a/test/javascripts/components/single-select-test.js.es6 b/test/javascripts/components/single-select-test.js.es6 index e7a1080290e..671896bc188 100644 --- a/test/javascripts/components/single-select-test.js.es6 +++ b/test/javascripts/components/single-select-test.js.es6 @@ -232,6 +232,33 @@ componentTest('supports converting select value to integer', { } }); +componentTest('supports converting string as boolean to boolean', { + template: '{{single-select value=value content=content castBoolean=true}}', + + beforeEach() { + this.set('value', true); + this.set('content', [{ id: 'true', name: 'ASC'}, {id: 'false', name: 'DESC' }]); + }, + + test(assert) { + this.get('subject').expand(); + + andThen(() => assert.equal(this.get('subject').selectedRow().name(), 'ASC') ); + + andThen(() => { + this.set('value', false); + }); + + andThen(() => { + assert.equal( + this.get('subject').selectedRow().name(), + 'DESC', + 'it works with dynamic content' + ); + }); + } +}); + componentTest('supports keyboard events', { template: '{{single-select content=content filterable=true}}',