Skip to content
Snippets Groups Projects
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,
  };
}