Add the "About" dialog and move feedback button there

This commit is contained in:
Lance Edgar 2023-09-26 11:46:37 -05:00
parent bdae602289
commit 0676a9ef4c
5 changed files with 113 additions and 20 deletions

View file

@ -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)

View file

@ -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,6 +131,9 @@ class WuttaFeedback(WuttaControl):
self.message.value += key
self.message.focus()
# TODO: why is keypress happening with no page?
if self.page:
self.update()
def long_backspace(self):
@ -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",
self.mypage.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.open = True
self.mypage.update()
if self.on_send:
self.on_send()
else:
self.message.focus()
self.page.update()
self.mypage.update()

View file

@ -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 <http://www.gnu.org/licenses/>.
"""
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()

View file

@ -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):
"""

View file

@ -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,