diff --git a/app/assets/javascripts/repositories/index.js b/app/assets/javascripts/repositories/index.js index 9a8a1726c..00ec40b95 100644 --- a/app/assets/javascripts/repositories/index.js +++ b/app/assets/javascripts/repositories/index.js @@ -7,6 +7,11 @@ var CHECKBOX_SELECTOR; function updateActionButtons() { + if (window.actionToolbarComponent) { + window.actionToolbarComponent.fetchActions({ repository_ids: CHECKBOX_SELECTOR.selectedRows }); + $('.dataTables_scrollBody').css('padding-bottom', `${CHECKBOX_SELECTOR.selectedRows.length > 0 ? 68 : 0}px`); + } + var rowsCount = CHECKBOX_SELECTOR.selectedRows.length; var row; $('#renameRepoBtn').attr('href', '#'); @@ -98,6 +103,9 @@ } }], fnInitComplete: function(e) { + initActionToolbar(); + actionToolbarComponent.setBottomOffset(75); + var dataTableWrapper = $(e.nTableWrapper); CHECKBOX_SELECTOR = new DataTableCheckboxes(dataTableWrapper, { checkboxSelector: '.repository-row-selector', diff --git a/app/assets/stylesheets/repository/index.scss b/app/assets/stylesheets/repository/index.scss index 879e516c3..936a2d631 100644 --- a/app/assets/stylesheets/repository/index.scss +++ b/app/assets/stylesheets/repository/index.scss @@ -133,3 +133,23 @@ font-size: 14px; } } + +.content-body { + height: calc(100vh - var(--navbar-height) - 5em); +} + +#repositoriesList_wrapper { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + + .dataTables_scroll { + display: flex; + flex-direction: column; + flex-grow: 1; + height: calc(100% - var(--datatable-pagination-row) - 4em); + padding-bottom: 12px; + z-index: 1; + } +} diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index fbabb711a..b3653641d 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -9,12 +9,13 @@ class RepositoriesController < ApplicationController include RepositoriesDatatableHelper include MyModulesHelper - before_action :load_repository, except: %i(index create create_modal sidebar archive restore) + before_action :load_repository, except: %i(index create create_modal sidebar archive restore actions_toolbar) before_action :load_repositories, only: %i(index show sidebar) 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_view_permissions, except: %i(index create_modal create update destroy parse_sheet import_records + sidebar archive restore actions_toolbar) before_action :check_manage_permissions, only: %i(rename_modal update) before_action :check_delete_permissions, only: %i(destroy destroy_modal) before_action :check_archive_permissions, only: %i(archive restore) @@ -410,6 +411,17 @@ class RepositoriesController < ApplicationController end } end + def actions_toolbar + render json: { + actions: + Toolbars::RepositoriesService.new( + current_user, + current_team, + repository_ids: params[:repository_ids].split(',') + ).actions + } + end + private def repostiory_import_actions diff --git a/app/services/toolbars/repositories_service.rb b/app/services/toolbars/repositories_service.rb new file mode 100644 index 000000000..f8bfbbbf7 --- /dev/null +++ b/app/services/toolbars/repositories_service.rb @@ -0,0 +1,111 @@ +# frozen_string_literal: true + +module Toolbars + class RepositoriesService + attr_reader :current_user + + include Canaid::Helpers::PermissionsHelper + include Rails.application.routes.url_helpers + + def initialize(current_user, current_team, repository_ids: []) + @current_user = current_user + @current_team = current_team + @repositories = Repository.readable_by_user(current_user) + .where(id: repository_ids) + @repository = @repositories.length == 1 ? @repositories.first : nil + @archived_state = @repositories.all.any?(&:archived?) + end + + def actions + return [] if @repositories.none? + + if @archived_state + [restore_action, delete_action] + else + [rename_action, duplicate_action, archive_action, share_action] + end.compact + end + + private + + def rename_action + return unless @repository + + { + name: 'rename', + label: I18n.t('libraries.index.buttons.edit'), + button_id: 'renameRepoBtn', + icon: 'fas fa-pencil-alt', + path: team_repository_rename_modal_path(@current_team, repository_id: @repository), + type: 'remote-modal' + } + end + + def duplicate_action + return unless @repository && can_create_repositories?(@current_team) + + { + name: 'duplicate', + label: I18n.t('libraries.index.buttons.duplicate'), + button_id: 'copyRepoBtn', + icon: 'fas fa-copy', + path: team_repository_copy_modal_path(@current_team, repository_id: @repository), + type: 'remote-modal' + } + end + + def archive_action + return unless @repositories.all? { |repository| can_archive_repository?(repository) } + + { + name: 'archive', + label: I18n.t('libraries.index.buttons.archive'), + button_id: 'archiveRepoBtn', + icon: 'fas fa-archive', + path: archive_team_repositories_path(@current_team), + type: :request, + request_method: :post + } + end + + def share_action + return unless @repository && can_share_repository?(@repository) + + { + name: 'share', + label: I18n.t('repositories.index.share_inventory'), + icon: 'fas fa-user-plus', + button_class: 'share-repository-button', + path: team_repository_share_modal_path(@current_team, repository_id: @repository), + type: 'remote-modal' + } + end + + def restore_action + return unless @repositories.all? { |repository| can_archive_repository?(repository) } + + { + name: 'restore', + label: I18n.t('libraries.index.buttons.restore'), + icon: 'fas fa-undo', + button_id: 'restoreRepoBtn', + path: restore_team_repositories_path(@current_team), + type: :request, + request_method: :post + } + end + + def delete_action + return unless @repository + + { + name: 'delete', + label: I18n.t('libraries.index.buttons.delete'), + icon: 'fas fa-trash', + button_id: 'deleteRepoBtn', + path: team_repository_destroy_modal_path(@current_team, repository_id: @repository), + type: 'remote-modal' + } + end + end +end diff --git a/app/views/repositories/index.html.erb b/app/views/repositories/index.html.erb index 24716308d..ba316df46 100644 --- a/app/views/repositories/index.html.erb +++ b/app/views/repositories/index.html.erb @@ -37,56 +37,30 @@ -<% if can_create_repositories?(current_team) %> - - - <%= t('libraries.index.no_libraries.create_new_button') %> - -<% end %> - -<%= render partial: 'shared/state_view_switch', locals: { - disabled: false, - switchable: true, - archived: params[:archived], - active_url: repositories_path, - archived_url: repositories_path(archived: true), - } %> - + + <%= render partial: 'shared/state_view_switch', locals: { + disabled: false, + switchable: true, + archived: params[:archived], + active_url: repositories_path, + archived_url: repositories_path(archived: true), + } %> + +