ConvertScriptModal.vue 3.77 KB
<script setup lang="ts">
  import { useForm, BasicForm } from '/@/components/Form';
  import { BasicModal, useModalInner } from '/@/components/Modal';
  import { FormFieldsValueType, formSchemas } from './config';
  import { createOrEditScriptManage } from '/@/api/scriptmanage/scriptManager';
  import {
    TransportScriptParamsType,
    TransportScriptRecordType,
  } from '/@/api/scriptmanage/model/scriptModel';
  import { ScriptLanguageEnum } from '/@/enums/scriptEnum';
  import { computed, ref, unref } from 'vue';
  import { DataActionModeEnum } from '/@/enums/toolEnum';

  const emits = defineEmits(['register', 'complete']);

  const currentData = ref<ModalParamsType<TransportScriptRecordType>>();

  const [register, { setModalProps, closeModal }] = useModalInner(
    (data: ModalParamsType<TransportScriptRecordType>) => {
      const { mode, record } = data;
      resetFields();
      clearValidate();
      if ([DataActionModeEnum.UPDATE, DataActionModeEnum.READ].includes(mode)) {
        const { name, description, convertTbel, convertJs, scriptLanguage, serviceType } =
          record || {};
        activeLanguage.value = scriptLanguage;
        setFieldsValue({
          name,
          description,
          serviceType,
          language: scriptLanguage,
          scriptContent: {
            scriptLanguage: 'JS',
            value: convertJs,
          },
          tbelContent: {
            scriptLanguage: 'TBEL',
            value: convertTbel,
          },
        } as FormFieldsValueType);
      }
      currentData.value = data;
    }
  );

  const [registerForm, { getFieldsValue, validate, setFieldsValue, resetFields, clearValidate }] =
    useForm({
      schemas: formSchemas,
      showActionButtonGroup: false,
    });

  const getModalTitle = computed(
    () => `${unref(currentData)?.mode === DataActionModeEnum.CREATE ? '创建' : '编辑'}脚本`
  );

  const handleOk = async () => {
    try {
      setModalProps({ loading: true, confirmLoading: true });
      await validate();
      const {
        name,
        description,
        scriptContent: { value },
        language,
        scriptType,
        tbelContent: { value: taelValue },
        serviceType,
      } = getFieldsValue() as FormFieldsValueType;

      const params: TransportScriptParamsType = {
        name,
        description,
        status: 1,
        scriptType,
        scriptLanguage: language,
        serviceType,
      };
      params.convertJs = value;
      params.convertTbel = taelValue;

      if (unref(currentData)?.mode === DataActionModeEnum.UPDATE) {
        params.id = unref(currentData)!.record.id;
      }

      await createOrEditScriptManage(params);
      emits('complete');
      closeModal();
    } finally {
      setModalProps({ loading: false, confirmLoading: false });
    }
  };
  const activeLanguage = ref<string>(ScriptLanguageEnum.JavaScript);
  const languageChange = (type, model) => {
    activeLanguage.value = type;
    model.language = type;
  };
</script>

<template>
  <BasicModal
    @register="register"
    :title="getModalTitle"
    :width="700"
    @ok="handleOk"
    :showOkBtn="currentData?.mode !== DataActionModeEnum.READ"
  >
    <BasicForm @register="registerForm">
      <template #language="{ model }">
        <div class="bg-gray-200 text-gray-400 font-medium rounded-3xl flex w-80 mb-2 mx-auto">
          <div
            v-for="item in Object.keys(ScriptLanguageEnum)"
            :key="item"
            class="cursor-pointer text-center w-40 rounded-3xl h-8 leading-8"
            :class="activeLanguage === ScriptLanguageEnum[item] && 'bg-blue-500 text-light-50'"
            @click="languageChange(ScriptLanguageEnum[item], model)"
          >
            {{ item }}
          </div>
        </div>
      </template>
    </BasicForm>
  </BasicModal>
</template>