From 69237c0bb4fe37e56fc0ced788139086edd06b54 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Thu, 25 Mar 2021 14:48:09 +0100 Subject: [PATCH] make more inputs display errors --- owrx/form/__init__.py | 55 +++++++++++++++++------------- owrx/form/device.py | 78 +++++++++++++++++++++++++------------------ 2 files changed, 78 insertions(+), 55 deletions(-) diff --git a/owrx/form/__init__.py b/owrx/form/__init__.py index 4968c1e..f1f7113 100644 --- a/owrx/form/__init__.py +++ b/owrx/form/__init__.py @@ -48,15 +48,15 @@ class Input(ABC): else "", ) - def input_classes(self, error): + def input_classes(self, errors): classes = ["form-control", "form-control-sm"] - if error: + if errors: classes.append("is-invalid") return " ".join(classes) - def input_properties(self, value, error): + def input_properties(self, value, errors): props = { - "class": self.input_classes(error), + "class": self.input_classes(errors), "id": self.id, "name": self.id, "placeholder": self.label, @@ -72,15 +72,22 @@ class Input(ABC): def render_errors(self, errors): return "".join("""
{msg}
""".format(msg=e) for e in errors) - def render_input(self, value, errors): - return "{errors}".format( - properties=self.render_input_properties(value, errors), errors=self.render_errors(errors) + def render_input_group(self, value, errors): + return """ + {input} + {errors} + """.format( + input=self.render_input(value, errors), + errors=self.render_errors(errors) ) + def render_input(self, value, errors): + return "".format(properties=self.render_input_properties(value, errors)) + def render(self, config, errors): value = config[self.id] if self.id in config else None error = errors[self.id] if self.id in errors else [] - return self.bootstrap_decorate(self.render_input(self.converter.convert_to_form(value), error)) + return self.bootstrap_decorate(self.render_input_group(self.converter.convert_to_form(value), error)) def parse(self, data): value = self.converter.convert_from_form(data[self.id][0]) @@ -115,7 +122,7 @@ class NumberInput(Input): props["step"] = self.step return props - def render_input(self, value, errors): + def render_input_group(self, value, errors): if self.append: append = """
@@ -131,10 +138,12 @@ class NumberInput(Input):
{input} {append} + {errors}
""".format( - input=super().render_input(value, errors), + input=self.render_input(value, errors), append=append, + errors=self.render_errors(errors) ) @@ -148,21 +157,26 @@ class FloatInput(NumberInput): class LocationInput(Input): - def render_input(self, value, errors): - # TODO display errors + def render_input_group(self, value, errors): return """ -
+
{inputs}
+ {errors}
""".format( id=self.id, - inputs="".join(self.render_sub_input(value, id, errors) for id in ["lat", "lon"]), + rowclass="is-invalid" if errors else "", + inputs=self.render_input(value, errors), + errors=self.render_errors(errors), key=Config.get()["google_maps_api_key"], ) + def render_input(self, value, errors): + return "".join(self.render_sub_input(value, id, errors) for id in ["lat", "lon"]) + def render_sub_input(self, value, id, errors): return """
@@ -185,13 +199,11 @@ class TextAreaInput(Input): def render_input(self, value, errors): return """ - {errors} """.format( id=self.id, classes=self.input_classes(errors), value=value, disabled="disabled" if self.disabled else "", - errors=self.render_errors(errors), ) @@ -208,7 +220,6 @@ class CheckboxInput(Input): - {errors}
""".format( id=self.id, @@ -216,7 +227,6 @@ class CheckboxInput(Input): checked="checked" if value else "", disabled="disabled" if self.disabled else "", checkboxText=self.checkboxText, - errors=self.render_errors(errors) ) def input_classes(self, error): @@ -247,7 +257,6 @@ class MultiCheckboxInput(Input): self.options = options def render_input(self, value, errors): - # TODO display errors return "".join(self.render_checkbox(o, value, errors) for o in self.options) def checkbox_id(self, option): @@ -317,13 +326,11 @@ class DropdownInput(Input): def render_input(self, value, errors): return """ - {errors} """.format( classes=self.input_classes(errors), id=self.id, options=self.render_options(value), disabled="disabled" if self.disabled else "", - errors=self.render_errors(errors), ) def render_options(self, value): @@ -365,7 +372,7 @@ class ExponentialInput(Input): props["step"] = "any" return props - def render_input(self, value, errors): + def render_input_group(self, value, errors): append = """
- {options} - - - {stageoption} + + + {stageoption} """.format( id=self.id, classes=self.input_classes(errors), @@ -38,6 +35,18 @@ class GainInput(Input): disabled="disabled" if self.disabled else "", ) + def render_input_group(self, value, errors): + return """ +
+ {input} + {errors} +
+ """.format( + id=self.id, + input=self.render_input(value, errors), + errors=self.render_errors(errors) + ) + def render_options(self, value): options = [] if self.has_agc: @@ -342,35 +351,40 @@ class SchedulerInput(Input): class WaterfallLevelsInput(Input): - def render_input(self, value, errors): - # TODO display errors + def render_input_group(self, value, errors): return """ -
- {inputs} +
+ {input}
+ {errors} """.format( + rowclass="is-invalid" if errors else "", id=self.id, - inputs="".join( - """ -
- -
- -
- dBFS -
+ input=self.render_input(value, errors), + errors=self.render_errors(errors), + ) + + def render_input(self, value, errors): + return "".join( + """ +
+ +
+ +
+ dBFS
- """.format( - id=self.id, - name=name, - label=label, - value=value[name] if value and name in value else "0", - classes=self.input_classes(errors), - disabled="disabled" if self.disabled else "", - ) - for name, label in [("min", "Minimum"), ("max", "Maximum")] +
+ """.format( + id=self.id, + name=name, + label=label, + value=value[name] if value and name in value else "0", + classes=self.input_classes(errors), + disabled="disabled" if self.disabled else "", ) + for name, label in [("min", "Minimum"), ("max", "Maximum")] ) def parse(self, data):