From 7f654071d0bf67dc0de7961655f5decc88fdf711 Mon Sep 17 00:00:00 2001 From: Konrni <39877017+Konrni@users.noreply.github.com> Date: Fri, 27 Sep 2024 23:51:13 +0200 Subject: [PATCH 01/10] added copy feature for answers --- autopve/drawer.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/autopve/drawer.py b/autopve/drawer.py index 4b8de2b..02dce9b 100644 --- a/autopve/drawer.py +++ b/autopve/drawer.py @@ -44,6 +44,7 @@ class Drawer(object): 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["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") self._table = ( ui.table( @@ -83,7 +84,7 @@ class Drawer(object): self._table.add_rows({"name": name}) self._table.visible = True - async def _display_answer_dialog(self, name=""): + async def _display_answer_dialog(self, name="", copy_answer=False): save = None with ui.dialog() as answer_dialog, el.Card(): @@ -118,14 +119,16 @@ class Drawer(object): result = await answer_dialog if result == "save": answer = answer_input.value.strip() - if len(answer) > 0 and name != "Default": + if len(answer) > 0 and copy_answer or name != "Default": storage.answer(answer) if name in storage.answers: storage.answers[answer] = storage.answer(name, copy=True) - del storage.answers[name] - for row in self._table.rows: - if name == row["name"]: - self._table.remove_rows(row) + if copy_answer is False: + del storage.answers[name] + if copy_answer is False: + for row in self._table.rows: + if name == row["name"]: + self._table.remove_rows(row) self._add_answer_to_table(answer) def _modify_answer(self, mode): @@ -155,6 +158,9 @@ class Drawer(object): if self._selection_mode == "edit": if len(e.selection) > 0 and e.selection[0]["name"] != "Default": await self._display_answer_dialog(name=e.selection[0]["name"]) + if self._selection_mode == "content_copy": + if len(e.selection) > 0: + await self._display_answer_dialog(name=e.selection[0]["name"], copy_answer=True) if self._selection_mode == "remove": if len(e.selection) > 0: for row in e.selection: From 074975650f1640eb2418104c6400075640fb2c0b Mon Sep 17 00:00:00 2001 From: Konrni <39877017+Konrni@users.noreply.github.com> Date: Sat, 28 Sep 2024 00:01:29 +0200 Subject: [PATCH 02/10] fix bug, where save after unchanged name would delete answer content --- autopve/drawer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/autopve/drawer.py b/autopve/drawer.py index 02dce9b..27002ab 100644 --- a/autopve/drawer.py +++ b/autopve/drawer.py @@ -119,6 +119,8 @@ class Drawer(object): result = await answer_dialog if result == "save": answer = answer_input.value.strip() + if answer == name: + return if len(answer) > 0 and copy_answer or name != "Default": storage.answer(answer) if name in storage.answers: From f8e93cedf25765240f844a5c8e798d3df6174fe2 Mon Sep 17 00:00:00 2001 From: Natan Keddem Date: Fri, 27 Sep 2024 21:20:30 -0400 Subject: [PATCH 03/10] syntax change --- autopve/drawer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autopve/drawer.py b/autopve/drawer.py index 27002ab..3e664b0 100644 --- a/autopve/drawer.py +++ b/autopve/drawer.py @@ -84,7 +84,7 @@ class Drawer(object): self._table.add_rows({"name": name}) self._table.visible = True - async def _display_answer_dialog(self, name="", copy_answer=False): + async def _display_answer_dialog(self, name="", copy=False): save = None with ui.dialog() as answer_dialog, el.Card(): @@ -162,7 +162,7 @@ class Drawer(object): await self._display_answer_dialog(name=e.selection[0]["name"]) if self._selection_mode == "content_copy": if len(e.selection) > 0: - await self._display_answer_dialog(name=e.selection[0]["name"], copy_answer=True) + await self._display_answer_dialog(name=e.selection[0]["name"], copy=True) if self._selection_mode == "remove": if len(e.selection) > 0: for row in e.selection: From b3dc60d95065ca86792058b086877f5a3b840387 Mon Sep 17 00:00:00 2001 From: Natan Keddem Date: Fri, 27 Sep 2024 21:21:47 -0400 Subject: [PATCH 04/10] improved answer sanity check --- autopve/drawer.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/autopve/drawer.py b/autopve/drawer.py index 3e664b0..fc2001d 100644 --- a/autopve/drawer.py +++ b/autopve/drawer.py @@ -93,14 +93,11 @@ class Drawer(object): all_answers = list(storage.answers.keys()) for answer in list(storage.answers.keys()): all_answers.append(answer.replace(" ", "")) - if name != "": - if name in all_answers: - all_answers.remove(name) - if name.replace(" ", "") in all_answers: - all_answers.remove(name.replace(" ", "")) def answer_check(value: str) -> Optional[bool]: spaceless = value.replace(" ", "") + if len(spaceless) == 0: + return False for invalid_value in all_answers: if invalid_value == spaceless: return False @@ -114,7 +111,6 @@ class Drawer(object): save_ea = el.ErrorAggregator(answer_input) el.DButton("SAVE", on_click=lambda: answer_dialog.submit("save")).bind_enabled_from(save_ea, "no_errors") ui.keyboard(on_key=enter_submit, ignore=[]) - answer_input.value = name result = await answer_dialog if result == "save": From f9b5c0d153fa621d71afa8698cbe993e32ce62a7 Mon Sep 17 00:00:00 2001 From: Natan Keddem Date: Fri, 27 Sep 2024 21:23:22 -0400 Subject: [PATCH 05/10] simplify answer storage logic and enable copy --- autopve/drawer.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/autopve/drawer.py b/autopve/drawer.py index fc2001d..6bcf8bb 100644 --- a/autopve/drawer.py +++ b/autopve/drawer.py @@ -115,19 +115,16 @@ class Drawer(object): result = await answer_dialog if result == "save": answer = answer_input.value.strip() - if answer == name: - return - if len(answer) > 0 and copy_answer or name != "Default": - storage.answer(answer) - if name in storage.answers: - storage.answers[answer] = storage.answer(name, copy=True) - if copy_answer is False: - del storage.answers[name] - if copy_answer is False: + if name in storage.answers: + storage.answers[answer] = storage.answer(name, copy=True) + if copy is False: + del storage.answers[name] for row in self._table.rows: if name == row["name"]: 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): self._hide_content() From 32dec36cd71dbfb083deaeee3d388a000868b7a4 Mon Sep 17 00:00:00 2001 From: Konrni <39877017+Konrni@users.noreply.github.com> Date: Sat, 28 Sep 2024 10:27:46 +0200 Subject: [PATCH 06/10] don't "unselect" after one answer deletion --- autopve/drawer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/autopve/drawer.py b/autopve/drawer.py index 6bcf8bb..f1850bc 100644 --- a/autopve/drawer.py +++ b/autopve/drawer.py @@ -163,6 +163,7 @@ class Drawer(object): if row["name"] in storage.answers: del storage.answers[row["name"]] self._table.remove_rows(row) + return self._modify_answer(None) async def _clicked(self, e): From 8f00ab957076d61715e48096d38617d2c521e3cc Mon Sep 17 00:00:00 2001 From: Konrni <39877017+Konrni@users.noreply.github.com> Date: Sat, 28 Sep 2024 10:34:30 +0200 Subject: [PATCH 07/10] add password_toggle_button, enable password viewing --- autopve/tabs/settings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/autopve/tabs/settings.py b/autopve/tabs/settings.py index 62479ba..a357b52 100644 --- a/autopve/tabs/settings.py +++ b/autopve/tabs/settings.py @@ -55,6 +55,7 @@ class Setting(Tab): "control": el.FInput( key, 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, on_change=lambda e, key=key: self.set_key(key, e.value), ), From 4c6495c4ee005fa82cf361578af47e95eaaa1ee0 Mon Sep 17 00:00:00 2001 From: Natan Keddem Date: Sat, 28 Sep 2024 16:45:48 -0400 Subject: [PATCH 08/10] allow escape at answer naming --- autopve/drawer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/autopve/drawer.py b/autopve/drawer.py index 6bcf8bb..7d32ad0 100644 --- a/autopve/drawer.py +++ b/autopve/drawer.py @@ -106,6 +106,8 @@ class Drawer(object): def enter_submit(e: KeyEventArguments) -> None: if e.key == "Enter" and save_ea.no_errors is True: 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) save_ea = el.ErrorAggregator(answer_input) From aa04718374f25cb678bea64d6d32bd17f5640732 Mon Sep 17 00:00:00 2001 From: Natan Keddem Date: Sat, 28 Sep 2024 16:46:32 -0400 Subject: [PATCH 09/10] revert answer naming changes to allow submiting previous name --- autopve/drawer.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/autopve/drawer.py b/autopve/drawer.py index 7d32ad0..222c600 100644 --- a/autopve/drawer.py +++ b/autopve/drawer.py @@ -93,6 +93,11 @@ class Drawer(object): all_answers = list(storage.answers.keys()) for answer in list(storage.answers.keys()): all_answers.append(answer.replace(" ", "")) + if name != "": + if name in all_answers: + all_answers.remove(name) + if name.replace(" ", "") in all_answers: + all_answers.remove(name.replace(" ", "")) def answer_check(value: str) -> Optional[bool]: spaceless = value.replace(" ", "") @@ -113,10 +118,11 @@ class Drawer(object): save_ea = el.ErrorAggregator(answer_input) el.DButton("SAVE", on_click=lambda: answer_dialog.submit("save")).bind_enabled_from(save_ea, "no_errors") ui.keyboard(on_key=enter_submit, ignore=[]) + answer_input.value = name result = await answer_dialog - if result == "save": - answer = answer_input.value.strip() + answer = answer_input.value.strip() + if result == "save" and name != answer: if name in storage.answers: storage.answers[answer] = storage.answer(name, copy=True) if copy is False: From 61157457b866b770c7e3f24fee66deccbd59f853 Mon Sep 17 00:00:00 2001 From: Natan Keddem Date: Sun, 29 Sep 2024 17:36:37 -0400 Subject: [PATCH 10/10] refactor answer selection actions --- autopve/drawer.py | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/autopve/drawer.py b/autopve/drawer.py index 5e3a644..f2e0396 100644 --- a/autopve/drawer.py +++ b/autopve/drawer.py @@ -158,21 +158,20 @@ class Drawer(object): async def _selected(self, e): self._hide_content() - if self._selection_mode == "edit": - if len(e.selection) > 0 and e.selection[0]["name"] != "Default": - await self._display_answer_dialog(name=e.selection[0]["name"]) - if self._selection_mode == "content_copy": - if len(e.selection) > 0: - await self._display_answer_dialog(name=e.selection[0]["name"], copy=True) - if self._selection_mode == "remove": - if len(e.selection) > 0: - for row in e.selection: - if row["name"] != "Default": - if row["name"] in storage.answers: - del storage.answers[row["name"]] - self._table.remove_rows(row) - return - self._modify_answer(None) + if len(e.selection) == 1: + answer = e.selection[0]["name"] + if self._selection_mode == "content_copy": + await self._display_answer_dialog(name=answer, copy=True) + self._modify_answer(None) + elif answer == "Default": + self._table._props["selected"] = [] + elif self._selection_mode == "edit": + await self._display_answer_dialog(name=answer) + 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): if "name" in e.args[1]: