confirm dialog
This commit is contained in:
parent
8323323dea
commit
92cc3c5b40
@ -1,3 +1,4 @@
|
|||||||
|
import datetime
|
||||||
from textual.app import App
|
from textual.app import App
|
||||||
from textual.widgets import (
|
from textual.widgets import (
|
||||||
DataTable,
|
DataTable,
|
||||||
@ -13,10 +14,7 @@ from ..utils import (
|
|||||||
get_text_from_editor,
|
get_text_from_editor,
|
||||||
)
|
)
|
||||||
from .keymodal import KeyModal
|
from .keymodal import KeyModal
|
||||||
from .modals import ChoiceModal
|
from .modals import ChoiceModal, DateModal, ConfirmModal
|
||||||
|
|
||||||
ELLIPSIS = "…"
|
|
||||||
|
|
||||||
|
|
||||||
class NotifyValidationError(Exception):
|
class NotifyValidationError(Exception):
|
||||||
"""will notify and continue if raised"""
|
"""will notify and continue if raised"""
|
||||||
@ -77,6 +75,19 @@ class EnumColumnConfig(TableColumnConfig):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class DateColumnConfig(TableColumnConfig):
|
||||||
|
def preprocess(self, val):
|
||||||
|
try:
|
||||||
|
return datetime.strptime(val, "%Y-%m-%d")
|
||||||
|
except ValueError:
|
||||||
|
raise NotifyValidationError("Invalid date format. Use YYYY-MM-DD")
|
||||||
|
|
||||||
|
def start_change(self, app, current_value):
|
||||||
|
app.push_screen(DateModal(current_value), app.apply_change)
|
||||||
|
ELLIPSIS = "…"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TableEditor(App):
|
class TableEditor(App):
|
||||||
CSS = """
|
CSS = """
|
||||||
#footer {
|
#footer {
|
||||||
@ -148,7 +159,7 @@ class TableEditor(App):
|
|||||||
("?", "show_keys", "show keybindings"),
|
("?", "show_keys", "show keybindings"),
|
||||||
]
|
]
|
||||||
|
|
||||||
def __init__(self, default_view="default"):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.filters = {}
|
self.filters = {}
|
||||||
self.sort_string = "" # TODO: default sort
|
self.sort_string = "" # TODO: default sort
|
||||||
@ -226,7 +237,10 @@ class TableEditor(App):
|
|||||||
self.table.move_cursor(row=0, column=1)
|
self.table.move_cursor(row=0, column=1)
|
||||||
|
|
||||||
def action_delete_item(self):
|
def action_delete_item(self):
|
||||||
if self.table.cursor_column == 0:
|
self.push_screen(ConfirmModal(f"delete ?"), self._delete_item_callback)
|
||||||
|
|
||||||
|
def _delete_item_callback(self, confirm):
|
||||||
|
if confirm and self.table.cursor_column == 0:
|
||||||
cur_row = self.table.cursor_row
|
cur_row = self.table.cursor_row
|
||||||
item_id = int(self.table.get_cell_at((cur_row, 0)))
|
item_id = int(self.table.get_cell_at((cur_row, 0)))
|
||||||
# deletable items need a delete
|
# deletable items need a delete
|
||||||
@ -243,6 +257,8 @@ class TableEditor(App):
|
|||||||
continue
|
continue
|
||||||
val = self.filters.get(fc.field, fc.default)
|
val = self.filters.get(fc.field, fc.default)
|
||||||
if val is not None:
|
if val is not None:
|
||||||
|
if "," in val:
|
||||||
|
val = val.split(",")[0] # TODO: fix hack for enums
|
||||||
prepopulated[fc.field] = val
|
prepopulated[fc.field] = val
|
||||||
|
|
||||||
new_item = self.add_item_callback(**prepopulated)
|
new_item = self.add_item_callback(**prepopulated)
|
||||||
|
@ -4,6 +4,34 @@ from textual.widgets import RadioSet, RadioButton, Label
|
|||||||
from .. import config
|
from .. import config
|
||||||
from ..utils import get_color_enum
|
from ..utils import get_color_enum
|
||||||
|
|
||||||
|
class ConfirmModal(ModalScreen):
|
||||||
|
CSS = """
|
||||||
|
ConfirmModal {
|
||||||
|
align: center middle;
|
||||||
|
background: $primary 30%;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
BINDINGS = [
|
||||||
|
("y", "confirm", "Down"),
|
||||||
|
("n,escape", "cancel", "cancel"),
|
||||||
|
]
|
||||||
|
|
||||||
|
def __init__(self, message):
|
||||||
|
self.message = message
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
def compose(self):
|
||||||
|
yield Label(self.message)
|
||||||
|
yield Label("(y)es")
|
||||||
|
yield Label("(n)o")
|
||||||
|
|
||||||
|
def action_confirm(self):
|
||||||
|
self.dismiss(True)
|
||||||
|
|
||||||
|
def action_cancel(self):
|
||||||
|
self.app.pop_screen()
|
||||||
|
|
||||||
|
|
||||||
class ChoiceModal(ModalScreen):
|
class ChoiceModal(ModalScreen):
|
||||||
CSS = """
|
CSS = """
|
||||||
|
@ -19,20 +19,9 @@ from .editor import (
|
|||||||
TableEditor,
|
TableEditor,
|
||||||
TableColumnConfig,
|
TableColumnConfig,
|
||||||
EnumColumnConfig,
|
EnumColumnConfig,
|
||||||
NotifyValidationError,
|
DateColumnConfig,
|
||||||
ELLIPSIS,
|
ELLIPSIS,
|
||||||
)
|
)
|
||||||
from .modals import DateModal
|
|
||||||
|
|
||||||
class DateColumnConfig(TableColumnConfig):
|
|
||||||
def preprocess(self, val):
|
|
||||||
try:
|
|
||||||
return datetime.strptime(val, "%Y-%m-%d")
|
|
||||||
except ValueError:
|
|
||||||
raise NotifyValidationError("Invalid date format. Use YYYY-MM-DD")
|
|
||||||
|
|
||||||
def start_change(self, app, current_value):
|
|
||||||
app.push_screen(DateModal(current_value), app.apply_change)
|
|
||||||
|
|
||||||
|
|
||||||
class TT(TableEditor):
|
class TT(TableEditor):
|
||||||
|
Loading…
Reference in New Issue
Block a user