import flet as ft import requests import datetime def create_page(page: ft.Page): page.clean() page.theme_mode = ft.ThemeMode.LIGHT # Set the theme to light def is_student(): url = 'http://127.0.0.1:8000/check_role' headers = { 'accept': 'application/json', 'Content-Type': 'application/json' } session_id = page.session.get("access_token") if not session_id: print("Session ID is missing.") return None data = {'session_id': session_id} try: response = requests.post(url, json=data, headers=headers) response.raise_for_status() role = response.json() if 'role' in role and 'role' in role['role']: if role['role']['role'] == "student": role = "s" page.go("/login") return role elif role['role']['role'] == "teacher": role = "t" return role print("Unexpected response structure:", role) return None except requests.exceptions.RequestException as error: print("Error during role check:", error) return None page.title = "Create Room Page" if is_student == "s": page.gp("/") session = page.session.get("access_token") if not session: page.go("/login") # Initialize selected room state (use a simple variable instead of ft.State) selected_room = "" selected_date = "" selected_time = "" SEARCH_RESULT = "" date_text = ft.Text( "", # Initially empty size=18, # Font size weight=ft.FontWeight.BOLD, # Make the text bold color="black", # Text colo visible=False # Initially hidden ) # Function to fetch room data def fetch_rooms(): try: response = requests.get("http://awesom-o.org:8000/teacher/all_room_information") response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: print("Error fetching room data:", e) return [] # Fetch rooms initially (don't display them immediately) room_data = fetch_rooms() # Function to filter room data def search_rooms(query): query = query.lower() return [ room for room in room_data if query in room["room_number"].lower() or query in room["info"].lower() or query in room["location"].lower() ] # Search results container search_results = ft.Column( visible=False, # Initially hidden scroll=ft.ScrollMode.AUTO, expand=True ) # Update search results def update_results(query): if query.strip() == "": # When the search field is empty, show all rooms search_results.controls.clear() for room in room_data: search_results.controls.append( ft.ListTile( title=ft.Text(f"Room {room['room_number']}: {room['info']}"), subtitle=ft.Text(room['location']), on_click=lambda e, r=room: select_room(r), ) ) search_results.visible = True else: search_results.controls.clear() filtered_rooms = search_rooms(query) for room in filtered_rooms: search_results.controls.append( ft.ListTile( title=ft.Text(f"Room {room['room_number']}: {room['info']}"), subtitle=ft.Text(room['location']), on_click=lambda e, r=room: select_room(r), ) ) search_results.visible = True close_button.visible = search_results.visible # Show close button when results are visible page.update() # Select a room def select_room(room): nonlocal selected_room nonlocal SEARCH_RESULT selected_room = f"Room {room['room_number']}: {room['info']} - {room['location']}" search_bar.value = selected_room SEARCH_RESULT = room['number'] search_results.visible = False close_button.visible = False page.update() # Close button to hide search results def close_search_results(e): search_results.visible = False close_button.visible = False page.update() def handle_change_date_picker(e): # Once a date is selected, update the Text and make it visible nonlocal selected_date selected_date = e.control.value.strftime('%Y-%m-%d') if selected_time != "": date_text.value = f"Your Room will be started on: {selected_date} at {selected_time}" date_text.visible = True # Make the Text visible after date selection page.update() else: date_text.value = f"Your Room will be started on: {selected_date}" date_text.visible = True # Make the Text visible after date selection page.update() # Update the page to reflect the changes def handle_change_dropdown(e): nonlocal selected_time selected_time1 = e.control.value selected_time = selected_time1.replace("Start time: ", "") if selected_date != "": date_text.value = f"Your Room will be started on: {selected_date} at {selected_time}" date_text.visible = True # Make the Text visible after date selection page.update() else: date_text.value = f"Your Room will be started at {selected_time}" date_text.visible = True # Make the Text visible after date selection page.update() # Update the page to reflect the changes def go_to_main(e): page.go("/") # Replace with the appropriate route for your register page def create(e): page.update() search_results = SEARCH_RESULT.strip() max_students = max_students_field.value.strip() selected_date selected_time # Validate input if not search_results or not max_students or not selected_date or not selected_time: info_label.value = "Please enter Room Number, Max Students, Lesson Date and Lesson Time." info_label.color = "red" page.update() return try: max_students = int(max_students) except ValueError: info_label.value = "Max Students must be a number." info_label.color = "red" page.update() return if max_students < 1: info_label.value = "Please don't enter a negative or zero value for Max Students." info_label.color = "red" page.update() return try: url = 'http://127.0.0.1:8000/teacher/create_room' headers = { 'accept': 'application/json', 'Content-Type': 'application/json' } data = { 'room_number': search_results, 'max_students': max_students, 'session_id': page.session.get("access_token"), 'lesson_time': selected_time, 'lesson_date': selected_date } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: success_message = "The Room was created Successfully!" info_label.value = success_message info_label.color = "green" else: error_message = "Something went wrong..." info_label.value = error_message info_label.color = "red" except requests.exceptions.RequestException as e: info_label.value = f"An error occurred: {str(e)}" info_label.color = "red" page.update() # Search bar search_bar = ft.TextField( label="Search for a room", on_focus=lambda e: update_results(""), # Show all rooms when search bar is focused on_change=lambda e: update_results(e.control.value), expand=True # Make the search bar take up available space ) # Close button close_button = ft.IconButton( icon=ft.icons.CLOSE, on_click=close_search_results, visible=False # Initially hidden ) max_students_field = ft.TextField(label="Max Students") info_label = ft.Text("", theme_style=ft.TextThemeStyle.TITLE_SMALL) # Add components to the page page.add( ft.Row([search_bar, close_button]), # Add search bar and close button in a row search_results, max_students_field, ft.Row([ ft.OutlinedButton( "Pick the date when your lesson begins", icon=ft.icons.CALENDAR_MONTH, height=40, on_click=lambda e: page.open( ft.DatePicker( first_date=datetime.datetime(year=2024, month=11, day=20), on_change=handle_change_date_picker, ) ), ), date_text, # Add the styled Text below the button ], spacing=20), ft.Dropdown( hint_text="Choose the Start of your Lesson", options=[ ft.dropdown.Option("Start time: 8:00"), ft.dropdown.Option("Start time: 9:20"), ft.dropdown.Option("Start time: 10:40"), ft.dropdown.Option("Start time: 11:50"), ft.dropdown.Option("Start time: 12:50"), ft.dropdown.Option("Start time: 13:55"), ft.dropdown.Option("Start time: 15:00"), ],on_change=handle_change_dropdown, label_style=ft.TextStyle(size=16), # Correct way to set font size for Dropdown ), ft.ElevatedButton("Submit", on_click=create), info_label, ft.Row([ ft.TextButton("Enough? Click here to go to the Main Page", on_click=go_to_main), ]), ) # Example usage if __name__ == "__main__": ft.app(target=create_page, view=ft.AppView.WEB_BROWSER)