mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
490 lines
17 KiB
JavaScript
490 lines
17 KiB
JavaScript
define(['utils/utils', 'mvc/ui/ui-table', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'],
|
|
function(Utils, Table, Ui, Tabs) {
|
|
|
|
// create form view
|
|
var View = Backbone.View.extend({
|
|
// initialize
|
|
initialize: function(app, options) {
|
|
// link app
|
|
this.app = app;
|
|
|
|
// link inputs
|
|
this.inputs = options.inputs;
|
|
|
|
// link datasets
|
|
this.datasets = app.datasets;
|
|
|
|
// link data model
|
|
this.data = app.data;
|
|
|
|
// add table class for tr tag
|
|
// this assist in transforming the form into a json structure
|
|
options.cls_tr = 'form-row';
|
|
|
|
// create table
|
|
this.table = new Table.View(options);
|
|
|
|
// configure portlet and form table
|
|
this.setElement(this.table.$el);
|
|
|
|
// render tool section
|
|
this.render();
|
|
},
|
|
|
|
// update
|
|
render: function() {
|
|
// reset table
|
|
this.table.delAll();
|
|
|
|
// load settings elements into table
|
|
for (var i in this.inputs) {
|
|
this._add(this.inputs[i], this.data);
|
|
}
|
|
},
|
|
|
|
// add table row
|
|
_add: function(input, data) {
|
|
// link this
|
|
var self = this;
|
|
|
|
// clone definition
|
|
var input_def = jQuery.extend(true, {}, input);
|
|
|
|
// create unique id
|
|
input_def.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, data);
|
|
break;
|
|
// repeat block
|
|
case 'repeat':
|
|
this._addRepeat(input_def);
|
|
break;
|
|
// default single element row
|
|
default:
|
|
this._addRow(type, input_def, data);
|
|
}
|
|
},
|
|
|
|
// add conditional block
|
|
_addConditional: function(input_def, data) {
|
|
// add label to input definition root
|
|
input_def.label = input_def.test_param.label;
|
|
|
|
// add value to input definition root
|
|
input_def.value = input_def.test_param.value;
|
|
|
|
// build options field
|
|
this._addRow('conditional', input_def, data);
|
|
|
|
// add fields
|
|
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,
|
|
cls : 'ui-table-plain'
|
|
});
|
|
|
|
// append sub section
|
|
this.table.add('');
|
|
this.table.add(sub_section.$el);
|
|
this.table.append(sub_section_id);
|
|
}
|
|
},
|
|
|
|
// add repeat block
|
|
_addRepeat: function(input_def) {
|
|
// link this
|
|
var self = this;
|
|
|
|
//
|
|
// create tab field
|
|
//
|
|
var tabs = new Tabs.View({
|
|
title_new : 'Add ' + input_def.title,
|
|
max : input_def.max,
|
|
onnew : function() {
|
|
// create id tag
|
|
var sub_section_id = input_def.id + '-section-' + Utils.uuid();
|
|
|
|
// create sub section
|
|
var sub_section = new View(self.app, {
|
|
inputs : input_def.inputs,
|
|
cls : 'ui-table-plain'
|
|
});
|
|
|
|
// add new tab
|
|
tabs.add({
|
|
id : sub_section_id,
|
|
title : input_def.title,
|
|
$el : sub_section.$el,
|
|
ondel : function() {
|
|
// delete tab
|
|
tabs.del(sub_section_id);
|
|
|
|
// retitle tabs
|
|
tabs.retitle(input_def.title);
|
|
|
|
// trigger refresh
|
|
self.app.refresh();
|
|
}
|
|
});
|
|
|
|
// retitle tabs
|
|
tabs.retitle(input_def.title);
|
|
|
|
// show tab
|
|
tabs.show(sub_section_id);
|
|
|
|
// trigger refresh
|
|
self.app.refresh();
|
|
}
|
|
});
|
|
|
|
//
|
|
// add min number of tabs
|
|
//
|
|
for (var i = 0; i < input_def.min; i++) {
|
|
// create id tag
|
|
var sub_section_id = input_def.id + '-section-' + Utils.uuid();
|
|
|
|
// create sub section
|
|
var sub_section = new View(self.app, {
|
|
inputs : input_def.inputs,
|
|
cls : 'ui-table-plain'
|
|
});
|
|
|
|
// add tab
|
|
tabs.add({
|
|
id : sub_section_id,
|
|
title : input_def.title,
|
|
$el : sub_section.$el
|
|
});
|
|
}
|
|
|
|
// retitle tabs
|
|
tabs.retitle(input_def.title);
|
|
|
|
// append sub section
|
|
this.table.add('');
|
|
this.table.add(tabs.$el);
|
|
this.table.append(input_def.id);
|
|
},
|
|
|
|
// add table row
|
|
_addRow: function(field_type, input_def, data) {
|
|
// get id
|
|
var id = input_def.id;
|
|
|
|
// field wrapper
|
|
var field = null;
|
|
|
|
// identify field type
|
|
switch(field_type) {
|
|
// text input field
|
|
case 'text' :
|
|
field = this._field_text(input_def, data);
|
|
break;
|
|
|
|
// select field
|
|
case 'select' :
|
|
field = this._field_select(input_def, data);
|
|
break;
|
|
|
|
// radiobox field
|
|
case 'radiobutton' :
|
|
field = this._field_radio(input_def, data);
|
|
break;
|
|
|
|
// dataset
|
|
case 'data':
|
|
field = this._field_data(input_def, data);
|
|
break;
|
|
|
|
// dataset column
|
|
case 'data_column':
|
|
field = this._field_column(input_def, data);
|
|
break;
|
|
|
|
// text area field
|
|
case 'textarea' :
|
|
field = this._field_textarea(input_def, data);
|
|
break;
|
|
|
|
// conditional select field
|
|
case 'conditional':
|
|
field = this._field_conditional(input_def, data);
|
|
break;
|
|
|
|
// hidden field
|
|
case 'hidden':
|
|
field = this._field_hidden(input_def, data);
|
|
break;
|
|
}
|
|
|
|
// check if field type was detected
|
|
if (!field) {
|
|
console.debug('tools-form::_addRow() : Unmatched field type (' + field_type + ').');
|
|
return;
|
|
}
|
|
|
|
// set value
|
|
if (!data.get(id)) {
|
|
data.set(id, input_def.value);
|
|
}
|
|
field.value(data.get(id));
|
|
|
|
// add to field list
|
|
this.app.field_list[id] = field;
|
|
|
|
// combine field and info
|
|
var $input = $('<div/>');
|
|
$input.append(field.$el);
|
|
if (input_def.help) {
|
|
$input.append('<div class="ui-table-form-info">' + input_def.help + '</div>');
|
|
}
|
|
|
|
// create table row
|
|
this.table.add('<span class="ui-table-form-title">' + input_def.label + '</span>', '20%');
|
|
this.table.add($input);
|
|
|
|
// append to table
|
|
this.table.append(id);
|
|
},
|
|
|
|
// conditional input field
|
|
_field_conditional : function(input_def, data) {
|
|
// link this
|
|
var self = this;
|
|
|
|
// configure options fields
|
|
var options = [];
|
|
for (var i in input_def.test_param.options) {
|
|
var option = input_def.test_param.options[i];
|
|
options.push({
|
|
label: option[0],
|
|
value: option[1]
|
|
});
|
|
}
|
|
|
|
// select field
|
|
var id = input_def.id;
|
|
return new Ui.Select.View({
|
|
id : 'field-' + id,
|
|
data : options,
|
|
value : data.get(id),
|
|
onchange : function(value) {
|
|
// update value
|
|
data.set(id, 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) {
|
|
var type = case_def.inputs[j].type;
|
|
if (type && type !== 'hidden') {
|
|
nonhidden = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// show/hide sub form
|
|
if (case_def.value == value && nonhidden) {
|
|
section_row.fadeIn('fast');
|
|
} else {
|
|
section_row.hide();
|
|
}
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
// data input field
|
|
_field_data : function(input_def, data) {
|
|
// link this
|
|
var self = this;
|
|
|
|
// get element id
|
|
var id = input_def.id;
|
|
|
|
// get datasets
|
|
var datasets = this.datasets.filterType();
|
|
|
|
// configure options fields
|
|
var options = [];
|
|
for (var i in datasets) {
|
|
options.push({
|
|
label: datasets[i].get('name'),
|
|
value: datasets[i].get('id')
|
|
});
|
|
}
|
|
|
|
// select field
|
|
return new Ui.Select.View({
|
|
id : 'field-' + id,
|
|
data : options,
|
|
value : options[0].value,
|
|
onchange : function(value) {
|
|
// update value
|
|
data.set(id, value);
|
|
|
|
// get referenced columns
|
|
var column_list = self.app.tree.findReferences(id);
|
|
|
|
// find selected dataset
|
|
var dataset = self.datasets.filter(value);
|
|
|
|
// check dataset
|
|
if (dataset && column_list.length > 0) {
|
|
// log selection
|
|
console.debug('tool-form::field_data() - Selected dataset ' + value + '.');
|
|
|
|
// get meta data
|
|
var meta = dataset.get('metadata_column_types');
|
|
|
|
// check meta data
|
|
if (!meta) {
|
|
console.debug('tool-form::field_data() - FAILED: Could not find metadata for dataset ' + value + '.');
|
|
}
|
|
|
|
// load column options
|
|
var columns = [];
|
|
for (var key in meta) {
|
|
// add to selection
|
|
columns.push({
|
|
'label' : 'Column: ' + (parseInt(key) + 1) + ' [' + meta[key] + ']',
|
|
'value' : key
|
|
});
|
|
}
|
|
|
|
// update referenced columns
|
|
for (var i in column_list) {
|
|
var column_field = self.app.field_list[column_list[i]]
|
|
if (column_field) {
|
|
column_field.update(columns);
|
|
if (!column_field.exists(column_field.value())) {
|
|
column_field.value(column_field.first());
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
// log failure
|
|
console.debug('tool-form::field_data() - FAILED: Could not find dataset ' + value + '.');
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
// column selection field
|
|
_field_column : function (input_def, data) {
|
|
var id = input_def.id;
|
|
return new Ui.Select.View({
|
|
id : 'field-' + id,
|
|
value : data.get(id),
|
|
onchange : function(value) {
|
|
data.set(id, value);
|
|
}
|
|
});
|
|
},
|
|
|
|
// select field
|
|
_field_select : function (input_def, data) {
|
|
// 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;
|
|
if (input_def.display == 'checkboxes') {
|
|
SelectClass = Ui.Checkbox;
|
|
}
|
|
|
|
// select field
|
|
var id = input_def.id;
|
|
return new SelectClass.View({
|
|
id : 'field-' + id,
|
|
data : options,
|
|
value : data.get(id),
|
|
onchange : function(value) {
|
|
data.set(id, value);
|
|
}
|
|
});
|
|
},
|
|
|
|
// text input field
|
|
_field_text : function(input_def, data) {
|
|
var id = input_def.id;
|
|
return new Ui.Input({
|
|
id : 'field-' + id,
|
|
value : data.get(id),
|
|
onchange : function(value) {
|
|
data.set(id, value);
|
|
}
|
|
});
|
|
},
|
|
|
|
// text area
|
|
_field_textarea : function(input_def, data) {
|
|
var id = input_def.id;
|
|
return new Ui.Textarea({
|
|
id : 'field-' + id,
|
|
onchange : function() {
|
|
data.set(id, field.value());
|
|
}
|
|
});
|
|
},
|
|
|
|
// radio field
|
|
_field_radio : function(input_def, data) {
|
|
var id = input_def.id;
|
|
return new Ui.RadioButton({
|
|
id : 'field-' + id,
|
|
data : input_def.data,
|
|
value : data.get(id),
|
|
onchange : function(value) {
|
|
data.set(id, value);
|
|
}
|
|
});
|
|
},
|
|
|
|
// hidden field
|
|
_field_hidden : function(input_def, data) {
|
|
var id = input_def.id;
|
|
return new Ui.Hidden({
|
|
id : 'field-' + id,
|
|
value : data.get(id)
|
|
});
|
|
}
|
|
});
|
|
|
|
return {
|
|
View: View
|
|
};
|
|
});
|