diff --git a/client/src/mvc/ui/ui-misc.js b/client/src/mvc/ui/ui-misc.js index e4e0f460964..2c522de5ee9 100644 --- a/client/src/mvc/ui/ui-misc.js +++ b/client/src/mvc/ui/ui-misc.js @@ -247,12 +247,14 @@ export var Upload = Backbone.View.extend({ return this; }, _readFile: function (e) { - var self = this; var file = e.target.files && e.target.files[0]; if (file) { var reader = new FileReader(); - reader.onload = function () { - self.model.set({ wait: false, value: this.result }); + reader.onload = () => { + this.model.set({ wait: false, value: reader.result }); + if (this.model.get("onchange")) { + this.model.get("onchange")(this.value()); + } }; this.model.set({ wait: true, value: null }); reader.readAsText(file); diff --git a/lib/galaxy/webapps/galaxy/controllers/forms.py b/lib/galaxy/webapps/galaxy/controllers/forms.py index c868f59bdb8..8134ffe4b0a 100644 --- a/lib/galaxy/webapps/galaxy/controllers/forms.py +++ b/lib/galaxy/webapps/galaxy/controllers/forms.py @@ -1,4 +1,5 @@ import copy +import csv import logging import re @@ -122,7 +123,7 @@ class Forms(BaseUIController): { "name": "type", "type": "select", - "options": [("None", "none")] + [(ft[1], ft[1]) for ft in fd_types], + "options": [(ft[1], ft[1]) for ft in fd_types], "label": "Type", }, { @@ -130,6 +131,7 @@ class Forms(BaseUIController): "label": "Import from CSV", "type": "upload", "help": "Import fields from CSV-file with the following format: Label, Help, Type, Value, Options, Required=True/False.", + "optional": True, }, ], } @@ -139,16 +141,18 @@ class Forms(BaseUIController): index = 0 if csv_file: lines = csv_file.splitlines() - for line in lines: - row = line.split(",") + rows = csv.reader(lines) + for row in rows: if len(row) >= 6: + for column in range(len(row)): + row[column] = str(row[column]).strip('"') prefix = "fields_%i|" % index payload[f"{prefix}name"] = "%i_imported_field" % (index + 1) payload[f"{prefix}label"] = row[0] payload[f"{prefix}helptext"] = row[1] payload[f"{prefix}type"] = row[2] payload[f"{prefix}default"] = row[3] - payload[f"{prefix}selectlist"] = row[4].split(",") + payload[f"{prefix}selectlist"] = row[4] payload[f"{prefix}required"] = row[5].lower() == "true" index = index + 1 new_form, message = self.save_form_definition(trans, None, payload) @@ -168,9 +172,7 @@ class Forms(BaseUIController): latest_form = form.latest_form if trans.request.method == "GET": fd_types = sorted(trans.app.model.FormDefinition.types.__members__.items()) - ff_types = [ - (t.__name__.replace("Field", ""), t.__name__) for t in trans.model.FormDefinition.supported_field_types - ] + ff_types = [(t.__name__, t.__name__) for t in trans.model.FormDefinition.supported_field_types] field_cache = [] field_inputs = [ { @@ -188,7 +190,7 @@ class Forms(BaseUIController): "label": "Options", "help": "*Only for fields which allow multiple selections, provide comma-separated values.", }, - {"name": "required", "label": "Required", "type": "boolean"}, + {"name": "required", "label": "Required", "type": "boolean", "value": False}, ] form_dict = { "title": "Edit form for '%s'" % (util.sanitize_text(latest_form.name)), @@ -198,7 +200,7 @@ class Forms(BaseUIController): { "name": "type", "type": "select", - "options": [("None", "none")] + [(ft[1], ft[1]) for ft in fd_types], + "options": [(ft[1], ft[1]) for ft in fd_types], "label": "Type", "value": latest_form.type, }, @@ -244,7 +246,6 @@ class Forms(BaseUIController): field_attributes = ["name", "label", "helptext", "required", "type", "selectlist", "default"] field_dict = {attr: payload.get(f"{prefix}{attr}") for attr in field_attributes} field_dict["visible"] = True - field_dict["required"] = field_dict["required"] == "true" if isinstance(field_dict["selectlist"], str): field_dict["selectlist"] = field_dict["selectlist"].split(",") else: @@ -281,7 +282,7 @@ class Forms(BaseUIController): desc=current_form["desc"], fields=current_form["fields"], form_definition_current=None, - form_type=current_form["type"], + type=current_form["type"], layout=current_form["layout"], ) # save changes to the existing form