From a7d04683b211f2bee67ee04fe3cf53b7121eb8ad Mon Sep 17 00:00:00 2001
From: xingyu <xingyu4j@vip.qq.com>
Date: Thu, 23 Mar 2023 20:37:43 +0800
Subject: [PATCH] feat: codegen

---
 src/locales/lang/en/action.ts                 |  1 +
 src/locales/lang/zh-CN/action.ts              |  1 +
 src/views/infra/codegen/ImportTableModal.vue  | 40 +++++++++++++++++++
 .../{CodegenModal.vue => PreviewModal.vue}    |  2 +-
 src/views/infra/codegen/codegen.data.ts       | 40 +++++++++++++++++++
 src/views/infra/codegen/index.vue             | 17 ++++----
 6 files changed, 92 insertions(+), 9 deletions(-)
 create mode 100644 src/views/infra/codegen/ImportTableModal.vue
 rename src/views/infra/codegen/{CodegenModal.vue => PreviewModal.vue} (97%)

diff --git a/src/locales/lang/en/action.ts b/src/locales/lang/en/action.ts
index bc46621..fdff0fc 100644
--- a/src/locales/lang/en/action.ts
+++ b/src/locales/lang/en/action.ts
@@ -2,6 +2,7 @@ export default {
   more: 'more',
   create: 'Create',
   edit: 'Edit',
+  view: 'View',
   test: 'Test',
   delete: 'Delete',
   detail: 'Detail',
diff --git a/src/locales/lang/zh-CN/action.ts b/src/locales/lang/zh-CN/action.ts
index 3ed824d..debae9e 100644
--- a/src/locales/lang/zh-CN/action.ts
+++ b/src/locales/lang/zh-CN/action.ts
@@ -2,6 +2,7 @@ export default {
   more: '更多',
   create: '新增',
   edit: '修改',
+  view: '查看',
   test: '测试',
   delete: '删除',
   detail: '详情',
diff --git a/src/views/infra/codegen/ImportTableModal.vue b/src/views/infra/codegen/ImportTableModal.vue
new file mode 100644
index 0000000..01a94b6
--- /dev/null
+++ b/src/views/infra/codegen/ImportTableModal.vue
@@ -0,0 +1,40 @@
+<template>
+  <BasicModal v-bind="$attrs" :width="800" @register="registerModal" title="导入" @ok="handleSubmit">
+    <BasicTable @register="registerTable" />
+  </BasicModal>
+</template>
+<script lang="ts" setup name="ImportTableModal">
+import { BasicModal, useModalInner } from '@/components/Modal'
+import { BasicTable, useTable } from '@/components/Table'
+import { importTableColumns, importTableSearchFormSchema } from './codegen.data'
+import { createCodegenList, getSchemaTableList } from '@/api/infra/codegen'
+
+const emit = defineEmits(['success', 'register'])
+
+const [registerTable, { getSelectRowKeys }] = useTable({
+  api: getSchemaTableList,
+  columns: importTableColumns,
+  formConfig: {
+    labelWidth: 80,
+    schemas: importTableSearchFormSchema
+  },
+  rowSelection: { type: 'checkbox' },
+  rowKey: 'name',
+  useSearchForm: true,
+  pagination: false,
+  showTableSetting: false,
+  showIndexColumn: false
+})
+
+const [registerModal, { setModalProps, closeModal }] = useModalInner(async () => {
+  setModalProps({ confirmLoading: false })
+})
+
+async function handleSubmit() {
+  const datas = await getSelectRowKeys()
+  console.info(datas)
+  await createCodegenList({ dataSourceConfigId: 0, tableNames: datas })
+  closeModal()
+  emit('success')
+}
+</script>
diff --git a/src/views/infra/codegen/CodegenModal.vue b/src/views/infra/codegen/PreviewModal.vue
similarity index 97%
rename from src/views/infra/codegen/CodegenModal.vue
rename to src/views/infra/codegen/PreviewModal.vue
index 3be4dd8..5aca16d 100644
--- a/src/views/infra/codegen/CodegenModal.vue
+++ b/src/views/infra/codegen/PreviewModal.vue
@@ -3,7 +3,7 @@
     <BasicForm @register="registerForm" />
   </BasicModal>
 </template>
-<script lang="ts" setup name="CodegenModal">
+<script lang="ts" setup name="ImportTable">
 import { ref, computed, unref } from 'vue'
 import { BasicModal, useModalInner } from '@/components/Modal'
 import { BasicForm, useForm } from '@/components/Form'
diff --git a/src/views/infra/codegen/codegen.data.ts b/src/views/infra/codegen/codegen.data.ts
index 3dab369..7a126ba 100644
--- a/src/views/infra/codegen/codegen.data.ts
+++ b/src/views/infra/codegen/codegen.data.ts
@@ -112,3 +112,43 @@ export const formSchema: FormSchema[] = [
     component: 'InputTextArea'
   }
 ]
+
+export const importTableColumns: BasicColumn[] = [
+  {
+    title: '表名称',
+    dataIndex: 'name',
+    width: 200
+  },
+  {
+    title: '表描述',
+    dataIndex: 'comment',
+    width: 120
+  }
+]
+
+export const importTableSearchFormSchema: FormSchema[] = [
+  {
+    label: '数据源',
+    field: 'dataSourceConfigId',
+    component: 'ApiSelect',
+    defaultValue: 0,
+    componentProps: {
+      api: () => getDataSourceConfigList(),
+      labelField: 'name',
+      valueField: 'id'
+    },
+    colProps: { span: 8 }
+  },
+  {
+    label: '表名称',
+    field: 'name',
+    component: 'Input',
+    colProps: { span: 8 }
+  },
+  {
+    label: '表描述',
+    field: 'comment',
+    component: 'Input',
+    colProps: { span: 8 }
+  }
+]
diff --git a/src/views/infra/codegen/index.vue b/src/views/infra/codegen/index.vue
index 429cbf4..52d69e7 100644
--- a/src/views/infra/codegen/index.vue
+++ b/src/views/infra/codegen/index.vue
@@ -2,13 +2,16 @@
   <div>
     <BasicTable @register="registerTable">
       <template #toolbar>
-        <a-button type="primary" :preIcon="IconEnum.IMPORT" @click="handleCreate"> {{ t('action.import') }} </a-button>
+        <a-button type="primary" :preIcon="IconEnum.IMPORT" @click="openImportTable"> {{ t('action.import') }} </a-button>
       </template>
       <template #bodyCell="{ column, record }">
         <template v-if="column.key === 'action'">
           <TableAction
             :actions="[
+              { icon: IconEnum.EDIT, label: t('action.view'), onClick: handleEdit.bind(null, record) },
               { icon: IconEnum.EDIT, label: t('action.edit'), onClick: handleEdit.bind(null, record) },
+              { icon: IconEnum.EDIT, label: '同步', onClick: handleEdit.bind(null, record) },
+              { icon: IconEnum.EDIT, label: '生成代码', onClick: handleEdit.bind(null, record) },
               {
                 icon: IconEnum.DELETE,
                 color: 'error',
@@ -24,14 +27,14 @@
         </template>
       </template>
     </BasicTable>
-    <CodegenModal @register="registerModal" @success="reload()" />
+    <ImportTableModal @register="registerModal" @success="reload()" />
   </div>
 </template>
 <script lang="ts" setup name="Codegen">
 import { useI18n } from '@/hooks/web/useI18n'
 import { useMessage } from '@/hooks/web/useMessage'
 import { useModal } from '@/components/Modal'
-import CodegenModal from './CodegenModal.vue'
+import ImportTableModal from './ImportTableModal.vue'
 import { IconEnum } from '@/enums/appEnum'
 import { BasicTable, useTable, TableAction } from '@/components/Table'
 import { deleteCodegenTable, getCodegenTablePage } from '@/api/infra/codegen'
@@ -53,17 +56,15 @@ const [registerTable, { reload }] = useTable({
   showTableSetting: true,
   showIndexColumn: false,
   actionColumn: {
-    width: 140,
+    width: 360,
     title: t('common.action'),
     dataIndex: 'action',
     fixed: 'right'
   }
 })
 
-function handleCreate() {
-  openModal(true, {
-    isUpdate: false
-  })
+function openImportTable() {
+  openModal(true)
 }
 
 function handleEdit(record: Recordable) {