From 54812992aea69d74d936cb0d527fb9255c8c8035 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Tue, 19 Apr 2022 15:01:28 +0200 Subject: [PATCH] REFACTOR: badge-button (#16500) - drops jquery - uses native class syntax - tagless - tests - removes unnecessary alias --- .../discourse/app/components/badge-button.js | 21 ++-- .../app/templates/components/badge-button.hbs | 8 +- .../components/badge-button-test.js | 97 +++++++++++++++++++ 3 files changed, 109 insertions(+), 17 deletions(-) create mode 100644 app/assets/javascripts/discourse/tests/integration/components/badge-button-test.js diff --git a/app/assets/javascripts/discourse/app/components/badge-button.js b/app/assets/javascripts/discourse/app/components/badge-button.js index 26c378678d9..0970e4b8a0b 100644 --- a/app/assets/javascripts/discourse/app/components/badge-button.js +++ b/app/assets/javascripts/discourse/app/components/badge-button.js @@ -1,20 +1,13 @@ import Component from "@ember/component"; -import { alias } from "@ember/object/computed"; import discourseComputed from "discourse-common/utils/decorators"; +import domFromString from "discourse-common/lib/dom-from-string"; -export default Component.extend({ - tagName: "span", - classNameBindings: [ - ":user-badge", - "badge.badgeTypeClassName", - "badge.enabled::disabled", - ], +export default class BadgeButtonComponent extends Component { + tagName = ""; + badge = null; @discourseComputed("badge.description") title(badgeDescription) { - return $("
" + badgeDescription + "
").text(); - }, - - attributeBindings: ["data-badge-name", "title"], - "data-badge-name": alias("badge.name"), -}); + return domFromString(`
${badgeDescription}
`)[0].innerText; + } +} diff --git a/app/assets/javascripts/discourse/app/templates/components/badge-button.hbs b/app/assets/javascripts/discourse/app/templates/components/badge-button.hbs index 4dd20f5cdb0..2af01ef27ed 100644 --- a/app/assets/javascripts/discourse/app/templates/components/badge-button.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/badge-button.hbs @@ -1,3 +1,5 @@ -{{icon-or-image badge}} -{{badge.name}} -{{yield}} + + {{icon-or-image badge}} + {{badge.name}} + {{yield}} + diff --git a/app/assets/javascripts/discourse/tests/integration/components/badge-button-test.js b/app/assets/javascripts/discourse/tests/integration/components/badge-button-test.js new file mode 100644 index 00000000000..a6916ca114d --- /dev/null +++ b/app/assets/javascripts/discourse/tests/integration/components/badge-button-test.js @@ -0,0 +1,97 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; +import { + discourseModule, + exists, + query, +} from "discourse/tests/helpers/qunit-helpers"; +import hbs from "htmlbars-inline-precompile"; + +discourseModule("Integration | Component | badge-button", function (hooks) { + setupRenderingTest(hooks); + + componentTest("disabled badge", { + template: hbs`{{badge-button badge=badge}}`, + + beforeEach() { + this.set("badge", { enabled: false }); + }, + + async test(assert) { + assert.ok(exists(".user-badge.disabled")); + }, + }); + + componentTest("enabled badge", { + template: hbs`{{badge-button badge=badge}}`, + + beforeEach() { + this.set("badge", { enabled: true }); + }, + + async test(assert) { + assert.notOk(exists(".user-badge.disabled")); + }, + }); + + componentTest("data-badge-name", { + template: hbs`{{badge-button badge=badge}}`, + + beforeEach() { + this.set("badge", { name: "foo" }); + }, + + async test(assert) { + assert.ok(exists('.user-badge[data-badge-name="foo"]')); + }, + }); + + componentTest("title", { + template: hbs`{{badge-button badge=badge}}`, + + beforeEach() { + this.set("badge", { description: "a good run" }); + }, + + async test(assert) { + assert.equal(query(".user-badge").title, "a good run", "it strips html"); + }, + }); + + componentTest("icon", { + template: hbs`{{badge-button badge=badge}}`, + + beforeEach() { + this.set("badge", { icon: "times" }); + }, + + async test(assert) { + assert.ok(exists(".d-icon.d-icon-times")); + }, + }); + + componentTest("accepts block", { + template: hbs`{{#badge-button badge=badge}}{{/badge-button}}`, + + beforeEach() { + this.set("badge", {}); + }, + + async test(assert) { + assert.ok(exists(".test")); + }, + }); + + componentTest("badgeTypeClassName", { + template: hbs`{{badge-button badge=badge}}`, + + beforeEach() { + this.set("badge", { badgeTypeClassName: "foo" }); + }, + + async test(assert) { + assert.ok(exists(".user-badge.foo")); + }, + }); +});