55
66const { ajaxUrl, nonce } = window . vizAIBuilder || { } ;
77
8- async function post ( action , body ) {
8+ async function post ( action , body , options = { } ) {
9+ const { nonceOverride = null , omitEmpty = false } = options ;
910 const form = new FormData ( ) ;
1011 form . append ( 'action' , action ) ;
11- form . append ( 'nonce' , nonce ) ;
12+ form . append ( 'nonce' , nonceOverride || nonce ) ;
1213 for ( const [ key , val ] of Object . entries ( body ) ) {
14+ if ( omitEmpty && ( val === null || val === undefined || val === '' ) ) {
15+ continue ;
16+ }
1317 form . append ( key , val ) ;
1418 }
1519 const res = await fetch ( ajaxUrl , { method : 'POST' , body : form } ) ;
@@ -51,61 +55,33 @@ export async function saveChart( chartId, title, code ) {
5155
5256// ── Upload helpers ─────────────────────────────────────────────────────────────
5357
54- /** Build a FormData for any upload call, including the per-chart upload nonce. */
55- function uploadForm ( action , chartId , uploadNonce , fields = { } ) {
56- const form = new FormData ( ) ;
57- form . append ( 'action' , action ) ;
58- form . append ( 'nonce' , uploadNonce ) ;
59- form . append ( 'chart_id' , chartId ) ;
60- for ( const [ key , val ] of Object . entries ( fields ) ) {
61- if ( val !== null && val !== undefined && val !== '' ) {
62- form . append ( key , val ) ;
63- }
64- }
65- return form ;
66- }
67-
68- async function uploadFetch ( form ) {
69- const res = await fetch ( ajaxUrl , { method : 'POST' , body : form } ) ;
70- let json ;
71- try {
72- json = await res . json ( ) ;
73- } catch {
74- throw new Error ( 'Server returned an unexpected response.' ) ;
75- }
76- if ( ! json . success ) {
77- throw new Error ( json . data ?. message || 'Upload failed.' ) ;
78- }
79- return json . data ;
80- }
81-
8258/** Upload pasted CSV string. Returns { series, data }. */
8359export async function uploadCsvString ( chartId , uploadNonce , csvData ) {
84- const form = uploadForm ( 'visualizer-ai-upload' , chartId , uploadNonce , {
60+ return post ( 'visualizer-ai-upload' , {
61+ chart_id : chartId ,
8562 source_type : 'csv_string' ,
8663 csv_data : csvData ,
87- } ) ;
88- return uploadFetch ( form ) ;
64+ } , { nonceOverride : uploadNonce , omitEmpty : true } ) ;
8965}
9066
9167/** Upload a CSV or XLSX file. Returns { series, data }. */
9268export async function uploadFile ( chartId , uploadNonce , file ) {
9369 const ext = file . name . split ( '.' ) . pop ( ) . toLowerCase ( ) ;
94- const form = uploadForm ( 'visualizer-ai-upload' , chartId , uploadNonce , {
70+ return post ( 'visualizer-ai-upload' , {
71+ chart_id : chartId ,
9572 source_type : ext === 'xlsx' ? 'xlsx_file' : 'csv_file' ,
96- } ) ;
97- form . append ( 'data_file' , file ) ;
98- return uploadFetch ( form ) ;
73+ data_file : file ,
74+ } , { nonceOverride : uploadNonce , omitEmpty : true } ) ;
9975}
10076
10177/** Upload a remote CSV/XLSX URL. Returns { series, data }. */
10278export async function uploadFileUrl ( chartId , uploadNonce , url , schedule = '' ) {
103- const form = uploadForm ( 'visualizer-ai-upload' , chartId , uploadNonce , {
79+ return post ( 'visualizer-ai-upload' , {
80+ chart_id : chartId ,
10481 source_type : 'file_url' ,
10582 file_url : url ,
10683 schedule : schedule ,
107- } ) ;
108- return uploadFetch ( form ) ;
84+ } , { nonceOverride : uploadNonce , omitEmpty : true } ) ;
10985}
11086
11187/** Upload a JSON URL source. Returns { series, data }. */
@@ -115,7 +91,8 @@ export async function uploadJsonUrl( chartId, uploadNonce, params ) {
11591 auth = '' , username = '' , password = '' , headers = '' ,
11692 schedule = '' ,
11793 } = params ;
118- const form = uploadForm ( 'visualizer-ai-upload' , chartId , uploadNonce , {
94+ return post ( 'visualizer-ai-upload' , {
95+ chart_id : chartId ,
11996 source_type : 'json_url' ,
12097 json_url : url ,
12198 json_root : root ,
@@ -126,8 +103,7 @@ export async function uploadJsonUrl( chartId, uploadNonce, params ) {
126103 json_password : password ,
127104 json_headers : headers ,
128105 json_schedule : schedule ,
129- } ) ;
130- return uploadFetch ( form ) ;
106+ } , { nonceOverride : uploadNonce , omitEmpty : true } ) ;
131107}
132108
133109// ── AI generation helpers ──────────────────────────────────────────────────────
@@ -168,7 +144,8 @@ export async function uploadDbQuery( chartId, uploadNonce, query, dbParams = {}
168144 host = '' , port = 3306 , name = '' ,
169145 username = '' , password = '' , type = 'mysql' ,
170146 } = dbParams ;
171- const form = uploadForm ( 'visualizer-ai-upload' , chartId , uploadNonce , {
147+ return post ( 'visualizer-ai-upload' , {
148+ chart_id : chartId ,
172149 source_type : 'db_query' ,
173150 db_query : query ,
174151 db_host : host ,
@@ -177,6 +154,5 @@ export async function uploadDbQuery( chartId, uploadNonce, query, dbParams = {}
177154 db_username : username ,
178155 db_password : password ,
179156 db_type : type ,
180- } ) ;
181- return uploadFetch ( form ) ;
157+ } , { nonceOverride : uploadNonce , omitEmpty : true } ) ;
182158}
0 commit comments