import { ref } from 'vue'; import Papa from 'papaparse'; import { saveAs } from "file-saver"; import { column } from '@observablehq/plot'; export function useCsvDownload(baseName: MaybeRef<string> = "df" ) { const pending = ref(false) // const { search: msSearch, result: msResult } = useMeiliSearch(toValue(index)) const filename = ref(`${toValue(baseName)}-data.csv`) const downloadCsv = async ( index: MaybeRef<string>, query: MaybeRef<string>, params: MaybeRef<Record<string, any>>, columns: MaybeRef<string[] | undefined> = undefined ) => { const toValueParams = toValue(params) const filterName = toValueParams?.filter ? toValueParams.filter.replaceAll('\"', "") : '' filename.value = `${toValue(baseName)}-${filterName}.csv` pending.value = true try { const { data, error } = await useAsyncMeiliSearch({ index: toValue(index), params: toValueParams, query: toValue(query) }) if (toValue(data)?.hits?.length > 0) { const sanitizedData = toValue(data).hits.map(row => { let sanitizedRow = { ...row } if (sanitizedRow?.PFAM?.length > 0) { sanitizedRow = { ...sanitizedRow, PFAM: sanitizedRow.PFAM.map(({ AC }) => AC).join(", ") } } if (sanitizedRow?.contributors?.length > 0) { sanitizedRow = { ...sanitizedRow, contributors: sanitizedRow.contributors.join(", ") } } return sanitizedRow }) const csvContent = Papa.unparse(sanitizedData, { columns: toValue(columns) }); const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); saveAs(blob, `${toValue(filename)}`); } } finally { pending.value = false } } return { pending, downloadCsv, }; }