intrgrating suggestions after betta 1
This commit is contained in:
274
transportmanager/client/pages/users_page.py
Normal file
274
transportmanager/client/pages/users_page.py
Normal file
@@ -0,0 +1,274 @@
|
||||
import flet as ft
|
||||
import requests
|
||||
from config import API_BASE_URL
|
||||
|
||||
class Users:
|
||||
def __init__(self, page: ft.Page, dashboard):
|
||||
self.page = page
|
||||
self.dashboard = dashboard
|
||||
self.users = self.get_users()
|
||||
self.selected_user = None
|
||||
self.users_list = ft.ListView(
|
||||
controls=self.create_users_list(self.users, self.on_edit_btn_click, self.on_delete_btn_click),
|
||||
spacing=10,
|
||||
expand=True
|
||||
)
|
||||
self.add_user_dialog = ft.AlertDialog(
|
||||
title="Add Company User",
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.TextField(label="Name"),
|
||||
ft.TextField(label="Email"),
|
||||
ft.TextField(label="Temporary Password", password=True, can_reveal_password=True),
|
||||
ft.Text("Give user access to add and modify:"),
|
||||
ft.Checkbox(label="Orders In"),
|
||||
ft.Checkbox(label="Order Out"),
|
||||
ft.Checkbox(label="Addresses"),
|
||||
ft.Checkbox(label="Clients"),
|
||||
ft.Checkbox(label="Transporters"),
|
||||
ft.Checkbox(label="Report"),
|
||||
ft.Text("", color=ft.Colors.RED)
|
||||
],
|
||||
width=600,
|
||||
height=500
|
||||
),
|
||||
actions=[
|
||||
ft.TextButton(
|
||||
"Cancel",
|
||||
width=100,
|
||||
on_click=self.on_cancel_btn_click
|
||||
),
|
||||
ft.ElevatedButton(
|
||||
"Save",
|
||||
width=100,
|
||||
on_click=self.on_save_btn_click
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
self.delete_dialog = ft.AlertDialog(
|
||||
title=ft.Text("Delete User?"),
|
||||
actions=[
|
||||
ft.TextButton("Cancel", on_click=self.on_cancel_delete_btn_click, width=100),
|
||||
ft.Button("Yes", on_click=self.on_confirm_delete_btn_click, width=100),
|
||||
]
|
||||
)
|
||||
|
||||
self.edit_user_dialog = ft.AlertDialog(
|
||||
title=ft.Text(f"Edit User"),
|
||||
content=ft.Column(
|
||||
[
|
||||
ft.Checkbox(label="Orders In"),
|
||||
ft.Checkbox(label="Order Out"),
|
||||
ft.Checkbox(label="Addresses"),
|
||||
ft.Checkbox(label="Clients"),
|
||||
ft.Checkbox(label="Transporters"),
|
||||
ft.Checkbox(label="Report"),
|
||||
],
|
||||
width=400,
|
||||
height=350
|
||||
),
|
||||
actions=[
|
||||
ft.TextButton(
|
||||
"Cancel",
|
||||
width=100,
|
||||
on_click=self.on_edit_cancel_btn_click
|
||||
),
|
||||
ft.ElevatedButton(
|
||||
"Save",
|
||||
width=100,
|
||||
on_click=self.on_edit_save_btn_click
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
def on_edit_cancel_btn_click(self, e):
|
||||
self.page.close(self.edit_user_dialog)
|
||||
|
||||
def on_edit_save_btn_click(self, e):
|
||||
token = self.page.client_storage.get("token")
|
||||
headers = {"Authorization": f"Bearer {token}"}
|
||||
access_payload = {
|
||||
'company_user_id':self.selected_user['id'],
|
||||
'orders_in':1 if self.edit_user_dialog.content.controls[0].value else 0,
|
||||
'orders_out':1 if self.edit_user_dialog.content.controls[1].value else 0,
|
||||
'addresses':1 if self.edit_user_dialog.content.controls[2].value else 0,
|
||||
'clients':1 if self.edit_user_dialog.content.controls[3].value else 0,
|
||||
'transporters':1 if self.edit_user_dialog.content.controls[4].value else 0,
|
||||
'report':1 if self.edit_user_dialog.content.controls[5].value else 0
|
||||
}
|
||||
response = requests.put(f"{API_BASE_URL}/company_user/update_access", headers=headers, json=access_payload)
|
||||
|
||||
#set to default
|
||||
self.selected_user = None
|
||||
self.page.close(self.edit_user_dialog)
|
||||
self.edit_user_dialog.content.controls[0].value = False
|
||||
self.edit_user_dialog.content.controls[1].value = False
|
||||
self.edit_user_dialog.content.controls[2].value = False
|
||||
self.edit_user_dialog.content.controls[3].value = False
|
||||
self.edit_user_dialog.content.controls[4].value = False
|
||||
self.edit_user_dialog.content.controls[5].value = False
|
||||
self.edit_user_dialog.update()
|
||||
|
||||
def on_confirm_delete_btn_click(self, e):
|
||||
self.page.close(self.delete_dialog)
|
||||
try:
|
||||
token = self.page.client_storage.get("token")
|
||||
headers = {"Authorization": f"Bearer {token}"}
|
||||
delete_payload = {
|
||||
'user_id':self.selected_user['id']
|
||||
}
|
||||
response = requests.post(f"{API_BASE_URL}/admin/users/deactivate", headers=headers, json=delete_payload)
|
||||
except Exception as e:
|
||||
print("Error deleting company users:", e)
|
||||
users = self.get_users()
|
||||
self.users_list.controls.clear()
|
||||
self.users_list.controls = self.create_users_list(users, self.on_edit_btn_click, self.on_delete_btn_click)
|
||||
self.users_list.update()
|
||||
self.selected_user = None
|
||||
|
||||
def on_cancel_delete_btn_click(self, e):
|
||||
self.page.close(self.delete_dialog)
|
||||
|
||||
def add_new_user(self, e):
|
||||
self.page.open(self.add_user_dialog)
|
||||
|
||||
def on_edit_btn_click(self, item):
|
||||
self.selected_user = item
|
||||
access = self.get_user_access(item['id'])
|
||||
self.edit_user_dialog.content.controls[0].value = True if access['orders_in']==1 else False
|
||||
self.edit_user_dialog.content.controls[1].value = True if access['orders_out']==1 else False
|
||||
self.edit_user_dialog.content.controls[2].value = True if access['destinations']==1 else False
|
||||
self.edit_user_dialog.content.controls[3].value = True if access['clients']==1 else False
|
||||
self.edit_user_dialog.content.controls[4].value = True if access['transporters']==1 else False
|
||||
self.edit_user_dialog.content.controls[5].value = True if access['report']==1 else False
|
||||
self.page.open(self.edit_user_dialog)
|
||||
|
||||
def get_user_access(self, id):
|
||||
try:
|
||||
token = self.page.client_storage.get("token")
|
||||
headers = {"Authorization": f"Bearer {token}"}
|
||||
response = requests.get(f"{API_BASE_URL}/company_user/access/{id}", headers=headers)
|
||||
return response.json()
|
||||
except Exception as e:
|
||||
print("Error loading company user access:", e)
|
||||
|
||||
def on_delete_btn_click(self, item):
|
||||
self.selected_user = item
|
||||
self.page.open(self.delete_dialog)
|
||||
|
||||
def on_save_btn_click(self, e):
|
||||
self.page.close(self.add_user_dialog)
|
||||
try:
|
||||
token = self.page.client_storage.get("token")
|
||||
headers = {"Authorization": f"Bearer {token}"}
|
||||
create_payload = {
|
||||
'name':self.add_user_dialog.content.controls[0].value,
|
||||
'email':self.add_user_dialog.content.controls[1].value,
|
||||
'company_id':self.page.session.get("user_id"),
|
||||
'password':self.add_user_dialog.content.controls[2].value
|
||||
}
|
||||
response = requests.post(f"{API_BASE_URL}/company_user/register_company_user", headers=headers, json=create_payload)
|
||||
company_user_id = response.json()['company_user_id'] if response.status_code == 201 else self.show_error_mesage
|
||||
if company_user_id:
|
||||
access_payload = {
|
||||
'company_user_id':company_user_id,
|
||||
'orders_in':1 if self.add_user_dialog.content.controls[4].value else 0,
|
||||
'orders_out':1 if self.add_user_dialog.content.controls[5].value else 0,
|
||||
'addresses':1 if self.add_user_dialog.content.controls[6].value else 0,
|
||||
'clients':1 if self.add_user_dialog.content.controls[7].value else 0,
|
||||
'transporters':1 if self.add_user_dialog.content.controls[8].value else 0,
|
||||
'report':1 if self.add_user_dialog.content.controls[9].value else 0
|
||||
}
|
||||
response = requests.post(f"{API_BASE_URL}/company_user/access", headers=headers, json=access_payload)
|
||||
except Exception as e:
|
||||
print("Error loading company users:", e)
|
||||
|
||||
users = self.get_users()
|
||||
self.users_list.controls.clear()
|
||||
self.users_list.controls = self.create_users_list(users, self.on_edit_btn_click, self.on_delete_btn_click)
|
||||
self.users_list.update()
|
||||
#set dialog to default valuse:
|
||||
self.add_user_dialog.content.controls[0].value = ''
|
||||
self.add_user_dialog.content.controls[1].value = ''
|
||||
self.add_user_dialog.content.controls[2].value = ''
|
||||
self.add_user_dialog.content.controls[4].value = False
|
||||
self.add_user_dialog.content.controls[5].value = False
|
||||
self.add_user_dialog.content.controls[6].value = False
|
||||
self.add_user_dialog.content.controls[7].value = False
|
||||
self.add_user_dialog.content.controls[8].value = False
|
||||
self.add_user_dialog.content.controls[9].value = False
|
||||
self.add_user_dialog.content.controls[10].value = ""
|
||||
self.add_user_dialog.update()
|
||||
|
||||
def show_error_mesage(self):
|
||||
self.add_user_dialog.content.controls[10].value = "A user with this email has been already created, to reactivate it send a request at office@ordergo.eu"
|
||||
self.add_user_dialog.update()
|
||||
|
||||
def on_cancel_btn_click(self, e):
|
||||
self.page.close(self.add_user_dialog)
|
||||
|
||||
def get_users(self):
|
||||
try:
|
||||
user_id = self.page.session.get("user_id")
|
||||
users = []
|
||||
token = self.page.client_storage.get("token")
|
||||
headers = {"Authorization": f"Bearer {token}"}
|
||||
response = requests.get(f"{API_BASE_URL}/admin/users/company_users", headers=headers)
|
||||
if response.status_code == 200:
|
||||
all_users=response.json()
|
||||
for user in all_users:
|
||||
if user['company_id'] == user_id and user['active'] == 1:
|
||||
users.append(user)
|
||||
return users
|
||||
else:
|
||||
return []
|
||||
except Exception as e:
|
||||
print("Error loading company users:", e)
|
||||
|
||||
def create_users_list(self, items, on_click_handler, on_click_handler2):
|
||||
return [
|
||||
ft.Container(
|
||||
content=ft.Row(
|
||||
[
|
||||
ft.Column(
|
||||
[
|
||||
ft.Text(item['name'], expand=True, weight=ft.FontWeight.BOLD),
|
||||
ft.Text(item['email'], size=12)
|
||||
]
|
||||
),
|
||||
ft.Row(
|
||||
[
|
||||
ft.Button("Edit", on_click=lambda e, id=item: on_click_handler(id), width=100),
|
||||
ft.FilledButton("Delete", on_click=lambda e, id=item: on_click_handler2(id), width=100, bgcolor=ft.Colors.RED)
|
||||
]
|
||||
)
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
|
||||
),
|
||||
width=300,
|
||||
bgcolor=ft.Colors.BLUE_50,
|
||||
padding=10,
|
||||
border_radius=8,
|
||||
border=ft.border.all(1, ft.Colors.GREY_300),
|
||||
)
|
||||
for item in items
|
||||
]
|
||||
|
||||
def build(self):
|
||||
return ft.Container(
|
||||
content= ft.Column(
|
||||
[
|
||||
ft.Row(
|
||||
[
|
||||
ft.Text("Users", size=24, weight=ft.FontWeight.BOLD),
|
||||
ft.Button("Add User", icon=ft.Icons.ADD, on_click=self.add_new_user)
|
||||
],
|
||||
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
|
||||
),
|
||||
self.users_list
|
||||
],
|
||||
expand=True
|
||||
),
|
||||
expand=True
|
||||
)
|
||||
Reference in New Issue
Block a user