diff --git a/app/assets/javascripts/my_modules/repositories.js b/app/assets/javascripts/my_modules/repositories.js index b3e6fff24..9d277d4ba 100644 --- a/app/assets/javascripts/my_modules/repositories.js +++ b/app/assets/javascripts/my_modules/repositories.js @@ -1,6 +1,6 @@ -/* eslint-disable no-param-reassign, no-use-before-define */ +/* 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(); } }; }()); diff --git a/app/assets/javascripts/repositories/repository_datatable.js b/app/assets/javascripts/repositories/repository_datatable.js index eccc6f6a7..84c48b55b 100644 --- a/app/assets/javascripts/repositories/repository_datatable.js +++ b/app/assets/javascripts/repositories/repository_datatable.js @@ -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[]'); diff --git a/app/assets/javascripts/sitewide/repository_helper.js b/app/assets/javascripts/sitewide/repository_helper.js index 25bd2ad09..885de3746 100644 --- a/app/assets/javascripts/sitewide/repository_helper.js +++ b/app/assets/javascripts/sitewide/repository_helper.js @@ -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; +} diff --git a/app/controllers/my_module_repositories_controller.rb b/app/controllers/my_module_repositories_controller.rb index 57d677bcd..54add8ab1 100644 --- a/app/controllers/my_module_repositories_controller.rb +++ b/app/controllers/my_module_repositories_controller.rb @@ -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 diff --git a/app/services/repository_zip_export.rb b/app/services/repository_zip_export.rb index be0e54480..2fe9c4632 100644 --- a/app/services/repository_zip_export.rb +++ b/app/services/repository_zip_export.rb @@ -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 - 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] } + 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) + 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 diff --git a/app/views/my_modules/repositories/_full_view_modal.html.erb b/app/views/my_modules/repositories/_full_view_modal.html.erb index 89292e0aa..ddbfdc020 100644 --- a/app/views/my_modules/repositories/_full_view_modal.html.erb +++ b/app/views/my_modules/repositories/_full_view_modal.html.erb @@ -19,11 +19,15 @@