@@ -23,18 +23,24 @@ export class PinHandler implements CommandHandler {
23
23
task_id : msg . task_id ,
24
24
data : values
25
25
} ;
26
- this . submit ( send_msg , IsFileInput ( msg . spec . name ) ) ;
26
+ this . submit (
27
+ send_msg ,
28
+ msg . spec . names . filter ( IsFileInput )
29
+ ) ;
27
30
} else if ( msg . command === 'pin_update' ) {
28
31
PinUpdate ( msg . spec . name , msg . spec . attributes ) ;
29
32
} else if ( msg . command === 'pin_wait' ) {
30
33
let p = WaitChange ( msg . spec . names , msg . spec . timeout ) ;
31
34
Promise . resolve ( p ) . then ( ( change_info : ( null | { name : string , value : any } ) ) => {
32
35
// 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
+ ) ;
35
41
} ) . catch ( ( error ) => {
36
42
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 } , [ ] ) ;
38
44
} ) ;
39
45
} else if ( msg . command === 'pin_onchange' ) {
40
46
let onchange = ( val : any ) => {
@@ -43,43 +49,48 @@ export class PinHandler implements CommandHandler {
43
49
task_id : msg . spec . callback_id ,
44
50
data : { value : val }
45
51
}
46
- this . submit ( send_msg , IsFileInput ( msg . spec . name ) ) ;
52
+ this . submit (
53
+ send_msg ,
54
+ IsFileInput ( msg . spec . name ) ? [ 'value' ] : [ ]
55
+ ) ;
47
56
}
48
57
PinChangeCallback ( msg . spec . name , msg . spec . callback_id ? onchange : null , msg . spec . clear ) ;
49
58
}
50
59
}
51
60
52
61
/*
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[] }
57
65
* */
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
+ }
63
77
78
+ if ( file_blobs ) {
64
79
let toast = Toastify ( {
65
80
text : `⏳${ t ( "file_uploading" ) } 0%` ,
66
81
duration : - 1 ,
67
82
gravity : "top" ,
68
83
position : 'center' ,
69
84
backgroundColor : '#1565c0' ,
70
85
} ) ;
71
- if ( files . length > 0 ) toast . showToast ( ) ;
86
+ toast . showToast ( ) ;
72
87
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' } ) ,
77
89
( loaded : number , total : number ) => {
78
90
toast . toastElement . innerText = `⏳${ t ( "file_uploading" ) } ${ ( ( loaded / total ) * 100 ) . toFixed ( 2 ) } %` ;
79
91
if ( total - loaded < 100 ) toast . hideToast ( ) ;
80
92
}
81
93
) ;
82
-
83
94
} else {
84
95
state . CurrentSession . send_message ( msg ) ;
85
96
}
0 commit comments