Files
tainagustului/UI_V2/pages/home/home.py
2025-10-27 21:11:31 +02:00

216 lines
8.4 KiB
Python

import flet as ft
from dbActions.categories import Categories
from dbActions.products import Products
class Home:
def __init__(self, page: ft.Page):
self.page = page
self.categories_manager = Categories()
self.header = ft.Row(
[
#ft.Button("Acasa", icon=ft.Icons.HOME, on_click=self.on_acasa_btn_click)
ft.Text("Categori", weight=ft.FontWeight.BOLD, size=18)
],
alignment=ft.MainAxisAlignment.CENTER,
width=1000
)
self.banner = ft.Image("images/banner.png", width=1000, height=350, fit=ft.ImageFit.COVER)
self.categories_group = ft.Row([], scroll=ft.ScrollMode.ADAPTIVE, expand=True)
self.add_categories()
self.products_manager = Products()
self.products_group = ft.GridView(
spacing=10,
runs_count=5,
max_extent=200,
child_aspect_ratio=1.0,
expand=True,
width=1000
)
self.products = self.products_manager.get_all()
self.add_products(self.products)
self.searchbar = ft.TextField(
label="Cauta produsul in toate categoriile",
expand=True,
on_submit=self.on_search_btn_click
)
self.profile_placeholder = ft.Column()
self.profile_btn = ft.IconButton(
icon=ft.Icons.ACCOUNT_CIRCLE_OUTLINED,
on_click=self.on_profile_btn_click,
bgcolor=ft.Colors.BROWN,
icon_color=ft.Colors.WHITE
)
self.login_btn = ft.IconButton(
icon=ft.Icons.LOGIN,
on_click=self.on_login_btn_click,
bgcolor=ft.Colors.BROWN,
icon_color=ft.Colors.WHITE
)
if self.page.session.get("user") is not None and '@default.com' not in self.page.session.get("user")['email']:
self.profile_placeholder.controls.append(self.profile_btn)
else:
self.profile_placeholder.controls.append(self.login_btn)
self.search_for = self.page.session.get("search_for")
if self.search_for:
self.searchbar.value = self.page.session.get("search_for")
search = self.searchbar.value
buffer = []
for product in self.products:
if search.lower() in product['name'].lower():
buffer.append(product)
self.products_group.controls.clear()
self.add_products(buffer)
self.page.session.set("search_for", None)
def on_acasa_btn_click(self, e):
self.page.go('/')
def on_login_btn_click(self, e):
self.page.go('/auth')
def add_products(self, products):
for product in products:
self.new_price = ft.Text(
value=f"{round(float(product['price']) - float(product['price'])*float(product['discount'])/100,2)}",
size=14 if product['discount'] != 0 else 12,
color=ft.Colors.RED if product['discount'] != 0 else ft.Colors.BLACK,
weight=ft.FontWeight.BOLD
)
print(type(product['discount']))
self.old_price = ft.Text(
value=f"{product['price']}" if product['discount'] != 0 else '',
size=12,
color=ft.Colors.GREY,
style=ft.TextStyle(decoration=ft.TextDecoration.LINE_THROUGH),
)
card = ft.Card(
content=ft.Container(
content=ft.Column(
[
ft.Image(src=product['image'], width=170, height=100, border_radius=10, fit=ft.ImageFit.COVER),
ft.Text(product['name'], weight=ft.FontWeight.BOLD),
ft.Row(
[
ft.Text(f"Pret:", size=12),
self.old_price,
self.new_price,
ft.Text(f"lei/{product['quantity']}g", size=12),
],
alignment=ft.MainAxisAlignment.CENTER,
spacing=4
)
],
horizontal_alignment=ft.CrossAxisAlignment.CENTER
),
ink=True,
on_click=lambda e, title=product: self.on_product_click(title),
padding=5
)
)
self.products_group.controls.append(card)
def add_categories(self):
categories = self.categories_manager.get_categories()
for category in categories:
card = ft.Card(
content=ft.Container(
content=ft.Column(
[
ft.Image(
src=category['image'],
width=100,
height = 80,
border_radius=10,
fit=ft.ImageFit.COVER),
ft.Text(category['name'])
],
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
),
ink=True,
on_click=lambda e, title=category: self.on_category_click(title),
padding=5,
width=120,
height=120
)
)
self.categories_group.controls.append(card)
def on_category_click(self, cat):
name = cat['name'].replace(" ","-").lower()
self.page.session.set("category", cat)
self.page.go(f"/categorie/{name}")
def on_product_click(self, product):
self.page.session.set("product", product)
name = product['name'].replace(" ", "-").lower()
self.page.go(f'/produs/{name}')
def on_profile_btn_click(self, e):
self.page.go('/profil')
def on_cart_btn_click(self, e):
self.page.go("/pre_load_cos")
def on_search_btn_click(self, e):
search = self.searchbar.value
buffer = []
for product in self.products:
if search.lower() in product['name'].lower():
buffer.append(product)
self.products_group.controls.clear()
self.add_products(buffer)
self.products_group.update()
def build(self):
return ft.Container(
content=ft.Column(
[
ft.Row(
[
self.searchbar,
ft.IconButton(
icon=ft.Icons.SEARCH,
on_click=self.on_search_btn_click,
bgcolor=ft.Colors.BROWN,
icon_color=ft.Colors.WHITE
),
ft.VerticalDivider(),
self.profile_placeholder,
ft.IconButton(
icon=ft.Icons.SHOPPING_CART_OUTLINED,
bgcolor=ft.Colors.BROWN,
icon_color=ft.Colors.WHITE,
on_click = self.on_cart_btn_click
)
],
width=1000
),
self.banner,
ft.Column(
[
self.header,
self.categories_group,
ft.Row(
[
ft.Text("Produse Populare", size=18, weight=ft.FontWeight.BOLD),
],
alignment=ft.MainAxisAlignment.CENTER,
width=1000
),
self.products_group
],
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
expand=True
)
],
scroll=ft.ScrollMode.ADAPTIVE,
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
),
expand=True,
padding=10,
bgcolor=ft.Colors.WHITE
)