diff --git a/static/scripts/mvc/Archive.zip b/static/scripts/mvc/Archive.zip deleted file mode 100644 index 102b75b3343..00000000000 Binary files a/static/scripts/mvc/Archive.zip and /dev/null differ diff --git a/static/scripts/mvc/tools/tools-input.js b/static/scripts/mvc/tools/tools-input.js deleted file mode 100644 index 9eaba877363..00000000000 --- a/static/scripts/mvc/tools/tools-input.js +++ /dev/null @@ -1,147 +0,0 @@ -/** - This class creates a tool form input element wrapper -*/ -define([], function() { - - // input field element wrapper - return Backbone.View.extend({ - // initialize input wrapper - initialize: function(app, options) { - // link app - this.app = app; - - // set text labels and icons for optional button - this.text_enable = app.options.text_enable || 'Enable'; - this.text_disable = app.options.text_disable || 'Disable'; - this.cls_enable = app.options.cls_enable || 'fa fa-plus-square'; - this.cls_disable = app.options.cls_disable || 'fa fa-minus-square'; - - // link field - this.field = options.field; - this.default_value = options.default_value; - - // set element - this.setElement(this._template(options)); - - // link elements - this.$field = this.$el.find('.ui-table-form-field'); - this.$optional = this.$el.find('.ui-table-form-optional'); - this.$optional_icon = this.$el.find('.ui-table-form-optional').find('.icon'); - this.$error_text = this.$el.find('.ui-table-form-error-text'); - this.$error = this.$el.find('.ui-table-form-error'); - - // add field element - this.$field.prepend(this.field.$el); - - // decide wether to expand or collapse optional fields - this.field.skip = false; - var v = this.field.value && this.field.value(); - this.field.skip = Boolean(options.optional && - (v === null || v === '' || v === this.default_value || - String(v) === String(this.default_value) || - Number(v) === Number(this.default_value) || - JSON.stringify(v) === JSON.stringify(this.default_value))); - - // refresh view - this._refresh(); - - // add optional hide/show - var self = this; - this.$optional.on('click', function() { - // flip flag - self.field.skip = !self.field.skip; - - // refresh view - self._refresh(); - - // refresh state - self.app.trigger('refresh'); - }); - }, - - /** Set error text - */ - error: function(text) { - this.$error_text.html(text); - this.$error.show(); - this.$el.addClass('ui-error'); - }, - - /** Reset this view - */ - reset: function() { - this.$error.hide(); - this.$el.removeClass('ui-error'); - }, - - /** Refresh element - */ - _refresh: function() { - // reset optional button - this.$optional_icon.removeClass().addClass('icon'); - - // identify state - if (!this.field.skip) { - // enable input field - this.$field.fadeIn('fast'); - this._tooltip(this.text_disable, this.cls_disable); - - } else { - // disable input field - this.$field.hide(); - this._tooltip(this.text_enable, this.cls_enable); - // reset field value - this.field.value && this.field.value(this.default_value); - } - }, - - /** Set tooltip text - */ - _tooltip: function(title, cls) { - if (this.$optional.length) { - this.$optional_icon.addClass(cls) - .tooltip({ placement: 'bottom' }) - .attr('data-original-title', title) - .tooltip('fixTitle').tooltip('hide'); - } - }, - - /** Main Template - */ - _template: function(options) { - // create table element - var tmp = '
' + - '
' + - '' + - '
' + - '
'; - - // is optional - if (options.optional) { - tmp += '
' + - '' + options.label + - '
'; - } else { - tmp += options.label; - } - - // finalize title - tmp += '
' + - '
'; - - // add help - tmp += '
'; - if (options.help) { - tmp += options.help; - } - tmp += '
'; - - // finalize - tmp += '
' + - '
'; - - // return input element - return tmp; - } - }); -}); \ No newline at end of file diff --git a/static/scripts/mvc/tools/tools-parameters.js b/static/scripts/mvc/tools/tools-parameters.js deleted file mode 100644 index 0724e6d4910..00000000000 --- a/static/scripts/mvc/tools/tools-parameters.js +++ /dev/null @@ -1,263 +0,0 @@ -/** - This class creates input elements. New input parameter types should be added to the types dictionary. -*/ -define(['utils/utils', - 'mvc/ui/ui-misc', - 'mvc/tools/tools-select-content', - 'mvc/ui/ui-color-picker'], - function(Utils, Ui, SelectContent, ColorPicker) { - - // create form view - return Backbone.Model.extend({ - /** Available parameter types */ - types: { - 'text' : '_fieldText', - 'select' : '_fieldSelect', - 'data_column' : '_fieldSelect', - 'genomebuild' : '_fieldSelect', - 'data' : '_fieldData', - 'data_collection' : '_fieldData', - 'integer' : '_fieldSlider', - 'float' : '_fieldSlider', - 'boolean' : '_fieldBoolean', - 'drill_down' : '_fieldDrilldown', - 'color' : '_fieldColor', - 'hidden' : '_fieldHidden', - 'hidden_data' : '_fieldHidden', - 'baseurl' : '_fieldHidden', - }, - - // initialize - initialize: function(app, options) { - this.app = app; - }, - - /** Returns an input field for a given field type - */ - create: function(input_def) { - // add regular/default value if missing - if (input_def.value === undefined) { - input_def.value = null; - } - if (input_def.default_value === undefined) { - input_def.default_value = input_def.value; - } - - // field wrapper - var field = null; - - // get field class - var fieldClass = this.types[input_def.type]; - if (fieldClass && typeof(this[fieldClass]) === 'function') { - field = this[fieldClass].call(this, input_def); - } - - // identify field type - if (!field) { - // flag - this.app.incompatible = true; - - // with or without options - if (input_def.options) { - // assign select field - field = this._fieldSelect(input_def); - } else { - // assign text field - field = this._fieldText(input_def); - } - - // log - console.debug('tools-form::_addRow() : Auto matched field type (' + input_def.type + ').'); - } - - // set field value - if (input_def.value !== undefined) { - field.value(input_def.value); - } - - // return field element - return field; - }, - - /** Data input field - */ - _fieldData : function(input_def) { - if (!this.app.options.is_dynamic) { - input_def.info = 'Data input \'' + input_def.name + '\' (' + Utils.textify(input_def.extensions.toString()) + ')'; - input_def.value = null; - return this._fieldHidden(input_def); - } - var self = this; - return new SelectContent.View(this.app, { - id : 'field-' + input_def.id, - extensions : input_def.extensions, - optional : input_def.optional, - multiple : input_def.multiple, - type : input_def.type, - data : input_def.options, - onchange : function() { - self.app.trigger('refresh'); - } - }); - }, - - /** Select/Checkbox/Radio options field - */ - _fieldSelect : function (input_def) { - // show text field in if dynamic fields are disabled e.g. in workflow editor - if (!this.app.options.is_dynamic && input_def.is_dynamic) { - return this._fieldText(input_def); - } - - // customize properties - if (input_def.type == 'data_column') { - input_def.error_text = 'Missing columns in referenced dataset.' - } - if (input_def.type == 'genomebuild') { - input_def.searchable = true; - } - - // configure options fields - var options = []; - for (var i in input_def.options) { - var option = input_def.options[i]; - options.push({ - label: option[0], - value: option[1] - }); - } - - // identify display type - var SelectClass = Ui.Select; - switch (input_def.display) { - case 'checkboxes': - SelectClass = Ui.Checkbox; - break; - case 'radio': - SelectClass = Ui.Radio; - break; - } - - // select field - var self = this; - return new SelectClass.View({ - id : 'field-' + input_def.id, - data : options, - error_text : input_def.error_text || 'No options available', - multiple : input_def.multiple, - searchable : input_def.searchable, - onchange : function() { - self.app.trigger('refresh'); - } - }); - }, - - /** Drill down options field - */ - _fieldDrilldown : function (input_def) { - // show text field in if dynamic fields are disabled e.g. in workflow editor - if (!this.app.options.is_dynamic && input_def.is_dynamic) { - return this._fieldText(input_def); - } - - // create drill down field - var self = this; - return new Ui.Drilldown.View({ - id : 'field-' + input_def.id, - data : input_def.options, - display : input_def.display, - onchange : function() { - self.app.trigger('refresh'); - } - }); - }, - - /** Text input field - */ - _fieldText : function(input_def) { - // field replaces e.g. a select field - if (input_def.options) { - // show text area if selecting multiple entries is allowed - input_def.area = input_def.multiple; - - // validate value - if (!Utils.validate(input_def.value)) { - input_def.value = ''; - } else { - if (input_def.value instanceof Array) { - input_def.value = value.toString(); - } else { - input_def.value = String(input_def.value).replace(/[\[\]'"\s]/g, ''); - if (input_def.multiple) { - input_def.value = input_def.value.replace(/,/g, '\n'); - } - } - } - } - - // create input element - var self = this; - return new Ui.Input({ - id : 'field-' + input_def.id, - area : input_def.area, - onchange : function() { - self.app.trigger('refresh'); - } - }); - }, - - /** Slider field - */ - _fieldSlider: function(input_def) { - var self = this; - return new Ui.Slider.View({ - id : 'field-' + input_def.id, - precise : input_def.type == 'float', - min : input_def.min, - max : input_def.max, - onchange : function() { - self.app.trigger('refresh'); - } - }); - }, - - /** Hidden field - */ - _fieldHidden : function(input_def) { - return new Ui.Hidden({ - id : 'field-' + input_def.id, - info : input_def.info - }); - }, - - /** Boolean field - */ - _fieldBoolean : function(input_def) { - var self = this; - return new Ui.RadioButton.View({ - id : 'field-' + input_def.id, - data : [ { label : 'Yes', value : 'true' }, - { label : 'No', value : 'false' }], - onchange : function() { - self.app.trigger('refresh'); - } - }); - }, - - /** Color picker field - */ - _fieldColor : function(input_def) { - var self = this; - return new ColorPicker({ - id : 'field-' + input_def.id, - onchange : function() { - self.app.trigger('refresh'); - } - }); - } - }); - - return { - View: View - }; -}); diff --git a/static/scripts/mvc/tools/tools-repeat.js b/static/scripts/mvc/tools/tools-repeat.js deleted file mode 100644 index 3f78bffbee9..00000000000 --- a/static/scripts/mvc/tools/tools-repeat.js +++ /dev/null @@ -1,166 +0,0 @@ -// dependencies -define(['utils/utils', 'mvc/ui/ui-table', 'mvc/ui/ui-portlet', 'mvc/ui/ui-misc'], function(Utils, Table, Portlet, Ui) { - -/** This class creates a ui component which enables the dynamic creation of portlets -*/ -var View = Backbone.View.extend({ - // default options - optionsDefault : { - title : 'Section', - max : null, - min : null - }, - - /** Initialize - */ - initialize : function(options) { - // configure options - this.options = Utils.merge(options, this.optionsDefault); - - // create new element - this.setElement('
'); - - // link this - var self = this; - - // create button - this.button_new = new Ui.ButtonIcon({ - icon : 'fa-plus', - title : 'Insert ' + options.title_new, - tooltip : 'Add new ' + options.title_new + ' block', - floating: 'clear', - onclick : function() { - if (options.onnew) { - options.onnew(); - } - } - }); - - // create table - this.table = new Table.View({ - cls : 'ui-table-plain', - content : '' - }); - - // append button - this.$el.append(this.table.$el); - - // add button - this.$el.append($('
').append(this.button_new.$el)); - - // clear list - this.list = {}; - - // number of available repeats - this.n = 0; - }, - - /** Number of repeat blocks - */ - size: function() { - return this.n; - }, - - /** Add new repeat block - */ - add: function(options) { - // repeat block already exists - if (!options.id || this.list[options.id]) { - console.debug('tools-repeat::add - Duplicate repeat block id.'); - return; - } - - // increase repeat block counter - this.n++; - - // delete button - var button_delete = new Ui.ButtonIcon({ - icon : 'fa-trash-o', - tooltip : 'Delete this repeat block', - cls : 'ui-button-icon-plain', - onclick : function() { - if (options.ondel) { - options.ondel(); - } - } - }); - - // create portlet - var portlet = new Portlet.View({ - id : options.id, - title : 'placeholder', - cls : 'ui-portlet-repeat', - operations : { - button_delete : button_delete - } - }); - - // append content - portlet.append(options.$el); - - // tag as section row - portlet.$el.addClass('section-row'); - - // append to dom - this.list[options.id] = portlet; - - // append to dom - this.table.add(portlet.$el); - this.table.append('row_' + options.id, true); - - // validate maximum - if (this.options.max > 0 && this.n >= this.options.max) { - this.button_new.disable(); - } - - // refresh view - this._refresh(); - }, - - /** Delete repeat block - */ - del: function(id) { - // could not find element - if (!this.list[id]) { - console.debug('tools-repeat::del - Invalid repeat block id.'); - return; - } - - // decrease repeat block counter - this.n--; - - // delete table row - var table_row = this.table.get('row_' + id); - table_row.remove(); - - // remove from list - delete this.list[id]; - - // enable new button - this.button_new.enable(); - - // refresh delete button visibility - this._refresh(); - }, - - /** Refresh view - */ - _refresh: function() { - var index = 0; - for (var id in this.list) { - var portlet = this.list[id]; - portlet.title(++index + ': ' + this.options.title); - if (this.n > this.options.min) { - portlet.showOperation('button_delete'); - } else { - portlet.hideOperation('button_delete'); - } - } - } -}); - -return { - View : View -} - -}); diff --git a/static/scripts/mvc/tools/tools-section.js b/static/scripts/mvc/tools/tools-section.js deleted file mode 100644 index c779d73acdb..00000000000 --- a/static/scripts/mvc/tools/tools-section.js +++ /dev/null @@ -1,343 +0,0 @@ -/** - This class creates a tool form section and populates it with input elements. It also handles repeat blocks and conditionals by recursively creating new sub sections. -*/ -define(['utils/utils', - 'mvc/ui/ui-table', - 'mvc/ui/ui-misc', - 'mvc/ui/ui-portlet', - 'mvc/tools/tools-repeat', - 'mvc/tools/tools-input', - 'mvc/tools/tools-parameters'], - function(Utils, Table, Ui, Portlet, Repeat, InputElement, Parameters) { - - // create form view - var View = Backbone.View.extend({ - // initialize - initialize: function(app, options) { - // link app - this.app = app; - - // link inputs - this.inputs = options.inputs; - - // fix table style - options.cls = 'ui-table-plain'; - - // add table class for tr tag - // this assist in transforming the form into a json structure - options.cls_tr = 'section-row'; - - // create table - this.table = new Table.View(options); - - // create parameter handler - this.parameters = new Parameters(app, options); - - // configure portlet and form table - this.setElement(this.table.$el); - - // render tool section - this.render(); - }, - - /** Render section view - */ - render: function() { - // reset table - this.table.delAll(); - - // load settings elements into table - for (var i in this.inputs) { - this.add(this.inputs[i]); - } - }, - - /** Add a new input element - */ - add: function(input) { - // link this - var self = this; - - // clone definition - var input_def = jQuery.extend(true, {}, input); - - // create unique id - input_def.id = input.id = Utils.uuid(); - - // add to sequential list of inputs - this.app.input_list[input_def.id] = input_def; - - // identify field type - var type = input_def.type; - switch(type) { - // conditional field - case 'conditional': - this._addConditional(input_def); - break; - // repeat block - case 'repeat': - this._addRepeat(input_def); - break; - // customized section - case 'section': - this._addSection(input_def); - break; - // default single element row - default: - this._addRow(input_def); - } - }, - - /** Add a conditional block - */ - _addConditional: function(input_def) { - // link this - var self = this; - - // copy identifier - input_def.test_param.id = input_def.id; - - // build test parameter - var field = this._addRow(input_def.test_param); - - // set onchange event for test parameter - field.options.onchange = function(value) { - // identify the selected case - var selectedCase = self.app.tree.matchCase(input_def, value); - - // check value in order to hide/show options - for (var i in input_def.cases) { - // get case - var case_def = input_def.cases[i]; - - // identify subsection name - var section_id = input_def.id + '-section-' + i; - - // identify row - var section_row = self.table.get(section_id); - - // check if non-hidden elements exist - var nonhidden = false; - for (var j in case_def.inputs) { - if (!case_def.inputs[j].hidden) { - nonhidden = true; - break; - } - } - - // show/hide sub form - if (i == selectedCase && nonhidden) { - section_row.fadeIn('fast'); - } else { - section_row.hide(); - } - } - - // refresh form inputs - self.app.trigger('refresh'); - }; - - // add conditional sub sections - for (var i in input_def.cases) { - // create id tag - var sub_section_id = input_def.id + '-section-' + i; - - // create sub section - var sub_section = new View(this.app, { - inputs : input_def.cases[i].inputs - }); - - // displays as grouped subsection - sub_section.$el.addClass('ui-table-section'); - - // create table row - this.table.add(sub_section.$el); - - // append to table - this.table.append(sub_section_id); - } - - // trigger refresh on conditional input field after all input elements have been created - field.trigger('change'); - }, - - /** Add a repeat block - */ - _addRepeat: function(input_def) { - // link this - var self = this; - - // block index - var block_index = 0; - - // create repeat block element - var repeat = new Repeat.View({ - title : input_def.title, - title_new : input_def.title, - min : input_def.min, - max : input_def.max, - onnew : function() { - // create - create(input_def.inputs); - - // trigger refresh - self.app.trigger('refresh'); - } - }); - - // helper function to create new repeat blocks - function create (inputs) { - // create id tag - var sub_section_id = input_def.id + '-section-' + (block_index++); - - // create sub section - var sub_section = new View(self.app, { - inputs : inputs - }); - - // add tab - repeat.add({ - id : sub_section_id, - $el : sub_section.$el, - ondel : function() { - // delete repeat block - repeat.del(sub_section_id); - - // trigger refresh - self.app.trigger('refresh'); - } - }); - } - - // - // add parsed/minimum number of repeat blocks - // - var n_min = input_def.min; - var n_cache = _.size(input_def.cache); - for (var i = 0; i < Math.max(n_cache, n_min); i++) { - var inputs = null; - if (i < n_cache) { - inputs = input_def.cache[i]; - } else { - inputs = input_def.inputs; - } - - // create repeat block - create(inputs); - } - - // create input field wrapper - var input_element = new InputElement(this.app, { - label : input_def.title, - help : input_def.help, - field : repeat - }); - - // create table row - this.table.add(input_element.$el); - - // append row to table - this.table.append(input_def.id); - }, - - /** Add a customized section - */ - _addSection: function(input_def) { - // link this - var self = this; - - // create sub section - var sub_section = new View(self.app, { - inputs : input_def.inputs - }); - - // delete button - var button_visible = new Ui.ButtonIcon({ - icon : 'fa-eye-slash', - tooltip : 'Show/hide section', - cls : 'ui-button-icon-plain' - }); - - // create portlet for sub section - var portlet = new Portlet.View({ - title : input_def.label, - cls : 'ui-portlet-section', - operations : { - button_visible: button_visible - } - }); - portlet.append(sub_section.$el); - portlet.append($('
').addClass('ui-table-form-info').html(input_def.help)); - - // add event handler visibility button - var visible = false; - portlet.$content.hide(); - portlet.$header.css('cursor', 'pointer'); - portlet.$header.on('click', function() { - if (visible) { - visible = false; - portlet.$content.hide(); - button_visible.setIcon('fa-eye-slash'); - } else { - visible = true; - portlet.$content.fadeIn('fast'); - button_visible.setIcon('fa-eye'); - } - }); - - // show sub section if requested - if (input_def.expand) { - portlet.$header.trigger('click'); - } - - // create table row - this.table.add(portlet.$el); - - // append row to table - this.table.append(input_def.id); - }, - - /** Add a single input field element - */ - _addRow: function(input_def) { - // get id - var id = input_def.id; - - // create input field - var field = this.parameters.create(input_def); - - // add to field list - this.app.field_list[id] = field; - - // create input field wrapper - var input_element = new InputElement(this.app, { - label : input_def.label, - default_value : input_def.default_value, - optional : input_def.optional, - help : input_def.help, - field : field - }); - - // add to element list - this.app.element_list[id] = input_element; - - // create table row - this.table.add(input_element.$el); - - // append to table - this.table.append(id); - - // hide row if neccessary - if (input_def.hidden) { - this.table.get(id).hide(); - } - - // return created field - return field; - } - }); - - return { - View: View - }; -}); diff --git a/static/scripts/mvc/tools/tools-select-content.js b/static/scripts/mvc/tools/tools-select-content.js deleted file mode 100644 index 77120f092c8..00000000000 --- a/static/scripts/mvc/tools/tools-select-content.js +++ /dev/null @@ -1,336 +0,0 @@ -// dependencies -define(['utils/utils', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs', 'mvc/tools/tools-template'], function(Utils, Ui, Tabs, ToolTemplate) { - -var View = Backbone.View.extend({ - // initialize - initialize : function(app, options) { - // link app and options - this.app = app; - this.options = options; - - // link this - var self = this; - - // add element - this.setElement('
'); - - // list of select fields - this.list = {}; - - // radio button options - var radio_buttons = []; - - // identify selector type - if (options.type == 'data_collection') { - this.mode = 'collection'; - } else { - if (options.multiple) { - this.mode = 'multiple'; - } else { - this.mode = 'single'; - } - } - - // set initial state - this.current = this.mode; - this.list = {}; - - // error messages - var extensions = Utils.textify(options.extensions); - var hda_error = 'No dataset available.'; - if (extensions) { - hda_error = 'No ' + extensions + ' dataset available.'; - } - var hdca_error = 'No dataset list available.'; - if (extensions) { - hdca_error = 'No ' + extensions + ' dataset collection available.'; - } - - // add single dataset selector - if (this.mode == 'single') { - radio_buttons.push({ - icon : 'fa-file-o', - value : 'single', - tooltip : 'Single dataset' - }); - this.select_single = new Ui.Select.View({ - optional : options.optional, - error_text : hda_error, - onchange : function() { - self.trigger('change'); - } - }); - this.list['single'] = { - field: this.select_single, - type : 'hda' - }; - } - - // add multiple dataset selector - if (this.mode == 'single' || this.mode == 'multiple') { - radio_buttons.push({ - icon : 'fa-files-o', - value : 'multiple', - tooltip : 'Multiple datasets' - }); - this.select_multiple = new Ui.Select.View({ - multiple : true, - searchable : false, - error_text : hda_error, - onchange : function() { - self.trigger('change'); - } - }); - this.list['multiple'] = { - field: this.select_multiple, - type : 'hda' - }; - } - - // add collection selector - if (this.mode == 'single' || this.mode == 'multiple' || this.mode == 'collection') { - radio_buttons.push({ - icon : 'fa-folder-o', - value : 'collection', - tooltip : 'Dataset collection' - }); - this.select_collection = new Ui.Select.View({ - error_text : hdca_error, - optional : options.optional, - onchange : function() { - self.trigger('change'); - } - }); - this.list['collection'] = { - field: this.select_collection, - type : 'hdca' - }; - } - - // create button - this.button_type = new Ui.RadioButton.View({ - value : this.current, - data : radio_buttons, - onchange: function(value) { - self.current = value; - self.refresh(); - self.trigger('change'); - } - }); - - // add batch mode information - this.$batch = $(ToolTemplate.batchMode()); - - // number of radio buttons - var n_buttons = _.size(this.list); - - // add button to dom - var button_width = 0; - if (n_buttons > 1) { - this.$el.append(this.button_type.$el); - button_width = Math.max(0, _.size(this.list) * 35) + 'px'; - } - - // append field elements - for (var i in this.list) { - this.$el.append(this.list[i].field.$el.css({ - 'margin-left': button_width - })); - } - - // append batch message - this.$el.append(this.$batch.css({ - 'margin-left': button_width - })); - - // update options - this.update(options.data); - - // set initial value - if (this.options.value !== undefined) { - this.value(this.options.value); - } - - // refresh view - this.refresh(); - - // add change event. fires on trigger - this.on('change', function() { - if (options.onchange) { - options.onchange(self.value()); - } - }); - }, - - /** Indicate that select fields are being updated */ - wait: function() { - for (var i in this.list) { - this.list[i].field.wait(); - } - }, - - /** Indicate that the options update has been completed */ - unwait: function() { - for (var i in this.list) { - this.list[i].field.unwait(); - } - }, - - /** Update content selector */ - update: function(options) { - // update a particular select field - var self = this; - function _update(field, options) { - if (field) { - // identify available options - var select_options = []; - for (var i in options) { - var item = options[i]; - select_options.push({ - label: item.hid + ': ' + item.name, - value: item.id - }); - // backup to local history - self.app.history[item.id + '_' + item.src] = item; - } - // update field - field.update(select_options); - } - } - - // update available options - _update(this.select_single, options.hda); - _update(this.select_multiple, options.hda); - _update(this.select_collection, options.hdca); - }, - - /** Return the currently selected dataset values */ - value : function (new_value) { - // update current value - if (new_value !== undefined) { - if (new_value && new_value.values) { - try { - // create list with values - var list = []; - for (var i in new_value.values) { - list.push(new_value.values[i].id); - } - - // identify suitable select field - if (new_value && new_value.values.length > 0 && new_value.values[0].src == 'hdca') { - this.current = 'collection'; - this.select_collection.value(list[0]); - } else { - if (this.mode == 'multiple') { - this.current = 'multiple'; - this.select_multiple.value(list); - } else { - this.current = 'single'; - this.select_single.value(list[0]); - } - } - } catch (err) { - console.debug('tools-select-content::value() - Skipped.'); - } - } else { - for (var i in this.list) { - this.list[i].field.value(null); - } - } - } - - // refresh view - this.refresh(); - - // validate value - var id_list = this._select().value(); - if (id_list === null) { - return null; - } - - // transform into an array - if (!(id_list instanceof Array)) { - id_list = [id_list]; - } - - // check if value exists - if (id_list.length === 0) { - return null; - } - - // prepare result dict - var result = { - batch : this._batch(), - values : [] - } - - // append to dataset ids - for (var i in id_list) { - var details = _.findWhere(this.app.history, { - id : id_list[i], - src : this.list[this.current].type - }); - if (details) { - result.values.push(details); - } else { - return null; - } - } - - // sort by history ids - result.values.sort(function(a, b){ - return a.hid - b.hid; - }); - - // return - return result; - }, - - /** Refreshes data selection view */ - refresh: function() { - this.button_type.value(this.current); - for (var i in this.list) { - var $el = this.list[i].field.$el; - if (this.current == i) { - $el.show(); - } else { - $el.hide(); - } - } - if (this._batch()) { - this.$batch.show(); - } else { - this.$batch.hide(); - } - }, - - /** Assists in selecting the current field */ - _select: function() { - return this.list[this.current].field; - }, - - /** Assists in identifying the batch mode */ - _batch: function() { - if (this.current == 'collection') { - var hdca = _.findWhere(this.app.history, { - id : this._select().value(), - src : 'hdca' - }); - if (hdca && hdca.map_over_type) { - return true; - } - } - if (this.current != 'single') { - if (this.mode == 'single') { - return true; - } - } - return false; - } -}); - -return { - View: View -} - -}); diff --git a/static/scripts/mvc/tools/tools-tree.js b/static/scripts/mvc/tools/tools-tree.js deleted file mode 100644 index fe060ad7bb9..00000000000 --- a/static/scripts/mvc/tools/tools-tree.js +++ /dev/null @@ -1,300 +0,0 @@ -/* - This class maps the tool form dom to an api compatible javascript dictionary. -*/ -// dependencies -define(['utils/utils'], function(Utils) { - -// tool form tree -return Backbone.Model.extend({ - // initialize - initialize: function(app) { - this.app = app; - }, - - /** Convert dictionary representation into tool api specific flat dictionary format. - */ - finalize: function(patch) { - // link this - var self = this; - - // dictionary with api specific identifiers - this.map_dict = {}; - - // check if section is available - if (!this.app.section) { - return {}; - } - - // ensure that dictionary with patching functions exists - patch = patch || {}; - - // dictionary formatted for job submission or tool form update - var result_dict = {}; - - // prepare full dictionary - var dict = {}; - - // fill dictionary from dom - this._iterate(this.app.section.$el, dict); - - // add identifier and value to job definition - function add(job_input_id, input_id, input_value) { - // add entry to result dictionary - result_dict[job_input_id] = input_value; - - // backup id mapping - self.map_dict[job_input_id] = input_id; - }; - - // converter between raw dictionary and job dictionary - function convert(identifier, head) { - for (var index in head) { - var node = head[index]; - if (node.input) { - // get node - var input = node.input; - - // create identifier - var job_input_id = identifier; - if (identifier != '') { - job_input_id += '|'; - } - job_input_id += input.name; - - // process input type - switch (input.type) { - // handle repeats - case 'repeat': - // section identifier - var section_label = 'section-'; - - // collect repeat block identifiers - var block_indices = []; - var block_prefix = null; - for (var block_label in node) { - var pos = block_label.indexOf(section_label); - if (pos != -1) { - pos += section_label.length; - block_indices.push(parseInt(block_label.substr(pos))); - if (!block_prefix) { - block_prefix = block_label.substr(0, pos); - } - } - } - - // sort repeat blocks - block_indices.sort(function(a,b) { return a - b; }); - - // add to response dictionary in created order - var index = 0; - for (var i in block_indices) { - convert(job_input_id + '_' + index++, node[block_prefix + block_indices[i]]); - } - break; - // handle conditionals - case 'conditional': - // get and patch conditional value - var value = self.app.field_list[input.id].value(); - if (patch[input.test_param.type]) { - value = patch[input.test_param.type](value); - } - - // add conditional value - add (job_input_id + '|' + input.test_param.name, input.id, value); - - // identify selected case - var selectedCase = self.matchCase(input, value); - if (selectedCase != -1) { - convert(job_input_id, head[input.id + '-section-' + selectedCase]); - } - break; - // handle custom sub sections - case 'section': - convert('', node); - break; - default: - // get field - var field = self.app.field_list[input.id]; - if (field && field.value) { - // validate field value - var value = field.value(); - - // get and patch field value - if (patch[input.type]) { - value = patch[input.type](value); - } - - // ignore certain values - if (input.ignore === undefined || input.ignore != value) { - // add value to submission - add (job_input_id, input.id, value); - - // add payload to submission - if (input.payload) { - for (var p_id in input.payload) { - add (p_id, input.id, input.payload[p_id]); - } - } - } - } - } - } - } - } - - // start conversion - convert('', dict); - - // return result - return result_dict; - }, - - /** Match job definition identifier to input element identifier - */ - match: function (job_input_id) { - return this.map_dict && this.map_dict[job_input_id]; - }, - - /** Match conditional values to selected cases - */ - matchCase: function(input, value) { - // format value for boolean inputs - if (input.test_param.type == 'boolean') { - if (value == 'true') { - value = input.test_param.truevalue || 'true'; - } else { - value = input.test_param.falsevalue || 'false'; - } - } - - // find selected case - for (var i in input.cases) { - if (input.cases[i].value == value) { - return i; - } - } - - // selected case not found - return -1; - }, - - /** Matches identifier from api model to input elements - */ - matchModel: function(model, callback) { - // final result dictionary - var result = {}; - - // link this - var self = this; - - // search throughout response - function search (id, head) { - for (var i in head) { - var node = head[i]; - var index = node.name; - if (id != '') { - index = id + '|' + index; - } - switch (node.type) { - case 'repeat': - for (var j in node.cache) { - search (index + '_' + j, node.cache[j]); - } - break; - case 'conditional': - var value = node.test_param && node.test_param.value; - var selectedCase = self.matchCase(node, value); - if (selectedCase != -1) { - search (index, node.cases[selectedCase].inputs); - } - break; - default: - var input_id = self.map_dict[index]; - if (input_id) { - callback(input_id, node); - } - } - } - } - - // match all ids and return messages - search('', model.inputs); - - // return matched results - return result; - }, - - /** Matches identifier from api response to input elements - */ - matchResponse: function(response) { - // final result dictionary - var result = {}; - - // link this - var self = this; - - // search throughout response - function search (id, head) { - if (typeof head === 'string') { - var input_id = self.map_dict[id]; - if (input_id) { - result[input_id] = head; - } - } else { - for (var i in head) { - var new_id = i; - if (id !== '') { - var separator = '|'; - if (head instanceof Array) { - separator = '_'; - } - new_id = id + separator + new_id; - } - search (new_id, head[i]); - } - } - } - - // match all ids and return messages - search('', response); - - // return matched results - return result; - }, - - /** Iterate through the tool form dom and map it to the dictionary. - */ - _iterate: function(parent, dict) { - // get child nodes - var self = this; - var children = $(parent).children(); - children.each(function() { - // get child element - var child = this; - - // get id - var id = $(child).attr('id'); - - // create new branch - if ($(child).hasClass('section-row')) { - // create sub dictionary - dict[id] = {}; - - // add input element if it exists - var input = self.app.input_list[id]; - if (input) { - dict[id] = { - input : input - } - } - - // fill sub dictionary - self._iterate(child, dict[id]); - } else { - self._iterate(child, dict); - } - }); - } -}); - -}); \ No newline at end of file diff --git a/static/scripts/packed/mvc/tools/tools-input.js b/static/scripts/packed/mvc/tools/tools-input.js deleted file mode 100644 index 0c4bb1fdce3..00000000000 --- a/static/scripts/packed/mvc/tools/tools-input.js +++ /dev/null @@ -1 +0,0 @@ -define([],function(){return Backbone.View.extend({initialize:function(d,c){this.app=d;this.text_enable=d.options.text_enable||"Enable";this.text_disable=d.options.text_disable||"Disable";this.cls_enable=d.options.cls_enable||"fa fa-plus-square";this.cls_disable=d.options.cls_disable||"fa fa-minus-square";this.field=c.field;this.default_value=c.default_value;this.setElement(this._template(c));this.$field=this.$el.find(".ui-table-form-field");this.$optional=this.$el.find(".ui-table-form-optional");this.$optional_icon=this.$el.find(".ui-table-form-optional").find(".icon");this.$error_text=this.$el.find(".ui-table-form-error-text");this.$error=this.$el.find(".ui-table-form-error");this.$field.prepend(this.field.$el);this.field.skip=false;var b=this.field.value&&this.field.value();this.field.skip=Boolean(c.optional&&(b===null||b===""||b===this.default_value||String(b)===String(this.default_value)||Number(b)===Number(this.default_value)||JSON.stringify(b)===JSON.stringify(this.default_value)));this._refresh();var a=this;this.$optional.on("click",function(){a.field.skip=!a.field.skip;a._refresh();a.app.trigger("refresh")})},error:function(a){this.$error_text.html(a);this.$error.show();this.$el.addClass("ui-error")},reset:function(){this.$error.hide();this.$el.removeClass("ui-error")},_refresh:function(){this.$optional_icon.removeClass().addClass("icon");if(!this.field.skip){this.$field.fadeIn("fast");this._tooltip(this.text_disable,this.cls_disable)}else{this.$field.hide();this._tooltip(this.text_enable,this.cls_enable);this.field.value&&this.field.value(this.default_value)}},_tooltip:function(b,a){if(this.$optional.length){this.$optional_icon.addClass(a).tooltip({placement:"bottom"}).attr("data-original-title",b).tooltip("fixTitle").tooltip("hide")}},_template:function(a){var b='
';if(a.optional){b+='
'+a.label+"
"}else{b+=a.label}b+='
';b+='
';if(a.help){b+=a.help}b+="
";b+="
";return b}})}); \ No newline at end of file diff --git a/static/scripts/packed/mvc/tools/tools-parameters.js b/static/scripts/packed/mvc/tools/tools-parameters.js deleted file mode 100644 index 727faefed37..00000000000 --- a/static/scripts/packed/mvc/tools/tools-parameters.js +++ /dev/null @@ -1 +0,0 @@ -define(["utils/utils","mvc/ui/ui-misc","mvc/tools/tools-select-content","mvc/ui/ui-color-picker"],function(c,d,a,b){return Backbone.Model.extend({types:{text:"_fieldText",select:"_fieldSelect",data_column:"_fieldSelect",genomebuild:"_fieldSelect",data:"_fieldData",data_collection:"_fieldData",integer:"_fieldSlider","float":"_fieldSlider","boolean":"_fieldBoolean",drill_down:"_fieldDrilldown",color:"_fieldColor",hidden:"_fieldHidden",hidden_data:"_fieldHidden",baseurl:"_fieldHidden",},initialize:function(f,e){this.app=f},create:function(e){if(e.value===undefined){e.value=null}if(e.default_value===undefined){e.default_value=e.value}var g=null;var f=this.types[e.type];if(f&&typeof(this[f])==="function"){g=this[f].call(this,e)}if(!g){this.app.incompatible=true;if(e.options){g=this._fieldSelect(e)}else{g=this._fieldText(e)}console.debug("tools-form::_addRow() : Auto matched field type ("+e.type+").")}if(e.value!==undefined){g.value(e.value)}return g},_fieldData:function(e){if(!this.app.options.is_dynamic){e.info="Data input '"+e.name+"' ("+c.textify(e.extensions.toString())+")";e.value=null;return this._fieldHidden(e)}var f=this;return new a.View(this.app,{id:"field-"+e.id,extensions:e.extensions,optional:e.optional,multiple:e.multiple,type:e.type,data:e.options,onchange:function(){f.app.trigger("refresh")}})},_fieldSelect:function(e){if(!this.app.options.is_dynamic&&e.is_dynamic){return this._fieldText(e)}if(e.type=="data_column"){e.error_text="Missing columns in referenced dataset."}if(e.type=="genomebuild"){e.searchable=true}var g=[];for(var h in e.options){var j=e.options[h];g.push({label:j[0],value:j[1]})}var k=d.Select;switch(e.display){case"checkboxes":k=d.Checkbox;break;case"radio":k=d.Radio;break}var f=this;return new k.View({id:"field-"+e.id,data:g,error_text:e.error_text||"No options available",multiple:e.multiple,searchable:e.searchable,onchange:function(){f.app.trigger("refresh")}})},_fieldDrilldown:function(e){if(!this.app.options.is_dynamic&&e.is_dynamic){return this._fieldText(e)}var f=this;return new d.Drilldown.View({id:"field-"+e.id,data:e.options,display:e.display,onchange:function(){f.app.trigger("refresh")}})},_fieldText:function(e){if(e.options){e.area=e.multiple;if(!c.validate(e.value)){e.value=""}else{if(e.value instanceof Array){e.value=value.toString()}else{e.value=String(e.value).replace(/[\[\]'"\s]/g,"");if(e.multiple){e.value=e.value.replace(/,/g,"\n")}}}}var f=this;return new d.Input({id:"field-"+e.id,area:e.area,onchange:function(){f.app.trigger("refresh")}})},_fieldSlider:function(e){var f=this;return new d.Slider.View({id:"field-"+e.id,precise:e.type=="float",min:e.min,max:e.max,onchange:function(){f.app.trigger("refresh")}})},_fieldHidden:function(e){return new d.Hidden({id:"field-"+e.id,info:e.info})},_fieldBoolean:function(e){var f=this;return new d.RadioButton.View({id:"field-"+e.id,data:[{label:"Yes",value:"true"},{label:"No",value:"false"}],onchange:function(){f.app.trigger("refresh")}})},_fieldColor:function(e){var f=this;return new b({id:"field-"+e.id,onchange:function(){f.app.trigger("refresh")}})}});return{View:View}}); \ No newline at end of file diff --git a/static/scripts/packed/mvc/tools/tools-repeat.js b/static/scripts/packed/mvc/tools/tools-repeat.js deleted file mode 100644 index 47b5d8c6f19..00000000000 --- a/static/scripts/packed/mvc/tools/tools-repeat.js +++ /dev/null @@ -1 +0,0 @@ -define(["utils/utils","mvc/ui/ui-table","mvc/ui/ui-portlet","mvc/ui/ui-misc"],function(c,a,b,e){var d=Backbone.View.extend({optionsDefault:{title:"Section",max:null,min:null},initialize:function(g){this.options=c.merge(g,this.optionsDefault);this.setElement("
");var f=this;this.button_new=new e.ButtonIcon({icon:"fa-plus",title:"Insert "+g.title_new,tooltip:"Add new "+g.title_new+" block",floating:"clear",onclick:function(){if(g.onnew){g.onnew()}}});this.table=new a.View({cls:"ui-table-plain",content:""});this.$el.append(this.table.$el);this.$el.append($("
").append(this.button_new.$el));this.list={};this.n=0},size:function(){return this.n},add:function(g){if(!g.id||this.list[g.id]){console.debug("tools-repeat::add - Duplicate repeat block id.");return}this.n++;var f=new e.ButtonIcon({icon:"fa-trash-o",tooltip:"Delete this repeat block",cls:"ui-button-icon-plain",onclick:function(){if(g.ondel){g.ondel()}}});var h=new b.View({id:g.id,title:"placeholder",cls:"ui-portlet-repeat",operations:{button_delete:f}});h.append(g.$el);h.$el.addClass("section-row");this.list[g.id]=h;this.table.add(h.$el);this.table.append("row_"+g.id,true);if(this.options.max>0&&this.n>=this.options.max){this.button_new.disable()}this._refresh()},del:function(g){if(!this.list[g]){console.debug("tools-repeat::del - Invalid repeat block id.");return}this.n--;var f=this.table.get("row_"+g);f.remove();delete this.list[g];this.button_new.enable();this._refresh()},_refresh:function(){var f=0;for(var h in this.list){var g=this.list[h];g.title(++f+": "+this.options.title);if(this.n>this.options.min){g.showOperation("button_delete")}else{g.hideOperation("button_delete")}}}});return{View:d}}); \ No newline at end of file diff --git a/static/scripts/packed/mvc/tools/tools-section.js b/static/scripts/packed/mvc/tools/tools-section.js deleted file mode 100644 index d1ded2499e8..00000000000 --- a/static/scripts/packed/mvc/tools/tools-section.js +++ /dev/null @@ -1 +0,0 @@ -define(["utils/utils","mvc/ui/ui-table","mvc/ui/ui-misc","mvc/ui/ui-portlet","mvc/tools/tools-repeat","mvc/tools/tools-input","mvc/tools/tools-parameters"],function(e,a,h,d,c,f,b){var g=Backbone.View.extend({initialize:function(j,i){this.app=j;this.inputs=i.inputs;i.cls="ui-table-plain";i.cls_tr="section-row";this.table=new a.View(i);this.parameters=new b(j,i);this.setElement(this.table.$el);this.render()},render:function(){this.table.delAll();for(var j in this.inputs){this.add(this.inputs[j])}},add:function(k){var j=this;var i=jQuery.extend(true,{},k);i.id=k.id=e.uuid();this.app.input_list[i.id]=i;var l=i.type;switch(l){case"conditional":this._addConditional(i);break;case"repeat":this._addRepeat(i);break;case"section":this._addSection(i);break;default:this._addRow(i)}},_addConditional:function(j){var k=this;j.test_param.id=j.id;var n=this._addRow(j.test_param);n.options.onchange=function(w){var v=k.app.tree.matchCase(j,w);for(var u in j.cases){var q=j.cases[u];var t=j.id+"-section-"+u;var p=k.table.get(t);var s=false;for(var r in q.inputs){if(!q.inputs[r].hidden){s=true;break}}if(u==v&&s){p.fadeIn("fast")}else{p.hide()}}k.app.trigger("refresh")};for(var m in j.cases){var l=j.id+"-section-"+m;var o=new g(this.app,{inputs:j.cases[m].inputs});o.$el.addClass("ui-table-section");this.table.add(o.$el);this.table.append(l)}n.trigger("change")},_addRepeat:function(p){var s=this;var q=0;var l=new c.View({title:p.title,title_new:p.title,min:p.min,max:p.max,onnew:function(){n(p.inputs);s.app.trigger("refresh")}});function n(i){var t=p.id+"-section-"+(q++);var u=new g(s.app,{inputs:i});l.add({id:t,$el:u.$el,ondel:function(){l.del(t);s.app.trigger("refresh")}})}var j=p.min;var r=_.size(p.cache);for(var m=0;m").addClass("ui-table-form-info").html(i.help));var k=false;l.$content.hide();l.$header.css("cursor","pointer");l.$header.on("click",function(){if(k){k=false;l.$content.hide();m.setIcon("fa-eye-slash")}else{k=true;l.$content.fadeIn("fast");m.setIcon("fa-eye")}});if(i.expand){l.$header.trigger("click")}this.table.add(l.$el);this.table.append(i.id)},_addRow:function(i){var l=i.id;var j=this.parameters.create(i);this.app.field_list[l]=j;var k=new f(this.app,{label:i.label,default_value:i.default_value,optional:i.optional,help:i.help,field:j});this.app.element_list[l]=k;this.table.add(k.$el);this.table.append(l);if(i.hidden){this.table.get(l).hide()}return j}});return{View:g}}); \ No newline at end of file diff --git a/static/scripts/packed/mvc/tools/tools-select-content.js b/static/scripts/packed/mvc/tools/tools-select-content.js deleted file mode 100644 index a50fbfd7493..00000000000 --- a/static/scripts/packed/mvc/tools/tools-select-content.js +++ /dev/null @@ -1 +0,0 @@ -define(["utils/utils","mvc/ui/ui-misc","mvc/ui/ui-tabs","mvc/tools/tools-template"],function(c,e,b,a){var d=Backbone.View.extend({initialize:function(g,p){this.app=g;this.options=p;var o=this;this.setElement('
');this.list={};var m=[];if(p.type=="data_collection"){this.mode="collection"}else{if(p.multiple){this.mode="multiple"}else{this.mode="single"}}this.current=this.mode;this.list={};var k=c.textify(p.extensions);var j="No dataset available.";if(k){j="No "+k+" dataset available."}var l="No dataset list available.";if(k){l="No "+k+" dataset collection available."}if(this.mode=="single"){m.push({icon:"fa-file-o",value:"single",tooltip:"Single dataset"});this.select_single=new e.Select.View({optional:p.optional,error_text:j,onchange:function(){o.trigger("change")}});this.list.single={field:this.select_single,type:"hda"}}if(this.mode=="single"||this.mode=="multiple"){m.push({icon:"fa-files-o",value:"multiple",tooltip:"Multiple datasets"});this.select_multiple=new e.Select.View({multiple:true,searchable:false,error_text:j,onchange:function(){o.trigger("change")}});this.list.multiple={field:this.select_multiple,type:"hda"}}if(this.mode=="single"||this.mode=="multiple"||this.mode=="collection"){m.push({icon:"fa-folder-o",value:"collection",tooltip:"Dataset collection"});this.select_collection=new e.Select.View({error_text:l,optional:p.optional,onchange:function(){o.trigger("change")}});this.list.collection={field:this.select_collection,type:"hdca"}}this.button_type=new e.RadioButton.View({value:this.current,data:m,onchange:function(i){o.current=i;o.refresh();o.trigger("change")}});this.$batch=$(a.batchMode());var f=_.size(this.list);var n=0;if(f>1){this.$el.append(this.button_type.$el);n=Math.max(0,_.size(this.list)*35)+"px"}for(var h in this.list){this.$el.append(this.list[h].field.$el.css({"margin-left":n}))}this.$el.append(this.$batch.css({"margin-left":n}));this.update(p.data);if(this.options.value!==undefined){this.value(this.options.value)}this.refresh();this.on("change",function(){if(p.onchange){p.onchange(o.value())}})},wait:function(){for(var f in this.list){this.list[f].field.wait()}},unwait:function(){for(var f in this.list){this.list[f].field.unwait()}},update:function(h){var f=this;function g(m,j){if(m){var n=[];for(var k in j){var l=j[k];n.push({label:l.hid+": "+l.name,value:l.id});f.app.history[l.id+"_"+l.src]=l}m.update(n)}}g(this.select_single,h.hda);g(this.select_multiple,h.hda);g(this.select_collection,h.hdca)},value:function(j){if(j!==undefined){if(j&&j.values){try{var m=[];for(var h in j.values){m.push(j.values[h].id)}if(j&&j.values.length>0&&j.values[0].src=="hdca"){this.current="collection";this.select_collection.value(m[0])}else{if(this.mode=="multiple"){this.current="multiple";this.select_multiple.value(m)}else{this.current="single";this.select_single.value(m[0])}}}catch(l){console.debug("tools-select-content::value() - Skipped.")}}else{for(var h in this.list){this.list[h].field.value(null)}}}this.refresh();var k=this._select().value();if(k===null){return null}if(!(k instanceof Array)){k=[k]}if(k.length===0){return null}var f={batch:this._batch(),values:[]};for(var h in k){var g=_.findWhere(this.app.history,{id:k[h],src:this.list[this.current].type});if(g){f.values.push(g)}else{return null}}f.values.sort(function(n,i){return n.hid-i.hid});return f},refresh:function(){this.button_type.value(this.current);for(var g in this.list){var f=this.list[g].field.$el;if(this.current==g){f.show()}else{f.hide()}}if(this._batch()){this.$batch.show()}else{this.$batch.hide()}},_select:function(){return this.list[this.current].field},_batch:function(){if(this.current=="collection"){var f=_.findWhere(this.app.history,{id:this._select().value(),src:"hdca"});if(f&&f.map_over_type){return true}}if(this.current!="single"){if(this.mode=="single"){return true}}return false}});return{View:d}}); \ No newline at end of file diff --git a/static/scripts/packed/mvc/tools/tools-tree.js b/static/scripts/packed/mvc/tools/tools-tree.js deleted file mode 100644 index d820cd44581..00000000000 --- a/static/scripts/packed/mvc/tools/tools-tree.js +++ /dev/null @@ -1 +0,0 @@ -define(["utils/utils"],function(a){return Backbone.Model.extend({initialize:function(b){this.app=b},finalize:function(g){var b=this;this.map_dict={};if(!this.app.section){return{}}g=g||{};var f={};var e={};this._iterate(this.app.section.$el,e);function d(j,i,h){f[j]=h;b.map_dict[j]=i}function c(p,s){for(var n in s){var k=s[n];if(k.input){var u=k.input;var o=p;if(p!=""){o+="|"}o+=u.name;switch(u.type){case"repeat":var j="section-";var x=[];var r=null;for(var w in k){var q=w.indexOf(j);if(q!=-1){q+=j.length;x.push(parseInt(w.substr(q)));if(!r){r=w.substr(0,q)}}}x.sort(function(y,i){return y-i});var n=0;for(var l in x){c(o+"_"+n++,k[r+x[l]])}break;case"conditional":var v=b.app.field_list[u.id].value();if(g[u.test_param.type]){v=g[u.test_param.type](v)}d(o+"|"+u.test_param.name,u.id,v);var h=b.matchCase(u,v);if(h!=-1){c(o,s[u.id+"-section-"+h])}break;case"section":c("",k);break;default:var t=b.app.field_list[u.id];if(t&&t.value){var v=t.value();if(g[u.type]){v=g[u.type](v)}if(u.ignore===undefined||u.ignore!=v){d(o,u.id,v);if(u.payload){for(var m in u.payload){d(m,u.id,u.payload[m])}}}}}}}}c("",e);return f},match:function(b){return this.map_dict&&this.map_dict[b]},matchCase:function(b,d){if(b.test_param.type=="boolean"){if(d=="true"){d=b.test_param.truevalue||"true"}else{d=b.test_param.falsevalue||"false"}}for(var c in b.cases){if(b.cases[c].value==d){return c}}return -1},matchModel:function(d,f){var b={};var c=this;function e(g,p){for(var m in p){var k=p[m];var n=k.name;if(g!=""){n=g+"|"+n}switch(k.type){case"repeat":for(var l in k.cache){e(n+"_"+l,k.cache[l])}break;case"conditional":var q=k.test_param&&k.test_param.value;var h=c.matchCase(k,q);if(h!=-1){e(n,k.cases[h].inputs)}break;default:var o=c.map_dict[n];if(o){f(o,k)}}}}e("",d.inputs);return b},matchResponse:function(d){var b={};var c=this;function e(l,j){if(typeof j==="string"){var g=c.map_dict[l];if(g){b[g]=j}}else{for(var h in j){var f=h;if(l!==""){var k="|";if(j instanceof Array){k="_"}f=l+k+f}e(f,j[h])}}}e("",d);return b},_iterate:function(d,e){var b=this;var c=$(d).children();c.each(function(){var h=this;var g=$(h).attr("id");if($(h).hasClass("section-row")){e[g]={};var f=b.app.input_list[g];if(f){e[g]={input:f}}b._iterate(h,e[g])}else{b._iterate(h,e)}})}})}); \ No newline at end of file