From 6aa6e008527192fda8784c285def370c4e28084e Mon Sep 17 00:00:00 2001 From: Ivan Kuchin Date: Wed, 12 Nov 2025 18:30:44 +0100 Subject: [PATCH] keep workspace type url when selecting template --- .../template_select_component.html.erb | 2 +- .../projects/template_select_component.rb | 11 ++++ app/views/projects/new.html.erb | 1 + .../template_select_component_spec.rb | 57 ++++++++++++++++++- 4 files changed, 69 insertions(+), 2 deletions(-) diff --git a/app/components/projects/template_select_component.html.erb b/app/components/projects/template_select_component.html.erb index 4bda836cc39..840956d072d 100644 --- a/app/components/projects/template_select_component.html.erb +++ b/app/components/projects/template_select_component.html.erb @@ -30,7 +30,7 @@ See COPYRIGHT and LICENSE files for more details. <%= component_wrapper do settings_primer_form_with( - url: new_project_path, + url: new_workspace_path, method: :get, data: { turbo_frame: Projects::NewComponent.wrapper_key, diff --git a/app/components/projects/template_select_component.rb b/app/components/projects/template_select_component.rb index 4e90cc601c6..be25bdb1842 100644 --- a/app/components/projects/template_select_component.rb +++ b/app/components/projects/template_select_component.rb @@ -35,12 +35,23 @@ module Projects include OpPrimer::ComponentHelpers include OpTurbo::Streamable + option :project option :template option :parent, optional: true option :current_user, default: -> { User.current } private + def new_workspace_path + workspace_type = if Project.workspace_types.key?(project.workspace_type) + project.workspace_type.to_sym + else + :project + end + + url_for([:new, workspace_type]) + end + def template_id = template&.id def parent_id = parent&.id end diff --git a/app/views/projects/new.html.erb b/app/views/projects/new.html.erb index be93cc17c42..eade24d70fe 100644 --- a/app/views/projects/new.html.erb +++ b/app/views/projects/new.html.erb @@ -36,6 +36,7 @@ See COPYRIGHT and LICENSE files for more details. <%= render Projects::TemplateSelectComponent.new( + project: @new_project, template: @template, parent: @parent, current_user: diff --git a/spec/components/projects/template_select_component_spec.rb b/spec/components/projects/template_select_component_spec.rb index 5c0c6d41697..ae78ff2f354 100644 --- a/spec/components/projects/template_select_component_spec.rb +++ b/spec/components/projects/template_select_component_spec.rb @@ -35,15 +35,70 @@ RSpec.describe Projects::TemplateSelectComponent, type: :component do render_inline(described_class.new(...)) end + let(:project) { Project.new } let(:template) { build_stubbed(:template_project) } let(:current_user) { build_stubbed(:user) } - subject(:rendered_component) { render_component(template:, current_user:) } + subject(:rendered_component) { render_component(project:, template:, current_user:) } it "renders form" do expect(rendered_component).to have_element :form, method: "get" end + describe "action" do + let(:project) { Project.new(workspace_type:) } + + context "when workspace type is not set" do + let(:workspace_type) { nil } + + it "sets action to create project" do + expect(rendered_component).to have_element :form, method: "get" do |form| + expect(form["action"]).to eq "/projects/new" + end + end + end + + context "when workspace type set to unknown value" do + let(:workspace_type) { :unknown } + + it "sets action to create project" do + expect(rendered_component).to have_element :form, method: "get" do |form| + expect(form["action"]).to eq "/projects/new" + end + end + end + + context "when workspace type is set to project" do + let(:workspace_type) { :project } + + it "sets action to create project" do + expect(rendered_component).to have_element :form, method: "get" do |form| + expect(form["action"]).to eq "/projects/new" + end + end + end + + context "when workspace type is set to program" do + let(:workspace_type) { :program } + + it "sets action to create project" do + expect(rendered_component).to have_element :form, method: "get" do |form| + expect(form["action"]).to eq "/programs/new" + end + end + end + + context "when workspace type is set to portfolio" do + let(:workspace_type) { :portfolio } + + it "sets action to create project" do + expect(rendered_component).to have_element :form, method: "get" do |form| + expect(form["action"]).to eq "/portfolios/new" + end + end + end + end + it "registers Stimulus controller" do expect(rendered_component).to have_element :form do |form| expect(form["data-controller"]).to include "auto-submit"