Files
JuridicBloc/client/pages/settings/users.py
2026-06-13 21:46:37 +03:00

256 lines
8.8 KiB
Python

import flet as ft
import requests
from helpers.roles import Roles
import flet as ft
class UsersSettings:
def __init__(self, page: ft.Page):
self.page = page
self.base_url = self.page.session.store.get('api_base_url')
self.token = self.page.session.store.get('token')
self.selected_user_id = None
self.user_roles = [
'toti',
Roles.USER,
Roles.PROPRIETAR,
Roles.CENZOR,
Roles.ADMINISTRATOR,
Roles.PRESEDINTE,
Roles.EXPERT,
Roles.BA,
]
self.all_roles_list = ft.ListView(
controls=self.create_list(self.user_roles, self.on_role_btn_click),
spacing=10,
width=350
)
self.all_users = self.get_all_users()
self.role_users = ft.ListView(
controls=self.create_users_list(self.all_users, self.on_user_btn_click),
spacing=10,
expand=True
)
self.placeholder = ft.Container(
margin=ft.Margin.only(top=5),
content=self.role_users,
expand=True
)
self.email = ft.TextField(label="Email", read_only=True, expand=True)
self.first_name = ft.TextField(label="Prenume", expand=True)
self.last_name = ft.TextField(label = "Nume", expand=True)
self.address = ft.TextField(label="Adresa", expand=True)
self.profession = ft.TextField(label="Profesie", expand=True)
self.role = ft.RadioGroup(
content=ft.Row(
[ft.Radio(value=role, label=role.upper()) for role in self.user_roles if role != "toti"]
)
)
self.status = ft.TextField(label="Status", expand=True)
self.profile_pic = ft.TextField(label="Poza profil", read_only=True, expand=True)
self.created_at = ft.TextField(label="Data creare cont",read_only=True, expand=True)
self.active = ft.TextField(label="Active: 0-Nu, 1-Da", expand=True)
self.error = ft.Text(color=ft.Colors.RED)
self.user_details = ft.Column(
[
ft.Text("Detalii utilizator", weight=ft.FontWeight.BOLD),
self.email,
self.first_name,
self.last_name,
self.address,
self.profession,
ft.Text("Rol:", weight=ft.FontWeight.BOLD),
self.role,
#self.status,
#self.profile_pic,
self.active,
self.created_at,
self.error,
ft.Row(
[
ft.FilledButton("Salveaza", on_click=self.on_save_btn_click)
],
alignment=ft.MainAxisAlignment.CENTER
),
ft.Text()
],
scroll=ft.ScrollMode.ADAPTIVE
)
self.search_bar = ft.TextField(
label="Cauta",
on_submit=self.on_search_bar_submit,
expand=True
)
def on_role_btn_click(self, role):
self.placeholder.content = self.role_users
self.placeholder.update()
self.role_users.controls.clear()
users = self.users_by_role(role) if role != 'toti' else self.all_users
self.role_users.controls = self.create_users_list(users, self.on_user_btn_click)
self.role_users.update()
def on_user_btn_click(self, user):
self.selected_user_id = user['id']
self.email.value = user['email']
self.first_name.value = user['first_name']
self.last_name.value = user['last_name']
self.address.value = user['address']
self.profession.value = user['profession']
self.role.value = user['role']
self.status.value = user['status']
self.profile_pic.value = user['profile_pic']
self.active.value = str(user['active'])
self.created_at.value = user['created_at']
self.error.value = ""
self.placeholder.content = self.user_details
self.placeholder.update()
def create_list(self, items, on_click_handler):
return [
ft.Container(
content=ft.Row(
[
ft.Row(
[
ft.Icon(ft.Icons.ARROW_RIGHT, size=20),
ft.Text(value=item.upper())
]
),
],
alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
),
expand=True,
bgcolor=ft.Colors.BLUE_50,
border = ft.Border.all(1, ft.Colors.GREY),
padding=10,
border_radius=8,
ink=True,
on_click=lambda e, cid=item: on_click_handler(cid)
)
for item in items
]
def create_users_list(self, items, on_click_handler):
return [
ft.Container(
content=ft.Row(
[
ft.Row(
[
ft.Icon(ft.Icons.ARROW_RIGHT, size=20),
ft.Text(value=item['email'])
]
),
],
alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
),
expand=True,
bgcolor=ft.Colors.BLUE_50,
border = ft.Border.all(1, ft.Colors.GREY),
padding=10,
border_radius=8,
ink=True,
on_click=lambda e, cid=item: on_click_handler(cid)
)
for item in items
]
def get_all_users(self):
payload = {}
response = requests.get(
f"{self.base_url}/users/",
json=payload,
headers={'Authorization': f'Bearer {self.token}'}
)
print(response.text)
return response.json()
def users_by_role(self, role):
users = []
for user in self.all_users:
if user['role']==role:
users.append(user)
print(users)
return users
def on_save_btn_click(self, e):
if self.selected_user_id is None:
return
payload = {
"first_name": self.first_name.value,
"last_name": self.last_name.value,
"address": self.address.value,
"profession": self.profession.value,
"role": self.role.value,
"status": self.status.value,
"active": int(self.active.value) if str(self.active.value).isdigit() else 1
}
response = requests.put(
f"{self.base_url}/users/update/{self.selected_user_id}",
json=payload,
headers={'Authorization': f'Bearer {self.token}'}
)
if response.status_code == 200:
self.error.value = "Modificări salvate cu succes!"
self.error.color = ft.Colors.GREEN
self.all_users = self.get_all_users() # Refresh lista locală
else:
self.error.value = response.json().get("error", "Eroare la salvarea datelor")
self.error.color = ft.Colors.RED
self.error.update()
def on_search_bar_submit(self, e):
search = self.search_bar.value
self.placeholder.content = self.role_users
self.placeholder.update()
self.role_users.controls.clear()
users = [user for user in self.all_users if search in user['email']]
self.role_users.controls = self.create_users_list(users, self.on_user_btn_click)
self.role_users.update()
def build(self):
return ft.Container(
content=ft.Column(
[
ft.Row(
[
self.all_roles_list,
ft.VerticalDivider(width=1),
ft.Container(
content = ft.Column(
[
ft.Row(
[
self.search_bar
]
),
#ft.Divider(height=1),
self.placeholder
],
expand=True
),
padding=5,
expand=True
)
],
expand=True
)
],
expand=True
),
expand=True
)