diff --git a/autopve/tabs/settings.py b/autopve/tabs/settings.py index 5593ba7..7edc9e3 100644 --- a/autopve/tabs/settings.py +++ b/autopve/tabs/settings.py @@ -14,94 +14,96 @@ class Setting(Tab): super().__init__(answer, type=type) def _build(self): - self.key_picker() + self.keys_controls() - def key_picker(self): - def keys_controls(): - with ui.column() as col: - col.tailwind.width("[560px]").align_items("center") - with ui.card() as card: - card.tailwind.width("full") - key_select = ui.select(list(self.keys.keys()), label="key", new_value_mode="add", with_input=True) - key_select.tailwind.width("full") + def keys_controls(self): + with ui.column() as col: + col.tailwind.width("[560px]").align_items("center") + with ui.card() as card: + card.tailwind.width("full") + key_select = ui.select(list(self.keys.keys()), label="key", new_value_mode="add", with_input=True) + key_select.tailwind.width("full") + with ui.row() as row: + row.tailwind.width("full").align_items("center").justify_content("between") with ui.row() as row: - row.tailwind.width("full").align_items("center").justify_content("between") - with ui.row() as row: - row.tailwind.align_items("center") - self.help = None - key = el.FInput(label="key", on_change=lambda e: key_changed(e), read_only=True) - key.bind_value_from(key_select) + row.tailwind.align_items("center") + self.help = None + key = el.FInput(label="key", on_change=lambda e: self.key_changed(e.value), read_only=True) + key.bind_value_from(key_select) + with ui.button(icon="help"): + self.help = ui.tooltip("NA") + ui.button(icon="add", on_click=lambda key=key: self.add_key(key.value)) + ui.separator() + self._scroll = ui.scroll_area() + self._scroll.tailwind.width("full").height("[480px]") + items = storage.answer(self.answer) + if self.type is not None and self.type in items: + for key, value in items[self.type].items(): + if isinstance(value, list): + self.add_key(key, "[" + ",".join(str(v) for v in value) + "]") + else: + self.add_key(key, str(value)) + + def add_key(self, key: str, value: str = ""): + if self.key_valid(key) is True: + with self._scroll: + with ui.row() as key_row: + key_row.tailwind.width("full").align_items("center").justify_content("between") + with ui.row() as row: + row.tailwind.align_items("center") + self._elements[key] = { + "control": el.FInput( + key, + password=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), + ), + "row": key_row, + } + self._elements[key]["control"].value = value + if key in self.keys: with ui.button(icon="help"): - self.help = ui.tooltip("NA") - ui.button(icon="add", on_click=lambda key=key: add_key(key.value)) - ui.separator() - self._scroll = ui.scroll_area() - self._scroll.tailwind.width("full").height("[480px]") - items = storage.answer(self.answer) - if self.type is not None and self.type in items: - for key, value in items[self.type].items(): - if isinstance(value, list): - add_key(key, "[" + ",".join(str(v) for v in value) + "]") - else: - add_key(key, str(value)) + ui.tooltip(self.keys[key]["description"]) + ui.button(icon="remove", on_click=lambda _, key=key: self.remove_key(key)) - def add_key(key: str, value: str = ""): - if key is not None and key != "" and key not in self._elements.keys(): - with self._scroll: - with ui.row() as key_row: - key_row.tailwind.width("full").align_items("center").justify_content("between") - with ui.row() as row: - row.tailwind.align_items("center") - self._elements[key] = { - "control": el.FInput( - key, - password=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: set_key(key, e.value), - ), - "row": key_row, - } - self._elements[key]["control"].value = value - if key in self.keys: - with ui.button(icon="help"): - ui.tooltip(self.keys[key]["description"]) - ui.button(icon="remove", on_click=lambda _, key=key: remove_key(key)) + def key_valid(self, key: str) -> bool: + if key is not None and key != "" and key not in self._elements.keys(): + return True + return False - def remove_key(key): - self._scroll.remove(self._elements[key]["row"]) - del self._elements[key] - if key in storage.answer(self.answer)[self.type]: - del storage.answer(self.answer)[self.type][key] + def remove_key(self, key: str): + self._scroll.remove(self._elements[key]["row"]) + del self._elements[key] + if key in storage.answer(self.answer)[self.type]: + del storage.answer(self.answer)[self.type][key] - def set_key(key, value: str): - v: Any = None - if len(value) > 0: - if key in self.keys and "type" in self.keys[key]: - if self.keys[key]["type"] == "list": - v = value[1:-1].split(",") - elif self.keys[key]["type"] == "int": - v = int(value) - else: - v = value + def set_key(self, key: str, value: str): + v: Any = "" + if len(value) > 0: + if key in self.keys and "type" in self.keys[key]: + if self.keys[key]["type"] == "list": + v = value[1:-1].split(",") + elif self.keys[key]["type"] == "int": + v = int(value) else: - if len(value) > 2 and value.strip()[0] == "[" and value.strip()[-1] == "]": - v = value[1:-1].split(",") - elif value.isnumeric(): - v = int(value) - else: - v = value - if self.type not in storage.answer(self.answer): - storage.answer(self.answer)[self.type] = {} - storage.answer(self.answer)[self.type][key] = v - - def key_changed(e): - if self.help is not None: - if e.value in self.keys: - self.help.text = self.keys[e.value]["description"] + v = value + else: + if len(value) > 2 and value.strip()[0] == "[" and value.strip()[-1] == "]": + v = value[1:-1].split(",") + elif value.isnumeric(): + v = int(value) else: - self.help.text = "NA" + v = value + if self.type not in storage.answer(self.answer): + storage.answer(self.answer)[self.type] = {} + storage.answer(self.answer)[self.type][key] = v - keys_controls() + def key_changed(self, value: str): + if self.help is not None: + if value in self.keys: + self.help.text = self.keys[value]["description"] + else: + self.help.text = "NA" class Global(Setting):