index.jsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { h, watch } from 'vue'
  2. import CipForm from '../../../cip-form'
  3. import VueDraggable from 'vuedraggable'
  4. import { useFormDrawing, useList } from './use-form-drawing'
  5. import './index.less'
  6. import FormDrawingContent from './widgets/content'
  7. import { isNotEmpty } from '@cip/utils/util'
  8. export default {
  9. props: {
  10. data: { type: Object, default: () => ({}) },
  11. equipment: { type: String },
  12. selectId: [Number, String]
  13. },
  14. emits: ['updateList', 'select'],
  15. setup (props, context) {
  16. const { list, updateList } = useList({ props, emit: context.emit })
  17. const { selectItem, deleteItem, copyItem } = useFormDrawing({ list, updateList, emit: context.emit })
  18. const addItem = ({ newIndex }) => {
  19. const newItem = list.value[newIndex]
  20. context.emit('select', newItem)
  21. }
  22. const updateConfig = (element, val) => {
  23. const cloneList = props.data?.list || []
  24. element.config = val
  25. updateList(cloneList, 'layoutUpdate')
  26. }
  27. // 表单内容包含 布局和input && table(特殊)
  28. const FormContent = (...args) => {
  29. const { element, index } = args[0]
  30. const formContentProps = {
  31. selectId: props.selectId,
  32. element,
  33. index,
  34. formLabelPosition: props.data.formLabelPosition,
  35. onUpdateConfig: (val) => {
  36. updateConfig(element, val)
  37. },
  38. onClick: () => { selectItem(element) },
  39. onDelete: () => deleteItem(index),
  40. onCopy: () => copyItem(index),
  41. onSelectItem: (element) => selectItem(element)
  42. }
  43. return h(FormDrawingContent, { ...formContentProps })
  44. }
  45. // 默认选中第一个
  46. watch(() => props.selectId, (val) => {
  47. if (!val && list.value.length > 0) {
  48. selectItem(list.value[0])
  49. }
  50. }, { immediate: true })
  51. return () => <div class={'form-drawing-container'}>
  52. {list.value.length === 0 && <div class={'empty-form--text'}>从左侧拖拽来添加字段</div>}
  53. <div class={['form-drawing', `form-drawing--${props.equipment}`]}>
  54. <CipForm
  55. fieldList={[]}
  56. size={props.data.tableSize || 'default'}
  57. labelWidth={`${props.data.labelWidth}px`}
  58. labelPosition={props.data.labelPosition}
  59. labelSuffix={props.data.labelSuffix}
  60. equipment={props.equipment}
  61. >
  62. <VueDraggable
  63. modelValue={list.value}
  64. onUpdate:modelValue={(val) => updateList(val)}
  65. itemKey={'id'}
  66. group={'components'}
  67. handle={'.move-icon'}
  68. ghostClass={'ghost'}
  69. animation={200}
  70. componentData={{
  71. class: 'form-content__wrapper',
  72. style: isNotEmpty(props.data.grid)
  73. ? `display: grid; grid-template-columns: repeat(${props.data.grid},1fr);align-content: start;`
  74. : ''
  75. }}
  76. onAdd={({ newIndex }) => addItem({ newIndex })}>
  77. {{
  78. item: FormContent
  79. }}
  80. </VueDraggable>
  81. </CipForm>
  82. </div>
  83. </div>
  84. }
  85. }