Merge pull request #15044 from opf/bug/53394-oauth-flow-causes-loss-of-already-selected-option-while-adding-a-storage-to-a-project

[#53394] OAuth flow causes loss of already selected option while adding a storage to a project.
This commit is contained in:
Pavel Balashou
2024-03-20 16:12:16 +01:00
committed by GitHub
4 changed files with 33 additions and 24 deletions
@@ -111,6 +111,7 @@ export default class ProjectStorageFormController extends Controller {
}
this.toggleFolderDisplay(this.folderModeValue);
this.setProjectFolderModeQueryParam(this.folderModeValue);
});
}
@@ -158,8 +159,8 @@ export default class ProjectStorageFormController extends Controller {
}
this.folderModeValue = mode;
this.toggleFolderDisplay(mode);
this.setProjectFolderModeQueryParam(mode);
}
private get modalService():Observable<OpModalService> {
@@ -208,6 +209,12 @@ export default class ProjectStorageFormController extends Controller {
);
}
private setProjectFolderModeQueryParam(mode:string) {
const url = new URL(window.location.href);
url.searchParams.set('storages_project_storage[project_folder_mode]', mode);
window.history.replaceState(window.history.state, '', url);
}
private toggleFolderDisplay(value:string):void {
// If the manual radio button is selected, show the manual folder selection section
if (this.hasProjectFolderSectionTarget && value === 'manual') {
@@ -55,25 +55,25 @@ class Storages::Admin::ProjectStoragesController < Projects::SettingsController
@project_storages = Storages::ProjectStorage.where(project: @project).includes(:storage)
# Render the list storages using ViewComponents in the /app/components folder which defines
# the ways rows are rendered in a table layout.
render '/storages/project_settings/index'
render "/storages/project_settings/index"
end
# Show a HTML page with a form in order to create a new ProjectStorage
# Called by: When a user clicks on the "+New" button in Project -> Settings -> File Storages
def new
@available_storages = available_storages
@project_storage = ::Storages::ProjectStorages::SetAttributesService
.new(user: current_user,
model: Storages::ProjectStorage.new,
contract_class: EmptyContract)
.call(project: @project,
storage: @available_storages.find do |storage|
storage.id.to_s == params.dig(:storages_project_storage, :storage_id)
end)
.result
project_folder_mode = Storages::ProjectStorage.project_folder_modes.values.find do |mode|
mode == params.dig(:storages_project_storage, :project_folder_mode)
end
storage = @available_storages.find { |s| s.id.to_s == params.dig(:storages_project_storage, :storage_id) }
@project_storage =
::Storages::ProjectStorages::SetAttributesService
.new(user: current_user, model: Storages::ProjectStorage.new, contract_class: EmptyContract)
.call(project: @project, storage:, project_folder_mode:)
.result
@last_project_folders = {}
render template: '/storages/project_settings/new'
render template: "/storages/project_settings/new"
end
# Create a new ProjectStorage object.
@@ -89,7 +89,7 @@ class Storages::Admin::ProjectStoragesController < Projects::SettingsController
redirect_to_project_storages_path_with_oauth_access_grant_confirmation
else
@available_storages = available_storages
render '/storages/project_settings/new'
render "/storages/project_settings/new"
end
end
@@ -128,7 +128,7 @@ class Storages::Admin::ProjectStoragesController < Projects::SettingsController
.pluck(:mode, :origin_folder_id)
.to_h
render '/storages/project_settings/edit'
render "/storages/project_settings/edit"
end
# Update is similar to create above
@@ -145,7 +145,7 @@ class Storages::Admin::ProjectStoragesController < Projects::SettingsController
redirect_to project_settings_project_storages_path
else
@project_storage = @object
render '/storages/project_settings/edit'
render "/storages/project_settings/edit"
end
end
@@ -167,7 +167,7 @@ class Storages::Admin::ProjectStoragesController < Projects::SettingsController
def destroy_info
@project_storage_to_destroy = @object
render '/storages/project_settings/destroy_info'
render "/storages/project_settings/destroy_info"
end
private
@@ -178,7 +178,7 @@ class Storages::Admin::ProjectStoragesController < Projects::SettingsController
# "params" is an instance of ActionController::Parameters
params
.require(:storages_project_storage)
.permit('storage_id', 'project_folder_mode', 'project_folder_id')
.permit("storage_id", "project_folder_mode", "project_folder_id")
.to_h
.reverse_merge(project_id: @project.id)
end
@@ -212,7 +212,7 @@ class Storages::Admin::ProjectStoragesController < Projects::SettingsController
def oauth_access_grant_nudge_modal(authorized: false)
{
type: 'Storages::Admin::OAuthAccessGrantNudgeModalComponent',
type: "Storages::Admin::OAuthAccessGrantNudgeModalComponent",
parameters: {
project_storage: @project_storage.id,
authorized:
@@ -26,17 +26,17 @@
# See COPYRIGHT and LICENSE files for more details.
#++
# Used by: CreateService when setting attributes
module Storages::ProjectStorages
class SetAttributesService < ::BaseServices::SetAttributes
def set_default_attributes(_params)
def set_default_attributes(params)
project_storage = model
storage = project_storage.storage
project_storage.creator ||= user
project_storage.project_folder_mode ||=
if storage.present? && storage.automatic_management_enabled?
if params[:project_folder_mode].present?
params[:project_folder_mode]
elsif storage.present? && storage.automatic_management_enabled?
"automatic"
else
"inactive"
@@ -151,7 +151,8 @@ RSpec.describe 'Activation of storages in projects', :js, :webmock, with_setting
# Press Edit icon to change the project folder mode to inactive
page.find('.icon.icon-edit').click
expect(page).to have_current_path edit_project_settings_project_storage_path(project_id: project,
id: Storages::ProjectStorage.last)
id: Storages::ProjectStorage.last,
storages_project_storage: {project_folder_mode: 'manual'})
expect(page).to have_text('Edit the file storage to this project')
expect(page).to have_no_select('storages_project_storage_storage_id')
expect(page).to have_text(storage.name)
@@ -170,7 +171,8 @@ RSpec.describe 'Activation of storages in projects', :js, :webmock, with_setting
# Click Edit icon again but cancel the edit
page.find('.icon.icon-edit').click
expect(page).to have_current_path edit_project_settings_project_storage_path(project_id: project,
id: Storages::ProjectStorage.last)
id: Storages::ProjectStorage.last,
storages_project_storage: {project_folder_mode: 'inactive'})
expect(page).to have_text('Edit the file storage to this project')
page.click_link('Cancel')
expect(page).to have_current_path project_settings_project_storages_path(project)