ComponentGroup.vue 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <template>
  2. <div class="px-3 py-2 text-sm text-gray-700">
  3. {{ title }}
  4. </div>
  5. <Draggable
  6. tag="ul"
  7. class="m-0 p-3 pt-0 grid grid-cols-2 gap-1"
  8. item-key="type"
  9. :group="{ name: 'form-design', pull: 'clone', put: false }"
  10. :clone="cloneWidget"
  11. :sort="false"
  12. :list="list"
  13. :move="moveStart"
  14. @add="stopMove()"
  15. >
  16. <template #item="{ element }">
  17. <li
  18. v-if="fields.includes(element.type)"
  19. class="bg-gray-100 text-xs text-gray-700 hover:text-blue-500 leading-8 cursor-move -outline-offset-1 hover:outline-dashed outline-1 outline-blue-500 list-none flex items-center"
  20. >
  21. <i :class="'custom:'+element.type" class="ml-2 mr-1" />
  22. <span>{{ element.label }}</span>
  23. </li>
  24. </template>
  25. </Draggable>
  26. </template>
  27. <script lang="ts" setup>
  28. import Draggable from 'vuedraggable'
  29. import { ElMessage } from 'element-plus'
  30. import { cloneDeep } from 'lodash-es'
  31. const props = defineProps<{ fields: any[]; title: string; list: any[], allList: any }>()
  32. let moveFlag = $ref(false)
  33. const moveStart = () => {
  34. const flag = props.allList.list.length < 5
  35. if(!flag && !moveFlag) {
  36. moveFlag = true
  37. ElMessage.warning('最多添加五个')
  38. }
  39. return flag
  40. }
  41. const stopMove = () => {
  42. moveFlag = false
  43. }
  44. </script>
  45. <script lang="ts">
  46. export function cloneWidget(params: any) {
  47. const key = Math.random().toString(36).substring(2, 9)
  48. params = cloneDeep({
  49. ...params,
  50. key,
  51. model: `${params.type}_${key}`,
  52. })
  53. if (params.type === 'grid') {
  54. params.columns.forEach((i: any) => {
  55. i.list = i.list.map(cloneWidget)
  56. })
  57. }
  58. return params
  59. }
  60. </script>