Refactor GradesPage to support semester selection and display grades accordingly
This commit is contained in:
parent
a4e938e90f
commit
cdd2904f27
1 changed files with 123 additions and 81 deletions
|
@ -1,6 +1,7 @@
|
|||
import flet as ft
|
||||
from sqlitehandlernr import fetch_all_grades
|
||||
from i18n import _
|
||||
from utils import getcurrentsemester
|
||||
|
||||
def parse_grade_value(value):
|
||||
try:
|
||||
|
@ -17,15 +18,8 @@ def format_date(dt):
|
|||
return dt.strftime("%Y/%m/%d")
|
||||
|
||||
def GradesPage(page):
|
||||
grades = fetch_all_grades()
|
||||
panels = []
|
||||
subjects = {}
|
||||
|
||||
for grade in grades:
|
||||
subject = grade.subject
|
||||
if subject not in subjects:
|
||||
subjects[subject] = []
|
||||
subjects[subject].append(grade)
|
||||
semester = ft.Ref[ft.Dropdown]()
|
||||
content_column = ft.Ref[ft.Column]()
|
||||
|
||||
modal = ft.BottomSheet(
|
||||
content=ft.Column([], spacing=5),
|
||||
|
@ -134,6 +128,18 @@ def GradesPage(page):
|
|||
modal.open = True
|
||||
page.update()
|
||||
|
||||
def build_content_for_semester(selected_semester):
|
||||
all_grades = fetch_all_grades(selected_semester)
|
||||
panels = []
|
||||
subjects = {}
|
||||
|
||||
for grade in all_grades:
|
||||
subject = grade.subject
|
||||
subjects.setdefault(subject, []).append(grade)
|
||||
|
||||
# (rest of your logic stays the same)
|
||||
|
||||
|
||||
for subject, grades_list in subjects.items():
|
||||
header = ft.Container(
|
||||
content=ft.Column([
|
||||
|
@ -141,7 +147,8 @@ def GradesPage(page):
|
|||
ft.Row([
|
||||
ft.Text(f"{len(grades_list)} " + _("grades"), size=14),
|
||||
ft.Text((_("Average")) + ": {:.2f}".format(
|
||||
sum(parse_grade_value(g.value) for g in grades_list if parse_grade_value(g.value) is not None) / max(len([g for g in grades_list if parse_grade_value(g.value) is not None]), 1)
|
||||
sum(parse_grade_value(g.value) for g in grades_list if parse_grade_value(g.value) is not None) /
|
||||
max(len([g for g in grades_list if parse_grade_value(g.value) is not None]), 1)
|
||||
), size=14),
|
||||
])
|
||||
], alignment=ft.MainAxisAlignment.CENTER, horizontal_alignment=ft.CrossAxisAlignment.START, expand=True),
|
||||
|
@ -160,7 +167,7 @@ def GradesPage(page):
|
|||
padding=ft.padding.symmetric(horizontal=12, vertical=8),
|
||||
border_radius=5,
|
||||
margin=ft.margin.all(5),
|
||||
on_click=lambda e, grade=grade: open_grade_modal(grade),
|
||||
on_click=(lambda e, g=grade: open_grade_modal(g)),
|
||||
),
|
||||
ft.Column([
|
||||
ft.Text(grade.name),
|
||||
|
@ -170,7 +177,7 @@ def GradesPage(page):
|
|||
])
|
||||
], spacing=1)
|
||||
], expand=True),
|
||||
on_click=lambda e, grade=grade: open_grade_modal(grade),
|
||||
on_click=(lambda e, g=grade: open_grade_modal(g)),
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -181,8 +188,43 @@ def GradesPage(page):
|
|||
)
|
||||
panels.append(panel)
|
||||
|
||||
return ft.Column([
|
||||
ft.Text((_("Grades")), size=30, weight="bold"),
|
||||
return panels
|
||||
|
||||
def on_semester_change(e):
|
||||
selected_sem = int(semester.current.value)
|
||||
panels = build_content_for_semester(selected_sem)
|
||||
content_column.current.controls = [
|
||||
ft.ExpansionPanelList(panels),
|
||||
modal
|
||||
], scroll=True)
|
||||
]
|
||||
page.update()
|
||||
|
||||
return ft.Column([
|
||||
ft.Row([
|
||||
ft.Text((_("Grades")), size=30, weight="bold"),
|
||||
ft.Dropdown(
|
||||
ref=semester,
|
||||
width=150,
|
||||
value=str(getcurrentsemester()),
|
||||
options=[
|
||||
ft.dropdown.Option("1", text=(_("Semester 1"))),
|
||||
ft.dropdown.Option("2", text=(_("Semester 2"))),
|
||||
],
|
||||
on_change=on_semester_change,
|
||||
alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
|
||||
expand=True,
|
||||
),
|
||||
], alignment=ft.MainAxisAlignment.SPACE_BETWEEN, spacing=10),
|
||||
ft.Container(
|
||||
content=ft.Column(
|
||||
ref=content_column,
|
||||
controls=[
|
||||
ft.ExpansionPanelList(build_content_for_semester(getcurrentsemester())),
|
||||
modal
|
||||
],
|
||||
scroll=True
|
||||
),
|
||||
expand=True
|
||||
)
|
||||
|
||||
])
|
||||
|
|
Loading…
Add table
Reference in a new issue