11use eyre:: { Context , Report } ;
22use tokio:: sync:: mpsc;
33use tuirealm:: {
4- Application , Update ,
4+ Application , AttrValue , Attribute , Update ,
55 ratatui:: {
66 Frame ,
77 layout:: { Constraint , Direction , Layout , Rect } ,
@@ -21,12 +21,12 @@ use crate::{
2121 } ,
2222 components:: {
2323 context_menu:: ContextMenu , download_popup:: DownloadTargetInput , error_popup:: ErrorPopup , info_popup:: InfoPopup ,
24- login_popup:: LoginPopup , system_select_popup:: SystemSelectPopup , workload_list :: WorkloadList ,
25- workload_log:: WorkloadLog ,
24+ login_popup:: LoginPopup , system_select_popup:: SystemSelectPopup , workload_details :: WorkloadDetails ,
25+ workload_list :: WorkloadList , workload_log:: WorkloadLog ,
2626 } ,
2727 cscs:: {
2828 handlers:: { cscs_login, cscs_system_set} ,
29- ports:: { JobLogAction , TreeAction } ,
29+ ports:: { BackgroundTask , JobLogAction } ,
3030 } ,
3131 trace_dbg,
3232 util:: ui:: { draw_area_in_absolute, draw_area_in_absolute_fixed_height} ,
6262 pub user_event_tx : mpsc:: Sender < UserEvent > ,
6363
6464 /// Allows interacting with the file Api
65- pub file_tree_tx : mpsc:: Sender < TreeAction > ,
65+ pub background_task_tx : mpsc:: Sender < BackgroundTask > ,
6666}
6767
6868impl < T > Model < T >
7676 select_system_tx : mpsc:: Sender < ( ) > ,
7777 job_log_tx : mpsc:: Sender < JobLogAction > ,
7878 user_event_tx : mpsc:: Sender < UserEvent > ,
79- file_tree_tx : mpsc:: Sender < TreeAction > ,
79+ background_task_tx : mpsc:: Sender < BackgroundTask > ,
8080 ) -> Self {
8181 Self {
8282 app,
8888 select_system_tx,
8989 job_log_tx,
9090 user_event_tx,
91- file_tree_tx ,
91+ background_task_tx ,
9292 }
9393 }
9494
@@ -101,7 +101,6 @@ where
101101 . draw( |f| {
102102 let chunks = Layout :: default ( )
103103 . direction( Direction :: Vertical )
104- . margin( 1 )
105104 . constraints(
106105 [
107106 Constraint :: Max ( 3 ) , //Statusbar
@@ -149,11 +148,9 @@ where
149148 }
150149
151150 fn view_workloads ( app : & mut Application < Id , Msg , UserEvent > , frame : & mut Frame , area : Rect ) {
152- if app. mounted ( & Id :: WorkloadList ) {
153- app. view ( & Id :: WorkloadList , frame, area) ;
154- } else if app. mounted ( & Id :: WorkloadLogs ) {
155- app. view ( & Id :: WorkloadLogs , frame, area) ;
156- }
151+ app. view ( & Id :: WorkloadList , frame, area) ;
152+ app. view ( & Id :: WorkloadLogs , frame, area) ;
153+ app. view ( & Id :: WorkloadDetails , frame, area) ;
157154 }
158155 fn view_files ( app : & mut Application < Id , Msg , UserEvent > , frame : & mut Frame , area : Rect ) {
159156 if app. mounted ( & Id :: FileView ) {
@@ -263,9 +260,9 @@ where
263260 }
264261 DownloadPopupMsg :: PathSet ( remote, local) => {
265262 assert ! ( self . app. umount( & Id :: DownloadPopup ) . is_ok( ) ) ;
266- let file_tx = self . file_tree_tx . clone ( ) ;
263+ let file_tx = self . background_task_tx . clone ( ) ;
267264 tokio:: spawn ( async move {
268- file_tx. send ( TreeAction :: Download ( remote, local) ) . await . unwrap ( ) ;
265+ file_tx. send ( BackgroundTask :: DownloadFile ( remote, local) ) . await . unwrap ( ) ;
269266 } ) ;
270267 None
271268 }
@@ -306,9 +303,13 @@ where
306303 }
307304 fn handle_job_msg ( & mut self , msg : JobMsg ) -> Option < Msg > {
308305 match msg {
309- JobMsg :: Show ( jobid) => {
306+ JobMsg :: Log ( jobid) => {
310307 if self . app . mounted ( & Id :: WorkloadList ) {
311- assert ! ( self . app. umount( & Id :: WorkloadList ) . is_ok( ) ) ;
308+ assert ! (
309+ self . app
310+ . attr( & Id :: WorkloadList , Attribute :: Display , AttrValue :: Flag ( false ) )
311+ . is_ok( )
312+ ) ;
312313 }
313314 if !self . app . mounted ( & Id :: WorkloadLogs ) {
314315 assert ! (
@@ -324,6 +325,38 @@ where
324325 } ) ;
325326 None
326327 }
328+ JobMsg :: GetDetails ( jobid) => {
329+ let background_tx = self . background_task_tx . clone ( ) ;
330+ let event_tx = self . user_event_tx . clone ( ) ;
331+ tokio:: spawn ( async move {
332+ background_tx. send ( BackgroundTask :: GetJobDetails ( jobid) ) . await . unwrap ( ) ;
333+ event_tx
334+ . send ( UserEvent :: Status ( StatusEvent :: Info (
335+ "getting job details..." . to_owned ( ) ,
336+ ) ) )
337+ . await
338+ . unwrap ( ) ;
339+ } ) ;
340+ None
341+ }
342+ JobMsg :: Details ( jobdetail) => {
343+ if self . app . mounted ( & Id :: WorkloadList ) {
344+ assert ! (
345+ self . app
346+ . attr( & Id :: WorkloadList , Attribute :: Display , AttrValue :: Flag ( false ) )
347+ . is_ok( )
348+ ) ;
349+ }
350+ if !self . app . mounted ( & Id :: WorkloadDetails ) {
351+ assert ! (
352+ self . app
353+ . mount( Id :: WorkloadDetails , Box :: new( WorkloadDetails :: new( jobdetail) ) , vec![ ] )
354+ . is_ok( )
355+ ) ;
356+ }
357+ assert ! ( self . app. active( & Id :: WorkloadDetails ) . is_ok( ) ) ;
358+ None
359+ }
327360 JobMsg :: Switch => {
328361 let job_log_tx = self . job_log_tx . clone ( ) ;
329362 tokio:: spawn ( async move {
@@ -335,13 +368,21 @@ where
335368 if self . app . mounted ( & Id :: WorkloadLogs ) {
336369 assert ! ( self . app. umount( & Id :: WorkloadLogs ) . is_ok( ) ) ;
337370 }
371+ if self . app . mounted ( & Id :: WorkloadDetails ) {
372+ assert ! ( self . app. umount( & Id :: WorkloadDetails ) . is_ok( ) ) ;
373+ }
338374 if !self . app . mounted ( & Id :: WorkloadList ) {
339375 assert ! (
340376 self . app
341377 . mount( Id :: WorkloadList , Box :: new( WorkloadList :: default ( ) ) , vec![ ] )
342378 . is_ok( )
343379 ) ;
344380 }
381+ assert ! (
382+ self . app
383+ . attr( & Id :: WorkloadList , Attribute :: Display , AttrValue :: Flag ( true ) )
384+ . is_ok( )
385+ ) ;
345386 assert ! ( self . app. active( & Id :: WorkloadList ) . is_ok( ) ) ;
346387 let job_log_tx = self . job_log_tx . clone ( ) ;
347388 tokio:: spawn ( async move {
0 commit comments