index.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <template>
  2. <v-form ref="formRef" v-model="valid" class="login-form" @submit.prevent>
  3. <div>
  4. <v-row dense no-gutters class="justify-space-between">
  5. <template v-for="(item) in props.items.options">
  6. <slot :name="item.prevSlot"></slot>
  7. <v-col :key="item.key" v-if="!item.hide" :cols="item.col || '12'" class="position">
  8. <template v-if="item.slotTitle">
  9. <div :class="item.class" :style="item.slotTitleStyle">{{ item.slotTitle }}</div>
  10. </template>
  11. <div class="d-flex mb-2" :class="item.flexStyle || 'flex-row'">
  12. <!-- <span>{{ item.value }}</span> -->
  13. <textUI
  14. v-if="['text', 'password', 'number'].includes(item.type)"
  15. v-model="item.value"
  16. :item="item"
  17. @change="handleChange(item)"
  18. ></textUI>
  19. <autocompleteUI
  20. v-if="item.type === 'autocomplete'"
  21. v-model="item.value"
  22. :item="item"
  23. @search="v => item.search ? item.search(v) : null"
  24. @change="handleChange(item)"
  25. ></autocompleteUI>
  26. <comboboxUI
  27. v-if="item.type === 'combobox'"
  28. v-model="item.value"
  29. :item="item"
  30. @search="v => item.search ? item.search(v) : null"
  31. @change="handleChange(item)"
  32. ></comboboxUI>
  33. <!-- comboboxZhAndEnUI暂不可用 -->
  34. <comboboxZhAndEnUI
  35. v-if="item.type === 'comboboxZhAndEn'"
  36. v-model="item.value"
  37. :item="item"
  38. @search="v => item.search ? item.search(v) : null"
  39. @change="handleChange(item)"
  40. ></comboboxZhAndEnUI>
  41. <radioGroupUI
  42. v-if="item.type === 'ifRadio'"
  43. v-model="item.value"
  44. :item="item"
  45. @change="handleChange(item)"
  46. ></radioGroupUI>
  47. <checkboxUI
  48. v-if="item.type === 'checkbox'"
  49. v-model="item.value"
  50. :item="item"
  51. @change="handleChange(item)"
  52. ></checkboxUI>
  53. <textareaUI
  54. v-if="item.type === 'textarea'"
  55. v-model="item.value"
  56. :item="item"
  57. @change="handleChange(item)"
  58. ></textareaUI>
  59. <nestedListGroupUI
  60. v-if="item.type === 'nestedListGroup'"
  61. v-model="item.value"
  62. :item="item"
  63. @change="handleChange(item)"
  64. ></nestedListGroupUI>
  65. <DatePicker v-if="item.type === 'datePicker'" v-model="item.value" :options="item.options" :width="item.width" :class="item.class"></DatePicker>
  66. <template v-if="item.slotName">
  67. <slot :name="item.slotName" :item="item"></slot>
  68. </template>
  69. </div>
  70. </v-col>
  71. </template>
  72. </v-row>
  73. </div>
  74. <slot></slot>
  75. </v-form>
  76. </template>
  77. <script setup>
  78. defineOptions({ name:'components-ct-form'})
  79. import textUI from './../FormUI/TextInput'
  80. import autocompleteUI from './../FormUI/autocomplete'
  81. import comboboxUI from './../FormUI/combobox'
  82. import comboboxZhAndEnUI from './../FormUI/comboboxZhAndEn'
  83. import radioGroupUI from './../FormUI/radioGroup'
  84. import checkboxUI from './../FormUI/checkbox'
  85. import textareaUI from './../FormUI/textArea'
  86. import nestedListGroupUI from './../FormUI/nestedListGroup'
  87. import DatePicker from '@/components/DatePicker'
  88. import { ref, defineEmits, defineExpose } from 'vue'
  89. const emit = defineEmits(['change', 'inputUpdateAutocomplete'])// 定义一个或多个自定义事件
  90. const props = defineProps({items: Object})
  91. const valid = ref(false)
  92. const isValid = ref(true)
  93. const formRef = ref()
  94. const handleChange = (item) => {
  95. // console.log('handleChange', item)
  96. if (item.type === 'date' && item.value) item.option.validate = false
  97. if (item?.change) item.change(item.value, item)
  98. emit('change', false)
  99. }
  100. const validateTime = () => {
  101. isValid.value = true
  102. props.items.options.forEach((e) => {
  103. if (e.type !== 'date' || e.hide || !e.rules) return
  104. const rules = e.rules[0]
  105. const check = rules(e.value)
  106. if (typeof check === 'string') {
  107. isValid.value = false
  108. e.option.error = true
  109. e.option.errorMsg = check
  110. } else {
  111. e.option.error = false
  112. e.option.errorMsg = null
  113. }
  114. })
  115. }
  116. const validate = () => {
  117. const form = formRef.value.validate()
  118. const time = validateTime()
  119. return form && time
  120. }
  121. defineExpose({
  122. validate,
  123. formRef
  124. })
  125. </script>
  126. <style lang="scss" scoped>
  127. .position {
  128. position: relative;
  129. }
  130. .label {
  131. font-size: 14px;
  132. color: rgba(0, 0, 0, .6);
  133. }
  134. </style>