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}}',