import { ajaxUrl, getSecurity } from 'boot/wpapi'; import { api as axios } from 'boot/axios'; import { promiseHelper } from '../helpers/promiseHelper'; import { Settings, TableType } from 'src/stores/main/models'; /** * admin-ajax actions registered by includes/endpoints.php. Only fetch_table * and query_rows are public (the embed document); everything else needs the * admin screen's vtables_nonce. */ export const api = { async fetchTables({ page, perPage, search, order, orderby, }: { page: number; perPage: number; search: string; order?: 'ASC' | 'DESC'; orderby?: string; }) { return await promiseHelper( axios.get(ajaxUrl, { params: { action: 'vtables_list_tables', security: getSecurity(), page, per_page: perPage, search, orderby, order, }, }) ); }, async fetchTable(id: string) { return await promiseHelper( axios.get(ajaxUrl, { params: { action: 'vtables_fetch_table', id, }, }) ); }, async deleteTable(id: string) { const params = new URLSearchParams(); params.append('action', 'vtables_delete_table'); params.append('security', getSecurity()); params.append('id', id); return await promiseHelper(axios.post(ajaxUrl, params)); }, async createTable({ title, source, fileSize, settings, tableType, }: { title: string; source: Record; fileSize: string; settings: Settings; tableType?: TableType; }) { const params = new URLSearchParams(); params.append('action', 'vtables_create_table'); params.append('security', getSecurity()); params.append('title', title); params.append('source', JSON.stringify(source)); params.append('file_size', fileSize); params.append('settings', JSON.stringify(settings)); if (tableType) params.append('table_type', tableType); return await promiseHelper(axios.post(ajaxUrl, params)); }, async saveTableChanges(payload: { id: string; title: string; source?: Record; }) { const params = new URLSearchParams(); params.append('action', 'vtables_save_source'); params.append('security', getSecurity()); params.append('id', payload.id); params.append('title', payload.title); if (payload.source) params.append('source', JSON.stringify(payload.source)); return await promiseHelper(axios.post(ajaxUrl, params)); }, async saveTableSettings(payload: { id: string; settings: Record; }) { const params = new URLSearchParams(); params.append('action', 'vtables_save_settings'); params.append('security', getSecurity()); params.append('id', payload.id); params.append('settings', JSON.stringify(payload.settings)); return await promiseHelper(axios.post(ajaxUrl, params)); }, async fetchMigrationLog() { return await promiseHelper( axios.get(ajaxUrl, { params: { action: 'vtables_fetch_migration_log', security: getSecurity(), }, }) ); }, async parseExcel(file: File) { const formData = new FormData(); formData.append('action', 'vtables_parse_excel'); formData.append('security', getSecurity()); formData.append('file', file); return await promiseHelper(axios.post(ajaxUrl, formData)); }, async uploadChunk(payload: { uploadId: string; chunkIndex: number; totalChunks: number; filename: string; fileType: string; chunkBlob: Blob; }) { const formData = new FormData(); formData.append('action', 'vtables_upload_chunk'); formData.append('security', getSecurity()); formData.append('session_id', payload.uploadId); formData.append('chunk_index', String(payload.chunkIndex)); formData.append('total_chunks', String(payload.totalChunks)); formData.append('file', payload.chunkBlob, payload.filename); return await promiseHelper(axios.post(ajaxUrl, formData)); }, async finalizeUpload(payload: { uploadId: string; filename: string; fileType: string; title: string; totalChunks: number; fileSize: string; settings: string; originalType?: string; }) { const params = new URLSearchParams(); params.append('action', 'vtables_finalize_upload'); params.append('security', getSecurity()); params.append('session_id', payload.uploadId); params.append('file_name', payload.filename); params.append('title', payload.title); params.append('total_chunks', String(payload.totalChunks)); params.append('file_size', payload.fileSize); params.append('settings', payload.settings); if (payload.originalType) { params.append('original_type', payload.originalType); } return await promiseHelper(axios.post(ajaxUrl, params)); }, async cancelChunkUpload(uploadId: string) { const params = new URLSearchParams(); params.append('action', 'vtables_cancel_chunk_upload'); params.append('security', getSecurity()); params.append('session_id', uploadId); return await promiseHelper(axios.post(ajaxUrl, params)); }, async importRowsBatch(tableId: string | number) { const params = new URLSearchParams(); params.append('action', 'vtables_import_rows_batch'); params.append('security', getSecurity()); params.append('table_id', String(tableId)); return await promiseHelper(axios.post(ajaxUrl, params)); }, /** Plain pagination; search, sorting and filtering are vTables Pro features. */ async queryRows(payload: { tableId: string | number; page: number; perPage: number; }) { return await promiseHelper( axios.get(ajaxUrl, { params: { action: 'vtables_query_rows', table_id: String(payload.tableId), page: payload.page, per_page: payload.perPage, }, }) ); }, async updateRow(payload: { tableId: string | number; vtId: string | number; row: Record; }) { const params = new URLSearchParams(); params.append('action', 'vtables_update_row'); params.append('security', getSecurity()); params.append('table_id', String(payload.tableId)); params.append('vt_id', String(payload.vtId)); params.append('row', JSON.stringify(payload.row)); return await promiseHelper(axios.post(ajaxUrl, params)); }, async insertRow(payload: { tableId: string | number; // Anchored placement: the new row lands directly before/after the row with // this vt_id (the endpoint shifts the neighbors' row_index). Preferred over // afterIndex, which sparsely places at after_index + 1 without reindexing. anchorVtId?: string | number; position?: 'before' | 'after'; afterIndex?: number; row: Record; }) { const params = new URLSearchParams(); params.append('action', 'vtables_insert_row'); params.append('security', getSecurity()); params.append('table_id', String(payload.tableId)); if (payload.anchorVtId !== undefined) { params.append('anchor_vt_id', String(payload.anchorVtId)); params.append('position', payload.position ?? 'after'); } else { params.append('after_index', String(payload.afterIndex ?? -1)); } params.append('row', JSON.stringify(payload.row)); return await promiseHelper(axios.post(ajaxUrl, params)); }, async deleteRow(payload: { tableId: string | number; vtId: string | number }) { const params = new URLSearchParams(); params.append('action', 'vtables_delete_row'); params.append('security', getSecurity()); params.append('table_id', String(payload.tableId)); params.append('vt_id', String(payload.vtId)); return await promiseHelper(axios.post(ajaxUrl, params)); }, exportRowsUrl( tableId: string | number, format: 'csv' | 'json' | 'xlsx' = 'csv' ) { const params = new URLSearchParams(); params.append('action', 'vtables_export_rows'); params.append('security', getSecurity()); params.append('table_id', String(tableId)); params.append('format', format); return `${ajaxUrl}?${params.toString()}`; }, async cancelImport(tableId: string | number) { const params = new URLSearchParams(); params.append('action', 'vtables_cancel_import'); params.append('security', getSecurity()); params.append('table_id', String(tableId)); return await promiseHelper(axios.post(ajaxUrl, params)); }, };