@@ -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_list:: WorkloadList ,
21+ workload_log:: WorkloadLog , 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+ } else if self . app. mounted( & Id :: WorkloadLogs ) {
93+ self . app. view( & Id :: WorkloadLogs , f, chunks[ 0 ] ) ;
94+ }
8395 self . app. view( & Id :: Toolbar , f, chunks[ 1 ] ) ;
8496
8597 if self . app. mounted( & Id :: Menu ) {
@@ -157,6 +169,9 @@ where
157169 fn handle_error_popup_msg ( & mut self , msg : ErrorPopupMsg ) -> Option < Msg > {
158170 match msg {
159171 ErrorPopupMsg :: Opened ( error_msg) => {
172+ if self . app . mounted ( & Id :: ErrorPopup ) {
173+ assert ! ( self . app. umount( & Id :: ErrorPopup ) . is_ok( ) ) ;
174+ }
160175 assert ! (
161176 self . app
162177 . mount( Id :: ErrorPopup , Box :: new( ErrorPopup :: new( error_msg) ) , vec![ ] )
@@ -217,6 +232,47 @@ where
217232 }
218233 }
219234 }
235+ fn handle_job_msg ( & mut self , msg : JobMsg ) -> Option < Msg > {
236+ match msg {
237+ JobMsg :: ShowLog ( jobid) => {
238+ if self . app . mounted ( & Id :: WorkloadList ) {
239+ assert ! ( self . app. umount( & Id :: WorkloadList ) . is_ok( ) ) ;
240+ }
241+ if !self . app . mounted ( & Id :: WorkloadLogs ) {
242+ assert ! (
243+ self . app
244+ . mount( Id :: WorkloadLogs , Box :: new( WorkloadLog :: new( ) ) , vec![ ] )
245+ . is_ok( )
246+ ) ;
247+ }
248+ assert ! ( self . app. active( & Id :: WorkloadLogs ) . is_ok( ) ) ;
249+ let job_log_tx = self . job_log_tx . clone ( ) ;
250+ tokio:: spawn ( async move {
251+ job_log_tx. send ( Some ( jobid) ) . await . unwrap ( ) ;
252+ } ) ;
253+ None
254+ }
255+ JobMsg :: CloseLog => {
256+ if self . app . mounted ( & Id :: WorkloadLogs ) {
257+ assert ! ( self . app. umount( & Id :: WorkloadLogs ) . is_ok( ) ) ;
258+ }
259+ if !self . app . mounted ( & Id :: WorkloadList ) {
260+ assert ! (
261+ self . app
262+ . mount( Id :: WorkloadList , Box :: new( WorkloadList :: default ( ) ) , vec![ ] )
263+ . is_ok( )
264+ ) ;
265+ }
266+ assert ! ( self . app. active( & Id :: WorkloadList ) . is_ok( ) ) ;
267+ let job_log_tx = self . job_log_tx . clone ( ) ;
268+ tokio:: spawn ( async move {
269+ // stopp polling for logs
270+ job_log_tx. send ( None ) . await . unwrap ( ) ;
271+ } ) ;
272+ None
273+ }
274+ }
275+ }
220276}
221277
222278// Let's implement Update for model
@@ -284,6 +340,7 @@ where
284340 }
285341 Msg :: LoginPopup ( msg) => self . handle_login_popup_msg ( msg) ,
286342 Msg :: SystemSelectPopup ( msg) => self . handle_system_select_popup_msg ( msg) ,
343+ Msg :: Job ( msg) => self . handle_job_msg ( msg) ,
287344 Msg :: None => None ,
288345 }
289346 } else {
0 commit comments