diff --git a/app/assets/javascripts/single_page/dynamic_table.js.erb b/app/assets/javascripts/single_page/dynamic_table.js.erb index 7bf238efcb..c344d5e762 100644 --- a/app/assets/javascripts/single_page/dynamic_table.js.erb +++ b/app/assets/javascripts/single_page/dynamic_table.js.erb @@ -21,7 +21,7 @@ const defaultCols = [{ const objectInputTemp = '' + ''; const typeaheadSamplesUrl = "<%= typeahead_samples_path(linked_sample_type_id: '_LINKED_') %>"; @@ -59,22 +59,21 @@ const handleSelect = (e) => { } c["render"] = function(data_, type, full, meta) { - if(c.multi_link){ + if(c.linked_sample_type){ data = data_ && Array.isArray(data_) ? data_ : [data_]; data = data[0]?.id ? data : []; return inputObjectsInput(c, data, options, linkedSamplesUrl); - }else if(c.is_cv_list && data_ !== "#HIDDEN"){ - data = data_ && Array.isArray(data_) ? data_ : [data_]; - data = data.map((e) => { - if (e?.id){ - return e.id - } else { - return e - } - }); - - return cvListObjectsInput(c, data, options, cvUrl); - }else if (data_ === "#HIDDEN") { + } else if(c.is_cv_list && data_ !== "#HIDDEN"){ + data = data_ && Array.isArray(data_) ? data_ : [data_]; + data = data.map((e) => { + if (e?.id){ + return e.id + } else { + return e + } + }); + return cvListObjectsInput(c, data, options, cvUrl); + } else if (data_ === "#HIDDEN") { return "Hidden"; } else { return data_; @@ -565,6 +564,7 @@ function inputObjectsInput(column, data, options, url){ }, []); const hasUnlinkedSamples = unLinkedSamples.length > 0 ? true : false; + const hasMultipleInputs = column.multi_link ? 'multiple="multiple"' : '' const extraClass = hasUnlinkedSamples ? 'select2__error' : ''; const titleText = hasUnlinkedSamples ? `Sample(s) '${unLinkedSamples.map(uls => uls.title).join(', ')}' not recognised as input. Please correct this issue!` : ''; setTimeout(ObjectsInput.init); @@ -576,6 +576,7 @@ function inputObjectsInput(column, data, options, url){ .replace('_OPTIONS_', existingOptions) .replace('_EXTRACLASS_', extraClass) .replace('_TITLE_', titleText) + .replace('_MULTIPLE?_', hasMultipleInputs) .replace('_ALLOW_FREE_TEXT_', false); } } @@ -599,6 +600,7 @@ function cvListObjectsInput(column, data, options, url){ .replace('_OPTIONS_', existingOptions) .replace('_EXTRACLASS_', extraClass) .replace('_TITLE_', titleText) + .replace('_MULTIPLE?_', 'multiple="multiple"') .replace('_ALLOW_FREE_TEXT_', allowNewItems); } } diff --git a/app/assets/javascripts/single_page/index.js.erb b/app/assets/javascripts/single_page/index.js.erb index ec97c201fb..8b93dd1657 100644 --- a/app/assets/javascripts/single_page/index.js.erb +++ b/app/assets/javascripts/single_page/index.js.erb @@ -242,12 +242,12 @@ async function exportToExcel(tableName, studyId, assayId, sampleTypeId) { const val = row[j]; // Check whether sample has one or more hidden Inputs or if sample is completely hidden - if (attr.toLowerCase().includes('input')) { - if (Array.isArray(val)){ - hasHiddenInputs = val.some(input => input.title === '#HIDDEN'); // Sample has hidden inputs - } else { - hasHiddenInputs = val === '#HIDDEN'; // Sample is completely hidden - } + if (Array.isArray(val)){ + hasHiddenInputs = hasHiddenInputs || val.some(input => input.title === '#HIDDEN'); // Sample has hidden Registered Samples in list + } else if(typeof val === 'object' && val !== null && 'title' in val){ + hasHiddenInputs = hasHiddenInputs || (val.title === '#HIDDEN'); // Sample has hidden Registered Sample + } else { + hasHiddenInputs = hasHiddenInputs || (val === '#HIDDEN'); // Sample is completely hidden } // The source inputs are wrapped in an object and must be unwrapped first diff --git a/app/assets/javascripts/templates.js b/app/assets/javascripts/templates.js index 11bea4dea6..2584f23ed6 100644 --- a/app/assets/javascripts/templates.js +++ b/app/assets/javascripts/templates.js @@ -11,7 +11,7 @@ Templates.init = function (elem) { const columnDefs = [ { orderable: false, targets: [0, 7, 11] }, { - targets: [3, 4, 9, 10], + targets: [3, 4, 5, 10, 11, 13], visible: false, searchable: false }, @@ -33,6 +33,7 @@ Templates.init = function (elem) { { title: "Description", width: "40%" }, { title: "attribute_type_id" }, { title: "cv_id" }, + { title: "allow_cv_free_text" }, { title: "Unit", width: "5%" }, { title: "Data type", width: "10%" }, { @@ -56,7 +57,8 @@ Templates.init = function (elem) { ? "" : 'Remove'; } - } + }, + { title: "linked sample type id", width: "10%" } ]; Templates.table = elem.DataTable({ @@ -115,13 +117,15 @@ Templates.mapData = (data) => item.description, item.attribute_type_id, item.cv_id, + item.allow_cv_free_text, item.unit_id, item.data_type, item.is_title, item.pid, item.pos, item.isa_tag_id, - item.isa_tag_title + item.isa_tag_title, + item.linked_sample_type_id ]); function loadFilterSelectors(data) { @@ -183,14 +187,14 @@ function get_filtered_isa_tags(level) { function updateIsaTagSelect(template_level, attribute_row) { const isa_tags = get_filtered_isa_tags(template_level); - // Remove all options first, except blank one - $j(attribute_row).find('select[data-attr="isa_tag_title"] option:not([value=""])').each(function() { + // Remove all options first from the select items that were not disabled, except blank one + $j(attribute_row).find('select[data-attr="isa_tag_title"]:not(:disabled) option:not([value=""])').each(function() { $j(this).remove(); }); // Append filtered option to a new attribute row $j.each(isa_tags, function (i, tag) { - $j(attribute_row).find('select[data-attr="isa_tag_title"]').append($j('