From ba7a8ee6bd7bfcab2a1a621e8d1c6cf57408035f Mon Sep 17 00:00:00 2001 From: Mir Bhatia Date: Mon, 13 Apr 2026 11:21:08 +0200 Subject: [PATCH] Update autocompleter option labels --- .../forms/meeting/template_autocompleter.rb | 14 ++++++- .../create_meeting_from_template_spec.rb | 37 +++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/modules/meeting/app/forms/meeting/template_autocompleter.rb b/modules/meeting/app/forms/meeting/template_autocompleter.rb index 35510d16e5e..cf9e05ed830 100644 --- a/modules/meeting/app/forms/meeting/template_autocompleter.rb +++ b/modules/meeting/app/forms/meeting/template_autocompleter.rb @@ -39,7 +39,7 @@ class Meeting::TemplateAutocompleter < ApplicationForm templates.each do |template| select.option( value: template.id, - label: template.title, + label: label(template), selected: template.id == @selected_id ) end @@ -74,6 +74,16 @@ class Meeting::TemplateAutocompleter < ApplicationForm def templates return [] if @disabled - Meeting.templates_visible_in_project(@project).order(:title) + Meeting.templates_visible_in_project(@project) + .includes(:project) + .order("projects.name ASC, meetings.title ASC") + end + + def label(template) + if template.project_id == @project.id + template.title + else + "#{template.project.name}: #{template.title}" + end end end diff --git a/modules/meeting/spec/features/meeting_templates/create_meeting_from_template_spec.rb b/modules/meeting/spec/features/meeting_templates/create_meeting_from_template_spec.rb index a98dc1e8b24..d29473e9107 100644 --- a/modules/meeting/spec/features/meeting_templates/create_meeting_from_template_spec.rb +++ b/modules/meeting/spec/features/meeting_templates/create_meeting_from_template_spec.rb @@ -380,4 +380,41 @@ RSpec.describe "Create meeting from template", :js do end end end + + describe "autocompleter labels and ordering", with_ee: [:meeting_templates] do + let(:project_a) { create(:project, name: "Project A", enabled_module_names: %i[meetings]) } + let(:project_b) { create(:project, name: "Project B", enabled_module_names: %i[meetings]) } + + let!(:template_a1) { create(:onetime_template, project: project_a, title: "Template A1") } + let!(:template_a2) { create(:onetime_template, project: project_a, title: "Template A2") } + let!(:template_b1) { create(:onetime_template, project: project_b, title: "Template A1", sharing: :system) } + + let(:project_a_meetings_page) { Pages::Meetings::Index.new(project: project_a) } + + before { project_a_meetings_page.visit! } + + it "prefixes templates from other projects with their project name" do + project_a_meetings_page.click_on "add-meeting-button" + project_a_meetings_page.click_on "One-time" + + within_dialog "New one-time meeting" do + find('[data-test-selector="template_id"]').click + + expect(page).to have_text("Template A1") + expect(page).to have_text("Template A2") + expect(page).to have_text("Project B: Template A1") + end + end + + it "orders options such that all templates from a project are grouped together" do + project_a_meetings_page.click_on "add-meeting-button" + project_a_meetings_page.click_on "One-time" + + within_dialog "New one-time meeting" do + find('[data-test-selector="template_id"]').click + + expect(all(".ng-option").map(&:text)).to eq(["Template A1", "Template A2", "Project B: Template A1"]) + end + end + end end