@@ -492,7 +492,8 @@ def _page_layout(scroll_controls: list[ft.Control]) -> ft.Column:
492492# ── Page: Dashboard ───────────────────────────────────────────────────────────
493493
494494def build_dashboard (page : ft .Page , console : OutputConsole ,
495- navigate : callable | None = None ) -> ft .Column :
495+ navigate : callable | None = None ,
496+ on_refresh : callable | None = None ) -> ft .Column :
496497
497498 def _course_card (cid : int , name : str ) -> ft .Card :
498499 vd , vt = _video_status (cid )
@@ -579,8 +580,19 @@ def _go(_):
579580 ft .Container (height = 8 ),
580581 ], horizontal_alignment = ft .CrossAxisAlignment .CENTER , spacing = 10 ))]
581582
583+ refresh_btn = ft .IconButton (
584+ icon = ft .Icons .REFRESH ,
585+ tooltip = "Refresh courses from Canvas" ,
586+ icon_color = C_PRIMARY ,
587+ on_click = lambda _ : on_refresh () if on_refresh else None ,
588+ )
589+
582590 scroll_content = [
583- _section_title ("Course Overview" , ft .Icons .DASHBOARD_OUTLINED ),
591+ ft .Row (controls = [
592+ _section_title ("Course Overview" , ft .Icons .DASHBOARD_OUTLINED ),
593+ ft .Container (expand = True ),
594+ refresh_btn ,
595+ ]),
584596 * course_rows ,
585597 ft .Container (height = 4 ),
586598 _section_title ("Quick Actions" , ft .Icons .BOLT_OUTLINED ),
@@ -1031,13 +1043,11 @@ def build_settings(page: ft.Page,
10311043 on_courses_changed : callable | None = None ) -> ft .Column :
10321044
10331045 def _snack (msg : str , ok : bool = True ) -> None :
1034- page .snack_bar = ft .SnackBar (
1046+ page .open ( ft .SnackBar (
10351047 ft .Text (msg , color = ft .Colors .BLACK ),
10361048 bgcolor = C_SUCCESS if ok else C_ERROR ,
1037- duration = 2000 ,
1038- )
1039- page .snack_bar .open = True
1040- page .update ()
1049+ duration = 2500 ,
1050+ ))
10411051
10421052 def _key_row (label : str , tf : ft .TextField , on_save ) -> ft .Row :
10431053 return ft .Row (controls = [
@@ -1076,14 +1086,14 @@ def _save_config(key: str, value: str) -> None:
10761086 def _save_canvas_url (_ ):
10771087 try :
10781088 _save_config ("CANVAS_URL" , tf_canvas_url .value .strip ())
1079- _snack ("Canvas URL saved. " )
1089+ _snack ("Canvas URL saved successfully! " )
10801090 except Exception as e :
10811091 _snack (f"Error: { e } " , ok = False )
10821092
10831093 def _save_panopto (_ ):
10841094 try :
10851095 _save_config ("PANOPTO_HOST" , tf_panopto .value .strip ())
1086- _snack ("Panopto host saved. " )
1096+ _snack ("Panopto host saved successfully! " )
10871097 except Exception as e :
10881098 _snack (f"Error: { e } " , ok = False )
10891099
@@ -1156,28 +1166,28 @@ def _do_refresh():
11561166 def _save_canvas (_ ):
11571167 try :
11581168 canvas_file .write_text (tf_canvas .value .strip ())
1159- _snack ("Canvas token saved. " )
1169+ _snack ("Canvas token saved successfully! " )
11601170 except Exception as e :
11611171 _snack (f"Error: { e } " , ok = False )
11621172
11631173 def _save_openai (_ ):
11641174 try :
11651175 openai_file .write_text (tf_openai .value .strip ())
1166- _snack ("OpenAI key saved to openai_api.txt. " )
1176+ _snack ("OpenAI key saved successfully! " )
11671177 except Exception as e :
11681178 _snack (f"Error: { e } " , ok = False )
11691179
11701180 def _save_anthropic (_ ):
11711181 try :
11721182 anthropic_file .write_text (tf_anthropic .value .strip ())
1173- _snack ("Anthropic key saved to anthropic_key.txt. " )
1183+ _snack ("Anthropic key saved successfully! " )
11741184 except Exception as e :
11751185 _snack (f"Error: { e } " , ok = False )
11761186
11771187 def _save_gemini (_ ):
11781188 try :
11791189 gemini_file .write_text (tf_gemini .value .strip ())
1180- _snack ("Gemini key saved to gemini_api.txt. " )
1190+ _snack ("Gemini key saved successfully! " )
11811191 except Exception as e :
11821192 _snack (f"Error: { e } " , ok = False )
11831193
@@ -1414,7 +1424,8 @@ def navigate(idx: int) -> None:
14141424
14151425 def _build_pages () -> list :
14161426 return [
1417- build_dashboard (page , console , navigate = navigate ),
1427+ build_dashboard (page , console , navigate = navigate ,
1428+ on_refresh = lambda : _rebuild_ref [0 ] and _rebuild_ref [0 ]()),
14181429 build_pipeline (page , console ),
14191430 build_download (page , console ),
14201431 build_transcribe (page , console ),
0 commit comments