From 5aa9bf7f7ecbfc1a45c9286231a04dbb1189c66f Mon Sep 17 00:00:00 2001 From: mmd-osm Date: Sun, 21 Sep 2025 09:39:30 +0200 Subject: [PATCH] Language selection enhancements - Dynamic loading using Turbo - Search field --- app/abilities/ability.rb | 2 +- app/assets/javascripts/application.js | 36 +++++++++ app/controllers/languages_panes_controller.rb | 12 +++ .../_select_language_list.html.erb | 44 +++++++++++ app/views/languages_panes/show.html.erb | 11 +++ app/views/layouts/_header.html.erb | 16 ++-- .../layouts/_select_language_list.html.erb | 25 ------ config/locales/en.yml | 79 ++++++++++--------- config/routes.rb | 1 + test/system/select_language_test.rb | 10 +++ 10 files changed, 163 insertions(+), 73 deletions(-) create mode 100644 app/controllers/languages_panes_controller.rb create mode 100644 app/views/languages_panes/_select_language_list.html.erb create mode 100644 app/views/languages_panes/show.html.erb delete mode 100644 app/views/layouts/_select_language_list.html.erb diff --git a/app/abilities/ability.rb b/app/abilities/ability.rb index 5a54c5586..471452986 100644 --- a/app/abilities/ability.rb +++ b/app/abilities/ability.rb @@ -4,7 +4,7 @@ class Ability include CanCan::Ability def initialize(user) - can :read, [:feature_query, :layers_pane, :legend_pane, :share_pane] + can :read, [:feature_query, :layers_pane, :legend_pane, :share_pane, :languages_pane] can :read, [Node, Way, Relation, OldNode, OldWay, OldRelation] can :read, [RelationMember, OldRelationMember] can [:show, :create], Note diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index a5da79e9d..c17fb4355 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -201,4 +201,40 @@ $(function () { $("#edit_tab") .attr("title", OSM.i18n.t("javascripts.site.edit_disabled_tooltip")); + + document.addEventListener("turbo:frame-load", function (event) { + if (event.target.id === "select_language_list") { + const $search = $("#language_search"); + if ($search.length) { + $search.off("input"); + $search.on("input", function () { + const query = $(this).val().toLowerCase(); + $(".language-item").each(function () { + const text = $(this).text().toLowerCase(); + $(this).toggle(text.indexOf(query) > -1); + }); + }); + } + $search + .val("") + .trigger("input") + .trigger("focus"); + } + }); + + $("#select_language_dialog").on("shown.bs.modal", function () { + $("#language_search") + .val("") + .trigger("input") + .trigger("focus"); + const $frame = $("#select_language_list"); + const originalSrc = new URL($frame.attr("src"), window.location.origin); + + // Set `source` query param to current page path + query string + originalSrc.searchParams.set("source", window.location.pathname + window.location.search); + + if ($frame.attr("src") !== originalSrc.toString()) { + $frame.attr("src", originalSrc.toString()); + } + }); }); diff --git a/app/controllers/languages_panes_controller.rb b/app/controllers/languages_panes_controller.rb new file mode 100644 index 000000000..d4fbb9675 --- /dev/null +++ b/app/controllers/languages_panes_controller.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class LanguagesPanesController < ApplicationController + before_action :authorize_web + before_action :set_locale + authorize_resource :class => false + + def show + @source_page = params[:source] + render :layout => false + end +end diff --git a/app/views/languages_panes/_select_language_list.html.erb b/app/views/languages_panes/_select_language_list.html.erb new file mode 100644 index 000000000..008302a97 --- /dev/null +++ b/app/views/languages_panes/_select_language_list.html.erb @@ -0,0 +1,44 @@ +
+ <%= text_field_tag :language_search, + params[:language_search], + :placeholder => t(".search_language", :default => "Search..."), + :autocomplete => "off", + :dir => "auto", + :class => "form-control py-2 px-3" %> +
+ diff --git a/app/views/languages_panes/show.html.erb b/app/views/languages_panes/show.html.erb new file mode 100644 index 000000000..38a5340f6 --- /dev/null +++ b/app/views/languages_panes/show.html.erb @@ -0,0 +1,11 @@ +<%= turbo_frame_tag "select_language_list" do %> + <% if current_user&.id %> + <%= form_tag basic_preferences_path, :method => "PUT" do %> + <%= hidden_field_tag "referer", @source_page %> + <%= hidden_field_tag "language", I18n.locale %> + <%= render "select_language_list" %> + <% end %> + <% else %> + <%= render "select_language_list" %> + <% end %> +<% end %> diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index fe2552557..9f8fd5c03 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -116,15 +116,13 @@ diff --git a/app/views/layouts/_select_language_list.html.erb b/app/views/layouts/_select_language_list.html.erb deleted file mode 100644 index 9deb09c75..000000000 --- a/app/views/layouts/_select_language_list.html.erb +++ /dev/null @@ -1,25 +0,0 @@ - diff --git a/config/locales/en.yml b/config/locales/en.yml index a66e5f135..8118dfe4c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1723,45 +1723,9 @@ en: create: successful_report: Your report has been registered successfully provide_details: Please provide the required details - layouts: - project_name: - # in - title: OpenStreetMap - # in <h1> - h1: OpenStreetMap - logo: - alt_text: OpenStreetMap logo - home: Go to Home Location - logout: Log Out - log_in: Log In - sign_up: Sign Up - start_mapping: Start Mapping - edit: Edit - history: History - export: Export - issues: Issues - gps_traces: GPS Traces - user_diaries: User Diaries - edit_with: Edit with %{editor} - intro_header: Welcome to OpenStreetMap! - intro_text: OpenStreetMap is a map of the world, created by people like you and free to use under an open license. - hosting_partners_2024_html: "Hosting is supported by %{fastly}, %{corpmembers}, and other %{partners}." - partners_fastly: "Fastly" - partners_corpmembers: "OSMF corporate members" - partners_partners: "partners" - tou: "Terms of Use" - nothing_to_preview: "Nothing to preview." - help: Help - about: About - copyright: Copyright - communities: Communities - learn_more: "Learn More" - more: More - header: - select_language: Select Language - select_language_button: - title: Select Language + languages_panes: select_language_list: + search_language: Search... languages: af: Afrikaans gsw: Alemannic @@ -1872,6 +1836,45 @@ en: zh-HK: Chinese (Hong Kong) ja: Japanese ko: Korean + layouts: + project_name: + # in <title> + title: OpenStreetMap + # in <h1> + h1: OpenStreetMap + logo: + alt_text: OpenStreetMap logo + home: Go to Home Location + logout: Log Out + log_in: Log In + sign_up: Sign Up + start_mapping: Start Mapping + edit: Edit + history: History + export: Export + issues: Issues + gps_traces: GPS Traces + user_diaries: User Diaries + edit_with: Edit with %{editor} + intro_header: Welcome to OpenStreetMap! + intro_text: OpenStreetMap is a map of the world, created by people like you and free to use under an open license. + hosting_partners_2024_html: "Hosting is supported by %{fastly}, %{corpmembers}, and other %{partners}." + partners_fastly: "Fastly" + partners_corpmembers: "OSMF corporate members" + partners_partners: "partners" + tou: "Terms of Use" + nothing_to_preview: "Nothing to preview." + help: Help + about: About + copyright: Copyright + communities: Communities + learn_more: "Learn More" + more: More + header: + select_language: Select Language + loading: Loading... + select_language_button: + title: Select Language offline_flash: osm_offline: "The OpenStreetMap database is currently offline while essential maintenance work is carried out." osm_read_only: "The OpenStreetMap database is currently in read-only mode while essential maintenance work is carried out." diff --git a/config/routes.rb b/config/routes.rb index 3ecd1ec10..8b8e296ea 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -208,6 +208,7 @@ OpenStreetMap::Application.routes.draw do post "/login" => "sessions#create" match "/logout" => "sessions#destroy", :via => [:get, :post] get "/offline" => "site#offline" + resource :languages_pane, :path => "/panes/languages", :only => :show resource :layers_pane, :path => "/panes/layers", :only => :show resource :legend_pane, :path => "/panes/legend", :only => :show resource :share_pane, :path => "/panes/share", :only => :show diff --git a/test/system/select_language_test.rb b/test/system/select_language_test.rb index 3b55ba39d..ad8ab0f53 100644 --- a/test/system/select_language_test.rb +++ b/test/system/select_language_test.rb @@ -12,6 +12,11 @@ class SelectLanguageTest < ApplicationSystemTestCase end click_on "Select Language" + + assert_content "English" + fill_in "Search...", :with => "fra" + assert_no_content "English" + click_on "français" within_content_heading do @@ -33,6 +38,11 @@ class SelectLanguageTest < ApplicationSystemTestCase end click_on "Select Language" + + assert_content "English" + fill_in "Search...", :with => "fra" + assert_no_content "English" + click_on "français" assert_text "Préférences mises à jour" -- 2.39.5