233 lines
9.3 KiB
Python
233 lines
9.3 KiB
Python
import flet as ft
|
|
import requests
|
|
from config import API_BASE_URL
|
|
|
|
class DestinationsPage:
|
|
def __init__(self, page: ft.Page, dashboard):
|
|
self.page = page
|
|
self.dashboard = dashboard
|
|
self.destinations = []
|
|
self.destinations_column = ft.Column(expand=True, spacing=10, scroll=ft.ScrollMode.ADAPTIVE,)
|
|
self.dialog = None
|
|
self.delete_alert = None
|
|
self.current_edit = None
|
|
self.subscription_error = ft.Text("Please subscribe to add new destination", color=ft.Colors.RED)
|
|
|
|
def refresh(self):
|
|
self.destinations_column.controls.clear()
|
|
token = self.page.client_storage.get("token")
|
|
if not token:
|
|
print("Missing token.")
|
|
return
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
response = requests.get(f"{API_BASE_URL}/destinations/", headers=headers)
|
|
if response.status_code == 200:
|
|
self.destinations = response.json()
|
|
for destination in self.destinations:
|
|
street_and_number = destination["address"].split(" %")[0]
|
|
postal_code = destination["address"].split(" %")[1]
|
|
city = destination["address"].split(" %")[2]
|
|
region_county = destination["address"].split(" %")[3]
|
|
country = destination["address"].split(" %")[4]
|
|
address = ''
|
|
if len(street_and_number) > 0:
|
|
address += street_and_number +', '
|
|
if len(postal_code) > 0:
|
|
address += postal_code +', '
|
|
if len(city) > 0:
|
|
address += city +', '
|
|
if len(region_county) > 0:
|
|
address += region_county +', '
|
|
if len(country) > 0:
|
|
address += country
|
|
self.destinations_column.controls.append(
|
|
ft.Container(
|
|
content=ft.Row([
|
|
ft.Column(
|
|
[
|
|
ft.Text(destination["name"], weight = ft.FontWeight.BOLD),
|
|
ft.Text(address)
|
|
]
|
|
),
|
|
ft.Row(
|
|
[
|
|
ft.IconButton(icon=ft.Icons.LOCATION_PIN, on_click= lambda e, d=destination: self.open_location(d)),
|
|
ft.IconButton(icon=ft.Icons.EDIT, on_click=lambda e, d=destination: self.open_dialog(d)),
|
|
ft.IconButton(icon=ft.Icons.DELETE, on_click=lambda e, d=destination: self.confirm_delete(d)),
|
|
]
|
|
)
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN),
|
|
padding=10,
|
|
bgcolor=ft.Colors.BLUE_50,
|
|
border=ft.border.all(1, ft.Colors.GREY_300),
|
|
border_radius=10,
|
|
)
|
|
)
|
|
self.page.update()
|
|
|
|
def open_dialog(self, destination=None):
|
|
self.current_edit = destination
|
|
name = ft.TextField(
|
|
label="Name",
|
|
value=destination["name"] if destination else "",
|
|
input_filter=ft.InputFilter(
|
|
allow=True,
|
|
regex_string=r"^[\x20-\x7E]*$",
|
|
replacement_string=""
|
|
),
|
|
)
|
|
street_and_number = ft.TextField(
|
|
label="Street and number",
|
|
value=destination["address"].split("%")[0] if destination else "",
|
|
input_filter=ft.InputFilter(
|
|
allow=True,
|
|
regex_string=r"^[\x20-\x7E]*$",
|
|
replacement_string=""
|
|
),
|
|
)
|
|
postal_code = ft.TextField(
|
|
label="Postal code",
|
|
value=destination["address"].split("%")[1] if destination else "",
|
|
input_filter=ft.InputFilter(
|
|
allow=True,
|
|
regex_string=r"^[\x20-\x7E]*$",
|
|
replacement_string=""
|
|
),
|
|
)
|
|
city = ft.TextField(
|
|
label="City",
|
|
value=destination["address"].split("%")[2] if destination else "",
|
|
input_filter=ft.InputFilter(
|
|
allow=True,
|
|
regex_string=r"^[\x20-\x7E]*$",
|
|
replacement_string=""
|
|
),
|
|
)
|
|
region_county = ft.TextField(
|
|
label="Region / County",
|
|
value=destination["address"].split("%")[3] if destination else "",
|
|
input_filter=ft.InputFilter(
|
|
allow=True,
|
|
regex_string=r"^[\x20-\x7E]*$",
|
|
replacement_string=""
|
|
),
|
|
)
|
|
country = ft.TextField(
|
|
label="Country",
|
|
value=destination["address"].split("%")[4] if destination else "",
|
|
input_filter=ft.InputFilter(
|
|
allow=True,
|
|
regex_string=r"^[\x20-\x7E]*$",
|
|
replacement_string=""
|
|
),
|
|
)
|
|
|
|
def save_action(e):
|
|
address = f'{street_and_number.value} %{postal_code.value} %{city.value} %{region_county.value} %{country.value}'
|
|
self.save_destination(name.value, address)
|
|
self.dialog = ft.AlertDialog(
|
|
modal=True,
|
|
title=ft.Text("Edit Address" if destination else "Add Address"),
|
|
content=ft.Column(
|
|
[
|
|
name,
|
|
street_and_number,
|
|
postal_code,
|
|
city,
|
|
region_county,
|
|
country
|
|
],
|
|
width=400,
|
|
height=400
|
|
),
|
|
actions=[
|
|
ft.TextButton("Cancel", on_click=lambda e: self.page.close(self.dialog)),
|
|
ft.ElevatedButton(
|
|
"Save",
|
|
on_click=save_action
|
|
)
|
|
],
|
|
)
|
|
self.page.dialog = self.dialog
|
|
self.page.open(self.dialog)
|
|
|
|
def save_destination(self, name, address):
|
|
token = self.page.client_storage.get("token")
|
|
user_id = self.page.session.get("user_id")
|
|
if not token or not user_id:
|
|
print("Missing token or user_id.")
|
|
return
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
data = {"name": name, "address": address, "user_id": user_id}
|
|
if self.current_edit:
|
|
url = f"{API_BASE_URL}/destinations/{self.current_edit['id']}"
|
|
requests.put(url, json=data, headers=headers)
|
|
else:
|
|
requests.post(f"{API_BASE_URL}/destinations/", json=data, headers=headers)
|
|
self.page.close(self.dialog)
|
|
self.refresh()
|
|
|
|
def confirm_delete(self, destination):
|
|
def delete_action(e):
|
|
self.delete_destination(destination["id"])
|
|
self.delete_alert = ft.AlertDialog(
|
|
modal=True,
|
|
title=ft.Text("Confirm Deletion"),
|
|
content=ft.Text(f"Are you sure you want to delete destination: {destination['name']}?"),
|
|
actions=[
|
|
ft.TextButton("Cancel", on_click=lambda e: self.page.close(self.delete_alert)),
|
|
ft.TextButton("Delete", on_click=delete_action)
|
|
]
|
|
)
|
|
self.page.dialog = self.delete_alert
|
|
self.page.open(self.delete_alert)
|
|
|
|
def delete_destination(self, id):
|
|
token = self.page.client_storage.get("token")
|
|
if not token:
|
|
print("Missing token.")
|
|
return
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
requests.delete(f"{API_BASE_URL}/destinations/{id}", headers=headers)
|
|
self.page.close(self.delete_alert)
|
|
self.refresh()
|
|
|
|
def open_location(self, destination):
|
|
query = destination["address"].replace(" ", "+").replace(" %", "").replace(",", "")
|
|
maps_url = f"https://www.google.com/maps/search/?api=1&query={query}"
|
|
self.page.launch_url(maps_url)
|
|
|
|
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.refresh()
|
|
self.add_destination_btn = ft.ElevatedButton("Add Destination", icon=ft.Icons.ADD, on_click=lambda e: self.open_dialog())
|
|
self.headers = ft.Row([
|
|
ft.Text("Adderess", size=24, weight=ft.FontWeight.BOLD),
|
|
],
|
|
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
|
|
)
|
|
subscription = self.get_current_subscription_plan()
|
|
if subscription:
|
|
if subscription['status'] != 'expired':
|
|
self.headers.controls.append(self.add_destination_btn)
|
|
else:
|
|
self.headers.controls.append(self.subscription_error)
|
|
else:
|
|
self.headers.controls.append(self.subscription_error)
|
|
return ft.Column(
|
|
[
|
|
self.headers,
|
|
self.destinations_column
|
|
],
|
|
expand=True,
|
|
) |