feat: initial LMS frontend with adaptive navigation and routing

This commit is contained in:
Flook
2026-05-04 17:44:35 +07:00
commit b4725b184b
17 changed files with 395 additions and 0 deletions
+7
View File
@@ -0,0 +1,7 @@
import flet as ft
def articles_page():
return ft.Column([
ft.Text("บทความ", size=22),
ft.Text("รายการบทความจะมาอยู่ตรงนี้"),
])
+7
View File
@@ -0,0 +1,7 @@
import flet as ft
def courses_page():
return ft.Column([
ft.Text("หลักสูตร", size=22),
ft.Text("รายการหลักสูตร")
])
+69
View File
@@ -0,0 +1,69 @@
import flet as ft
import asyncio
from app.api import login, get_me
from app.state import state
def login_page(page: ft.Page, on_login_success):
username = ft.TextField(
label="Email",
on_submit=lambda _: handle_login(), # เรียก wrapper
autofocus=True
)
password = ft.TextField(
label="Password",
password=True,
can_reveal_password=True,
on_submit=lambda _: handle_login(), # เรียก wrapper
)
message = ft.Text()
# WRAPPER (sync)
def handle_login(e=None):
asyncio.create_task(do_login()) # ยิง async
# ASYNC ตัวจริง
async def do_login():
if not username.value or not password.value:
message.value = "กรุณากรอกข้อมูลให้ครบถ้วน"
message.color = ft.Colors.RED_400
page.update()
return
try:
message.value = "กำลังตรวจสอบข้อมูล..."
message.color = ft.Colors.BLUE_400
page.update()
result = await asyncio.to_thread(login, username.value, password.value)
state.access_token = result["access"]
state.user = await asyncio.to_thread(get_me, state.access_token)
await on_login_success() # ไป route
except Exception as e:
message.value = "เข้าสู่ระบบไม่สำเร็จ"
message.color = ft.Colors.RED_400
print("LOGIN ERROR:", e)
page.update()
login_button = ft.FilledButton(
"ล็อกอิน",
on_click=handle_login, # ใช้ wrapper
width=200,
)
return ft.Column(
controls=[
ft.Text("เข้าสู่ระบบ", size=24),
username,
password,
login_button,
message,
],
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
spacing=20,
)
+7
View File
@@ -0,0 +1,7 @@
import flet as ft
def my_courses_page():
return ft.Column([
ft.Text('หลักสูตรของฉัน', size=22),
ft.Text('ข้อมูลหลักสูตรที่ลงทะเบียน')
])
+7
View File
@@ -0,0 +1,7 @@
import flet as ft
def profile_page():
return ft.Column([
ft.Text("ข้อมูลผู้ใช้งาน", size=22),
ft.Text("รายละเอียดข้อมูลผู้ใช้งานจะมาอยู่ตรงนี้"),
])
+7
View File
@@ -0,0 +1,7 @@
import flet as ft
def progress_page():
return ft.Column([
ft.Text('ความก้าวหน้าของฉัน', size=22),
ft.Text('รายละเอียดความก้าวหน้าของฉัน')
])