rename persisted project query

This commit is contained in:
Ivan Kuchin
2024-05-14 15:48:22 +02:00
parent bef745f262
commit 86909ef457
8 changed files with 89 additions and 12 deletions
@@ -29,6 +29,15 @@
"aria-label": t(:label_more),
data: { "test-selector": "project-more-dropdown-menu" }
}) do |menu|
if can_rename?
menu.with_item(
label: t('button_rename'),
href: edit_projects_query_path(query),
) do |item|
item.with_leading_visual_icon(icon: :pencil)
end
end
if gantt_portfolio_project_ids.any?
menu.with_item(
tag: :a,
@@ -92,7 +101,7 @@
render(Primer::OpenProject::PageHeader.new) do |header|
header.with_title(data: { 'test-selector': 'project-query-name'}) do
primer_form_with(model: query,
url: projects_queries_path,
url: @query.new_record? ? projects_queries_path : projects_query_path(@query),
scope: 'query',
data: {
controller: "params-from-query",
@@ -100,7 +109,7 @@
'params-from-query-allowed-value': '["filters", "columns", "query_id", "sortBy"]'
},
id: 'project-save-form') do |f|
render(Queries::Projects::Create.new(f))
render(Queries::Projects::Form.new(f, query:))
end
end
header.with_breadcrumbs(breadcrumb_items)
@@ -75,6 +75,8 @@ class Projects::IndexPageHeaderComponent < ApplicationComponent
def can_save? = can_save_as? && query.persisted? && query.user == current_user
def can_rename? = may_save_as? && query.persisted? && query.user == current_user
def show_state?
state == :show
end
@@ -31,7 +31,7 @@ class Projects::QueriesController < ApplicationController
# No need for a more specific authorization check. That is carried out in the contracts.
before_action :require_login
before_action :find_query, only: %i[update destroy]
before_action :find_query, only: %i[edit update destroy]
before_action :build_query_or_deny_access, only: %i[new create]
current_menu_item [:new, :create] do
@@ -44,6 +44,12 @@ class Projects::QueriesController < ApplicationController
locals: { query: @query, state: :edit }
end
def edit
render template: "/projects/index",
layout: "global",
locals: { query: @query, state: :edit }
end
def create
call = Queries::Projects::ProjectQueries::CreateService
.new(from: @query, user: current_user)
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
# ++
class Queries::Projects::Create < ApplicationForm
class Queries::Projects::Form < ApplicationForm
include OpenProject::StaticRouting::UrlHelpers
form do |query_form|
@@ -52,8 +52,13 @@ class Queries::Projects::Create < ApplicationForm
label: I18n.t(:button_cancel),
tag: :a,
data: { "params-from-query-target": "anchor" },
href: OpenProject::StaticRouting::StaticUrlHelpers.new.projects_path
href: projects_path(query_id: @query)
)
end
end
def initialize(query:)
super()
@query = query
end
end
+1 -1
View File
@@ -181,7 +181,7 @@ Rails.application.routes.draw do
namespace :projects do
resource :menu, only: %i[show]
resources :queries, only: %i[new create update destroy]
resources :queries, only: %i[new edit create update destroy]
end
resources :projects, except: %i[show edit create update] do
@@ -67,6 +67,39 @@ RSpec.describe Projects::QueriesController do
end
end
describe "#edit" do
it "requires login" do
get "edit", params: { id: 42 }
expect(response).not_to be_successful
end
context "when logged in" do
let(:query) { build_stubbed(:project_query) }
let(:query_id) { "42" }
before do
allow(Queries::Projects::ProjectQuery).to receive(:find).with(query_id).and_return(query)
login_as user
end
it "renders projects/index" do
get "edit", params: { id: 42 }
expect(response).to render_template("projects/index")
end
it "passes variables to template" do
allow(controller).to receive(:render).and_call_original
get "edit", params: { id: 42 }
expect(controller).to have_received(:render).with(include(locals: { query:, state: :edit }))
end
end
end
describe "#create" do
let(:service_class) { Queries::Projects::ProjectQueries::CreateService }
+18 -6
View File
@@ -214,18 +214,20 @@ RSpec.describe "Persisted lists on projects index page",
let!(:project_member) { create(:member, principal: user, project:, roles: [developer]) }
let!(:development_project_member) { create(:member, principal: user, project: development_project, roles: [developer]) }
it "allows saving, loading and deleting persisted filters and columns" do
it "allows saving, renaming, loading and deleting persisted filters and columns" do
projects_page.visit!
# The default filter is active
projects_page.expect_title("Active projects")
# Since the query is static, no save button is shown
# Since the query is static, no save button an no menu item is shown
projects_page.expect_no_notification("Save")
projects_page.expect_no_menu_item("Save", visible: false)
# Since the query is unchanged, no save as button is shown
projects_page.expect_no_notification("Save as")
# But save as menu item is always present
projects_page.expect_menu_item("Save as", visible: false)
# Since the query is not persisted, no rename button is shown
projects_page.expect_no_menu_item("Rename", visible: false)
# Default filters are applied
projects_page.expect_projects_listed(project, public_project, development_project)
@@ -238,12 +240,14 @@ RSpec.describe "Persisted lists on projects index page",
# By applying another filter, the title is changed as it does not longer match the default filter
projects_page.expect_title("Projects")
# Since the query is static, no save button is shown
# Since the query is static, no save button an no menu item is shown
projects_page.expect_no_notification("Save")
projects_page.expect_no_menu_item("Save", visible: false)
# Since the query changed, save as button is shown
# Since the query changed, save as button and menu item are shown
projects_page.expect_notification("Save as")
projects_page.expect_menu_item("Save as", visible: false)
# Since the query is not persisted, no rename button is shown
projects_page.expect_no_menu_item("Rename", visible: false)
# The filters are applied
projects_page.expect_projects_listed(project, development_project)
@@ -279,6 +283,8 @@ RSpec.describe "Persisted lists on projects index page",
projects_page.expect_no_menu_item("Save", visible: false)
# But save as menu item is always present
projects_page.expect_menu_item("Save as", visible: false)
# Since the query is persisted, rename button is shown
projects_page.expect_menu_item("Rename", visible: false)
# Modifying to save again
projects_page.set_columns("Name", "Public")
@@ -292,6 +298,12 @@ RSpec.describe "Persisted lists on projects index page",
# Duplicating (without changes)
projects_page.save_query_as("My duplicated query")
projects_page.expect_sidebar_filter("My duplicated query", selected: false)
# Renaming
projects_page.rename_to("My renamed query")
projects_page.expect_no_sidebar_filter("My duplicated query")
projects_page.expect_sidebar_filter("My renamed query", selected: false)
# Modifying to save as again
projects_page.set_columns("Name", "Status", "Public")
@@ -303,8 +315,8 @@ RSpec.describe "Persisted lists on projects index page",
projects_page.expect_columns("Name", "Public")
projects_page.expect_no_columns("Status")
# Checked duplicated query
projects_page.set_sidebar_filter("My duplicated query")
# Checked renamed query
projects_page.set_sidebar_filter("My renamed query")
projects_page.expect_columns("Name", "Public")
projects_page.expect_no_columns("Status")
+10
View File
@@ -334,6 +334,16 @@ module Pages
click_on "Save"
end
def rename_to(name)
click_more_menu_item("Rename")
within '[data-test-selector="project-query-name"]' do
fill_in "Name", with: name
end
click_on "Save"
end
def delete_query
click_more_menu_item("Delete")