CompanyDrawer.vue 4.94 KB
<template>
    <BasicDrawer
      v-bind="$attrs"
      @register="registerDrawer"
      :title="'公司管理'"
      width="500px"
      :showFooter="false"
    >
      <!-- 新增公司区域 -->
      <div class="mb-4 flex">
        <a-input v-model:value="companyName" placeholder="请输入公司名称" class="flex-1 mr-2" />
        <a-button type="primary" @click="handleCreate">新增公司</a-button>
      </div>
      
      <!-- 编辑公司区域 -->
      <div v-if="editingRecord" class="mb-4 p-4 border border-blue-300 rounded bg-blue-50">
        <div class="flex items-center justify-between mb-2">
          <h4 class="text-blue-600 font-medium">编辑公司</h4>
          <a-button size="small" @click="cancelEdit">取消</a-button>
        </div>
        <div class="flex">
          <a-input v-model:value="editForm.name" placeholder="请输入公司名称" class="flex-1 mr-2" />
          <a-button type="primary" @click="handleEditSubmit">保存</a-button>
        </div>
      </div>
      
      <BasicTable @register="registerTable">
        <template #bodyCell="{ column, record }">
          <template v-if="column.key === 'action'">
            <TableAction
              :actions="[
                {
                  icon: 'clarity:note-edit-line',
                  tooltip: '编辑公司',
                  onClick: handleEdit.bind(null, record),
                },
                {
                  icon: 'ant-design:delete-outlined',
                  color: 'error',
                  tooltip: '删除公司',
                  popConfirm: {
                    title: '是否确认删除',
                    placement: 'left',
                    confirm: handleDelete.bind(null, record),
                  },
                },
              ]"
            />
          </template>
        </template>
      </BasicTable>
    </BasicDrawer>
  </template>
  <script lang="ts">
    import { defineComponent, ref } from 'vue';
    import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
    import { BasicTable, useTable, TableAction } from '/@/components/Table';
    import { getCompanyList, addCompany, editCompany, deleteCompany } from '/@/api/project/account';
    import { useMessage } from '/@/hooks/web/useMessage';
  
    const columns = [
      {
        title: '公司名称',
        dataIndex: 'name',
        width: 200,
      },
    ];
  
    export default defineComponent({
      name: 'CompanyDrawer',
      components: { BasicDrawer, BasicTable, TableAction },
      setup() {
        const { createMessage } = useMessage();
        const companyName = ref('');
        const editingRecord = ref(null);
        const editForm = ref({
          id: '',
          name: '',
        });
  
        const [registerTable, { reload }] = useTable({
          api: getCompanyList,
          columns,
          pagination: false,
          striped: false,
          useSearchForm: false,
          showTableSetting: false,
          bordered: true,
          showIndexColumn: false,
          canResize: false,
          actionColumn: {
            width: 120,
            title: '操作',
            dataIndex: 'action',
          },
          rowKey: 'id',
        });
  
        const [registerDrawer] = useDrawerInner(async () => {
          reload();
          // 重置编辑状态
          editingRecord.value = null;
          editForm.value = { id: '', name: '' };
        });
  
        function handleEdit(record: Recordable) {
          editingRecord.value = record;
          editForm.value = {
            id: record.id,
            name: record.name,
          };
        }
  
        function cancelEdit() {
          editingRecord.value = null;
          editForm.value = { id: '', name: '' };
        }
  
        async function handleEditSubmit() {
          if (!editForm.value.name) {
            createMessage.warning('公司名称不能为空');
            return;
          }
          
          await editCompany({
            id: editForm.value.id,
            name: editForm.value.name,
          });
          
          createMessage.success('编辑成功');
          cancelEdit();
          reload();
        }
  
        async function handleDelete(record: Recordable) {
          await deleteCompany({ id: record.id });
          createMessage.success('删除成功');
          reload();
        }
  
        async function handleCreate() {
          if (!companyName.value) {
            createMessage.warning('公司名称不能为空');
            return;
          }
          
          await addCompany({ name: companyName.value });
          createMessage.success('添加成功');
          companyName.value = '';
          reload();
        }
  
        return {
          registerDrawer,
          registerTable,
          companyName,
          editingRecord,
          editForm,
          handleCreate,
          handleEdit,
          handleDelete,
          handleEditSubmit,
          cancelEdit,
        };
      },
    });
  </script>