FlowDesign.vue 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <script setup name="FlowDesign">
  2. import { onMounted, ref, watch } from 'vue'
  3. import JsonEditorVue from 'json-editor-vue3'
  4. import ScWorkflow from '@/components/scWorkflow'
  5. import useFlowStore from '@/store/modules/flow'
  6. import useClipboard from 'vue-clipboard3'
  7. import { storeToRefs } from 'pinia'
  8. const flowStore = useFlowStore()
  9. const { modelContent } = storeToRefs(flowStore)
  10. const { toClipboard } = useClipboard()
  11. const formRef = ref()
  12. const drawer = ref(false)
  13. const jsonFormat = ref({})
  14. let form = ref({
  15. processConfig: {
  16. nodeName: '发起人',
  17. type: 0,
  18. nodeAssigneeList: []
  19. }
  20. })
  21. // 接口保存审批流程
  22. const saveDesign = json => {
  23. modelContent.value = JSON.stringify(form.value.processConfig)
  24. }
  25. const updateCompInfo = () => {
  26. if (modelContent.value) {
  27. const _val = JSON.parse(modelContent.value)
  28. form.value = Object.assign({ processConfig: _val }, {})
  29. }
  30. }
  31. const copyParseJson = async () => {
  32. await toClipboard(JSON.stringify(jsonFormat.value, null, ' '))
  33. }
  34. const copyJson = async () => {
  35. await toClipboard(JSON.stringify(jsonFormat.value))
  36. }
  37. watch(
  38. () => form.value.processConfig,
  39. value => {
  40. jsonFormat.value = form.value.processConfig
  41. },
  42. {
  43. // 初始化立即执行
  44. immediate: true
  45. }
  46. )
  47. const validate = () => {
  48. // 保存表单设计
  49. saveDesign()
  50. // 根据后续的业务需求 调整 validate 的功能
  51. return new Promise((resolve, reject) => {
  52. resolve()
  53. })
  54. }
  55. onMounted(() => {
  56. updateCompInfo()
  57. })
  58. defineExpose({
  59. formRef,
  60. saveDesign,
  61. validate,
  62. updateCompInfo
  63. })
  64. </script>
  65. <template>
  66. <div>
  67. <div style="z-index: 999" class="fixed top-44 right-48">
  68. <el-button type="primary" @click="() => (drawer = true)"> 查看 JSON </el-button>
  69. </div>
  70. <ScWorkflow v-model="form.processConfig"></ScWorkflow>
  71. <el-drawer v-model="drawer" size="500px" class="drawer" :append-to-body="true" :modal="false" :with-header="false">
  72. <div style="height: 100vh">
  73. <div style="padding: 1px; background-color: #3883fa">
  74. <el-button type="primary" plain @click="copyParseJson"> 复制 JSON </el-button>
  75. <el-button type="primary" plain @click="drawer = false"> 关闭弹窗 </el-button>
  76. </div>
  77. <json-editor-vue v-model="form.processConfig" class="editor" language="zh-CN" current-mode="view" />
  78. </div>
  79. </el-drawer>
  80. </div>
  81. </template>
  82. <style lang="scss"></style>