From 6eed84d4f6d23130e320e8feb8c5737d5bd63d58 Mon Sep 17 00:00:00 2001
From: Dannon Baker
Date: Wed, 25 Oct 2017 12:41:09 -0400
Subject: [PATCH] Attach workflow globals to window, temporarily. We can
refactor and use a singleton in a module down the road or something else.
---
.../galaxy/scripts/mvc/workflow/workflow-terminals.js | 5 +++--
.../galaxy/scripts/mvc/workflow/workflow-view-data.js | 8 +++++---
.../scripts/mvc/workflow/workflow-view-terminals.js | 9 ++++++---
client/galaxy/scripts/mvc/workflow/workflow-view.js | 11 +++++++----
static/maps/mvc/workflow/workflow-terminals.js.map | 2 +-
static/maps/mvc/workflow/workflow-view-data.js.map | 2 +-
.../maps/mvc/workflow/workflow-view-terminals.js.map | 2 +-
static/maps/mvc/workflow/workflow-view.js.map | 2 +-
static/scripts/mvc/workflow/workflow-terminals.js | 2 +-
static/scripts/mvc/workflow/workflow-view-data.js | 2 +-
.../scripts/mvc/workflow/workflow-view-terminals.js | 2 +-
static/scripts/mvc/workflow/workflow-view.js | 2 +-
12 files changed, 29 insertions(+), 20 deletions(-)
diff --git a/client/galaxy/scripts/mvc/workflow/workflow-terminals.js b/client/galaxy/scripts/mvc/workflow/workflow-terminals.js
index 18fc3cdea5a5..75d60c6380fd 100644
--- a/client/galaxy/scripts/mvc/workflow/workflow-terminals.js
+++ b/client/galaxy/scripts/mvc/workflow/workflow-terminals.js
@@ -1,4 +1,5 @@
-import Globals from "mvc/workflow/workflow-globals";
+// TODO; tie into Galaxy state?
+window.workflow_globals = window.workflow_globals || {};
function CollectionTypeDescription(collectionType) {
this.collectionType = collectionType;
this.isCollection = true;
@@ -369,7 +370,7 @@ var BaseInputTerminal = Terminal.extend({
other_datatype == "input" ||
other_datatype == "_sniff_" ||
other_datatype == "input_collection" ||
- Globals.app.isSubType(
+ window.workflow_globals.app.isSubType(
cat_outputs[other_datatype_i],
thisDatatype
)
diff --git a/client/galaxy/scripts/mvc/workflow/workflow-view-data.js b/client/galaxy/scripts/mvc/workflow/workflow-view-data.js
index f2e62cdd2cfd..982f36bb39e1 100644
--- a/client/galaxy/scripts/mvc/workflow/workflow-view-data.js
+++ b/client/galaxy/scripts/mvc/workflow/workflow-view-data.js
@@ -1,4 +1,6 @@
-import Globals from "mvc/workflow/workflow-globals";
+// TODO; tie into Galaxy state?
+window.workflow_globals = window.workflow_globals || {};
+
var DataInputView = Backbone.View.extend({
className: "form-row dataRow input-data-row",
@@ -132,8 +134,8 @@ var OutputCalloutView = Backbone.View.extend({
"static/images/fugue/asterisk-small.png"
);
}
- Globals.workflow.has_changes = true;
- Globals.canvas_manager.draw_overview();
+ window.workflow_globals.workflow.has_changes = true;
+ window.workflow_globals.canvas_manager.draw_overview();
})
)
)
diff --git a/client/galaxy/scripts/mvc/workflow/workflow-view-terminals.js b/client/galaxy/scripts/mvc/workflow/workflow-view-terminals.js
index 810ec9386bb2..088774d0faae 100644
--- a/client/galaxy/scripts/mvc/workflow/workflow-view-terminals.js
+++ b/client/galaxy/scripts/mvc/workflow/workflow-view-terminals.js
@@ -1,6 +1,9 @@
-import Globals from "mvc/workflow/workflow-globals";
import Terminals from "mvc/workflow/workflow-terminals";
import Connector from "mvc/workflow/workflow-connector";
+
+// TODO; tie into Galaxy state?
+window.workflow_globals = window.workflow_globals || {};
+
var TerminalMappingView = Backbone.View.extend({
tagName: "div",
className: "fa-icon-button fa fa-folder-o",
@@ -196,7 +199,7 @@ var BaseOutputTerminalView = TerminalView.extend({
$(d.proxy).css({ left: x, top: y });
d.proxy.terminal.redraw();
// FIXME: global
- Globals.canvas_manager.update_viewport_overlay();
+ window.workflow_globals.canvas_manager.update_viewport_overlay();
};
onmove();
$("#canvas-container")
@@ -206,7 +209,7 @@ var BaseOutputTerminalView = TerminalView.extend({
onDragStart: function(e, d) {
$(d.available).addClass("input-terminal-active");
// Save PJAs in the case of change datatype actions.
- Globals.workflow.check_changes_in_active_form();
+ window.workflow_globals.workflow.check_changes_in_active_form();
// Drag proxy div
var h = $(
'
'
diff --git a/client/galaxy/scripts/mvc/workflow/workflow-view.js b/client/galaxy/scripts/mvc/workflow/workflow-view.js
index 6a567b75281a..e85ffde97c58 100644
--- a/client/galaxy/scripts/mvc/workflow/workflow-view.js
+++ b/client/galaxy/scripts/mvc/workflow/workflow-view.js
@@ -1,5 +1,4 @@
import Utils from "utils/utils";
-import Globals from "mvc/workflow/workflow-globals";
import Workflow from "mvc/workflow/workflow-manager";
import WorkflowCanvas from "mvc/workflow/workflow-canvas";
import Node from "mvc/workflow/workflow-node";
@@ -9,6 +8,10 @@ import Ui from "mvc/ui/ui-misc";
import async_save_text from "utils/async-save-text";
import Toastr from "libs/toastr";
import "ui/editable-text";
+
+// TODO; tie into Galaxy state?
+window.workflow_globals = window.workflow_globals || {};
+
// Reset tool search to start state.
function reset_tool_search(initValue) {
// Function may be called in top frame or in tool_menu_frame;
@@ -54,7 +57,7 @@ function add_node_icon($to_el, nodeType) {
// create form view
export default Backbone.View.extend({
initialize: function(options) {
- var self = (Globals.app = this);
+ var self = (window.workflow_globals.app = this);
this.options = options;
this.urls = (options && options.urls) || {};
var close_editor = function() {
@@ -225,7 +228,7 @@ export default Backbone.View.extend({
});
// Canvas overview management
- this.canvas_manager = Globals.canvas_manager = new WorkflowCanvas(
+ this.canvas_manager = window.workflow_globals.canvas_manager = new WorkflowCanvas(
this,
$("#canvas-viewport"),
$("#overview")
@@ -632,7 +635,7 @@ export default Backbone.View.extend({
// Global state for the whole workflow
reset: function() {
this.workflow && this.workflow.remove_all();
- this.workflow = Globals.workflow = new Workflow(
+ this.workflow = window.workflow_globals.workflow = new Workflow(
this,
$("#canvas-container")
);
diff --git a/static/maps/mvc/workflow/workflow-terminals.js.map b/static/maps/mvc/workflow/workflow-terminals.js.map
index d28fe5f11f31..08fa34f3d0ed 100644
--- a/static/maps/mvc/workflow/workflow-terminals.js.map
+++ b/static/maps/mvc/workflow/workflow-terminals.js.map
@@ -1 +1 @@
-{"version":3,"sources":["mvc/workflow/workflow-terminals.js"],"names":["CollectionTypeDescription","collectionType","this","isCollection","rank","split","length","NULL_COLLECTION_TYPE_DESCRIPTION","canMatch","other","canMapOver","toString","append","otherCollectionType","equal","ANY_COLLECTION_TYPE_DESCRIPTION","prototype","otherCollectionTypeDescription","requiredSuffix","effectiveCollectionType","effectiveMapOver","str","initialize","mapOver","_endsWith","terminal","terminalMapping","indexOf","suffix","setMapOver","Backbone","Model","extend","attr","collectionTypeDescription","trigger","disableMapOver","connect","Terminal","disconnect","element","connectors","node","resetMappingIfNeeded","markChanged","c","connector","splice","$","inArray","destroy","each","redraw","destroyInvalidConnections","_","slice","val","multiple","outputTerminal","resetMapping","isMappedOver","OutputTerminal","mappedInput","call","datatypes","hasConnectedOutputTerminals","connectedInput","handle2","BaseInputTerminal","destroyIfInvalid","update","input","canAccept","reset","attachable","hasMappedOverInputTerminals","connected","hasConnectedMappedInputTerminals","_inputFilled","inputFilled","_collectionAttached","inputsFilled","firstOutput","_mappingConstraints","handle1","constraints","thisDatatype","push","first","other_datatype","cat_outputs","other_datatype_i","pja","pja_i","inputTerminal","_producesAcceptableDatatype","t","_otherCollectionType","Array","otherMapOver","post_job_actions","action_type","output_name","name","extensions","action_arguments","other_output","InputTerminal","mappingConstraints","collection","InputCollectionTerminal","thisMapOver","collectionTypes","collectionTypeIndex","effectiveCollectionTypes","_effectiveCollectionTypes","some","_effectiveMapOver","OutputCollectionTerminal","collection_type","map","newCollectionType","collectionTypeSource","output","console","log","TerminalMapping","collection_type_source"],"mappings":"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","file":"../../../scripts/mvc/workflow/workflow-terminals.js","sourcesContent":["import Globals from \"mvc/workflow/workflow-globals\";\nfunction CollectionTypeDescription(collectionType) {\n this.collectionType = collectionType;\n this.isCollection = true;\n this.rank = collectionType.split(\":\").length;\n}\n\nvar NULL_COLLECTION_TYPE_DESCRIPTION = {\n isCollection: false,\n canMatch: function(other) {\n return false;\n },\n canMapOver: function(other) {\n return false;\n },\n toString: function() {\n return \"NullCollectionType[]\";\n },\n append: function(otherCollectionType) {\n return otherCollectionType;\n },\n equal: function(other) {\n return other === this;\n }\n};\n\nvar ANY_COLLECTION_TYPE_DESCRIPTION = {\n isCollection: true,\n canMatch: function(other) {\n return NULL_COLLECTION_TYPE_DESCRIPTION !== other;\n },\n canMapOver: function(other) {\n return false;\n },\n toString: function() {\n return \"AnyCollectionType[]\";\n },\n append: function(otherCollectionType) {\n throw \"Cannot append to ANY_COLLECTION_TYPE_DESCRIPTION\";\n },\n equal: function(other) {\n return other === this;\n }\n};\n\n$.extend(CollectionTypeDescription.prototype, {\n append: function(otherCollectionTypeDescription) {\n if (\n otherCollectionTypeDescription === NULL_COLLECTION_TYPE_DESCRIPTION\n ) {\n return this;\n }\n if (\n otherCollectionTypeDescription === ANY_COLLECTION_TYPE_DESCRIPTION\n ) {\n return otherCollectionType;\n }\n return new CollectionTypeDescription(\n this.collectionType +\n \":\" +\n otherCollectionTypeDescription.collectionType\n );\n },\n canMatch: function(otherCollectionTypeDescription) {\n if (\n otherCollectionTypeDescription === NULL_COLLECTION_TYPE_DESCRIPTION\n ) {\n return false;\n }\n if (\n otherCollectionTypeDescription === ANY_COLLECTION_TYPE_DESCRIPTION\n ) {\n return true;\n }\n return (\n otherCollectionTypeDescription.collectionType == this.collectionType\n );\n },\n canMapOver: function(otherCollectionTypeDescription) {\n if (\n otherCollectionTypeDescription === NULL_COLLECTION_TYPE_DESCRIPTION\n ) {\n return false;\n }\n if (\n otherCollectionTypeDescription === ANY_COLLECTION_TYPE_DESCRIPTION\n ) {\n return false;\n }\n if (this.rank <= otherCollectionTypeDescription.rank) {\n // Cannot map over self...\n return false;\n }\n var requiredSuffix = otherCollectionTypeDescription.collectionType;\n return this._endsWith(this.collectionType, requiredSuffix);\n },\n effectiveMapOver: function(otherCollectionTypeDescription) {\n var otherCollectionType = otherCollectionTypeDescription.collectionType;\n var effectiveCollectionType = this.collectionType.substring(\n 0,\n this.collectionType.length - otherCollectionType.length - 1\n );\n return new CollectionTypeDescription(effectiveCollectionType);\n },\n equal: function(otherCollectionTypeDescription) {\n return (\n otherCollectionTypeDescription.collectionType == this.collectionType\n );\n },\n toString: function() {\n return \"CollectionType[\" + this.collectionType + \"]\";\n },\n _endsWith: function(str, suffix) {\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\n }\n});\n\nvar TerminalMapping = Backbone.Model.extend({\n initialize: function(attr) {\n this.mapOver = attr.mapOver || NULL_COLLECTION_TYPE_DESCRIPTION;\n this.terminal = attr.terminal;\n this.terminal.terminalMapping = this;\n },\n disableMapOver: function() {\n this.setMapOver(NULL_COLLECTION_TYPE_DESCRIPTION);\n },\n setMapOver: function(collectionTypeDescription) {\n // TODO: Can I use \"attributes\" or something to auto trigger \"change\"\n // event?\n this.mapOver = collectionTypeDescription;\n this.trigger(\"change\");\n }\n});\n\nvar Terminal = Backbone.Model.extend({\n initialize: function(attr) {\n this.element = attr.element;\n this.connectors = [];\n },\n connect: function(connector) {\n this.connectors.push(connector);\n if (this.node) {\n this.node.markChanged();\n }\n },\n disconnect: function(connector) {\n this.connectors.splice($.inArray(connector, this.connectors), 1);\n if (this.node) {\n this.node.markChanged();\n this.resetMappingIfNeeded();\n }\n },\n redraw: function() {\n $.each(this.connectors, function(_, c) {\n c.redraw();\n });\n },\n destroy: function() {\n $.each(this.connectors.slice(), function(_, c) {\n c.destroy();\n });\n },\n destroyInvalidConnections: function() {\n _.each(this.connectors, function(connector) {\n connector && connector.destroyIfInvalid();\n });\n },\n setMapOver: function(val) {\n if (this.multiple) {\n return; // Cannot set this to be multirun...\n }\n\n if (!this.mapOver().equal(val)) {\n this.terminalMapping.setMapOver(val);\n _.each(this.node.output_terminals, function(outputTerminal) {\n outputTerminal.setMapOver(val);\n });\n }\n },\n mapOver: function() {\n if (!this.terminalMapping) {\n return NULL_COLLECTION_TYPE_DESCRIPTION;\n } else {\n return this.terminalMapping.mapOver;\n }\n },\n isMappedOver: function() {\n return (\n this.terminalMapping && this.terminalMapping.mapOver.isCollection\n );\n },\n resetMapping: function() {\n this.terminalMapping.disableMapOver();\n },\n\n resetMappingIfNeeded: function() {} // Subclasses should override this...\n});\n\nvar OutputTerminal = Terminal.extend({\n initialize: function(attr) {\n Terminal.prototype.initialize.call(this, attr);\n this.datatypes = attr.datatypes;\n },\n\n resetMappingIfNeeded: function() {\n // If inputs were only mapped over to preserve\n // an output just disconnected reset these...\n if (\n !this.node.hasConnectedOutputTerminals() &&\n !this.node.hasConnectedMappedInputTerminals()\n ) {\n _.each(this.node.mappedInputTerminals(), function(mappedInput) {\n mappedInput.resetMappingIfNeeded();\n });\n }\n\n var noMappedInputs = !this.node.hasMappedOverInputTerminals();\n if (noMappedInputs) {\n this.resetMapping();\n }\n },\n\n resetMapping: function() {\n this.terminalMapping.disableMapOver();\n _.each(this.connectors, function(connector) {\n var connectedInput = connector.handle2;\n if (connectedInput) {\n // Not exactly right because this is still connected.\n // Either rewrite resetMappingIfNeeded or disconnect\n // and reconnect if valid.\n connectedInput.resetMappingIfNeeded();\n connector.destroyIfInvalid();\n }\n });\n }\n});\n\nvar BaseInputTerminal = Terminal.extend({\n initialize: function(attr) {\n Terminal.prototype.initialize.call(this, attr);\n this.update(attr.input); // subclasses should implement this...\n },\n canAccept: function(other) {\n if (this._inputFilled()) {\n return false;\n } else {\n return this.attachable(other);\n }\n },\n resetMappingIfNeeded: function() {\n var mapOver = this.mapOver();\n if (!mapOver.isCollection) {\n return;\n }\n // No output terminals are counting on this being mapped\n // over if connected inputs are still mapped over or if none\n // of the outputs are connected...\n var reset =\n this.node.hasConnectedMappedInputTerminals() ||\n !this.node.hasConnectedOutputTerminals();\n if (reset) {\n this.resetMapping();\n }\n },\n resetMapping: function() {\n this.terminalMapping.disableMapOver();\n if (!this.node.hasMappedOverInputTerminals()) {\n _.each(this.node.output_terminals, function(terminal) {\n // This shouldn't be called if there are mapped over\n // outputs.\n terminal.resetMapping();\n });\n }\n },\n connected: function() {\n return this.connectors.length !== 0;\n },\n _inputFilled: function() {\n var inputFilled;\n if (!this.connected()) {\n inputFilled = false;\n } else {\n if (this.multiple) {\n if (this._collectionAttached()) {\n // Can only attach one collection to multiple input\n // data parameter.\n inputsFilled = true;\n } else {\n inputFilled = false;\n }\n } else {\n inputFilled = true;\n }\n }\n return inputFilled;\n },\n _collectionAttached: function() {\n if (!this.connected()) {\n return false;\n } else {\n var firstOutput = this.connectors[0].handle1;\n if (!firstOutput) {\n return false;\n } else {\n if (\n firstOutput.isCollection ||\n firstOutput.isMappedOver() ||\n firstOutput.datatypes.indexOf(\"input_collection\") > 0\n ) {\n return true;\n } else {\n return false;\n }\n }\n }\n },\n _mappingConstraints: function() {\n // If this is a connected terminal, return list of collection types\n // other terminals connected to node are constraining mapping to.\n if (!this.node) {\n return []; // No node - completely unconstrained\n }\n var mapOver = this.mapOver();\n if (mapOver.isCollection) {\n return [mapOver];\n }\n\n var constraints = [];\n if (!this.node.hasConnectedOutputTerminals()) {\n _.each(this.node.connectedMappedInputTerminals(), function(\n inputTerminal\n ) {\n constraints.push(inputTerminal.mapOver());\n });\n } else {\n // All outputs should have same mapOver status - least specific.\n constraints.push(\n _.first(_.values(this.node.output_terminals)).mapOver()\n );\n }\n return constraints;\n },\n _producesAcceptableDatatype: function(other) {\n // other is a non-collection output...\n for (var t in this.datatypes) {\n var thisDatatype = this.datatypes[t];\n if (thisDatatype == \"input\") {\n return true;\n }\n var cat_outputs = new Array();\n cat_outputs = cat_outputs.concat(other.datatypes);\n if (other.node.post_job_actions) {\n for (var pja_i in other.node.post_job_actions) {\n var pja = other.node.post_job_actions[pja_i];\n if (\n pja.action_type == \"ChangeDatatypeAction\" &&\n (pja.output_name == \"\" ||\n pja.output_name == other.name) &&\n pja.action_arguments\n ) {\n cat_outputs.push(pja.action_arguments[\"newtype\"]);\n }\n }\n }\n // FIXME: No idea what to do about case when datatype is 'input'\n for (var other_datatype_i in cat_outputs) {\n var other_datatype = cat_outputs[other_datatype_i];\n if (\n other_datatype == \"input\" ||\n other_datatype == \"_sniff_\" ||\n other_datatype == \"input_collection\" ||\n Globals.app.isSubType(\n cat_outputs[other_datatype_i],\n thisDatatype\n )\n ) {\n return true;\n }\n }\n }\n return false;\n },\n _otherCollectionType: function(other) {\n var otherCollectionType = NULL_COLLECTION_TYPE_DESCRIPTION;\n if (other.isCollection) {\n otherCollectionType = other.collectionType;\n }\n var otherMapOver = other.mapOver();\n if (otherMapOver.isCollection) {\n otherCollectionType = otherMapOver.append(otherCollectionType);\n }\n return otherCollectionType;\n }\n});\n\nvar InputTerminal = BaseInputTerminal.extend({\n update: function(input) {\n this.datatypes = input.extensions;\n this.multiple = input.multiple;\n this.collection = false;\n },\n connect: function(connector) {\n BaseInputTerminal.prototype.connect.call(this, connector);\n var other_output = connector.handle1;\n if (!other_output) {\n return;\n }\n var otherCollectionType = this._otherCollectionType(other_output);\n if (otherCollectionType.isCollection) {\n this.setMapOver(otherCollectionType);\n }\n },\n attachable: function(other) {\n var otherCollectionType = this._otherCollectionType(other);\n var thisMapOver = this.mapOver();\n if (otherCollectionType.isCollection) {\n if (this.multiple) {\n if (this.connected() && !this._collectionAttached()) {\n // if single inputs attached, cannot also attach a\n // collection (yet...)\n return false;\n }\n if (otherCollectionType.rank == 1) {\n return this._producesAcceptableDatatype(other);\n } else {\n // TODO: Allow subcollection mapping over this as if it were\n // a list collection input.\n return false;\n }\n }\n if (\n thisMapOver.isCollection &&\n thisMapOver.canMatch(otherCollectionType)\n ) {\n return this._producesAcceptableDatatype(other);\n } else {\n // Need to check if this would break constraints...\n var mappingConstraints = this._mappingConstraints();\n if (\n mappingConstraints.every(\n _.bind(\n otherCollectionType.canMatch,\n otherCollectionType\n )\n )\n ) {\n return this._producesAcceptableDatatype(other);\n } else {\n return false;\n }\n }\n } else if (thisMapOver.isCollection) {\n // Attempting to match a non-collection output to an\n // explicitly collection input.\n return false;\n }\n return this._producesAcceptableDatatype(other);\n }\n});\n\nvar InputCollectionTerminal = BaseInputTerminal.extend({\n update: function(input) {\n this.multiple = false;\n this.collection = true;\n this.datatypes = input.extensions;\n var collectionTypes = [];\n if (input.collection_types) {\n _.each(input.collection_types, function(collectionType) {\n collectionTypes.push(\n new CollectionTypeDescription(collectionType)\n );\n });\n } else {\n collectionTypes.push(ANY_COLLECTION_TYPE_DESCRIPTION);\n }\n this.collectionTypes = collectionTypes;\n },\n connect: function(connector) {\n BaseInputTerminal.prototype.connect.call(this, connector);\n var other = connector.handle1;\n if (!other) {\n return;\n }\n\n var effectiveMapOver = this._effectiveMapOver(other);\n this.setMapOver(effectiveMapOver);\n },\n _effectiveMapOver: function(other) {\n var collectionTypes = this.collectionTypes;\n var otherCollectionType = this._otherCollectionType(other);\n var canMatch = _.some(collectionTypes, function(collectionType) {\n return collectionType.canMatch(otherCollectionType);\n });\n\n if (!canMatch) {\n for (var collectionTypeIndex in collectionTypes) {\n var collectionType = collectionTypes[collectionTypeIndex];\n if (otherCollectionType.canMapOver(collectionType)) {\n var effectiveMapOver = otherCollectionType.effectiveMapOver(\n collectionType\n );\n if (effectiveMapOver != NULL_COLLECTION_TYPE_DESCRIPTION) {\n return effectiveMapOver;\n }\n }\n }\n }\n return NULL_COLLECTION_TYPE_DESCRIPTION;\n },\n _effectiveCollectionTypes: function() {\n var thisMapOver = this.mapOver();\n return _.map(this.collectionTypes, function(t) {\n return thisMapOver.append(t);\n });\n },\n attachable: function(other) {\n var otherCollectionType = this._otherCollectionType(other);\n if (otherCollectionType.isCollection) {\n var effectiveCollectionTypes = this._effectiveCollectionTypes();\n var thisMapOver = this.mapOver();\n var canMatch = _.some(effectiveCollectionTypes, function(\n effectiveCollectionType\n ) {\n return effectiveCollectionType.canMatch(otherCollectionType);\n });\n if (canMatch) {\n // Only way a direct match...\n return this._producesAcceptableDatatype(other);\n // Otherwise we need to mapOver\n } else if (thisMapOver.isCollection) {\n // In this case, mapOver already set and we didn't match skipping...\n return false;\n } else if (\n _.some(this.collectionTypes, function(collectionType) {\n return otherCollectionType.canMapOver(collectionType);\n })\n ) {\n var effectiveMapOver = this._effectiveMapOver(other);\n if (!effectiveMapOver.isCollection) {\n return false;\n }\n // Need to check if this would break constraints...\n var mappingConstraints = this._mappingConstraints();\n if (mappingConstraints.every(effectiveMapOver.canMatch)) {\n return this._producesAcceptableDatatype(other);\n }\n }\n }\n return false;\n }\n});\n\nvar OutputCollectionTerminal = Terminal.extend({\n initialize: function(attr) {\n Terminal.prototype.initialize.call(this, attr);\n this.datatypes = attr.datatypes;\n if (attr.collection_type) {\n this.collectionType = new CollectionTypeDescription(\n attr.collection_type\n );\n } else {\n var collectionTypeSource = attr.collection_type_source;\n if (!collectionTypeSource) {\n console.log(\n \"Warning: No collection type or collection type source defined.\"\n );\n }\n this.collectionType = ANY_COLLECTION_TYPE_DESCRIPTION;\n }\n this.isCollection = true;\n },\n update: function(output) {\n var newCollectionType;\n if (output.collection_type) {\n newCollectionType = new CollectionTypeDescription(\n output.collection_type\n );\n } else {\n var collectionTypeSource = output.collection_type_source;\n if (!collectionTypeSource) {\n console.log(\n \"Warning: No collection type or collection type source defined.\"\n );\n }\n newCollectionType = ANY_COLLECTION_TYPE_DESCRIPTION;\n }\n\n if (\n newCollectionType.collectionType !=\n this.collectionType.collectionType\n ) {\n _.each(this.connectors, function(connector) {\n // TODO: consider checking if connection valid before removing...\n connector.destroy();\n });\n }\n this.collectionType = newCollectionType;\n }\n});\n\nexport default {\n InputTerminal: InputTerminal,\n OutputTerminal: OutputTerminal,\n InputCollectionTerminal: InputCollectionTerminal,\n OutputCollectionTerminal: OutputCollectionTerminal,\n TerminalMapping: TerminalMapping,\n\n // test export\n CollectionTypeDescription: CollectionTypeDescription,\n NULL_COLLECTION_TYPE_DESCRIPTION: NULL_COLLECTION_TYPE_DESCRIPTION,\n ANY_COLLECTION_TYPE_DESCRIPTION: ANY_COLLECTION_TYPE_DESCRIPTION\n};\n"]}
\ No newline at end of file
+{"version":3,"sources":["mvc/workflow/workflow-terminals.js"],"names":["CollectionTypeDescription","collectionType","this","isCollection","rank","split","length","window","workflow_globals","NULL_COLLECTION_TYPE_DESCRIPTION","canMatch","canMapOver","other","otherCollectionType","toString","ANY_COLLECTION_TYPE_DESCRIPTION","equal","$","extend","prototype","otherCollectionTypeDescription","effectiveMapOver","requiredSuffix","_endsWith","str","suffix","mapOver","substring","TerminalMapping","Backbone","terminal","disableMapOver","setMapOver","collectionTypeDescription","trigger","Model","initialize","attr","element","connectors","terminalMapping","node","Terminal","redraw","c","connect","connector","destroy","push","each","destroyInvalidConnections","_","markChanged","resetMappingIfNeeded","outputTerminal","val","multiple","resetMapping","output_terminals","OutputTerminal","isMappedOver","hasConnectedOutputTerminals","noMappedInputs","call","datatypes","connectedInput","mappedInputTerminals","mappedInput","update","attachable","handle2","destroyIfInvalid","BaseInputTerminal","input","canAccept","hasConnectedMappedInputTerminals","inputFilled","hasMappedOverInputTerminals","connected","_inputFilled","_collectionAttached","inputsFilled","_mappingConstraints","firstOutput","constraints","indexOf","cat_outputs","_otherCollectionType","other_datatype","other_datatype_i","inputTerminal","_producesAcceptableDatatype","otherMapOver","thisDatatype","t","Array","InputTerminal","post_job_actions","extensions","pja_i","pja","action_type","output_name","name","other_output","action_arguments","thisMapOver","app","isSubType","mappingConstraints","append","collection","handle1","collectionTypes","InputCollectionTerminal","collection_types","_effectiveMapOver","OutputCollectionTerminal","some","collectionTypeIndex","collectionTypeSource","collection_type_source","console","newCollectionType","_effectiveCollectionTypes","effectiveCollectionTypes","effectiveCollectionType","every","collection_type","log","output"],"mappings":"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","file":"../../../scripts/mvc/workflow/workflow-terminals.js","sourcesContent":["// TODO; tie into Galaxy state?\nwindow.workflow_globals = window.workflow_globals || {};\nfunction CollectionTypeDescription(collectionType) {\n this.collectionType = collectionType;\n this.isCollection = true;\n this.rank = collectionType.split(\":\").length;\n}\n\nvar NULL_COLLECTION_TYPE_DESCRIPTION = {\n isCollection: false,\n canMatch: function(other) {\n return false;\n },\n canMapOver: function(other) {\n return false;\n },\n toString: function() {\n return \"NullCollectionType[]\";\n },\n append: function(otherCollectionType) {\n return otherCollectionType;\n },\n equal: function(other) {\n return other === this;\n }\n};\n\nvar ANY_COLLECTION_TYPE_DESCRIPTION = {\n isCollection: true,\n canMatch: function(other) {\n return NULL_COLLECTION_TYPE_DESCRIPTION !== other;\n },\n canMapOver: function(other) {\n return false;\n },\n toString: function() {\n return \"AnyCollectionType[]\";\n },\n append: function(otherCollectionType) {\n throw \"Cannot append to ANY_COLLECTION_TYPE_DESCRIPTION\";\n },\n equal: function(other) {\n return other === this;\n }\n};\n\n$.extend(CollectionTypeDescription.prototype, {\n append: function(otherCollectionTypeDescription) {\n if (\n otherCollectionTypeDescription === NULL_COLLECTION_TYPE_DESCRIPTION\n ) {\n return this;\n }\n if (\n otherCollectionTypeDescription === ANY_COLLECTION_TYPE_DESCRIPTION\n ) {\n return otherCollectionType;\n }\n return new CollectionTypeDescription(\n this.collectionType +\n \":\" +\n otherCollectionTypeDescription.collectionType\n );\n },\n canMatch: function(otherCollectionTypeDescription) {\n if (\n otherCollectionTypeDescription === NULL_COLLECTION_TYPE_DESCRIPTION\n ) {\n return false;\n }\n if (\n otherCollectionTypeDescription === ANY_COLLECTION_TYPE_DESCRIPTION\n ) {\n return true;\n }\n return (\n otherCollectionTypeDescription.collectionType == this.collectionType\n );\n },\n canMapOver: function(otherCollectionTypeDescription) {\n if (\n otherCollectionTypeDescription === NULL_COLLECTION_TYPE_DESCRIPTION\n ) {\n return false;\n }\n if (\n otherCollectionTypeDescription === ANY_COLLECTION_TYPE_DESCRIPTION\n ) {\n return false;\n }\n if (this.rank <= otherCollectionTypeDescription.rank) {\n // Cannot map over self...\n return false;\n }\n var requiredSuffix = otherCollectionTypeDescription.collectionType;\n return this._endsWith(this.collectionType, requiredSuffix);\n },\n effectiveMapOver: function(otherCollectionTypeDescription) {\n var otherCollectionType = otherCollectionTypeDescription.collectionType;\n var effectiveCollectionType = this.collectionType.substring(\n 0,\n this.collectionType.length - otherCollectionType.length - 1\n );\n return new CollectionTypeDescription(effectiveCollectionType);\n },\n equal: function(otherCollectionTypeDescription) {\n return (\n otherCollectionTypeDescription.collectionType == this.collectionType\n );\n },\n toString: function() {\n return \"CollectionType[\" + this.collectionType + \"]\";\n },\n _endsWith: function(str, suffix) {\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\n }\n});\n\nvar TerminalMapping = Backbone.Model.extend({\n initialize: function(attr) {\n this.mapOver = attr.mapOver || NULL_COLLECTION_TYPE_DESCRIPTION;\n this.terminal = attr.terminal;\n this.terminal.terminalMapping = this;\n },\n disableMapOver: function() {\n this.setMapOver(NULL_COLLECTION_TYPE_DESCRIPTION);\n },\n setMapOver: function(collectionTypeDescription) {\n // TODO: Can I use \"attributes\" or something to auto trigger \"change\"\n // event?\n this.mapOver = collectionTypeDescription;\n this.trigger(\"change\");\n }\n});\n\nvar Terminal = Backbone.Model.extend({\n initialize: function(attr) {\n this.element = attr.element;\n this.connectors = [];\n },\n connect: function(connector) {\n this.connectors.push(connector);\n if (this.node) {\n this.node.markChanged();\n }\n },\n disconnect: function(connector) {\n this.connectors.splice($.inArray(connector, this.connectors), 1);\n if (this.node) {\n this.node.markChanged();\n this.resetMappingIfNeeded();\n }\n },\n redraw: function() {\n $.each(this.connectors, function(_, c) {\n c.redraw();\n });\n },\n destroy: function() {\n $.each(this.connectors.slice(), function(_, c) {\n c.destroy();\n });\n },\n destroyInvalidConnections: function() {\n _.each(this.connectors, function(connector) {\n connector && connector.destroyIfInvalid();\n });\n },\n setMapOver: function(val) {\n if (this.multiple) {\n return; // Cannot set this to be multirun...\n }\n\n if (!this.mapOver().equal(val)) {\n this.terminalMapping.setMapOver(val);\n _.each(this.node.output_terminals, function(outputTerminal) {\n outputTerminal.setMapOver(val);\n });\n }\n },\n mapOver: function() {\n if (!this.terminalMapping) {\n return NULL_COLLECTION_TYPE_DESCRIPTION;\n } else {\n return this.terminalMapping.mapOver;\n }\n },\n isMappedOver: function() {\n return (\n this.terminalMapping && this.terminalMapping.mapOver.isCollection\n );\n },\n resetMapping: function() {\n this.terminalMapping.disableMapOver();\n },\n\n resetMappingIfNeeded: function() {} // Subclasses should override this...\n});\n\nvar OutputTerminal = Terminal.extend({\n initialize: function(attr) {\n Terminal.prototype.initialize.call(this, attr);\n this.datatypes = attr.datatypes;\n },\n\n resetMappingIfNeeded: function() {\n // If inputs were only mapped over to preserve\n // an output just disconnected reset these...\n if (\n !this.node.hasConnectedOutputTerminals() &&\n !this.node.hasConnectedMappedInputTerminals()\n ) {\n _.each(this.node.mappedInputTerminals(), function(mappedInput) {\n mappedInput.resetMappingIfNeeded();\n });\n }\n\n var noMappedInputs = !this.node.hasMappedOverInputTerminals();\n if (noMappedInputs) {\n this.resetMapping();\n }\n },\n\n resetMapping: function() {\n this.terminalMapping.disableMapOver();\n _.each(this.connectors, function(connector) {\n var connectedInput = connector.handle2;\n if (connectedInput) {\n // Not exactly right because this is still connected.\n // Either rewrite resetMappingIfNeeded or disconnect\n // and reconnect if valid.\n connectedInput.resetMappingIfNeeded();\n connector.destroyIfInvalid();\n }\n });\n }\n});\n\nvar BaseInputTerminal = Terminal.extend({\n initialize: function(attr) {\n Terminal.prototype.initialize.call(this, attr);\n this.update(attr.input); // subclasses should implement this...\n },\n canAccept: function(other) {\n if (this._inputFilled()) {\n return false;\n } else {\n return this.attachable(other);\n }\n },\n resetMappingIfNeeded: function() {\n var mapOver = this.mapOver();\n if (!mapOver.isCollection) {\n return;\n }\n // No output terminals are counting on this being mapped\n // over if connected inputs are still mapped over or if none\n // of the outputs are connected...\n var reset =\n this.node.hasConnectedMappedInputTerminals() ||\n !this.node.hasConnectedOutputTerminals();\n if (reset) {\n this.resetMapping();\n }\n },\n resetMapping: function() {\n this.terminalMapping.disableMapOver();\n if (!this.node.hasMappedOverInputTerminals()) {\n _.each(this.node.output_terminals, function(terminal) {\n // This shouldn't be called if there are mapped over\n // outputs.\n terminal.resetMapping();\n });\n }\n },\n connected: function() {\n return this.connectors.length !== 0;\n },\n _inputFilled: function() {\n var inputFilled;\n if (!this.connected()) {\n inputFilled = false;\n } else {\n if (this.multiple) {\n if (this._collectionAttached()) {\n // Can only attach one collection to multiple input\n // data parameter.\n inputsFilled = true;\n } else {\n inputFilled = false;\n }\n } else {\n inputFilled = true;\n }\n }\n return inputFilled;\n },\n _collectionAttached: function() {\n if (!this.connected()) {\n return false;\n } else {\n var firstOutput = this.connectors[0].handle1;\n if (!firstOutput) {\n return false;\n } else {\n if (\n firstOutput.isCollection ||\n firstOutput.isMappedOver() ||\n firstOutput.datatypes.indexOf(\"input_collection\") > 0\n ) {\n return true;\n } else {\n return false;\n }\n }\n }\n },\n _mappingConstraints: function() {\n // If this is a connected terminal, return list of collection types\n // other terminals connected to node are constraining mapping to.\n if (!this.node) {\n return []; // No node - completely unconstrained\n }\n var mapOver = this.mapOver();\n if (mapOver.isCollection) {\n return [mapOver];\n }\n\n var constraints = [];\n if (!this.node.hasConnectedOutputTerminals()) {\n _.each(this.node.connectedMappedInputTerminals(), function(\n inputTerminal\n ) {\n constraints.push(inputTerminal.mapOver());\n });\n } else {\n // All outputs should have same mapOver status - least specific.\n constraints.push(\n _.first(_.values(this.node.output_terminals)).mapOver()\n );\n }\n return constraints;\n },\n _producesAcceptableDatatype: function(other) {\n // other is a non-collection output...\n for (var t in this.datatypes) {\n var thisDatatype = this.datatypes[t];\n if (thisDatatype == \"input\") {\n return true;\n }\n var cat_outputs = new Array();\n cat_outputs = cat_outputs.concat(other.datatypes);\n if (other.node.post_job_actions) {\n for (var pja_i in other.node.post_job_actions) {\n var pja = other.node.post_job_actions[pja_i];\n if (\n pja.action_type == \"ChangeDatatypeAction\" &&\n (pja.output_name == \"\" ||\n pja.output_name == other.name) &&\n pja.action_arguments\n ) {\n cat_outputs.push(pja.action_arguments[\"newtype\"]);\n }\n }\n }\n // FIXME: No idea what to do about case when datatype is 'input'\n for (var other_datatype_i in cat_outputs) {\n var other_datatype = cat_outputs[other_datatype_i];\n if (\n other_datatype == \"input\" ||\n other_datatype == \"_sniff_\" ||\n other_datatype == \"input_collection\" ||\n window.workflow_globals.app.isSubType(\n cat_outputs[other_datatype_i],\n thisDatatype\n )\n ) {\n return true;\n }\n }\n }\n return false;\n },\n _otherCollectionType: function(other) {\n var otherCollectionType = NULL_COLLECTION_TYPE_DESCRIPTION;\n if (other.isCollection) {\n otherCollectionType = other.collectionType;\n }\n var otherMapOver = other.mapOver();\n if (otherMapOver.isCollection) {\n otherCollectionType = otherMapOver.append(otherCollectionType);\n }\n return otherCollectionType;\n }\n});\n\nvar InputTerminal = BaseInputTerminal.extend({\n update: function(input) {\n this.datatypes = input.extensions;\n this.multiple = input.multiple;\n this.collection = false;\n },\n connect: function(connector) {\n BaseInputTerminal.prototype.connect.call(this, connector);\n var other_output = connector.handle1;\n if (!other_output) {\n return;\n }\n var otherCollectionType = this._otherCollectionType(other_output);\n if (otherCollectionType.isCollection) {\n this.setMapOver(otherCollectionType);\n }\n },\n attachable: function(other) {\n var otherCollectionType = this._otherCollectionType(other);\n var thisMapOver = this.mapOver();\n if (otherCollectionType.isCollection) {\n if (this.multiple) {\n if (this.connected() && !this._collectionAttached()) {\n // if single inputs attached, cannot also attach a\n // collection (yet...)\n return false;\n }\n if (otherCollectionType.rank == 1) {\n return this._producesAcceptableDatatype(other);\n } else {\n // TODO: Allow subcollection mapping over this as if it were\n // a list collection input.\n return false;\n }\n }\n if (\n thisMapOver.isCollection &&\n thisMapOver.canMatch(otherCollectionType)\n ) {\n return this._producesAcceptableDatatype(other);\n } else {\n // Need to check if this would break constraints...\n var mappingConstraints = this._mappingConstraints();\n if (\n mappingConstraints.every(\n _.bind(\n otherCollectionType.canMatch,\n otherCollectionType\n )\n )\n ) {\n return this._producesAcceptableDatatype(other);\n } else {\n return false;\n }\n }\n } else if (thisMapOver.isCollection) {\n // Attempting to match a non-collection output to an\n // explicitly collection input.\n return false;\n }\n return this._producesAcceptableDatatype(other);\n }\n});\n\nvar InputCollectionTerminal = BaseInputTerminal.extend({\n update: function(input) {\n this.multiple = false;\n this.collection = true;\n this.datatypes = input.extensions;\n var collectionTypes = [];\n if (input.collection_types) {\n _.each(input.collection_types, function(collectionType) {\n collectionTypes.push(\n new CollectionTypeDescription(collectionType)\n );\n });\n } else {\n collectionTypes.push(ANY_COLLECTION_TYPE_DESCRIPTION);\n }\n this.collectionTypes = collectionTypes;\n },\n connect: function(connector) {\n BaseInputTerminal.prototype.connect.call(this, connector);\n var other = connector.handle1;\n if (!other) {\n return;\n }\n\n var effectiveMapOver = this._effectiveMapOver(other);\n this.setMapOver(effectiveMapOver);\n },\n _effectiveMapOver: function(other) {\n var collectionTypes = this.collectionTypes;\n var otherCollectionType = this._otherCollectionType(other);\n var canMatch = _.some(collectionTypes, function(collectionType) {\n return collectionType.canMatch(otherCollectionType);\n });\n\n if (!canMatch) {\n for (var collectionTypeIndex in collectionTypes) {\n var collectionType = collectionTypes[collectionTypeIndex];\n if (otherCollectionType.canMapOver(collectionType)) {\n var effectiveMapOver = otherCollectionType.effectiveMapOver(\n collectionType\n );\n if (effectiveMapOver != NULL_COLLECTION_TYPE_DESCRIPTION) {\n return effectiveMapOver;\n }\n }\n }\n }\n return NULL_COLLECTION_TYPE_DESCRIPTION;\n },\n _effectiveCollectionTypes: function() {\n var thisMapOver = this.mapOver();\n return _.map(this.collectionTypes, function(t) {\n return thisMapOver.append(t);\n });\n },\n attachable: function(other) {\n var otherCollectionType = this._otherCollectionType(other);\n if (otherCollectionType.isCollection) {\n var effectiveCollectionTypes = this._effectiveCollectionTypes();\n var thisMapOver = this.mapOver();\n var canMatch = _.some(effectiveCollectionTypes, function(\n effectiveCollectionType\n ) {\n return effectiveCollectionType.canMatch(otherCollectionType);\n });\n if (canMatch) {\n // Only way a direct match...\n return this._producesAcceptableDatatype(other);\n // Otherwise we need to mapOver\n } else if (thisMapOver.isCollection) {\n // In this case, mapOver already set and we didn't match skipping...\n return false;\n } else if (\n _.some(this.collectionTypes, function(collectionType) {\n return otherCollectionType.canMapOver(collectionType);\n })\n ) {\n var effectiveMapOver = this._effectiveMapOver(other);\n if (!effectiveMapOver.isCollection) {\n return false;\n }\n // Need to check if this would break constraints...\n var mappingConstraints = this._mappingConstraints();\n if (mappingConstraints.every(effectiveMapOver.canMatch)) {\n return this._producesAcceptableDatatype(other);\n }\n }\n }\n return false;\n }\n});\n\nvar OutputCollectionTerminal = Terminal.extend({\n initialize: function(attr) {\n Terminal.prototype.initialize.call(this, attr);\n this.datatypes = attr.datatypes;\n if (attr.collection_type) {\n this.collectionType = new CollectionTypeDescription(\n attr.collection_type\n );\n } else {\n var collectionTypeSource = attr.collection_type_source;\n if (!collectionTypeSource) {\n console.log(\n \"Warning: No collection type or collection type source defined.\"\n );\n }\n this.collectionType = ANY_COLLECTION_TYPE_DESCRIPTION;\n }\n this.isCollection = true;\n },\n update: function(output) {\n var newCollectionType;\n if (output.collection_type) {\n newCollectionType = new CollectionTypeDescription(\n output.collection_type\n );\n } else {\n var collectionTypeSource = output.collection_type_source;\n if (!collectionTypeSource) {\n console.log(\n \"Warning: No collection type or collection type source defined.\"\n );\n }\n newCollectionType = ANY_COLLECTION_TYPE_DESCRIPTION;\n }\n\n if (\n newCollectionType.collectionType !=\n this.collectionType.collectionType\n ) {\n _.each(this.connectors, function(connector) {\n // TODO: consider checking if connection valid before removing...\n connector.destroy();\n });\n }\n this.collectionType = newCollectionType;\n }\n});\n\nexport default {\n InputTerminal: InputTerminal,\n OutputTerminal: OutputTerminal,\n InputCollectionTerminal: InputCollectionTerminal,\n OutputCollectionTerminal: OutputCollectionTerminal,\n TerminalMapping: TerminalMapping,\n\n // test export\n CollectionTypeDescription: CollectionTypeDescription,\n NULL_COLLECTION_TYPE_DESCRIPTION: NULL_COLLECTION_TYPE_DESCRIPTION,\n ANY_COLLECTION_TYPE_DESCRIPTION: ANY_COLLECTION_TYPE_DESCRIPTION\n};\n"]}
\ No newline at end of file
diff --git a/static/maps/mvc/workflow/workflow-view-data.js.map b/static/maps/mvc/workflow/workflow-view-data.js.map
index 9f35f391115a..c59169a70b74 100644
--- a/static/maps/mvc/workflow/workflow-view-data.js.map
+++ b/static/maps/mvc/workflow/workflow-view-data.js.map
@@ -1 +1 @@
-{"version":3,"sources":["mvc/workflow/workflow-view-data.js"],"names":["DataInputView","Backbone","View","extend","className","initialize","options","this","input","nodeView","terminalElement","$el","attr","name","html","label","skipResize","css","position","left","append","el","outerWidth","top","display","DataOutputView","$","output","remove","node","extensions","indexOf","join","calloutView","type","OutputCalloutView","isInput","hoverImage","updateMaxWidth","redrawWorkflowOutput","resetImage","tagName","view","outputName","isWorkflowOutput","addWorkflowOutput","Galaxy","root","_workflowGlobals2","default","workflow","has_changes","tooltip","delay","title","margin","show"],"mappings":"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","file":"../../../scripts/mvc/workflow/workflow-view-data.js","sourcesContent":["import Globals from \"mvc/workflow/workflow-globals\";\nvar DataInputView = Backbone.View.extend({\n className: \"form-row dataRow input-data-row\",\n\n initialize: function(options) {\n this.input = options.input;\n this.nodeView = options.nodeView;\n this.terminalElement = options.terminalElement;\n\n this.$el.attr(\"name\", this.input.name).html(this.input.label);\n\n if (!options.skipResize) {\n this.$el.css({\n position: \"absolute\",\n left: -1000,\n top: -1000,\n display: \"none\"\n });\n $(\"body\").append(this.el);\n this.nodeView.updateMaxWidth(this.$el.outerWidth());\n this.$el.css({\n position: \"\",\n left: \"\",\n top: \"\",\n display: \"\"\n });\n this.$el.remove();\n }\n }\n});\n\nvar DataOutputView = Backbone.View.extend({\n className: \"form-row dataRow\",\n\n initialize: function(options) {\n this.output = options.output;\n this.terminalElement = options.terminalElement;\n this.nodeView = options.nodeView;\n\n var output = this.output;\n var label = output.name;\n var node = this.nodeView.node;\n\n var isInput =\n output.extensions.indexOf(\"input\") >= 0 ||\n output.extensions.indexOf(\"input_collection\") >= 0;\n if (!isInput) {\n label = label + \" (\" + output.extensions.join(\", \") + \")\";\n }\n this.$el.html(label);\n this.calloutView = null;\n if ([\"tool\", \"subworkflow\"].indexOf(node.type) >= 0) {\n var calloutView = new OutputCalloutView({\n label: label,\n output: output,\n node: node\n });\n this.calloutView = calloutView;\n this.$el.append(calloutView.el);\n this.$el.hover(\n function() {\n calloutView.hoverImage();\n },\n function() {\n calloutView.resetImage();\n }\n );\n }\n this.$el.css({\n position: \"absolute\",\n left: -1000,\n top: -1000,\n display: \"none\"\n });\n $(\"body\").append(this.el);\n this.nodeView.updateMaxWidth(this.$el.outerWidth() + 17);\n this.$el\n .css({\n position: \"\",\n left: \"\",\n top: \"\",\n display: \"\"\n })\n .detach();\n },\n redrawWorkflowOutput: function() {\n if (this.calloutView) {\n this.calloutView.resetImage();\n }\n }\n});\n\nvar OutputCalloutView = Backbone.View.extend({\n tagName: \"div\",\n\n initialize: function(options) {\n this.label = options.label;\n this.node = options.node;\n this.output = options.output;\n\n var view = this;\n var node = this.node;\n this.$el\n .attr(\"class\", \"callout \" + this.label)\n .css({ display: \"none\" })\n .append(\n $(\"
\").append(\n $(\" \")\n .attr(\n \"src\",\n Galaxy.root +\n \"static/images/fugue/asterisk-small-outline.png\"\n )\n .click(function() {\n var outputName = view.output.name;\n if (node.isWorkflowOutput(outputName)) {\n node.removeWorkflowOutput(outputName);\n view\n .$(\"img\")\n .attr(\n \"src\",\n Galaxy.root +\n \"static/images/fugue/asterisk-small-outline.png\"\n );\n } else {\n node.addWorkflowOutput(outputName);\n view\n .$(\"img\")\n .attr(\n \"src\",\n Galaxy.root +\n \"static/images/fugue/asterisk-small.png\"\n );\n }\n Globals.workflow.has_changes = true;\n Globals.canvas_manager.draw_overview();\n })\n )\n )\n .tooltip({\n delay: 500,\n title:\n \"Mark dataset as a workflow output. All unmarked datasets will be hidden.\"\n });\n\n this.$el.css({\n top: \"50%\",\n margin: \"-8px 0px 0px 0px\",\n right: 8\n });\n this.$el.show();\n this.resetImage();\n },\n\n resetImage: function() {\n if (!this.node.isWorkflowOutput(this.output.name)) {\n this.$(\"img\").attr(\n \"src\",\n Galaxy.root + \"static/images/fugue/asterisk-small-outline.png\"\n );\n } else {\n this.$(\"img\").attr(\n \"src\",\n Galaxy.root + \"static/images/fugue/asterisk-small.png\"\n );\n }\n },\n\n hoverImage: function() {\n this.$(\"img\").attr(\n \"src\",\n Galaxy.root + \"static/images/fugue/asterisk-small-yellow.png\"\n );\n }\n});\n\nexport default {\n DataInputView: DataInputView,\n DataOutputView: DataOutputView\n};\n"]}
\ No newline at end of file
+{"version":3,"sources":["mvc/workflow/workflow-view-data.js"],"names":["window","workflow_globals","DataInputView","Backbone","View","extend","className","initialize","options","input","this","nodeView","$el","attr","name","html","label","position","terminalElement","left","top","display","$","el","outerWidth","DataOutputView","output","node","extensions","indexOf","join","isInput","calloutView","OutputCalloutView","hoverImage","css","append","detach","redrawWorkflowOutput","resetImage","tagName","view","isWorkflowOutput","outputName","removeWorkflowOutput","click","Galaxy","root","addWorkflowOutput","workflow","has_changes","canvas_manager","draw_overview","tooltip","margin","right","show"],"mappings":"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","file":"../../../scripts/mvc/workflow/workflow-view-data.js","sourcesContent":["// TODO; tie into Galaxy state?\nwindow.workflow_globals = window.workflow_globals || {};\n\nvar DataInputView = Backbone.View.extend({\n className: \"form-row dataRow input-data-row\",\n\n initialize: function(options) {\n this.input = options.input;\n this.nodeView = options.nodeView;\n this.terminalElement = options.terminalElement;\n\n this.$el.attr(\"name\", this.input.name).html(this.input.label);\n\n if (!options.skipResize) {\n this.$el.css({\n position: \"absolute\",\n left: -1000,\n top: -1000,\n display: \"none\"\n });\n $(\"body\").append(this.el);\n this.nodeView.updateMaxWidth(this.$el.outerWidth());\n this.$el.css({\n position: \"\",\n left: \"\",\n top: \"\",\n display: \"\"\n });\n this.$el.remove();\n }\n }\n});\n\nvar DataOutputView = Backbone.View.extend({\n className: \"form-row dataRow\",\n\n initialize: function(options) {\n this.output = options.output;\n this.terminalElement = options.terminalElement;\n this.nodeView = options.nodeView;\n\n var output = this.output;\n var label = output.name;\n var node = this.nodeView.node;\n\n var isInput =\n output.extensions.indexOf(\"input\") >= 0 ||\n output.extensions.indexOf(\"input_collection\") >= 0;\n if (!isInput) {\n label = label + \" (\" + output.extensions.join(\", \") + \")\";\n }\n this.$el.html(label);\n this.calloutView = null;\n if ([\"tool\", \"subworkflow\"].indexOf(node.type) >= 0) {\n var calloutView = new OutputCalloutView({\n label: label,\n output: output,\n node: node\n });\n this.calloutView = calloutView;\n this.$el.append(calloutView.el);\n this.$el.hover(\n function() {\n calloutView.hoverImage();\n },\n function() {\n calloutView.resetImage();\n }\n );\n }\n this.$el.css({\n position: \"absolute\",\n left: -1000,\n top: -1000,\n display: \"none\"\n });\n $(\"body\").append(this.el);\n this.nodeView.updateMaxWidth(this.$el.outerWidth() + 17);\n this.$el\n .css({\n position: \"\",\n left: \"\",\n top: \"\",\n display: \"\"\n })\n .detach();\n },\n redrawWorkflowOutput: function() {\n if (this.calloutView) {\n this.calloutView.resetImage();\n }\n }\n});\n\nvar OutputCalloutView = Backbone.View.extend({\n tagName: \"div\",\n\n initialize: function(options) {\n this.label = options.label;\n this.node = options.node;\n this.output = options.output;\n\n var view = this;\n var node = this.node;\n this.$el\n .attr(\"class\", \"callout \" + this.label)\n .css({ display: \"none\" })\n .append(\n $(\"
\").append(\n $(\" \")\n .attr(\n \"src\",\n Galaxy.root +\n \"static/images/fugue/asterisk-small-outline.png\"\n )\n .click(function() {\n var outputName = view.output.name;\n if (node.isWorkflowOutput(outputName)) {\n node.removeWorkflowOutput(outputName);\n view\n .$(\"img\")\n .attr(\n \"src\",\n Galaxy.root +\n \"static/images/fugue/asterisk-small-outline.png\"\n );\n } else {\n node.addWorkflowOutput(outputName);\n view\n .$(\"img\")\n .attr(\n \"src\",\n Galaxy.root +\n \"static/images/fugue/asterisk-small.png\"\n );\n }\n window.workflow_globals.workflow.has_changes = true;\n window.workflow_globals.canvas_manager.draw_overview();\n })\n )\n )\n .tooltip({\n delay: 500,\n title:\n \"Mark dataset as a workflow output. All unmarked datasets will be hidden.\"\n });\n\n this.$el.css({\n top: \"50%\",\n margin: \"-8px 0px 0px 0px\",\n right: 8\n });\n this.$el.show();\n this.resetImage();\n },\n\n resetImage: function() {\n if (!this.node.isWorkflowOutput(this.output.name)) {\n this.$(\"img\").attr(\n \"src\",\n Galaxy.root + \"static/images/fugue/asterisk-small-outline.png\"\n );\n } else {\n this.$(\"img\").attr(\n \"src\",\n Galaxy.root + \"static/images/fugue/asterisk-small.png\"\n );\n }\n },\n\n hoverImage: function() {\n this.$(\"img\").attr(\n \"src\",\n Galaxy.root + \"static/images/fugue/asterisk-small-yellow.png\"\n );\n }\n});\n\nexport default {\n DataInputView: DataInputView,\n DataOutputView: DataOutputView\n};\n"]}
\ No newline at end of file
diff --git a/static/maps/mvc/workflow/workflow-view-terminals.js.map b/static/maps/mvc/workflow/workflow-view-terminals.js.map
index 0237ca9c7722..55eb7c0d6ea5 100644
--- a/static/maps/mvc/workflow/workflow-view-terminals.js.map
+++ b/static/maps/mvc/workflow/workflow-view-terminals.js.map
@@ -1 +1 @@
-{"version":3,"sources":["mvc/workflow/workflow-view-terminals.js"],"names":["TerminalMappingView","Backbone","View","extend","tagName","className","initialize","options","this","$el","tooltip","delay","title","model","bind","_","render","mapOver","isCollection","show","hide","mouseenter","mapText","mouseleave","onMouseEnter","e","terminal","onMouseLeave","css","onClick","InputTerminalMappingView","events","connected","resetMapping","TerminalView","setupMappingView","terminalMapping","terminalMappingClass","terminalMappingView","terminalMappingViewClass","terminalElements","el","BaseInputTerminalView","name","terminalForInput","input","node","input_terminals","drop","hover","onDropInit","d","multiple","drag","dropinit","dropstart","connectors","inner_color","proxy","onDrop","hasClass","_workflowConnector2","default","redraw","onHover","element","onDropEnd","length","display","appendTo","append","$","addClass","click","each","x","destroy","t","remove","top","offset","left","width","InputTerminalView","InputTerminal","InputCollectionTerminalView","InputCollectionTerminal","BaseOutputTerminalView","output","dragstart","onDrag","onmove","po","y","offsetY","_workflowGlobals2","canvas_manager","update_viewport_overlay","onDragStart","test","available","workflow","check_changes_in_active_form","h","c","get","connector","OutputTerminal","dragging","connect","terminalForOutput","type","scroll_panel","OutputTerminalView","_workflowTerminals2","TerminalMapping","OutputCollectionTerminalView","collection_type_source","datatypes","extensions","collection_type","OutputCollectionTerminal"],"mappings":"mRAGIA,EAAsBC,SAASC,KAAKC,QACpCC,QAAS,MACTC,UAAW,gCACXC,WAAY,SAASC,GAEjBC,KAAKC,IAAIC,SAAUC,MAAO,IAAKC,MADjB,yCAEdJ,KAAKK,MAAMC,KAAK,SAAUC,EAAED,KAAKN,KAAKQ,OAAQR,QAElDQ,OAAQ,WACAR,KAAKK,MAAMI,QAAQC,aACnBV,KAAKC,IAAIU,OAETX,KAAKC,IAAIW,UAXjBhB,EAD2CJ,EAAAG,QAE3CE,QACAC,MAAAA,UACIe,WAAIC,eACJC,WAAA,gBAEHC,aAP0C,SAAAC,GAQ3CT,IAAAA,EAAQR,KAAAK,OACJA,EAAIa,SAAWT,aAAQC,EAAcD,QAAAC,cACjCV,KAAAC,IAAKA,IAAIU,QAAT,QAGHQ,aAAA,SAAAF,GACJjB,KAAAC,IAAAmB,IAAA,QAAA,UAkBDC,QAAS,SAASJ,GAflBK,IAAAA,EAAAA,KAAAA,OACAC,EAAQL,SAAAM,aAAAnB,EAAAI,QAAAC,cAEJG,EAAAA,SAAYY,kBAKZC,EAAKrB,SAAMa,KAASM,QAChBG,iBAAK1B,SAAQiB,GAChB,IAAAU,EAAA,IAAA5B,KAAA6B,sBAViDX,SAAAA,IAalDY,EAAsB,IAAA9B,KAAtB+B,0BAbkD1B,MAAAuB,IAgBlDE,EAAYtB,SACZU,EAAKb,oBAAemB,EAChBxB,KAAA8B,oBAAAA,GAEHE,iBAAA,WACJ,OAAAhC,KAAA8B,qBArBL9B,KAAA8B,oBAAAG,GAAAjC,KAAAiC,KAwBIP,KAAejC,OAKXyC,EAAIJ,EAAsBnC,QACtBU,UAAAA,0BADwDP,WAA5D,SAAAC,GAGA+B,IAAAA,EAAAA,EAAAA,KACAZ,EAAAA,EAASY,MACTK,EAAKL,EAAAA,KAV2BZ,EAAAlB,KAAAoC,iBAAAC,GAYpCL,EAAAA,UACIhC,KAAI2B,iBAAKG,GAER9B,KAFDiC,GAAAf,SAEOA,EACHA,EAAAoB,KAAQA,EACXpB,EAAAiB,KAAAA,EACJG,EAAAC,gBAAAJ,GAAAjB,GAkBDK,QAfAW,SAAAA,aACArC,UAAW,cACXC,QAAAA,YACI0C,KAAA,SACAC,MAAA,WAEAC,WAAIxB,SAAAA,EAAWyB,GACf,IAAAzB,EAAKA,KAAS0B,GAAAA,SAGd,OACA1B,EAAAA,EAAAA,MAASoB,SAAOA,oBAChBpB,EAASiB,UAAOA,EAAhBU,KAAA3B,WAGJK,YAAQ,SAAAN,EAAA0B,GACJG,EAAAA,MAAAA,WACAC,EAAAA,MAAAA,SAAWC,WAFP,GAAAC,YAAA,YAKJR,UAAAA,SAAOxB,EAAA0B,GApBiCA,EAAAO,MAAAhC,WAsB5CwB,EAAAA,MAAYxB,SAAA8B,WAAS/B,GAAG0B,YAAG,YAGvBQ,OAAA,SAAAlC,EAAA0B,GACA,IAAAzB,EACQ2B,KAAJZ,GAAUmB,SAGjB,IAAAC,EAAAC,QA9B2CX,EAAAE,KAAA3B,SAAAA,GAAAqC,UAgCxCC,QAAA,WACIb,IAAAA,EAAEO,KAAMhC,GACXA,EAAAuC,EAAAvC,SAELwC,GAAAA,EAAWV,WAAAW,OAAYhB,EAAG,CAElBA,IAAAA,EAAEO,EAAAA,+BACL9B,KAAAwC,QAAA,SAvCuCC,SAAA,QAyCpCC,OACA5C,EAAAA,8BAAJ4C,OACAC,EAAA,UA3CwCC,SAAA,8BA6CnCC,MAAA,WACchC,EAAnBiC,KAAAhD,EAAA8B,WAAA,SAAAzC,EAAA4D,GACuBjD,GACvBiD,EAAAC,YAGcC,EAAAC,aAWehE,KAAA,aAAA,WACJyD,EAJD/D,MAAAsE,WAUZP,EAlBA3C,KAoBRmD,IAAAR,EAAAN,GAAAe,SAAAD,IAAA,EAEKnD,KAAI2C,EAAAN,GAAAe,SAAAC,KAAAJ,EAAAK,QACDH,gBAAgBC,EAAAA,GAAXE,UAEL/D,WAOhBgE,EAAoBzC,EAAsBvC,QAA9CkC,qBAAI8C,EAAAA,QAAoBzC,gBACpBL,yBAAsBP,EACtBS,iBAAAA,SAAAA,GACAK,OAAAA,IAAAA,EAAAA,QAAkBwC,eACdnB,QAAOzD,KAAIiC,GACPwB,MAAAA,OAMRoB,EAA8B3C,EAAsBvC,QAAxDkC,qBAAIgD,EAAAA,QAAAA,gBACAhD,yBAAsBP,EACtBS,iBAAAA,SAAAA,GACAK,OAAAA,IAAAA,EAAAA,QAAkB0C,yBACdrB,QAAOzD,KAAIiC,GACPwB,MAAAA,OAMRsB,EAAyBrD,EAAa/B,QAA1CE,UAAIkF,2BACAlF,WAAAA,SAAWE,GACXD,IAAAA,EAAAA,EAAYwC,KACR0C,EAAI1C,EAAOvC,OACXoC,EAAI6C,EAASjF,KACbmB,EAAW8D,KAAAA,kBAAXA,GACAhF,KAAA2B,iBAAeT,GACflB,KAAAiC,GAAAf,SAAKS,EACLT,EAAKe,KAAGf,EACRA,EAAAA,KAASoB,EACTpB,EAAAA,iBAAgBiB,GAAhBjB,GAEHK,QACDA,KAAAA,SACIsB,UAAM,cACNoC,QAAAA,aAFIC,OAbqC,SAAAjE,EAAA0B,GAkB7CuC,IAAAA,EAAQ,WACJ,IAAIC,EAAAA,EAAAA,EAASjC,OACLkC,eAGAjB,SAHJA,EAIIkB,EAAAA,QAAMC,EAAFb,KACRV,EAAIb,EAAAA,QAAWkC,EAAEX,IACjB9B,EAAAA,EAAAA,OAAAvB,KAAQF,KAASqC,EAAAA,IAAjB8B,IACA1C,EAAAO,MAAAhC,SAAAqC,SAEHgC,EAAAjC,QAVDkC,eAAAC,2BAYA1B,IAGHA,EAlC4C,qBAmC7C2B,IAAAA,GACI3B,aAAA4B,KAAe3B,EAAAA,IAEf0B,YAAA,SAAAzE,EAAA0B,GACAoB,EAAApB,EAAAiD,WAAA5B,SAAA,yBAMAuB,EAAAjC,QAAAuC,SAAAC,+BAEA,IAAAC,EAAIC,EACJA,iEAEAnC,SAAA,qBAlDyCoC,IAAA,GAqDzCF,EAAA7E,SAAIgF,IAAAA,EAAAA,QAAYC,gBAAiBnD,QAAjC+C,IACA,IAAAC,EAAA,IAAA3C,EAAAC,QAGA,OAFA0C,EAAAI,UAAA,EACAJ,EAAAK,QAAArG,KAAAiC,GAAAf,SAAA6E,EAAA7E,UACA6E,GAEIG,UAAAA,SAAAA,EAAU9B,GACb,IAAA8B,EAAAvD,EAAAO,MAAAhC,SAAA8B,WAAA,GA5DTkD,GA2DYA,EAAU9B,UAWlBvC,EAAAA,EAAAA,OAAAA,SACAE,EAAAA,EAAAA,WAAAA,YAA0BvC,yBAC1B8G,EAAAA,qBACIL,IAAIM,GACJC,aAAItF,UAIJuF,EAAOvF,EAAPvB,QACHkC,qBAAA6E,EAAApD,QAAAqD,gBAVkD5E,yBAAvDvC,EAGI8G,kBAAmB,SAAStB,GAU5B4B,IAAAA,EAAAA,EAAAA,WAKI,OAJJ/E,IAAAA,EAAAA,QAAsBsE,gBACtBpE,QAAAA,KAAAA,GACAuE,UAAAA,OAMQO,EAAAA,EAAwBA,QACxBC,qBAAAA,EAAAA,QAAkBC,gBAJgChF,yBAAtDvC,EAMA8G,kBAAOpF,SAAP8D,GACH,IAAAgC,EAAAhC,EAAAgC,gBAbLH,EAAA7B,EAAA6B,uBAYQ,OANe,IAAIH,EAAApD,QAAU2D,0BACzBxD,QAASzD,KASNiC,GACX0C,gBAAmBA,EACnB8B,uBAAoBA,EACpB5B,UAAAA,EAAAA,2BAFAF,kBAAmBA,EACnB8B,mBAAoBA,EACpB5B,4BAA6BA,EAC7B+B,6BAA8BA","file":"../../../scripts/mvc/workflow/workflow-view-terminals.js","sourcesContent":["import Globals from \"mvc/workflow/workflow-globals\";\nimport Terminals from \"mvc/workflow/workflow-terminals\";\nimport Connector from \"mvc/workflow/workflow-connector\";\nvar TerminalMappingView = Backbone.View.extend({\n tagName: \"div\",\n className: \"fa-icon-button fa fa-folder-o\",\n initialize: function(options) {\n var mapText = \"Run tool in parallel over collection\";\n this.$el.tooltip({ delay: 500, title: mapText });\n this.model.bind(\"change\", _.bind(this.render, this));\n },\n render: function() {\n if (this.model.mapOver.isCollection) {\n this.$el.show();\n } else {\n this.$el.hide();\n }\n }\n});\n\nvar InputTerminalMappingView = TerminalMappingView.extend({\n events: {\n click: \"onClick\",\n mouseenter: \"onMouseEnter\",\n mouseleave: \"onMouseLeave\"\n },\n onMouseEnter: function(e) {\n var model = this.model;\n if (!model.terminal.connected() && model.mapOver.isCollection) {\n this.$el.css(\"color\", \"red\");\n }\n },\n onMouseLeave: function(e) {\n this.$el.css(\"color\", \"black\");\n },\n onClick: function(e) {\n var model = this.model;\n if (!model.terminal.connected() && model.mapOver.isCollection) {\n // TODO: Consider prompting...\n model.terminal.resetMapping();\n }\n }\n});\n\nvar TerminalView = Backbone.View.extend({\n setupMappingView: function(terminal) {\n var terminalMapping = new this.terminalMappingClass({\n terminal: terminal\n });\n var terminalMappingView = new this.terminalMappingViewClass({\n model: terminalMapping\n });\n terminalMappingView.render();\n terminal.terminalMappingView = terminalMappingView;\n this.terminalMappingView = terminalMappingView;\n },\n terminalElements: function() {\n if (this.terminalMappingView) {\n return [this.terminalMappingView.el, this.el];\n } else {\n return [this.el];\n }\n }\n});\n\nvar BaseInputTerminalView = TerminalView.extend({\n className: \"terminal input-terminal\",\n initialize: function(options) {\n var node = options.node;\n var input = options.input;\n var name = input.name;\n var terminal = this.terminalForInput(input);\n if (!terminal.multiple) {\n this.setupMappingView(terminal);\n }\n this.el.terminal = terminal;\n terminal.node = node;\n terminal.name = name;\n node.input_terminals[name] = terminal;\n },\n events: {\n dropinit: \"onDropInit\",\n dropstart: \"onDropStart\",\n dropend: \"onDropEnd\",\n drop: \"onDrop\",\n hover: \"onHover\"\n },\n onDropInit: function(e, d) {\n var terminal = this.el.terminal;\n // Accept a dragable if it is an output terminal and has a\n // compatible type\n return (\n $(d.drag).hasClass(\"output-terminal\") &&\n terminal.canAccept(d.drag.terminal)\n );\n },\n onDropStart: function(e, d) {\n if (d.proxy.terminal) {\n d.proxy.terminal.connectors[0].inner_color = \"#BBFFBB\";\n }\n },\n onDropEnd: function(e, d) {\n if (d.proxy.terminal) {\n d.proxy.terminal.connectors[0].inner_color = \"#FFFFFF\";\n }\n },\n onDrop: function(e, d) {\n var terminal = this.el.terminal;\n new Connector(d.drag.terminal, terminal).redraw();\n },\n onHover: function() {\n var element = this.el;\n var terminal = element.terminal;\n // If connected, create a popup to allow disconnection\n if (terminal.connectors.length > 0) {\n // Create callout\n var t = $(\"
\")\n .css({ display: \"none\" })\n .appendTo(\"body\")\n .append(\n $(\"
\").append(\n $(\"
\")\n .addClass(\"fa-icon-button fa fa-times\")\n .click(function() {\n $.each(terminal.connectors, function(_, x) {\n if (x) {\n x.destroy();\n }\n });\n t.remove();\n })\n )\n )\n .bind(\"mouseleave\", function() {\n $(this).remove();\n });\n // Position it and show\n t\n .css({\n top: $(element).offset().top - 2,\n left: $(element).offset().left - t.width(),\n \"padding-right\": $(element).width()\n })\n .show();\n }\n }\n});\n\nvar InputTerminalView = BaseInputTerminalView.extend({\n terminalMappingClass: Terminals.TerminalMapping,\n terminalMappingViewClass: InputTerminalMappingView,\n terminalForInput: function(input) {\n return new Terminals.InputTerminal({\n element: this.el,\n input: input\n });\n }\n});\n\nvar InputCollectionTerminalView = BaseInputTerminalView.extend({\n terminalMappingClass: Terminals.TerminalMapping,\n terminalMappingViewClass: InputTerminalMappingView,\n terminalForInput: function(input) {\n return new Terminals.InputCollectionTerminal({\n element: this.el,\n input: input\n });\n }\n});\n\nvar BaseOutputTerminalView = TerminalView.extend({\n className: \"terminal output-terminal\",\n initialize: function(options) {\n var node = options.node;\n var output = options.output;\n var name = output.name;\n var terminal = this.terminalForOutput(output);\n this.setupMappingView(terminal);\n this.el.terminal = terminal;\n terminal.node = node;\n terminal.name = name;\n node.output_terminals[name] = terminal;\n },\n events: {\n drag: \"onDrag\",\n dragstart: \"onDragStart\",\n dragend: \"onDragEnd\"\n },\n onDrag: function(e, d) {\n var onmove = function() {\n var po = $(d.proxy)\n .offsetParent()\n .offset(),\n x = d.offsetX - po.left,\n y = d.offsetY - po.top;\n $(d.proxy).css({ left: x, top: y });\n d.proxy.terminal.redraw();\n // FIXME: global\n Globals.canvas_manager.update_viewport_overlay();\n };\n onmove();\n $(\"#canvas-container\")\n .get(0)\n .scroll_panel.test(e, onmove);\n },\n onDragStart: function(e, d) {\n $(d.available).addClass(\"input-terminal-active\");\n // Save PJAs in the case of change datatype actions.\n Globals.workflow.check_changes_in_active_form();\n // Drag proxy div\n var h = $(\n '
'\n )\n .appendTo(\"#canvas-container\")\n .get(0);\n // Terminal and connection to display noodle while dragging\n h.terminal = new Terminals.OutputTerminal({ element: h });\n var c = new Connector();\n c.dragging = true;\n c.connect(this.el.terminal, h.terminal);\n return h;\n },\n onDragEnd: function(e, d) {\n var connector = d.proxy.terminal.connectors[0];\n // check_changes_in_active_form may change the state and cause a\n // the connection to have already been destroyed. There must be better\n // ways to handle this but the following check fixes some serious GUI\n // bugs for now.\n if (connector) {\n connector.destroy();\n }\n $(d.proxy).remove();\n $(d.available).removeClass(\"input-terminal-active\");\n $(\"#canvas-container\")\n .get(0)\n .scroll_panel.stop();\n }\n});\n\nvar OutputTerminalView = BaseOutputTerminalView.extend({\n terminalMappingClass: Terminals.TerminalMapping,\n terminalMappingViewClass: TerminalMappingView,\n terminalForOutput: function(output) {\n var type = output.extensions;\n var terminal = new Terminals.OutputTerminal({\n element: this.el,\n datatypes: type\n });\n return terminal;\n }\n});\n\nvar OutputCollectionTerminalView = BaseOutputTerminalView.extend({\n terminalMappingClass: Terminals.TerminalMapping,\n terminalMappingViewClass: TerminalMappingView,\n terminalForOutput: function(output) {\n var collection_type = output.collection_type;\n var collection_type_source = output.collection_type_source;\n var terminal = new Terminals.OutputCollectionTerminal({\n element: this.el,\n collection_type: collection_type,\n collection_type_source: collection_type_source,\n datatypes: output.extensions\n });\n return terminal;\n }\n});\n\nexport default {\n InputTerminalView: InputTerminalView,\n OutputTerminalView: OutputTerminalView,\n InputCollectionTerminalView: InputCollectionTerminalView,\n OutputCollectionTerminalView: OutputCollectionTerminalView\n};\n"]}
\ No newline at end of file
+{"version":3,"sources":["mvc/workflow/workflow-view-terminals.js"],"names":["window","workflow_globals","TerminalMappingView","Backbone","View","extend","tagName","className","initialize","options","this","$el","tooltip","delay","title","model","bind","_","render","mapOver","isCollection","show","events","click","mouseenter","mouseleave","onMouseEnter","terminal","connected","hide","onMouseLeave","e","css","resetMapping","TerminalView","setupMappingView","terminalMappingClass","onClick","terminalMappingViewClass","terminalMappingView","terminalElements","el","terminalMapping","BaseInputTerminalView","node","input","multiple","name","input_terminals","dropstart","dropend","drop","hover","onDropInit","canAccept","d","drag","connectors","inner_color","proxy","onDrop","onDropStart","_workflowConnector2","default","redraw","onHover","element","onDropEnd","length","t","$","display","append","addClass","each","x","destroy","remove","top","offset","left","width","padding-right","InputTerminalMappingView","terminalForInput","InputTerminal","InputCollectionTerminal","output","output_terminals","dragstart","dragend","onDrag","onmove","po","y","offsetY","canvas_manager","get","scroll_panel","onDragStart","h","available","workflow","check_changes_in_active_form","c","connect","onDragEnd","connector","_workflowTerminals2","OutputTerminal","dragging","removeClass","OutputTerminalView","terminalForOutput","extensions","datatypes","BaseOutputTerminalView","TerminalMapping","OutputCollectionTerminalView","collection_type","collection_type_source","InputTerminalView","InputCollectionTerminalView"],"mappings":"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","file":"../../../scripts/mvc/workflow/workflow-view-terminals.js","sourcesContent":["import Terminals from \"mvc/workflow/workflow-terminals\";\nimport Connector from \"mvc/workflow/workflow-connector\";\n\n// TODO; tie into Galaxy state?\nwindow.workflow_globals = window.workflow_globals || {};\n\nvar TerminalMappingView = Backbone.View.extend({\n tagName: \"div\",\n className: \"fa-icon-button fa fa-folder-o\",\n initialize: function(options) {\n var mapText = \"Run tool in parallel over collection\";\n this.$el.tooltip({ delay: 500, title: mapText });\n this.model.bind(\"change\", _.bind(this.render, this));\n },\n render: function() {\n if (this.model.mapOver.isCollection) {\n this.$el.show();\n } else {\n this.$el.hide();\n }\n }\n});\n\nvar InputTerminalMappingView = TerminalMappingView.extend({\n events: {\n click: \"onClick\",\n mouseenter: \"onMouseEnter\",\n mouseleave: \"onMouseLeave\"\n },\n onMouseEnter: function(e) {\n var model = this.model;\n if (!model.terminal.connected() && model.mapOver.isCollection) {\n this.$el.css(\"color\", \"red\");\n }\n },\n onMouseLeave: function(e) {\n this.$el.css(\"color\", \"black\");\n },\n onClick: function(e) {\n var model = this.model;\n if (!model.terminal.connected() && model.mapOver.isCollection) {\n // TODO: Consider prompting...\n model.terminal.resetMapping();\n }\n }\n});\n\nvar TerminalView = Backbone.View.extend({\n setupMappingView: function(terminal) {\n var terminalMapping = new this.terminalMappingClass({\n terminal: terminal\n });\n var terminalMappingView = new this.terminalMappingViewClass({\n model: terminalMapping\n });\n terminalMappingView.render();\n terminal.terminalMappingView = terminalMappingView;\n this.terminalMappingView = terminalMappingView;\n },\n terminalElements: function() {\n if (this.terminalMappingView) {\n return [this.terminalMappingView.el, this.el];\n } else {\n return [this.el];\n }\n }\n});\n\nvar BaseInputTerminalView = TerminalView.extend({\n className: \"terminal input-terminal\",\n initialize: function(options) {\n var node = options.node;\n var input = options.input;\n var name = input.name;\n var terminal = this.terminalForInput(input);\n if (!terminal.multiple) {\n this.setupMappingView(terminal);\n }\n this.el.terminal = terminal;\n terminal.node = node;\n terminal.name = name;\n node.input_terminals[name] = terminal;\n },\n events: {\n dropinit: \"onDropInit\",\n dropstart: \"onDropStart\",\n dropend: \"onDropEnd\",\n drop: \"onDrop\",\n hover: \"onHover\"\n },\n onDropInit: function(e, d) {\n var terminal = this.el.terminal;\n // Accept a dragable if it is an output terminal and has a\n // compatible type\n return (\n $(d.drag).hasClass(\"output-terminal\") &&\n terminal.canAccept(d.drag.terminal)\n );\n },\n onDropStart: function(e, d) {\n if (d.proxy.terminal) {\n d.proxy.terminal.connectors[0].inner_color = \"#BBFFBB\";\n }\n },\n onDropEnd: function(e, d) {\n if (d.proxy.terminal) {\n d.proxy.terminal.connectors[0].inner_color = \"#FFFFFF\";\n }\n },\n onDrop: function(e, d) {\n var terminal = this.el.terminal;\n new Connector(d.drag.terminal, terminal).redraw();\n },\n onHover: function() {\n var element = this.el;\n var terminal = element.terminal;\n // If connected, create a popup to allow disconnection\n if (terminal.connectors.length > 0) {\n // Create callout\n var t = $(\"
\")\n .css({ display: \"none\" })\n .appendTo(\"body\")\n .append(\n $(\"
\").append(\n $(\"
\")\n .addClass(\"fa-icon-button fa fa-times\")\n .click(function() {\n $.each(terminal.connectors, function(_, x) {\n if (x) {\n x.destroy();\n }\n });\n t.remove();\n })\n )\n )\n .bind(\"mouseleave\", function() {\n $(this).remove();\n });\n // Position it and show\n t\n .css({\n top: $(element).offset().top - 2,\n left: $(element).offset().left - t.width(),\n \"padding-right\": $(element).width()\n })\n .show();\n }\n }\n});\n\nvar InputTerminalView = BaseInputTerminalView.extend({\n terminalMappingClass: Terminals.TerminalMapping,\n terminalMappingViewClass: InputTerminalMappingView,\n terminalForInput: function(input) {\n return new Terminals.InputTerminal({\n element: this.el,\n input: input\n });\n }\n});\n\nvar InputCollectionTerminalView = BaseInputTerminalView.extend({\n terminalMappingClass: Terminals.TerminalMapping,\n terminalMappingViewClass: InputTerminalMappingView,\n terminalForInput: function(input) {\n return new Terminals.InputCollectionTerminal({\n element: this.el,\n input: input\n });\n }\n});\n\nvar BaseOutputTerminalView = TerminalView.extend({\n className: \"terminal output-terminal\",\n initialize: function(options) {\n var node = options.node;\n var output = options.output;\n var name = output.name;\n var terminal = this.terminalForOutput(output);\n this.setupMappingView(terminal);\n this.el.terminal = terminal;\n terminal.node = node;\n terminal.name = name;\n node.output_terminals[name] = terminal;\n },\n events: {\n drag: \"onDrag\",\n dragstart: \"onDragStart\",\n dragend: \"onDragEnd\"\n },\n onDrag: function(e, d) {\n var onmove = function() {\n var po = $(d.proxy)\n .offsetParent()\n .offset(),\n x = d.offsetX - po.left,\n y = d.offsetY - po.top;\n $(d.proxy).css({ left: x, top: y });\n d.proxy.terminal.redraw();\n // FIXME: global\n window.workflow_globals.canvas_manager.update_viewport_overlay();\n };\n onmove();\n $(\"#canvas-container\")\n .get(0)\n .scroll_panel.test(e, onmove);\n },\n onDragStart: function(e, d) {\n $(d.available).addClass(\"input-terminal-active\");\n // Save PJAs in the case of change datatype actions.\n window.workflow_globals.workflow.check_changes_in_active_form();\n // Drag proxy div\n var h = $(\n '
'\n )\n .appendTo(\"#canvas-container\")\n .get(0);\n // Terminal and connection to display noodle while dragging\n h.terminal = new Terminals.OutputTerminal({ element: h });\n var c = new Connector();\n c.dragging = true;\n c.connect(this.el.terminal, h.terminal);\n return h;\n },\n onDragEnd: function(e, d) {\n var connector = d.proxy.terminal.connectors[0];\n // check_changes_in_active_form may change the state and cause a\n // the connection to have already been destroyed. There must be better\n // ways to handle this but the following check fixes some serious GUI\n // bugs for now.\n if (connector) {\n connector.destroy();\n }\n $(d.proxy).remove();\n $(d.available).removeClass(\"input-terminal-active\");\n $(\"#canvas-container\")\n .get(0)\n .scroll_panel.stop();\n }\n});\n\nvar OutputTerminalView = BaseOutputTerminalView.extend({\n terminalMappingClass: Terminals.TerminalMapping,\n terminalMappingViewClass: TerminalMappingView,\n terminalForOutput: function(output) {\n var type = output.extensions;\n var terminal = new Terminals.OutputTerminal({\n element: this.el,\n datatypes: type\n });\n return terminal;\n }\n});\n\nvar OutputCollectionTerminalView = BaseOutputTerminalView.extend({\n terminalMappingClass: Terminals.TerminalMapping,\n terminalMappingViewClass: TerminalMappingView,\n terminalForOutput: function(output) {\n var collection_type = output.collection_type;\n var collection_type_source = output.collection_type_source;\n var terminal = new Terminals.OutputCollectionTerminal({\n element: this.el,\n collection_type: collection_type,\n collection_type_source: collection_type_source,\n datatypes: output.extensions\n });\n return terminal;\n }\n});\n\nexport default {\n InputTerminalView: InputTerminalView,\n OutputTerminalView: OutputTerminalView,\n InputCollectionTerminalView: InputCollectionTerminalView,\n OutputCollectionTerminalView: OutputCollectionTerminalView\n};\n"]}
\ No newline at end of file
diff --git a/static/maps/mvc/workflow/workflow-view.js.map b/static/maps/mvc/workflow/workflow-view.js.map
index e033cd7a0e5a..81b20d2e6785 100644
--- a/static/maps/mvc/workflow/workflow-view.js.map
+++ b/static/maps/mvc/workflow/workflow-view.js.map
@@ -1 +1 @@
-{"version":3,"sources":["mvc/workflow/workflow-view.js"],"names":["reset_tool_search","initValue","tool_menu_frame","$","contents","length","document","this","removeClass","find","hide","show","each","attr","hasClass","val","nodeType","addClass","iconStyle","$to_el","before","$icon","Backbone","View","extend","initialize","options","self","jStorage","set","css","Galaxy","buttons","Cancel","urls","save_current_workflow","eventObj","has_changes","window","show_message","do_close","hide_modal","workflow","rectify_workflow_outputs","_utils2","default","request","url","root","id","type","location","success","data","body","text","message","check_changes_in_active_form","i","v","success_callback","append","errlist","name","show_modal","focus","select","value","lastValue","timer","setTimeout","get","tool_search","q","s","map","n","index","parent","this_label","next","no_visible_tools","datatypes","JSON","parse","canvas_manager","_workflowGlobals2","_workflowCanvas2","reset","ajax","_workflowLoadAjax","scroll_to_nodes","async","_","ext_to_type","datatypes_mapping","ext_to_class_name","upgrade_messages","details","upgrade_message","from_simple","showWorkflowParameters","steps","step","step_id","beforeSubmit","errors","m","make_popupmenu","parseInt","clear_active_node","close_editor","workflow_save_as","rename_name","Continue","rename_annotation","workflow_name","workflow_data","stringify","Save As","output_terminals","OK","new_content","node_id","workflowNode","output_name","workflow_annotation","addWorkflowOutput","removeWorkflowOutput","done","onbeforeunload","undefined","layout_editor","layout","alert","width","Auto Re-layout","last_expanded","draw_overview","Close","search_input","workflow_index","add_node_icon","overview_size","height","hide_overview","show_overview","bind","e","d","$section","offsetParent","op","new_size","max","copy","offsetX","opo","left","icon","offsetY","top","tooltip","click","copy_into_workflow","is","slideUp","_asyncSaveText2","rename_async","cv","_buildToolPanelWorkflows","workflows","_uiMisc2","ButtonIcon","request_data","node","init_field_data","update_field_data","modal","title","create_node","Copy","add_node_for_module","_moduleInitAjax","on","add_node_for_subworkflow","latest_id","get_pja_form","action_to_rem","closest","$add","active_node","workflowId","display_file_list","out_terminal","addlist","k","action_type","post_job_actions","nodes","vv","target","new_pja","display_pja","workflow_parameters","wf_parm_container","form_matches","matches","cc","arg_matches","merge","load_workflow","new_parameter_content","html","wf_parm_box","showAttributes","activate_node","add_node_for_tool","content","$container","$el","emit","content_id","isSubType","pja","prebuildNode","$f","scrollLeft","tmp","active_form_has_changes","o","offset","parameter_re","config_form","inputs","deepeach","match","concat","action_arguments","action_argument","element","inArray","push","substring","showForm","cls","_workflowIcons2","form_type","_workflowForms2","form","debug","scrollTop","child","type_to_type","title_text","$title","_workflowNode2","destroy","appendTo","position","p","prependTo","node_changed","fit_canvas_to_nodes","po","x","y","terminal","redraw"],"mappings":"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","file":"../../../scripts/mvc/workflow/workflow-view.js","sourcesContent":["import Utils from \"utils/utils\";\nimport Globals from \"mvc/workflow/workflow-globals\";\nimport Workflow from \"mvc/workflow/workflow-manager\";\nimport WorkflowCanvas from \"mvc/workflow/workflow-canvas\";\nimport Node from \"mvc/workflow/workflow-node\";\nimport WorkflowIcons from \"mvc/workflow/workflow-icons\";\nimport FormWrappers from \"mvc/workflow/workflow-forms\";\nimport Ui from \"mvc/ui/ui-misc\";\nimport async_save_text from \"utils/async-save-text\";\nimport Toastr from \"libs/toastr\";\nimport \"ui/editable-text\";\n// Reset tool search to start state.\nfunction reset_tool_search(initValue) {\n // Function may be called in top frame or in tool_menu_frame;\n // in either case, get the tool menu frame.\n var tool_menu_frame = $(\"#galaxy_tools\").contents();\n if (tool_menu_frame.length === 0) {\n tool_menu_frame = $(document);\n // Remove classes that indicate searching is active.\n $(this).removeClass(\"search_active\");\n tool_menu_frame.find(\".toolTitle\").removeClass(\"search_match\");\n\n // Reset visibility of tools and labels.\n tool_menu_frame.find(\".toolSectionBody\").hide();\n tool_menu_frame.find(\".toolTitle\").show();\n tool_menu_frame.find(\".toolPanelLabel\").show();\n tool_menu_frame.find(\".toolSectionWrapper\").each(function() {\n if ($(this).attr(\"id\") !== \"recently_used_wrapper\") {\n // Default action.\n $(this).show();\n } else if ($(this).hasClass(\"user_pref_visible\")) {\n $(this).show();\n }\n });\n tool_menu_frame.find(\"#search-no-results\").hide();\n\n // Reset search input.\n tool_menu_frame.find(\"#search-spinner\").hide();\n if (initValue) {\n var search_input = tool_menu_frame.find(\"#tool-search-query\");\n search_input.val(\"search tools\");\n }\n }\n}\n\nfunction add_node_icon($to_el, nodeType) {\n var iconStyle = WorkflowIcons[nodeType];\n if (iconStyle) {\n var $icon = $(' ').addClass(iconStyle);\n $to_el.before($icon);\n }\n}\n\n// create form view\nexport default Backbone.View.extend({\n initialize: function(options) {\n var self = (Globals.app = this);\n this.options = options;\n this.urls = (options && options.urls) || {};\n var close_editor = function() {\n self.workflow.check_changes_in_active_form();\n if (workflow && self.workflow.has_changes) {\n var do_close = function() {\n window.onbeforeunload = undefined;\n window.document.location = self.urls.workflow_index;\n };\n window.show_modal(\n \"Close workflow editor\",\n \"There are unsaved changes to your workflow which will be lost.\",\n {\n Cancel: hide_modal,\n \"Save Changes\": function() {\n save_current_workflow(null, do_close);\n }\n },\n {\n \"Don't Save\": do_close\n }\n );\n } else {\n window.document.location = self.urls.workflow_index;\n }\n };\n var save_current_workflow = function(eventObj, success_callback) {\n show_message(\"Saving workflow\", \"progress\");\n self.workflow.check_changes_in_active_form();\n if (!self.workflow.has_changes) {\n hide_modal();\n if (success_callback) {\n success_callback();\n }\n return;\n }\n self.workflow.rectify_workflow_outputs();\n Utils.request({\n url: Galaxy.root + \"api/workflows/\" + self.options.id,\n type: \"PUT\",\n data: { workflow: self.workflow.to_simple() },\n success: function(data) {\n var body = $(\"
\").text(data.message);\n if (data.errors) {\n body.addClass(\"warningmark\");\n var errlist = $(\"\");\n $.each(data.errors, function(i, v) {\n $(\" \")\n .text(v)\n .appendTo(errlist);\n });\n body.append(errlist);\n } else {\n body.addClass(\"donemark\");\n }\n self.workflow.name = data.name;\n self.workflow.has_changes = false;\n self.workflow.stored = true;\n self.showWorkflowParameters();\n if (data.errors) {\n window.show_modal(\"Saving workflow\", body, {\n Ok: hide_modal\n });\n } else {\n success_callback && success_callback();\n hide_modal();\n }\n },\n error: function(response) {\n window.show_modal(\n \"Saving workflow failed.\",\n response.err_msg,\n { Ok: hide_modal }\n );\n }\n });\n };\n\n // Init searching.\n $(\"#tool-search-query\")\n .click(function() {\n $(this).focus();\n $(this).select();\n })\n .keyup(function() {\n // Remove italics.\n $(this).css(\"font-style\", \"normal\");\n // Don't update if same value as last time\n if (this.value.length < 3) {\n reset_tool_search(false);\n } else if (this.value != this.lastValue) {\n // Add class to denote that searching is active.\n $(this).addClass(\"search_active\");\n // input.addClass(config.loadingClass);\n // Add '*' to facilitate partial matching.\n var q = this.value;\n // Stop previous ajax-request\n if (this.timer) {\n clearTimeout(this.timer);\n }\n // Start a new ajax-request in X ms\n $(\"#search-spinner\").show();\n this.timer = setTimeout(function() {\n $.get(\n self.urls.tool_search,\n { q: q },\n function(data) {\n // input.removeClass(config.loadingClass);\n // Show live-search if results and search-term aren't empty\n $(\"#search-no-results\").hide();\n // Hide all tool sections.\n $(\".toolSectionWrapper\").hide();\n // This hides all tools but not workflows link (which is in a .toolTitle div).\n $(\".toolSectionWrapper\")\n .find(\".toolTitle\")\n .hide();\n if (data.length != 0) {\n // Map tool ids to element ids and join them.\n var s = $.map(data, function(n, i) {\n return \"link-\" + n;\n });\n // First pass to show matching tools and their parents.\n $(s).each(function(index, id) {\n // Add class to denote match.\n $(\"[id='\" + id + \"']\")\n .parent()\n .addClass(\"search_match\");\n $(\"[id='\" + id + \"']\")\n .parent()\n .show()\n .parent()\n .parent()\n .show()\n .parent()\n .show();\n });\n // Hide labels that have no visible children.\n $(\".toolPanelLabel\").each(function() {\n var this_label = $(this);\n var next = this_label.next();\n var no_visible_tools = true;\n // Look through tools following label and, if none are visible, hide label.\n while (\n next.length !== 0 &&\n next.hasClass(\"toolTitle\")\n ) {\n if (next.is(\":visible\")) {\n no_visible_tools = false;\n break;\n } else {\n next = next.next();\n }\n }\n if (no_visible_tools) {\n this_label.hide();\n }\n });\n } else {\n $(\"#search-no-results\").show();\n }\n $(\"#search-spinner\").hide();\n },\n \"json\"\n );\n }, 400);\n }\n this.lastValue = this.value;\n });\n\n // Canvas overview management\n this.canvas_manager = Globals.canvas_manager = new WorkflowCanvas(\n this,\n $(\"#canvas-viewport\"),\n $(\"#overview\")\n );\n\n // Initialize workflow state\n this.reset();\n\n // get available datatypes for post job action options\n this.datatypes = JSON.parse(\n $.ajax({\n url: Galaxy.root + \"api/datatypes\",\n async: false\n }).responseText\n );\n\n // get datatype mapping options\n this.datatypes_mapping = JSON.parse(\n $.ajax({\n url: Galaxy.root + \"api/datatypes/mapping\",\n async: false\n }).responseText\n );\n\n // set mapping sub lists\n this.ext_to_type = this.datatypes_mapping.ext_to_class_name;\n this.type_to_type = this.datatypes_mapping.class_to_classes;\n\n // Load workflow definition\n this._workflowLoadAjax(self.options.id, {\n success: function(data) {\n self.reset();\n self.workflow.from_simple(data, true);\n self.workflow.has_changes = false;\n self.workflow.fit_canvas_to_nodes();\n self.scroll_to_nodes();\n self.canvas_manager.draw_overview();\n // Determine if any parameters were 'upgraded' and provide message\n var upgrade_message = \"\";\n _.each(data.steps, function(step, step_id) {\n var details = \"\";\n if (step.errors) {\n details += \"\" + step.errors + \" \";\n }\n _.each(data.upgrade_messages[step_id], function(m) {\n details += \"\" + m + \" \";\n });\n if (details) {\n upgrade_message +=\n \"Step \" +\n (parseInt(step_id, 10) + 1) +\n \": \" +\n self.workflow.nodes[step_id].name +\n \" \";\n }\n });\n if (upgrade_message) {\n window.show_modal(\n \"Issues loading this workflow\",\n \"Please review the following issues, possibly resulting from tool upgrades or changes.
\" +\n upgrade_message +\n \"
\",\n { Continue: hide_modal }\n );\n } else {\n hide_modal();\n }\n self.showWorkflowParameters();\n },\n beforeSubmit: function(data) {\n show_message(\"Loading workflow\", \"progress\");\n }\n });\n\n window.make_popupmenu &&\n make_popupmenu($(\"#workflow-options-button\"), {\n Save: save_current_workflow,\n \"Save As\": workflow_save_as,\n Run: function() {\n window.location =\n Galaxy.root + \"workflow/run?id=\" + self.options.id;\n },\n \"Edit Attributes\": function() {\n self.workflow.clear_active_node();\n },\n \"Auto Re-layout\": layout_editor,\n Close: close_editor\n });\n\n /******************************************** Issue 3000*/\n function workflow_save_as() {\n var body = $(\n ''\n );\n window.show_modal(\"Save As a New Workflow\", body, {\n OK: function() {\n var rename_name =\n $(\"#workflow_rename\").val().length > 0\n ? $(\"#workflow_rename\").val()\n : \"SavedAs_\" + self.workflow.name;\n var rename_annotation =\n $(\"#wf_annotation\").val().length > 0\n ? $(\"#wf_annotation\").val()\n : \"\";\n $.ajax({\n url: self.urls.workflow_save_as,\n type: \"POST\",\n data: {\n workflow_name: rename_name,\n workflow_annotation: rename_annotation,\n workflow_data: function() {\n return JSON.stringify(\n self.workflow.to_simple()\n );\n }\n }\n })\n .done(function(id) {\n window.onbeforeunload = undefined;\n window.location =\n Galaxy.root + \"workflow/editor?id=\" + id;\n hide_modal();\n })\n .fail(function() {\n hide_modal();\n alert(\n \"Saving this workflow failed. Please contact this site's administrator.\"\n );\n });\n },\n Cancel: hide_modal\n });\n }\n\n function edit_workflow_outputs() {\n self.workflow.clear_active_node();\n $(\".right-content\").hide();\n var new_content = \"\";\n for (var node_key in self.workflow.nodes) {\n var node = self.workflow.nodes[node_key];\n if ([\"tool\", \"subworkflow\"].indexOf(node.type) >= 0) {\n new_content +=\n \"\";\n }\n }\n $(\"#output-fill-area\").html(new_content);\n $(\"#output-fill-area input\").bind(\"click\", function() {\n var node_id = this.name.split(\"|\")[0];\n var workflowNode = this.workflow.nodes[node_id];\n var output_name = this.name.split(\"|\")[1];\n if (this.checked) {\n workflowNode.addWorkflowOutput(output_name);\n } else {\n workflowNode.removeWorkflowOutput(output_name);\n }\n self.workflow.has_changes = true;\n });\n $(\"#workflow-output-area\").show();\n }\n\n function layout_editor() {\n self.workflow.layout();\n self.workflow.fit_canvas_to_nodes();\n self.scroll_to_nodes();\n self.canvas_manager.draw_overview();\n }\n\n // On load, set the size to the pref stored in local storage if it exists\n var overview_size = $.jStorage.get(\"overview-size\");\n if (overview_size !== undefined) {\n $(\"#overview-border\").css({\n width: overview_size,\n height: overview_size\n });\n }\n\n // Show viewport on load unless pref says it's off\n if ($.jStorage.get(\"overview-off\")) {\n hide_overview();\n } else {\n show_overview();\n }\n\n // Stores the size of the overview into local storage when it's resized\n $(\"#overview-border\").bind(\"dragend\", function(e, d) {\n var op = $(this).offsetParent();\n var opo = op.offset();\n var new_size = Math.max(\n op.width() - (d.offsetX - opo.left),\n op.height() - (d.offsetY - opo.top)\n );\n $.jStorage.set(\"overview-size\", new_size + \"px\");\n });\n\n function show_overview() {\n $.jStorage.set(\"overview-off\", false);\n $(\"#overview-border\").css(\"right\", \"0px\");\n $(\"#close-viewport\").css(\"background-position\", \"0px 0px\");\n }\n\n function hide_overview() {\n $.jStorage.set(\"overview-off\", true);\n $(\"#overview-border\").css(\"right\", \"20000px\");\n $(\"#close-viewport\").css(\"background-position\", \"12px 0px\");\n }\n\n // Lets the overview be toggled visible and invisible, adjusting the arrows accordingly\n $(\"#close-viewport\").click(function() {\n if ($(\"#overview-border\").css(\"right\") === \"0px\") {\n hide_overview();\n } else {\n show_overview();\n }\n });\n\n // Unload handler\n window.onbeforeunload = function() {\n if (workflow && self.workflow.has_changes) {\n return \"There are unsaved changes to your workflow which will be lost.\";\n }\n };\n\n this.options.workflows.length > 0 &&\n $(\"#left\")\n .find(\".toolMenu\")\n .append(this._buildToolPanelWorkflows());\n\n // Tool menu\n $(\"div.toolSectionBody\").hide();\n $(\"div.toolSectionTitle > span\").wrap(\" \");\n var last_expanded = null;\n $(\"div.toolSectionTitle\").each(function() {\n var body = $(this).next(\"div.toolSectionBody\");\n $(this).click(function() {\n if (body.is(\":hidden\")) {\n if (last_expanded) last_expanded.slideUp(\"fast\");\n last_expanded = body;\n body.slideDown(\"fast\");\n } else {\n body.slideUp(\"fast\");\n last_expanded = null;\n }\n });\n });\n\n // Rename async.\n async_save_text(\n \"workflow-name\",\n \"workflow-name\",\n self.urls.rename_async,\n \"new_name\"\n );\n\n // Tag async. Simply have the workflow edit element generate a click on the tag element to activate tagging.\n $(\"#workflow-tag\").click(function() {\n $(\".tag-area\").click();\n return false;\n });\n // Annotate async.\n async_save_text(\n \"workflow-annotation\",\n \"workflow-annotation\",\n self.urls.annotate_async,\n \"new_annotation\",\n 25,\n true,\n 4\n );\n },\n\n _buildToolPanelWorkflows: function() {\n var self = this;\n var $section = $(\n '' +\n '
\" +\n '
\"\n );\n _.each(this.options.workflows, function(workflow) {\n if (workflow.id !== self.options.id) {\n var copy = new Ui.ButtonIcon({\n icon: \"fa fa-copy\",\n cls: \"ui-button-icon-plain\",\n tooltip: \"Copy and insert individual steps\",\n onclick: function() {\n if (workflow.step_count < 2) {\n self.copy_into_workflow(workflow.id, workflow.name);\n } else {\n // don't ruin the workflow by adding 50 steps unprompted.\n Galaxy.modal.show({\n title: \"Warning\",\n body:\n \"This will copy \" +\n workflow.step_count +\n \" new steps into your workflow.\",\n buttons: {\n Cancel: function() {\n Galaxy.modal.hide();\n },\n Copy: function() {\n Galaxy.modal.hide();\n self.copy_into_workflow(\n workflow.id,\n workflow.name\n );\n }\n }\n });\n }\n }\n });\n var $add = $(\"
\")\n .attr(\"href\", \"#\")\n .html(workflow.name)\n .on(\"click\", function() {\n self.add_node_for_subworkflow(\n workflow.latest_id,\n workflow.name\n );\n });\n $section.find(\".toolSectionBg\").append(\n $(\"
\")\n .addClass(\"toolTitle\")\n .append($add)\n .append(copy.$el)\n );\n }\n });\n return $section;\n },\n\n copy_into_workflow: function(workflowId) {\n // Load workflow definition\n var self = this;\n this._workflowLoadAjax(workflowId, {\n success: function(data) {\n self.workflow.from_simple(data, false);\n // Determine if any parameters were 'upgraded' and provide message\n var upgrade_message = \"\";\n $.each(data.upgrade_messages, function(k, v) {\n upgrade_message +=\n \"
Step \" +\n (parseInt(k, 10) + 1) +\n \": \" +\n self.workflow.nodes[k].name +\n \"\";\n $.each(v, function(i, vv) {\n upgrade_message += \"\" + vv + \" \";\n });\n upgrade_message += \" \";\n });\n if (upgrade_message) {\n window.show_modal(\n \"Subworkflow embedded with changes\",\n \"Problems were encountered loading this workflow (possibly a result of tool upgrades). Please review the following parameters and then save.
\" +\n upgrade_message +\n \" \",\n { Continue: hide_modal }\n );\n } else {\n hide_modal();\n }\n },\n beforeSubmit: function(data) {\n show_message(\"Importing workflow\", \"progress\");\n }\n });\n },\n\n // Global state for the whole workflow\n reset: function() {\n this.workflow && this.workflow.remove_all();\n this.workflow = Globals.workflow = new Workflow(\n this,\n $(\"#canvas-container\")\n );\n },\n\n scroll_to_nodes: function() {\n var cv = $(\"#canvas-viewport\");\n var cc = $(\"#canvas-container\");\n var top, left;\n if (cc.width() < cv.width()) {\n left = (cv.width() - cc.width()) / 2;\n } else {\n left = 0;\n }\n if (cc.height() < cv.height()) {\n top = (cv.height() - cc.height()) / 2;\n } else {\n top = 0;\n }\n cc.css({ left: left, top: top });\n },\n\n _workflowLoadAjax: function(workflowId, options) {\n $.ajax(\n Utils.merge(options, {\n url: this.urls.load_workflow,\n data: { id: workflowId, _: \"true\" },\n dataType: \"json\",\n cache: false\n })\n );\n },\n\n _moduleInitAjax: function(node, request_data) {\n var self = this;\n Utils.request({\n type: \"POST\",\n url: Galaxy.root + \"api/workflows/build_module\",\n data: request_data,\n success: function(data) {\n node.init_field_data(data);\n node.update_field_data(data);\n self.workflow.activate_node(node);\n }\n });\n },\n\n // Add a new step to the workflow by tool id\n add_node_for_tool: function(id, title) {\n var node = this.workflow.create_node(\"tool\", title, id);\n this._moduleInitAjax(node, {\n type: \"tool\",\n tool_id: id,\n _: \"true\"\n });\n },\n\n // Add a new step to the workflow by tool id\n add_node_for_subworkflow: function(id, title) {\n var node = this.workflow.create_node(\"subworkflow\", title, id);\n this._moduleInitAjax(node, {\n type: \"subworkflow\",\n content_id: id,\n _: \"true\"\n });\n },\n\n add_node_for_module: function(type, title) {\n var node = this.workflow.create_node(type, title);\n this._moduleInitAjax(node, { type: type, _: \"true\" });\n },\n\n // This function preloads how to display known pja's.\n display_pja: function(pja, node) {\n // DBTODO SANITIZE INPUTS.\n var self = this;\n $(\"#pja_container\").append(get_pja_form(pja, node));\n $(\n \"#pja_container>.toolForm:last>.toolFormTitle>.buttons\"\n ).click(function() {\n var action_to_rem = $(this)\n .closest(\".toolForm\", \".action_tag\")\n .children(\".action_tag:first\")\n .text();\n $(this)\n .closest(\".toolForm\")\n .remove();\n delete self.workflow.active_node.post_job_actions[action_to_rem];\n self.workflow.active_form_has_changes = true;\n });\n },\n\n display_pja_list: function() {\n return pja_list;\n },\n\n display_file_list: function(node) {\n var addlist = \"
\";\n for (var out_terminal in node.output_terminals) {\n addlist +=\n \"\" +\n out_terminal +\n \" \";\n }\n addlist += \" \";\n return addlist;\n },\n\n new_pja: function(action_type, target, node) {\n if (node.post_job_actions === undefined) {\n //New tool node, set up dict.\n node.post_job_actions = {};\n }\n if (node.post_job_actions[action_type + target] === undefined) {\n var new_pja = {};\n new_pja.action_type = action_type;\n new_pja.output_name = target;\n node.post_job_actions[action_type + target] = null;\n node.post_job_actions[action_type + target] = new_pja;\n display_pja(new_pja, node);\n this.workflow.active_form_has_changes = true;\n return true;\n } else {\n return false;\n }\n },\n\n showWorkflowParameters: function() {\n var parameter_re = /\\$\\{.+?\\}/g;\n var workflow_parameters = [];\n var wf_parm_container = $(\"#workflow-parameters-container\");\n var wf_parm_box = $(\"#workflow-parameters-box\");\n var new_parameter_content = \"\";\n var matches = [];\n $.each(this.workflow.nodes, function(k, node) {\n if (node.config_form && node.config_form.inputs) {\n Utils.deepeach(node.config_form.inputs, function(d) {\n if (typeof d.value == \"string\") {\n var form_matches = d.value.match(parameter_re);\n if (form_matches) {\n matches = matches.concat(form_matches);\n }\n }\n });\n }\n if (node.post_job_actions) {\n $.each(node.post_job_actions, function(k, pja) {\n if (pja.action_arguments) {\n $.each(pja.action_arguments, function(\n k,\n action_argument\n ) {\n var arg_matches = action_argument.match(\n parameter_re\n );\n if (arg_matches) {\n matches = matches.concat(arg_matches);\n }\n });\n }\n });\n }\n if (matches) {\n $.each(matches, function(k, element) {\n if ($.inArray(element, workflow_parameters) === -1) {\n workflow_parameters.push(element);\n }\n });\n }\n });\n if (workflow_parameters && workflow_parameters.length !== 0) {\n $.each(workflow_parameters, function(k, element) {\n new_parameter_content +=\n \"
\" +\n element.substring(2, element.length - 1) +\n \"
\";\n });\n wf_parm_container.html(new_parameter_content);\n wf_parm_box.show();\n } else {\n wf_parm_container.html(new_parameter_content);\n wf_parm_box.hide();\n }\n },\n\n showAttributes: function() {\n $(\".right-content\").hide();\n $(\"#edit-attributes\").show();\n },\n\n showForm: function(content, node) {\n var self = this;\n var cls = \"right-content\";\n var id = cls + \"-\" + node.id;\n var $container = $(\"#\" + cls);\n if (content && $container.find(\"#\" + id).length == 0) {\n var $el = $('
');\n content.node = node;\n content.workflow = this.workflow;\n content.datatypes = this.datatypes;\n content.icon = WorkflowIcons[node.type];\n content.cls = \"ui-portlet-narrow\";\n if (node) {\n var form_type = node.type == \"tool\" ? \"Tool\" : \"Default\";\n $el.append(new FormWrappers[form_type](content).form.$el);\n $container.append($el);\n } else {\n Galaxy.emit.debug(\n \"workflow-view::initialize()\",\n \"Node not found in workflow.\"\n );\n }\n }\n $(\".\" + cls).hide();\n $container.find(\"#\" + id).show();\n $container.show();\n $container.scrollTop();\n },\n\n isSubType: function(child, parent) {\n child = this.ext_to_type[child];\n parent = this.ext_to_type[parent];\n return this.type_to_type[child] && parent in this.type_to_type[child];\n },\n\n prebuildNode: function(type, title_text, content_id) {\n var self = this;\n var $f = $(\"
\");\n var $title = $(\n \"
\" +\n title_text +\n \"
\"\n );\n add_node_icon($title.find(\".nodeTitle\"), type);\n $f.append($title);\n $f.css(\"left\", $(window).scrollLeft() + 20);\n $f.css(\"top\", $(window).scrollTop() + 20);\n $f.append($(\"
\"));\n var node = new Node(this, { element: $f });\n node.type = type;\n node.content_id = content_id;\n var tmp =\n \" loading tool info...
\";\n $f.find(\".toolFormBody\").append(tmp);\n // Fix width to computed width\n // Now add floats\n var buttons = $(\"
\");\n buttons.append(\n $(\"
\")\n .addClass(\"fa-icon-button fa fa-times\")\n .click(function(e) {\n node.destroy();\n })\n );\n // Place inside container\n $f.appendTo(\"#canvas-container\");\n // Position in container\n var o = $(\"#canvas-container\").position();\n var p = $(\"#canvas-container\").parent();\n var width = $f.width();\n var height = $f.height();\n $f.css({\n left: -o.left + p.width() / 2 - width / 2,\n top: -o.top + p.height() / 2 - height / 2\n });\n buttons.prependTo($f.find(\".toolFormTitle\"));\n width += buttons.width() + 10;\n $f.css(\"width\", width);\n $f\n .bind(\"dragstart\", function() {\n self.workflow.activate_node(node);\n })\n .bind(\"dragend\", function() {\n self.workflow.node_changed(this);\n self.workflow.fit_canvas_to_nodes();\n self.canvas_manager.draw_overview();\n })\n .bind(\"dragclickonly\", function() {\n self.workflow.activate_node(node);\n })\n .bind(\"drag\", function(e, d) {\n // Move\n var po = $(this)\n .offsetParent()\n .offset(),\n x = d.offsetX - po.left,\n y = d.offsetY - po.top;\n $(this).css({ left: x, top: y });\n // Redraw\n $(this)\n .find(\".terminal\")\n .each(function() {\n this.terminal.redraw();\n });\n });\n return node;\n }\n});\n"]}
\ No newline at end of file
+{"version":3,"sources":["mvc/workflow/workflow-view.js"],"names":["reset_tool_search","initValue","tool_menu_frame","$","contents","length","document","this","removeClass","find","hide","show","each","attr","workflow_globals","hasClass","nodeType","iconStyle","$icon","addClass","window","initialize","options","show_overview","Galaxy","modal","title","body","jStorage","set","Copy","self","app","urls","onbeforeunload","eventObj","undefined","location","workflow","check_changes_in_active_form","show_modal","Cancel","success_callback","save_current_workflow","rectify_workflow_outputs","_utils2","default","request","workflow_index","type","data","to_simple","show_message","text","message","errors","has_changes","hide_modal","i","v","appendTo","errlist","append","url","success","showWorkflowParameters","Ok","click","error","keyup","css","value","select","lastValue","q","timer","clearTimeout","get","tool_search","setTimeout","map","n","s","index","id","parent","this_label","next","no_visible_tools","is","canvas_manager","datatypes","async","datatypes_mapping","JSON","_workflowCanvas2","reset","_workflowLoadAjax","parse","ajax","_","steps","responseText","details","ext_to_class_name","type_to_type","class_to_classes","scroll_to_nodes","beforeSubmit","step","step_id","Save","m","workflow_save_as","upgrade_message","clear_active_node","layout_editor","name","close_editor","rename_annotation","workflow_name","workflow_data","make_popupmenu","fail","alert","new_content","output","OK","val","workflowNode","output_name","addWorkflowOutput","workflow_annotation","removeWorkflowOutput","stringify","layout","fit_canvas_to_nodes","root","overview_size","Run","Edit Attributes","last_expanded","search_input","do_close","Save Changes","width","height","hide_overview","workflows","op","opo","copy","icon","max","cls","d","offsetX","left","tooltip","offsetY","top","step_count","upgrade_messages","slideUp","slideDown","_asyncSaveText2","cc","request_data","ButtonIcon","node","init_field_data","update_field_data","copy_into_workflow","buttons","create_node","_moduleInitAjax","html","on","add_node_for_subworkflow","latest_id","$section","action_to_rem","closest","active_form_has_changes","$el","display_file_list","workflowId","addlist","from_simple","k","post_job_actions","parseInt","nodes","new_pja","vv","action_type","display_pja","Continue","parameter_re","wf_parm_box","new_parameter_content","form_matches","matches","cv","workflow_parameters","dataType","wf_parm_container","showAttributes","showForm","content","activate_node","emit","$container","isSubType","child","ext_to_type","prebuildNode","pja","$f","get_pja_form","add_node_icon","tmp","active_node","display_pja_list","pja_list","output_terminals","out_terminal","node_changed","bind","target","po","offsetParent","x","config_form","inputs","deepeach","match","concat","action_arguments","action_argument","arg_matches","element","inArray","push","substring","_workflowIcons2","form_type","_workflowForms2","form","debug","scrollTop","title_text","content_id","$title","scrollLeft","_workflowNode2","e","destroy","o","position","p","prependTo","draw_overview","offset","y","terminal","redraw"],"mappings":"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","file":"../../../scripts/mvc/workflow/workflow-view.js","sourcesContent":["import Utils from \"utils/utils\";\nimport Workflow from \"mvc/workflow/workflow-manager\";\nimport WorkflowCanvas from \"mvc/workflow/workflow-canvas\";\nimport Node from \"mvc/workflow/workflow-node\";\nimport WorkflowIcons from \"mvc/workflow/workflow-icons\";\nimport FormWrappers from \"mvc/workflow/workflow-forms\";\nimport Ui from \"mvc/ui/ui-misc\";\nimport async_save_text from \"utils/async-save-text\";\nimport Toastr from \"libs/toastr\";\nimport \"ui/editable-text\";\n\n// TODO; tie into Galaxy state?\nwindow.workflow_globals = window.workflow_globals || {};\n\n// Reset tool search to start state.\nfunction reset_tool_search(initValue) {\n // Function may be called in top frame or in tool_menu_frame;\n // in either case, get the tool menu frame.\n var tool_menu_frame = $(\"#galaxy_tools\").contents();\n if (tool_menu_frame.length === 0) {\n tool_menu_frame = $(document);\n // Remove classes that indicate searching is active.\n $(this).removeClass(\"search_active\");\n tool_menu_frame.find(\".toolTitle\").removeClass(\"search_match\");\n\n // Reset visibility of tools and labels.\n tool_menu_frame.find(\".toolSectionBody\").hide();\n tool_menu_frame.find(\".toolTitle\").show();\n tool_menu_frame.find(\".toolPanelLabel\").show();\n tool_menu_frame.find(\".toolSectionWrapper\").each(function() {\n if ($(this).attr(\"id\") !== \"recently_used_wrapper\") {\n // Default action.\n $(this).show();\n } else if ($(this).hasClass(\"user_pref_visible\")) {\n $(this).show();\n }\n });\n tool_menu_frame.find(\"#search-no-results\").hide();\n\n // Reset search input.\n tool_menu_frame.find(\"#search-spinner\").hide();\n if (initValue) {\n var search_input = tool_menu_frame.find(\"#tool-search-query\");\n search_input.val(\"search tools\");\n }\n }\n}\n\nfunction add_node_icon($to_el, nodeType) {\n var iconStyle = WorkflowIcons[nodeType];\n if (iconStyle) {\n var $icon = $(' ').addClass(iconStyle);\n $to_el.before($icon);\n }\n}\n\n// create form view\nexport default Backbone.View.extend({\n initialize: function(options) {\n var self = (window.workflow_globals.app = this);\n this.options = options;\n this.urls = (options && options.urls) || {};\n var close_editor = function() {\n self.workflow.check_changes_in_active_form();\n if (workflow && self.workflow.has_changes) {\n var do_close = function() {\n window.onbeforeunload = undefined;\n window.document.location = self.urls.workflow_index;\n };\n window.show_modal(\n \"Close workflow editor\",\n \"There are unsaved changes to your workflow which will be lost.\",\n {\n Cancel: hide_modal,\n \"Save Changes\": function() {\n save_current_workflow(null, do_close);\n }\n },\n {\n \"Don't Save\": do_close\n }\n );\n } else {\n window.document.location = self.urls.workflow_index;\n }\n };\n var save_current_workflow = function(eventObj, success_callback) {\n show_message(\"Saving workflow\", \"progress\");\n self.workflow.check_changes_in_active_form();\n if (!self.workflow.has_changes) {\n hide_modal();\n if (success_callback) {\n success_callback();\n }\n return;\n }\n self.workflow.rectify_workflow_outputs();\n Utils.request({\n url: Galaxy.root + \"api/workflows/\" + self.options.id,\n type: \"PUT\",\n data: { workflow: self.workflow.to_simple() },\n success: function(data) {\n var body = $(\"
\").text(data.message);\n if (data.errors) {\n body.addClass(\"warningmark\");\n var errlist = $(\"\");\n $.each(data.errors, function(i, v) {\n $(\" \")\n .text(v)\n .appendTo(errlist);\n });\n body.append(errlist);\n } else {\n body.addClass(\"donemark\");\n }\n self.workflow.name = data.name;\n self.workflow.has_changes = false;\n self.workflow.stored = true;\n self.showWorkflowParameters();\n if (data.errors) {\n window.show_modal(\"Saving workflow\", body, {\n Ok: hide_modal\n });\n } else {\n success_callback && success_callback();\n hide_modal();\n }\n },\n error: function(response) {\n window.show_modal(\n \"Saving workflow failed.\",\n response.err_msg,\n { Ok: hide_modal }\n );\n }\n });\n };\n\n // Init searching.\n $(\"#tool-search-query\")\n .click(function() {\n $(this).focus();\n $(this).select();\n })\n .keyup(function() {\n // Remove italics.\n $(this).css(\"font-style\", \"normal\");\n // Don't update if same value as last time\n if (this.value.length < 3) {\n reset_tool_search(false);\n } else if (this.value != this.lastValue) {\n // Add class to denote that searching is active.\n $(this).addClass(\"search_active\");\n // input.addClass(config.loadingClass);\n // Add '*' to facilitate partial matching.\n var q = this.value;\n // Stop previous ajax-request\n if (this.timer) {\n clearTimeout(this.timer);\n }\n // Start a new ajax-request in X ms\n $(\"#search-spinner\").show();\n this.timer = setTimeout(function() {\n $.get(\n self.urls.tool_search,\n { q: q },\n function(data) {\n // input.removeClass(config.loadingClass);\n // Show live-search if results and search-term aren't empty\n $(\"#search-no-results\").hide();\n // Hide all tool sections.\n $(\".toolSectionWrapper\").hide();\n // This hides all tools but not workflows link (which is in a .toolTitle div).\n $(\".toolSectionWrapper\")\n .find(\".toolTitle\")\n .hide();\n if (data.length != 0) {\n // Map tool ids to element ids and join them.\n var s = $.map(data, function(n, i) {\n return \"link-\" + n;\n });\n // First pass to show matching tools and their parents.\n $(s).each(function(index, id) {\n // Add class to denote match.\n $(\"[id='\" + id + \"']\")\n .parent()\n .addClass(\"search_match\");\n $(\"[id='\" + id + \"']\")\n .parent()\n .show()\n .parent()\n .parent()\n .show()\n .parent()\n .show();\n });\n // Hide labels that have no visible children.\n $(\".toolPanelLabel\").each(function() {\n var this_label = $(this);\n var next = this_label.next();\n var no_visible_tools = true;\n // Look through tools following label and, if none are visible, hide label.\n while (\n next.length !== 0 &&\n next.hasClass(\"toolTitle\")\n ) {\n if (next.is(\":visible\")) {\n no_visible_tools = false;\n break;\n } else {\n next = next.next();\n }\n }\n if (no_visible_tools) {\n this_label.hide();\n }\n });\n } else {\n $(\"#search-no-results\").show();\n }\n $(\"#search-spinner\").hide();\n },\n \"json\"\n );\n }, 400);\n }\n this.lastValue = this.value;\n });\n\n // Canvas overview management\n this.canvas_manager = window.workflow_globals.canvas_manager = new WorkflowCanvas(\n this,\n $(\"#canvas-viewport\"),\n $(\"#overview\")\n );\n\n // Initialize workflow state\n this.reset();\n\n // get available datatypes for post job action options\n this.datatypes = JSON.parse(\n $.ajax({\n url: Galaxy.root + \"api/datatypes\",\n async: false\n }).responseText\n );\n\n // get datatype mapping options\n this.datatypes_mapping = JSON.parse(\n $.ajax({\n url: Galaxy.root + \"api/datatypes/mapping\",\n async: false\n }).responseText\n );\n\n // set mapping sub lists\n this.ext_to_type = this.datatypes_mapping.ext_to_class_name;\n this.type_to_type = this.datatypes_mapping.class_to_classes;\n\n // Load workflow definition\n this._workflowLoadAjax(self.options.id, {\n success: function(data) {\n self.reset();\n self.workflow.from_simple(data, true);\n self.workflow.has_changes = false;\n self.workflow.fit_canvas_to_nodes();\n self.scroll_to_nodes();\n self.canvas_manager.draw_overview();\n // Determine if any parameters were 'upgraded' and provide message\n var upgrade_message = \"\";\n _.each(data.steps, function(step, step_id) {\n var details = \"\";\n if (step.errors) {\n details += \"\" + step.errors + \" \";\n }\n _.each(data.upgrade_messages[step_id], function(m) {\n details += \"\" + m + \" \";\n });\n if (details) {\n upgrade_message +=\n \"Step \" +\n (parseInt(step_id, 10) + 1) +\n \": \" +\n self.workflow.nodes[step_id].name +\n \" \";\n }\n });\n if (upgrade_message) {\n window.show_modal(\n \"Issues loading this workflow\",\n \"Please review the following issues, possibly resulting from tool upgrades or changes.
\" +\n upgrade_message +\n \" \",\n { Continue: hide_modal }\n );\n } else {\n hide_modal();\n }\n self.showWorkflowParameters();\n },\n beforeSubmit: function(data) {\n show_message(\"Loading workflow\", \"progress\");\n }\n });\n\n window.make_popupmenu &&\n make_popupmenu($(\"#workflow-options-button\"), {\n Save: save_current_workflow,\n \"Save As\": workflow_save_as,\n Run: function() {\n window.location =\n Galaxy.root + \"workflow/run?id=\" + self.options.id;\n },\n \"Edit Attributes\": function() {\n self.workflow.clear_active_node();\n },\n \"Auto Re-layout\": layout_editor,\n Close: close_editor\n });\n\n /******************************************** Issue 3000*/\n function workflow_save_as() {\n var body = $(\n ''\n );\n window.show_modal(\"Save As a New Workflow\", body, {\n OK: function() {\n var rename_name =\n $(\"#workflow_rename\").val().length > 0\n ? $(\"#workflow_rename\").val()\n : \"SavedAs_\" + self.workflow.name;\n var rename_annotation =\n $(\"#wf_annotation\").val().length > 0\n ? $(\"#wf_annotation\").val()\n : \"\";\n $.ajax({\n url: self.urls.workflow_save_as,\n type: \"POST\",\n data: {\n workflow_name: rename_name,\n workflow_annotation: rename_annotation,\n workflow_data: function() {\n return JSON.stringify(\n self.workflow.to_simple()\n );\n }\n }\n })\n .done(function(id) {\n window.onbeforeunload = undefined;\n window.location =\n Galaxy.root + \"workflow/editor?id=\" + id;\n hide_modal();\n })\n .fail(function() {\n hide_modal();\n alert(\n \"Saving this workflow failed. Please contact this site's administrator.\"\n );\n });\n },\n Cancel: hide_modal\n });\n }\n\n function edit_workflow_outputs() {\n self.workflow.clear_active_node();\n $(\".right-content\").hide();\n var new_content = \"\";\n for (var node_key in self.workflow.nodes) {\n var node = self.workflow.nodes[node_key];\n if ([\"tool\", \"subworkflow\"].indexOf(node.type) >= 0) {\n new_content +=\n \"\";\n }\n }\n $(\"#output-fill-area\").html(new_content);\n $(\"#output-fill-area input\").bind(\"click\", function() {\n var node_id = this.name.split(\"|\")[0];\n var workflowNode = this.workflow.nodes[node_id];\n var output_name = this.name.split(\"|\")[1];\n if (this.checked) {\n workflowNode.addWorkflowOutput(output_name);\n } else {\n workflowNode.removeWorkflowOutput(output_name);\n }\n self.workflow.has_changes = true;\n });\n $(\"#workflow-output-area\").show();\n }\n\n function layout_editor() {\n self.workflow.layout();\n self.workflow.fit_canvas_to_nodes();\n self.scroll_to_nodes();\n self.canvas_manager.draw_overview();\n }\n\n // On load, set the size to the pref stored in local storage if it exists\n var overview_size = $.jStorage.get(\"overview-size\");\n if (overview_size !== undefined) {\n $(\"#overview-border\").css({\n width: overview_size,\n height: overview_size\n });\n }\n\n // Show viewport on load unless pref says it's off\n if ($.jStorage.get(\"overview-off\")) {\n hide_overview();\n } else {\n show_overview();\n }\n\n // Stores the size of the overview into local storage when it's resized\n $(\"#overview-border\").bind(\"dragend\", function(e, d) {\n var op = $(this).offsetParent();\n var opo = op.offset();\n var new_size = Math.max(\n op.width() - (d.offsetX - opo.left),\n op.height() - (d.offsetY - opo.top)\n );\n $.jStorage.set(\"overview-size\", new_size + \"px\");\n });\n\n function show_overview() {\n $.jStorage.set(\"overview-off\", false);\n $(\"#overview-border\").css(\"right\", \"0px\");\n $(\"#close-viewport\").css(\"background-position\", \"0px 0px\");\n }\n\n function hide_overview() {\n $.jStorage.set(\"overview-off\", true);\n $(\"#overview-border\").css(\"right\", \"20000px\");\n $(\"#close-viewport\").css(\"background-position\", \"12px 0px\");\n }\n\n // Lets the overview be toggled visible and invisible, adjusting the arrows accordingly\n $(\"#close-viewport\").click(function() {\n if ($(\"#overview-border\").css(\"right\") === \"0px\") {\n hide_overview();\n } else {\n show_overview();\n }\n });\n\n // Unload handler\n window.onbeforeunload = function() {\n if (workflow && self.workflow.has_changes) {\n return \"There are unsaved changes to your workflow which will be lost.\";\n }\n };\n\n this.options.workflows.length > 0 &&\n $(\"#left\")\n .find(\".toolMenu\")\n .append(this._buildToolPanelWorkflows());\n\n // Tool menu\n $(\"div.toolSectionBody\").hide();\n $(\"div.toolSectionTitle > span\").wrap(\" \");\n var last_expanded = null;\n $(\"div.toolSectionTitle\").each(function() {\n var body = $(this).next(\"div.toolSectionBody\");\n $(this).click(function() {\n if (body.is(\":hidden\")) {\n if (last_expanded) last_expanded.slideUp(\"fast\");\n last_expanded = body;\n body.slideDown(\"fast\");\n } else {\n body.slideUp(\"fast\");\n last_expanded = null;\n }\n });\n });\n\n // Rename async.\n async_save_text(\n \"workflow-name\",\n \"workflow-name\",\n self.urls.rename_async,\n \"new_name\"\n );\n\n // Tag async. Simply have the workflow edit element generate a click on the tag element to activate tagging.\n $(\"#workflow-tag\").click(function() {\n $(\".tag-area\").click();\n return false;\n });\n // Annotate async.\n async_save_text(\n \"workflow-annotation\",\n \"workflow-annotation\",\n self.urls.annotate_async,\n \"new_annotation\",\n 25,\n true,\n 4\n );\n },\n\n _buildToolPanelWorkflows: function() {\n var self = this;\n var $section = $(\n '' +\n '
\" +\n '
\"\n );\n _.each(this.options.workflows, function(workflow) {\n if (workflow.id !== self.options.id) {\n var copy = new Ui.ButtonIcon({\n icon: \"fa fa-copy\",\n cls: \"ui-button-icon-plain\",\n tooltip: \"Copy and insert individual steps\",\n onclick: function() {\n if (workflow.step_count < 2) {\n self.copy_into_workflow(workflow.id, workflow.name);\n } else {\n // don't ruin the workflow by adding 50 steps unprompted.\n Galaxy.modal.show({\n title: \"Warning\",\n body:\n \"This will copy \" +\n workflow.step_count +\n \" new steps into your workflow.\",\n buttons: {\n Cancel: function() {\n Galaxy.modal.hide();\n },\n Copy: function() {\n Galaxy.modal.hide();\n self.copy_into_workflow(\n workflow.id,\n workflow.name\n );\n }\n }\n });\n }\n }\n });\n var $add = $(\"
\")\n .attr(\"href\", \"#\")\n .html(workflow.name)\n .on(\"click\", function() {\n self.add_node_for_subworkflow(\n workflow.latest_id,\n workflow.name\n );\n });\n $section.find(\".toolSectionBg\").append(\n $(\"
\")\n .addClass(\"toolTitle\")\n .append($add)\n .append(copy.$el)\n );\n }\n });\n return $section;\n },\n\n copy_into_workflow: function(workflowId) {\n // Load workflow definition\n var self = this;\n this._workflowLoadAjax(workflowId, {\n success: function(data) {\n self.workflow.from_simple(data, false);\n // Determine if any parameters were 'upgraded' and provide message\n var upgrade_message = \"\";\n $.each(data.upgrade_messages, function(k, v) {\n upgrade_message +=\n \"
Step \" +\n (parseInt(k, 10) + 1) +\n \": \" +\n self.workflow.nodes[k].name +\n \"\";\n $.each(v, function(i, vv) {\n upgrade_message += \"\" + vv + \" \";\n });\n upgrade_message += \" \";\n });\n if (upgrade_message) {\n window.show_modal(\n \"Subworkflow embedded with changes\",\n \"Problems were encountered loading this workflow (possibly a result of tool upgrades). Please review the following parameters and then save.
\" +\n upgrade_message +\n \" \",\n { Continue: hide_modal }\n );\n } else {\n hide_modal();\n }\n },\n beforeSubmit: function(data) {\n show_message(\"Importing workflow\", \"progress\");\n }\n });\n },\n\n // Global state for the whole workflow\n reset: function() {\n this.workflow && this.workflow.remove_all();\n this.workflow = window.workflow_globals.workflow = new Workflow(\n this,\n $(\"#canvas-container\")\n );\n },\n\n scroll_to_nodes: function() {\n var cv = $(\"#canvas-viewport\");\n var cc = $(\"#canvas-container\");\n var top, left;\n if (cc.width() < cv.width()) {\n left = (cv.width() - cc.width()) / 2;\n } else {\n left = 0;\n }\n if (cc.height() < cv.height()) {\n top = (cv.height() - cc.height()) / 2;\n } else {\n top = 0;\n }\n cc.css({ left: left, top: top });\n },\n\n _workflowLoadAjax: function(workflowId, options) {\n $.ajax(\n Utils.merge(options, {\n url: this.urls.load_workflow,\n data: { id: workflowId, _: \"true\" },\n dataType: \"json\",\n cache: false\n })\n );\n },\n\n _moduleInitAjax: function(node, request_data) {\n var self = this;\n Utils.request({\n type: \"POST\",\n url: Galaxy.root + \"api/workflows/build_module\",\n data: request_data,\n success: function(data) {\n node.init_field_data(data);\n node.update_field_data(data);\n self.workflow.activate_node(node);\n }\n });\n },\n\n // Add a new step to the workflow by tool id\n add_node_for_tool: function(id, title) {\n var node = this.workflow.create_node(\"tool\", title, id);\n this._moduleInitAjax(node, {\n type: \"tool\",\n tool_id: id,\n _: \"true\"\n });\n },\n\n // Add a new step to the workflow by tool id\n add_node_for_subworkflow: function(id, title) {\n var node = this.workflow.create_node(\"subworkflow\", title, id);\n this._moduleInitAjax(node, {\n type: \"subworkflow\",\n content_id: id,\n _: \"true\"\n });\n },\n\n add_node_for_module: function(type, title) {\n var node = this.workflow.create_node(type, title);\n this._moduleInitAjax(node, { type: type, _: \"true\" });\n },\n\n // This function preloads how to display known pja's.\n display_pja: function(pja, node) {\n // DBTODO SANITIZE INPUTS.\n var self = this;\n $(\"#pja_container\").append(get_pja_form(pja, node));\n $(\n \"#pja_container>.toolForm:last>.toolFormTitle>.buttons\"\n ).click(function() {\n var action_to_rem = $(this)\n .closest(\".toolForm\", \".action_tag\")\n .children(\".action_tag:first\")\n .text();\n $(this)\n .closest(\".toolForm\")\n .remove();\n delete self.workflow.active_node.post_job_actions[action_to_rem];\n self.workflow.active_form_has_changes = true;\n });\n },\n\n display_pja_list: function() {\n return pja_list;\n },\n\n display_file_list: function(node) {\n var addlist = \"
\";\n for (var out_terminal in node.output_terminals) {\n addlist +=\n \"\" +\n out_terminal +\n \" \";\n }\n addlist += \" \";\n return addlist;\n },\n\n new_pja: function(action_type, target, node) {\n if (node.post_job_actions === undefined) {\n //New tool node, set up dict.\n node.post_job_actions = {};\n }\n if (node.post_job_actions[action_type + target] === undefined) {\n var new_pja = {};\n new_pja.action_type = action_type;\n new_pja.output_name = target;\n node.post_job_actions[action_type + target] = null;\n node.post_job_actions[action_type + target] = new_pja;\n display_pja(new_pja, node);\n this.workflow.active_form_has_changes = true;\n return true;\n } else {\n return false;\n }\n },\n\n showWorkflowParameters: function() {\n var parameter_re = /\\$\\{.+?\\}/g;\n var workflow_parameters = [];\n var wf_parm_container = $(\"#workflow-parameters-container\");\n var wf_parm_box = $(\"#workflow-parameters-box\");\n var new_parameter_content = \"\";\n var matches = [];\n $.each(this.workflow.nodes, function(k, node) {\n if (node.config_form && node.config_form.inputs) {\n Utils.deepeach(node.config_form.inputs, function(d) {\n if (typeof d.value == \"string\") {\n var form_matches = d.value.match(parameter_re);\n if (form_matches) {\n matches = matches.concat(form_matches);\n }\n }\n });\n }\n if (node.post_job_actions) {\n $.each(node.post_job_actions, function(k, pja) {\n if (pja.action_arguments) {\n $.each(pja.action_arguments, function(\n k,\n action_argument\n ) {\n var arg_matches = action_argument.match(\n parameter_re\n );\n if (arg_matches) {\n matches = matches.concat(arg_matches);\n }\n });\n }\n });\n }\n if (matches) {\n $.each(matches, function(k, element) {\n if ($.inArray(element, workflow_parameters) === -1) {\n workflow_parameters.push(element);\n }\n });\n }\n });\n if (workflow_parameters && workflow_parameters.length !== 0) {\n $.each(workflow_parameters, function(k, element) {\n new_parameter_content +=\n \"
\" +\n element.substring(2, element.length - 1) +\n \"
\";\n });\n wf_parm_container.html(new_parameter_content);\n wf_parm_box.show();\n } else {\n wf_parm_container.html(new_parameter_content);\n wf_parm_box.hide();\n }\n },\n\n showAttributes: function() {\n $(\".right-content\").hide();\n $(\"#edit-attributes\").show();\n },\n\n showForm: function(content, node) {\n var self = this;\n var cls = \"right-content\";\n var id = cls + \"-\" + node.id;\n var $container = $(\"#\" + cls);\n if (content && $container.find(\"#\" + id).length == 0) {\n var $el = $('
');\n content.node = node;\n content.workflow = this.workflow;\n content.datatypes = this.datatypes;\n content.icon = WorkflowIcons[node.type];\n content.cls = \"ui-portlet-narrow\";\n if (node) {\n var form_type = node.type == \"tool\" ? \"Tool\" : \"Default\";\n $el.append(new FormWrappers[form_type](content).form.$el);\n $container.append($el);\n } else {\n Galaxy.emit.debug(\n \"workflow-view::initialize()\",\n \"Node not found in workflow.\"\n );\n }\n }\n $(\".\" + cls).hide();\n $container.find(\"#\" + id).show();\n $container.show();\n $container.scrollTop();\n },\n\n isSubType: function(child, parent) {\n child = this.ext_to_type[child];\n parent = this.ext_to_type[parent];\n return this.type_to_type[child] && parent in this.type_to_type[child];\n },\n\n prebuildNode: function(type, title_text, content_id) {\n var self = this;\n var $f = $(\"
\");\n var $title = $(\n \"
\" +\n title_text +\n \"
\"\n );\n add_node_icon($title.find(\".nodeTitle\"), type);\n $f.append($title);\n $f.css(\"left\", $(window).scrollLeft() + 20);\n $f.css(\"top\", $(window).scrollTop() + 20);\n $f.append($(\"
\"));\n var node = new Node(this, { element: $f });\n node.type = type;\n node.content_id = content_id;\n var tmp =\n \" loading tool info...
\";\n $f.find(\".toolFormBody\").append(tmp);\n // Fix width to computed width\n // Now add floats\n var buttons = $(\"
\");\n buttons.append(\n $(\"
\")\n .addClass(\"fa-icon-button fa fa-times\")\n .click(function(e) {\n node.destroy();\n })\n );\n // Place inside container\n $f.appendTo(\"#canvas-container\");\n // Position in container\n var o = $(\"#canvas-container\").position();\n var p = $(\"#canvas-container\").parent();\n var width = $f.width();\n var height = $f.height();\n $f.css({\n left: -o.left + p.width() / 2 - width / 2,\n top: -o.top + p.height() / 2 - height / 2\n });\n buttons.prependTo($f.find(\".toolFormTitle\"));\n width += buttons.width() + 10;\n $f.css(\"width\", width);\n $f\n .bind(\"dragstart\", function() {\n self.workflow.activate_node(node);\n })\n .bind(\"dragend\", function() {\n self.workflow.node_changed(this);\n self.workflow.fit_canvas_to_nodes();\n self.canvas_manager.draw_overview();\n })\n .bind(\"dragclickonly\", function() {\n self.workflow.activate_node(node);\n })\n .bind(\"drag\", function(e, d) {\n // Move\n var po = $(this)\n .offsetParent()\n .offset(),\n x = d.offsetX - po.left,\n y = d.offsetY - po.top;\n $(this).css({ left: x, top: y });\n // Redraw\n $(this)\n .find(\".terminal\")\n .each(function() {\n this.terminal.redraw();\n });\n });\n return node;\n }\n});\n"]}
\ No newline at end of file
diff --git a/static/scripts/mvc/workflow/workflow-terminals.js b/static/scripts/mvc/workflow/workflow-terminals.js
index 5bf9c9810904..9a1e28736930 100644
--- a/static/scripts/mvc/workflow/workflow-terminals.js
+++ b/static/scripts/mvc/workflow/workflow-terminals.js
@@ -1,2 +1,2 @@
-define(["exports","mvc/workflow/workflow-globals"],function(t,e){"use strict";function n(t){this.collectionType=t,this.isCollection=!0,this.rank=t.split(":").length}Object.defineProperty(t,"__esModule",{value:!0});var i=function(t){return t&&t.__esModule?t:{default:t}}(e),o={isCollection:!1,canMatch:function(t){return!1},canMapOver:function(t){return!1},toString:function(){return"NullCollectionType[]"},append:function(t){return t},equal:function(t){return t===this}},c={isCollection:!0,canMatch:function(t){return o!==t},canMapOver:function(t){return!1},toString:function(){return"AnyCollectionType[]"},append:function(t){throw"Cannot append to ANY_COLLECTION_TYPE_DESCRIPTION"},equal:function(t){return t===this}};$.extend(n.prototype,{append:function(t){return t===o?this:t===c?otherCollectionType:new n(this.collectionType+":"+t.collectionType)},canMatch:function(t){return t!==o&&(t===c||t.collectionType==this.collectionType)},canMapOver:function(t){if(t===o)return!1;if(t===c)return!1;if(this.rank<=t.rank)return!1;var e=t.collectionType;return this._endsWith(this.collectionType,e)},effectiveMapOver:function(t){var e=t.collectionType;return new n(this.collectionType.substring(0,this.collectionType.length-e.length-1))},equal:function(t){return t.collectionType==this.collectionType},toString:function(){return"CollectionType["+this.collectionType+"]"},_endsWith:function(t,e){return-1!==t.indexOf(e,t.length-e.length)}});var a=Backbone.Model.extend({initialize:function(t){this.mapOver=t.mapOver||o,this.terminal=t.terminal,this.terminal.terminalMapping=this},disableMapOver:function(){this.setMapOver(o)},setMapOver:function(t){this.mapOver=t,this.trigger("change")}}),r=Backbone.Model.extend({initialize:function(t){this.element=t.element,this.connectors=[]},connect:function(t){this.connectors.push(t),this.node&&this.node.markChanged()},disconnect:function(t){this.connectors.splice($.inArray(t,this.connectors),1),this.node&&(this.node.markChanged(),this.resetMappingIfNeeded())},redraw:function(){$.each(this.connectors,function(t,e){e.redraw()})},destroy:function(){$.each(this.connectors.slice(),function(t,e){e.destroy()})},destroyInvalidConnections:function(){_.each(this.connectors,function(t){t&&t.destroyIfInvalid()})},setMapOver:function(t){this.multiple||this.mapOver().equal(t)||(this.terminalMapping.setMapOver(t),_.each(this.node.output_terminals,function(e){e.setMapOver(t)}))},mapOver:function(){return this.terminalMapping?this.terminalMapping.mapOver:o},isMappedOver:function(){return this.terminalMapping&&this.terminalMapping.mapOver.isCollection},resetMapping:function(){this.terminalMapping.disableMapOver()},resetMappingIfNeeded:function(){}}),s=r.extend({initialize:function(t){r.prototype.initialize.call(this,t),this.datatypes=t.datatypes},resetMappingIfNeeded:function(){this.node.hasConnectedOutputTerminals()||this.node.hasConnectedMappedInputTerminals()||_.each(this.node.mappedInputTerminals(),function(t){t.resetMappingIfNeeded()}),!this.node.hasMappedOverInputTerminals()&&this.resetMapping()},resetMapping:function(){this.terminalMapping.disableMapOver(),_.each(this.connectors,function(t){var e=t.handle2;e&&(e.resetMappingIfNeeded(),t.destroyIfInvalid())})}}),l=r.extend({initialize:function(t){r.prototype.initialize.call(this,t),this.update(t.input)},canAccept:function(t){return!this._inputFilled()&&this.attachable(t)},resetMappingIfNeeded:function(){this.mapOver().isCollection&&(this.node.hasConnectedMappedInputTerminals()||!this.node.hasConnectedOutputTerminals())&&this.resetMapping()},resetMapping:function(){this.terminalMapping.disableMapOver(),this.node.hasMappedOverInputTerminals()||_.each(this.node.output_terminals,function(t){t.resetMapping()})},connected:function(){return 0!==this.connectors.length},_inputFilled:function(){var t;return this.connected()?this.multiple?this._collectionAttached()?inputsFilled=!0:t=!1:t=!0:t=!1,t},_collectionAttached:function(){if(this.connected()){var t=this.connectors[0].handle1;return!!t&&!!(t.isCollection||t.isMappedOver()||t.datatypes.indexOf("input_collection")>0)}return!1},_mappingConstraints:function(){if(!this.node)return[];var t=this.mapOver();if(t.isCollection)return[t];var e=[];return this.node.hasConnectedOutputTerminals()?e.push(_.first(_.values(this.node.output_terminals)).mapOver()):_.each(this.node.connectedMappedInputTerminals(),function(t){e.push(t.mapOver())}),e},_producesAcceptableDatatype:function(t){for(var e in this.datatypes){var n=this.datatypes[e];if("input"==n)return!0;var o=new Array;if(o=o.concat(t.datatypes),t.node.post_job_actions)for(var c in t.node.post_job_actions){var a=t.node.post_job_actions[c];"ChangeDatatypeAction"!=a.action_type||""!=a.output_name&&a.output_name!=t.name||!a.action_arguments||o.push(a.action_arguments.newtype)}for(var r in o){var s=o[r];if("input"==s||"_sniff_"==s||"input_collection"==s||i.default.app.isSubType(o[r],n))return!0}}return!1},_otherCollectionType:function(t){var e=o;t.isCollection&&(e=t.collectionType);var n=t.mapOver();return n.isCollection&&(e=n.append(e)),e}}),p=l.extend({update:function(t){this.datatypes=t.extensions,this.multiple=t.multiple,this.collection=!1},connect:function(t){l.prototype.connect.call(this,t);var e=t.handle1;if(e){var n=this._otherCollectionType(e);n.isCollection&&this.setMapOver(n)}},attachable:function(t){var e=this._otherCollectionType(t),n=this.mapOver();return e.isCollection?this.multiple?!(this.connected()&&!this._collectionAttached())&&(1==e.rank&&this._producesAcceptableDatatype(t)):n.isCollection&&n.canMatch(e)?this._producesAcceptableDatatype(t):!!this._mappingConstraints().every(_.bind(e.canMatch,e))&&this._producesAcceptableDatatype(t):!n.isCollection&&this._producesAcceptableDatatype(t)}}),u=l.extend({update:function(t){this.multiple=!1,this.collection=!0,this.datatypes=t.extensions;var e=[];t.collection_types?_.each(t.collection_types,function(t){e.push(new n(t))}):e.push(c),this.collectionTypes=e},connect:function(t){l.prototype.connect.call(this,t);var e=t.handle1;if(e){var n=this._effectiveMapOver(e);this.setMapOver(n)}},_effectiveMapOver:function(t){var e=this.collectionTypes,n=this._otherCollectionType(t);if(!_.some(e,function(t){return t.canMatch(n)}))for(var i in e){var c=e[i];if(n.canMapOver(c)){var a=n.effectiveMapOver(c);if(a!=o)return a}}return o},_effectiveCollectionTypes:function(){var t=this.mapOver();return _.map(this.collectionTypes,function(e){return t.append(e)})},attachable:function(t){var e=this._otherCollectionType(t);if(e.isCollection){var n=this._effectiveCollectionTypes(),i=this.mapOver();if(_.some(n,function(t){return t.canMatch(e)}))return this._producesAcceptableDatatype(t);if(i.isCollection)return!1;if(_.some(this.collectionTypes,function(t){return e.canMapOver(t)})){var o=this._effectiveMapOver(t);if(!o.isCollection)return!1;if(this._mappingConstraints().every(o.canMatch))return this._producesAcceptableDatatype(t)}}return!1}}),h=r.extend({initialize:function(t){r.prototype.initialize.call(this,t),this.datatypes=t.datatypes,t.collection_type?this.collectionType=new n(t.collection_type):(t.collection_type_source||console.log("Warning: No collection type or collection type source defined."),this.collectionType=c),this.isCollection=!0},update:function(t){var e;t.collection_type?e=new n(t.collection_type):(t.collection_type_source||console.log("Warning: No collection type or collection type source defined."),e=c),e.collectionType!=this.collectionType.collectionType&&_.each(this.connectors,function(t){t.destroy()}),this.collectionType=e}});t.default={InputTerminal:p,OutputTerminal:s,InputCollectionTerminal:u,OutputCollectionTerminal:h,TerminalMapping:a,CollectionTypeDescription:n,NULL_COLLECTION_TYPE_DESCRIPTION:o,ANY_COLLECTION_TYPE_DESCRIPTION:c}});
+define(["exports"],function(t){"use strict";function e(t){this.collectionType=t,this.isCollection=!0,this.rank=t.split(":").length}Object.defineProperty(t,"__esModule",{value:!0}),window.workflow_globals=window.workflow_globals||{};var n={isCollection:!1,canMatch:function(t){return!1},canMapOver:function(t){return!1},toString:function(){return"NullCollectionType[]"},append:function(t){return t},equal:function(t){return t===this}},i={isCollection:!0,canMatch:function(t){return n!==t},canMapOver:function(t){return!1},toString:function(){return"AnyCollectionType[]"},append:function(t){throw"Cannot append to ANY_COLLECTION_TYPE_DESCRIPTION"},equal:function(t){return t===this}};$.extend(e.prototype,{append:function(t){return t===n?this:t===i?otherCollectionType:new e(this.collectionType+":"+t.collectionType)},canMatch:function(t){return t!==n&&(t===i||t.collectionType==this.collectionType)},canMapOver:function(t){if(t===n)return!1;if(t===i)return!1;if(this.rank<=t.rank)return!1;var e=t.collectionType;return this._endsWith(this.collectionType,e)},effectiveMapOver:function(t){var n=t.collectionType;return new e(this.collectionType.substring(0,this.collectionType.length-n.length-1))},equal:function(t){return t.collectionType==this.collectionType},toString:function(){return"CollectionType["+this.collectionType+"]"},_endsWith:function(t,e){return-1!==t.indexOf(e,t.length-e.length)}});var o=Backbone.Model.extend({initialize:function(t){this.mapOver=t.mapOver||n,this.terminal=t.terminal,this.terminal.terminalMapping=this},disableMapOver:function(){this.setMapOver(n)},setMapOver:function(t){this.mapOver=t,this.trigger("change")}}),c=Backbone.Model.extend({initialize:function(t){this.element=t.element,this.connectors=[]},connect:function(t){this.connectors.push(t),this.node&&this.node.markChanged()},disconnect:function(t){this.connectors.splice($.inArray(t,this.connectors),1),this.node&&(this.node.markChanged(),this.resetMappingIfNeeded())},redraw:function(){$.each(this.connectors,function(t,e){e.redraw()})},destroy:function(){$.each(this.connectors.slice(),function(t,e){e.destroy()})},destroyInvalidConnections:function(){_.each(this.connectors,function(t){t&&t.destroyIfInvalid()})},setMapOver:function(t){this.multiple||this.mapOver().equal(t)||(this.terminalMapping.setMapOver(t),_.each(this.node.output_terminals,function(e){e.setMapOver(t)}))},mapOver:function(){return this.terminalMapping?this.terminalMapping.mapOver:n},isMappedOver:function(){return this.terminalMapping&&this.terminalMapping.mapOver.isCollection},resetMapping:function(){this.terminalMapping.disableMapOver()},resetMappingIfNeeded:function(){}}),a=c.extend({initialize:function(t){c.prototype.initialize.call(this,t),this.datatypes=t.datatypes},resetMappingIfNeeded:function(){this.node.hasConnectedOutputTerminals()||this.node.hasConnectedMappedInputTerminals()||_.each(this.node.mappedInputTerminals(),function(t){t.resetMappingIfNeeded()}),!this.node.hasMappedOverInputTerminals()&&this.resetMapping()},resetMapping:function(){this.terminalMapping.disableMapOver(),_.each(this.connectors,function(t){var e=t.handle2;e&&(e.resetMappingIfNeeded(),t.destroyIfInvalid())})}}),r=c.extend({initialize:function(t){c.prototype.initialize.call(this,t),this.update(t.input)},canAccept:function(t){return!this._inputFilled()&&this.attachable(t)},resetMappingIfNeeded:function(){this.mapOver().isCollection&&(this.node.hasConnectedMappedInputTerminals()||!this.node.hasConnectedOutputTerminals())&&this.resetMapping()},resetMapping:function(){this.terminalMapping.disableMapOver(),this.node.hasMappedOverInputTerminals()||_.each(this.node.output_terminals,function(t){t.resetMapping()})},connected:function(){return 0!==this.connectors.length},_inputFilled:function(){var t;return this.connected()?this.multiple?this._collectionAttached()?inputsFilled=!0:t=!1:t=!0:t=!1,t},_collectionAttached:function(){if(this.connected()){var t=this.connectors[0].handle1;return!!t&&!!(t.isCollection||t.isMappedOver()||t.datatypes.indexOf("input_collection")>0)}return!1},_mappingConstraints:function(){if(!this.node)return[];var t=this.mapOver();if(t.isCollection)return[t];var e=[];return this.node.hasConnectedOutputTerminals()?e.push(_.first(_.values(this.node.output_terminals)).mapOver()):_.each(this.node.connectedMappedInputTerminals(),function(t){e.push(t.mapOver())}),e},_producesAcceptableDatatype:function(t){for(var e in this.datatypes){var n=this.datatypes[e];if("input"==n)return!0;var i=new Array;if(i=i.concat(t.datatypes),t.node.post_job_actions)for(var o in t.node.post_job_actions){var c=t.node.post_job_actions[o];"ChangeDatatypeAction"!=c.action_type||""!=c.output_name&&c.output_name!=t.name||!c.action_arguments||i.push(c.action_arguments.newtype)}for(var a in i){var r=i[a];if("input"==r||"_sniff_"==r||"input_collection"==r||window.workflow_globals.app.isSubType(i[a],n))return!0}}return!1},_otherCollectionType:function(t){var e=n;t.isCollection&&(e=t.collectionType);var i=t.mapOver();return i.isCollection&&(e=i.append(e)),e}}),s=r.extend({update:function(t){this.datatypes=t.extensions,this.multiple=t.multiple,this.collection=!1},connect:function(t){r.prototype.connect.call(this,t);var e=t.handle1;if(e){var n=this._otherCollectionType(e);n.isCollection&&this.setMapOver(n)}},attachable:function(t){var e=this._otherCollectionType(t),n=this.mapOver();return e.isCollection?this.multiple?!(this.connected()&&!this._collectionAttached())&&(1==e.rank&&this._producesAcceptableDatatype(t)):n.isCollection&&n.canMatch(e)?this._producesAcceptableDatatype(t):!!this._mappingConstraints().every(_.bind(e.canMatch,e))&&this._producesAcceptableDatatype(t):!n.isCollection&&this._producesAcceptableDatatype(t)}}),l=r.extend({update:function(t){this.multiple=!1,this.collection=!0,this.datatypes=t.extensions;var n=[];t.collection_types?_.each(t.collection_types,function(t){n.push(new e(t))}):n.push(i),this.collectionTypes=n},connect:function(t){r.prototype.connect.call(this,t);var e=t.handle1;if(e){var n=this._effectiveMapOver(e);this.setMapOver(n)}},_effectiveMapOver:function(t){var e=this.collectionTypes,i=this._otherCollectionType(t);if(!_.some(e,function(t){return t.canMatch(i)}))for(var o in e){var c=e[o];if(i.canMapOver(c)){var a=i.effectiveMapOver(c);if(a!=n)return a}}return n},_effectiveCollectionTypes:function(){var t=this.mapOver();return _.map(this.collectionTypes,function(e){return t.append(e)})},attachable:function(t){var e=this._otherCollectionType(t);if(e.isCollection){var n=this._effectiveCollectionTypes(),i=this.mapOver();if(_.some(n,function(t){return t.canMatch(e)}))return this._producesAcceptableDatatype(t);if(i.isCollection)return!1;if(_.some(this.collectionTypes,function(t){return e.canMapOver(t)})){var o=this._effectiveMapOver(t);if(!o.isCollection)return!1;if(this._mappingConstraints().every(o.canMatch))return this._producesAcceptableDatatype(t)}}return!1}}),p=c.extend({initialize:function(t){c.prototype.initialize.call(this,t),this.datatypes=t.datatypes,t.collection_type?this.collectionType=new e(t.collection_type):(t.collection_type_source||console.log("Warning: No collection type or collection type source defined."),this.collectionType=i),this.isCollection=!0},update:function(t){var n;t.collection_type?n=new e(t.collection_type):(t.collection_type_source||console.log("Warning: No collection type or collection type source defined."),n=i),n.collectionType!=this.collectionType.collectionType&&_.each(this.connectors,function(t){t.destroy()}),this.collectionType=n}});t.default={InputTerminal:s,OutputTerminal:a,InputCollectionTerminal:l,OutputCollectionTerminal:p,TerminalMapping:o,CollectionTypeDescription:e,NULL_COLLECTION_TYPE_DESCRIPTION:n,ANY_COLLECTION_TYPE_DESCRIPTION:i}});
//# sourceMappingURL=../../../maps/mvc/workflow/workflow-terminals.js.map
diff --git a/static/scripts/mvc/workflow/workflow-view-data.js b/static/scripts/mvc/workflow/workflow-view-data.js
index d24962d29cfa..f907bc17f1e1 100644
--- a/static/scripts/mvc/workflow/workflow-view-data.js
+++ b/static/scripts/mvc/workflow/workflow-view-data.js
@@ -1,2 +1,2 @@
-define(["exports","mvc/workflow/workflow-globals"],function(t,e){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(t){return t&&t.__esModule?t:{default:t}}(e),s=Backbone.View.extend({className:"form-row dataRow input-data-row",initialize:function(t){this.input=t.input,this.nodeView=t.nodeView,this.terminalElement=t.terminalElement,this.$el.attr("name",this.input.name).html(this.input.label),t.skipResize||(this.$el.css({position:"absolute",left:-1e3,top:-1e3,display:"none"}),$("body").append(this.el),this.nodeView.updateMaxWidth(this.$el.outerWidth()),this.$el.css({position:"",left:"",top:"",display:""}),this.$el.remove())}}),a=Backbone.View.extend({className:"form-row dataRow",initialize:function(t){this.output=t.output,this.terminalElement=t.terminalElement,this.nodeView=t.nodeView;var e=this.output,i=e.name,s=this.nodeView.node;if(e.extensions.indexOf("input")>=0||e.extensions.indexOf("input_collection")>=0||(i=i+" ("+e.extensions.join(", ")+")"),this.$el.html(i),this.calloutView=null,["tool","subworkflow"].indexOf(s.type)>=0){var a=new o({label:i,output:e,node:s});this.calloutView=a,this.$el.append(a.el),this.$el.hover(function(){a.hoverImage()},function(){a.resetImage()})}this.$el.css({position:"absolute",left:-1e3,top:-1e3,display:"none"}),$("body").append(this.el),this.nodeView.updateMaxWidth(this.$el.outerWidth()+17),this.$el.css({position:"",left:"",top:"",display:""}).detach()},redrawWorkflowOutput:function(){this.calloutView&&this.calloutView.resetImage()}}),o=Backbone.View.extend({tagName:"div",initialize:function(t){this.label=t.label,this.node=t.node,this.output=t.output;var e=this,s=this.node;this.$el.attr("class","callout "+this.label).css({display:"none"}).append($("
").append($(" ").attr("src",Galaxy.root+"static/images/fugue/asterisk-small-outline.png").click(function(){var t=e.output.name;s.isWorkflowOutput(t)?(s.removeWorkflowOutput(t),e.$("img").attr("src",Galaxy.root+"static/images/fugue/asterisk-small-outline.png")):(s.addWorkflowOutput(t),e.$("img").attr("src",Galaxy.root+"static/images/fugue/asterisk-small.png")),i.default.workflow.has_changes=!0,i.default.canvas_manager.draw_overview()}))).tooltip({delay:500,title:"Mark dataset as a workflow output. All unmarked datasets will be hidden."}),this.$el.css({top:"50%",margin:"-8px 0px 0px 0px",right:8}),this.$el.show(),this.resetImage()},resetImage:function(){this.node.isWorkflowOutput(this.output.name)?this.$("img").attr("src",Galaxy.root+"static/images/fugue/asterisk-small.png"):this.$("img").attr("src",Galaxy.root+"static/images/fugue/asterisk-small-outline.png")},hoverImage:function(){this.$("img").attr("src",Galaxy.root+"static/images/fugue/asterisk-small-yellow.png")}});t.default={DataInputView:s,DataOutputView:a}});
+define(["exports"],function(t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),window.workflow_globals=window.workflow_globals||{};var e=Backbone.View.extend({className:"form-row dataRow input-data-row",initialize:function(t){this.input=t.input,this.nodeView=t.nodeView,this.terminalElement=t.terminalElement,this.$el.attr("name",this.input.name).html(this.input.label),t.skipResize||(this.$el.css({position:"absolute",left:-1e3,top:-1e3,display:"none"}),$("body").append(this.el),this.nodeView.updateMaxWidth(this.$el.outerWidth()),this.$el.css({position:"",left:"",top:"",display:""}),this.$el.remove())}}),i=Backbone.View.extend({className:"form-row dataRow",initialize:function(t){this.output=t.output,this.terminalElement=t.terminalElement,this.nodeView=t.nodeView;var e=this.output,i=e.name,a=this.nodeView.node;if(e.extensions.indexOf("input")>=0||e.extensions.indexOf("input_collection")>=0||(i=i+" ("+e.extensions.join(", ")+")"),this.$el.html(i),this.calloutView=null,["tool","subworkflow"].indexOf(a.type)>=0){var o=new s({label:i,output:e,node:a});this.calloutView=o,this.$el.append(o.el),this.$el.hover(function(){o.hoverImage()},function(){o.resetImage()})}this.$el.css({position:"absolute",left:-1e3,top:-1e3,display:"none"}),$("body").append(this.el),this.nodeView.updateMaxWidth(this.$el.outerWidth()+17),this.$el.css({position:"",left:"",top:"",display:""}).detach()},redrawWorkflowOutput:function(){this.calloutView&&this.calloutView.resetImage()}}),s=Backbone.View.extend({tagName:"div",initialize:function(t){this.label=t.label,this.node=t.node,this.output=t.output;var e=this,i=this.node;this.$el.attr("class","callout "+this.label).css({display:"none"}).append($("
").append($(" ").attr("src",Galaxy.root+"static/images/fugue/asterisk-small-outline.png").click(function(){var t=e.output.name;i.isWorkflowOutput(t)?(i.removeWorkflowOutput(t),e.$("img").attr("src",Galaxy.root+"static/images/fugue/asterisk-small-outline.png")):(i.addWorkflowOutput(t),e.$("img").attr("src",Galaxy.root+"static/images/fugue/asterisk-small.png")),window.workflow_globals.workflow.has_changes=!0,window.workflow_globals.canvas_manager.draw_overview()}))).tooltip({delay:500,title:"Mark dataset as a workflow output. All unmarked datasets will be hidden."}),this.$el.css({top:"50%",margin:"-8px 0px 0px 0px",right:8}),this.$el.show(),this.resetImage()},resetImage:function(){this.node.isWorkflowOutput(this.output.name)?this.$("img").attr("src",Galaxy.root+"static/images/fugue/asterisk-small.png"):this.$("img").attr("src",Galaxy.root+"static/images/fugue/asterisk-small-outline.png")},hoverImage:function(){this.$("img").attr("src",Galaxy.root+"static/images/fugue/asterisk-small-yellow.png")}});t.default={DataInputView:e,DataOutputView:i}});
//# sourceMappingURL=../../../maps/mvc/workflow/workflow-view-data.js.map
diff --git a/static/scripts/mvc/workflow/workflow-view-terminals.js b/static/scripts/mvc/workflow/workflow-view-terminals.js
index 7a344bd002bf..35d96444dcd5 100644
--- a/static/scripts/mvc/workflow/workflow-view-terminals.js
+++ b/static/scripts/mvc/workflow/workflow-view-terminals.js
@@ -1,2 +1,2 @@
-define(["exports","mvc/workflow/workflow-globals","mvc/workflow/workflow-terminals","mvc/workflow/workflow-connector"],function(e,n,t,i){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(e,"__esModule",{value:!0});var o=a(n),r=a(t),l=a(i),s=Backbone.View.extend({tagName:"div",className:"fa-icon-button fa fa-folder-o",initialize:function(e){this.$el.tooltip({delay:500,title:"Run tool in parallel over collection"}),this.model.bind("change",_.bind(this.render,this))},render:function(){this.model.mapOver.isCollection?this.$el.show():this.$el.hide()}}),p=s.extend({events:{click:"onClick",mouseenter:"onMouseEnter",mouseleave:"onMouseLeave"},onMouseEnter:function(e){var n=this.model;!n.terminal.connected()&&n.mapOver.isCollection&&this.$el.css("color","red")},onMouseLeave:function(e){this.$el.css("color","black")},onClick:function(e){var n=this.model;!n.terminal.connected()&&n.mapOver.isCollection&&n.terminal.resetMapping()}}),c=Backbone.View.extend({setupMappingView:function(e){var n=new this.terminalMappingClass({terminal:e}),t=new this.terminalMappingViewClass({model:n});t.render(),e.terminalMappingView=t,this.terminalMappingView=t},terminalElements:function(){return this.terminalMappingView?[this.terminalMappingView.el,this.el]:[this.el]}}),u=c.extend({className:"terminal input-terminal",initialize:function(e){var n=e.node,t=e.input,i=t.name,a=this.terminalForInput(t);a.multiple||this.setupMappingView(a),this.el.terminal=a,a.node=n,a.name=i,n.input_terminals[i]=a},events:{dropinit:"onDropInit",dropstart:"onDropStart",dropend:"onDropEnd",drop:"onDrop",hover:"onHover"},onDropInit:function(e,n){var t=this.el.terminal;return $(n.drag).hasClass("output-terminal")&&t.canAccept(n.drag.terminal)},onDropStart:function(e,n){n.proxy.terminal&&(n.proxy.terminal.connectors[0].inner_color="#BBFFBB")},onDropEnd:function(e,n){n.proxy.terminal&&(n.proxy.terminal.connectors[0].inner_color="#FFFFFF")},onDrop:function(e,n){var t=this.el.terminal;new l.default(n.drag.terminal,t).redraw()},onHover:function(){var e=this.el,n=e.terminal;if(n.connectors.length>0){var t=$("
").css({display:"none"}).appendTo("body").append($("
").append($("
").addClass("fa-icon-button fa fa-times").click(function(){$.each(n.connectors,function(e,n){n&&n.destroy()}),t.remove()}))).bind("mouseleave",function(){$(this).remove()});t.css({top:$(e).offset().top-2,left:$(e).offset().left-t.width(),"padding-right":$(e).width()}).show()}}}),m=u.extend({terminalMappingClass:r.default.TerminalMapping,terminalMappingViewClass:p,terminalForInput:function(e){return new r.default.InputTerminal({element:this.el,input:e})}}),d=u.extend({terminalMappingClass:r.default.TerminalMapping,terminalMappingViewClass:p,terminalForInput:function(e){return new r.default.InputCollectionTerminal({element:this.el,input:e})}}),f=c.extend({className:"terminal output-terminal",initialize:function(e){var n=e.node,t=e.output,i=t.name,a=this.terminalForOutput(t);this.setupMappingView(a),this.el.terminal=a,a.node=n,a.name=i,n.output_terminals[i]=a},events:{drag:"onDrag",dragstart:"onDragStart",dragend:"onDragEnd"},onDrag:function(e,n){var t=function(){var e=$(n.proxy).offsetParent().offset(),t=n.offsetX-e.left,i=n.offsetY-e.top;$(n.proxy).css({left:t,top:i}),n.proxy.terminal.redraw(),o.default.canvas_manager.update_viewport_overlay()};t(),$("#canvas-container").get(0).scroll_panel.test(e,t)},onDragStart:function(e,n){$(n.available).addClass("input-terminal-active"),o.default.workflow.check_changes_in_active_form();var t=$('
').appendTo("#canvas-container").get(0);t.terminal=new r.default.OutputTerminal({element:t});var i=new l.default;return i.dragging=!0,i.connect(this.el.terminal,t.terminal),t},onDragEnd:function(e,n){var t=n.proxy.terminal.connectors[0];t&&t.destroy(),$(n.proxy).remove(),$(n.available).removeClass("input-terminal-active"),$("#canvas-container").get(0).scroll_panel.stop()}}),v=f.extend({terminalMappingClass:r.default.TerminalMapping,terminalMappingViewClass:s,terminalForOutput:function(e){var n=e.extensions;return new r.default.OutputTerminal({element:this.el,datatypes:n})}}),g=f.extend({terminalMappingClass:r.default.TerminalMapping,terminalMappingViewClass:s,terminalForOutput:function(e){var n=e.collection_type,t=e.collection_type_source;return new r.default.OutputCollectionTerminal({element:this.el,collection_type:n,collection_type_source:t,datatypes:e.extensions})}});e.default={InputTerminalView:m,OutputTerminalView:v,InputCollectionTerminalView:d,OutputCollectionTerminalView:g}});
+define(["exports","mvc/workflow/workflow-terminals","mvc/workflow/workflow-connector"],function(e,n,t){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(e,"__esModule",{value:!0});var a=i(n),o=i(t);window.workflow_globals=window.workflow_globals||{};var l=Backbone.View.extend({tagName:"div",className:"fa-icon-button fa fa-folder-o",initialize:function(e){this.$el.tooltip({delay:500,title:"Run tool in parallel over collection"}),this.model.bind("change",_.bind(this.render,this))},render:function(){this.model.mapOver.isCollection?this.$el.show():this.$el.hide()}}),r=l.extend({events:{click:"onClick",mouseenter:"onMouseEnter",mouseleave:"onMouseLeave"},onMouseEnter:function(e){var n=this.model;!n.terminal.connected()&&n.mapOver.isCollection&&this.$el.css("color","red")},onMouseLeave:function(e){this.$el.css("color","black")},onClick:function(e){var n=this.model;!n.terminal.connected()&&n.mapOver.isCollection&&n.terminal.resetMapping()}}),s=Backbone.View.extend({setupMappingView:function(e){var n=new this.terminalMappingClass({terminal:e}),t=new this.terminalMappingViewClass({model:n});t.render(),e.terminalMappingView=t,this.terminalMappingView=t},terminalElements:function(){return this.terminalMappingView?[this.terminalMappingView.el,this.el]:[this.el]}}),p=s.extend({className:"terminal input-terminal",initialize:function(e){var n=e.node,t=e.input,i=t.name,a=this.terminalForInput(t);a.multiple||this.setupMappingView(a),this.el.terminal=a,a.node=n,a.name=i,n.input_terminals[i]=a},events:{dropinit:"onDropInit",dropstart:"onDropStart",dropend:"onDropEnd",drop:"onDrop",hover:"onHover"},onDropInit:function(e,n){var t=this.el.terminal;return $(n.drag).hasClass("output-terminal")&&t.canAccept(n.drag.terminal)},onDropStart:function(e,n){n.proxy.terminal&&(n.proxy.terminal.connectors[0].inner_color="#BBFFBB")},onDropEnd:function(e,n){n.proxy.terminal&&(n.proxy.terminal.connectors[0].inner_color="#FFFFFF")},onDrop:function(e,n){var t=this.el.terminal;new o.default(n.drag.terminal,t).redraw()},onHover:function(){var e=this.el,n=e.terminal;if(n.connectors.length>0){var t=$("
").css({display:"none"}).appendTo("body").append($("
").append($("
").addClass("fa-icon-button fa fa-times").click(function(){$.each(n.connectors,function(e,n){n&&n.destroy()}),t.remove()}))).bind("mouseleave",function(){$(this).remove()});t.css({top:$(e).offset().top-2,left:$(e).offset().left-t.width(),"padding-right":$(e).width()}).show()}}}),c=p.extend({terminalMappingClass:a.default.TerminalMapping,terminalMappingViewClass:r,terminalForInput:function(e){return new a.default.InputTerminal({element:this.el,input:e})}}),u=p.extend({terminalMappingClass:a.default.TerminalMapping,terminalMappingViewClass:r,terminalForInput:function(e){return new a.default.InputCollectionTerminal({element:this.el,input:e})}}),m=s.extend({className:"terminal output-terminal",initialize:function(e){var n=e.node,t=e.output,i=t.name,a=this.terminalForOutput(t);this.setupMappingView(a),this.el.terminal=a,a.node=n,a.name=i,n.output_terminals[i]=a},events:{drag:"onDrag",dragstart:"onDragStart",dragend:"onDragEnd"},onDrag:function(e,n){var t=function(){var e=$(n.proxy).offsetParent().offset(),t=n.offsetX-e.left,i=n.offsetY-e.top;$(n.proxy).css({left:t,top:i}),n.proxy.terminal.redraw(),window.workflow_globals.canvas_manager.update_viewport_overlay()};t(),$("#canvas-container").get(0).scroll_panel.test(e,t)},onDragStart:function(e,n){$(n.available).addClass("input-terminal-active"),window.workflow_globals.workflow.check_changes_in_active_form();var t=$('
').appendTo("#canvas-container").get(0);t.terminal=new a.default.OutputTerminal({element:t});var i=new o.default;return i.dragging=!0,i.connect(this.el.terminal,t.terminal),t},onDragEnd:function(e,n){var t=n.proxy.terminal.connectors[0];t&&t.destroy(),$(n.proxy).remove(),$(n.available).removeClass("input-terminal-active"),$("#canvas-container").get(0).scroll_panel.stop()}}),d=m.extend({terminalMappingClass:a.default.TerminalMapping,terminalMappingViewClass:l,terminalForOutput:function(e){var n=e.extensions;return new a.default.OutputTerminal({element:this.el,datatypes:n})}}),f=m.extend({terminalMappingClass:a.default.TerminalMapping,terminalMappingViewClass:l,terminalForOutput:function(e){var n=e.collection_type,t=e.collection_type_source;return new a.default.OutputCollectionTerminal({element:this.el,collection_type:n,collection_type_source:t,datatypes:e.extensions})}});e.default={InputTerminalView:c,OutputTerminalView:d,InputCollectionTerminalView:u,OutputCollectionTerminalView:f}});
//# sourceMappingURL=../../../maps/mvc/workflow/workflow-view-terminals.js.map
diff --git a/static/scripts/mvc/workflow/workflow-view.js b/static/scripts/mvc/workflow/workflow-view.js
index 290c33d1f35b..749981612d23 100644
--- a/static/scripts/mvc/workflow/workflow-view.js
+++ b/static/scripts/mvc/workflow/workflow-view.js
@@ -1,2 +1,2 @@
-define(["exports","utils/utils","mvc/workflow/workflow-globals","mvc/workflow/workflow-manager","mvc/workflow/workflow-canvas","mvc/workflow/workflow-node","mvc/workflow/workflow-icons","mvc/workflow/workflow-forms","mvc/ui/ui-misc","utils/async-save-text","libs/toastr","ui/editable-text"],function(o,t,e,i,a,n,s,l,r,d,f){"use strict";function w(o){return o&&o.__esModule?o:{default:o}}function c(o){var t=$("#galaxy_tools").contents();0===t.length&&(t=$(document),$(this).removeClass("search_active"),t.find(".toolTitle").removeClass("search_match"),t.find(".toolSectionBody").hide(),t.find(".toolTitle").show(),t.find(".toolPanelLabel").show(),t.find(".toolSectionWrapper").each(function(){"recently_used_wrapper"!==$(this).attr("id")?$(this).show():$(this).hasClass("user_pref_visible")&&$(this).show()}),t.find("#search-no-results").hide(),t.find("#search-spinner").hide(),o&&t.find("#tool-search-query").val("search tools"))}function u(o,t){var e=g.default[t];if(e){var i=$(' ').addClass(e);o.before(i)}}Object.defineProperty(o,"__esModule",{value:!0});var h=w(t),p=w(e),v=w(i),m=w(a),k=w(n),g=w(s),y=w(l),b=w(r),x=w(d);w(f);o.default=Backbone.View.extend({initialize:function(o){function t(){$.jStorage.set("overview-off",!1),$("#overview-border").css("right","0px"),$("#close-viewport").css("background-position","0px 0px")}function e(){$.jStorage.set("overview-off",!0),$("#overview-border").css("right","20000px"),$("#close-viewport").css("background-position","12px 0px")}var i=p.default.app=this;this.options=o,this.urls=o&&o.urls||{};var a=function(o,t){if(show_message("Saving workflow","progress"),i.workflow.check_changes_in_active_form(),!i.workflow.has_changes)return hide_modal(),void(t&&t());i.workflow.rectify_workflow_outputs(),h.default.request({url:Galaxy.root+"api/workflows/"+i.options.id,type:"PUT",data:{workflow:i.workflow.to_simple()},success:function(o){var e=$("
").text(o.message);if(o.errors){e.addClass("warningmark");var a=$("");$.each(o.errors,function(o,t){$(" ").text(t).appendTo(a)}),e.append(a)}else e.addClass("donemark");i.workflow.name=o.name,i.workflow.has_changes=!1,i.workflow.stored=!0,i.showWorkflowParameters(),o.errors?window.show_modal("Saving workflow",e,{Ok:hide_modal}):(t&&t(),hide_modal())},error:function(o){window.show_modal("Saving workflow failed.",o.err_msg,{Ok:hide_modal})}})};$("#tool-search-query").click(function(){$(this).focus(),$(this).select()}).keyup(function(){if($(this).css("font-style","normal"),this.value.length<3)c(!1);else if(this.value!=this.lastValue){$(this).addClass("search_active");var o=this.value;this.timer&&clearTimeout(this.timer),$("#search-spinner").show(),this.timer=setTimeout(function(){$.get(i.urls.tool_search,{q:o},function(o){if($("#search-no-results").hide(),$(".toolSectionWrapper").hide(),$(".toolSectionWrapper").find(".toolTitle").hide(),0!=o.length){var t=$.map(o,function(o,t){return"link-"+o});$(t).each(function(o,t){$("[id='"+t+"']").parent().addClass("search_match"),$("[id='"+t+"']").parent().show().parent().parent().show().parent().show()}),$(".toolPanelLabel").each(function(){for(var o=$(this),t=o.next(),e=!0;0!==t.length&&t.hasClass("toolTitle");){if(t.is(":visible")){e=!1;break}t=t.next()}e&&o.hide()})}else $("#search-no-results").show();$("#search-spinner").hide()},"json")},400)}this.lastValue=this.value}),this.canvas_manager=p.default.canvas_manager=new m.default(this,$("#canvas-viewport"),$("#overview")),this.reset(),this.datatypes=JSON.parse($.ajax({url:Galaxy.root+"api/datatypes",async:!1}).responseText),this.datatypes_mapping=JSON.parse($.ajax({url:Galaxy.root+"api/datatypes/mapping",async:!1}).responseText),this.ext_to_type=this.datatypes_mapping.ext_to_class_name,this.type_to_type=this.datatypes_mapping.class_to_classes,this._workflowLoadAjax(i.options.id,{success:function(o){i.reset(),i.workflow.from_simple(o,!0),i.workflow.has_changes=!1,i.workflow.fit_canvas_to_nodes(),i.scroll_to_nodes(),i.canvas_manager.draw_overview();var t="";_.each(o.steps,function(e,a){var n="";e.errors&&(n+=""+e.errors+" "),_.each(o.upgrade_messages[a],function(o){n+=""+o+" "}),n&&(t+="Step "+(parseInt(a,10)+1)+": "+i.workflow.nodes[a].name+" ")}),t?window.show_modal("Issues loading this workflow","Please review the following issues, possibly resulting from tool upgrades or changes.
",{Continue:hide_modal}):hide_modal(),i.showWorkflowParameters()},beforeSubmit:function(o){show_message("Loading workflow","progress")}}),window.make_popupmenu&&make_popupmenu($("#workflow-options-button"),{Save:a,"Save As":function(){var o=$('');window.show_modal("Save As a New Workflow",o,{OK:function(){var o=$("#workflow_rename").val().length>0?$("#workflow_rename").val():"SavedAs_"+i.workflow.name,t=$("#wf_annotation").val().length>0?$("#wf_annotation").val():"";$.ajax({url:i.urls.workflow_save_as,type:"POST",data:{workflow_name:o,workflow_annotation:t,workflow_data:function(){return JSON.stringify(i.workflow.to_simple())}}}).done(function(o){window.onbeforeunload=void 0,window.location=Galaxy.root+"workflow/editor?id="+o,hide_modal()}).fail(function(){hide_modal(),alert("Saving this workflow failed. Please contact this site's administrator.")})},Cancel:hide_modal})},Run:function(){window.location=Galaxy.root+"workflow/run?id="+i.options.id},"Edit Attributes":function(){i.workflow.clear_active_node()},"Auto Re-layout":function(){i.workflow.layout(),i.workflow.fit_canvas_to_nodes(),i.scroll_to_nodes(),i.canvas_manager.draw_overview()},Close:function(){if(i.workflow.check_changes_in_active_form(),workflow&&i.workflow.has_changes){var o=function(){window.onbeforeunload=void 0,window.document.location=i.urls.workflow_index};window.show_modal("Close workflow editor","There are unsaved changes to your workflow which will be lost.",{Cancel:hide_modal,"Save Changes":function(){a(null,o)}},{"Don't Save":o})}else window.document.location=i.urls.workflow_index}});var n=$.jStorage.get("overview-size");void 0!==n&&$("#overview-border").css({width:n,height:n}),$.jStorage.get("overview-off")?e():t(),$("#overview-border").bind("dragend",function(o,t){var e=$(this).offsetParent(),i=e.offset(),a=Math.max(e.width()-(t.offsetX-i.left),e.height()-(t.offsetY-i.top));$.jStorage.set("overview-size",a+"px")}),$("#close-viewport").click(function(){"0px"===$("#overview-border").css("right")?e():t()}),window.onbeforeunload=function(){if(workflow&&i.workflow.has_changes)return"There are unsaved changes to your workflow which will be lost."},this.options.workflows.length>0&&$("#left").find(".toolMenu").append(this._buildToolPanelWorkflows()),$("div.toolSectionBody").hide(),$("div.toolSectionTitle > span").wrap(" ");var s=null;$("div.toolSectionTitle").each(function(){var o=$(this).next("div.toolSectionBody");$(this).click(function(){o.is(":hidden")?(s&&s.slideUp("fast"),s=o,o.slideDown("fast")):(o.slideUp("fast"),s=null)})}),(0,x.default)("workflow-name","workflow-name",i.urls.rename_async,"new_name"),$("#workflow-tag").click(function(){return $(".tag-area").click(),!1}),(0,x.default)("workflow-annotation","workflow-annotation",i.urls.annotate_async,"new_annotation",25,!0,4)},_buildToolPanelWorkflows:function(){var o=this,t=$('');return _.each(this.options.workflows,function(e){if(e.id!==o.options.id){var i=new b.default.ButtonIcon({icon:"fa fa-copy",cls:"ui-button-icon-plain",tooltip:"Copy and insert individual steps",onclick:function(){e.step_count<2?o.copy_into_workflow(e.id,e.name):Galaxy.modal.show({title:"Warning",body:"This will copy "+e.step_count+" new steps into your workflow.",buttons:{Cancel:function(){Galaxy.modal.hide()},Copy:function(){Galaxy.modal.hide(),o.copy_into_workflow(e.id,e.name)}}})}}),a=$(" ").attr("href","#").html(e.name).on("click",function(){o.add_node_for_subworkflow(e.latest_id,e.name)});t.find(".toolSectionBg").append($("
").addClass("toolTitle").append(a).append(i.$el))}}),t},copy_into_workflow:function(o){var t=this;this._workflowLoadAjax(o,{success:function(o){t.workflow.from_simple(o,!1);var e="";$.each(o.upgrade_messages,function(o,i){e+="Step "+(parseInt(o,10)+1)+": "+t.workflow.nodes[o].name+"",$.each(i,function(o,t){e+=""+t+" "}),e+=" "}),e?window.show_modal("Subworkflow embedded with changes","Problems were encountered loading this workflow (possibly a result of tool upgrades). Please review the following parameters and then save.",{Continue:hide_modal}):hide_modal()},beforeSubmit:function(o){show_message("Importing workflow","progress")}})},reset:function(){this.workflow&&this.workflow.remove_all(),this.workflow=p.default.workflow=new v.default(this,$("#canvas-container"))},scroll_to_nodes:function(){var o,t,e=$("#canvas-viewport"),i=$("#canvas-container");t=i.width().toolForm:last>.toolFormTitle>.buttons").click(function(){var o=$(this).closest(".toolForm",".action_tag").children(".action_tag:first").text();$(this).closest(".toolForm").remove(),delete e.workflow.active_node.post_job_actions[o],e.workflow.active_form_has_changes=!0})},display_pja_list:function(){return pja_list},display_file_list:function(o){var t="";for(var e in o.output_terminals)t+=""+e+" ";return t+=" "},new_pja:function(o,t,e){if(void 0===e.post_job_actions&&(e.post_job_actions={}),void 0===e.post_job_actions[o+t]){var i={};return i.action_type=o,i.output_name=t,e.post_job_actions[o+t]=null,e.post_job_actions[o+t]=i,display_pja(i,e),this.workflow.active_form_has_changes=!0,!0}return!1},showWorkflowParameters:function(){var o=/\$\{.+?\}/g,t=[],e=$("#workflow-parameters-container"),i=$("#workflow-parameters-box"),a="",n=[];$.each(this.workflow.nodes,function(e,i){i.config_form&&i.config_form.inputs&&h.default.deepeach(i.config_form.inputs,function(t){if("string"==typeof t.value){var e=t.value.match(o);e&&(n=n.concat(e))}}),i.post_job_actions&&$.each(i.post_job_actions,function(t,e){e.action_arguments&&$.each(e.action_arguments,function(t,e){var i=e.match(o);i&&(n=n.concat(i))})}),n&&$.each(n,function(o,e){-1===$.inArray(e,t)&&t.push(e)})}),t&&0!==t.length?($.each(t,function(o,t){a+=""+t.substring(2,t.length-1)+"
"}),e.html(a),i.show()):(e.html(a),i.hide())},showAttributes:function(){$(".right-content").hide(),$("#edit-attributes").show()},showForm:function(o,t){var e="right-content",i=e+"-"+t.id,a=$("#"+e);if(o&&0==a.find("#"+i).length){var n=$('
');if(o.node=t,o.workflow=this.workflow,o.datatypes=this.datatypes,o.icon=g.default[t.type],o.cls="ui-portlet-narrow",t){var s="tool"==t.type?"Tool":"Default";n.append(new y.default[s](o).form.$el),a.append(n)}else Galaxy.emit.debug("workflow-view::initialize()","Node not found in workflow.")}$("."+e).hide(),a.find("#"+i).show(),a.show(),a.scrollTop()},isSubType:function(o,t){return o=this.ext_to_type[o],t=this.ext_to_type[t],this.type_to_type[o]&&t in this.type_to_type[o]},prebuildNode:function(o,t,e){var i=this,a=$("
"),n=$(""+t+"
");u(n.find(".nodeTitle"),o),a.append(n),a.css("left",$(window).scrollLeft()+20),a.css("top",$(window).scrollTop()+20),a.append($("
"));var s=new k.default(this,{element:a});s.type=o,s.content_id=e;var l=" loading tool info...
";a.find(".toolFormBody").append(l);var r=$("
");r.append($("
").addClass("fa-icon-button fa fa-times").click(function(o){s.destroy()})),a.appendTo("#canvas-container");var d=$("#canvas-container").position(),f=$("#canvas-container").parent(),w=a.width(),c=a.height();return a.css({left:-d.left+f.width()/2-w/2,top:-d.top+f.height()/2-c/2}),r.prependTo(a.find(".toolFormTitle")),w+=r.width()+10,a.css("width",w),a.bind("dragstart",function(){i.workflow.activate_node(s)}).bind("dragend",function(){i.workflow.node_changed(this),i.workflow.fit_canvas_to_nodes(),i.canvas_manager.draw_overview()}).bind("dragclickonly",function(){i.workflow.activate_node(s)}).bind("drag",function(o,t){var e=$(this).offsetParent().offset(),i=t.offsetX-e.left,a=t.offsetY-e.top;$(this).css({left:i,top:a}),$(this).find(".terminal").each(function(){this.terminal.redraw()})}),s}})});
+define(["exports","utils/utils","mvc/workflow/workflow-manager","mvc/workflow/workflow-canvas","mvc/workflow/workflow-node","mvc/workflow/workflow-icons","mvc/workflow/workflow-forms","mvc/ui/ui-misc","utils/async-save-text","libs/toastr","ui/editable-text"],function(o,t,e,i,a,n,s,l,r,d){"use strict";function w(o){return o&&o.__esModule?o:{default:o}}function f(o){var t=$("#galaxy_tools").contents();0===t.length&&(t=$(document),$(this).removeClass("search_active"),t.find(".toolTitle").removeClass("search_match"),t.find(".toolSectionBody").hide(),t.find(".toolTitle").show(),t.find(".toolPanelLabel").show(),t.find(".toolSectionWrapper").each(function(){"recently_used_wrapper"!==$(this).attr("id")?$(this).show():$(this).hasClass("user_pref_visible")&&$(this).show()}),t.find("#search-no-results").hide(),t.find("#search-spinner").hide(),o&&t.find("#tool-search-query").val("search tools"))}function c(o,t){var e=m.default[t];if(e){var i=$(' ').addClass(e);o.before(i)}}Object.defineProperty(o,"__esModule",{value:!0});var u=w(t),h=w(e),p=w(i),v=w(a),m=w(n),k=w(s),g=w(l),y=w(r);w(d);window.workflow_globals=window.workflow_globals||{},o.default=Backbone.View.extend({initialize:function(o){function t(){$.jStorage.set("overview-off",!1),$("#overview-border").css("right","0px"),$("#close-viewport").css("background-position","0px 0px")}function e(){$.jStorage.set("overview-off",!0),$("#overview-border").css("right","20000px"),$("#close-viewport").css("background-position","12px 0px")}var i=window.workflow_globals.app=this;this.options=o,this.urls=o&&o.urls||{};var a=function(o,t){if(show_message("Saving workflow","progress"),i.workflow.check_changes_in_active_form(),!i.workflow.has_changes)return hide_modal(),void(t&&t());i.workflow.rectify_workflow_outputs(),u.default.request({url:Galaxy.root+"api/workflows/"+i.options.id,type:"PUT",data:{workflow:i.workflow.to_simple()},success:function(o){var e=$("
").text(o.message);if(o.errors){e.addClass("warningmark");var a=$("");$.each(o.errors,function(o,t){$(" ").text(t).appendTo(a)}),e.append(a)}else e.addClass("donemark");i.workflow.name=o.name,i.workflow.has_changes=!1,i.workflow.stored=!0,i.showWorkflowParameters(),o.errors?window.show_modal("Saving workflow",e,{Ok:hide_modal}):(t&&t(),hide_modal())},error:function(o){window.show_modal("Saving workflow failed.",o.err_msg,{Ok:hide_modal})}})};$("#tool-search-query").click(function(){$(this).focus(),$(this).select()}).keyup(function(){if($(this).css("font-style","normal"),this.value.length<3)f(!1);else if(this.value!=this.lastValue){$(this).addClass("search_active");var o=this.value;this.timer&&clearTimeout(this.timer),$("#search-spinner").show(),this.timer=setTimeout(function(){$.get(i.urls.tool_search,{q:o},function(o){if($("#search-no-results").hide(),$(".toolSectionWrapper").hide(),$(".toolSectionWrapper").find(".toolTitle").hide(),0!=o.length){var t=$.map(o,function(o,t){return"link-"+o});$(t).each(function(o,t){$("[id='"+t+"']").parent().addClass("search_match"),$("[id='"+t+"']").parent().show().parent().parent().show().parent().show()}),$(".toolPanelLabel").each(function(){for(var o=$(this),t=o.next(),e=!0;0!==t.length&&t.hasClass("toolTitle");){if(t.is(":visible")){e=!1;break}t=t.next()}e&&o.hide()})}else $("#search-no-results").show();$("#search-spinner").hide()},"json")},400)}this.lastValue=this.value}),this.canvas_manager=window.workflow_globals.canvas_manager=new p.default(this,$("#canvas-viewport"),$("#overview")),this.reset(),this.datatypes=JSON.parse($.ajax({url:Galaxy.root+"api/datatypes",async:!1}).responseText),this.datatypes_mapping=JSON.parse($.ajax({url:Galaxy.root+"api/datatypes/mapping",async:!1}).responseText),this.ext_to_type=this.datatypes_mapping.ext_to_class_name,this.type_to_type=this.datatypes_mapping.class_to_classes,this._workflowLoadAjax(i.options.id,{success:function(o){i.reset(),i.workflow.from_simple(o,!0),i.workflow.has_changes=!1,i.workflow.fit_canvas_to_nodes(),i.scroll_to_nodes(),i.canvas_manager.draw_overview();var t="";_.each(o.steps,function(e,a){var n="";e.errors&&(n+=""+e.errors+" "),_.each(o.upgrade_messages[a],function(o){n+=""+o+" "}),n&&(t+="Step "+(parseInt(a,10)+1)+": "+i.workflow.nodes[a].name+" ")}),t?window.show_modal("Issues loading this workflow","Please review the following issues, possibly resulting from tool upgrades or changes.
",{Continue:hide_modal}):hide_modal(),i.showWorkflowParameters()},beforeSubmit:function(o){show_message("Loading workflow","progress")}}),window.make_popupmenu&&make_popupmenu($("#workflow-options-button"),{Save:a,"Save As":function(){var o=$('');window.show_modal("Save As a New Workflow",o,{OK:function(){var o=$("#workflow_rename").val().length>0?$("#workflow_rename").val():"SavedAs_"+i.workflow.name,t=$("#wf_annotation").val().length>0?$("#wf_annotation").val():"";$.ajax({url:i.urls.workflow_save_as,type:"POST",data:{workflow_name:o,workflow_annotation:t,workflow_data:function(){return JSON.stringify(i.workflow.to_simple())}}}).done(function(o){window.onbeforeunload=void 0,window.location=Galaxy.root+"workflow/editor?id="+o,hide_modal()}).fail(function(){hide_modal(),alert("Saving this workflow failed. Please contact this site's administrator.")})},Cancel:hide_modal})},Run:function(){window.location=Galaxy.root+"workflow/run?id="+i.options.id},"Edit Attributes":function(){i.workflow.clear_active_node()},"Auto Re-layout":function(){i.workflow.layout(),i.workflow.fit_canvas_to_nodes(),i.scroll_to_nodes(),i.canvas_manager.draw_overview()},Close:function(){if(i.workflow.check_changes_in_active_form(),workflow&&i.workflow.has_changes){var o=function(){window.onbeforeunload=void 0,window.document.location=i.urls.workflow_index};window.show_modal("Close workflow editor","There are unsaved changes to your workflow which will be lost.",{Cancel:hide_modal,"Save Changes":function(){a(null,o)}},{"Don't Save":o})}else window.document.location=i.urls.workflow_index}});var n=$.jStorage.get("overview-size");void 0!==n&&$("#overview-border").css({width:n,height:n}),$.jStorage.get("overview-off")?e():t(),$("#overview-border").bind("dragend",function(o,t){var e=$(this).offsetParent(),i=e.offset(),a=Math.max(e.width()-(t.offsetX-i.left),e.height()-(t.offsetY-i.top));$.jStorage.set("overview-size",a+"px")}),$("#close-viewport").click(function(){"0px"===$("#overview-border").css("right")?e():t()}),window.onbeforeunload=function(){if(workflow&&i.workflow.has_changes)return"There are unsaved changes to your workflow which will be lost."},this.options.workflows.length>0&&$("#left").find(".toolMenu").append(this._buildToolPanelWorkflows()),$("div.toolSectionBody").hide(),$("div.toolSectionTitle > span").wrap(" ");var s=null;$("div.toolSectionTitle").each(function(){var o=$(this).next("div.toolSectionBody");$(this).click(function(){o.is(":hidden")?(s&&s.slideUp("fast"),s=o,o.slideDown("fast")):(o.slideUp("fast"),s=null)})}),(0,y.default)("workflow-name","workflow-name",i.urls.rename_async,"new_name"),$("#workflow-tag").click(function(){return $(".tag-area").click(),!1}),(0,y.default)("workflow-annotation","workflow-annotation",i.urls.annotate_async,"new_annotation",25,!0,4)},_buildToolPanelWorkflows:function(){var o=this,t=$('');return _.each(this.options.workflows,function(e){if(e.id!==o.options.id){var i=new g.default.ButtonIcon({icon:"fa fa-copy",cls:"ui-button-icon-plain",tooltip:"Copy and insert individual steps",onclick:function(){e.step_count<2?o.copy_into_workflow(e.id,e.name):Galaxy.modal.show({title:"Warning",body:"This will copy "+e.step_count+" new steps into your workflow.",buttons:{Cancel:function(){Galaxy.modal.hide()},Copy:function(){Galaxy.modal.hide(),o.copy_into_workflow(e.id,e.name)}}})}}),a=$(" ").attr("href","#").html(e.name).on("click",function(){o.add_node_for_subworkflow(e.latest_id,e.name)});t.find(".toolSectionBg").append($("
").addClass("toolTitle").append(a).append(i.$el))}}),t},copy_into_workflow:function(o){var t=this;this._workflowLoadAjax(o,{success:function(o){t.workflow.from_simple(o,!1);var e="";$.each(o.upgrade_messages,function(o,i){e+="Step "+(parseInt(o,10)+1)+": "+t.workflow.nodes[o].name+"",$.each(i,function(o,t){e+=""+t+" "}),e+=" "}),e?window.show_modal("Subworkflow embedded with changes","Problems were encountered loading this workflow (possibly a result of tool upgrades). Please review the following parameters and then save.",{Continue:hide_modal}):hide_modal()},beforeSubmit:function(o){show_message("Importing workflow","progress")}})},reset:function(){this.workflow&&this.workflow.remove_all(),this.workflow=window.workflow_globals.workflow=new h.default(this,$("#canvas-container"))},scroll_to_nodes:function(){var o,t,e=$("#canvas-viewport"),i=$("#canvas-container");t=i.width().toolForm:last>.toolFormTitle>.buttons").click(function(){var o=$(this).closest(".toolForm",".action_tag").children(".action_tag:first").text();$(this).closest(".toolForm").remove(),delete e.workflow.active_node.post_job_actions[o],e.workflow.active_form_has_changes=!0})},display_pja_list:function(){return pja_list},display_file_list:function(o){var t="";for(var e in o.output_terminals)t+=""+e+" ";return t+=" "},new_pja:function(o,t,e){if(void 0===e.post_job_actions&&(e.post_job_actions={}),void 0===e.post_job_actions[o+t]){var i={};return i.action_type=o,i.output_name=t,e.post_job_actions[o+t]=null,e.post_job_actions[o+t]=i,display_pja(i,e),this.workflow.active_form_has_changes=!0,!0}return!1},showWorkflowParameters:function(){var o=/\$\{.+?\}/g,t=[],e=$("#workflow-parameters-container"),i=$("#workflow-parameters-box"),a="",n=[];$.each(this.workflow.nodes,function(e,i){i.config_form&&i.config_form.inputs&&u.default.deepeach(i.config_form.inputs,function(t){if("string"==typeof t.value){var e=t.value.match(o);e&&(n=n.concat(e))}}),i.post_job_actions&&$.each(i.post_job_actions,function(t,e){e.action_arguments&&$.each(e.action_arguments,function(t,e){var i=e.match(o);i&&(n=n.concat(i))})}),n&&$.each(n,function(o,e){-1===$.inArray(e,t)&&t.push(e)})}),t&&0!==t.length?($.each(t,function(o,t){a+=""+t.substring(2,t.length-1)+"
"}),e.html(a),i.show()):(e.html(a),i.hide())},showAttributes:function(){$(".right-content").hide(),$("#edit-attributes").show()},showForm:function(o,t){var e="right-content",i=e+"-"+t.id,a=$("#"+e);if(o&&0==a.find("#"+i).length){var n=$('
');if(o.node=t,o.workflow=this.workflow,o.datatypes=this.datatypes,o.icon=m.default[t.type],o.cls="ui-portlet-narrow",t){var s="tool"==t.type?"Tool":"Default";n.append(new k.default[s](o).form.$el),a.append(n)}else Galaxy.emit.debug("workflow-view::initialize()","Node not found in workflow.")}$("."+e).hide(),a.find("#"+i).show(),a.show(),a.scrollTop()},isSubType:function(o,t){return o=this.ext_to_type[o],t=this.ext_to_type[t],this.type_to_type[o]&&t in this.type_to_type[o]},prebuildNode:function(o,t,e){var i=this,a=$("
"),n=$(""+t+"
");c(n.find(".nodeTitle"),o),a.append(n),a.css("left",$(window).scrollLeft()+20),a.css("top",$(window).scrollTop()+20),a.append($("
"));var s=new v.default(this,{element:a});s.type=o,s.content_id=e;var l=" loading tool info...
";a.find(".toolFormBody").append(l);var r=$("
");r.append($("
").addClass("fa-icon-button fa fa-times").click(function(o){s.destroy()})),a.appendTo("#canvas-container");var d=$("#canvas-container").position(),w=$("#canvas-container").parent(),f=a.width(),u=a.height();return a.css({left:-d.left+w.width()/2-f/2,top:-d.top+w.height()/2-u/2}),r.prependTo(a.find(".toolFormTitle")),f+=r.width()+10,a.css("width",f),a.bind("dragstart",function(){i.workflow.activate_node(s)}).bind("dragend",function(){i.workflow.node_changed(this),i.workflow.fit_canvas_to_nodes(),i.canvas_manager.draw_overview()}).bind("dragclickonly",function(){i.workflow.activate_node(s)}).bind("drag",function(o,t){var e=$(this).offsetParent().offset(),i=t.offsetX-e.left,a=t.offsetY-e.top;$(this).css({left:i,top:a}),$(this).find(".terminal").each(function(){this.terminal.redraw()})}),s}})});
//# sourceMappingURL=../../../maps/mvc/workflow/workflow-view.js.map