From 41bb825f3384feed78ffb6827e1319bb6c7f74be Mon Sep 17 00:00:00 2001 From: miha Date: Tue, 23 Jun 2020 22:59:21 +0200 Subject: [PATCH 1/3] SCI-4780 Added archive and restore items to repository actions dropdown, minor refactoring of controller --- app/assets/javascripts/repositories/show.js | 14 ++++++++++++++ app/controllers/repositories_controller.rb | 16 +++++++++++----- .../archive_repository_base_service.rb | 6 +----- .../archive_repository_service.rb | 6 ------ .../restore_repository_service.rb | 6 ------ app/views/repositories/show.html.erb | 19 ++++++++++++++++--- config/locales/en.yml | 2 ++ config/routes.rb | 2 ++ 8 files changed, 46 insertions(+), 25 deletions(-) diff --git a/app/assets/javascripts/repositories/show.js b/app/assets/javascripts/repositories/show.js index 358a441dd..f02eade5d 100644 --- a/app/assets/javascripts/repositories/show.js +++ b/app/assets/javascripts/repositories/show.js @@ -173,7 +173,21 @@ }); $('.create-new-repository').initializeModal('#create-repo-modal'); + + function initArchivingActionsInDropdown(){ + $('.archive-repository-option').on('click', function(event){ + event.preventDefault(); + var link = event.target.getAttribute("href"); + $.ajax({ + type: 'GET', + url: link, + success: pageReload + }); + }); + } + initImportRecordsModal(); initTable(); initRepositoryViewSwitcher(); + initArchivingActionsInDropdown(); }(window)); diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 18fd71ad3..3efc894bd 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -128,7 +128,7 @@ class RepositoriesController < ApplicationController end def archive - service = Repositories::ArchiveRepositoryService.call(repositories: selected_repos_params, + service = Repositories::ArchiveRepositoryService.call(repositories: selected_repositories, user: current_user, team: current_team) if service.succeed? @@ -139,7 +139,7 @@ class RepositoriesController < ApplicationController end def restore - service = Repositories::RestoreRepositoryService.call(repositories: selected_repos_params, + service = Repositories::RestoreRepositoryService.call(repositories: selected_repositories, user: current_user, team: current_team) if service.succeed? @@ -430,9 +430,15 @@ class RepositoriesController < ApplicationController params.permit(:id, :file, :file_id, mappings: {}).to_h end - def selected_repos_params - process_ids = params[:selected_repos].map(&:to_i).uniq - Repository.where(id: process_ids, team_id: current_team).pluck(:id) + def selected_repositories + if params[:repository_id].present? + repository_ids = params[:repository_id] + elsif params[:selected_repos].any? + repository_ids = params[:selected_repos].map(&:to_i).uniq + else + render status: :not_found + end + current_team.repositories.where(id: repository_ids) end def repository_response(message) diff --git a/app/services/repositories/archive_repository_base_service.rb b/app/services/repositories/archive_repository_base_service.rb index 3695b3481..9d81a700f 100644 --- a/app/services/repositories/archive_repository_base_service.rb +++ b/app/services/repositories/archive_repository_base_service.rb @@ -9,7 +9,7 @@ module Repositories def initialize(user:, team:, repositories:) @user = user @team = team - @repositories = scoped_repositories(repositories) + @repositories = repositories @errors = {} end @@ -27,10 +27,6 @@ module Repositories private - def scoped_repositories(_ids) - raise NotImplementedError - end - def valid? unless @user @errors[:invalid_arguments] = diff --git a/app/services/repositories/archive_repository_service.rb b/app/services/repositories/archive_repository_service.rb index 453668892..689c7ce1a 100644 --- a/app/services/repositories/archive_repository_service.rb +++ b/app/services/repositories/archive_repository_service.rb @@ -24,11 +24,5 @@ module Repositories self end - - private - - def scoped_repositories(ids) - Repository.where(id: ids, team_id: @team) - end end end diff --git a/app/services/repositories/restore_repository_service.rb b/app/services/repositories/restore_repository_service.rb index 25b16cc95..94b1606d0 100644 --- a/app/services/repositories/restore_repository_service.rb +++ b/app/services/repositories/restore_repository_service.rb @@ -24,11 +24,5 @@ module Repositories self end - - private - - def scoped_repositories(ids) - Repository.where(id: ids, team_id: @team) - end end end diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index 439ded84e..eefc54b1f 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -92,14 +92,27 @@ remote: true %> <% end %> - <% if can_manage_repository?(@repository) %> - -
  • + <% if can_manage_repository?(@repository)%> +
  • +
  • + <%= link_to t('repositories.index.options_dropdown.archive'), + team_repository_archive_path(current_team, @repository), + class: "archive-repository-option", + remote: true %> +
  • +
  • + <%= link_to t('repositories.index.options_dropdown.restore'), + team_repository_restore_path(current_team, @repository), + class: "archive-repository-option", + remote: true %> +
  • +
  • <%= link_to t('repositories.index.options_dropdown.delete'), team_repository_destroy_modal_path(current_team, repository_id: @repository), class: "delete-repo-option", remote: true %>
  • + <% end %> <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index f81ba4b6c..4539f7c10 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1086,6 +1086,8 @@ en: rename: "Rename inventory" copy: "Copy inventory" delete: "Delete inventory" + archive: 'Archive inventory' + restore: 'Restore inventory' modal_delete: title_html: "Delete inventory %{name}" message_html: "Are you sure you want to delete inventory %{name}? This action is irreversible." diff --git a/config/routes.rb b/config/routes.rb index c9ca51fc2..a2c35c15d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -180,6 +180,8 @@ Rails.application.routes.draw do post 'copy', to: 'repositories#copy', defaults: { format: 'json' } get :share_modal + get :archive, to: 'repositories#archive' + get :restore, to: 'repositories#restore' resources :team_repositories, only: %i(destroy) do collection do From 29f62419bd20573729e29a632cdf6a167c406053 Mon Sep 17 00:00:00 2001 From: Oleksii Kriuchykhin Date: Wed, 24 Jun 2020 11:32:20 +0200 Subject: [PATCH 2/3] Improve repository archive/restore actions [SCI-4780] --- app/assets/javascripts/repositories/index.js | 4 +-- app/assets/javascripts/repositories/show.js | 29 ++++++++++++++------ app/controllers/repositories_controller.rb | 24 +++++++--------- app/permissions/repository.rb | 5 ++++ app/permissions/team.rb | 5 ---- app/views/repositories/show.html.erb | 19 +++++++------ config/routes.rb | 2 -- 7 files changed, 47 insertions(+), 41 deletions(-) diff --git a/app/assets/javascripts/repositories/index.js b/app/assets/javascripts/repositories/index.js index 00480663e..708a329d8 100644 --- a/app/assets/javascripts/repositories/index.js +++ b/app/assets/javascripts/repositories/index.js @@ -116,7 +116,7 @@ $('.repositories-index') .on('click', '#archiveRepoBtn', function() { $.post($('#archiveRepoBtn').data('archive-repositories'), { - selected_repos: CHECKBOX_SELECTOR.selectedRows + repository_ids: CHECKBOX_SELECTOR.selectedRows }, function(data) { HelperModule.flashAlertMsg(data.flash, 'success'); initRepositoriesDataTable('#repositoriesList'); @@ -132,7 +132,7 @@ }) .on('click', '#restoreRepoBtn', function() { $.post($('#restoreRepoBtn').data('restore-repositories'), { - selected_repos: CHECKBOX_SELECTOR.selectedRows + repository_ids: CHECKBOX_SELECTOR.selectedRows }, function(data) { HelperModule.flashAlertMsg(data.flash, 'success'); initRepositoriesDataTable('#repositoriesList', true); diff --git a/app/assets/javascripts/repositories/show.js b/app/assets/javascripts/repositories/show.js index f02eade5d..64dd9fc5b 100644 --- a/app/assets/javascripts/repositories/show.js +++ b/app/assets/javascripts/repositories/show.js @@ -1,7 +1,7 @@ //= require repositories/import/records_importer.js /* - global animateSpinner repositoryRecordsImporter I18n + global pageReload animateSpinner repositoryRecordsImporter I18n RepositoryDatatable PerfectScrollbar HelperModule */ @@ -150,13 +150,13 @@ function initRepositoryViewSwitcher() { var viewSwitch = $('.view-switch'); viewSwitch.on('click', '.view-switch-archived', function() { - $('.repository-show').removeClass('active').addClass('archived') + $('.repository-show').removeClass('active').addClass('archived'); $('#manage-repository-column').removeClass('active').addClass('archived'); RepositoryDatatable.reload(); }); viewSwitch.on('click', '.view-switch-active', function() { $('.repository-show').removeClass('archived').addClass('active'); - $('#manage-repository-column').removeClass('archived').addClass('active');; + $('#manage-repository-column').removeClass('archived').addClass('active'); RepositoryDatatable.reload(); }); } @@ -174,14 +174,25 @@ $('.create-new-repository').initializeModal('#create-repo-modal'); - function initArchivingActionsInDropdown(){ - $('.archive-repository-option').on('click', function(event){ + function initArchivingActionsInDropdown() { + $('.archive-repository-option').on('click', function(event) { event.preventDefault(); - var link = event.target.getAttribute("href"); + animateSpinner(null, true); + $.ajax({ - type: 'GET', - url: link, - success: pageReload + type: 'POST', + url: $(this).attr('href'), + dataType: 'json', + data: { repository_ids: [$(this).data('repositoryId')] }, + success: pageReload, + error: function(ev) { + if (ev.status === 403) { + HelperModule.flashAlertMsg(I18n.t('repositories.js.permission_error'), ev.responseJSON.style); + } else if (ev.status === 422) { + HelperModule.flashAlertMsg(ev.responseJSON.error, 'danger'); + } + animateSpinner(null, false); + } }); }); } diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 3efc894bd..5a7e565d9 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -11,6 +11,7 @@ class RepositoriesController < ApplicationController before_action :switch_team_with_param, only: :show before_action :load_repository, except: %i(index create create_modal sidebar archive restore) before_action :load_repositories, only: %i(index show sidebar) + before_action :load_repositories_for_archiving, only: %i(archive restore) before_action :check_view_all_permissions, only: %i(index sidebar) before_action :check_view_permissions, except: %i(index create_modal create update destroy parse_sheet import_records sidebar archive restore) before_action :check_manage_permissions, only: %i(destroy destroy_modal rename_modal update) @@ -128,7 +129,7 @@ class RepositoriesController < ApplicationController end def archive - service = Repositories::ArchiveRepositoryService.call(repositories: selected_repositories, + service = Repositories::ArchiveRepositoryService.call(repositories: @repositories, user: current_user, team: current_team) if service.succeed? @@ -139,7 +140,7 @@ class RepositoriesController < ApplicationController end def restore - service = Repositories::RestoreRepositoryService.call(repositories: selected_repositories, + service = Repositories::RestoreRepositoryService.call(repositories: @repositories, user: current_user, team: current_team) if service.succeed? @@ -381,6 +382,10 @@ class RepositoriesController < ApplicationController end end + def load_repositories_for_archiving + @repositories = current_team.repositories.where(id: params[:repository_ids]) + end + def set_inline_name_editing return unless can_manage_repository?(@repository) @@ -415,7 +420,9 @@ class RepositoriesController < ApplicationController end def check_archive_permissions - render_403 unless can_archive_repositories?(current_team) + @repositories.each do |repository| + return render_403 unless can_archive_repository?(repository) + end end def check_share_permissions @@ -430,17 +437,6 @@ class RepositoriesController < ApplicationController params.permit(:id, :file, :file_id, mappings: {}).to_h end - def selected_repositories - if params[:repository_id].present? - repository_ids = params[:repository_id] - elsif params[:selected_repos].any? - repository_ids = params[:selected_repos].map(&:to_i).uniq - else - render status: :not_found - end - current_team.repositories.where(id: repository_ids) - end - def repository_response(message) respond_to do |format| format.html do diff --git a/app/permissions/repository.rb b/app/permissions/repository.rb index 8b578e3e2..d0ae77879 100644 --- a/app/permissions/repository.rb +++ b/app/permissions/repository.rb @@ -30,6 +30,11 @@ Canaid::Permissions.register_for(Repository) do user.is_admin_of_team?(repository.team) unless repository.shared_with?(user.current_team) end + # repository: archive, restore + can :archive_repository do |user, repository| + !repository.shared_with?(user.current_team) && user.is_admin_of_team?(repository.team) + end + # repository: share can :share_repository do |user, repository| user.is_admin_of_team?(repository.team) unless repository.shared_with?(user.current_team) diff --git a/app/permissions/team.rb b/app/permissions/team.rb index fd3632529..e8a564fd7 100644 --- a/app/permissions/team.rb +++ b/app/permissions/team.rb @@ -53,11 +53,6 @@ Canaid::Permissions.register_for(Team) do within_limits && user.is_admin_of_team?(team) end - # repository: archive, restore - can :archive_repositories do |user, team| - user.is_admin_of_team?(team) - end - # this permission is scattered around the application # if you want to make changes here keep in mind to check/change the # SQL view that lists reports in index page: diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index eefc54b1f..c07aefab7 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -92,27 +92,28 @@ remote: true %> <% end %> - <% if can_manage_repository?(@repository)%> - -
  • + <% if can_archive_repository?(@repository) %> +
  • +
  • <%= link_to t('repositories.index.options_dropdown.archive'), - team_repository_archive_path(current_team, @repository), + archive_team_repositories_path(current_team), class: "archive-repository-option", - remote: true %> + data: { repository_id: @repository.id } %>
  • -
  • +
  • <%= link_to t('repositories.index.options_dropdown.restore'), - team_repository_restore_path(current_team, @repository), + restore_team_repositories_path(current_team), class: "archive-repository-option", - remote: true %> + data: { repository_id: @repository.id } %>
  • + <% end %> + <% if can_manage_repository?(@repository) %>
  • <%= link_to t('repositories.index.options_dropdown.delete'), team_repository_destroy_modal_path(current_team, repository_id: @repository), class: "delete-repo-option", remote: true %>
  • - <% end %> <% end %> diff --git a/config/routes.rb b/config/routes.rb index a2c35c15d..c9ca51fc2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -180,8 +180,6 @@ Rails.application.routes.draw do post 'copy', to: 'repositories#copy', defaults: { format: 'json' } get :share_modal - get :archive, to: 'repositories#archive' - get :restore, to: 'repositories#restore' resources :team_repositories, only: %i(destroy) do collection do From 8e0ed286fba633df4c86836879d7ba07c037069c Mon Sep 17 00:00:00 2001 From: Oleksii Kriuchykhin Date: Wed, 24 Jun 2020 12:01:38 +0200 Subject: [PATCH 3/3] Improve repositories loading for archive/restore [SCI-4780] --- app/controllers/repositories_controller.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 5a7e565d9..65000e671 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -11,7 +11,8 @@ class RepositoriesController < ApplicationController before_action :switch_team_with_param, only: :show before_action :load_repository, except: %i(index create create_modal sidebar archive restore) before_action :load_repositories, only: %i(index show sidebar) - before_action :load_repositories_for_archiving, only: %i(archive restore) + before_action :load_repositories_for_archiving, only: :archive + before_action :load_repositories_for_restoring, only: :restore before_action :check_view_all_permissions, only: %i(index sidebar) before_action :check_view_permissions, except: %i(index create_modal create update destroy parse_sheet import_records sidebar archive restore) before_action :check_manage_permissions, only: %i(destroy destroy_modal rename_modal update) @@ -383,7 +384,11 @@ class RepositoriesController < ApplicationController end def load_repositories_for_archiving - @repositories = current_team.repositories.where(id: params[:repository_ids]) + @repositories = current_team.repositories.active.where(id: params[:repository_ids]) + end + + def load_repositories_for_restoring + @repositories = current_team.repositories.archived.where(id: params[:repository_ids]) end def set_inline_name_editing