Add File
This commit is contained in:
163
frontend/src/views/ds/index.vue
Normal file
163
frontend/src/views/ds/index.vue
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
<template>
|
||||||
|
<div v-loading="loading">
|
||||||
|
<div class="header">
|
||||||
|
<div class="mt-4">
|
||||||
|
<el-input
|
||||||
|
v-model="searchValue"
|
||||||
|
style="max-width: 300px"
|
||||||
|
:placeholder="t('ds.Search Datasource')"
|
||||||
|
class="input-with-select"
|
||||||
|
clearable
|
||||||
|
@change="searchHandle"
|
||||||
|
>
|
||||||
|
<template #prepend>
|
||||||
|
<el-icon>
|
||||||
|
<Search />
|
||||||
|
</el-icon>
|
||||||
|
</template>
|
||||||
|
</el-input>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-button
|
||||||
|
class="border-radius_8"
|
||||||
|
type="primary"
|
||||||
|
:icon="IconOpeAdd"
|
||||||
|
@click="editDs(undefined)"
|
||||||
|
>{{ t('ds.add') }}</el-button
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="connections-container">
|
||||||
|
<template v-for="ds in dsList" :key="ds">
|
||||||
|
<DatasourceItemCard :ds="ds">
|
||||||
|
<div class="connection-actions">
|
||||||
|
<el-button class="action-btn" circle :icon="List" @click="getTables(ds.id, ds.name)" />
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
class="action-btn"
|
||||||
|
circle
|
||||||
|
:icon="IconOpeEdit"
|
||||||
|
@click="editDs(ds)"
|
||||||
|
/>
|
||||||
|
<el-button
|
||||||
|
type="danger"
|
||||||
|
class="action-btn"
|
||||||
|
circle
|
||||||
|
:icon="IconOpeDelete"
|
||||||
|
@click="deleteDs(ds)"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</DatasourceItemCard>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<DsForm ref="dsForm" @refresh="refresh" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, onMounted } from 'vue'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
import IconOpeAdd from '@/assets/svg/operate/ope-add.svg'
|
||||||
|
import IconOpeEdit from '@/assets/svg/operate/ope-edit.svg'
|
||||||
|
import IconOpeDelete from '@/assets/svg/operate/ope-delete.svg'
|
||||||
|
import { Search, List } from '@element-plus/icons-vue'
|
||||||
|
import DsForm from './form.vue'
|
||||||
|
import { datasourceApi } from '@/api/datasource'
|
||||||
|
import { ElMessageBox } from 'element-plus-secondary'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
|
import DatasourceItemCard from '@/views/ds/DatasourceItemCard.vue'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
const searchValue = ref<string>('')
|
||||||
|
const dsForm = ref()
|
||||||
|
const dsList = ref<any>([]) // show ds list
|
||||||
|
const allDsList = ref<any>([]) // all ds list
|
||||||
|
const router = useRouter()
|
||||||
|
const loading = ref(false)
|
||||||
|
|
||||||
|
function searchHandle() {
|
||||||
|
if (searchValue.value) {
|
||||||
|
dsList.value = JSON.parse(JSON.stringify(allDsList.value)).filter((item: any) => {
|
||||||
|
return item.name.toLowerCase().includes(searchValue.value.toLowerCase())
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
dsList.value = JSON.parse(JSON.stringify(allDsList.value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const refresh = () => {
|
||||||
|
list()
|
||||||
|
}
|
||||||
|
|
||||||
|
const list = () => {
|
||||||
|
loading.value = true
|
||||||
|
datasourceApi.list().then((res) => {
|
||||||
|
allDsList.value = res
|
||||||
|
dsList.value = JSON.parse(JSON.stringify(allDsList.value))
|
||||||
|
loading.value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const editDs = (item: any) => {
|
||||||
|
dsForm.value.open(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
const deleteDs = (item: any) => {
|
||||||
|
ElMessageBox.confirm(t('ds.delete'), t('common.confirm'), {
|
||||||
|
confirmButtonText: t('common.confirm'),
|
||||||
|
cancelButtonText: t('common.cancel'),
|
||||||
|
type: 'warning',
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
datasourceApi.delete(item.id).then(() => {
|
||||||
|
refresh()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.catch(() => {})
|
||||||
|
}
|
||||||
|
|
||||||
|
const getTables = (id: number, name: string) => {
|
||||||
|
router.push(`/dsTable/${id}/${name}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
list()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.header {
|
||||||
|
background-color: white;
|
||||||
|
padding: 16px 20px;
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||||
|
margin-bottom: 20px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
.input-with-select {
|
||||||
|
--ed-input-border-radius: 8px;
|
||||||
|
--ed-border-radius-base: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.connections-container {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));
|
||||||
|
gap: 24px;
|
||||||
|
|
||||||
|
.connection-actions {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 20px;
|
||||||
|
right: 20px;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
.action-btn {
|
||||||
|
display: none;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:hover .action-btn {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
Reference in New Issue
Block a user