30b893d8创建于 2024年12月10日历史提交
<template>
  <el-dialog
    class="common-dialog-wrapper"
    v-model="visible"
    :title="title"
    width="500px"
    :close-on-click-modal="false"
    :close-on-press-escape="false"
    @closed="resetForm"
  >
    <div>
      {{ $t('table.export.chooseFormat') }}
      <el-radio-group v-model="fileType">
        <el-radio v-for="item in fileTypeList" :key="item" :value="item">{{ item }}</el-radio>
      </el-radio-group>
    </div>
    <template #footer>
      <el-button @click="cancel">{{ $t('button.cancel') }}</el-button>
      <el-button type="primary" @click="confirm">{{ $t('button.confirm') }}</el-button>
    </template>
  </el-dialog>
</template>

<script lang="ts" setup>
  import { loadingInstance, downLoadMyBlobType } from '@/utils';
  import { useI18n } from 'vue-i18n';

  const { t } = useI18n();
  const props = withDefaults(
    defineProps<{
      modelValue: boolean;
      title?: string;
      type: 'current' | 'all';
      platform?: Platform;
      params: Record<string, any>;
      api: (...arg) => Promise<any>;
    }>(),
    {
      modelValue: false,
      platform: 'openGauss',
      params: () => ({}),
    },
  );
  const myEmit = defineEmits<{
    (e: 'update:modelValue', value: boolean): void;
    (e: 'confirm'): void;
  }>();
  const visible = computed({
    get: () => props.modelValue,
    set: (val) => myEmit('update:modelValue', val),
  });
  const title = computed(() => props.title || t('table.export.dialogTitle'))

  const loading = ref(null);
  const fileTypeList = ref(
    props.platform == 'openGauss' ? ['Excel(xlsx)', 'Excel(xls)'] : ['Text', 'CSV'],
  );
  const fileType = ref(fileTypeList.value[0]);

  const resetForm = () => {
    fileType.value = fileTypeList.value[0];
  };
  const confirm = async () => {
    visible.value = false;
    const params = {
      ...props.params,
      fileType: fileType.value,
    };
    try {
      loading.value = loadingInstance();
      const res = await props.api(params);
      downLoadMyBlobType(res.name, res.data);
    } finally {
      loading.value.close();
    }
  };
  const cancel = () => {
    visible.value = false;
    resetForm();
  };
</script>