action.vue 3.76 KB
<template>
  <CollapseContainer style="background-color: #eeeeee" :title="`执行动作 ${actionIndex + 1}`">
    <template #action>
      <Tooltip title="移除" v-if="actionData.length > 1">
        <Icon
          icon="fluent:delete-off-20-regular"
          size="20"
          class="mr-2 cursor-pointer"
          @click="handleDelete(actionIndex)"
        />
      </Tooltip>
    </template>
    <BasicForm @register="registerAction">
      <template #doContext>
        <div class="flex">
          <div ref="jsoneditorRef" style="height: 100%; width: 100%"></div>
          <Tooltip
            title='{"method":"setDOValue","params":{"devID":"492S211218028819","data":{"DO1":1}}}'
            class="ml-2"
          >
            <QuestionCircleOutlined style="font-size: 1rem"
          /></Tooltip>
        </div>
      </template>
    </BasicForm>
  </CollapseContainer>
</template>
<script lang="ts">
  import { defineComponent, ref, onMounted, nextTick, unref } from 'vue';
  import { CollapseContainer } from '/@/components/Container/index';
  import { BasicForm, useForm } from '/@/components/Form/index';
  import { Tooltip } from 'ant-design-vue';
  import { Icon } from '/@/components/Icon';
  import { useActionDrawerSchema } from '../config';
  import jsoneditor from 'jsoneditor';
  import 'jsoneditor/dist/jsoneditor.min.css';
  import { Tooltip } from 'ant-design-vue';
  import { QuestionCircleOutlined } from '@ant-design/icons-vue';

  export default defineComponent({
    components: { CollapseContainer, BasicForm, Tooltip, Icon, Tooltip, QuestionCircleOutlined },
    props: {
      actionIndex: {
        type: Number,
        required: true,
      },
      actionData: {
        type: Array,
        default: () => [],
      },
    },
    emits: ['deleteAction'],
    setup(props, { emit }) {
      const [
        registerAction,
        { getFieldsValue, resetFields, updateSchema, setFieldsValue, validate },
      ] = useForm({
        schemas: useActionDrawerSchema,
        showActionButtonGroup: false,
      });
      const getFieldsValueFunc = () => ({
        ...getFieldsValue(),
        doContext: unref(jsonInstance.value).get(),
      });
      const setFieldsFormValueFun = (fieldsValue) => {
        setFieldsValue(fieldsValue);
      };
      const resetFieldsValueFunc = () => resetFields();
      const updateFieldDeviceId = (deviceList) => {
        updateSchema({
          field: 'deviceId',
          componentProps: {
            options: deviceList,
          },
        });
      };
      const validateForm = () => {
        return validate();
      };
      const handleDelete = (actionIndex) => {
        emit('deleteAction', actionIndex);
      };

      // json 以及初始化JSON
      const jsoneditorRef = ref();
      const jsonValue = ref({});
      const jsonInstance = ref();
      onMounted(() => {
        nextTick(() => {
          let options = {
            mode: 'code',
            mainMenuBar: false,
            statusBar: false,
            onError(err) {
              alert('EF1 ->' + err.toString());
            },
          };
          let editor = new jsoneditor(jsoneditorRef.value, options);
          editor.set(jsonValue.value);
          jsonInstance.value = editor;
        });
      });

      const getJsonValue = () => unref(jsonInstance).get();
      const setJsonValue = (Json) => {
        nextTick(() => {
          unref(jsonInstance).set(Json);
        });
      };
      return {
        updateFieldDeviceId,
        resetFieldsValueFunc,
        getFieldsValueFunc,
        validateForm,
        registerAction,
        handleDelete,
        setFieldsFormValueFun,
        jsoneditorRef,
        jsonInstance,
        getJsonValue,
        setJsonValue,
      };
    },
  });
</script>

<style>
  .jsoneditor {
    border: none;
  }
</style>