diff --git a/app/assets/javascripts/reports/new.js.erb b/app/assets/javascripts/reports/new.js.erb index 50d3ba047..e456c9474 100644 --- a/app/assets/javascripts/reports/new.js.erb +++ b/app/assets/javascripts/reports/new.js.erb @@ -5,7 +5,6 @@ $.fn.findWithSelf = function(selector) { }; var REPORT_CONTENT = "#report-content"; -var SIDEBAR_PARENT_TREE = "#report-sidebar-tree"; var ADD_CONTENTS_FORM_ID = "#add-contents-form"; var SAVE_REPORT_FORM_ID = "#save-report-form"; @@ -31,12 +30,14 @@ var ignoreUnsavedWorkAlert; initializeSaveToPdf(); initializeSaveReport(); initializeAddContentsModal(); - initializeSidebarNavigation(); initializeUnsavedWorkDialog(); $('.report-nav-link').each(function() { truncateLongString($(this), <%= Constants::NAME_TRUNCATION_LENGTH %>); }); + + // Automatically display the "Add content" modal + $('.new-element.initial').click(); } /** @@ -238,9 +239,6 @@ function initializeNewElement(newEl) { } else if (data.status == 200) { // Add elements addElements(el, data.responseJSON.elements); - - // Update sidebar - initializeSidebarNavigation(); } }) .on("ajax:error", function(e, xhr, settings, error) { @@ -486,140 +484,6 @@ function initializeUnsavedWorkDialog() { $(document).on('page:before-change', beforeUnload); } -/** - * SIDEBAR CODE - */ - - /** - * Get the sidebar
  • element for the specified report element. - * @param reportEl - The .report-element in the report. - * @return The corresponding sidebar
  • . - */ -function getSidebarEl(reportEl) { - var type = reportEl.data("type"); - var scrollId = reportEl.data("scroll-id"); - return $(SIDEBAR_PARENT_TREE).find( - "li" + - "[data-type='" + type + "']" + - "[data-scroll-id='" + scrollId + "']" - ); -} - -/** - * Get the report element for the specified - * sidebar element. - * @param sidebarEl - The
  • sidebar element. - * @return The corresponding report element. - */ -function getReportEl(sidebarEl) { - var type = sidebarEl.data("type"); - var scrollId = sidebarEl.data("scroll-id"); - return $(REPORT_CONTENT).find( - "div.report-element" + - "[data-type='" + type + "']" + - "[data-scroll-id='" + scrollId + "']" - ); -} - -/** - * Initialize the sidebar navigation pane. - */ -function initializeSidebarNavigation() { - var reportContent = $(REPORT_CONTENT); - var treeParent = $(SIDEBAR_PARENT_TREE); - - // Remove existing contents (also remove click listeners) - treeParent.find(".report-nav-link").off("click"); - treeParent.children().remove(); - - // Re-populate the sidebar - _.each(reportContent.children(".report-element"), function(child) { - var li = initSidebarElement($(child)); - li.appendTo(treeParent); - }); - - // Add click listener on all links - treeParent.find(".report-nav-link").click(function(e) { - var el = $(this).closest("li"); - scrollToElement(el); - - e.preventDefault(); - e.stopPropagation(); - return false; - }); - - // Call to sidebar function to re-initialize tree functionality - setupSidebarTree(); -} - -/** - * Recursive call to initialize sidebar elements. - * @param reportEl - The report element for which to - * generate the sidebar. - * @return A
  • jQuery element containing sidebar entry. - */ -function initSidebarElement(reportEl) { - var elChildrenContainer = reportEl.children(".report-element-children"); - var type = reportEl.data("type"); - var name = reportEl.data("name"); - var scrollId = reportEl.data("scroll-id"); - var iconClass = reportEl.data("icon-class"); - - // Generate list element - var newLi = $(document.createElement("li")); - newLi - .attr("data-type", type) - .attr("data-scroll-id", scrollId); - - var newSpan = $(document.createElement("span")); - newSpan.appendTo(newLi); - var newI = $(document.createElement("i")); - newI.appendTo(newSpan); - var newHref = $(document.createElement("a")); - newHref - .attr("href", "") - .addClass("report-nav-link") - .text(name) - .appendTo(newSpan); - var newIcon = $(document.createElement("span")); - newIcon.addClass(iconClass).prependTo(newHref); - - if (elChildrenContainer.length && elChildrenContainer.length > 0) { - var elChildren = elChildrenContainer.children(".report-element"); - if (elChildren.length && elChildren.length > 0) { - var newUl = $(document.createElement("ul")); - newUl.appendTo(newLi); - - _.each(elChildren, function(child) { - var li = initSidebarElement($(child)); - li.appendTo(newUl); - }); - } - } - - return newLi; -} - -/** - * Scroll to the specified element in the report. - * @param sidebarEl - The sidebar element. - */ -function scrollToElement(sidebarEl) { - var el = getReportEl(sidebarEl); - - if (el.length && el.length == 1) { - var content = $("body"); - content.scrollTo( - el, - { - axis: 'y', - duration: 500, - offset: -150 - } - ); - } -} - /** * INDIVIDUAL ELEMENTS SORTING/MODIFYING FUNCTIONS */ @@ -683,8 +547,6 @@ function sortWholeReport(asc) { sortElementChildren($(el), asc, true); }); - // Reinitialize sidebar - initializeSidebarNavigation(); animateLoading(false); } @@ -734,22 +596,6 @@ function sortElementChildren(el, asc, recursive) { sortElementChildren($(child), asc, true); } }); - - // Update sidebar - var prevEl = null; - _.each(children, function(child) { - var sidebarEl = getSidebarEl($(child)); - if (sidebarEl.length && sidebarEl.length == 1) { - var sidebarParent = sidebarEl.closest("ul"); - sidebarEl.detach(); - if (prevEl === null) { - sidebarParent.prepend(sidebarEl); - } else { - prevEl.after(sidebarEl); - } - prevEl = sidebarEl; - } - }); } /** @@ -844,38 +690,24 @@ function moveElement(el, up) { return; } - var sidebarEl; if (up) { var prevEl = prevNewEl.prev(); if (!prevEl.length || !prevEl.hasClass("report-element")) { return; } - // Move sidebar element up - sidebarEl = getSidebarEl(el); - var sidebarPrev = sidebarEl.prev(); - sidebarEl.detach(); - sidebarPrev.before(sidebarEl); - el.detach(); nextNewEl.detach(); prevEl.before(el); prevEl.before(nextNewEl); updateElementControls(prevEl); - } else { var nextEl = nextNewEl.next(); if (!nextEl.length || !nextEl.hasClass("report-element")) { return; } - // Move sidebar element up - sidebarEl = getSidebarEl(el); - var sidebarNext = sidebarEl.next(); - sidebarEl.detach(); - sidebarNext.after(sidebarEl); - prevNewEl.detach(); el.detach(); nextEl.after(el); @@ -905,10 +737,6 @@ function removeElement(el) { // TODO Remove event listeners - // Remove sidebar entry - var sidebarEl = getSidebarEl(el); - sidebarEl.remove(); - prevNewEl.remove(); el.remove(); @@ -933,10 +761,6 @@ function removeResultCommentsElement(el) { // TODO Remove event listeners - // Remove sidebar entry - var sidebarEl = getSidebarEl(el); - sidebarEl.remove(); - // Remove element, show the new element container el.remove(); parent.children(".new-element").removeClass("hidden"); @@ -1125,26 +949,6 @@ function constructElementContentsJson(el) { return jsonEl; } -/** - * Binds listeners to sidebar - * that truncate long strings - */ -function initializeReportSidebartruncation() { - var target = document.getElementById("report-sidebar-tree"); - var observer = new MutationObserver( - function() { - $.each($("a.report-nav-link"), - function(){ - truncateLongString($(this), - <%= Constants::NAME_TRUNCATION_LENGTH %>); - }); - } - ); - var config = { childList: true }; - - observer.observe(target, config); -} - $(document).ready(function() { // Check if we are actually at new report page if ($(REPORT_CONTENT).length) { diff --git a/app/assets/javascripts/repositories/repository_datatable.js.erb b/app/assets/javascripts/repositories/repository_datatable.js.erb index 0197a09c6..875f825b2 100644 --- a/app/assets/javascripts/repositories/repository_datatable.js.erb +++ b/app/assets/javascripts/repositories/repository_datatable.js.erb @@ -454,6 +454,10 @@ var RepositoryDatatable = (function(global) { $(th).attr('data-type') === 'RepositoryListValue') { input = initialListItemsRequest($(th).attr('id')); tr.appendChild(createTdElement(input)); + } else if ($(th).hasClass('repository-column') && + $(th).attr('data-type') === 'RepositoryAssetValue') { + input = changeToInputFileField('repository_cell_file', th.attr('id'), ''); + tr.appendChild(createTdElement(input)); } else { // Column we don't care for, just add empty td tr.appendChild(createTdElement('')); @@ -566,6 +570,29 @@ var RepositoryDatatable = (function(global) { }); } + + global.onClickCopyRepositoryRecords = function() { + animateSpinner(); + $.ajax({ + url: $('table' + TABLE_ID).data('copy-records'), + type: 'POST', + dataType: 'json', + data: { selected_rows: rowsSelected }, + success: function(data) { + HelperModule.flashAlertMsg(data.flash, 'success'); + rowsSelected = []; + onClickCancel(); + }, + error: function(e) { + if (e.status === 403) { + HelperModule.flashAlertMsg( + I18n.t('repositories.js.permission_error'), e.responseJSON.style + ); + } + } + }); + } + // Edit record global.onClickEdit = function() { if (rowsSelected.length !== 1) { @@ -612,19 +639,15 @@ var RepositoryDatatable = (function(global) { var rawIndex = TABLE.column.index('fromVisible', i); var colHeader = TABLE.column(rawIndex).header(); if ($(colHeader).hasClass('repository-column')) { + var type = $(colHeader).attr('data-type'); // Check if cell on this record exists - var cell = cells[$(colHeader).attr('id')]; - if (cell) { - td.html(changeToFormField('repository_cell', - $(colHeader).attr('id'), - cell, - list_columns)); - } else { - td.html(changeToFormField('repository_cell', - $(colHeader).attr('id'), - '', - list_columns)); - } + var cell = cells[$(colHeader).attr('id')] || ''; + td.html(changeToFormField('repository_cell', + $(colHeader).attr('id'), + type, + cell, + list_columns)); + _addSelectedFile(type, cell, $(this).find('input')[0]); _initSelectPicker(); } }); @@ -663,28 +686,32 @@ var RepositoryDatatable = (function(global) { node = selectedRecord; } // First fetch all the data in input fields - var data = { - request_url: $(TABLE_ID).data('current-uri'), - repository_row_id: $(selectedRecord).attr('id'), - repository_row: {}, - repository_cells: {} - }; + var formData = new FormData(); + formData.append('request_url', $(TABLE_ID).data('current-uri')); + formData.append('repository_row_id', $(selectedRecord).attr('id')); // Direct record attributes // Record name - data.repository_row.name = $('td input[data-object = repository_row]').val(); + formData.append('repository_row_name', $('td input[data-object = repository_row]').val()); // Custom cells text type $(node).find('td input[data-object = repository_cell]').each(function() { // Send data only and only if cell is not empty if ($(this).val().trim()) { - data.repository_cells[$(this).attr('name')] = $(this).val(); + formData.append('repository_cells[' + $(this).attr('name') + ']', $(this).val()); + } + }); + // Custom cells file type + $(node).find('td input[data-object = repository_cell_file]').each(function() { + // Send data only and only if cell is not empty + if ($(this).context.files.length == 1) { + formData.append('repository_cells[' + $(this).attr('name') + ']', $(this).context.files[0]); } }); // Custom cells list type $(node).find('td[column_id]').each(function(index, el) { var value = $(el).attr('list_item_id'); - data.repository_cells[$(el).attr('column_id')] = value; + formData.append('repository_cells[' + $(el).attr('column_id') + ']', value); }); var url; @@ -700,7 +727,9 @@ var RepositoryDatatable = (function(global) { url: url, type: type, dataType: 'json', - data: data, + data: formData, + processData: false, + contentType: false, success: function(data) { HelperModule.flashAlertMsg(data.flash, 'success'); SmartAnnotation.closePopup(); @@ -769,6 +798,8 @@ var RepositoryDatatable = (function(global) { $('.repository-row-selector').removeClass('disabled'); $('.repository-row-selector').prop('disabled', false); if (rowsSelected.length === 0) { + $('#copyRepositoryRecords').prop('disabled', true); + $('#copyRepositoryRecords').addClass('disabled'); $('#editRepositoryRecord').prop('disabled', true); $('#editRepositoryRecord').addClass('disabled'); $('#deleteRepositoryRecordsButton').prop('disabled', true); @@ -806,6 +837,8 @@ var RepositoryDatatable = (function(global) { } $('#deleteRepositoryRecordsButton').prop('disabled', false); $('#deleteRepositoryRecordsButton').removeClass('disabled'); + $('#copyRepositoryRecords').prop('disabled', false); + $('#copyRepositoryRecords').removeClass('disabled'); $('#assignRepositoryRecords').removeClass('disabled'); $('#assignRepositoryRecords').prop('disabled', false); $('#unassignRepositoryRecords').removeClass('disabled'); @@ -910,6 +943,15 @@ var RepositoryDatatable = (function(global) { return _listItemDropdown(massage_response, '-1', column_id); } + function _addSelectedFile(type, cell, input) { + if (type === 'RepositoryAssetValue' && cell.value != null) { + const dT = new ClipboardEvent('').clipboardData || // Firefox workaround exploiting https://bugzilla.mozilla.org/show_bug.cgi?id=1422655 + new DataTransfer(); // specs compliant (as of March 2018 only Chrome) + dT.items.add(new File([_], cell.value.file_file_name)); + input.files = dT.files; + } + } + function _initSelectPicker() { $('.selectpicker') .selectpicker({liveSearch: true}) @@ -972,21 +1014,23 @@ var RepositoryDatatable = (function(global) { object + "' name='" + name + "' value='" + value + "'>"; } + // Takes object and surrounds it with input + function changeToInputFileField(object, name, value) { + return "
    "; + } + // Takes an object and creates custom html element - function changeToFormField(object, name, cell, list_columns) { - if (cell === '') { + function changeToFormField(object, name, column_type, cell, list_columns) { + var value = cell.value || ''; + if (column_type === 'RepositoryListValue') { var column = _.findWhere(list_columns, { column_id: parseInt(name) }); - if (column) { - return _listItemDropdown(column.list_items, '', parseInt(name)); - } else { - return changeToInputField(object, name, ''); - } + var list_items = column.list_items || cell.list_items; + return _listItemDropdown(list_items, value, parseInt(name)); + } else if (column_type === 'RepositoryAssetValue') { + return changeToInputFileField('repository_cell_file', name, value); } else { - if (cell.type === 'RepositoryListValue') { - return _listItemDropdown(cell.list_items, cell.value, parseInt(name)); - } else { - return changeToInputField(object, name, cell.value); - } + return changeToInputField(object, name, value); } } diff --git a/app/assets/javascripts/repository_columns/index.js.erb b/app/assets/javascripts/repository_columns/index.js.erb index 474c4141b..34f53915b 100644 --- a/app/assets/javascripts/repository_columns/index.js.erb +++ b/app/assets/javascripts/repository_columns/index.js.erb @@ -189,8 +189,16 @@ }).on('ajax:error', function(e, xhr) { animateSpinner(null, false); if (modalID) { - var field = { "name": xhr.responseJSON.message } - $(form).renderFormErrors('repository_column', field, true, e); + if(xhr.responseJSON.message.hasOwnProperty('repository_list_items')) { + var message = xhr.responseJSON.message['repository_list_items']; + $('.dnd-error').remove(); + $('#manageRepositoryColumn ').find('.bootstrap-tagsinput').after( + "" + message + "" + ); + } else { + var field = { "name": xhr.responseJSON.message } + $(form).renderFormErrors('repository_column', field, true, e); + } } else { HelperModule.flashAlertMsg(xhr.responseJSON.message, 'danger'); } diff --git a/app/assets/javascripts/sidebar_toggle.js.erb b/app/assets/javascripts/sidebar_toggle.js.erb index 6084d4c3d..877d4bf93 100644 --- a/app/assets/javascripts/sidebar_toggle.js.erb +++ b/app/assets/javascripts/sidebar_toggle.js.erb @@ -10,7 +10,7 @@ ); $('#wrapper').css('paddingLeft', '280px'); $('.navbar-secondary').css( - { 'margin-left': '-280px', 'padding-left': '280px' } + { 'margin-left': '-280px', 'padding-left': '295px' } ); } @@ -23,7 +23,7 @@ $('#wrapper').css('paddingLeft', '0'); $('.navbar-secondary').css({ 'margin-left': '0', - 'padding-left': '0' + 'padding-left': '15px' }); } diff --git a/app/assets/stylesheets/reports.scss b/app/assets/stylesheets/reports.scss index 180cb7c48..bf2ae8481 100644 --- a/app/assets/stylesheets/reports.scss +++ b/app/assets/stylesheets/reports.scss @@ -8,27 +8,33 @@ /* New page navbar */ .navbar-report { - border-left: none; - border-top: none; - border-right: none; + background: $color-concrete; border-bottom: 4px solid $color-silver; - background: $color-concrete !important; + border-left: 0; + border-right: 0; + border-top: 0; margin-bottom: 0; min-width: 320px; padding: 0 15px; - z-index: 500; + padding-right: 100px; position: fixed; width: 100%; + z-index: 500; div.row { margin-right: 0; } #report-menu { + margin: 15px 0; form { display: inline-block; } + + .form-group { + margin-bottom: 0; + } } & > div.row { @@ -54,43 +60,6 @@ label { } } -/* New page sidebar */ -.report-sidebar-wrapper { - background-color: $color-white !important; -} - -// Some additional styling on the treeview -.report-tree { - li { - padding: 0 0 0 15px; - - a.report-nav-link:visited { - text-decoration: none; - } - a.report-nav-link:hover { - text-decoration: none; - } - [data-type='step']:not(.parent_li) { - padding-left: 27px; - } - } -} -.report-sidebar-panel-description { - margin: 10px 10px 0 10px; -} - -.report-item-elements { - margin-top: 10px !important; - margin-left: 15px !important; - - li { - margin: 5px 5px 5px 15px; - } - - ul { - padding-left: 15px !important; - } -} /** * Global fix for handsontable @@ -115,19 +84,20 @@ label { .report-container { overflow-x: auto; overflow-y: auto; - padding-top: 30px; - padding-bottom: 30px; + padding-left: 0; + width: auto; } #report-content { - color: $color-black; + @include box-shadow(0 0 58px -10px $color-black); background: $color-white; - @include box-shadow(0px 0px 58px -10px $color-black); - max-width: 800px; - min-width: 230px; - min-height: 1200px; + color: $color-black; margin-left: auto; margin-right: auto; + margin-top: 50px; + max-width: 800px; + min-height: 1200px; + min-width: 230px; padding: 45px; } diff --git a/app/assets/stylesheets/themes/main_navigation.scss b/app/assets/stylesheets/themes/main_navigation.scss index e4a25938b..34c8fdcde 100644 --- a/app/assets/stylesheets/themes/main_navigation.scss +++ b/app/assets/stylesheets/themes/main_navigation.scss @@ -270,7 +270,12 @@ padding-top: 5px; } + li:last-child { + border-bottom: 0; + } + .btn-default { + margin-left: 15px; text-align: right; width: 300px; } @@ -348,6 +353,15 @@ margin-left: 83px; } +#search-bar { + padding-right: 0; +} + +@media (max-width: 768px) { + #search-bar { + padding: 10px 30px; + } +} // reset margins on small screens @media (max-width: 1188px) { diff --git a/app/assets/stylesheets/themes/menu_bar.scss b/app/assets/stylesheets/themes/menu_bar.scss index 0c492a990..e85fc29e2 100644 --- a/app/assets/stylesheets/themes/menu_bar.scss +++ b/app/assets/stylesheets/themes/menu_bar.scss @@ -11,6 +11,7 @@ padding-top: 16px; position: fixed; width: 83px; + z-index: 1001; ul.nav > li { padding-right: 4px; diff --git a/app/assets/stylesheets/themes/repositories.scss b/app/assets/stylesheets/themes/repositories.scss index b13c7e4ca..ff3c183a6 100644 --- a/app/assets/stylesheets/themes/repositories.scss +++ b/app/assets/stylesheets/themes/repositories.scss @@ -37,3 +37,8 @@ float: left; margin-right: 5px; } + +.custom-alert-info { + background-color: $brand-info; + padding: 10px; +} diff --git a/app/assets/stylesheets/themes/scinote.scss b/app/assets/stylesheets/themes/scinote.scss index 53423bdee..b6cf057ca 100644 --- a/app/assets/stylesheets/themes/scinote.scss +++ b/app/assets/stylesheets/themes/scinote.scss @@ -222,7 +222,7 @@ a[data-toggle="tooltip"] { #secondary-navigation { white-space: nowrap; - overflow: hidden + overflow: hidden; } .panel-body { @@ -253,10 +253,23 @@ a[data-toggle="tooltip"] { border-right: 0; border-bottom: 4px solid $color-silver; padding-right: 0; + padding-left: 0; + } + + .navbar-toggle { + margin-right: 100px; + } + + #secondary-menu { + padding-left: 0; + } + + .nav-name { + padding: 15px 0; } ul.nav { - margin-right: 0; + margin-right: 60px; & > li { text-transform: uppercase; @@ -409,13 +422,6 @@ a[data-toggle="tooltip"] { } /** Protocols management */ -.breadcrumb-protocols-manager { - overflow: visible; - margin-top: 15px; - margin-bottom: 15px; - background-color: $color-white; -} - .tab-pane-protocols { & > div.protocols-description { margin-bottom: 15px; @@ -1277,7 +1283,6 @@ table.dataTable { .file-preview-container { align-items: center; - background-color: $color-white; color: $gray-dark; display: -moz-flex; display: -webkit-flex; diff --git a/app/controllers/experiments_controller.rb b/app/controllers/experiments_controller.rb index 4bbc30efc..eaf44e2b5 100644 --- a/app/controllers/experiments_controller.rb +++ b/app/controllers/experiments_controller.rb @@ -7,20 +7,19 @@ class ExperimentsController < ApplicationController include Rails.application.routes.url_helpers before_action :set_experiment, - except: [:new, :create] + except: %i(new create) before_action :set_project, - only: [:new, :create, :samples_index, :samples, :module_archive, - :clone_modal, :move_modal, :delete_samples] - before_action :load_projects_by_teams, only: %i(canvas samples) + only: %i(new create samples_index samples module_archive + clone_modal move_modal delete_samples) + before_action :load_projects_by_teams, only: %i(canvas samples module_archive) before_action :check_view_permissions, - only: [:canvas, :module_archive] + only: %i(canvas module_archive) before_action :check_manage_permissions, only: :edit before_action :check_archive_permissions, only: :archive before_action :check_clone_permissions, only: %i(clone_modal clone) before_action :check_move_permissions, only: %i(move_modal move) - # except parameter could be used but it is not working. - layout :choose_layout + layout 'fluid'.freeze # Action defined in SampleActions DELETE_SAMPLES = 'Delete'.freeze @@ -350,7 +349,8 @@ class ExperimentsController < ApplicationController end def load_projects_by_teams - @projects_by_teams = current_user.projects_by_teams + @projects_by_teams = current_user.projects_by_teams(current_team.id, + nil, false) end def check_view_permissions @@ -373,10 +373,6 @@ class ExperimentsController < ApplicationController render_403 unless can_move_experiment?(@experiment) end - def choose_layout - action_name.in?(%w(index archive)) ? 'main' : 'fluid' - end - def experiment_annotation_notification(old_text = nil) smart_annotation_notification( old_text: old_text, diff --git a/app/controllers/my_modules_controller.rb b/app/controllers/my_modules_controller.rb index 508edae24..1e10c3c99 100644 --- a/app/controllers/my_modules_controller.rb +++ b/app/controllers/my_modules_controller.rb @@ -17,8 +17,8 @@ class MyModulesController < ApplicationController before_action :load_repository, only: %i(assign_repository_records unassign_repository_records repository_index) - before_action :load_projects_by_teams, - only: %i(protocols results activities samples repository) + before_action :load_projects_by_teams, only: %i(protocols results activities + samples repository archive) before_action :check_manage_permissions, only: %i(update destroy description due_date) before_action :check_view_info_permissions, only: :show @@ -608,7 +608,8 @@ class MyModulesController < ApplicationController end def load_projects_by_teams - @projects_by_teams = current_user.projects_by_teams + @projects_by_teams = current_user.projects_by_teams(current_team.id, + nil, false) end def check_manage_permissions diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 9e76748d7..caf923c25 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -5,19 +5,19 @@ class ProjectsController < ApplicationController include InputSanitizeHelper before_action :generate_intro_demo, only: :index - before_action :load_vars, only: [:show, :edit, :update, - :notifications, :reports, - :samples, :experiment_archive, - :delete_samples, :samples_index] - before_action :load_projects_by_teams, only: %i(index show samples) + before_action :load_vars, only: %i(show edit update + notifications reports + samples experiment_archive + delete_samples samples_index) + before_action :load_projects_by_teams, only: %i(index show samples archive + experiment_archive) + before_action :load_archive_vars, only: :archive before_action :check_view_permissions, only: %i(show reports notifications samples experiment_archive samples_index) - before_action :check_create_permissions, only: [ :new, :create ] + before_action :check_create_permissions, only: %i(new create) before_action :check_manage_permissions, only: :edit - @filter_by_archived = false - # except parameter could be used but it is not working. layout 'fluid' @@ -36,7 +36,6 @@ class ProjectsController < ApplicationController end def archive - @filter_by_archived = true index end @@ -322,7 +321,16 @@ class ProjectsController < ApplicationController @current_sort = params[:sort].to_s @projects_by_teams = current_user.projects_by_teams(@current_team_id, @current_sort, - @filter_by_archived) + false) + else + @projects_by_teams = [] + end + end + + def load_archive_vars + if current_user.teams.any? + @archived_projects_by_teams = + current_user.projects_by_teams(@current_team_id, @current_sort, true) else @projects_by_teams = [] end diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb index bd1768087..f30b24fb7 100644 --- a/app/controllers/reports_controller.rb +++ b/app/controllers/reports_controller.rb @@ -30,8 +30,6 @@ class ReportsController < ApplicationController # before_action :check_view_permissions, only: :index before_action :check_manage_permissions, only: BEFORE_ACTION_METHODS - layout 'fluid' - # Index showing all reports of a single project def index; end diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index cb8bd4d09..d40f032c2 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -9,7 +9,7 @@ class RepositoriesController < ApplicationController before_action :check_manage_permissions, only: %i(destroy destroy_modal rename_modal update) before_action :check_create_permissions, only: - %i(create_new_modal create copy_modal copy) + %i(create_modal create copy_modal copy) layout 'fluid' diff --git a/app/controllers/repository_columns_controller.rb b/app/controllers/repository_columns_controller.rb index 6c02dc3cf..d4d5cb241 100644 --- a/app/controllers/repository_columns_controller.rb +++ b/app/controllers/repository_columns_controller.rb @@ -28,28 +28,35 @@ class RepositoryColumnsController < ApplicationController @repository_column.created_by = current_user respond_to do |format| - if @repository_column.save - generate_repository_list_items(params[:list_items]) - format.json do - render json: { - id: @repository_column.id, - name: escape_input(@repository_column.name), - message: t('libraries.repository_columns.create.success_flash', - name: @repository_column.name), - edit_url: - edit_repository_repository_column_path(@repository, - @repository_column), - update_url: - repository_repository_column_path(@repository, - @repository_column), - destroy_html_url: - repository_columns_destroy_html_path(@repository, - @repository_column) - }, - status: :ok - end - else - format.json do + format.json do + if @repository_column.save + if generate_repository_list_items(params[:list_items]) + render json: { + id: @repository_column.id, + name: escape_input(@repository_column.name), + message: t('libraries.repository_columns.create.success_flash', + name: @repository_column.name), + edit_url: + edit_repository_repository_column_path(@repository, + @repository_column), + update_url: + repository_repository_column_path(@repository, + @repository_column), + destroy_html_url: + repository_columns_destroy_html_path(@repository, + @repository_column) + }, + status: :ok + else + render json: { + message: { + repository_list_items: + t('libraries.repository_columns.repository_list_items_limit', + limit: Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN) + } + }, status: :unprocessable_entity + end + else render json: { message: @repository_column.errors.full_messages }, status: :unprocessable_entity end @@ -74,13 +81,22 @@ class RepositoryColumnsController < ApplicationController format.json do @repository_column.update_attributes(repository_column_params) if @repository_column.save - update_repository_list_items(params[:list_items]) - render json: { - id: @repository_column.id, - name: escape_input(@repository_column.name), - message: t('libraries.repository_columns.update.success_flash', - name: @repository_column.name) - }, status: :ok + if update_repository_list_items(params[:list_items]) + render json: { + id: @repository_column.id, + name: escape_input(@repository_column.name), + message: t('libraries.repository_columns.update.success_flash', + name: @repository_column.name) + }, status: :ok + else + render json: { + message: { + repository_list_items: + t('libraries.repository_columns.repository_list_items_limit', + limit: Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN) + } + }, status: :unprocessable_entity + end else render json: { message: @repository_column.errors.full_messages }, status: :unprocessable_entity @@ -162,7 +178,13 @@ class RepositoryColumnsController < ApplicationController def generate_repository_list_items(item_names) return unless @repository_column.data_type == 'RepositoryListValue' + column_items = @repository_column.repository_list_items.size + success = true item_names.split(',').uniq.each do |name| + if column_items >= Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN + success = false + next + end RepositoryListItem.create( repository: @repository, repository_column: @repository_column, @@ -170,11 +192,14 @@ class RepositoryColumnsController < ApplicationController created_by: current_user, last_modified_by: current_user ) + column_items += 1 end + success end def update_repository_list_items(item_names) return unless @repository_column.data_type == 'RepositoryListValue' + column_items = @repository_column.repository_list_items.size items_list = item_names.split(',').uniq existing = @repository_column.repository_list_items.pluck(:data) existing.each do |name| @@ -189,8 +214,13 @@ class RepositoryColumnsController < ApplicationController list_item_id ).destroy_all end + success = true items_list.each do |name| next if @repository_column.repository_list_items.find_by_data(name) + if column_items >= Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN + success = false + next + end RepositoryListItem.create( repository: @repository, repository_column: @repository_column, @@ -198,6 +228,8 @@ class RepositoryColumnsController < ApplicationController created_by: current_user, last_modified_by: current_user ) + column_items += 1 end + success end end diff --git a/app/controllers/repository_rows_controller.rb b/app/controllers/repository_rows_controller.rb index e8c191253..ab1ca0551 100644 --- a/app/controllers/repository_rows_controller.rb +++ b/app/controllers/repository_rows_controller.rb @@ -5,9 +5,11 @@ class RepositoryRowsController < ApplicationController before_action :load_info_modal_vars, only: :show before_action :load_vars, only: %i(edit update) - before_action :load_repository, only: %i(create delete_records index) + before_action :load_repository, + only: %i(create delete_records index copy_records) before_action :check_create_permissions, only: :create - before_action :check_manage_permissions, only: %i(edit update delete_records) + before_action :check_manage_permissions, + only: %i(edit update delete_records copy_records) def index @draw = params[:draw].to_i @@ -30,45 +32,11 @@ class RepositoryRowsController < ApplicationController repository_cells: [] } record.transaction do - record.name = record_params[:name] unless record_params[:name].blank? + record.name = record_params[:repository_row_name] unless record_params[:repository_row_name].blank? errors[:default_fields] = record.errors.messages unless record.save if cell_params cell_params.each do |key, value| - column = @repository.repository_columns.detect do |c| - c.id == key.to_i - end - if column.data_type == 'RepositoryListValue' - next if value == '-1' - # check if item existx else revert the transaction - list_item = RepositoryListItem.where(repository_column: column) - .find(value) - cell_value = RepositoryListValue.new( - repository_list_item_id: list_item.id, - created_by: current_user, - last_modified_by: current_user, - repository_cell_attributes: { - repository_row: record, - repository_column: column - } - ) - else - cell_value = RepositoryTextValue.new( - data: value, - created_by: current_user, - last_modified_by: current_user, - repository_cell_attributes: { - repository_row: record, - repository_column: column - } - ) - end - if cell_value.save - record_annotation_notification(record, cell_value.repository_cell) - else - errors[:repository_cells] << { - "#{column.id}": cell_value.errors.messages - } - end + next if create_cell_value(record, key, value, errors).nil? end end raise ActiveRecord::Rollback if errors[:repository_cells].any? @@ -113,9 +81,15 @@ class RepositoryRowsController < ApplicationController # Add custom cells ids as key (easier lookup on js side) @record.repository_cells.each do |cell| + if cell.value_type == 'RepositoryAssetValue' + cell_value = cell.value.asset if cell.value_type == 'RepositoryAssetValue' + else + cell_value = escape_input(cell.value.data) + end + json[:repository_row][:repository_cells][cell.repository_column_id] = { repository_cell_id: cell.id, - value: escape_input(cell.value.data), + value: cell_value, type: cell.value_type, list_items: fetch_list_items(cell) } @@ -134,7 +108,7 @@ class RepositoryRowsController < ApplicationController } @record.transaction do - @record.name = record_params[:name].blank? ? nil : record_params[:name] + @record.name = record_params[:repository_row_name].blank? ? nil : record_params[:repository_row_name] errors[:default_fields] = @record.errors.messages unless @record.save if cell_params cell_params.each do |key, value| @@ -154,6 +128,16 @@ class RepositoryRowsController < ApplicationController else existing.delete end + elsif existing.value_type == 'RepositoryAssetValue' + if existing.value.asset.update(file: value) + existing.value.asset.created_by = current_user + existing.value.asset.last_modified_by = current_user + existing.value.asset.post_process_file(current_team) + else + errors[:repository_cells] << { + "#{existing.repository_column_id}": { data: existing.value.asset.errors.messages[:file].first } + } + end else existing.value.data = value if existing.value.save @@ -168,42 +152,7 @@ class RepositoryRowsController < ApplicationController else # Looks like it is a new cell, so we need to create new value, cell # will be created automatically - column = @repository.repository_columns.detect do |c| - c.id == key.to_i - end - if column.data_type == 'RepositoryListValue' - next if value == '-1' - # check if item existx else revert the transaction - list_item = RepositoryListItem.where(repository_column: column) - .find(value) - cell_value = RepositoryListValue.new( - repository_list_item_id: list_item.id, - created_by: current_user, - last_modified_by: current_user, - repository_cell_attributes: { - repository_row: @record, - repository_column: column - } - ) - else - cell_value = RepositoryTextValue.new( - data: value, - created_by: current_user, - last_modified_by: current_user, - repository_cell_attributes: { - repository_row: @record, - repository_column: column - } - ) - end - if cell_value.save - record_annotation_notification(@record, - cell_value.repository_cell) - else - errors[:repository_cells] << { - "#{column.id}": cell_value.errors.messages - } - end + next if create_cell_value(@record, key, value, errors).nil? end end # Clean up empty cells, not present in updated record @@ -240,6 +189,66 @@ class RepositoryRowsController < ApplicationController end end + def create_cell_value(record, key, value, errors) + column = @repository.repository_columns.detect do |c| + c.id == key.to_i + end + if column.data_type == 'RepositoryListValue' + return if value == '-1' + # check if item existx else revert the transaction + list_item = RepositoryListItem.where(repository_column: column) + .find(value) + cell_value = RepositoryListValue.new( + repository_list_item_id: list_item.id, + created_by: current_user, + last_modified_by: current_user, + repository_cell_attributes: { + repository_row: record, + repository_column: column + } + ) + elsif column.data_type == 'RepositoryAssetValue' + asset = Asset.new(file: value, + created_by: current_user, + last_modified_by: current_user, + team: current_team) + if asset.save + asset.post_process_file(current_team) + else + errors[:repository_cells] << { + "#{column.id}": { data: asset.errors.messages[:file].first } + } + end + cell_value = RepositoryAssetValue.new( + asset: asset, + created_by: current_user, + last_modified_by: current_user, + repository_cell_attributes: { + repository_row: record, + repository_column: column + } + ) + else + cell_value = RepositoryTextValue.new( + data: value, + created_by: current_user, + last_modified_by: current_user, + repository_cell_attributes: { + repository_row: record, + repository_column: column + } + ) + end + if cell_value.save + record_annotation_notification(record, + cell_value.repository_cell) + else + errors[:repository_cells] << { + "#{column.id}": cell_value.errors.messages + } + end + end + def delete_records deleted_count = 0 if selected_params @@ -276,6 +285,17 @@ class RepositoryRowsController < ApplicationController end end + def copy_records + duplicate_service = RepositoryActions::DuplicateRows.new( + current_user, @repository, params[:selected_rows] + ) + duplicate_service.call + render json: { + flash: t('repositories.copy_records_report', + number: duplicate_service.number_of_duplicated_items) + }, status: :ok + end + private def load_info_modal_vars @@ -313,7 +333,7 @@ class RepositoryRowsController < ApplicationController end def record_params - params.require(:repository_row).permit(:name).to_h + params.permit(:repository_row_name).to_h end def cell_params diff --git a/app/helpers/file_icons_helper.rb b/app/helpers/file_icons_helper.rb index 8c12947e2..1bed35a35 100644 --- a/app/helpers/file_icons_helper.rb +++ b/app/helpers/file_icons_helper.rb @@ -9,10 +9,14 @@ module FileIconsHelper file_ext = asset.file_file_name.split('.').last if %w(doc docm docx dot dotm dotx odt rtf).include?(file_ext) fa_class = 'fa-file-word' - elsif %w(csv ods xls xlsb xlsm xlsx).include?(file_ext) + elsif %w(ods xls xlsb xlsm xlsx).include?(file_ext) fa_class = 'fa-file-excel' elsif %w(odp pot potm potx pps ppsm ppsx ppt pptm pptx).include?(file_ext) fa_class = 'fa-file-powerpoint' + elsif %w(pdf).include?(file_ext) + fa_class = 'fa-file-pdf' + elsif %w(txt csv tab tex).include?(file_ext) + fa_class = 'fa-file-alt' end # Now check for custom mappings or possible overrides diff --git a/app/helpers/repository_datatable_helper.rb b/app/helpers/repository_datatable_helper.rb index dee34f23a..d5e858d6c 100644 --- a/app/helpers/repository_datatable_helper.rb +++ b/app/helpers/repository_datatable_helper.rb @@ -58,4 +58,11 @@ module RepositoryDatatableHelper " " end end + + def can_perform_repository_actions(repository) + team = repository.team + can_manage_repository?(repository) || + can_create_repositories?(team) || + can_manage_repository_rows?(team) + end end diff --git a/app/helpers/secondary_navigation_helper.rb b/app/helpers/secondary_navigation_helper.rb index e867d3c4a..de5477453 100644 --- a/app/helpers/secondary_navigation_helper.rb +++ b/app/helpers/secondary_navigation_helper.rb @@ -55,4 +55,14 @@ module SecondaryNavigationHelper def is_module_archive? action_name == 'archive' end + + def title_element + if project_page? + @project + elsif experiment_page? + @experiment + elsif module_page? + @my_module + end + end end diff --git a/app/services/repository_actions/duplicate_cell.rb b/app/services/repository_actions/duplicate_cell.rb new file mode 100644 index 000000000..c70a5d0ad --- /dev/null +++ b/app/services/repository_actions/duplicate_cell.rb @@ -0,0 +1,110 @@ +# frozen_string_literal: true + +module RepositoryActions + class DuplicateCell + def initialize(cell, new_row, user, team) + @cell = cell + @new_row = new_row + @user = user + @team = team + end + + def call + self.send("duplicate_#{@cell.value_type.underscore}") + end + + private + + def duplicate_repository_list_value + old_value = @cell.value + RepositoryListValue.create( + old_value.attributes.merge( + id: nil, created_by: @user, last_modified_by: @user, + repository_cell_attributes: { + repository_row: @new_row, + repository_column: @cell.repository_column + } + ) + ) + end + + def duplicate_repository_text_value + old_value = @cell.value + RepositoryTextValue.create( + old_value.attributes.merge( + id: nil, created_by: @user, last_modified_by: @user, + repository_cell_attributes: { + repository_row: @new_row, + repository_column: @cell.repository_column + } + ) + ) + end + + def duplicate_repository_asset_value + old_value = @cell.value + new_asset = create_new_asset(old_value.asset) + RepositoryAssetValue.create( + old_value.attributes.merge( + id: nil, asset: new_asset, created_by: @user, last_modified_by: @user, + repository_cell_attributes: { + repository_row: @new_row, + repository_column: @cell.repository_column + } + ) + ) + end + + def duplicate_repository_date_value + old_value = @cell.value + RepositoryDateValue.create( + old_value.attributes.merge( + id: nil, created_by: @user, last_modified_by: @user, + repository_cell_attributes: { + repository_row: @new_row, + repository_column: @cell.repository_column + } + ) + ) + end + + # reuses the same code we have in copy protocols action + def create_new_asset(old_asset) + new_asset = Asset.new_empty( + old_asset.file_file_name, + old_asset.file_file_size + ) + new_asset.created_by = old_asset.created_by + new_asset.team = @team + new_asset.last_modified_by = @user + new_asset.file_processing = true if old_asset.is_image? + new_asset.file = old_asset.file + new_asset.save + + return unless new_asset.valid? + + if new_asset.is_image? + new_asset.file.reprocess!(:large) + new_asset.file.reprocess!(:medium) + end + + # Clone extracted text data if it exists + if old_asset.asset_text_datum + AssetTextDatum.create(data: new_asset.data, asset: new_asset) + end + + # Update estimated size of cloned asset + # (& file_present flag) + new_asset.update( + estimated_size: old_asset.estimated_size, + file_present: true + ) + + # Update team's space taken + @team.reload + @team.take_space(new_asset.estimated_size) + @team.save! + new_asset + end + end +end diff --git a/app/services/repository_actions/duplicate_rows.rb b/app/services/repository_actions/duplicate_rows.rb new file mode 100644 index 000000000..91a412ed3 --- /dev/null +++ b/app/services/repository_actions/duplicate_rows.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +require 'repository_actions/duplicate_cell' + +module RepositoryActions + class DuplicateRows + attr_reader :number_of_duplicated_items + def initialize(user, repository, rows_ids = []) + @user = user + @repository = repository + @rows_to_duplicate = sanitize_rows_to_duplicate(rows_ids) + @number_of_duplicated_items = 0 + end + + def call + @rows_to_duplicate.each do |row_id| + duplicate_row(row_id) + end + end + + private + + def sanitize_rows_to_duplicate(rows_ids) + process_ids = rows_ids.map(&:to_i).uniq + @repository.repository_rows.where(id: process_ids).pluck(:id) + end + + def duplicate_row(id) + row = RepositoryRow.find_by_id(id) + new_row = RepositoryRow.new( + row.attributes.merge(new_row_attributes(row.name)) + ) + + if new_row.save + @number_of_duplicated_items += 1 + row.repository_cells.each do |cell| + duplicate_repository_cell(cell, new_row) + end + end + end + + def new_row_attributes(name) + timestamp = DateTime.now + { id: nil, + name: "#{name} (1)", + created_at: timestamp, + updated_at: timestamp } + end + + def duplicate_repository_cell(cell, new_row) + RepositoryActions::DuplicateCell.new( + cell, new_row, @user, @repository.team + ).call + end + end +end diff --git a/app/services/smart_annotations/preview.rb b/app/services/smart_annotations/preview.rb index 791b3d2af..c6c474f02 100644 --- a/app/services/smart_annotations/preview.rb +++ b/app/services/smart_annotations/preview.rb @@ -56,7 +56,7 @@ module SmartAnnotations end def trim_repository_name(name) - name.strip.slice(0..2).upcase + name.strip.slice(0..2).capitalize end end end diff --git a/app/utilities/repository_import_parser/importer.rb b/app/utilities/repository_import_parser/importer.rb index c3123f9a5..0274ec295 100644 --- a/app/utilities/repository_import_parser/importer.rb +++ b/app/utilities/repository_import_parser/importer.rb @@ -53,6 +53,7 @@ module RepositoryImportParser def import_rows! errors = false + column_items = [] @rows.each do |row| # Skip empty rows next if row.empty? @@ -71,16 +72,28 @@ module RepositoryImportParser end row_cell_values = [] - row.each.with_index do |value, index| column = @columns[index] + size = 0 if column && value.present? + if column.data_type == 'RepositoryListValue' + current_items_column = get_items_column(column_items, column) + size = current_items_column.list_items_number + end # uses RepositoryCellValueResolver to retrieve the correct value cell_value_resolver = RepositoryImportParser::RepositoryCellValueResolver.new( - column, @user, @repository + column, + @user, + @repository, + size ) cell_value = cell_value_resolver.get_value(value, record_row) + if column.data_type == 'RepositoryListValue' + current_items_column.list_items_number = + cell_value_resolver.column_list_items_size + end + next if cell_value.nil? # checks the case if we reach items limit unless cell_value.valid? errors = true raise ActiveRecord::Rollback @@ -125,5 +138,21 @@ module RepositoryImportParser ).failed_instances.any? true end + + def get_items_column(list, column) + current_column = nil + list.each do |element| + current_column = element if element.has_column? column + end + unless current_column + new_column = RepositoryImportParser::ListItemsColumn.new( + column, + column.repository_list_items.size + ) + list << new_column + return new_column + end + current_column + end end end diff --git a/app/utilities/repository_import_parser/list_items_column.rb b/app/utilities/repository_import_parser/list_items_column.rb new file mode 100644 index 000000000..b7bd1167b --- /dev/null +++ b/app/utilities/repository_import_parser/list_items_column.rb @@ -0,0 +1,14 @@ +module RepositoryImportParser + class ListItemsColumn + attr_accessor :column, :list_items_number + + def initialize(column, list_items_number) + @column = column + @list_items_number = list_items_number + end + + def has_column?(column) + @column == column + end + end +end diff --git a/app/utilities/repository_import_parser/repository_cell_value_resolver.rb b/app/utilities/repository_import_parser/repository_cell_value_resolver.rb index 2ae63e988..6cb6c9530 100644 --- a/app/utilities/repository_import_parser/repository_cell_value_resolver.rb +++ b/app/utilities/repository_import_parser/repository_cell_value_resolver.rb @@ -4,10 +4,12 @@ # it to the repository_row module RepositoryImportParser class RepositoryCellValueResolver - def initialize(column, user, repository) + attr_reader :column_list_items_size + def initialize(column, user, repository, size) @column = column @user = user @repository = repository + @column_list_items_size = size end def get_value(value, record_row) @@ -30,6 +32,7 @@ module RepositoryImportParser def new_repository_list_value(value, record_row) list_item = @column.repository_list_items.find_by_data(value) list_item ||= create_repository_list_item(value) + return unless list_item RepositoryListValue.new( created_by: @user, last_modified_by: @user, @@ -42,13 +45,18 @@ module RepositoryImportParser end def create_repository_list_item(value) - RepositoryListItem.create( - data: value, - created_by: @user, - last_modified_by: @user, - repository_column: @column, - repository: @repository - ) + if @column_list_items_size >= Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN + return + end + item = RepositoryListItem.new(data: value, + created_by: @user, + last_modified_by: @user, + repository_column: @column, + repository: @repository) + if item.save + @column_list_items_size += 1 + return item + end end end end diff --git a/app/views/my_modules/archive.html.erb b/app/views/my_modules/archive.html.erb index 6e9871e84..cd698b95f 100644 --- a/app/views/my_modules/archive.html.erb +++ b/app/views/my_modules/archive.html.erb @@ -6,14 +6,13 @@
    <% i = 0 %> <% @archived_results.each do |result| %> - <%= render partial: "my_modules/archive/result.html.erb", locals: { result: result } %> - <% i = i + 1 %> <% end %> - <% if i == 0 %> <%=t "my_modules.module_archive.no_archived_results" %> <% end %>
    + + diff --git a/app/views/my_modules/archive/_result.html.erb b/app/views/my_modules/archive/_result.html.erb index f0f0c25c1..2c5a9cee3 100644 --- a/app/views/my_modules/archive/_result.html.erb +++ b/app/views/my_modules/archive/_result.html.erb @@ -9,7 +9,10 @@
  • <% option_text = t("my_modules.module_archive.option_download") %> <% if result.is_asset %> - <%= link_to option_text, download_asset_path(result.asset), data: {no_turbolink: true} %> + <%= link_to t('protocols.index.archive_results.preview'), download_asset_path(result.asset), + class: 'file-preview-link', + id: "modal_link#{result.asset.id}", + data: { no_turbolink: true, id: true, status: 'asset-present', 'preview-url': asset_file_preview_path(result.asset) } %> <% elsif result.is_text %> <%= link_to option_text, result_text_download_path(result.result_text_id), data: {no_turbolink: true} %> <% elsif result.is_table %> diff --git a/app/views/projects/archive.html.erb b/app/views/projects/archive.html.erb index 1b5b1a8bf..89bb349ee 100644 --- a/app/views/projects/archive.html.erb +++ b/app/views/projects/archive.html.erb @@ -1,7 +1,7 @@ <% provide(:head_title, t("projects.archive.head_title")) %> <%= render partial: "shared/sidebar" %> -<% if @projects_by_teams.length > 0 %> +<% if @archived_projects_by_teams.length > 0 %>
    @@ -29,7 +29,7 @@
    - <% @projects_by_teams.each do |team, projects| %> + <% @archived_projects_by_teams.each do |team, projects| %> <%= render partial: 'projects/archive/team_projects', locals: {team: team, projects: projects} %> <% end %> diff --git a/app/views/protocols/_breadcrumbs.html.erb b/app/views/protocols/_breadcrumbs.html.erb deleted file mode 100644 index b73725550..000000000 --- a/app/views/protocols/_breadcrumbs.html.erb +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/app/views/protocols/edit.html.erb b/app/views/protocols/edit.html.erb index e92d86ca7..9b45dce38 100644 --- a/app/views/protocols/edit.html.erb +++ b/app/views/protocols/edit.html.erb @@ -1,10 +1,6 @@ <% provide(:head_title, t("protocols.edit.head_title")) %> <%= render partial: 'shared/drag_n_drop_overlay' %> -<%= render partial: "protocols/breadcrumbs.html.erb", - locals: { teams: @teams, - current_team: @protocol.team, - type: @type } %> <%= render partial: "protocols/header.html.erb" %> diff --git a/app/views/protocols/index.html.erb b/app/views/protocols/index.html.erb index 35aa4be91..a70117ff7 100644 --- a/app/views/protocols/index.html.erb +++ b/app/views/protocols/index.html.erb @@ -2,7 +2,6 @@ <% provide(:head_title, t("protocols.index.head_title")) %> <% if current_team %> - <%= render partial: "protocols/breadcrumbs.html.erb", locals: { teams: @teams, current_team: @current_team, type: @type } %>