diff --git a/app/controllers/project_settings/generic_controller.rb b/app/controllers/project_settings/general_controller.rb similarity index 86% rename from app/controllers/project_settings/generic_controller.rb rename to app/controllers/project_settings/general_controller.rb index c8601874111..5c27b2ddb00 100644 --- a/app/controllers/project_settings/generic_controller.rb +++ b/app/controllers/project_settings/general_controller.rb @@ -28,11 +28,6 @@ # See COPYRIGHT and LICENSE files for more details. #++ -class ProjectSettings::GenericController < ProjectSettingsController - menu_item :settings_generic - - def show - @altered_project = @project - render template: 'project_settings/generic' - end +class ProjectSettings::GeneralController < ProjectSettingsController + menu_item :settings_general end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index dd2ab978f6c..4f58d6c060f 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -44,7 +44,10 @@ class ProjectsController < ApplicationController include RepositoriesHelper include ProjectsHelper - # Lists visible projects + current_menu_item :index do + :list_projects + end + def index query = load_query @@ -58,10 +61,6 @@ class ProjectsController < ApplicationController render layout: 'no_menu' end - current_menu_item :index do - :list_projects - end - def new render layout: 'no_menu' end @@ -76,7 +75,7 @@ class ProjectsController < ApplicationController if service_call.success? flash[:notice] = I18n.t(:notice_successful_update) - redirect_to settings_generic_project_path(@project) + redirect_to settings_general_project_path(@project) else render action: 'identifier' end @@ -149,12 +148,6 @@ class ProjectsController < ApplicationController end end - ## - # Redirect as action as routes can only redirect by full path - def settings - redirect_to settings_generic_project_path(@project) - end - private def find_optional_project diff --git a/app/helpers/project_settings_helper.rb b/app/helpers/project_settings_helper.rb index 03eaa42d1db..0241f1b687a 100644 --- a/app/helpers/project_settings_helper.rb +++ b/app/helpers/project_settings_helper.rb @@ -33,8 +33,8 @@ module ProjectSettingsHelper def project_settings_tabs [ { - name: 'generic', - action: { controller: '/project_settings/generic', action: 'show' }, + name: 'general', + action: { controller: '/project_settings/general', action: 'show' }, label: :label_information_plural }, { diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index a00f79bce72..b512b61cc26 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -85,9 +85,9 @@ module ProjectsHelper end def project_more_menu_settings_item(project) - if User.current.allowed_to?({ controller: '/project_settings/generic', action: 'show' }, project) + if User.current.allowed_to?({ controller: '/project_settings/general', action: 'show' }, project) [t(:label_project_settings), - { controller: '/project_settings/generic', action: 'show', id: project }, + { controller: '/project_settings/general', action: 'show', id: project }, { class: 'icon-context icon-settings', title: t(:label_project_settings) }] end diff --git a/app/views/project_settings/generic.html.erb b/app/views/project_settings/general/show.html.erb similarity index 100% rename from app/views/project_settings/generic.html.erb rename to app/views/project_settings/general/show.html.erb diff --git a/app/views/projects/identifier.html.erb b/app/views/projects/identifier.html.erb index 2566e6e5485..5c41e1753cc 100644 --- a/app/views/projects/identifier.html.erb +++ b/app/views/projects/identifier.html.erb @@ -50,7 +50,7 @@ See COPYRIGHT and LICENSE files for more details. <%= f.submit t(:button_update), class: 'button -highlight -with-icon icon-checkmark' %> - <%= link_to settings_generic_project_path(@project), class: 'button' do %> + <%= link_to settings_general_project_path(@project), class: 'button' do %> <%= op_icon('button--icon icon-cancel') %> <%= t(:button_cancel) %> <% end %> diff --git a/config/initializers/menus.rb b/config/initializers/menus.rb index 6138cd245fc..71985b5cd3c 100644 --- a/config/initializers/menus.rb +++ b/config/initializers/menus.rb @@ -474,7 +474,7 @@ Redmine::MenuManager.map :project_menu do |menu| icon: 'icon2 icon-group' menu.push :settings, - { controller: '/project_settings/generic', action: :show }, + { controller: '/project_settings/general', action: :show }, caption: :label_project_settings, last: true, icon: 'icon2 icon-settings2', diff --git a/config/initializers/permissions.rb b/config/initializers/permissions.rb index 508628308aa..5fb54b384dd 100644 --- a/config/initializers/permissions.rb +++ b/config/initializers/permissions.rb @@ -75,8 +75,8 @@ OpenProject::AccessControl.map do |map| map.permission :edit_project, { - projects: %i[edit update custom_fields], - 'project_settings/generic': [:show] + projects: %i[custom_fields], + 'project_settings/general': %i[show] }, require: :member, contract_actions: { projects: %i[update] } diff --git a/config/routes.rb b/config/routes.rb index 83869c97761..ba34b2e37f7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -178,10 +178,16 @@ OpenProject::Application.routes.draw do resources :projects, except: %i[show edit create] do member do ProjectSettingsHelper.project_settings_tabs.each do |tab| - get "settings/#{tab[:name]}", controller: "project_settings/#{tab[:name]}", action: 'show', as: "settings_#{tab[:name]}" - patch "settings/#{tab[:name]}", controller: "project_settings/#{tab[:name]}", action: 'update', as: "update_settings_#{tab[:name]}" + get "settings/#{tab[:name]}", + controller: "project_settings/#{tab[:name]}", + action: :show, + as: "settings_#{tab[:name]}" + patch "settings/#{tab[:name]}", + controller: "project_settings/#{tab[:name]}", + action: :update, + as: "update_settings_#{tab[:name]}" end - get "settings" + get "settings", to: redirect('projects/%{id}/settings/general/') # rubocop:disable Style/FormatStringToken get 'identifier', action: 'identifier' patch 'identifier', action: 'update_identifier' diff --git a/frontend/src/app/core/routing/openproject.routes.ts b/frontend/src/app/core/routing/openproject.routes.ts index 2fd88e086c7..685cf518d64 100644 --- a/frontend/src/app/core/routing/openproject.routes.ts +++ b/frontend/src/app/core/routing/openproject.routes.ts @@ -133,7 +133,7 @@ export const OPENPROJECT_ROUTES:Ng2StateDeclaration[] = [ { name: 'project_settings.**', parent: 'optional_project', - url: '/settings/generic', + url: '/settings/general', loadChildren: () => import('../../features/projects/openproject-projects.module').then((m) => m.OpenprojectProjectsModule), }, { diff --git a/frontend/src/app/features/projects/projects-routes.ts b/frontend/src/app/features/projects/projects-routes.ts index 8dd5f5e094b..2df6a448410 100644 --- a/frontend/src/app/features/projects/projects-routes.ts +++ b/frontend/src/app/features/projects/projects-routes.ts @@ -7,7 +7,7 @@ export const PROJECTS_ROUTES:Ng2StateDeclaration[] = [ { name: 'project_settings', parent: 'optional_project', - url: '/settings/generic/', + url: '/settings/general/', component: ProjectsComponent, }, { @@ -28,7 +28,7 @@ export function uiRouterProjectsConfiguration(uiRouter:UIRouter) { // cf., https://community.openproject.com/wp/29754 uiRouter.urlService.rules .when( - new RegExp('^/projects/(.*)/settings/generic$'), - (match) => `/projects/${match[1]}/settings/generic/`, + new RegExp('^/projects/(.*)/settings/general$'), + (match:string[]) => `/projects/${match[1]}/settings/general/`, ); } diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb index 780e89e4924..dde0da9872c 100644 --- a/spec/controllers/projects_controller_spec.rb +++ b/spec/controllers/projects_controller_spec.rb @@ -180,13 +180,18 @@ describe ProjectsController, type: :controller do before do allow(Project).to receive(:find).and_return(project) - expect_any_instance_of(::Projects::ScheduleDeletionService) - .to receive(:call) - .and_return service_result + deletion_service = instance_double(::Projects::ScheduleDeletionService, + call: service_result) + + allow(::Projects::ScheduleDeletionService) + .to receive(:new) + .with(user: admin, model: project) + .and_return(deletion_service) end context 'when service call succeeds' do let(:success) { true } + it 'prints success' do request expect(response).to be_redirect @@ -196,6 +201,7 @@ describe ProjectsController, type: :controller do context 'when service call fails' do let(:success) { false } + it 'prints fail' do request expect(response).to be_redirect diff --git a/spec/features/menu_items/menu_permissions_spec.rb b/spec/features/menu_items/menu_permissions_spec.rb index b4603846913..0096c1027d9 100644 --- a/spec/features/menu_items/menu_permissions_spec.rb +++ b/spec/features/menu_items/menu_permissions_spec.rb @@ -52,13 +52,13 @@ describe 'menu permissions', type: :feature, js: true do expect(page).to have_selector('#menu-sidebar .op-menu--item-title', text: 'Modules') end - it 'the parent node directs to the generic settings page' do + it 'the parent node directs to the general settings page' do # The settings menu item exists expect(page).to have_selector('#menu-sidebar .main-item-wrapper', text: 'Project settings', visible: false) # Clicking the menu parent item leads to the version page find('.main-menu--parent-node', text: 'Project settings').click - expect(page).to have_current_path "/projects/#{project.identifier}/settings/generic/" + expect(page).to have_current_path "/projects/#{project.identifier}/settings/general/" end end diff --git a/spec/features/projects/edit_settings_spec.rb b/spec/features/projects/edit_settings_spec.rb index 451938b37e7..c92ad0d5a37 100644 --- a/spec/features/projects/edit_settings_spec.rb +++ b/spec/features/projects/edit_settings_spec.rb @@ -44,7 +44,7 @@ describe 'Projects', 'editing settings', type: :feature, js: true do end it 'hides the field whose functionality is presented otherwise' do - visit settings_generic_project_path(project.id) + visit settings_general_project_path(project.id) expect(page).to have_no_text :all, 'Active' expect(page).to have_no_text :all, 'Identifier' @@ -98,7 +98,7 @@ describe 'Projects', 'editing settings', type: :feature, js: true do project.custom_field_values.last.value = 'FOO' project.save! - visit settings_generic_project_path(project.id) + visit settings_general_project_path(project.id) expect(page).to have_text 'Optional Foo' expect(page).to have_text 'Required Foo' @@ -117,7 +117,7 @@ describe 'Projects', 'editing settings', type: :feature, js: true do let(:foo_field) { ::FormFields::InputFormField.new required_custom_field } it 'shows the errors of that field when saving (Regression #33766)' do - visit settings_generic_project_path(project.id) + visit settings_general_project_path(project.id) expect(page).to have_content 'Foo' @@ -140,7 +140,7 @@ describe 'Projects', 'editing settings', type: :feature, js: true do let(:form_field) { ::FormFields::SelectFormField.new list_custom_field } it 'can select multiple values' do - visit settings_generic_project_path(project.id) + visit settings_general_project_path(project.id) form_field.select_option 'A', 'B' @@ -161,7 +161,7 @@ describe 'Projects', 'editing settings', type: :feature, js: true do let(:form_field) { ::FormFields::InputFormField.new date_custom_field } it 'can save and remove the date (Regression #37459)' do - visit settings_generic_project_path(project.id) + visit settings_general_project_path(project.id) form_field.set_value '2021-05-26' form_field.send_keys :escape @@ -188,7 +188,7 @@ describe 'Projects', 'editing settings', type: :feature, js: true do end it 'can update the project without destroying the relation to the parent' do - visit settings_generic_project_path(project.id) + visit settings_general_project_path(project.id) fill_in 'Name', with: 'New project name' diff --git a/spec/features/projects/modules_spec.rb b/spec/features/projects/modules_spec.rb index bde4ff796a1..3b84fc53e26 100644 --- a/spec/features/projects/modules_spec.rb +++ b/spec/features/projects/modules_spec.rb @@ -111,7 +111,7 @@ describe 'Projects module administration', before do login_as user_without_permission - settings_page.visit_tab!('generic') + settings_page.visit_tab!('general') end it "I can't see the modules menu item" do diff --git a/spec/features/projects/project_status_administration_spec.rb b/spec/features/projects/project_status_administration_spec.rb index bb0cb942eb0..272e8b2d02f 100644 --- a/spec/features/projects/project_status_administration_spec.rb +++ b/spec/features/projects/project_status_administration_spec.rb @@ -73,7 +73,7 @@ describe 'Projects status administration', type: :feature, js: true do expect(page).to have_current_path /projects\/new-project\/?/ # Check that the status has been set correctly - visit settings_generic_project_path(id: 'new-project') + visit settings_general_project_path(id: 'new-project') status_field.expect_selected 'ON TRACK' status_description.expect_value 'Everything is fine at the start' diff --git a/spec/features/projects/projects_custom_fields_spec.rb b/spec/features/projects/projects_custom_fields_spec.rb index 4b0f37445e8..9fdf243258c 100644 --- a/spec/features/projects/projects_custom_fields_spec.rb +++ b/spec/features/projects/projects_custom_fields_spec.rb @@ -92,7 +92,7 @@ describe 'Projects custom fields', type: :feature, js: true do expect(page).to have_current_path /\/projects\/my-project-name\/?/ created_project = Project.last - visit settings_project_path(created_project) + visit settings_general_project_path(created_project) default_int_field.expect_value default_int_custom_field.default_value.to_s default_string_field.expect_value 'Overwritten' @@ -107,7 +107,7 @@ describe 'Projects custom fields', type: :feature, js: true do let(:editor) { ::Components::WysiwygEditor.new "[data-qa-field-name='customField#{custom_field.id}']" } scenario 'allows settings the project boolean CF (regression #26313)' do - visit settings_generic_project_path(project.id) + visit settings_general_project_path(project.id) # expect CF, description and status description ckeditor-augmented-textarea expect(page).to have_selector('.op-ckeditor--wrapper', count: 3) @@ -156,7 +156,7 @@ describe 'Projects custom fields', type: :feature, js: true do cv = project.custom_values.find_by(custom_field_id: float_cf.id).typed_value expect(cv).to eq 10000.55 - visit settings_generic_project_path(project) + visit settings_general_project_path(project) float_field.expect_value '10000.55' end end @@ -181,7 +181,7 @@ describe 'Projects custom fields', type: :feature, js: true do cv = project.custom_values.find_by(custom_field_id: float_cf.id).typed_value expect(cv).to eq 10000.55 - visit settings_generic_project_path(project) + visit settings_general_project_path(project) # The field renders in german locale, but there's no way to test that # as the internal value is always english locale float_field.expect_value '10000.55' @@ -195,7 +195,7 @@ describe 'Projects custom fields', type: :feature, js: true do end scenario 'allows settings the project boolean CF (regression #26313)' do - visit settings_generic_project_path(project.id) + visit settings_general_project_path(project.id) field = page.find(identifier) expect(field).not_to be_checked diff --git a/spec/features/projects/subproject_creation_spec.rb b/spec/features/projects/subproject_creation_spec.rb index 935844524b8..7ca836b7a8e 100644 --- a/spec/features/projects/subproject_creation_spec.rb +++ b/spec/features/projects/subproject_creation_spec.rb @@ -49,7 +49,7 @@ describe 'Subproject creation', type: :feature, js: true do end before do - visit settings_project_path(parent_project) + visit settings_general_project_path(parent_project) end it 'can create a subproject' do diff --git a/spec/features/projects/template_spec.rb b/spec/features/projects/template_spec.rb index c85d6fd81dc..3ba23f9fd27 100644 --- a/spec/features/projects/template_spec.rb +++ b/spec/features/projects/template_spec.rb @@ -38,7 +38,7 @@ describe 'Project templates', type: :feature, js: true do end it 'can make the project a template from settings' do - visit settings_generic_project_path(project) + visit settings_general_project_path(project) # Make a template find('.button', text: 'Set as template').click diff --git a/spec/lib/open_project/access_control_spec.rb b/spec/lib/open_project/access_control_spec.rb index 85c3a0ef9bd..7b5226c1bd7 100644 --- a/spec/lib/open_project/access_control_spec.rb +++ b/spec/lib/open_project/access_control_spec.rb @@ -156,7 +156,7 @@ describe OpenProject::AccessControl do it 'includes actions' do expect(subject.controller_actions) - .to include('project_settings/show') + .to include('project_settings/general/show') end end end diff --git a/spec/routing/project_settings_routing_spec.rb b/spec/routing/project_settings_routing_spec.rb index 4aace9d5376..8f5db062044 100644 --- a/spec/routing/project_settings_routing_spec.rb +++ b/spec/routing/project_settings_routing_spec.rb @@ -31,8 +31,8 @@ require 'spec_helper' describe ProjectSettingsController, type: :routing do describe 'show' do it do - expect(get('/projects/123/settings/generic')).to route_to( - controller: 'project_settings/generic', action: 'show', id: '123' + expect(get('/projects/123/settings/general')).to route_to( + controller: 'project_settings/general', action: 'show', id: '123' ) end @@ -78,12 +78,4 @@ describe ProjectSettingsController, type: :routing do ) end end - - describe 'miscellaneous' do - it do - expect(get('/projects/123/settings')).to route_to( - controller: 'projects', action: 'settings', id: '123' - ) - end - end end diff --git a/spec/support/pages/projects/settings.rb b/spec/support/pages/projects/settings.rb index ca810c8ba37..9558301d961 100644 --- a/spec/support/pages/projects/settings.rb +++ b/spec/support/pages/projects/settings.rb @@ -93,7 +93,7 @@ module Pages end def path - settings_generic_project_path(project) + settings_general_project_path(project) end end end diff --git a/spec/views/projects/settings.html.erb_spec.rb b/spec/views/project_settings/general/show.html.erb_spec.rb similarity index 98% rename from spec/views/projects/settings.html.erb_spec.rb rename to spec/views/project_settings/general/show.html.erb_spec.rb index c24e9512c64..cf40be8556e 100644 --- a/spec/views/projects/settings.html.erb_spec.rb +++ b/spec/views/project_settings/general/show.html.erb_spec.rb @@ -28,7 +28,7 @@ require 'spec_helper' -describe 'project_settings/generic', type: :view do +describe 'project_settings/general/show', type: :view do let(:project) { FactoryBot.build_stubbed(:project) } describe 'project copy permission' do