From e3d3a9de8d603621c6e44c4b621292e057336e54 Mon Sep 17 00:00:00 2001 From: Krzysztof Kotlarek Date: Mon, 28 Apr 2025 12:37:13 +0800 Subject: [PATCH 1/2] FIX: remove sidebar filter Remove sidebar filter in favour of search. In addition: - Search was moved up just below Dashboard; - Do not perform search when filter is empty; - Display "no results". --- .../admin/addon/components/admin-search.gjs | 19 ++- .../components/sidebar/filter-no-results.gjs | 35 ---- .../app/components/sidebar/filter.gjs | 82 ---------- .../app/components/sidebar/panel-header.gjs | 6 - .../discourse/app/lib/keyboard-shortcuts.js | 10 -- .../app/lib/sidebar/admin-nav-map.js | 16 +- .../app/lib/sidebar/admin-sidebar.js | 19 --- .../lib/sidebar/base-custom-sidebar-panel.js | 18 --- .../acceptance/admin-sidebar-section-test.js | 21 +-- .../stylesheets/common/base/menu-panel.scss | 4 - .../stylesheets/common/base/sidebar.scss | 62 ------- config/locales/client.en.yml | 7 +- spec/system/admin_search_spec.rb | 11 ++ spec/system/admin_sidebar_navigation_spec.rb | 151 +----------------- spec/system/page_objects/components/filter.rb | 22 --- .../components/navigation_menu/sidebar.rb | 5 + 16 files changed, 50 insertions(+), 438 deletions(-) delete mode 100644 app/assets/javascripts/discourse/app/components/sidebar/filter-no-results.gjs delete mode 100644 app/assets/javascripts/discourse/app/components/sidebar/filter.gjs delete mode 100644 spec/system/page_objects/components/filter.rb diff --git a/app/assets/javascripts/admin/addon/components/admin-search.gjs b/app/assets/javascripts/admin/addon/components/admin-search.gjs index 0311df3cb542c..2d575375a5d5e 100644 --- a/app/assets/javascripts/admin/addon/components/admin-search.gjs +++ b/app/assets/javascripts/admin/addon/components/admin-search.gjs @@ -6,11 +6,13 @@ import didUpdate from "@ember/render-modifiers/modifiers/did-update"; import { service } from "@ember/service"; import { htmlSafe } from "@ember/template"; import { TrackedObject } from "@ember-compat/tracked-built-ins"; +import { and, not } from "truth-helpers"; import ConditionalLoadingSpinner from "discourse/components/conditional-loading-spinner"; import DButton from "discourse/components/d-button"; import icon from "discourse/helpers/d-icon"; import discourseDebounce from "discourse/lib/debounce"; import { INPUT_DELAY } from "discourse/lib/environment"; +import { escapeExpression } from "discourse/lib/utilities"; import autoFocus from "discourse/modifiers/auto-focus"; import { i18n } from "discourse-i18n"; import AdminSearchFilters from "admin/components/admin-search-filters"; @@ -62,6 +64,14 @@ export default class AdminSearch extends Component { return !this.adminSearchDataSource.isLoaded || this.loading; } + get noResultsDescription() { + return htmlSafe( + i18n("admin.search.no_results", { + filter: escapeExpression(this.filter), + }) + ); + } + @action toggleFilters() { this.showFilters = !this.showFilters; @@ -91,7 +101,9 @@ export default class AdminSearch extends Component { changeSearchTerm(event) { this.searchResults = []; this.filter = event.target.value; - this.runSearch(); + if (this.filter.length > 0) { + this.runSearch(); + } } @action @@ -219,6 +231,11 @@ export default class AdminSearch extends Component { {{/each}} + {{#if (and (not this.searchResults) this.filter)}} +

+ {{this.noResultsDescription}} +

+ {{/if}} diff --git a/app/assets/javascripts/discourse/app/components/sidebar/filter-no-results.gjs b/app/assets/javascripts/discourse/app/components/sidebar/filter-no-results.gjs deleted file mode 100644 index d46c208e41eff..0000000000000 --- a/app/assets/javascripts/discourse/app/components/sidebar/filter-no-results.gjs +++ /dev/null @@ -1,35 +0,0 @@ -import Component from "@glimmer/component"; -import { service } from "@ember/service"; -import { i18n } from "discourse-i18n"; - -export default class FilterNoResults extends Component { - @service sidebarState; - - get shouldDisplay() { - return ( - this.sidebarState.currentPanel.filterable && - !!(this.args.sections?.length === 0) - ); - } - - get noResultsDescription() { - return this.sidebarState.currentPanel.filterNoResultsDescription( - this.sidebarState.filter - ); - } - - -} diff --git a/app/assets/javascripts/discourse/app/components/sidebar/filter.gjs b/app/assets/javascripts/discourse/app/components/sidebar/filter.gjs deleted file mode 100644 index 614b2f274f78d..0000000000000 --- a/app/assets/javascripts/discourse/app/components/sidebar/filter.gjs +++ /dev/null @@ -1,82 +0,0 @@ -import Component from "@glimmer/component"; -import { on } from "@ember/modifier"; -import { action } from "@ember/object"; -import { service } from "@ember/service"; -import DButton from "discourse/components/d-button"; -import { i18n } from "discourse-i18n"; - -export default class Filter extends Component { - @service sidebarState; - @service router; - @service currentUser; - - willDestroy() { - super.willDestroy(...arguments); - this.sidebarState.clearFilter(); - } - - get shouldDisplay() { - return this.sidebarState.currentPanel.filterable; - } - - get displayClearFilter() { - return this.sidebarState.filter.length > 0; - } - - @action - setFilter(event) { - this.sidebarState.filter = event.target.value; - } - - @action - handleEscape(event) { - if (event.key === "Escape") { - event.stopPropagation(); - - if (this.sidebarState.filter.length > 0) { - this.sidebarState.filter = ""; - } else { - event.target.blur(); - } - } - } - - @action - clearFilter() { - this.sidebarState.clearFilter(); - document.querySelector(".sidebar-filter__input").focus(); - } - - get filterPlaceholder() { - if (this.currentUser?.staff) { - return i18n("sidebar.filter_links"); - } - return i18n("sidebar.filter"); - } - - -} diff --git a/app/assets/javascripts/discourse/app/components/sidebar/panel-header.gjs b/app/assets/javascripts/discourse/app/components/sidebar/panel-header.gjs index abd01d2b02121..fbdb2543f7b6c 100644 --- a/app/assets/javascripts/discourse/app/components/sidebar/panel-header.gjs +++ b/app/assets/javascripts/discourse/app/components/sidebar/panel-header.gjs @@ -1,8 +1,6 @@ import Component from "@glimmer/component"; import { service } from "@ember/service"; import BackToForum from "./back-to-forum"; -import Filter from "./filter"; -import FilterNoResults from "./filter-no-results"; import ToggleAllSections from "./toggle-all-sections"; export default class PanelHeader extends Component { @@ -19,11 +17,7 @@ export default class PanelHeader extends Component { - - {{/if}} } diff --git a/app/assets/javascripts/discourse/app/lib/keyboard-shortcuts.js b/app/assets/javascripts/discourse/app/lib/keyboard-shortcuts.js index 22cf7f40d9728..6444c240dbcae 100644 --- a/app/assets/javascripts/discourse/app/lib/keyboard-shortcuts.js +++ b/app/assets/javascripts/discourse/app/lib/keyboard-shortcuts.js @@ -50,8 +50,6 @@ const DEFAULT_BINDINGS = { "!": { postAction: "showFlags" }, "#": { handler: "goToPost", anonymous: true }, "/": { handler: "toggleSearch", anonymous: true }, - "meta+/": { handler: "filterSidebar", anonymous: true }, - [`${PLATFORM_KEY_MODIFIER}+/`]: { handler: "filterSidebar", anonymous: true }, "ctrl+alt+f": { handler: "toggleSearch", anonymous: true, global: true }, "=": { handler: "toggleHamburgerMenu", anonymous: true }, "?": { handler: "showHelpModal", anonymous: true }, @@ -495,14 +493,6 @@ export default { composer.focusComposer(event); }, - filterSidebar() { - const filterInput = document.querySelector(".sidebar-filter__input"); - - if (filterInput) { - this._scrollTo(0); - } - }, - fullscreenComposer() { const composer = getOwner(this).lookup("service:composer"); if (composer.get("model")) { diff --git a/app/assets/javascripts/discourse/app/lib/sidebar/admin-nav-map.js b/app/assets/javascripts/discourse/app/lib/sidebar/admin-nav-map.js index c5160da80c30e..00374460c90df 100644 --- a/app/assets/javascripts/discourse/app/lib/sidebar/admin-nav-map.js +++ b/app/assets/javascripts/discourse/app/lib/sidebar/admin-nav-map.js @@ -12,14 +12,6 @@ export const ADMIN_NAV_MAP = [ icon: "house", moderator: true, }, - { - name: "admin_users", - route: "adminUsers", - label: "admin.config.users.title", - description: "admin.config.users.header_description", - icon: "users", - moderator: true, - }, { name: "admin_search", route: "adminSearch", @@ -28,6 +20,14 @@ export const ADMIN_NAV_MAP = [ icon: "magnifying-glass", moderator: true, }, + { + name: "admin_users", + route: "adminUsers", + label: "admin.config.users.title", + description: "admin.config.users.header_description", + icon: "users", + moderator: true, + }, { name: "admin_groups", route: "adminGroups", diff --git a/app/assets/javascripts/discourse/app/lib/sidebar/admin-sidebar.js b/app/assets/javascripts/discourse/app/lib/sidebar/admin-sidebar.js index cb69c0bc27a97..60b5cd15997fa 100644 --- a/app/assets/javascripts/discourse/app/lib/sidebar/admin-sidebar.js +++ b/app/assets/javascripts/discourse/app/lib/sidebar/admin-sidebar.js @@ -1,6 +1,5 @@ import { cached } from "@glimmer/tracking"; import { warn } from "@ember/debug"; -import { htmlSafe } from "@ember/template"; import { configNavForPlugin } from "discourse/lib/admin-plugin-config-nav"; import { adminRouteValid } from "discourse/lib/admin-utilities"; import { getOwnerWithFallback } from "discourse/lib/get-owner"; @@ -11,7 +10,6 @@ import BaseCustomSidebarPanel from "discourse/lib/sidebar/base-custom-sidebar-pa import BaseCustomSidebarSection from "discourse/lib/sidebar/base-custom-sidebar-section"; import BaseCustomSidebarSectionLink from "discourse/lib/sidebar/base-custom-sidebar-section-link"; import { ADMIN_PANEL } from "discourse/lib/sidebar/panels"; -import { escapeExpression } from "discourse/lib/utilities"; import I18n, { i18n } from "discourse-i18n"; let additionalAdminSidebarSectionLinks = {}; @@ -409,21 +407,4 @@ export default class AdminSidebarPanel extends BaseCustomSidebarPanel { ); }); } - - get filterable() { - return true; - } - - filterNoResultsDescription(filter) { - const escapedFilter = escapeExpression(filter); - - return htmlSafe( - i18n("sidebar.no_results.description_admin_search", { - filter: escapedFilter, - admin_search_url: getURL( - `/admin/search?filter=${encodeURIComponent(filter)}` - ), - }) - ); - } } diff --git a/app/assets/javascripts/discourse/app/lib/sidebar/base-custom-sidebar-panel.js b/app/assets/javascripts/discourse/app/lib/sidebar/base-custom-sidebar-panel.js index 1e21b1d7b1873..6e1d341fdaddc 100644 --- a/app/assets/javascripts/discourse/app/lib/sidebar/base-custom-sidebar-panel.js +++ b/app/assets/javascripts/discourse/app/lib/sidebar/base-custom-sidebar-panel.js @@ -50,13 +50,6 @@ export default class BaseCustomSidebarPanel { return false; } - /** - * @returns {boolean} Controls whether the filter is shown - */ - get filterable() { - return false; - } - get expandActiveSection() { return false; } @@ -65,17 +58,6 @@ export default class BaseCustomSidebarPanel { return false; } - /** - * @param {string} filter filter applied - * - * @returns {string | SafeString} Description displayed when the applied filter has no results. - * Use `htmlSafe` from `from "@ember/template` to use HTML strings. - */ - // eslint-disable-next-line no-unused-vars - filterNoResultsDescription(filter) { - return null; - } - #notImplemented() { throw "not implemented"; } diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-sidebar-section-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-sidebar-section-test.js index 5c7b779d3785a..dc6027d3de11f 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-sidebar-section-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-sidebar-section-test.js @@ -1,4 +1,4 @@ -import { click, fillIn, triggerKeyEvent, visit } from "@ember/test-helpers"; +import { click, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; import { AUTO_GROUPS } from "discourse/lib/constants"; import { withPluginApi } from "discourse/lib/plugin-api"; @@ -64,25 +64,6 @@ acceptance("Admin Sidebar - Sections", function (needs) { .exists("advanced section is displayed"); }); - test("filter sections and clear filter with ESC", async function (assert) { - await visit("/admin"); - await fillIn(".sidebar-filter__input", "advanced"); - assert - .dom(".sidebar-section[data-section-name='admin-plugins']") - .doesNotExist("plugins section is hidden"); - assert - .dom(".sidebar-section[data-section-name='admin-advanced']") - .exists("advanced section is displayed"); - - await triggerKeyEvent(".sidebar-filter__input", "keydown", "Escape"); - assert - .dom(".sidebar-section[data-section-name='admin-plugins']") - .exists("plugins section is displayed"); - assert - .dom(".sidebar-section[data-section-name='admin-advanced']") - .exists("advanced section is displayed"); - }); - test("enabled plugin admin routes have links added", async function (assert) { await visit("/admin"); await click(".sidebar-toggle-all-sections"); diff --git a/app/assets/stylesheets/common/base/menu-panel.scss b/app/assets/stylesheets/common/base/menu-panel.scss index af1cf81fdbfd0..b888ede0b52b4 100644 --- a/app/assets/stylesheets/common/base/menu-panel.scss +++ b/app/assets/stylesheets/common/base/menu-panel.scss @@ -229,10 +229,6 @@ .badge-notification { vertical-align: text-bottom; } - - .sidebar-filter { - width: 100%; - } } .search-menu .menu-panel { diff --git a/app/assets/stylesheets/common/base/sidebar.scss b/app/assets/stylesheets/common/base/sidebar.scss index 40fb8eadb060a..d5b99f504cba9 100644 --- a/app/assets/stylesheets/common/base/sidebar.scss +++ b/app/assets/stylesheets/common/base/sidebar.scss @@ -351,68 +351,6 @@ } } -.sidebar-filter { - margin-top: 1em; - margin-bottom: 1em; - border: 1px solid var(--primary-400); - border-radius: var(--d-input-border-radius); - background: var(--secondary); - width: calc( - var(--d-sidebar-width) - 2 * var(--d-sidebar-row-horizontal-padding) - ); - - &:focus-within { - border-color: var(--tertiary); - outline: 1px solid var(--tertiary); - outline-offset: -1px; - } - - &__input-container { - position: relative; - display: flex; - align-items: center; - background: var(--secondary); - border-radius: var(--d-input-border-radius); - } - - &__shortcut-hint { - background-color: rgba(var(--tertiary-rgb), 0.1); - padding: 0.25em 0.5em; - margin-right: 0.5em; - font-size: var(--font-down-3); - color: var(--primary-medium); - } - - &__input[type="text"] { - border: 0; - background: none; - margin-bottom: 0; - height: 2em; - width: 100%; - - &:focus-within { - outline: 0; - } - } - - &__clear { - width: 2em; - height: 2em; - color: var(--primary-medium); - background-color: var(--secondary); - } -} - -.sidebar-no-results { - display: block; - margin: 0.5em var(--d-sidebar-row-horizontal-padding) 0 - var(--d-sidebar-row-horizontal-padding); - - &__title { - font-weight: bold; - } -} - .sidebar-panel-header__row { display: flex; justify-content: space-between; diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index cf79a3cca5b10..cb65103d1ae55 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -5081,12 +5081,6 @@ en: back_to_forum: "Back to Forum" collapse_all_sections: "Collapse all sections" expand_all_sections: "Expand all sections" - filter: "Filter..." - filter_links: "Filter links..." - clear_filter: "Clear filter" - no_results: - title: "No results" - description_admin_search: 'We couldn’t find anything matching ‘%{filter}’.

Try searching the entire admin interface.' footer: interface_color_selector: light: "Light" @@ -5605,6 +5599,7 @@ en: modal_title: "Search anything in admin" title: "Search" instructions: "Type to search for pages, settings, reports, themes, components, and more..." + no_results: 'We couldn’t find anything matching ‘%{filter}’.' result_types: page: one: "Page" diff --git a/spec/system/admin_search_spec.rb b/spec/system/admin_search_spec.rb index f6ad9abb0be5c..e69df774d96dc 100644 --- a/spec/system/admin_search_spec.rb +++ b/spec/system/admin_search_spec.rb @@ -64,4 +64,15 @@ def open_search_modal I18n.t("site_settings.min_topic_title_length"), ) end + + it "informs user about no results" do + visit "/admin" + open_search_modal + + search_modal.search("very long search phrase") + + expect(search_modal).to have_content( + "We couldn’t find anything matching ‘very long search phrase’.", + ) + end end diff --git a/spec/system/admin_sidebar_navigation_spec.rb b/spec/system/admin_sidebar_navigation_spec.rb index cf199b043409d..2b5dd188deacf 100644 --- a/spec/system/admin_sidebar_navigation_spec.rb +++ b/spec/system/admin_sidebar_navigation_spec.rb @@ -8,7 +8,6 @@ let(:sidebar) { PageObjects::Components::NavigationMenu::Sidebar.new } let(:sidebar_dropdown) { PageObjects::Components::SidebarHeaderDropdown.new } - let(:filter) { PageObjects::Components::Filter.new } before do SiteSetting.navigation_menu = "sidebar" @@ -24,7 +23,7 @@ expect(sidebar).to be_visible expect(sidebar).to have_no_section("categories") expect(page).to have_no_css(".admin-main-nav") - filter.click_back_to_forum + sidebar.click_back_to_forum expect(page).to have_current_path("/") expect(sidebar).to have_no_section("admin-root") end @@ -35,7 +34,7 @@ it "navigates back to homepage correctly" do visit("/discuss/admin") - filter.click_back_to_forum + sidebar.click_back_to_forum expect(page).to have_current_path("/discuss/") end end @@ -51,8 +50,8 @@ expect(links.map(&:text)).to eq( [ I18n.t("admin_js.admin.dashboard.title"), - I18n.t("admin_js.admin.config.users.title"), I18n.t("admin_js.admin.config.search_everything.title"), + I18n.t("admin_js.admin.config.users.title"), I18n.t("admin_js.admin.config.groups.title"), I18n.t("admin_js.admin.config.site_settings.title"), I18n.t("admin_js.admin.config.whats_new.title"), @@ -71,119 +70,13 @@ sidebar_dropdown.click expect(sidebar).to have_no_section("community") expect(page).to have_no_css(".admin-main-nav") - filter.click_back_to_forum + sidebar.click_back_to_forum expect(page).to have_current_path("/") sidebar_dropdown.click expect(sidebar).to have_no_section("admin-root") end end - it "allows links to be filtered" do - visit("/admin") - sidebar.toggle_all_sections - - expect(page).to have_selector( - ".sidebar-section-link-content-text", - minimum: UNFILTERED_LINK_COUNT, - ) - expect(page).to have_no_css(".sidebar-no-results") - all_links_count = page.all(".sidebar-section-link-content-text").count - - filter.filter("ie") - links = page.all(".sidebar-section-link-content-text") - expect(links.map(&:text)).to eq( - [ - I18n.t("admin_js.admin.config.content.title"), - I18n.t("admin_js.admin.config.user_fields.title"), - I18n.t("admin_js.admin.config.flags.title"), - I18n.t("admin_js.admin.config.email.title"), - ], - ) - expect(page).to have_no_css(".sidebar-no-results") - - filter.filter("ieeee") - expect(page).to have_no_css(".sidebar-section-link-content-text") - expect(page).to have_css(".sidebar-no-results") - - filter.clear - links = page.all(".sidebar-section-link-content-text") - expect(links.count).to eq(all_links_count) - expect(page).to have_no_css(".sidebar-no-results") - expect(page).to have_css(".sidebar-sections__back-to-forum") - - # When match section title, display all links - filter.filter("Email") - links = page.all(".sidebar-section-link-content-text") - expect(links.map(&:text)).to eq( - [ - I18n.t("admin_js.admin.config.email.title"), - I18n.t("admin_js.admin.config.email_appearance.title"), - I18n.t("admin_js.admin.config.email_logs.title"), - I18n.t("admin_js.admin.config.staff_action_logs.title"), - ], - ) - end - - it "escapes the filtered expression for regex expressions" do - visit("/admin") - - filter.filter(".*") # this shouldn't return any results if the expression was escaped - expect(page).to have_no_css(".sidebar-section-link-content-text") - expect(page).to have_css(".sidebar-no-results") - end - - it "displays the no results description message correctly when the filter has no results" do - visit("/admin") - - filter.filter("ieeee") - expect(page).to have_no_css(".sidebar-section-link-content-text") - expect(page).to have_css(".sidebar-no-results") - - no_results_description = page.find(".sidebar-no-results__description") - expect(no_results_description.text).to eq( - "We couldn’t find anything matching ‘ieeee’.\n\nTry searching the entire admin interface.", - ) - end - - it "temporarily expands section when filter" do - visit("/admin") - links = page.all(".sidebar-section-link-content-text") - expect(links.map(&:text)).to eq( - [ - I18n.t("admin_js.admin.dashboard.title"), - I18n.t("admin_js.admin.config.users.title"), - I18n.t("admin_js.admin.config.search_everything.title"), - I18n.t("admin_js.admin.config.groups.title"), - I18n.t("admin_js.admin.config.site_settings.title"), - I18n.t("admin_js.admin.config.whats_new.title"), - ], - ) - - filter.filter("ie") - links = page.all(".sidebar-section-link-content-text") - expect(links.map(&:text)).to eq( - [ - I18n.t("admin_js.admin.config.content.title"), - I18n.t("admin_js.admin.config.user_fields.title"), - I18n.t("admin_js.admin.config.flags.title"), - I18n.t("admin_js.admin.config.email.title"), - ], - ) - - filter.filter("") - links = page.all(".sidebar-section-link-content-text") - expect(links.map(&:text)).to eq( - [ - I18n.t("admin_js.admin.dashboard.title"), - I18n.t("admin_js.admin.config.users.title"), - I18n.t("admin_js.admin.config.search_everything.title"), - I18n.t("admin_js.admin.config.groups.title"), - I18n.t("admin_js.admin.config.site_settings.title"), - I18n.t("admin_js.admin.config.whats_new.title"), - ], - ) - end - it "allows sections to be expanded" do visit("/admin") sidebar.toggle_all_sections @@ -197,8 +90,8 @@ expect(all(".sidebar-section-link-content-text").map(&:text)).to eq( [ I18n.t("admin_js.admin.dashboard.title"), - I18n.t("admin_js.admin.config.users.title"), I18n.t("admin_js.admin.config.search_everything.title"), + I18n.t("admin_js.admin.config.users.title"), I18n.t("admin_js.admin.config.groups.title"), I18n.t("admin_js.admin.config.site_settings.title"), I18n.t("admin_js.admin.config.whats_new.title"), @@ -212,38 +105,6 @@ ) end - it "accepts hidden keywords like installed plugin names for filter" do - Discourse.instance_variable_set( - "@plugins", - Plugin::Instance.find_all("#{Rails.root}/spec/fixtures/plugins"), - ) - - visit("/admin") - sidebar.toggle_all_sections - filter.filter("csp_extension") - links = page.all(".sidebar-section-link-content-text") - expect(links.count).to eq(1) - expect(links.map(&:text)).to eq([I18n.t("admin_js.admin.config.plugins.title")]) - end - - it "accepts components and themes keywords for filter" do - Fabricate(:theme, name: "Air theme", component: false) - Fabricate(:theme, name: "Kanban", component: true) - - visit("/admin") - sidebar.toggle_all_sections - - filter.filter("air") - links = page.all(".sidebar-section-link-content-text") - expect(links.count).to eq(1) - expect(links.map(&:text)).to eq(["Themes and components"]) - - filter.filter("kanban") - links = page.all(".sidebar-section-link-content-text") - expect(links.count).to eq(1) - expect(links.map(&:text)).to eq(["Themes and components"]) - end - it "highlights the 'Themes and components' link when the themes page is visited" do visit("/admin/customize/themes") expect(page).to have_css( @@ -279,8 +140,8 @@ expect(links.map(&:text)).to eq( [ I18n.t("admin_js.admin.dashboard.title"), - I18n.t("admin_js.admin.config.users.title"), I18n.t("admin_js.admin.config.search_everything.title"), + I18n.t("admin_js.admin.config.users.title"), I18n.t("admin_js.admin.config.groups.title"), I18n.t("admin_js.admin.config.whats_new.title"), I18n.t("admin_js.admin.config.reports.title"), diff --git a/spec/system/page_objects/components/filter.rb b/spec/system/page_objects/components/filter.rb deleted file mode 100644 index 4329ac074bbde..0000000000000 --- a/spec/system/page_objects/components/filter.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true - -module PageObjects - module Components - class Filter < PageObjects::Components::Base - def filter(text) - page.find(".sidebar-filter__input").fill_in(with: text) - self - end - - def clear - page.find(".sidebar-filter__clear").click - self - end - - def click_back_to_forum - page.find(".sidebar-sections__back-to-forum").click - self - end - end - end -end diff --git a/spec/system/page_objects/components/navigation_menu/sidebar.rb b/spec/system/page_objects/components/navigation_menu/sidebar.rb index a64e460909632..ebbb94d8b76ea 100644 --- a/spec/system/page_objects/components/navigation_menu/sidebar.rb +++ b/spec/system/page_objects/components/navigation_menu/sidebar.rb @@ -64,6 +64,11 @@ def toggle_all_sections def toggle_section(name) find("[data-section-name='admin-#{name.to_s.downcase}']").click end + + def click_back_to_forum + page.find(".sidebar-sections__back-to-forum").click + self + end end end end From 072546ff8ce54126c6c37a534d89f367512ab25b Mon Sep 17 00:00:00 2001 From: Krzysztof Kotlarek Date: Mon, 28 Apr 2025 15:29:00 +0800 Subject: [PATCH 2/2] FIX: uneccessary htmlSafe --- .../javascripts/admin/addon/components/admin-search.gjs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/admin/addon/components/admin-search.gjs b/app/assets/javascripts/admin/addon/components/admin-search.gjs index 2d575375a5d5e..d7d8bf9a9149a 100644 --- a/app/assets/javascripts/admin/addon/components/admin-search.gjs +++ b/app/assets/javascripts/admin/addon/components/admin-search.gjs @@ -65,11 +65,9 @@ export default class AdminSearch extends Component { } get noResultsDescription() { - return htmlSafe( - i18n("admin.search.no_results", { - filter: escapeExpression(this.filter), - }) - ); + return i18n("admin.search.no_results", { + filter: escapeExpression(this.filter), + }); } @action