diff --git a/app/assets/javascripts/secondary_navigation.js b/app/assets/javascripts/secondary_navigation.js new file mode 100644 index 000000000..9da8f176b --- /dev/null +++ b/app/assets/javascripts/secondary_navigation.js @@ -0,0 +1,27 @@ +(function() { + 'use strict'; + + function initRepositoriesDropDown() { + var dropDown = $('.repositories-dropdown'); + var dropDownMenu = $('.repositories-dropdown-menu'); + dropDown.on('show.bs.dropdown', function() { + dropDownMenu + .find('.assigned-items-counter') + .html(''); + $.ajax({ + url: dropDown.data('url'), + type: 'GET', + dataType: 'json', + success: function(data) { + dropDownMenu.html(data.html); + }, + error: function() { + dropDownMenu.find('.assigned-items-counter').html(''); + } + }); + }); + } + + // init + initRepositoriesDropDown(); +}()); diff --git a/app/controllers/my_modules_controller.rb b/app/controllers/my_modules_controller.rb index f525f1165..3a2123332 100644 --- a/app/controllers/my_modules_controller.rb +++ b/app/controllers/my_modules_controller.rb @@ -14,7 +14,8 @@ class MyModulesController < ApplicationController complete_my_module repository repository_index assign_repository_records unassign_repository_records unassign_repository_records_modal - assign_repository_records_modal) + assign_repository_records_modal + repositories_dropdown) before_action :load_vars_nested, only: %i(new create) before_action :load_repository, only: %i(assign_repository_records unassign_repository_records @@ -27,7 +28,7 @@ class MyModulesController < ApplicationController before_action :check_manage_permissions, only: %i(description due_date) before_action :check_view_permissions, only: %i(show activities activities_tab protocols results samples samples_index - archive) + archive repositories_dropdown) before_action :check_complete_module_permission, only: :complete_my_module before_action :check_assign_repository_records_permissions, only: %i(unassign_repository_records_modal @@ -403,6 +404,20 @@ class MyModulesController < ApplicationController render 'repository_rows/index.json' end + def repositories_dropdown + load_repository if params[:repository_id].present? + respond_to do |format| + format.json do + render json: { + html: render_to_string( + partial: 'repositories_dropdown.html.erb', + locals: { enable_counters: true } + ) + } + end + end + end + # Submit actions def assign_repository_records if params[:selected_rows].present? && params[:repository_id].present? diff --git a/app/models/my_module.rb b/app/models/my_module.rb index c96de8944..28936dc8f 100644 --- a/app/models/my_module.rb +++ b/app/models/my_module.rb @@ -174,6 +174,12 @@ class MyModule < ApplicationRecord restored end + def repository_rows_count(repository) + my_module_repository_rows.joins(repository_row: :repository) + .where('repositories.id': repository.id) + .count + end + def unassigned_users User.find_by_sql( "SELECT DISTINCT users.id, users.full_name FROM users " + diff --git a/app/models/my_module_repository_row.rb b/app/models/my_module_repository_row.rb index f17cc8743..e2eef2382 100644 --- a/app/models/my_module_repository_row.rb +++ b/app/models/my_module_repository_row.rb @@ -5,6 +5,7 @@ class MyModuleRepositoryRow < ApplicationRecord optional: true belongs_to :repository_row, optional: true, + touch: true, inverse_of: :my_module_repository_rows belongs_to :my_module, optional: true, inverse_of: :my_module_repository_rows diff --git a/app/models/repository_row.rb b/app/models/repository_row.rb index 4daa0aae3..17e9e2b06 100644 --- a/app/models/repository_row.rb +++ b/app/models/repository_row.rb @@ -1,7 +1,7 @@ class RepositoryRow < ApplicationRecord include SearchableModel - belongs_to :repository, optional: true + belongs_to :repository, touch: true, optional: true belongs_to :created_by, foreign_key: :created_by_id, class_name: 'User', diff --git a/app/views/my_modules/_repositories_dropdown.html.erb b/app/views/my_modules/_repositories_dropdown.html.erb new file mode 100644 index 000000000..00146bb1f --- /dev/null +++ b/app/views/my_modules/_repositories_dropdown.html.erb @@ -0,0 +1,22 @@ +<% @my_module.experiment.project.team.repositories.order(created_at: :asc).each do |repository| %> +
  • + help_tooltips" + data-tooltiplink="<%= I18n.t('tooltips.link.protocol.inventories') %>" + data-tooltipcontent="<%= I18n.t('tooltips.text.protocol.inventories') %>" + href="<%= repository_my_module_url(id: @my_module, repository_id: repository) %>" + title="<%= repository.name %>"> + <% if enable_counters %> + <% cache [current_user, repository] do %> + <%= truncate(repository.name) %> + <%= "(#{@my_module.repository_rows_count(repository)})" %> + <% end %> + <% else %> + <%= truncate(repository.name) %> + + <% end %> + +
  • + <% unless @my_module.experiment.project.team.repositories.last == repository %> +
  • + <% end %> +<% end %> diff --git a/app/views/shared/_secondary_navigation.html.erb b/app/views/shared/_secondary_navigation.html.erb index fc9cdd311..3ff0a346d 100644 --- a/app/views/shared/_secondary_navigation.html.erb +++ b/app/views/shared/_secondary_navigation.html.erb @@ -123,27 +123,16 @@
  • <% if can_read_team?(@my_module.experiment.project.team) && @my_module.experiment.project.team.repositories.exists? %> -
  • "> +
  • dropdown repositories-dropdown" + data-url="<%= module_repository_page? ? repositories_dropdown_repository_tab_my_module_path(repository: @repository) : repositories_dropdown_my_module_path %>"> " data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  • <% end %> @@ -168,4 +157,7 @@ + +<%= javascript_include_tag('secondary_navigation') %> + <% end %> diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index f5fc0767e..d610a3859 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -66,6 +66,7 @@ Rails.application.config.assets.precompile += Rails.application.config.assets.precompile += %w(datatables.js) Rails.application.config.assets.precompile += %w(search/index.js) Rails.application.config.assets.precompile += %w(navigation.js) +Rails.application.config.assets.precompile += %w(secondary_navigation.js) Rails.application.config.assets.precompile += %w(datatables.css) Rails.application.config.assets.precompile += %w(my_modules.js) Rails.application.config.assets.precompile += %w(canvas-to-blob.min.js) diff --git a/config/routes.rb b/config/routes.rb index 33259a0cc..ddf636fc7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -374,6 +374,12 @@ Rails.application.routes.draw do get 'archive' # Archive view for single module get 'complete_my_module' post 'toggle_task_state' + get 'repositories_dropdown', + to: 'my_modules#repositories_dropdown', + as: :repositories_dropdown + get 'repositories_dropdown/:repository_id', + to: 'my_modules#repositories_dropdown', + as: :repositories_dropdown_repository_tab # Renders sample datatable for single module (ajax action) # post 'samples_index' # post :assign_samples,