Add assigned task dropdown to repository

This commit is contained in:
aignatov-bio 2020-04-24 15:43:10 +02:00
parent 1cea6116b5
commit 0604815c00
8 changed files with 79 additions and 22 deletions

View file

@ -154,3 +154,25 @@ $.fn.dataTable.render.RepositoryNumberValue = function(data) {
${data.value}
</span>`;
};
$.fn.dataTable.render.AssignedTasksValue = function(data) {
if (data.tasks > 0) {
let tooltip = I18n.t('repositories.table.assigned_tooltip', {
tasks: data.tasks,
experiments: data.experiments,
projects: data.projects
})
return `<div class="assign-counter-container dropdown" title="${tooltip}"
data-task-list-url="${data.task_list_url}">
<a href="#" class="assign-counter has-assigned"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">${data.tasks}</a>
<div class="dropdown-menu" role="menu">
<div class="tasks"></div>
</div>
</div>`
} else {
return "<div class='assign-counter-container'><span class='assign-counter'>0</span></div>"
}
};

View file

@ -442,7 +442,7 @@ var RepositoryDatatable = (function(global) {
className: 'assigned-column',
sWidth: '1%',
render: function(data, type, row) {
let content = data;
let content = $.fn.dataTable.render.AssignedTasksValue(data);
let icon;
if (!row.recordEditable) {
icon = `<i class="repository-row-lock-icon fas fa-lock" title="${I18n.t('repositories.table.locked_item')}"></i>`;
@ -582,6 +582,14 @@ var RepositoryDatatable = (function(global) {
$(TABLE_ID).find('tr[data-editable=false]').each(function(_, e) {
rowsLocked.push(parseInt($(e).attr('id'), 10));
});
$(TABLE_ID).on('show.bs.dropdown', '.assign-counter-container', function() {
var tasksContainer = $(this).find('.tasks');
var tasksUrl = $(this).data('task-list-url');
$.get(tasksUrl, function(result) {
tasksContainer.html(result.html);
})
})
}
});

View file

@ -49,7 +49,16 @@
width: calc(100% - 40px);
.assign-counter {
margin-left: 5px;
display: inline-block;
height: 100%;
padding-left: 5px;
width: 100%;
&:hover,
&:visited,
&:focus {
text-decoration: none;
}
&.has-assigned {
color: $brand-primary;
@ -59,6 +68,10 @@
&:hover {
background-color: $color-alto;
}
.dropdown-menu {
padding: 8px;
}
}
.circle-icon {

View file

@ -3,7 +3,7 @@ class RepositoryRowsController < ApplicationController
include ActionView::Helpers::TextHelper
include ApplicationHelper
before_action :load_info_modal_vars, only: :show
before_action :load_info_modal_vars, only: %i(show assigned_task_list)
before_action :load_vars, only: %i(edit update)
before_action :load_repository,
only: %i(create
@ -180,6 +180,14 @@ class RepositoryRowsController < ApplicationController
end
end
def assigned_task_list
my_modules = @repository_row.my_modules.joins(experiment: :project)
.my_modules_list_partial
render json: {
html: render_to_string(partial: 'shared/my_modules_list_partial.html.erb', locals: { task_groups: my_modules })
}
end
private
include StringUtility

View file

@ -7,7 +7,7 @@ module RepositoryDatatableHelper
repository_rows.map do |record|
row = {
'DT_RowId': record.id,
'1': assigned_row(record),
'1': assigned_row(record, repository),
'2': record.id,
'3': escape_input(record.name),
'4': I18n.l(record.created_at, format: :full),
@ -64,18 +64,13 @@ module RepositoryDatatableHelper
end
end
def assigned_row(record)
if record.assigned_my_modules_count.positive?
tooltip = t('repositories.table.assigned_tooltip',
tasks: record.assigned_my_modules_count,
def assigned_row(record, repository)
{
tasks: record.assigned_my_modules_count,
experiments: record.assigned_experiments_count,
projects: record.assigned_projects_count)
"<div class='assign-counter-container' title='#{tooltip}'>"\
"<span class='assign-counter has-assigned'>#{record.assigned_my_modules_count}</span></div>"
else
"<div class='assign-counter-container'><span class='assign-counter'>0</span></div>"
end
projects: record.assigned_projects_count,
task_list_url: assigned_task_list_repository_repository_row_path(repository, record)
}
end
def can_perform_repository_actions(repository)

View file

@ -526,14 +526,17 @@ class MyModule < ApplicationRecord
def self.my_modules_list_partial
ungrouped_tasks = joins(experiment: :project)
.select('experiments.name as experiment_name,
experiments.archived as experiment_archived,
projects.name as project_name,
my_modules.name as task_name,
my_modules.id')
projects.archived as projects_archived,
my_modules.*')
ungrouped_tasks.group_by { |i| [i[:project_name], i[:experiment_name]] }.map do |group, tasks|
{
project_name: group[0],
projects_archived: tasks[0]&.projects_archived,
experiment_name: group[1],
tasks: tasks.map { |task| { id: task.id, task_name: task.task_name } }
experiment_archived: tasks[0]&.experiment_archived,
tasks: tasks
}
end
end

View file

@ -2,15 +2,19 @@
<% task_groups.each do |task_group| %>
<div class="task-group">
<div class="header">
<span class="project" title="<%= task_group[:project_name] %>"><%= task_group[:project_name] %></span>
<span class="project" title="<%= task_group[:project_name] %>"><%= escape_input(task_group[:project_name]) %></span>
<span class="slash">/</span>
<span class="experiment" title="<%= task_group[:experiment_name] %>"><%= task_group[:experiment_name] %></span>
<span class="experiment" title="<%= task_group[:experiment_name] %>"><%= escape_input(task_group[:experiment_name]) %></span>
</div>
<div class="tasks">
<% task_group[:tasks].each do |task| %>
<div class="task">
<%= draw_custom_icon('task-icon') %>
<%= link_to(task[:task_name], protocols_my_module_path(task[:id]), {class: "task-link", title: task[:task_name]}) %>
<% if can_read_experiment?(current_user, task.experiment) %>
<%= link_to(escape_input(task.name), protocols_my_module_path(task.id), {class: "task-link", title: task.name}) %>
<% else %>
<%= escape_input(task.name) %>
<% end %>
</div>
<% end %>
</div>

View file

@ -630,7 +630,11 @@ Rails.application.routes.draw do
defaults: { format: 'json' }
resources :repository_columns, only: %i(create edit update destroy)
resources :repository_rows, only: %i(create edit update)
resources :repository_rows, only: %i(create edit update) do
member do
get :assigned_task_list
end
end
member do
post 'parse_sheet', defaults: { format: 'json' }
post 'import_records'