mirror of
https://github.com/opf/openproject.git
synced 2026-06-14 03:30:14 +00:00
rename persisted project query
This commit is contained in:
@@ -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
@@ -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 }
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user