diff --git a/app/assets/javascripts/my_modules/repositories.js b/app/assets/javascripts/my_modules/repositories.js index 5d1ace471..7306cf47f 100644 --- a/app/assets/javascripts/my_modules/repositories.js +++ b/app/assets/javascripts/my_modules/repositories.js @@ -167,6 +167,13 @@ var MyModuleRepositories = (function() { renderFullViewTable(fullViewModal.find('.table')); }); e.stopPropagation(); + + function initRepositoriesDropdown() { + $('.repositories-assign-container').on('show.bs.dropdown', function() { + var dropdownContainer = $(this); + $.get(dropdownContainer.data('repositories-url'), function(result) { + dropdownContainer.find('.repositories-dropdown-menu').html(result.html); + }); }); } @@ -174,6 +181,7 @@ var MyModuleRepositories = (function() { init: () => { initSimpleTable(); initRepositoryFullView(); + initRepositoriesDropdown(); } }; }()); diff --git a/app/assets/stylesheets/my_modules/protocols/index.scss b/app/assets/stylesheets/my_modules/protocols/index.scss index 3d541443e..f8ceb5f06 100644 --- a/app/assets/stylesheets/my_modules/protocols/index.scss +++ b/app/assets/stylesheets/my_modules/protocols/index.scss @@ -37,6 +37,57 @@ margin-top: 11px; } } + + .task-section-header { + display: flex; + flex-wrap: wrap; + + .actions-block { + display: flex; + flex-grow: 1; + justify-content: flex-end; + + .repositories-assign-container { + flex-grow: 1; + max-width: 200px; + + .btn { + text-align: left; + + .caret { + margin: 8px 0; + } + } + + .repositories-dropdown-menu { + width: 100%; + + .repository { + @include font-button; + display: flex; + padding: 8px 16px; + + .assigned-items, + .shared-icon { + flex-shrink: 0; + + .fas { + padding-right: 5px; + } + } + + .assigned-items { + color: $color-alto; + } + + .name { + flex-grow: 1; + } + } + } + } + } + } } .complete-button-container { diff --git a/app/assets/stylesheets/my_modules/repositories.scss b/app/assets/stylesheets/my_modules/repositories.scss index e0ac69f13..7e0e9cdd4 100644 --- a/app/assets/stylesheets/my_modules/repositories.scss +++ b/app/assets/stylesheets/my_modules/repositories.scss @@ -97,6 +97,8 @@ } #assigned-items-container { + padding-top: 10px; + .assigned-repository { border: $border-default; border-radius: $border-radius-modal; diff --git a/app/controllers/my_module_repositories_controller.rb b/app/controllers/my_module_repositories_controller.rb index 324f4d640..c35f9a171 100644 --- a/app/controllers/my_module_repositories_controller.rb +++ b/app/controllers/my_module_repositories_controller.rb @@ -1,8 +1,11 @@ # frozen_string_literal: true class MyModuleRepositoriesController < ApplicationController - before_action :load_vars, only: %i(show full_view_table) - before_action :check_view_permissions, only: %i(show full_view_table) + + before_action :load_my_module, only: %i(show full_view_table dropdown_list) + before_action :load_repository, only: %i(show full_view_table) + before_action :check_my_module_view_permissions, only: %i(show full_view_table dropdown_list) + before_action :check_repository_view_permissions, only: %i(show full_view_table) def show @draw = params[:draw].to_i @@ -30,17 +33,30 @@ class MyModuleRepositoriesController < ApplicationController render json: { html: render_to_string(partial: 'my_modules/repositories/full_view_table') } end + + def dropdown_list + @repositories = Repository.accessible_by_teams(current_team) + + render json: { html: render_to_string(partial: 'my_modules/repositories/repositories_dropdown_list') } + end + private - def load_vars + def load_my_module @my_module = MyModule.find(params[:my_module_id]) - @repository = Repository.find(params[:id]) - - render_404 unless @my_module && @repository + render_404 unless @my_module end - def check_view_permissions - render_403 unless can_read_experiment?(@my_module.experiment) && - can_read_repository?(@repository) + def load_repository + @repository = Repository.find(params[:id]) + ender_404 unless @repository + end + + def check_my_module_view_permissions + render_403 unless can_read_experiment?(@my_module.experiment) + end + + def check_repository_view_permissions + render_403 unless can_read_repository?(@repository) end end diff --git a/app/views/my_modules/protocols.html.erb b/app/views/my_modules/protocols.html.erb index 385618052..943cd49ae 100644 --- a/app/views/my_modules/protocols.html.erb +++ b/app/views/my_modules/protocols.html.erb @@ -41,7 +41,20 @@

<%= t('my_modules.assigned_items.title') %>

- + +
+ +
<%= render partial: "my_modules/repositories/repositories_list" %> diff --git a/app/views/my_modules/repositories/_repositories_dropdown_list.html.erb b/app/views/my_modules/repositories/_repositories_dropdown_list.html.erb new file mode 100644 index 000000000..5a67c7fd9 --- /dev/null +++ b/app/views/my_modules/repositories/_repositories_dropdown_list.html.erb @@ -0,0 +1,17 @@ +<% @repositories.each do |repository| %> + <% assigned_items_count = @my_module.repository_rows_count(repository) %> +
+ <% if repository.shared_with?(current_team) %> + + + + <% end %> + <%= escape_input(repository.name) %> + <% if assigned_items_count.positive? %> + + + <%= assigned_items_count %> + + <% end %> +
+<% end %> \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 111ec6473..257a5c4df 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -385,6 +385,9 @@ Rails.application.routes.draw do member do get :full_view_table end + collection do + get :dropdown_list + end end # resources :sample_my_modules, path: '/samples_index', only: [:index]