Merge pull request #8 from Konrni/main

Add copy feature , fix a small bug
This commit is contained in:
Natan Keddem
2024-09-30 21:37:35 -04:00
committed by GitHub
2 changed files with 33 additions and 23 deletions

View File

@ -44,6 +44,7 @@ class Drawer(object):
el.IButton(icon="add", on_click=self._display_answer_dialog) el.IButton(icon="add", on_click=self._display_answer_dialog)
self._buttons["remove"] = el.IButton(icon="remove", on_click=lambda: self._modify_answer("remove")) self._buttons["remove"] = el.IButton(icon="remove", on_click=lambda: self._modify_answer("remove"))
self._buttons["edit"] = el.IButton(icon="edit", on_click=lambda: self._modify_answer("edit")) self._buttons["edit"] = el.IButton(icon="edit", on_click=lambda: self._modify_answer("edit"))
self._buttons["content_copy"] = el.IButton(icon="content_copy", on_click=lambda: self._modify_answer("content_copy"))
ui.label(text="ANSWERS").classes("text-secondary") ui.label(text="ANSWERS").classes("text-secondary")
self._table = ( self._table = (
ui.table( ui.table(
@ -83,7 +84,7 @@ class Drawer(object):
self._table.add_rows({"name": name}) self._table.add_rows({"name": name})
self._table.visible = True self._table.visible = True
async def _display_answer_dialog(self, name=""): async def _display_answer_dialog(self, name="", copy=False):
save = None save = None
with ui.dialog() as answer_dialog, el.Card(): with ui.dialog() as answer_dialog, el.Card():
@ -100,6 +101,8 @@ class Drawer(object):
def answer_check(value: str) -> Optional[bool]: def answer_check(value: str) -> Optional[bool]:
spaceless = value.replace(" ", "") spaceless = value.replace(" ", "")
if len(spaceless) == 0:
return False
for invalid_value in all_answers: for invalid_value in all_answers:
if invalid_value == spaceless: if invalid_value == spaceless:
return False return False
@ -108,25 +111,28 @@ class Drawer(object):
def enter_submit(e: KeyEventArguments) -> None: def enter_submit(e: KeyEventArguments) -> None:
if e.key == "Enter" and save_ea.no_errors is True: if e.key == "Enter" and save_ea.no_errors is True:
answer_dialog.submit("save") answer_dialog.submit("save")
elif e.key == "Escape":
answer_dialog.close()
answer_input = el.VInput(label="answer", value=" ", invalid_characters="""'`"$\\;&<>|(){}""", invalid_values=all_answers, check=answer_check, max_length=20) answer_input = el.VInput(label="answer", value=" ", invalid_characters="""'`"$\\;&<>|(){}""", invalid_values=all_answers, check=answer_check, max_length=20)
save_ea = el.ErrorAggregator(answer_input) save_ea = el.ErrorAggregator(answer_input)
el.DButton("SAVE", on_click=lambda: answer_dialog.submit("save")).bind_enabled_from(save_ea, "no_errors") el.DButton("SAVE", on_click=lambda: answer_dialog.submit("save")).bind_enabled_from(save_ea, "no_errors")
ui.keyboard(on_key=enter_submit, ignore=[]) ui.keyboard(on_key=enter_submit, ignore=[])
answer_input.value = name answer_input.value = name
result = await answer_dialog result = await answer_dialog
if result == "save": answer = answer_input.value.strip()
answer = answer_input.value.strip() if result == "save" and name != answer:
if len(answer) > 0 and name != "Default": if name in storage.answers:
storage.answer(answer) storage.answers[answer] = storage.answer(name, copy=True)
if name in storage.answers: if copy is False:
storage.answers[answer] = storage.answer(name, copy=True)
del storage.answers[name] del storage.answers[name]
for row in self._table.rows: for row in self._table.rows:
if name == row["name"]: if name == row["name"]:
self._table.remove_rows(row) self._table.remove_rows(row)
self._add_answer_to_table(answer) else:
storage.answer(answer)
self._add_answer_to_table(answer)
def _modify_answer(self, mode): def _modify_answer(self, mode):
self._hide_content() self._hide_content()
@ -152,17 +158,20 @@ class Drawer(object):
async def _selected(self, e): async def _selected(self, e):
self._hide_content() self._hide_content()
if self._selection_mode == "edit": if len(e.selection) == 1:
if len(e.selection) > 0 and e.selection[0]["name"] != "Default": answer = e.selection[0]["name"]
await self._display_answer_dialog(name=e.selection[0]["name"]) if self._selection_mode == "content_copy":
if self._selection_mode == "remove": await self._display_answer_dialog(name=answer, copy=True)
if len(e.selection) > 0: self._modify_answer(None)
for row in e.selection: elif answer == "Default":
if row["name"] != "Default": self._table._props["selected"] = []
if row["name"] in storage.answers: elif self._selection_mode == "edit":
del storage.answers[row["name"]] await self._display_answer_dialog(name=answer)
self._table.remove_rows(row) self._modify_answer(None)
self._modify_answer(None) elif self._selection_mode == "remove":
if answer in storage.answers:
del storage.answers[answer]
self._table.remove_rows(e.selection[0])
async def _clicked(self, e): async def _clicked(self, e):
if "name" in e.args[1]: if "name" in e.args[1]:

View File

@ -55,6 +55,7 @@ class Setting(Tab):
"control": el.FInput( "control": el.FInput(
key, key,
password=True if key == "root_password" else False, password=True if key == "root_password" else False,
password_toggle_button=True if key == "root_password" else False,
autocomplete=self.keys[key]["options"] if key in self.keys and "options" in self.keys[key] else None, autocomplete=self.keys[key]["options"] if key in self.keys and "options" in self.keys[key] else None,
on_change=lambda e, key=key: self.set_key(key, e.value), on_change=lambda e, key=key: self.set_key(key, e.value),
), ),