From 85fbe3f6282bfcaa642e0f4210a9fac02da84a9e Mon Sep 17 00:00:00 2001 From: Krzysztof Kotlarek Date: Mon, 13 Feb 2023 09:24:47 +1100 Subject: [PATCH] FIX: IconPicker option to display only available icons (#20235) Not all icons are shipped by default. Sidebar section icon picker should only display available icons. --- .../app/templates/modal/sidebar-section-form.hbs | 1 + .../select-kit/addon/components/icon-picker.js | 5 ++++- app/controllers/svg_sprite_controller.rb | 5 +++-- lib/svg_sprite.rb | 4 +++- spec/requests/svg_sprite_controller_spec.rb | 15 +++++++++++++++ 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/discourse/app/templates/modal/sidebar-section-form.hbs b/app/assets/javascripts/discourse/app/templates/modal/sidebar-section-form.hbs index fe5ac508c58..66c864a0ca3 100644 --- a/app/assets/javascripts/discourse/app/templates/modal/sidebar-section-form.hbs +++ b/app/assets/javascripts/discourse/app/templates/modal/sidebar-section-form.hbs @@ -26,6 +26,7 @@ @value={{link.icon}} @options={{hash maximum=1}} class={{link.iconCssClass}} + @onlyAvailable={{true}} @onChange={{action (mut link.icon)}} /> diff --git a/app/assets/javascripts/select-kit/addon/components/icon-picker.js b/app/assets/javascripts/select-kit/addon/components/icon-picker.js index ab6553acbdf..dead5047cd8 100644 --- a/app/assets/javascripts/select-kit/addon/components/icon-picker.js +++ b/app/assets/javascripts/select-kit/addon/components/icon-picker.js @@ -36,7 +36,10 @@ export default MultiSelectComponent.extend({ return this._cachedIconsList; } else { return ajax("/svg-sprite/picker-search", { - data: { filter }, + data: { + filter, + only_available: this.onlyAvailable, + }, }).then((icons) => { icons = icons.map(this._processIcon); if (filter === "") { diff --git a/app/controllers/svg_sprite_controller.rb b/app/controllers/svg_sprite_controller.rb index f073314e200..462f1eb224d 100644 --- a/app/controllers/svg_sprite_controller.rb +++ b/app/controllers/svg_sprite_controller.rb @@ -46,10 +46,11 @@ class SvgSpriteController < ApplicationController def icon_picker_search RailsMultisite::ConnectionManagement.with_hostname(params[:hostname]) do - params.permit(:filter) + params.permit(:filter, :only_available) filter = params[:filter] || "" + only_available = params[:only_available] - icons = SvgSprite.icon_picker_search(filter) + icons = SvgSprite.icon_picker_search(filter, only_available) render json: icons.take(200), root: false end end diff --git a/lib/svg_sprite.rb b/lib/svg_sprite.rb index 25467472e19..f044723ccbf 100644 --- a/lib/svg_sprite.rb +++ b/lib/svg_sprite.rb @@ -426,7 +426,8 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL false end - def self.icon_picker_search(keyword) + def self.icon_picker_search(keyword, only_available = false) + icons = all_icons(SiteSetting.default_theme_id) if only_available results = Set.new sprite_sources(SiteSetting.default_theme_id).each do |item| @@ -436,6 +437,7 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL .css("symbol") .each do |sym| icon_id = prepare_symbol(sym, item[:filename]) + next if only_available && !icons.include?(icon_id) if keyword.empty? || icon_id.include?(keyword) sym.attributes["id"].value = icon_id sym.css("title").each(&:remove) diff --git a/spec/requests/svg_sprite_controller_spec.rb b/spec/requests/svg_sprite_controller_spec.rb index a61634f6e4a..2a09e0de7b2 100644 --- a/spec/requests/svg_sprite_controller_spec.rb +++ b/spec/requests/svg_sprite_controller_spec.rb @@ -99,6 +99,21 @@ RSpec.describe SvgSpriteController do expect(data.length).to eq(1) expect(data[0]["id"]).to eq("fab-500px") end + + it "should display only available" do + sign_in(Fabricate(:user)) + + get "/svg-sprite/picker-search" + data = response.parsed_body + beer_icon = response.parsed_body.find { |i| i["id"] == "beer" } + expect(beer_icon).to be_present + + get "/svg-sprite/picker-search", params: { only_available: "true" } + data = response.parsed_body + beer_icon = response.parsed_body.find { |i| i["id"] == "beer" } + expect(beer_icon).to be nil + expect(data.length).to eq(200) + end end describe "#svg_icon" do