多维表格
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.

111 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>