mirror of https://github.com/nocodb/nocodb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.9 KiB
110 lines
2.9 KiB
<script setup lang="ts"> |
|
import { type ViewType, ViewTypes } from 'nocodb-sdk' |
|
|
|
const { extension, tables, getViewsForTable, getData } = useExtensionHelperOrThrow() |
|
|
|
const views = ref<ViewType[]>([]) |
|
|
|
const exportPayload = ref<{ |
|
tableId?: string |
|
viewId?: string |
|
}>({}) |
|
|
|
const tableList = computed(() => { |
|
return tables.value.map((table) => { |
|
return { |
|
label: table.title, |
|
value: table.id, |
|
} |
|
}) |
|
}) |
|
|
|
const viewList = computed(() => { |
|
if (!exportPayload.value.tableId) return [] |
|
return ( |
|
views.value |
|
.filter((view) => view.type === ViewTypes.GRID) |
|
.map((view) => { |
|
return { |
|
label: view.is_default ? `Default` : view.title, |
|
value: view.id, |
|
} |
|
}) || [] |
|
) |
|
}) |
|
|
|
const reloadViews = async () => { |
|
if (exportPayload.value.tableId) { |
|
views.value = await getViewsForTable(exportPayload.value.tableId) |
|
} |
|
} |
|
|
|
const onTableSelect = async (tableId: string) => { |
|
exportPayload.value.tableId = tableId |
|
await reloadViews() |
|
exportPayload.value.viewId = views.value.find((view) => view.is_default)?.id |
|
await extension.value.kvStore.set('exportPayload', exportPayload.value) |
|
} |
|
|
|
const onViewSelect = async (viewId: string) => { |
|
exportPayload.value.viewId = viewId |
|
await extension.value.kvStore.set('exportPayload', exportPayload.value) |
|
} |
|
|
|
const exportJson = async () => { |
|
if (!exportPayload.value.tableId || !exportPayload.value.viewId) return |
|
|
|
const allData: Record<string, any>[] = [] |
|
|
|
getData({ |
|
tableId: exportPayload.value.tableId, |
|
viewId: exportPayload.value.viewId, |
|
eachPage: (records, nextPage) => { |
|
allData.push(...records) |
|
nextPage() |
|
}, |
|
done: () => { |
|
const json = JSON.stringify(allData, null, 2) |
|
const blob = new Blob([json], { type: 'application/json' }) |
|
const url = URL.createObjectURL(blob) |
|
const a = document.createElement('a') |
|
const table = tables.value.find((table) => table.id === exportPayload.value.tableId) |
|
const view = views.value.find((view) => view.id === exportPayload.value.viewId) |
|
|
|
if (table && view) { |
|
a.download = `${table.title} - ${view.is_default ? 'Default' : view.title}.json` |
|
} else { |
|
a.download = 'data.json' |
|
} |
|
|
|
a.href = url |
|
|
|
a.click() |
|
URL.revokeObjectURL(url) |
|
}, |
|
}) |
|
} |
|
|
|
onMounted(() => { |
|
exportPayload.value = extension.value.kvStore.get('exportPayload') || {} |
|
reloadViews() |
|
}) |
|
</script> |
|
|
|
<template> |
|
<ExtensionsExtensionWrapper> |
|
<div class="flex flex-col gap-2 p-3"> |
|
<NcSelect v-model:value="exportPayload.tableId" :options="tableList" placeholder="-select table-" @change="onTableSelect" /> |
|
<NcSelect v-model:value="exportPayload.viewId" :options="viewList" placeholder="-select view-" @change="onViewSelect" /> |
|
<NcButton @click="exportJson">Export</NcButton> |
|
</div> |
|
</ExtensionsExtensionWrapper> |
|
</template> |
|
|
|
<style lang="scss"> |
|
.nc-nc-json-exporter .extension-content { |
|
&:not(.fullscreen){ |
|
@apply p-3; |
|
} |
|
} |
|
</style>
|
|
|