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 7713d51194b..af3aa3a4f8d 100644 --- a/app/assets/javascripts/select-kit/components/single-select.js.es6 +++ b/app/assets/javascripts/select-kit/components/single-select.js.es6 @@ -210,6 +210,10 @@ export default SelectKitComponent.extend({ }, select(computedContentItem) { + if (this.get("hasSelection")) { + this.deselect(this.get("selection.value")); + } + if ( !computedContentItem || computedContentItem.__sk_row_type === "noneRow" diff --git a/test/javascripts/components/single-select-test.js.es6 b/test/javascripts/components/single-select-test.js.es6 index 439781e202e..72366fdf72e 100644 --- a/test/javascripts/components/single-select-test.js.es6 +++ b/test/javascripts/components/single-select-test.js.es6 @@ -835,3 +835,55 @@ componentTest("without forceEscape", { ); } }); + +componentTest("onSelect", { + template: + "
{{single-select content=content onSelect=(action externalAction)}}", + + beforeEach() { + this.set("externalAction", actual => { + find(".test-external-action").text(actual); + }); + + this.set("content", ["red", "blue"]); + }, + + async test(assert) { + await this.get("subject").expand(); + await this.get("subject").selectRowByValue("red"); + + assert.equal( + find(".test-external-action") + .text() + .trim(), + "red" + ); + } +}); + +componentTest("onDeselect", { + template: + "
{{single-select content=content onDeselect=(action externalAction)}}", + + beforeEach() { + this.set("externalAction", actual => { + find(".test-external-action").text(actual); + }); + + this.set("content", ["red", "blue"]); + }, + + async test(assert) { + await this.get("subject").expand(); + await this.get("subject").selectRowByValue("red"); + await this.get("subject").expand(); + await this.get("subject").selectRowByValue("blue"); + + assert.equal( + find(".test-external-action") + .text() + .trim(), + "red" + ); + } +});