@@ -23,18 +23,24 @@ export class PinHandler implements CommandHandler {
2323 task_id : msg . task_id ,
2424 data : values
2525 } ;
26- this . submit ( send_msg , IsFileInput ( msg . spec . name ) ) ;
26+ this . submit (
27+ send_msg ,
28+ msg . spec . names . filter ( IsFileInput )
29+ ) ;
2730 } else if ( msg . command === 'pin_update' ) {
2831 PinUpdate ( msg . spec . name , msg . spec . attributes ) ;
2932 } else if ( msg . command === 'pin_wait' ) {
3033 let p = WaitChange ( msg . spec . names , msg . spec . timeout ) ;
3134 Promise . resolve ( p ) . then ( ( change_info : ( null | { name : string , value : any } ) ) => {
3235 // change_info: null or {'name': name, 'value': value}
33- let send_msg = { event : "js_yield" , task_id : msg . task_id , data : change_info }
34- this . submit ( send_msg , IsFileInput ( change_info . name ) ) ;
36+ let send_msg = { event : "js_yield" , task_id : msg . task_id , data : change_info } ;
37+ this . submit (
38+ send_msg ,
39+ ( change_info && IsFileInput ( change_info . name ) ) ? [ 'value' ] : [ ]
40+ ) ;
3541 } ) . catch ( ( error ) => {
3642 console . error ( 'error in `pin_wait`: %s' , error ) ;
37- this . submit ( { event : "js_yield" , task_id : msg . task_id , data : null } ) ;
43+ this . submit ( { event : "js_yield" , task_id : msg . task_id , data : null } , [ ] ) ;
3844 } ) ;
3945 } else if ( msg . command === 'pin_onchange' ) {
4046 let onchange = ( val : any ) => {
@@ -43,43 +49,48 @@ export class PinHandler implements CommandHandler {
4349 task_id : msg . spec . callback_id ,
4450 data : { value : val }
4551 }
46- this . submit ( send_msg , IsFileInput ( msg . spec . name ) ) ;
52+ this . submit (
53+ send_msg ,
54+ IsFileInput ( msg . spec . name ) ? [ 'value' ] : [ ]
55+ ) ;
4756 }
4857 PinChangeCallback ( msg . spec . name , msg . spec . callback_id ? onchange : null , msg . spec . clear ) ;
4958 }
5059 }
5160
5261 /*
53- * Send pin value to server.
54- * `msg.data` may be null, or {value: any, ...}
55- * `msg.data.value` stores the value of the pin.
56- * when submit files, `msg.data.value` is {multiple: bool, files: File[] }
62+ * Send pin values to server.
63+ * `msg.data`: {input_name: input_value, ...} or null
64+ * for file input, the `input_value` is in {multiple: bool, files: File[] }
5765 * */
58- submit ( msg : ClientEvent , is_file : boolean = false ) {
59- if ( is_file && msg . data !== null ) {
60- // msg.data.value: {multiple: bool, files: File[]}
61- let { multiple, files} = msg . data . value ;
62- msg . data . value = multiple ? [ ] : null ; // replace file value with initial value
66+ submit ( msg : ClientEvent , file_input_names : string [ ] ) {
67+ // See: deserialize_binary_event() in pywebio/platform/utils.py
68+ let file_blobs :Blob [ ] = [ ] ;
69+ for ( let name of file_input_names ) {
70+ if ( msg . data && msg . data [ name ] ) {
71+ // {multiple: bool, files: File[]}
72+ let { multiple, files} = msg . data [ name ] ;
73+ msg . data [ name ] = multiple ? [ ] : null ; // replace file value with initial value
74+ file_blobs . push ( ...files . map ( ( file : File ) => serialize_file ( file , name ) ) ) ;
75+ }
76+ }
6377
78+ if ( file_blobs ) {
6479 let toast = Toastify ( {
6580 text : `⏳${ t ( "file_uploading" ) } 0%` ,
6681 duration : - 1 ,
6782 gravity : "top" ,
6883 position : 'center' ,
6984 backgroundColor : '#1565c0' ,
7085 } ) ;
71- if ( files . length > 0 ) toast . showToast ( ) ;
86+ toast . showToast ( ) ;
7287 state . CurrentSession . send_buffer (
73- new Blob ( [
74- serialize_json ( msg ) ,
75- ...files . map ( ( file : File ) => serialize_file ( file , 'value' ) )
76- ] , { type : 'application/octet-stream' } ) ,
88+ new Blob ( [ serialize_json ( msg ) , ...file_blobs ] , { type : 'application/octet-stream' } ) ,
7789 ( loaded : number , total : number ) => {
7890 toast . toastElement . innerText = `⏳${ t ( "file_uploading" ) } ${ ( ( loaded / total ) * 100 ) . toFixed ( 2 ) } %` ;
7991 if ( total - loaded < 100 ) toast . hideToast ( ) ;
8092 }
8193 ) ;
82-
8394 } else {
8495 state . CurrentSession . send_message ( msg ) ;
8596 }
0 commit comments