Merge with -central tip.

This commit is contained in:
Dave Bouvier
2014-08-28 14:44:29 -04:00
12 changed files with 376 additions and 132 deletions
+32 -9
View File
@@ -1,8 +1,8 @@
define(['mvc/ui/ui-portlet', 'mvc/ui/ui-misc',
'mvc/citation/citation-model', 'mvc/citation/citation-view',
'mvc/tools', 'mvc/tools/tools-template', 'mvc/tools/tools-datasets', 'mvc/tools/tools-section'],
'mvc/tools', 'mvc/tools/tools-template', 'mvc/tools/tools-datasets', 'mvc/tools/tools-section', 'mvc/tools/tools-tree'],
function(Portlet, Ui, CitationModel, CitationView,
Tools, ToolTemplate, ToolDatasets, ToolSection) {
Tools, ToolTemplate, ToolDatasets, ToolSection, ToolTree) {
// create tool model
var Model = Backbone.Model.extend({
@@ -29,6 +29,18 @@ define(['mvc/ui/ui-portlet', 'mvc/ui/ui-misc',
id : options.id
});
// creates a tree/json structure from the input form
this.tree = new ToolTree(this);
// reset field list
this.field_list = {};
// reset sequential input definition list
this.inputs_sequential = {};
// create data model
this.data = new Backbone.Model();
// initialize datasets
this.datasets = new ToolDatasets({
success: function() {
@@ -39,13 +51,6 @@ define(['mvc/ui/ui-portlet', 'mvc/ui/ui-misc',
// initialize tool form
_initializeToolForm: function() {
// reset field list
this.field_list = {};
// reset sequential input definition list
this.inputs_sequential = {};
// fetch model and render form
var self = this;
this.model.fetch({
@@ -67,6 +72,7 @@ define(['mvc/ui/ui-portlet', 'mvc/ui/ui-misc',
title : 'Execute',
floating : 'clear',
onclick : function() {
console.log(self.tree.create(self));
}
})
}
@@ -107,8 +113,25 @@ define(['mvc/ui/ui-portlet', 'mvc/ui/ui-misc',
// append tool section
self.portlet.append(self.section.$el);
// trigger refresh
self.refresh();
}
});
},
// refresh
refresh: function() {
// recreate tree structure
this.tree.refresh();
// trigger change
for (var id in this.field_list) {
this.field_list[id].trigger('change');
}
// log
console.debug('tools-form::refresh() - Recreated tree structure. Refresh.');
}
});
+144 -106
View File
@@ -1,4 +1,5 @@
define(['mvc/ui/ui-table', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Table, Ui, Tabs) {
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({
@@ -13,6 +14,13 @@ define(['mvc/ui/ui-table', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Table,
// 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);
@@ -28,98 +36,115 @@ define(['mvc/ui/ui-table', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Table,
// reset table
this.table.delAll();
// model
var data = new Backbone.Model();
// load settings elements into table
for (var id in this.inputs) {
this._add(this.inputs[id], data);
}
// trigger change
for (var id in this.app.field_list) {
this.app.field_list[id].trigger('change');
for (var i in this.inputs) {
this._add(this.inputs[i], this.data);
}
},
// add table row
_add: function(inputs_def, data) {
_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.inputs_sequential[input_def.id] = input_def;
// identify field type
var type = inputs_def.type;
var type = input_def.type;
switch(type) {
// conditional field
case 'conditional':
// add label to input definition root
inputs_def.label = inputs_def.test_param.label;
input_def.label = input_def.test_param.label;
// add id to input definition root
inputs_def.name = inputs_def.test_param.name;
// add value to input definition root
input_def.value = input_def.test_param.value;
// build options field
this._addRow('conditional', inputs_def, data);
this._addRow('conditional', input_def, data);
// add fields
for (var i in inputs_def.cases) {
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 : inputs_def.cases[i].inputs,
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(inputs_def.name + '_formsection_' + i);
this.table.append(sub_section_id);
}
break;
// repeat block
case 'repeat':
// create tab field
var tabs = new Tabs.View({
title_new : 'Add Group',
title_new : 'Add ' + input_def.title,
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 : inputs_def.inputs,
inputs : input_def.inputs,
cls : 'ui-table-plain'
});
// create id tag
var sub_section_id = inputs_def.name + '_formsection_' + tabs.size();
// add new tab
tabs.add({
id : sub_section_id,
title : 'Repeat',
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();
}
});
// append sub section
this.table.add(inputs_def.title);
this.table.add('');
this.table.add(tabs.$el);
this.table.append(inputs_def.name);
this.table.append(input_def.id);
break;
// default single element row
default:
this._addRow(type, inputs_def, data);
this._addRow(type, input_def, data);
}
},
// add table row
_addRow: function(field_type, inputs_def, data) {
_addRow: function(field_type, input_def, data) {
// get id
var id = inputs_def.name;
var id = input_def.id;
// field wrapper
var field = null;
@@ -128,37 +153,42 @@ define(['mvc/ui/ui-table', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Table,
switch(field_type) {
// text input field
case 'text' :
field = this._field_text(inputs_def, data);
field = this._field_text(input_def, data);
break;
// select field
case 'select' :
field = this._field_select(inputs_def, data);
field = this._field_select(input_def, data);
break;
// radiobox field
case 'radiobutton' :
field = this._field_radio(inputs_def, data);
field = this._field_radio(input_def, data);
break;
// dataset
case 'data':
field = this._field_data(inputs_def, data);
field = this._field_data(input_def, data);
break;
// dataset column
case 'data_column':
field = this._field_column(inputs_def, data);
field = this._field_column(input_def, data);
break;
// text area field
case 'textarea' :
field = this._field_textarea(inputs_def, data);
field = this._field_textarea(input_def, data);
break;
// conditional select field
case 'conditional':
field = this._field_conditional(inputs_def, data);
field = this._field_conditional(input_def, data);
break;
// hidden field
case 'hidden':
field = this._field_hidden(input_def, data);
break;
}
@@ -170,68 +200,37 @@ define(['mvc/ui/ui-table', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Table,
// set value
if (!data.get(id)) {
data.set(id, inputs_def.value);
data.set(id, input_def.value);
}
field.value(data.get(id));
// add to field list
this.app.field_list[id] = field;
// add to input definition into sequential list
this.app.inputs_sequential[id] = inputs_def;
// combine field and info
var $input = $('<div/>');
$input.append(field.$el);
if (inputs_def.help) {
$input.append('<div class="ui-table-form-info">' + inputs_def.help + '</div>');
if (input_def.help) {
$input.append('<div class="ui-table-form-info">' + input_def.help + '</div>');
}
// add row to table
this.table.add('<span class="ui-table-form-title">' + inputs_def.label + '</span>', '25%');
// create table row
this.table.add('<span class="ui-table-form-title">' + input_def.label + '</span>', '25%');
this.table.add($input);
// add to table
// append to table
this.table.append(id);
// show/hide
if (inputs_def.hide) {
this.table.get(id).hide();
}
},
// text input field
_field_text : function(inputs_def, data) {
var id = inputs_def.name;
return new Ui.Input({
id : 'field-' + id,
value : data.get(id),
onchange : function(value) {
data.set(id, value);
}
});
},
// text area
_field_textarea : function(inputs_def, data) {
var id = inputs_def.name;
return new Ui.Textarea({
id : 'field-' + id,
onchange : function() {
data.set(id, field.value());
}
});
},
// conditional input field
_field_conditional : function(inputs_def, data) {
_field_conditional : function(input_def, data) {
// link this
var self = this;
// configure options fields
var options = [];
for (var i in inputs_def.test_param.options) {
var option = inputs_def.test_param.options[i];
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]
@@ -239,7 +238,7 @@ define(['mvc/ui/ui-table', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Table,
}
// select field
var id = inputs_def.name;
var id = input_def.id;
return new Ui.Select.View({
id : 'field-' + id,
data : options,
@@ -249,19 +248,29 @@ define(['mvc/ui/ui-table', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Table,
data.set(id, value);
// check value in order to hide/show options
for (var i in inputs_def.cases) {
for (var i in input_def.cases) {
// get case
var case_def = inputs_def.cases[i];
var case_def = input_def.cases[i];
// identify subsection name
var section_id = inputs_def.name + '_formsection_' + i;
var section_id = input_def.id + '-section-' + i;
// identify row
var section_row = self.table.get(section_id);
// check
if (case_def.value == value) {
section_row.show();
// 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();
}
@@ -271,12 +280,12 @@ define(['mvc/ui/ui-table', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Table,
},
// data input field
_field_data : function(inputs_def, data) {
_field_data : function(input_def, data) {
// link this
var self = this;
// get element id
var id = inputs_def.name;
var id = input_def.id;
// get datasets
var datasets = this.datasets.filterType();
@@ -299,11 +308,8 @@ define(['mvc/ui/ui-table', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Table,
// update value
data.set(id, value);
// find referenced columns
var column_list = _.where(self.app.inputs_sequential, {
data_ref : id,
type : 'data_column'
});
// get referenced columns
var column_list = self.app.tree.findReferences(id);
// find selected dataset
var dataset = self.datasets.filter(value);
@@ -333,7 +339,7 @@ define(['mvc/ui/ui-table', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Table,
// update referenced columns
for (var i in column_list) {
var column_field = self.app.field_list[column_list[i].name]
var column_field = self.app.field_list[column_list[i]]
if (column_field) {
column_field.update(columns);
column_field.value(column_field.first());
@@ -348,8 +354,8 @@ define(['mvc/ui/ui-table', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Table,
},
// column selection field
_field_column : function (inputs_def, data) {
var id = inputs_def.name;
_field_column : function (input_def, data) {
var id = input_def.id;
return new Ui.Select.View({
id : 'field-' + id,
value : data.get(id),
@@ -360,11 +366,11 @@ define(['mvc/ui/ui-table', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Table,
},
// select field
_field_select : function (inputs_def, data) {
_field_select : function (input_def, data) {
// configure options fields
var options = [];
for (var i in inputs_def.options) {
var option = inputs_def.options[i];
for (var i in input_def.options) {
var option = input_def.options[i];
options.push({
label: option[0],
value: option[1]
@@ -373,12 +379,12 @@ define(['mvc/ui/ui-table', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Table,
// identify display type
var SelectClass = Ui.Select;
if (inputs_def.display == 'checkboxes') {
if (input_def.display == 'checkboxes') {
SelectClass = Ui.Checkbox;
}
// select field
var id = inputs_def.name;
var id = input_def.id;
return new SelectClass.View({
id : 'field-' + id,
data : options,
@@ -389,17 +395,49 @@ define(['mvc/ui/ui-table', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Table,
});
},
// radio field
_field_radio : function(inputs_def, data) {
var id = inputs_def.name;
return new Ui.RadioButton({
// text input field
_field_text : function(input_def, data) {
var id = input_def.id;
return new Ui.Input({
id : 'field-' + id,
data : inputs_def.data,
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)
});
}
});
+135
View File
@@ -0,0 +1,135 @@
// dependencies
define([], function() {
// tool form tree
return Backbone.Model.extend({
// initialize
initialize: function(app) {
// link app
this.app = app;
},
// creates tree structure
refresh: function() {
// check if section is available
if (!this.app.section) {
return {};
}
// create dictionary
this.dict = {};
// create xml object
this.xml = $('<div/>');
// fill dictionary
this._iterate(this.app.section.$el, this.dict, this.xml);
},
// iterate
_iterate: function(parent, dict, xml) {
// 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('form-row') || $(child).hasClass('tab-pane')) {
// create sub dictionary
dict[id] = {};
// add input element if it exists
var input = self.app.inputs_sequential[id];
if (input) {
dict[id] = {
input : input
}
}
// create xml element
var $el = $('<div id="' + id + '"/>');
// append xml
xml.append($el);
// fill sub dictionary
self._iterate(child, dict[id], $el);
} else {
self._iterate(child, dict, xml);
}
});
},
// find referenced elements
findReferences: function(identifier) {
// referenced elements
var referenced = [];
// link this
var self = this;
// iterate
function search (name, parent) {
// get child nodes
var children = $(parent).children();
// create sublist
var list = [];
// verify that hierachy level is referenced to identifier
children.each(function() {
// get child element
var child = this;
// get id
var id = $(child).attr('id');
// skip
if (id !== identifier) {
// get input element
var input = self.app.inputs_sequential[id];
if (input) {
// check for new reference definition
if (input.name == name) {
// stop iteration
return;
}
// check for referenced element
if (input.data_ref == name) {
list.push(id);
}
}
}
});
// merge temporary list with result
referenced = referenced.concat(list);
// continue iteration
children.each(function() {
search(identifier, this);
});
}
// get initial node
var node = this.xml.find('#' + identifier);
if (node.length > 0) {
// get parent input element
var input = self.app.inputs_sequential[identifier];
if (input) {
search(input.name, node.parent());
}
}
// return
return referenced;
}
});
});
+31 -1
View File
@@ -409,6 +409,35 @@ var Textarea = Backbone.View.extend({
}
});
// plugin
var Hidden = Backbone.View.extend({
// options
optionsDefault: {
value : ''
},
// initialize
initialize : function(options) {
// configure options
this.options = Utils.merge(options, this.optionsDefault);
// create new element
this.setElement(this._template(this.options));
},
// value
value : function (new_val) {
if (new_val !== undefined) {
this.$el.val(new_val);
}
return this.$el.val();
},
// element
_template: function(options) {
return '<hidden id="' + options.id + '" value="' + options.value + '"/>';
}
});
// return
return {
@@ -426,6 +455,7 @@ return {
Checkbox : Checkbox,
Searchbox : Searchbox,
Select : Select,
Textarea : Textarea
Textarea : Textarea,
Hidden : Hidden
}
});
+9 -3
View File
@@ -17,7 +17,8 @@ var View = Backbone.View.extend({
onchange : null,
ondblclick : null,
onconfirm : null,
cls : 'ui-table'
cls : 'ui-table',
cls_tr : ''
},
// events
@@ -43,7 +44,7 @@ var View = Backbone.View.extend({
this.setElement($el);
// initialize row
this.row = $('<tr></tr>');
this.row = this._row();
},
// add header cell
@@ -156,13 +157,18 @@ var View = Backbone.View.extend({
}
// row
this.row = $('<tr></tr>');
this.row = this._row();
// row count
this.row_count++;
this._refresh();
},
// create new row
_row: function() {
return $('<tr class="' + this.options.cls_tr + '"></tr>');
},
// onclick
_onclick: function(e) {
// get values
+19 -8
View File
@@ -132,7 +132,7 @@ var View = Backbone.View.extend({
del: function(id) {
// delete tab from dom
this.$el.find('#tab-' + id).remove();
this.$el.find('#tab-content-' + id).remove();
this.$el.find('#' + id).remove();
// check if first tab has been deleted
if (this.first_tab == id) {
@@ -143,14 +143,17 @@ var View = Backbone.View.extend({
if (this.first_tab != null) {
this.show(this.first_tab);
}
// delete from list
if (this.list[id]) {
delete this.list[id];
}
},
// delete tab
delRemovable: function() {
for (var id in this.list) {
if (this.list[id]) {
this.del(id);
}
this.del(id);
}
},
@@ -165,7 +168,7 @@ var View = Backbone.View.extend({
this.$el.find('.tab-element').removeClass('active');
this.$el.find('.tab-pane').removeClass('active');
this.$el.find('#tab-' + id).addClass('active');
this.$el.find('#tab-content-' + id).addClass('active');
this.$el.find('#' + id).addClass('active');
}
},
@@ -201,6 +204,14 @@ var View = Backbone.View.extend({
return $el.html();
},
// retitle
retitle: function(new_title) {
var index = 0;
for (var id in this.list) {
this.title(id, ++index + ': ' + new_title);
}
},
// fill template
_template: function(options) {
return '<div class="ui-tabs tabbable tabs-left">' +
@@ -224,8 +235,8 @@ var View = Backbone.View.extend({
// fill template tab
_template_tab: function(options) {
var tmpl = '<li id="tab-' + options.id + '" class="tab-element">' +
'<a id="tab-title-link-' + options.id + '" title="" href="#tab-content-' + options.id + '" data-original-title="">' +
'<span id="tab-title-text-' + options.id + '">' + options.title + '</span>';
'<a id="tab-title-link-' + options.id + '" title="" href="#' + options.id + '" data-original-title="">' +
'<span id="tab-title-text-' + options.id + '" class="tab-title-text">' + options.title + '</span>';
if (options.ondel) {
tmpl += '<i id="delete" class="ui-tabs-delete fa fa-minus-circle"/>';
@@ -239,7 +250,7 @@ var View = Backbone.View.extend({
// fill template tab content
_template_tab_content: function(options) {
return '<div id="tab-content-' + options.id + '" class="tab-pane"/>';
return '<div id="' + options.id + '" class="tab-pane"/>';
}
});
@@ -1 +1 @@
define(["mvc/ui/ui-portlet","mvc/ui/ui-misc","mvc/citation/citation-model","mvc/citation/citation-view","mvc/tools","mvc/tools/tools-template","mvc/tools/tools-datasets","mvc/tools/tools-section"],function(f,j,h,a,e,c,g,i){var d=Backbone.Model.extend({initialize:function(k){this.url=galaxy_config.root+"api/tools/"+k.id+"?io_details=true"}});var b=Backbone.View.extend({main_el:"body",initialize:function(l){var k=this;this.options=l;this.model=new d({id:l.id});this.datasets=new g({success:function(){k._initializeToolForm()}})},_initializeToolForm:function(){this.field_list={};this.inputs_sequential={};var k=this;this.model.fetch({error:function(l){console.debug("tools-form::_initializeToolForm() : Attempt to fetch tool model failed.")},success:function(){k.inputs=k.model.get("inputs");k.portlet=new f.View({icon:"fa-wrench",title:"<b>"+k.model.get("name")+"</b> "+k.model.get("description"),buttons:{execute:new j.ButtonIcon({icon:"fa-check",tooltip:"Execute the tool",title:"Execute",floating:"clear",onclick:function(){}})}});k.message=new j.Message();k.portlet.append(k.message.$el);$(k.main_el).append(k.portlet.$el);if(k.options.help!=""){$(k.main_el).append(c.help(k.options.help))}if(k.options.citations){$(k.main_el).append(c.citations());var l=new h.ToolCitationCollection();l.tool_id=k.options.id;var m=new a.CitationListView({collection:l});m.render();l.fetch()}k.setElement(k.portlet.content());k.section=new i.View(k,{inputs:k.model.get("inputs")});k.portlet.append(k.section.$el)}})}});return{View:b}});
define(["mvc/ui/ui-portlet","mvc/ui/ui-misc","mvc/citation/citation-model","mvc/citation/citation-view","mvc/tools","mvc/tools/tools-template","mvc/tools/tools-datasets","mvc/tools/tools-section","mvc/tools/tools-tree"],function(g,k,i,a,f,d,h,j,c){var e=Backbone.Model.extend({initialize:function(l){this.url=galaxy_config.root+"api/tools/"+l.id+"?io_details=true"}});var b=Backbone.View.extend({main_el:"body",initialize:function(m){var l=this;this.options=m;this.model=new e({id:m.id});this.tree=new c(this);this.field_list={};this.inputs_sequential={};this.data=new Backbone.Model();this.datasets=new h({success:function(){l._initializeToolForm()}})},_initializeToolForm:function(){var l=this;this.model.fetch({error:function(m){console.debug("tools-form::_initializeToolForm() : Attempt to fetch tool model failed.")},success:function(){l.inputs=l.model.get("inputs");l.portlet=new g.View({icon:"fa-wrench",title:"<b>"+l.model.get("name")+"</b> "+l.model.get("description"),buttons:{execute:new k.ButtonIcon({icon:"fa-check",tooltip:"Execute the tool",title:"Execute",floating:"clear",onclick:function(){console.log(l.tree.create(l))}})}});l.message=new k.Message();l.portlet.append(l.message.$el);$(l.main_el).append(l.portlet.$el);if(l.options.help!=""){$(l.main_el).append(d.help(l.options.help))}if(l.options.citations){$(l.main_el).append(d.citations());var m=new i.ToolCitationCollection();m.tool_id=l.options.id;var n=new a.CitationListView({collection:m});n.render();m.fetch()}l.setElement(l.portlet.content());l.section=new j.View(l,{inputs:l.model.get("inputs")});l.portlet.append(l.section.$el);l.refresh()}})},refresh:function(){this.tree.refresh();for(var l in this.field_list){this.field_list[l].trigger("change")}console.debug("tools-form::refresh() - Recreated tree structure. Refresh.")}});return{View:b}});
@@ -1 +1 @@
define(["mvc/ui/ui-table","mvc/ui/ui-misc","mvc/ui/ui-tabs"],function(b,d,a){var c=Backbone.View.extend({initialize:function(f,e){this.app=f;this.inputs=e.inputs;this.datasets=f.datasets;this.table=new b.View(e);this.setElement(this.table.$el);this.render()},render:function(){this.table.delAll();var e=new Backbone.Model();for(var f in this.inputs){this._add(this.inputs[f],e)}for(var f in this.app.field_list){this.app.field_list[f].trigger("change")}},_add:function(f,k){var e=this;var j=f.type;switch(j){case"conditional":f.label=f.test_param.label;f.name=f.test_param.name;this._addRow("conditional",f,k);for(var h in f.cases){var l=new c(this.app,{inputs:f.cases[h].inputs,cls:"ui-table-plain"});this.table.add("");this.table.add(l.$el);this.table.append(f.name+"_formsection_"+h)}break;case"repeat":var g=new a.View({title_new:"Add Group",onnew:function(){var m=new c(e.app,{inputs:f.inputs,cls:"ui-table-plain"});var i=f.name+"_formsection_"+g.size();g.add({id:i,title:"Repeat",$el:m.$el,ondel:function(){g.del(i)}});g.show(i)}});this.table.add(f.title);this.table.add(g.$el);this.table.append(f.name);break;default:this._addRow(j,f,k)}},_addRow:function(h,e,f){var j=e.name;var g=null;switch(h){case"text":g=this._field_text(e,f);break;case"select":g=this._field_select(e,f);break;case"radiobutton":g=this._field_radio(e,f);break;case"data":g=this._field_data(e,f);break;case"data_column":g=this._field_column(e,f);break;case"textarea":g=this._field_textarea(e,f);break;case"conditional":g=this._field_conditional(e,f);break}if(!g){console.debug("tools-form::_addRow() : Unmatched field type ("+h+").");return}if(!f.get(j)){f.set(j,e.value)}g.value(f.get(j));this.app.field_list[j]=g;this.app.inputs_sequential[j]=e;var i=$("<div/>");i.append(g.$el);if(e.help){i.append('<div class="ui-table-form-info">'+e.help+"</div>")}this.table.add('<span class="ui-table-form-title">'+e.label+"</span>","25%");this.table.add(i);this.table.append(j);if(e.hide){this.table.get(j).hide()}},_field_text:function(e,f){var g=e.name;return new d.Input({id:"field-"+g,value:f.get(g),onchange:function(h){f.set(g,h)}})},_field_textarea:function(e,f){var g=e.name;return new d.Textarea({id:"field-"+g,onchange:function(){f.set(g,field.value())}})},_field_conditional:function(g,k){var e=this;var f=[];for(var h in g.test_param.options){var j=g.test_param.options[h];f.push({label:j[0],value:j[1]})}var l=g.name;return new d.Select.View({id:"field-"+l,data:f,value:k.get(l),onchange:function(q){k.set(l,q);for(var p in g.cases){var n=g.cases[p];var o=g.name+"_formsection_"+p;var m=e.table.get(o);if(n.value==q){m.show()}else{m.hide()}}}})},_field_data:function(g,k){var e=this;var l=g.name;var j=this.datasets.filterType();var f=[];for(var h in j){f.push({label:j[h].get("name"),value:j[h].get("id")})}return new d.Select.View({id:"field-"+l,data:f,value:f[0].value,onchange:function(r){k.set(l,r);var n=_.where(e.app.inputs_sequential,{data_ref:l,type:"data_column"});var t=e.datasets.filter(r);if(t&&n.length>0){console.debug("tool-form::field_data() - Selected dataset "+r+".");var s=t.get("metadata_column_types");if(!s){console.debug("tool-form::field_data() - FAILED: Could not find metadata for dataset "+r+".")}var q=[];for(var p in s){q.push({label:"Column: "+(parseInt(p)+1)+" ["+s[p]+"]",value:p})}for(var o in n){var m=e.app.field_list[n[o].name];if(m){m.update(q);m.value(m.first())}}}else{console.debug("tool-form::field_data() - FAILED: Could not find dataset "+r+".")}}})},_field_column:function(e,f){var g=e.name;return new d.Select.View({id:"field-"+g,value:f.get(g),onchange:function(h){f.set(g,h)}})},_field_select:function(f,k){var e=[];for(var g in f.options){var h=f.options[g];e.push({label:h[0],value:h[1]})}var j=d.Select;if(f.display=="checkboxes"){j=d.Checkbox}var l=f.name;return new j.View({id:"field-"+l,data:e,value:k.get(l),onchange:function(i){k.set(l,i)}})},_field_radio:function(e,f){var g=e.name;return new d.RadioButton({id:"field-"+g,data:e.data,value:f.get(g),onchange:function(h){f.set(g,h)}})}});return{View:c}});
define(["utils/utils","mvc/ui/ui-table","mvc/ui/ui-misc","mvc/ui/ui-tabs"],function(c,b,e,a){var d=Backbone.View.extend({initialize:function(g,f){this.app=g;this.inputs=f.inputs;this.datasets=g.datasets;this.data=g.data;f.cls_tr="form-row";this.table=new b.View(f);this.setElement(this.table.$el);this.render()},render:function(){this.table.delAll();for(var f in this.inputs){this._add(this.inputs[f],this.data)}},_add:function(n,h){var o=this;var k=jQuery.extend(true,{},n);k.id=c.uuid();this.app.inputs_sequential[k.id]=k;var l=k.type;switch(l){case"conditional":k.label=k.test_param.label;k.value=k.test_param.value;this._addRow("conditional",k,h);for(var j in k.cases){var g=k.id+"-section-"+j;var f=new d(this.app,{inputs:k.cases[j].inputs,cls:"ui-table-plain"});this.table.add("");this.table.add(f.$el);this.table.append(g)}break;case"repeat":var m=new a.View({title_new:"Add "+k.title,onnew:function(){var i=k.id+"-section-"+c.uuid();var p=new d(o.app,{inputs:k.inputs,cls:"ui-table-plain"});m.add({id:i,title:k.title,$el:p.$el,ondel:function(){m.del(i);m.retitle(k.title);o.app.refresh()}});m.retitle(k.title);m.show(i);o.app.refresh()}});this.table.add("");this.table.add(m.$el);this.table.append(k.id);break;default:this._addRow(l,k,h)}},_addRow:function(i,f,g){var k=f.id;var h=null;switch(i){case"text":h=this._field_text(f,g);break;case"select":h=this._field_select(f,g);break;case"radiobutton":h=this._field_radio(f,g);break;case"data":h=this._field_data(f,g);break;case"data_column":h=this._field_column(f,g);break;case"textarea":h=this._field_textarea(f,g);break;case"conditional":h=this._field_conditional(f,g);break;case"hidden":h=this._field_hidden(f,g);break}if(!h){console.debug("tools-form::_addRow() : Unmatched field type ("+i+").");return}if(!g.get(k)){g.set(k,f.value)}h.value(g.get(k));this.app.field_list[k]=h;var j=$("<div/>");j.append(h.$el);if(f.help){j.append('<div class="ui-table-form-info">'+f.help+"</div>")}this.table.add('<span class="ui-table-form-title">'+f.label+"</span>","25%");this.table.add(j);this.table.append(k)},_field_conditional:function(f,l){var g=this;var h=[];for(var j in f.test_param.options){var k=f.test_param.options[j];h.push({label:k[0],value:k[1]})}var m=f.id;return new e.Select.View({id:"field-"+m,data:h,value:l.get(m),onchange:function(u){l.set(m,u);for(var s in f.cases){var o=f.cases[s];var r=f.id+"-section-"+s;var n=g.table.get(r);var q=false;for(var p in o.inputs){var t=o.inputs[p].type;if(t&&t!=="hidden"){q=true;break}}if(o.value==u&&q){n.fadeIn("fast")}else{n.hide()}}}})},_field_data:function(f,l){var g=this;var m=f.id;var k=this.datasets.filterType();var h=[];for(var j in k){h.push({label:k[j].get("name"),value:k[j].get("id")})}return new e.Select.View({id:"field-"+m,data:h,value:h[0].value,onchange:function(s){l.set(m,s);var o=g.app.tree.findReferences(m);var u=g.datasets.filter(s);if(u&&o.length>0){console.debug("tool-form::field_data() - Selected dataset "+s+".");var t=u.get("metadata_column_types");if(!t){console.debug("tool-form::field_data() - FAILED: Could not find metadata for dataset "+s+".")}var r=[];for(var q in t){r.push({label:"Column: "+(parseInt(q)+1)+" ["+t[q]+"]",value:q})}for(var p in o){var n=g.app.field_list[o[p]];if(n){n.update(r);n.value(n.first())}}}else{console.debug("tool-form::field_data() - FAILED: Could not find dataset "+s+".")}}})},_field_column:function(f,g){var h=f.id;return new e.Select.View({id:"field-"+h,value:g.get(h),onchange:function(i){g.set(h,i)}})},_field_select:function(f,l){var g=[];for(var h in f.options){var j=f.options[h];g.push({label:j[0],value:j[1]})}var k=e.Select;if(f.display=="checkboxes"){k=e.Checkbox}var m=f.id;return new k.View({id:"field-"+m,data:g,value:l.get(m),onchange:function(i){l.set(m,i)}})},_field_text:function(f,g){var h=f.id;return new e.Input({id:"field-"+h,value:g.get(h),onchange:function(i){g.set(h,i)}})},_field_textarea:function(f,g){var h=f.id;return new e.Textarea({id:"field-"+h,onchange:function(){g.set(h,field.value())}})},_field_radio:function(f,g){var h=f.id;return new e.RadioButton({id:"field-"+h,data:f.data,value:g.get(h),onchange:function(i){g.set(h,i)}})},_field_hidden:function(f,g){var h=f.id;return new e.Hidden({id:"field-"+h,value:g.get(h)})}});return{View:d}});
@@ -0,0 +1 @@
define([],function(){return Backbone.Model.extend({initialize:function(a){this.app=a},refresh:function(){if(!this.app.section){return{}}this.dict={};this.xml=$("<div/>");this._iterate(this.app.section.$el,this.dict,this.xml)},_iterate:function(d,e,b){var a=this;var c=$(d).children();c.each(function(){var i=this;var h=$(i).attr("id");if($(i).hasClass("form-row")||$(i).hasClass("tab-pane")){e[h]={};var f=a.app.inputs_sequential[h];if(f){e[h]={input:f}}var g=$('<div id="'+h+'"/>');b.append(g);a._iterate(i,e[h],g)}else{a._iterate(i,e,b)}})},findReferences:function(c){var f=[];var b=this;function d(g,i){var h=$(i).children();var j=[];h.each(function(){var m=this;var l=$(m).attr("id");if(l!==c){var k=b.app.inputs_sequential[l];if(k){if(k.name==g){return}if(k.data_ref==g){j.push(l)}}}});f=f.concat(j);h.each(function(){d(c,this)})}var e=this.xml.find("#"+c);if(e.length>0){var a=b.app.inputs_sequential[c];if(a){d(a.name,e.parent())}}return f}})});
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
define(["utils/utils"],function(a){var b=Backbone.View.extend({row:null,row_count:0,optionsDefault:{content:"No content available.",onchange:null,ondblclick:null,onconfirm:null,cls:"ui-table"},events:{click:"_onclick",dblclick:"_ondblclick"},initialize:function(c){this.options=a.merge(c,this.optionsDefault);var d=$(this._template(this.options));this.$thead=d.find("thead");this.$tbody=d.find("tbody");this.$tmessage=d.find("tmessage");this.setElement(d);this.row=$("<tr></tr>")},addHeader:function(c){var d=$("<th></th>");d.append(c);this.row.append(d)},appendHeader:function(){this.$thead.append(this.row);this.row=$("<tr></tr>")},add:function(c,d,f){var e=$("<td></td>");if(d){e.css("width",d)}if(f){e.css("text-align",f)}e.append(c);this.row.append(e)},append:function(c){this._commit(c)},prepend:function(c){this._commit(c,true)},get:function(c){return this.$el.find("#"+c)},del:function(d){var c=this.$tbody.find("#"+d);if(c.length>0){c.remove();this.row_count--;this._refresh()}},delAll:function(){this.$tbody.empty();this.row_count=0;this._refresh()},value:function(c){this.before=this.$tbody.find(".current").attr("id");if(c!==undefined){this.$tbody.find("tr").removeClass("current");if(c){this.$tbody.find("#"+c).addClass("current")}}var d=this.$tbody.find(".current").attr("id");if(d===undefined){return null}else{if(d!=this.before&&this.options.onchange){this.options.onchange(c)}return d}},size:function(){return this.$tbody.find("tr").length},_commit:function(d,c){this.del(d);this.row.attr("id",d);if(c){this.$tbody.prepend(this.row)}else{this.$tbody.append(this.row)}this.row=$("<tr></tr>");this.row_count++;this._refresh()},_onclick:function(f){var c=this.value();var d=$(f.target).closest("tr").attr("id");if(d!=""){if(d&&c!=d){if(this.options.onconfirm){this.options.onconfirm(d)}else{this.value(d)}}}},_ondblclick:function(d){var c=this.value();if(c&&this.options.ondblclick){this.options.ondblclick(c)}},_refresh:function(){if(this.row_count==0){this.$tmessage.show()}else{this.$tmessage.hide()}},_template:function(c){return'<div><table class="'+c.cls+'"><thead></thead><tbody></tbody></table><tmessage>'+c.content+"</tmessage><div>"}});return{View:b}});
define(["utils/utils"],function(a){var b=Backbone.View.extend({row:null,row_count:0,optionsDefault:{content:"No content available.",onchange:null,ondblclick:null,onconfirm:null,cls:"ui-table",cls_tr:""},events:{click:"_onclick",dblclick:"_ondblclick"},initialize:function(c){this.options=a.merge(c,this.optionsDefault);var d=$(this._template(this.options));this.$thead=d.find("thead");this.$tbody=d.find("tbody");this.$tmessage=d.find("tmessage");this.setElement(d);this.row=this._row()},addHeader:function(c){var d=$("<th></th>");d.append(c);this.row.append(d)},appendHeader:function(){this.$thead.append(this.row);this.row=$("<tr></tr>")},add:function(c,d,f){var e=$("<td></td>");if(d){e.css("width",d)}if(f){e.css("text-align",f)}e.append(c);this.row.append(e)},append:function(c){this._commit(c)},prepend:function(c){this._commit(c,true)},get:function(c){return this.$el.find("#"+c)},del:function(d){var c=this.$tbody.find("#"+d);if(c.length>0){c.remove();this.row_count--;this._refresh()}},delAll:function(){this.$tbody.empty();this.row_count=0;this._refresh()},value:function(c){this.before=this.$tbody.find(".current").attr("id");if(c!==undefined){this.$tbody.find("tr").removeClass("current");if(c){this.$tbody.find("#"+c).addClass("current")}}var d=this.$tbody.find(".current").attr("id");if(d===undefined){return null}else{if(d!=this.before&&this.options.onchange){this.options.onchange(c)}return d}},size:function(){return this.$tbody.find("tr").length},_commit:function(d,c){this.del(d);this.row.attr("id",d);if(c){this.$tbody.prepend(this.row)}else{this.$tbody.append(this.row)}this.row=this._row();this.row_count++;this._refresh()},_row:function(){return $('<tr class="'+this.options.cls_tr+'"></tr>')},_onclick:function(f){var c=this.value();var d=$(f.target).closest("tr").attr("id");if(d!=""){if(d&&c!=d){if(this.options.onconfirm){this.options.onconfirm(d)}else{this.value(d)}}}},_ondblclick:function(d){var c=this.value();if(c&&this.options.ondblclick){this.options.ondblclick(c)}},_refresh:function(){if(this.row_count==0){this.$tmessage.show()}else{this.$tmessage.hide()}},_template:function(c){return'<div><table class="'+c.cls+'"><thead></thead><tbody></tbody></table><tmessage>'+c.content+"</tmessage><div>"}});return{View:b}});
+1 -1
View File
@@ -1 +1 @@
define(["utils/utils"],function(a){var b=Backbone.View.extend({optionsDefault:{title_new:"",operations:null,onnew:null},initialize:function(e){this.visible=false;this.$nav=null;this.$content=null;this.first_tab=null;this.options=a.merge(e,this.optionsDefault);var c=$(this._template(this.options));this.$nav=c.find(".tab-navigation");this.$content=c.find(".tab-content");this.setElement(c);this.list={};var d=this;if(this.options.operations){$.each(this.options.operations,function(g,h){h.$el.prop("id",g);d.$nav.find(".operations").append(h.$el)})}if(this.options.onnew){var f=$(this._template_tab_new(this.options));this.$nav.append(f);f.tooltip({title:"Add a new tab",placement:"bottom",container:d.$el});f.on("click",function(g){f.tooltip("hide");d.options.onnew()})}},size:function(){return _.size(this.list)},add:function(f){var e=this;var h=f.id;var g=$(this._template_tab(f));var d=$(this._template_tab_content(f));this.list[h]=f.ondel?true:false;if(this.options.onnew){this.$nav.find("#new-tab").before(g)}else{this.$nav.append(g)}d.append(f.$el);this.$content.append(d);if(_.size(this.list)==1){g.addClass("active");d.addClass("active");this.first_tab=h}if(f.ondel){var c=g.find("#delete");c.tooltip({title:"Delete this tab",placement:"bottom",container:e.$el});c.on("click",function(){c.tooltip("destroy");e.$el.find(".tooltip").remove();f.ondel();return false})}g.on("click",function(i){i.preventDefault();if(f.onclick){f.onclick()}else{e.show(h)}})},del:function(c){this.$el.find("#tab-"+c).remove();this.$el.find("#tab-content-"+c).remove();if(this.first_tab==c){this.first_tab=null}if(this.first_tab!=null){this.show(this.first_tab)}},delRemovable:function(){for(var c in this.list){if(this.list[c]){this.del(c)}}},show:function(c){this.$el.fadeIn("fast");this.visible=true;if(c){this.$el.find(".tab-element").removeClass("active");this.$el.find(".tab-pane").removeClass("active");this.$el.find("#tab-"+c).addClass("active");this.$el.find("#tab-content-"+c).addClass("active")}},hide:function(){this.$el.fadeOut("fast");this.visible=false},hideOperation:function(c){this.$nav.find("#"+c).hide()},showOperation:function(c){this.$nav.find("#"+c).show()},setOperation:function(e,d){var c=this.$nav.find("#"+e);c.off("click");c.on("click",d)},title:function(e,d){var c=this.$el.find("#tab-title-text-"+e);if(d){c.html(d)}return c.html()},_template:function(c){return'<div class="ui-tabs tabbable tabs-left"><ul id="tab-navigation" class="tab-navigation nav nav-tabs"><div class="operations" style="float: right; margin-bottom: 4px;"></div></ul><div id="tab-content" class="tab-content"/></div>'},_template_tab_new:function(c){return'<li id="new-tab"><a href="javascript:void(0);"><i class="ui-tabs-add fa fa-plus-circle"/>'+c.title_new+"</a></li>"},_template_tab:function(d){var c='<li id="tab-'+d.id+'" class="tab-element"><a id="tab-title-link-'+d.id+'" title="" href="#tab-content-'+d.id+'" data-original-title=""><span id="tab-title-text-'+d.id+'">'+d.title+"</span>";if(d.ondel){c+='<i id="delete" class="ui-tabs-delete fa fa-minus-circle"/>'}c+="</a></li>";return c},_template_tab_content:function(c){return'<div id="tab-content-'+c.id+'" class="tab-pane"/>'}});return{View:b}});
define(["utils/utils"],function(a){var b=Backbone.View.extend({optionsDefault:{title_new:"",operations:null,onnew:null},initialize:function(e){this.visible=false;this.$nav=null;this.$content=null;this.first_tab=null;this.options=a.merge(e,this.optionsDefault);var c=$(this._template(this.options));this.$nav=c.find(".tab-navigation");this.$content=c.find(".tab-content");this.setElement(c);this.list={};var d=this;if(this.options.operations){$.each(this.options.operations,function(g,h){h.$el.prop("id",g);d.$nav.find(".operations").append(h.$el)})}if(this.options.onnew){var f=$(this._template_tab_new(this.options));this.$nav.append(f);f.tooltip({title:"Add a new tab",placement:"bottom",container:d.$el});f.on("click",function(g){f.tooltip("hide");d.options.onnew()})}},size:function(){return _.size(this.list)},add:function(f){var e=this;var h=f.id;var g=$(this._template_tab(f));var d=$(this._template_tab_content(f));this.list[h]=f.ondel?true:false;if(this.options.onnew){this.$nav.find("#new-tab").before(g)}else{this.$nav.append(g)}d.append(f.$el);this.$content.append(d);if(_.size(this.list)==1){g.addClass("active");d.addClass("active");this.first_tab=h}if(f.ondel){var c=g.find("#delete");c.tooltip({title:"Delete this tab",placement:"bottom",container:e.$el});c.on("click",function(){c.tooltip("destroy");e.$el.find(".tooltip").remove();f.ondel();return false})}g.on("click",function(i){i.preventDefault();if(f.onclick){f.onclick()}else{e.show(h)}})},del:function(c){this.$el.find("#tab-"+c).remove();this.$el.find("#"+c).remove();if(this.first_tab==c){this.first_tab=null}if(this.first_tab!=null){this.show(this.first_tab)}if(this.list[c]){delete this.list[c]}},delRemovable:function(){for(var c in this.list){this.del(c)}},show:function(c){this.$el.fadeIn("fast");this.visible=true;if(c){this.$el.find(".tab-element").removeClass("active");this.$el.find(".tab-pane").removeClass("active");this.$el.find("#tab-"+c).addClass("active");this.$el.find("#"+c).addClass("active")}},hide:function(){this.$el.fadeOut("fast");this.visible=false},hideOperation:function(c){this.$nav.find("#"+c).hide()},showOperation:function(c){this.$nav.find("#"+c).show()},setOperation:function(e,d){var c=this.$nav.find("#"+e);c.off("click");c.on("click",d)},title:function(e,d){var c=this.$el.find("#tab-title-text-"+e);if(d){c.html(d)}return c.html()},retitle:function(d){var c=0;for(var e in this.list){this.title(e,++c+": "+d)}},_template:function(c){return'<div class="ui-tabs tabbable tabs-left"><ul id="tab-navigation" class="tab-navigation nav nav-tabs"><div class="operations" style="float: right; margin-bottom: 4px;"></div></ul><div id="tab-content" class="tab-content"/></div>'},_template_tab_new:function(c){return'<li id="new-tab"><a href="javascript:void(0);"><i class="ui-tabs-add fa fa-plus-circle"/>'+c.title_new+"</a></li>"},_template_tab:function(d){var c='<li id="tab-'+d.id+'" class="tab-element"><a id="tab-title-link-'+d.id+'" title="" href="#'+d.id+'" data-original-title=""><span id="tab-title-text-'+d.id+'" class="tab-title-text">'+d.title+"</span>";if(d.ondel){c+='<i id="delete" class="ui-tabs-delete fa fa-minus-circle"/>'}c+="</a></li>";return c},_template_tab_content:function(c){return'<div id="'+c.id+'" class="tab-pane"/>'}});return{View:b}});