init commit
This commit is contained in:
273
transportmanager/client/pages/transporters_page.py
Normal file
273
transportmanager/client/pages/transporters_page.py
Normal file
@@ -0,0 +1,273 @@
|
||||
import flet as ft
|
||||
import requests
|
||||
from config import API_BASE_URL
|
||||
|
||||
class TransportersPage:
|
||||
def __init__(self, page: ft.Page, dashboard):
|
||||
self.page = page
|
||||
self.dashboard = dashboard
|
||||
self.transporters = []
|
||||
self.dialog = None
|
||||
self.name = ft.TextField(
|
||||
label="Name",
|
||||
expand=True,
|
||||
input_filter=ft.InputFilter(
|
||||
allow=True,
|
||||
regex_string=r"^[\x20-\x7E]*$",
|
||||
replacement_string=""
|
||||
),
|
||||
)
|
||||
self.street_and_number = ft.TextField(
|
||||
label="Street and number",
|
||||
input_filter=ft.InputFilter(
|
||||
allow=True,
|
||||
regex_string=r"^[\x20-\x7E]*$",
|
||||
replacement_string=""
|
||||
),
|
||||
)
|
||||
self.postal_code = ft.TextField(
|
||||
label="Postal code",
|
||||
input_filter=ft.InputFilter(
|
||||
allow=True,
|
||||
regex_string=r"^[\x20-\x7E]*$",
|
||||
replacement_string=""
|
||||
),
|
||||
)
|
||||
self.city = ft.TextField(
|
||||
label="City",
|
||||
input_filter=ft.InputFilter(
|
||||
allow=True,
|
||||
regex_string=r"^[\x20-\x7E]*$",
|
||||
replacement_string=""
|
||||
),
|
||||
)
|
||||
self.region_county = ft.TextField(
|
||||
label="Region / County",
|
||||
input_filter=ft.InputFilter(
|
||||
allow=True,
|
||||
regex_string=r"^[\x20-\x7E]*$",
|
||||
replacement_string=""
|
||||
),
|
||||
)
|
||||
self.country = ft.TextField(
|
||||
label="Country",
|
||||
input_filter=ft.InputFilter(
|
||||
allow=True,
|
||||
regex_string=r"^[\x20-\x7E]*$",
|
||||
replacement_string=""
|
||||
),
|
||||
)
|
||||
self.register_number = ft.TextField(
|
||||
label="Register Number",
|
||||
expand=True,
|
||||
input_filter=ft.InputFilter(
|
||||
allow=True,
|
||||
regex_string=r"^[\x20-\x7E]*$",
|
||||
replacement_string=""
|
||||
),
|
||||
)
|
||||
self.contact_person = ft.TextField(
|
||||
label="Contact Person",
|
||||
expand=True,
|
||||
input_filter=ft.InputFilter(
|
||||
allow=True,
|
||||
regex_string=r"^[\x20-\x7E]*$",
|
||||
replacement_string=""
|
||||
),
|
||||
)
|
||||
self.phone = ft.TextField(
|
||||
label="Phone",
|
||||
expand=True,
|
||||
input_filter=ft.InputFilter(
|
||||
allow=True,
|
||||
regex_string=r"^[\x20-\x7E]*$",
|
||||
replacement_string=""
|
||||
),
|
||||
)
|
||||
self.email = ft.TextField(
|
||||
label="Email",
|
||||
expand=True,
|
||||
input_filter=ft.InputFilter(
|
||||
allow=True,
|
||||
regex_string=r"^[\x20-\x7E]*$",
|
||||
replacement_string=""
|
||||
),
|
||||
)
|
||||
self.vat = ft.TextField(
|
||||
label="VAT",
|
||||
expand=True,
|
||||
input_filter=ft.InputFilter(
|
||||
allow=True,
|
||||
regex_string=r"^[\x20-\x7E]*$",
|
||||
replacement_string=""
|
||||
),
|
||||
)
|
||||
self.user_id = self.page.session.get("user_id")
|
||||
self.selected_id = None
|
||||
self.subscription_error = ft.Text("Please subscribe to add new transporter", color=ft.Colors.RED)
|
||||
|
||||
def open_dialog(self, transporter=None):
|
||||
if transporter:
|
||||
self.selected_id = transporter["id"]
|
||||
self.name.value = transporter["name"]
|
||||
self.street_and_number.value = transporter["address"].split(" %")[0]
|
||||
self.postal_code.value = transporter["address"].split(" %")[1]
|
||||
self.city.value = transporter["address"].split(" %")[2]
|
||||
self.region_county.value = transporter["address"].split(" %")[3]
|
||||
self.country.value = transporter["address"].split(" %")[4]
|
||||
self.register_number.value = transporter["register_number"]
|
||||
self.contact_person.value = transporter["contact_person"]
|
||||
self.phone.value = transporter["phone"]
|
||||
self.email.value = transporter["email"]
|
||||
self.vat.value = transporter["vat"]
|
||||
else:
|
||||
self.selected_id = None
|
||||
self.name.value = ""
|
||||
self.street_and_number.value = ""
|
||||
self.postal_code.value = ""
|
||||
self.city.value = ""
|
||||
self.region_county.value = ""
|
||||
self.country.value = ""
|
||||
self.register_number.value = ""
|
||||
self.contact_person.value = ""
|
||||
self.phone.value = ""
|
||||
self.email.value = ""
|
||||
self.vat.value = ""
|
||||
|
||||
self.dialog = ft.AlertDialog(
|
||||
modal=True,
|
||||
title=ft.Text("Transporter"),
|
||||
content=ft.Column(
|
||||
controls=[
|
||||
self.name,
|
||||
self.register_number,
|
||||
self.vat,
|
||||
self.contact_person,
|
||||
self.phone,
|
||||
self.email,
|
||||
self.street_and_number,
|
||||
self.postal_code,
|
||||
self.city,
|
||||
self.region_county,
|
||||
self.country,
|
||||
],
|
||||
width=600
|
||||
),
|
||||
actions=[
|
||||
ft.TextButton("Cancel", on_click=lambda e: self.page.close(self.dialog)),
|
||||
ft.ElevatedButton("Save", on_click=self.save_transporter)
|
||||
],
|
||||
)
|
||||
self.page.dialog = self.dialog
|
||||
self.page.open(self.dialog)
|
||||
|
||||
def save_transporter(self, e):
|
||||
address = f'{self.street_and_number.value} %{self.postal_code.value} %{self.city.value} %{self.region_county.value} %{self.country.value}'
|
||||
|
||||
data = {
|
||||
"name": self.name.value,
|
||||
"address": address,
|
||||
"register_number": self.register_number.value,
|
||||
"contact_person": self.contact_person.value,
|
||||
"phone": self.phone.value,
|
||||
"email": self.email.value,
|
||||
"vat": self.vat.value,
|
||||
"user_id": self.user_id
|
||||
}
|
||||
|
||||
token = self.page.client_storage.get("token")
|
||||
headers = {"Authorization": f"Bearer {token}"}
|
||||
|
||||
if self.selected_id:
|
||||
requests.put(f"{API_BASE_URL}/transporters/{self.selected_id}", json=data, headers=headers)
|
||||
else:
|
||||
requests.post(f"{API_BASE_URL}/transporters/", json=data, headers=headers)
|
||||
|
||||
self.page.close(self.dialog)
|
||||
self.refresh()
|
||||
self.page.update()
|
||||
|
||||
def delete_transporter(self, transporter_id):
|
||||
def confirm_delete(e):
|
||||
token = self.page.client_storage.get("token")
|
||||
headers = {"Authorization": f"Bearer {token}"}
|
||||
requests.delete(f"{API_BASE_URL}/transporters/{transporter_id}", headers=headers)
|
||||
self.page.close(self.confirm_dialog)
|
||||
self.refresh()
|
||||
|
||||
self.confirm_dialog = ft.AlertDialog(
|
||||
title=ft.Text("Confirm"),
|
||||
content=ft.Text("Are you sure you want to delete this transporter?"),
|
||||
actions=[
|
||||
ft.ElevatedButton("Yes", on_click=confirm_delete),
|
||||
ft.ElevatedButton("No", on_click=lambda e: self.page.close(self.confirm_dialog))
|
||||
]
|
||||
)
|
||||
self.page.dialog = self.confirm_dialog
|
||||
self.page.open(self.confirm_dialog)
|
||||
|
||||
def refresh(self):
|
||||
token = self.page.client_storage.get("token")
|
||||
headers = {"Authorization": f"Bearer {token}"}
|
||||
response = requests.get(f"{API_BASE_URL}/transporters/", headers=headers)
|
||||
if response.ok:
|
||||
self.transporters = response.json()
|
||||
else:
|
||||
self.transporters = []
|
||||
|
||||
self.transporter_list.controls.clear()
|
||||
for transporter in self.transporters:
|
||||
self.transporter_list.controls.append(
|
||||
ft.Container(
|
||||
content=ft.Row([
|
||||
ft.Column([
|
||||
ft.Text(f"{transporter['name']}", size=16, weight=ft.FontWeight.BOLD),
|
||||
ft.Text(f"{transporter['email']} • {transporter['phone']}", size=12)
|
||||
], expand=True),
|
||||
ft.IconButton(icon=ft.Icons.EDIT, on_click=lambda e, t=transporter: self.open_dialog(t)),
|
||||
ft.IconButton(icon=ft.Icons.DELETE, on_click=lambda e, t=transporter: self.delete_transporter(t["id"])),
|
||||
]),
|
||||
padding=10,
|
||||
border=ft.border.all(1, ft.Colors.GREY_300),
|
||||
bgcolor=ft.Colors.BLUE_50,
|
||||
border_radius=10,
|
||||
)
|
||||
)
|
||||
self.page.update()
|
||||
|
||||
def get_current_subscription_plan(self):
|
||||
try:
|
||||
token = self.page.client_storage.get("token")
|
||||
headers = {"Authorization": f"Bearer {token}"}
|
||||
response = requests.get(f"{API_BASE_URL}/subscription/", headers=headers)
|
||||
#print(response.text)
|
||||
return response.json()[-1] if response.status_code == 200 else None
|
||||
except Exception as e:
|
||||
print("Error loading subscription:", e)
|
||||
|
||||
def build(self):
|
||||
self.transporter_list = ft.Column(spacing=10, expand=True, scroll=ft.ScrollMode.ADAPTIVE,)
|
||||
self.refresh()
|
||||
self.add_transporter_btn = ft.ElevatedButton("Add Transporter", icon=ft.Icons.ADD, on_click=lambda e: self.open_dialog())
|
||||
self.header = ft.Row(
|
||||
controls=[
|
||||
ft.Text("Transporters", size=24, weight=ft.FontWeight.BOLD, expand=True),
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
|
||||
)
|
||||
subscription = self.get_current_subscription_plan()
|
||||
if subscription:
|
||||
if subscription['status'] != 'expired':
|
||||
self.header.controls.append(self.add_transporter_btn)
|
||||
else:
|
||||
self.header.controls.append(self.subscription_error)
|
||||
else:
|
||||
self.header.controls.append(self.subscription_error)
|
||||
return ft.Column(
|
||||
[
|
||||
self.header,
|
||||
self.transporter_list
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.START,
|
||||
|
||||
)
|
||||
Reference in New Issue
Block a user