import flet as ft import requests class StandardDocuments: def __init__(self, page: ft.Page, home): self.page = page self.home = home self.base_url = self.page.session.store.get('api_base_url') self.token = self.page.session.store.get('token') self.all_documents = [] # Stocăm documentele pentru filtrare locală (căutare după nume) # Elemente UI self.search_bar = ft.TextField( label="Caută document după nume", on_change=self._on_search_change, expand=True, prefix_icon=ft.Icons.SEARCH, hint_text="Introdu numele documentului..." ) self.category_dropdown = ft.Dropdown( label="Filtrează după categorie", on_select=self._on_category_change, width=300, hint_text="Alege o categorie" ) self.documents_list_view = ft.ListView( expand=True, spacing=10, padding=10 ) def _on_search_change(self, e): """Filtrează lista de documente afișată în funcție de textul din search bar.""" query = self.search_bar.value.lower().strip() filtered = [ doc for doc in self.all_documents if query in doc['name'].lower() ] self._populate_documents_list(filtered) def _on_category_change(self, e): """Reîncarcă documentele atunci când se schimbă categoria selectată.""" self._load_documents(self.category_dropdown.value) def _load_categories(self): """Preia categoriile de documente de la server.""" try: response = requests.get( f"{self.base_url}/documents/categories", headers={"Authorization": f"Bearer {self.token}"} ) if response.status_code == 200: user_data = self.page.session.store.get('user') user_role = user_data.get('role', '').lower() if user_data else "" all_cats = response.json() # Filtrare categorii după rol: utilizatorul vede categoria doar dacă # rolul său se regăsește în câmpul 'access' (comma-separated string) filtered_cats = [ cat for cat in all_cats if user_role in [r.strip().lower() for r in cat.get('access', '').split(',')] ] self.category_dropdown.options = [ ft.dropdown.Option(key="all", text="Toate categoriile") ] + [ ft.dropdown.Option(key=str(cat['id']), text=cat['name']) for cat in filtered_cats ] self.category_dropdown.value = "all" self.page.update() except Exception as ex: print(f"Error fetching categories: {ex}") def _load_documents(self, category_id="all"): """Preia documentele standard de la server.""" try: if category_id == "all": url = f"{self.base_url}/documents/standards" else: url = f"{self.base_url}/documents/standards/category/{category_id}" response = requests.get( url, headers={"Authorization": f"Bearer {self.token}"} ) if response.status_code == 200: user_data = self.page.session.store.get('user') user_role = user_data.get('role', '').lower() if user_data else "" raw_docs = response.json() # Filtrare documente după rol: utilizatorul vede documentul doar dacă # rolul său se regăsește în câmpul 'access' (comma-separated string) self.all_documents = [ doc for doc in raw_docs if user_role in [r.strip().lower() for r in doc.get('access', '').split(',')] ] # Aplicăm și filtrul de căutare dacă există deja text în search bar query = self.search_bar.value.lower().strip() filtered = [d for d in self.all_documents if query in d['name'].lower()] self._populate_documents_list(filtered) except Exception as ex: print(f"Error fetching documents: {ex}") def _populate_documents_list(self, documents): """Actualizează interfața cu lista de documente furnizată.""" self.documents_list_view.controls = [] if not documents: self.documents_list_view.controls.append( ft.Container( content=ft.Text("Nu s-au găsit documente.", size=16, color=ft.Colors.GREY_600), alignment=ft.Alignment.CENTER, padding=20 ) ) else: for doc in documents: self.documents_list_view.controls.append( ft.Container( content=ft.Row( [ ft.Icon(ft.Icons.INSERT_DRIVE_FILE_OUTLINED, color=ft.Colors.BLUE_700), ft.Column( [ ft.Text(doc['name'], weight=ft.FontWeight.BOLD, size=16), ft.Text(f"Path: {doc['path']}", size=12, color=ft.Colors.GREY_500), ], expand=True, alignment=ft.MainAxisAlignment.CENTER ), ft.IconButton( icon=ft.Icons.DOWNLOAD, tooltip="Descarcă documentul", icon_color=ft.Colors.BLUE_700, on_click=lambda e, d=doc: self.page.run_task(self._download_document, d) ) ], alignment=ft.MainAxisAlignment.SPACE_BETWEEN ), bgcolor=ft.Colors.BLUE_50, padding=15, border_radius=10, border=ft.Border.all(1, ft.Colors.BLUE_100), ink=True ) ) self.page.update() async def _download_document(self, doc): """Deschide URL-ul de download pentru documentul selectat.""" download_url = f"{self.base_url}/documents/download?path={doc['path']}&token={self.token}" await self.page.launch_url(download_url) def build(self): # Încărcare inițială a datelor self._load_categories() self._load_documents() return ft.Container( content=ft.Column( [ ft.Row( [ self.category_dropdown, self.search_bar ], spacing=20 ), ft.Divider(height=1, color=ft.Colors.GREY_300), self.documents_list_view ], expand=True ), expand=True, padding=20 )