Add export for assigned items

This commit is contained in:
aignatov-bio 2020-07-17 15:17:09 +02:00
parent 41ceba11b8
commit e69e3ea8d3
10 changed files with 97 additions and 41 deletions

View file

@ -1,6 +1,6 @@
/* eslint-disable no-param-reassign, no-use-before-define */
/* global DataTableHelpers PerfectScrollbar FilePreviewModal animateSpinner HelperModule
initAssignedTasksDropdown I18n */
initAssignedTasksDropdown I18n prepareRepositoryHeaderForExport */
var MyModuleRepositories = (function() {
const FULL_VIEW_MODAL = $('#myModuleRepositoryFullViewModal');
@ -643,6 +643,22 @@ var MyModuleRepositories = (function() {
});
}
function initExportAssignedRows() {
FULL_VIEW_MODAL.on('click', '#exportAssignedItems', function() {
var headerIds = [];
$(FULL_VIEW_TABLE.table().container()).find('.dataTables_scrollHead thead tr th').each(function() {
headerIds.push(prepareRepositoryHeaderForExport($(this)));
});
$.post($(FULL_VIEW_TABLE.table().container()).find('.dataTable').data('export-url'), {
header_ids: headerIds
}, function(response) {
HelperModule.flashAlertMsg(response.message, 'success');
}).error((response) => {
HelperModule.flashAlertMsg(response.responseJSON.message, 'danger');
});
});
}
return {
init: () => {
initSimpleTable();
@ -651,6 +667,7 @@ var MyModuleRepositories = (function() {
initVersionsSidebarActions();
initRepoistoryAssignView();
initSelectAllCheckbox();
initExportAssignedRows();
}
};
}());

View file

@ -1,6 +1,6 @@
/*
globals I18n _ SmartAnnotation FilePreviewModal animateSpinner Promise DataTableHelpers
HelperModule animateLoading RepositoryDatatableRowEditor
globals I18n _ SmartAnnotation FilePreviewModal animateSpinner DataTableHelpers
HelperModule RepositoryDatatableRowEditor prepareRepositoryHeaderForExport
initAssignedTasksDropdown
*/
@ -334,35 +334,7 @@ var RepositoryDatatable = (function(global) {
// Append visible column information
$('table' + TABLE_ID + ' thead tr th').each(function() {
var th = $(this);
var val;
switch ($(th).attr('id')) {
case 'checkbox':
val = -1;
break;
case 'assigned':
val = -2;
break;
case 'row-id':
val = -3;
break;
case 'row-name':
val = -4;
break;
case 'added-by':
val = -5;
break;
case 'added-on':
val = -6;
break;
case 'archived-by':
val = -7;
break;
case 'archived-on':
val = -8;
break;
default:
val = th.attr('id');
}
var val = prepareRepositoryHeaderForExport(th);
if (val) {
appendInput(form, val, 'header_ids[]');

View file

@ -49,3 +49,37 @@ function initAssignedTasksDropdown(table) {
loadTasks(cell);
});
}
function prepareRepositoryHeaderForExport(th) {
var val;
switch ($(th).attr('id')) {
case 'checkbox':
val = -1;
break;
case 'assigned':
val = -2;
break;
case 'row-id':
val = -3;
break;
case 'row-name':
val = -4;
break;
case 'added-by':
val = -5;
break;
case 'added-on':
val = -6;
break;
case 'archived-by':
val = -7;
break;
case 'archived-on':
val = -8;
break;
default:
val = th.attr('id');
}
return val;
}

View file

@ -4,7 +4,8 @@ class MyModuleRepositoriesController < ApplicationController
include ApplicationHelper
before_action :load_my_module
before_action :load_repository, except: %i(repositories_dropdown_list repositories_list_html)
before_action :load_repository, except: %i(repositories_dropdown_list repositories_list_html export_repository)
before_action :load_repository_or_snapshot, only: :export_repository
before_action :check_my_module_view_permissions
before_action :check_repository_view_permissions, except: %i(repositories_dropdown_list repositories_list_html)
before_action :check_assign_repository_records_permissions, only: :update
@ -116,6 +117,15 @@ class MyModuleRepositoriesController < ApplicationController
render json: { html: render_to_string(partial: 'my_modules/repositories/repositories_dropdown_list') }
end
def export_repository
if params[:header_ids]
RepositoryZipExport.generate_zip(params, @repository, current_user)
render json: { message: t('zip_export.export_request_success') }, status: :ok
else
render json: { message: t('zip_export.export_error') }, status: :unprocessable_entity
end
end
private
def load_my_module
@ -128,6 +138,12 @@ class MyModuleRepositoriesController < ApplicationController
render_404 unless @repository
end
def load_repository_or_snapshot
@repository = Repository.accessible_by_teams(current_team).find_by(id: params[:id])
@repository ||= RepositorySnapshot.find_by(id: params[:id])
render_404 unless @repository
end
def check_my_module_view_permissions
render_403 unless can_read_experiment?(@my_module.experiment)
end

View file

@ -5,16 +5,25 @@ require 'csv'
module RepositoryZipExport
def self.generate_zip(params, repository, current_user)
# Fetch rows in the same order as in the currently viewed datatable
if params[:my_module_id]
rows = if repository.is_a?(RepositorySnapshot)
repository.repository_rows
else
repository.repository_rows.joins(:my_module_repository_rows)
.where(my_module_repository_rows: { my_module_id: params[:my_module_id] })
end
else
ordered_row_ids = params[:row_ids]
id_row_map = RepositoryRow.where(id: ordered_row_ids,
repository: repository)
.index_by(&:id)
ordered_rows = ordered_row_ids.collect { |id| id_row_map[id.to_i] }
rows = ordered_row_ids.collect { |id| id_row_map[id.to_i] }
end
zip = ZipExport.create(user: current_user)
zip.generate_exportable_zip(
current_user,
to_csv(ordered_rows, params[:header_ids], current_user, repository.team),
to_csv(rows, params[:header_ids], current_user, repository.team),
:repositories
)
end

View file

@ -19,11 +19,15 @@
<div class="modal-body">
<template id="repositoryToolbarButtonsTemplate">
<div class="">
<div class="pull-left">
<div class="pull-left sci-btn-group">
<button id="showVersionsSidebar" type="button" class="btn btn-secondary">
<span class="fas fa-eye"></span>
<%= t('my_modules.repository.snapshots.full_view.versions_sidebar_button') %>
</button>
<button id="exportAssignedItems" type="button" class="btn btn-secondary">
<span class="fas fa-download"></span>
<%= t('my_modules.repository.snapshots.full_view.export_button') %>
</button>
</div>
</div>
</template>

View file

@ -8,6 +8,7 @@
data-default-order="<%= default_snapshot_table_order_as_js_array %>"
data-default-table-columns="<%= default_snapshot_table_columns %>"
data-load-state-url="<%= repository_load_table_state_path(@repository_snapshot) %>"
data-export-url="<%= export_repository_my_module_repository_path(@my_module ,@repository_snapshot) %>"
data-versions-sidebar-url="<%= full_view_sidebar_my_module_repository_snapshots_path(@my_module, @repository_snapshot.parent_id) %>"
>
<thead>

View file

@ -7,6 +7,7 @@
data-repository-name="<%= @repository.name %>"
data-assigned-items-count="<%= @my_module.repository_rows_count(@repository) %>"
data-load-state-url="<%= repository_load_table_state_path(@repository) %>"
data-export-url="<%= export_repository_my_module_repository_path(@my_module ,@repository) %>"
data-versions-sidebar-url="<%= full_view_sidebar_my_module_repository_snapshots_path(@my_module, @repository) %>"
>
<thead>

View file

@ -810,6 +810,7 @@ en:
no_assigned_items: 'No items assigned'
no_snapshots_label: 'You have not created any snapshots yet. To do so click the button bellow.'
versions_sidebar_button: 'View versions'
export_button: "Export .csv"
create_button: 'Create snapshot'
set_default_button: 'Set as default view'
created_by: 'by %{full_name}'

View file

@ -385,6 +385,7 @@ Rails.application.routes.draw do
member do
get :full_view_table
post :index_dt
post :export_repository
get :assign_repository_records_modal, as: :assign_modal
get :update_repository_records_modal, as: :update_modal
end