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.
267 lines
8.6 KiB
267 lines
8.6 KiB
<script lang="ts" setup> |
|
import type { BaseType } from 'nocodb-sdk' |
|
import { storeToRefs } from 'pinia' |
|
import { toRef } from '@vue/reactivity' |
|
import { resolveComponent } from '@vue/runtime-core' |
|
import { ref } from 'vue' |
|
|
|
const props = withDefaults( |
|
defineProps<{ |
|
base: BaseType |
|
sourceIndex?: number |
|
}>(), |
|
{ |
|
sourceIndex: 0, |
|
}, |
|
) |
|
|
|
const emit = defineEmits<{ |
|
openTableCreateDialog: () => void |
|
}>() |
|
|
|
const { isUIAllowed } = useRoles() |
|
|
|
const base = toRef(props, 'base') |
|
|
|
const { $e } = useNuxtApp() |
|
|
|
const baseStore = useBase() |
|
|
|
const { isSharedBase } = storeToRefs(baseStore) |
|
|
|
const baseRole = inject(ProjectRoleInj) |
|
|
|
function openSchemaMagicDialog(sourceId?: string) { |
|
if (!sourceId) return |
|
|
|
$e('c:table:create:navdraw') |
|
|
|
const isOpen = ref(true) |
|
|
|
const { close } = useDialog(resolveComponent('DlgSchemaMagic'), { |
|
'modelValue': isOpen, |
|
'sourceId': sourceId, |
|
'onUpdate:modelValue': closeDialog, |
|
}) |
|
|
|
function closeDialog() { |
|
isOpen.value = false |
|
|
|
close(1000) |
|
} |
|
} |
|
|
|
function openQuickImportDialog(type: string, sourceId?: string) { |
|
if (!sourceId) return |
|
|
|
$e(`a:actions:import-${type}`) |
|
|
|
const isOpen = ref(true) |
|
|
|
const { close } = useDialog(resolveComponent('DlgQuickImport'), { |
|
'modelValue': isOpen, |
|
'importType': type, |
|
'sourceId': sourceId, |
|
'onUpdate:modelValue': closeDialog, |
|
}) |
|
|
|
function closeDialog() { |
|
isOpen.value = false |
|
|
|
close(1000) |
|
} |
|
} |
|
|
|
function openAirtableImportDialog(baseId?: string, sourceId?: string) { |
|
if (!baseId || !sourceId) return |
|
|
|
$e('a:actions:import-airtable') |
|
|
|
const isOpen = ref(true) |
|
|
|
const { close } = useDialog(resolveComponent('DlgAirtableImport'), { |
|
'modelValue': isOpen, |
|
'baseId': baseId, |
|
'sourceId': sourceId, |
|
'onUpdate:modelValue': closeDialog, |
|
}) |
|
|
|
function closeDialog() { |
|
isOpen.value = false |
|
|
|
close(1000) |
|
} |
|
} |
|
|
|
function openTableCreateMagicDialog(sourceId?: string) { |
|
if (!sourceId) return |
|
|
|
$e('c:table:create:navdraw') |
|
|
|
const isOpen = ref(true) |
|
|
|
const { close } = useDialog(resolveComponent('DlgTableMagic'), { |
|
'modelValue': isOpen, |
|
'sourceId': sourceId, |
|
'onUpdate:modelValue': closeDialog, |
|
}) |
|
|
|
function closeDialog() { |
|
isOpen.value = false |
|
|
|
close(1000) |
|
} |
|
} |
|
|
|
const source = computed(() => { |
|
return base.value?.sources?.[props.sourceIndex] |
|
}) |
|
</script> |
|
|
|
<template> |
|
<div |
|
v-if="isUIAllowed('tableCreate', { roles: baseRole, source })" |
|
class="group flex items-center gap-2 pl-2 pr-4.75 py-1 text-primary/70 hover:(text-primary/100) cursor-pointer select-none" |
|
@click="emit('openTableCreateDialog')" |
|
> |
|
<PhPlusThin class="w-5 ml-2" /> |
|
|
|
<span class="text-gray-500 group-hover:(text-primary/100) flex-1 nc-add-new-table">{{ $t('tooltip.addTable') }}</span> |
|
|
|
<a-dropdown v-if="!isSharedBase" :trigger="['click']" overlay-class-name="nc-dropdown-import-menu" @click.stop> |
|
<GeneralIcon |
|
icon="threeDotVertical" |
|
class="transition-opacity opacity-0 group-hover:opacity-100 nc-import-menu outline-0" |
|
/> |
|
|
|
<template #overlay> |
|
<a-menu class="!py-0 rounded text-sm"> |
|
<a-menu-item-group class="!px-0 !mx-0"> |
|
<template #title> |
|
<div class="flex items-center"> |
|
Noco |
|
<GeneralIcon icon="magic" class="ml-1 text-orange-400" /> |
|
</div> |
|
</template> |
|
<a-menu-item key="table-magic" @click="openTableCreateMagicDialog(base.sources[sourceIndex].id)"> |
|
<div class="color-transition nc-base-menu-item group"> |
|
<GeneralIcon icon="magic1" class="group-hover:text-accent" /> |
|
Create table |
|
</div> |
|
</a-menu-item> |
|
<a-menu-item key="schema-magic" @click="openSchemaMagicDialog(base.sources[sourceIndex].id)"> |
|
<div class="color-transition nc-base-menu-item group"> |
|
<GeneralIcon icon="magic1" class="group-hover:text-accent" /> |
|
Create schema |
|
</div> |
|
</a-menu-item> |
|
</a-menu-item-group> |
|
|
|
<a-menu-divider class="my-0" /> |
|
|
|
<!-- Quick Import From --> |
|
<a-menu-item-group :title="$t('title.quickImportFrom')" class="!px-0 !mx-0"> |
|
<a-menu-item |
|
v-if="isUIAllowed('airtableImport', { roles: baseRole })" |
|
key="quick-import-airtable" |
|
@click="openAirtableImportDialog(base.id, base.sources[sourceIndex].id)" |
|
> |
|
<div class="color-transition nc-base-menu-item group"> |
|
<GeneralIcon icon="airtable" class="group-hover:text-accent" /> |
|
Airtable |
|
</div> |
|
</a-menu-item> |
|
|
|
<a-menu-item |
|
v-if="isUIAllowed('csvImport', { roles: baseRole })" |
|
key="quick-import-csv" |
|
@click="openQuickImportDialog('csv', base.sources[sourceIndex].id)" |
|
> |
|
<div class="color-transition nc-base-menu-item group"> |
|
<GeneralIcon icon="csv" class="group-hover:text-accent" /> |
|
CSV file |
|
</div> |
|
</a-menu-item> |
|
|
|
<a-menu-item |
|
v-if="isUIAllowed('jsonImport', { roles: baseRole })" |
|
key="quick-import-json" |
|
@click="openQuickImportDialog('json', base.sources[sourceIndex].id)" |
|
> |
|
<div class="color-transition nc-base-menu-item group"> |
|
<GeneralIcon icon="json" class="group-hover:text-accent" /> |
|
JSON file |
|
</div> |
|
</a-menu-item> |
|
|
|
<a-menu-item |
|
v-if="isUIAllowed('excelImport', { roles: baseRole, source: base.sources[sourceIndex] })" |
|
key="quick-import-excel" |
|
@click="openQuickImportDialog('excel', base.sources[sourceIndex].id)" |
|
> |
|
<div class="color-transition nc-base-menu-item group"> |
|
<GeneralIcon icon="excel" class="group-hover:text-accent" /> |
|
Microsoft Excel |
|
</div> |
|
</a-menu-item> |
|
</a-menu-item-group> |
|
|
|
<a-menu-divider class="my-0" /> |
|
|
|
<!-- <a-menu-item-group title="Connect to new datasource" class="!px-0 !mx-0"> |
|
<a-menu-item key="connect-new-source" @click="toggleDialog(true, 'dataSources', ClientType.MYSQL, base.id)"> |
|
<div class="color-transition nc-base-menu-item group"> |
|
<LogosMysqlIcon class="group-hover:text-accent" /> |
|
MySQL |
|
</div> |
|
</a-menu-item> |
|
<a-menu-item key="connect-new-source" @click="toggleDialog(true, 'dataSources', ClientType.PG, base.id)"> |
|
<div class="color-transition nc-base-menu-item group"> |
|
<LogosPostgresql class="group-hover:text-accent" /> |
|
Postgres |
|
</div> |
|
</a-menu-item> |
|
<a-menu-item key="connect-new-source" @click="toggleDialog(true, 'dataSources', ClientType.SQLITE, base.id)"> |
|
<div class="color-transition nc-base-menu-item group"> |
|
<VscodeIconsFileTypeSqlite class="group-hover:text-accent" /> |
|
SQLite |
|
</div> |
|
</a-menu-item> |
|
<a-menu-item key="connect-new-source" @click="toggleDialog(true, 'dataSources', ClientType.MSSQL, base.id)"> |
|
<div class="color-transition nc-base-menu-item group"> |
|
<SimpleIconsMicrosoftsqlserver class="group-hover:text-accent" /> |
|
MSSQL |
|
</div> |
|
</a-menu-item> |
|
<a-menu-item |
|
v-if="appInfo.ee" |
|
key="connect-new-source" |
|
@click="toggleDialog(true, 'dataSources', ClientType.SNOWFLAKE, base.id)" |
|
> |
|
<div class="color-transition nc-base-menu-item group"> |
|
<LogosSnowflakeIcon class="group-hover:text-accent" /> |
|
Snowflake |
|
</div> |
|
</a-menu-item> |
|
</a-menu-item-group> |
|
|
|
<a-menu-divider class="my-0" /> --> |
|
|
|
<a-menu-item v-if="isUIAllowed('importRequest', { roles: baseRole })" key="add-new-table" class="py-1 rounded-b"> |
|
<a |
|
v-e="['e:datasource:import-request']" |
|
href="https://github.com/nocodb/nocodb/issues/2052" |
|
target="_blank" |
|
class="prose-sm hover:(!text-primary !opacity-100) color-transition nc-base-menu-item group after:(!rounded-b)" |
|
rel="noopener noreferrer" |
|
> |
|
<GeneralIcon icon="openInNew" class="group-hover:text-accent" /> |
|
<!-- Request a data source you need? --> |
|
{{ $t('labels.requestDataSource') }} |
|
</a> |
|
</a-menu-item> |
|
</a-menu> |
|
</template> |
|
</a-dropdown> |
|
</div> |
|
</template>
|
|
|