From d04578ff225c6cb77ffacbed5f902819acb4ce9c Mon Sep 17 00:00:00 2001 From: "Mark M. Florida" <markflorida@wustl.edu> Date: Tue, 9 Aug 2016 12:40:40 -0500 Subject: [PATCH] XNAT-4453, XNAT-4400: Spawner elements stored as an array will be rendered as a comma-separated list when retrieved and submitted as an array; Elements without a 'label' will not have a label. --- .../webapp/scripts/lib/form2js/src/form2js.js | 14 +++++++++++-- src/main/webapp/scripts/xnat/ui/panel.js | 21 ++++++++++++++++--- src/main/webapp/scripts/xnat/ui/templates.js | 7 +++++-- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/main/webapp/scripts/lib/form2js/src/form2js.js b/src/main/webapp/scripts/lib/form2js/src/form2js.js index 55c9bac7..61a977db 100755 --- a/src/main/webapp/scripts/lib/form2js/src/form2js.js +++ b/src/main/webapp/scripts/lib/form2js/src/form2js.js @@ -258,7 +258,7 @@ function extractNodeValues(node, nodeCallback, useIdIfEmptyName, getDisabled) { if (node.disabled && !getDisabled) return []; - var callbackResult, fieldValue, result, fieldName = getFieldName(node, useIdIfEmptyName); + var callbackResult, hasValue, fieldValue, result, fieldName = getFieldName(node, useIdIfEmptyName); callbackResult = nodeCallback && nodeCallback(node); @@ -267,7 +267,17 @@ } else if (fieldName != '' && node.nodeName.match(/INPUT|TEXTAREA/i)) { fieldValue = getFieldValue(node, getDisabled); - if (null === fieldValue) { + + hasValue = !!fieldValue; + + // convert items with 'array-list' class to an actual array + if (hasValue && /array-list|list-array/i.test(node.className)) { + fieldValue = fieldValue.split(',').map(function(item, i){ + return item.trim(); + }); + } + + if (!hasValue) { result = []; } else { result = [ { name: fieldName, value: fieldValue} ]; diff --git a/src/main/webapp/scripts/xnat/ui/panel.js b/src/main/webapp/scripts/xnat/ui/panel.js index 98b1dc8e..682c4dbd 100644 --- a/src/main/webapp/scripts/xnat/ui/panel.js +++ b/src/main/webapp/scripts/xnat/ui/panel.js @@ -146,6 +146,7 @@ var XNAT = getObject(XNAT || {}); } // creates a panel that's a form that can be submitted + // TODO: REFACTOR THIS BEAST panel.form = function panelForm(opts, callback){ opts = cloneObject(opts); @@ -211,23 +212,30 @@ var XNAT = getObject(XNAT || {}); // find all form inputs with a name attribute $$(form).find(':input').each(function(){ + var $this = $(this); var val = lookupObjectValue(dataObj, this.name||this.title); //if (!val) return; if (Array.isArray(val)) { val = val.join(', '); + $this.addClass('array-list') } else { val = stringable(val) ? val : JSON.stringify(val); } - $(this).changeVal(val); + $this.not(':radio').changeVal(val); - if (/checkbox|radio/i.test(this.type)) { + if (/checkbox/i.test(this.type)) { this.checked = !!this.value; } + if (/radio/i.test(this.type)) { + this.checked = (this.value === val); + //$this.trigger('change'); + } + }); loadingDialog().closeAll(); @@ -875,13 +883,20 @@ var XNAT = getObject(XNAT || {}); panelTextarea.openEditor(); }; - opts.element.rows = 10; + opts.element.rows = opts.rows || opts.element.rows || 10; var textarea = spawn('textarea', opts.element); return XNAT.ui.template.panelDisplay(opts, textarea).spawned; }; panel.input.textarea = panel.textarea; + panel.textarea.arrayList = function(opts){ + opts = extend(true, {}, { + element: { $: { addClass: 'array-list' } } + }, opts); + return panel.textarea(opts); + }; + ////////////////////////////////////////////////// // SELECT MENU PANEL ELEMENTS ////////////////////////////////////////////////// diff --git a/src/main/webapp/scripts/xnat/ui/templates.js b/src/main/webapp/scripts/xnat/ui/templates.js index 0239e1e1..9c773342 100644 --- a/src/main/webapp/scripts/xnat/ui/templates.js +++ b/src/main/webapp/scripts/xnat/ui/templates.js @@ -128,7 +128,7 @@ var XNAT = getObject(XNAT); opts = cloneObject(opts); opts.id = opts.id||toDashed(opts.name||''); - opts.label = opts.label||opts.title||opts.name||''; + opts.label = opts.label||''; // pass in an element or create a new 'div' element element = @@ -140,7 +140,10 @@ var XNAT = getObject(XNAT); }, opts.element)); return template.panelElement(opts, [ - ['label.element-label|for='+element.id||opts.id, opts.label], + + // only add a label if specified + (opts.label ? ['label.element-label|for='+element.id||opts.id, opts.label] : ''), + ['div.element-wrapper', [].concat( (opts.beforeElement ? opts.beforeElement : []), -- GitLab