From 3b7064cabc24d181d95718967a394ce3ea9a0126 Mon Sep 17 00:00:00 2001 From: guerler Date: Tue, 3 Jan 2023 13:10:28 -0500 Subject: [PATCH 1/7] Properly communicate upload input element changes, fix type keyword --- client/src/mvc/ui/ui-misc.js | 8 +++++--- lib/galaxy/webapps/galaxy/controllers/forms.py | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) 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..eba65763a5b 100644 --- a/lib/galaxy/webapps/galaxy/controllers/forms.py +++ b/lib/galaxy/webapps/galaxy/controllers/forms.py @@ -281,7 +281,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 From d7efd7210bee98bcb02effea9c4c1ba818f97f54 Mon Sep 17 00:00:00 2001 From: guerler Date: Tue, 3 Jan 2023 13:21:38 -0500 Subject: [PATCH 2/7] Fix form input requirements in form builder, does not require to upload a file --- lib/galaxy/webapps/galaxy/controllers/forms.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/galaxy/webapps/galaxy/controllers/forms.py b/lib/galaxy/webapps/galaxy/controllers/forms.py index eba65763a5b..7290e5a7b41 100644 --- a/lib/galaxy/webapps/galaxy/controllers/forms.py +++ b/lib/galaxy/webapps/galaxy/controllers/forms.py @@ -130,6 +130,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, }, ], } @@ -188,7 +189,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)), From 577058c95a0aacfdf469a844faa9ab3cdfe3d4e9 Mon Sep 17 00:00:00 2001 From: guerler Date: Tue, 3 Jan 2023 17:32:53 -0500 Subject: [PATCH 3/7] Use cvs python library to load csv for form builder, fix additional bugs --- lib/galaxy/webapps/galaxy/controllers/forms.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/webapps/galaxy/controllers/forms.py b/lib/galaxy/webapps/galaxy/controllers/forms.py index 7290e5a7b41..800e9cfb1c0 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 @@ -140,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) @@ -245,7 +248,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: From f75d1f162235f183b7a8f52f51fa3d3b15d3a1eb Mon Sep 17 00:00:00 2001 From: guerler Date: Tue, 3 Jan 2023 17:43:38 -0500 Subject: [PATCH 4/7] Show actual form field name in formbuilder --- lib/galaxy/webapps/galaxy/controllers/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/webapps/galaxy/controllers/forms.py b/lib/galaxy/webapps/galaxy/controllers/forms.py index 800e9cfb1c0..ea3f14b7d27 100644 --- a/lib/galaxy/webapps/galaxy/controllers/forms.py +++ b/lib/galaxy/webapps/galaxy/controllers/forms.py @@ -173,7 +173,7 @@ class Forms(BaseUIController): 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 + (t.__name__, t.__name__) for t in trans.model.FormDefinition.supported_field_types ] field_cache = [] field_inputs = [ From a2a402ad2aa4a6c0b7e60ca0b6274a20b9db117a Mon Sep 17 00:00:00 2001 From: guerler Date: Tue, 3 Jan 2023 17:50:06 -0500 Subject: [PATCH 5/7] Properly default to only available type --- lib/galaxy/webapps/galaxy/controllers/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/webapps/galaxy/controllers/forms.py b/lib/galaxy/webapps/galaxy/controllers/forms.py index ea3f14b7d27..6871a938063 100644 --- a/lib/galaxy/webapps/galaxy/controllers/forms.py +++ b/lib/galaxy/webapps/galaxy/controllers/forms.py @@ -123,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", }, { From 921cbabd254de008c3a4e2ef43b58d721a9e8d28 Mon Sep 17 00:00:00 2001 From: guerler Date: Tue, 3 Jan 2023 18:05:13 -0500 Subject: [PATCH 6/7] Fix linting --- lib/galaxy/webapps/galaxy/controllers/forms.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/webapps/galaxy/controllers/forms.py b/lib/galaxy/webapps/galaxy/controllers/forms.py index 6871a938063..4e5e1572e44 100644 --- a/lib/galaxy/webapps/galaxy/controllers/forms.py +++ b/lib/galaxy/webapps/galaxy/controllers/forms.py @@ -145,7 +145,7 @@ class Forms(BaseUIController): for row in rows: if len(row) >= 6: for column in range(len(row)): - row[column] = str(row[column]).strip('\"') + 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] @@ -172,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__, 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 = [ { From 04919a0f36e7d70edceeb0f12ddf969c1e4b2178 Mon Sep 17 00:00:00 2001 From: guerler Date: Tue, 3 Jan 2023 18:17:10 -0500 Subject: [PATCH 7/7] Remove redundant none type for formbuilder types --- lib/galaxy/webapps/galaxy/controllers/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/webapps/galaxy/controllers/forms.py b/lib/galaxy/webapps/galaxy/controllers/forms.py index 4e5e1572e44..8134ffe4b0a 100644 --- a/lib/galaxy/webapps/galaxy/controllers/forms.py +++ b/lib/galaxy/webapps/galaxy/controllers/forms.py @@ -200,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, },