-
Remi PLANEL authoredc927677f
useCsvDownload.ts 1.85 KiB
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,
};
}