# # Copyright (c) Daniel Sheffield 2022 - 2022 # # All rights reserved # # THIS SOFTWARE IS PROVIDED AS IS WITHOUT WARRANTY from collections import OrderedDict import urwid from app.activities import ActivityManager from app.db_utils import NON_IDENTIFIER_COLUMNS, QueryManager from ..widgets import AutoCompleteEdit, AutoCompletePopUp class NewProduct(urwid.Overlay): def __init__(self, activity_manager: ActivityManager, query_manager: QueryManager, under, name, data, autocomplete_cb, change_cb, apply_cb, esc_cb, ): self.esc_cb = esc_cb self.under = under self._data = data self.query_manager = query_manager self.name = name title = urwid.Text('Enter Product Info', align='center') self.fields = OrderedDict() for f in ('product', 'category', 'group'): w = AutoCompleteEdit(('bg', f)) self.fields[f] = w w.set_edit_text(data[f]) urwid.connect_signal(w, 'change', lambda w, v: change_cb(w.name, v)) urwid.connect_signal(w, 'apply', lambda w, name: autocomplete_cb(w, name, self.data)) ok = urwid.Button('Done', on_press=lambda _: apply_cb(**self.data)) body = urwid.AttrMap(urwid.ListBox(urwid.SimpleListWalker([ urwid.Padding( urwid.Pile([ #urwid.Divider(), urwid.AttrMap(title, 'banner'), #urwid.Divider(), *[urwid.AttrMap(urwid.LineBox(urwid.AttrMap( AutoCompletePopUp( v, self.apply_choice, lambda: activity_manager.show(self.update()) ),'streak'), title=k.title(), title_align='left'), 'bg' ) for k,v in self.fields.items()], urwid.Divider(), urwid.AttrMap(ok, 'bg'), ], focus_item=2), align='center', left=1, right=1, ) ])), 'banner') super().__init__(urwid.AttrMap(body, 'bg'), under, align='center', width=('relative', 40), valign='middle', height=13, min_width=20) @property def data(self): return dict([(k,v) for k,v in self._data.items() if k in ('product', 'category', 'group')]) def apply_choice(self, name, value): self._data.update({ name: value }) for k,v in self.data.items(): if k == name or v: continue options = self.query_manager.unique_suggestions(k, exclude=[self.name, *NON_IDENTIFIER_COLUMNS], **self.data) if len(options) == 1 and k != 'ts': self._data.update({ k: list(options)[0] }) def update(self): for k, v in self.data.items(): self.fields[k].set_edit_text(v) return self def keypress(self, size, key): if key == 'esc': self.esc_cb() return if key == 'tab': return super().keypress(size, 'down') elif key == 'shift tab': return super().keypress(size, 'up') return super().keypress(size, key)