Verified Commit d385d1bd authored by Jakob Moser's avatar Jakob Moser
Browse files

Extract form logic into ModalForm class

parent 24add338
Loading
Loading
Loading
Loading
+3 −26
Original line number Diff line number Diff line
@@ -2,16 +2,13 @@ from collections.abc import Sequence

from textual.app import ComposeResult
from textual.containers import Container, Grid, VerticalGroup
from textual.screen import ModalScreen
from textual.validation import Length
from textual.widgets import Button, Footer, Input, Label, MaskedInput

from poolpay.admin.ModalForm import ModalForm

class AddPerson(ModalScreen):
    BINDINGS = [
        ("escape", "app.pop_screen", "Abbrechen"),
    ]

class AddPerson(ModalForm):
    def compose(self) -> ComposeResult:
        with VerticalGroup():
            with Grid():
@@ -41,27 +38,10 @@ class AddPerson(ModalScreen):
        yield Footer()

    @property
    def _person_inputs(self) -> Sequence[Input]:
    def _form_inputs(self) -> Sequence[Input]:
        selectors = ("#name", "#cl_account_name", "#card_id")
        return tuple(self.query_one(s, Input) for s in selectors)

    def _close(self) -> None:
        person_details = tuple(i.value for i in self._person_inputs)
        self.dismiss(person_details)

    def _close_if_complete(self) -> None:
        invalid_field_found = self._focus_next_invalid_field()
        if not invalid_field_found:
            self._close()

    def _focus_next_invalid_field(self) -> bool:
        for field in self._person_inputs:
            if not field.is_valid or field.value == "":
                field.focus()
                return True

        return False

    def on_button_pressed(self, event: Button.Pressed) -> None:
        match event.button.id:
            case "add_person":
@@ -71,6 +51,3 @@ class AddPerson(ModalScreen):
        match event.input.id:
            case "cl_account_name":
                event.input.placeholder = "holner" if event.input.value == "" else ""

    def on_input_submitted(self, event: Input.Submitted) -> None:
        self._close_if_complete()
+34 −0
Original line number Diff line number Diff line
from collections.abc import Sequence

from textual.screen import ModalScreen
from textual.widgets import Input


class ModalForm(ModalScreen):
    BINDINGS = [
        ("escape", "app.pop_screen", "Abbrechen"),
    ]

    @property
    def _form_inputs(self) -> Sequence[Input]:  # TODO Make this abstract
        raise NotImplementedError()

    def _close(self) -> None:
        form_values = tuple(i.value for i in self._form_inputs)
        self.dismiss(form_values)

    def on_input_submitted(self, event: Input.Submitted) -> None:
        self._close_if_complete()

    def _close_if_complete(self) -> None:
        invalid_field_found = self._focus_next_invalid_field()
        if not invalid_field_found:
            self._close()

    def _focus_next_invalid_field(self) -> bool:
        for field in self._form_inputs:
            if not field.is_valid or field.value == "":
                field.focus()
                return True

        return False