diff --git a/wuttapos/controls/base.py b/wuttapos/controls/base.py index 001e687..6810c44 100644 --- a/wuttapos/controls/base.py +++ b/wuttapos/controls/base.py @@ -30,9 +30,14 @@ import flet as ft class WuttaControl(ft.UserControl): def __init__(self, config, *args, **kwargs): + self.on_reset = kwargs.pop('on_reset', None) super().__init__(*args, **kwargs) self.config = config self.app = config.get_app() def informed_refresh(self, **kwargs): pass + + def reset(self, e=None): + if self.on_reset: + self.on_reset(e=e) diff --git a/wuttapos/controls/feedback.py b/wuttapos/controls/feedback.py index 3450eb8..8180173 100644 --- a/wuttapos/controls/feedback.py +++ b/wuttapos/controls/feedback.py @@ -24,6 +24,8 @@ WuttaPOS - feedback control """ +import time + import flet as ft from .base import WuttaControl @@ -35,10 +37,13 @@ class WuttaFeedback(WuttaControl): default_font_size = 20 default_button_height = 60 - def __init__(self, *args, **kwargs): + def __init__(self, config, page=None, *args, **kwargs): self.on_send = kwargs.pop('on_send', None) self.on_cancel = kwargs.pop('on_cancel', None) - super().__init__(*args, **kwargs) + super().__init__(config, *args, **kwargs) + # TODO: why must we save this aside from self.page ? + # but sometimes self.page gets set to None, so we must.. + self.mypage = page def build(self): @@ -107,9 +112,15 @@ class WuttaFeedback(WuttaControl): ], ) - self.page.dialog = self.dlg + if self.mypage.dialog and self.mypage.dialog.open and self.mypage.dialog is not self.dlg: + self.mypage.dialog.open = False + self.mypage.update() + # cf. https://github.com/flet-dev/flet/issues/1670 + time.sleep(0.1) + + self.mypage.dialog = self.dlg self.dlg.open = True - self.page.update() + self.mypage.update() def keypress(self, key): if key == '⏎': @@ -120,7 +131,10 @@ class WuttaFeedback(WuttaControl): self.message.value += key self.message.focus() - self.update() + + # TODO: why is keypress happening with no page? + if self.page: + self.update() def long_backspace(self): self.message.value = self.message.value[:-10] @@ -129,7 +143,7 @@ class WuttaFeedback(WuttaControl): def cancel(self, e): self.dlg.open = False - self.page.update() + self.mypage.update() if self.on_cancel: self.on_cancel(e) @@ -138,22 +152,22 @@ class WuttaFeedback(WuttaControl): if self.message.value: self.app.send_email('pos_feedback', data={ - 'user_name': self.page.session.get('user_display'), + 'user_name': self.mypage.session.get('user_display'), 'message': self.message.value, }) self.dlg.open = False - self.page.snack_bar = ft.SnackBar(ft.Text(f"MESSAGE WAS SENT", - color='black', - weight=ft.FontWeight.BOLD), - bgcolor='green', - duration=1500) - self.page.snack_bar.open = True - self.page.update() + self.mypage.snack_bar = ft.SnackBar(ft.Text(f"MESSAGE WAS SENT", + color='black', + weight=ft.FontWeight.BOLD), + bgcolor='green', + duration=1500) + self.mypage.snack_bar.open = True + self.mypage.update() if self.on_send: self.on_send() else: self.message.focus() - self.page.update() + self.mypage.update() diff --git a/wuttapos/controls/header.py b/wuttapos/controls/header.py index e54be63..e053c75 100644 --- a/wuttapos/controls/header.py +++ b/wuttapos/controls/header.py @@ -24,10 +24,14 @@ WuttaPOS - header control """ +import rattail + import flet as ft +import wuttapos from .base import WuttaControl from .timestamp import WuttaTimestamp +from .feedback import WuttaFeedback class WuttaHeader(WuttaControl): @@ -36,8 +40,9 @@ class WuttaHeader(WuttaControl): self.txn_display = ft.Text("Txn: N", weight=ft.FontWeight.BOLD, size=20) self.cust_display = ft.Text("Cust: N", weight=ft.FontWeight.BOLD, size=20) self.user_display = ft.Text("User: N", weight=ft.FontWeight.BOLD, size=20) - self.logout_button = ft.FilledButton("Logout", on_click=self.logout_click, visible=False) + self.logout_button = ft.OutlinedButton("Logout", on_click=self.logout_click, visible=False) self.logout_divider = ft.VerticalDivider(visible=False) + self.title_button = ft.FilledButton(self.app.get_title(), on_click=self.title_click) controls = [ self.txn_display, @@ -50,7 +55,7 @@ class WuttaHeader(WuttaControl): ft.VerticalDivider(), self.logout_button, self.logout_divider, - ft.Text(f"WuttaPOS", weight=ft.FontWeight.BOLD, size=20), + self.title_button, ] return ft.Row(controls) @@ -94,3 +99,71 @@ class WuttaHeader(WuttaControl): self.page.session.clear() self.page.go('/login') + + def title_click(self, e): + title = self.app.get_title() + + license = """\ +WuttaPOS -- Pythonic Point of Sale System +Copyright © 2023 Lance Edgar + +WuttaPOS is free software: you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +WuttaPOS is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +details. + +You should have received a copy of the GNU General Public License along with +WuttaPOS. If not, see . +""" + + self.dlg = ft.AlertDialog( + title=ft.Text(title), + content=ft.Container( + content=ft.Column( + [ + ft.Divider(), + ft.Text(f"{title} v{wuttapos.__version__}"), + ft.Text(f"rattail v{rattail.__version__}"), + ft.Divider(), + ft.Text(license), + ft.Container( + content=WuttaFeedback(self.config, page=self.page, + on_send=self.reset, on_cancel=self.reset), + alignment=ft.alignment.center, + expand=True, + ), + ], + expand=True, + ), + height=600, + ), + actions=[ + ft.Row( + [ + ft.Container(content=ft.Text("Close", size=20, + weight=ft.FontWeight.BOLD), + height=60, + width=60 * 2.5, + alignment=ft.alignment.center, + border=ft.border.all(1, 'black'), + border_radius=ft.border_radius.all(5), + on_click=self.close_dlg), + ], + alignment=ft.MainAxisAlignment.CENTER, + ), + ], + ) + + self.page.dialog = self.dlg + self.dlg.open = True + self.page.update() + + def close_dlg(self, e): + self.dlg.open = False + self.reset() + self.page.update() diff --git a/wuttapos/views/base.py b/wuttapos/views/base.py index 9c78546..b149da1 100644 --- a/wuttapos/views/base.py +++ b/wuttapos/views/base.py @@ -53,9 +53,12 @@ class WuttaView(ft.View): return [self.build_header()] def build_header(self): - self.header = WuttaHeader(self.config) + self.header = WuttaHeader(self.config, on_reset=self.reset) return self.header + def reset(self, *args, **kwargs): + pass + class WuttaViewContainer(ft.Container): """ diff --git a/wuttapos/views/pos.py b/wuttapos/views/pos.py index 2e9f8fc..4a4098c 100644 --- a/wuttapos/views/pos.py +++ b/wuttapos/views/pos.py @@ -32,7 +32,6 @@ import flet as ft from .base import WuttaView from wuttapos.controls.custlookup import WuttaCustomerLookup -from wuttapos.controls.feedback import WuttaFeedback from wuttapos.util import get_pos_batch_handler @@ -641,7 +640,6 @@ class POSView(WuttaView): ft.Row( [ - WuttaFeedback(self.config, on_send=self.reset, on_cancel=self.reset), ft.Row( [ self.set_quantity,