FIX: IconPicker option to display only available icons (#20226)

Not all icons are shipped by default. Sidebar section icon picker should only display available icons.
This commit is contained in:
Krzysztof Kotlarek 2023-02-09 14:20:04 +11:00 committed by GitHub
parent a0ea17faea
commit fc166258d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 67 additions and 0 deletions

View File

@ -26,6 +26,7 @@
@value={{link.icon}}
@options={{hash maximum=1}}
class={{link.iconCssClass}}
@onlyAvailable={{true}}
@onChange={{action (mut link.icon)}}
/>
</div>

View File

@ -0,0 +1,58 @@
import { module, test } from "qunit";
import { setupRenderingTest } from "discourse/tests/helpers/component-test";
import { render } from "@ember/test-helpers";
import { hbs } from "ember-cli-htmlbars";
import selectKit from "discourse/tests/helpers/select-kit-helper";
import { queryAll } from "discourse/tests/helpers/qunit-helpers";
import pretender, { response } from "discourse/tests/helpers/create-pretender";
import { setIconList } from "discourse-common/lib/icon-library";
module("Integration | Component | select-kit/icon-picker", function (hooks) {
setupRenderingTest(hooks);
hooks.beforeEach(function () {
this.set("subject", selectKit());
setIconList(["ad", "link"]);
pretender.get("/svg-sprite/picker-search", () => {
return response([
{ id: "ad", symbol: "" },
{ id: "bacon", symbol: "" },
{ id: "link", symbol: [] },
]);
});
});
test("content", async function (assert) {
await render(hbs`
<IconPicker
@name="icon"
@value={{this.value}}
@content={{this.content}}
/>
`);
await this.subject.expand();
const icons = [...queryAll(".select-kit-row .name")].map(
(el) => el.innerText
);
assert.deepEqual(icons, ["ad", "bacon", "link"]);
});
test("only available", async function (assert) {
await render(hbs`
<IconPicker
@name="icon"
@value={{this.value}}
@content={{this.content}}
@onlyAvailable={{true}}
/>
`);
await this.subject.expand();
const icons = [...queryAll(".select-kit-row .name")].map(
(el) => el.innerText
);
assert.deepEqual(icons, ["ad", "link"]);
});
});

View File

@ -2,6 +2,7 @@ import {
convertIconClass,
disableMissingIconWarning,
enableMissingIconWarning,
isExistingIconId,
} from "discourse-common/lib/icon-library";
import MultiSelectComponent from "select-kit/components/multi-select";
import { computed } from "@ember/object";
@ -39,6 +40,9 @@ export default MultiSelectComponent.extend({
data: { filter },
}).then((icons) => {
icons = icons.map(this._processIcon);
if (this.onlyAvailable) {
icons = icons.filter(this._iconExists);
}
if (filter === "") {
this._cachedIconsList = icons;
}
@ -47,6 +51,10 @@ export default MultiSelectComponent.extend({
}
},
_iconExists(icon) {
return isExistingIconId(icon.id);
},
_processIcon(icon) {
const iconName = typeof icon === "object" ? icon.id : icon,
strippedIconName = convertIconClass(iconName);