123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- 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.AttrMap(title, 'banner'),
-
- *[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)
|