WidgetForm.vue 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <el-form
  3. label-suffix=":"
  4. bg-gray-50 relative flex="~ 1"
  5. v-bind="config"
  6. class="layoutForm"
  7. >
  8. <div v-if="!list?.length" text="gray-400 lg" absolute top-50 left="1/2" translate-x="-1/2">
  9. 从左侧拖拽来添加字段
  10. </div>
  11. <Draggable
  12. class="flex-1 m-2 bg-white shadow p-1"
  13. item-key="key"
  14. handle="[cursor-move]"
  15. :animation="200"
  16. group="form-design"
  17. :list="list"
  18. @add="selectWidget=list[$event.newIndex]"
  19. >
  20. <template #item="{ element, index }">
  21. <WidgetFormItem
  22. v-model:selectWidget="selectWidget"
  23. :element="element"
  24. :index="index"
  25. :list="list"
  26. :configurationItems="config"
  27. />
  28. </template>
  29. </Draggable>
  30. </el-form>
  31. </template>
  32. <script lang="ts" setup>
  33. import Draggable from 'vuedraggable'
  34. import WidgetFormItem from './WidgetFormItem.vue'
  35. import type { WidgetForm } from '@/config'
  36. const props = defineProps<{ list: any; config: WidgetForm['config']; selectWidget: any }>()
  37. defineEmits(['update:selectWidget'])
  38. const selectWidget = useVModel(props, 'selectWidget')
  39. </script>
  40. <style lang="scss">
  41. .layoutForm {
  42. height: 100%;
  43. overflow-y: auto;
  44. }
  45. .widget-view {
  46. @apply relative m-0.5 p-1 border border-dashed border-gray-300;
  47. &.col {
  48. @apply grid grid-cols-24;
  49. }
  50. &.active {
  51. @apply border-solid border-blue-500 outline outline-2 outline-blue-500;
  52. &.col {
  53. @apply border-yellow-500 outline-yellow-500;
  54. }
  55. }
  56. &:hover {
  57. @apply border-blue-500 bg-blue-50;
  58. &.col {
  59. @apply border-yellow-500 bg-yellow-50;
  60. }
  61. }
  62. }
  63. </style>