From 44bb733b0867cb09ceac606bb96014f2417cda35 Mon Sep 17 00:00:00 2001 From: Yuriy Kurant Date: Thu, 15 May 2025 16:41:44 +0800 Subject: [PATCH 1/4] Revert "UX: header search mobile support - follow up (#32306)" This reverts commit ff334fde8e9b98af4b7ee540a3b23a87bcc88b6c. --- .../discourse/app/components/header.gjs | 3 --- .../discourse/app/components/search-menu.gjs | 8 +++--- .../search-menu/advanced-button.gjs | 2 +- .../components/search-menu/clear-button.gjs | 17 +++++++----- .../app/modifiers/delayed-destroy.js | 2 +- .../tests/acceptance/search-mobile-test.js | 6 ++--- .../stylesheets/common/base/menu-panel.scss | 26 +++++++------------ .../desktop/components/header-search.scss | 2 +- 8 files changed, 30 insertions(+), 36 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/header.gjs b/app/assets/javascripts/discourse/app/components/header.gjs index 6a589d73fdce2..e71e5cf647de9 100644 --- a/app/assets/javascripts/discourse/app/components/header.gjs +++ b/app/assets/javascripts/discourse/app/components/header.gjs @@ -116,7 +116,6 @@ export default class GlimmerHeader extends Component { handleAnimationComplete() { this.hasClosingAnimation = false; this.search.visible = false; - this.toggleBodyScrolling(false); } @action @@ -170,11 +169,9 @@ export default class GlimmerHeader extends Component { } if (this.site.mobileView && this.search.visible) { - // hide is delayed for the duration of `search-slide-out` animation this.hasClosingAnimation = true; } else { this.search.visible = !this.search.visible; - this.toggleBodyScrolling(true); } if (!this.search.visible) { diff --git a/app/assets/javascripts/discourse/app/components/search-menu.gjs b/app/assets/javascripts/discourse/app/components/search-menu.gjs index 5932d0c8806c8..4d16d984d83ec 100644 --- a/app/assets/javascripts/discourse/app/components/search-menu.gjs +++ b/app/assets/javascripts/discourse/app/components/search-menu.gjs @@ -188,7 +188,9 @@ export default class SearchMenu extends Component { } @bind - clearSearch() { + clearSearch(e) { + e.stopPropagation(); + e.preventDefault(); this.search.activeGlobalSearchTerm = ""; this.search.focusSearchInput(); this.triggerSearch(); @@ -469,8 +471,8 @@ export default class SearchMenu extends Component { {{/if}} diff --git a/app/assets/javascripts/discourse/app/components/search-menu/advanced-button.gjs b/app/assets/javascripts/discourse/app/components/search-menu/advanced-button.gjs index 092dbe68e97d5..e9db1ad774df1 100644 --- a/app/assets/javascripts/discourse/app/components/search-menu/advanced-button.gjs +++ b/app/assets/javascripts/discourse/app/components/search-menu/advanced-button.gjs @@ -3,7 +3,7 @@ import { i18n } from "discourse-i18n"; diff --git a/app/assets/javascripts/discourse/app/modifiers/delayed-destroy.js b/app/assets/javascripts/discourse/app/modifiers/delayed-destroy.js index b9235ad4a6185..5fb7fa67b83d1 100644 --- a/app/assets/javascripts/discourse/app/modifiers/delayed-destroy.js +++ b/app/assets/javascripts/discourse/app/modifiers/delayed-destroy.js @@ -15,7 +15,7 @@ export default modifier( ( element, posArgs, - { animate = false, onComplete = () => {}, elementSelector, delay = 200 } + { animate = false, onComplete = () => {}, elementSelector, delay = 300 } ) => { if (animate) { const targetEl = elementSelector diff --git a/app/assets/javascripts/discourse/tests/acceptance/search-mobile-test.js b/app/assets/javascripts/discourse/tests/acceptance/search-mobile-test.js index bd914b8f5b784..d394623fc933c 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/search-mobile-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/search-mobile-test.js @@ -52,7 +52,7 @@ acceptance("Search - Mobile", function (needs) { "search results are listed on search value present" ); - await click('[data-test-button="clear-search-input"]'); + await click('[data-test-anchor="clear-search-input"]'); assert .dom('[data-test-selector="search-menu-results"]') @@ -64,7 +64,7 @@ acceptance("Search - Mobile", function (needs) { test("with empty input search", async function (assert) { await visit("/"); await click("#search-button"); - await click('[data-test-button="cancel-mobile-search"]'); + await click('[data-test-button="cancel-search-mobile"]'); assert .dom('[data-test-selector="menu-panel"]') @@ -82,7 +82,7 @@ acceptance("Search - Mobile", function (needs) { "search results are listed on search value present" ); - await click('[data-test-button="cancel-mobile-search"]'); + await click('[data-test-button="cancel-search-mobile"]'); await click("#search-button"); assert.dom('[data-test-input="search-term"]').hasNoValue(); diff --git a/app/assets/stylesheets/common/base/menu-panel.scss b/app/assets/stylesheets/common/base/menu-panel.scss index 6f8a2a77a5fcf..69d24fa006efe 100644 --- a/app/assets/stylesheets/common/base/menu-panel.scss +++ b/app/assets/stylesheets/common/base/menu-panel.scss @@ -244,44 +244,36 @@ &.search-menu-panel { width: 100vw; max-width: 100vw; - padding: 0; - transform-origin: 66%; - transition: height 0.2s ease-in; &.empty-panel { - height: 4rem; + height: auto; } &.slide-in { - animation: search-slide-in 0.2s ease-out forwards; + animation: search-slidein 0.3s ease-out forwards; } &.is-destroying { - animation: search-slide-out 0.2s ease-in forwards; + animation: search-slideout 0.3s ease-in forwards; } - @keyframes search-slide-in { + @keyframes search-slidein { from { opacity: 0; - transform: scaleX(0); + transform: translateY(-100%); } } - @keyframes search-slide-out { - from { - transform: scaleX(1); + @keyframes search-slideout { + 80% { opacity: 1; } - to { + 100% { opacity: 0; - transform: scaleX(0); + transform: translateY(-100%); } } - - .btn-cancel-mobile-search { - align-self: stretch; - } } } } diff --git a/app/assets/stylesheets/desktop/components/header-search.scss b/app/assets/stylesheets/desktop/components/header-search.scss index 7c6d3f1c828fd..8497aa2cb3c24 100644 --- a/app/assets/stylesheets/desktop/components/header-search.scss +++ b/app/assets/stylesheets/desktop/components/header-search.scss @@ -74,7 +74,7 @@ justify-content: flex-end; .show-advanced-search, - .clear-search { + a.clear-search { display: inline-flex; align-items: center; } From fa35a362a841e459da27db4a5c126c4eb231cff1 Mon Sep 17 00:00:00 2001 From: Yuriy Kurant Date: Thu, 15 May 2025 18:27:33 +0800 Subject: [PATCH 2/4] Revert "UX: header search mobile support (#31711)" This reverts commit 8b5da219d805bd8668e77a6bab7f1ada96d736c8. --- .../discourse/app/components/header.gjs | 43 ++--- .../components/header/search-menu-wrapper.gjs | 6 +- .../discourse/app/components/menu-panel.gjs | 6 +- .../app/components/search-menu-panel.gjs | 7 +- .../discourse/app/components/search-menu.gjs | 151 +++++++----------- .../components/search-menu/active-filters.gjs | 30 ---- .../search-menu/advanced-button.gjs | 6 +- .../components/search-menu/clear-button.gjs | 6 +- .../search-menu/mobile-search-button.gjs | 12 -- .../app/components/search-menu/results.gjs | 32 +--- .../search-menu/results/assistant-item.gjs | 2 - .../search-menu/results/assistant.gjs | 15 +- .../search-menu/results/initial-options.gjs | 39 ++--- .../search-menu/results/more-link.gjs | 1 - .../search-menu/results/random-quick-tip.gjs | 2 +- .../search-menu/results/recent-searches.gjs | 3 +- .../components/search-menu/results/types.gjs | 3 +- .../components/search-menu/search-term.gjs | 5 +- .../app/modifiers/delayed-destroy.js | 32 ---- .../discourse/app/services/search.js | 2 +- .../tests/acceptance/search-mobile-test.js | 135 +--------------- .../discourse/tests/acceptance/search-test.js | 7 +- .../components/search-menu-test.gjs | 7 +- .../modifiers/delayed-destroy-test.gjs | 58 ------- .../stylesheets/common/base/menu-panel.scss | 37 ----- .../stylesheets/common/base/search-menu.scss | 40 ++--- spec/support/shared_examples/core_features.rb | 2 - spec/system/page_objects/pages/search.rb | 6 +- spec/system/search_spec.rb | 4 - .../system/user_page/user_page_search_spec.rb | 1 - 30 files changed, 138 insertions(+), 562 deletions(-) delete mode 100644 app/assets/javascripts/discourse/app/components/search-menu/active-filters.gjs delete mode 100644 app/assets/javascripts/discourse/app/components/search-menu/mobile-search-button.gjs delete mode 100644 app/assets/javascripts/discourse/app/modifiers/delayed-destroy.js delete mode 100644 app/assets/javascripts/discourse/tests/integration/modifiers/delayed-destroy-test.gjs diff --git a/app/assets/javascripts/discourse/app/components/header.gjs b/app/assets/javascripts/discourse/app/components/header.gjs index e71e5cf647de9..7470b635e6de4 100644 --- a/app/assets/javascripts/discourse/app/components/header.gjs +++ b/app/assets/javascripts/discourse/app/components/header.gjs @@ -10,7 +10,7 @@ import PluginOutlet from "discourse/components/plugin-outlet"; import DAG from "discourse/lib/dag"; import scrollLock from "discourse/lib/scroll-lock"; import { scrollTop } from "discourse/lib/scroll-top"; -import delayedDestroy from "discourse/modifiers/delayed-destroy"; +import DiscourseURL from "discourse/lib/url"; import AuthButtons from "./header/auth-buttons"; import Contents from "./header/contents"; import HamburgerDropdownWrapper from "./header/hamburger-dropdown-wrapper"; @@ -48,7 +48,7 @@ export default class GlimmerHeader extends Component { @service appEvents; @service header; - @tracked hasClosingAnimation = false; + @tracked skipSearchContext = this.site.mobileView; appEventsListeners = modifierFn(() => { this.appEvents.on( @@ -112,12 +112,6 @@ export default class GlimmerHeader extends Component { }; }); - @action - handleAnimationComplete() { - this.hasClosingAnimation = false; - this.search.visible = false; - } - @action closeCurrentMenu() { if (this.search.visible) { @@ -159,21 +153,23 @@ export default class GlimmerHeader extends Component { @action toggleSearchMenu() { - if ( - this.site.mobileView && - this.router.currentRouteName === "full-page-search" - ) { - scrollTop(); - document.querySelector(".full-page-search").focus(); - return false; - } + if (this.site.mobileView) { + const context = this.search.searchContext; + let params = ""; + if (context) { + params = `?context=${context.type}&context_id=${context.id}&skip_context=${this.skipSearchContext}`; + } - if (this.site.mobileView && this.search.visible) { - this.hasClosingAnimation = true; - } else { - this.search.visible = !this.search.visible; + if (this.router.currentRouteName === "full-page-search") { + scrollTop(); + document.querySelector(".full-page-search").focus(); + return false; + } else { + return DiscourseURL.routeTo("/search" + params); + } } + this.search.visible = !this.search.visible; if (!this.search.visible) { this.search.highlightTerm = ""; this.search.inTopicContext = false; @@ -300,13 +296,8 @@ export default class GlimmerHeader extends Component { {{#if this.search.visible}} {{else if this.header.hamburgerVisible}} +const SearchMenuWrapper = +; + +export default SearchMenuWrapper; diff --git a/app/assets/javascripts/discourse/app/components/menu-panel.gjs b/app/assets/javascripts/discourse/app/components/menu-panel.gjs index fd9cff4f76513..5a7acec8001d6 100644 --- a/app/assets/javascripts/discourse/app/components/menu-panel.gjs +++ b/app/assets/javascripts/discourse/app/components/menu-panel.gjs @@ -1,10 +1,9 @@ import concatClass from "discourse/helpers/concat-class"; -; +export default MenuPanel; diff --git a/app/assets/javascripts/discourse/app/components/search-menu-panel.gjs b/app/assets/javascripts/discourse/app/components/search-menu-panel.gjs index 71b70c4f968c0..28a2fa2c02493 100644 --- a/app/assets/javascripts/discourse/app/components/search-menu-panel.gjs +++ b/app/assets/javascripts/discourse/app/components/search-menu-panel.gjs @@ -2,10 +2,8 @@ import Component from "@glimmer/component"; import { service } from "@ember/service"; import MenuPanel from "discourse/components/menu-panel"; import SearchMenu from "discourse/components/search-menu"; -import concatClass from "discourse/helpers/concat-class"; export default class SearchMenuPanel extends Component { - @service search; @service site; get animationClass() { @@ -17,10 +15,7 @@ export default class SearchMenuPanel extends Component {