index.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <script setup lang="ts">
  2. import type { IVFormComponent } from '../../types';
  3. import { unref } from 'vue';
  4. import { useVbenModal } from '@vben/common-ui';
  5. import { cloneDeep } from '@vben/utils';
  6. import InputCode from '#/components/form/components/input-code/input-code-modal-ignore.vue';
  7. import { Icon } from '#/components/icon';
  8. import { useFormDesignState } from '../../hooks/useFormDesignState';
  9. const emit = defineEmits(['save']);
  10. const [InputCodeModal, inputCodeApi] = useVbenModal({
  11. connectedComponent: InputCode,
  12. });
  13. const { formConfig, formDesignMethods } = useFormDesignState();
  14. const handleClear = () => {
  15. formConfig.value.schemas = [];
  16. formDesignMethods.setSelectSchema({ component: '' } as IVFormComponent);
  17. };
  18. const handleSuccess = (scriptCode: any) => {
  19. formConfig.value.config = { ...scriptCode.config };
  20. formConfig.value.schemas = [...(scriptCode.schemas || [])];
  21. formDesignMethods.setSelectSchema({ component: '' } as IVFormComponent);
  22. };
  23. const handleImport = () => {
  24. inputCodeApi
  25. .setData({
  26. baseData: {
  27. scriptCode: {
  28. config: {
  29. wrapperClass: 'grid-cols-1',
  30. showDefaultActions: false,
  31. commonConfig: {
  32. labelWidth: 100,
  33. },
  34. },
  35. schemas: [],
  36. },
  37. name: '导入JSON',
  38. language: 'json',
  39. },
  40. })
  41. .open();
  42. };
  43. const handleExport = () => {
  44. const scriptCode = cloneDeep(unref(formConfig));
  45. delete scriptCode.selectSchema;
  46. inputCodeApi
  47. .setData({
  48. baseData: {
  49. scriptCode,
  50. name: '导出JSON',
  51. language: 'json',
  52. },
  53. isPreview: true,
  54. })
  55. .open();
  56. };
  57. const handleSave = () => {
  58. emit('save');
  59. };
  60. </script>
  61. <template>
  62. <div class="flex items-center justify-between border-b px-4">
  63. <InputCodeModal :close-on-click-modal="false" @success="handleSuccess" />
  64. <h3 class="text-lg">设计区域</h3>
  65. <div class="flex flex-wrap gap-3">
  66. <Icon
  67. icon="tabler:package-import"
  68. size="24"
  69. class="cursor-pointer"
  70. @click="handleImport"
  71. />
  72. <Icon
  73. icon="tabler:package-export"
  74. size="24"
  75. class="cursor-pointer"
  76. @click="handleExport"
  77. />
  78. <Icon
  79. icon="carbon:clean"
  80. size="24"
  81. class="cursor-pointer"
  82. @click="handleClear"
  83. />
  84. <Icon icon="hugeicons:view" size="24" class="cursor-pointer" />
  85. <Icon
  86. icon="fluent:save-multiple-24-filled"
  87. size="24"
  88. class="cursor-pointer"
  89. @click="handleSave"
  90. />
  91. </div>
  92. </div>
  93. </template>