@@ -10,13 +10,15 @@ use crate::{
1010 app:: {
1111 ids:: Id ,
1212 messages:: {
13- CscsMsg , ErrorPopupMsg , InfoPopupMsg , LoginPopupMsg , MenuMsg , Msg , SystemSelectMsg ,
13+ CscsMsg , ErrorPopupMsg , InfoPopupMsg , JobMsg , LoginPopupMsg , MenuMsg , Msg ,
14+ SystemSelectMsg ,
1415 } ,
1516 user_events:: UserEvent ,
1617 } ,
1718 components:: {
1819 error_popup:: ErrorPopup , info_popup:: InfoPopup , login_popup:: LoginPopup ,
19- system_select_popup:: SystemSelectPopup , workload_menu:: WorkloadMenu ,
20+ system_select_popup:: SystemSelectPopup , workload_log:: WorkloadLog ,
21+ workload_menu:: WorkloadMenu ,
2022 } ,
2123 cscs:: { cli:: cscs_login, handlers:: cscs_system_set} ,
2224 trace_dbg,
4244
4345 /// Triggers async request to select current system
4446 pub select_system_tx : mpsc:: Sender < ( ) > ,
47+
48+ /// Triggers watching job logs
49+ /// sending None stops watching
50+ pub job_log_tx : mpsc:: Sender < Option < usize > > ,
4551}
4652
4753impl < T > Model < T >
5359 bridge : TerminalBridge < T > ,
5460 error_tx : mpsc:: Sender < String > ,
5561 select_system_tx : mpsc:: Sender < ( ) > ,
62+ job_log_tx : mpsc:: Sender < Option < usize > > ,
5663 ) -> Self {
5764 Self {
5865 app,
6168 terminal : bridge,
6269 error_tx,
6370 select_system_tx,
71+ job_log_tx,
6472 }
6573 }
6674
7987 . as_ref( ) ,
8088 )
8189 . split( f. area( ) ) ;
82- self . app. view( & Id :: WorkloadList , f, chunks[ 0 ] ) ;
90+ if self . app. mounted( & Id :: WorkloadList ) {
91+ self . app. view( & Id :: WorkloadList , f, chunks[ 0 ] ) ;
92+ }
8393 self . app. view( & Id :: Toolbar , f, chunks[ 1 ] ) ;
8494
8595 if self . app. mounted( & Id :: Menu ) {
@@ -217,6 +227,28 @@ where
217227 }
218228 }
219229 }
230+ fn handle_job_msg ( & mut self , msg : JobMsg ) -> Option < Msg > {
231+ match msg {
232+ JobMsg :: ShowLog ( jobid) => {
233+ if self . app . mounted ( & Id :: WorkloadList ) {
234+ assert ! ( self . app. umount( & Id :: WorkloadList ) . is_ok( ) ) ;
235+ }
236+ if !self . app . mounted ( & Id :: WorkloadLogs ) {
237+ assert ! (
238+ self . app
239+ . mount( Id :: WorkloadLogs , Box :: new( WorkloadLog :: new( ) ) , vec![ ] )
240+ . is_ok( )
241+ ) ;
242+ }
243+ assert ! ( self . app. active( & Id :: WorkloadLogs ) . is_ok( ) ) ;
244+ let job_log_tx = self . job_log_tx . clone ( ) ;
245+ tokio:: spawn ( async move {
246+ job_log_tx. send ( Some ( jobid) ) . await . unwrap ( ) ;
247+ } ) ;
248+ None
249+ }
250+ }
251+ }
220252}
221253
222254// Let's implement Update for model
@@ -284,6 +316,7 @@ where
284316 }
285317 Msg :: LoginPopup ( msg) => self . handle_login_popup_msg ( msg) ,
286318 Msg :: SystemSelectPopup ( msg) => self . handle_system_select_popup_msg ( msg) ,
319+ Msg :: Job ( msg) => self . handle_job_msg ( msg) ,
287320 Msg :: None => None ,
288321 }
289322 } else {
0 commit comments