Showing
3 changed files
with
188 additions
and
375 deletions
| ... | @@ -77,8 +77,10 @@ declare module '@vue/runtime-core' { | ... | @@ -77,8 +77,10 @@ declare module '@vue/runtime-core' { |
| 77 | VanSearch: typeof import('vant/es')['Search'] | 77 | VanSearch: typeof import('vant/es')['Search'] |
| 78 | VanSwipe: typeof import('vant/es')['Swipe'] | 78 | VanSwipe: typeof import('vant/es')['Swipe'] |
| 79 | VanSwipeItem: typeof import('vant/es')['SwipeItem'] | 79 | VanSwipeItem: typeof import('vant/es')['SwipeItem'] |
| 80 | + VanTa: typeof import('vant/es')['Ta'] | ||
| 80 | VanTab: typeof import('vant/es')['Tab'] | 81 | VanTab: typeof import('vant/es')['Tab'] |
| 81 | VanTabs: typeof import('vant/es')['Tabs'] | 82 | VanTabs: typeof import('vant/es')['Tabs'] |
| 83 | + VanTag: typeof import('vant/es')['Tag'] | ||
| 82 | VanTimePicker: typeof import('vant/es')['TimePicker'] | 84 | VanTimePicker: typeof import('vant/es')['TimePicker'] |
| 83 | VanUploader: typeof import('vant/es')['Uploader'] | 85 | VanUploader: typeof import('vant/es')['Uploader'] |
| 84 | VideoField: typeof import('./src/components/VideoField/index.vue')['default'] | 86 | VideoField: typeof import('./src/components/VideoField/index.vue')['default'] | ... | ... |
| 1 | <!-- | 1 | <!-- |
| 2 | * @Date: 2024-05-27 14:28:57 | 2 | * @Date: 2024-05-27 14:28:57 |
| 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 4 | - * @LastEditTime: 2024-05-28 10:28:26 | 4 | + * @LastEditTime: 2024-06-03 17:22:17 |
| 5 | * @FilePath: /data-table/src/components/GroupField/index.vue | 5 | * @FilePath: /data-table/src/components/GroupField/index.vue |
| 6 | * @Description: 组集合输入控件 | 6 | * @Description: 组集合输入控件 |
| 7 | --> | 7 | --> |
| ... | @@ -14,7 +14,7 @@ | ... | @@ -14,7 +14,7 @@ |
| 14 | <div v-if="item.component_props.note" class="note" v-html="item.component_props.note" /> | 14 | <div v-if="item.component_props.note" class="note" v-html="item.component_props.note" /> |
| 15 | <div> | 15 | <div> |
| 16 | <div v-for="(data, idx) in listData" :key="idx" style="border: 1px solid #eee; border-top: 0; margin: 1rem; position: relative;"> | 16 | <div v-for="(data, idx) in listData" :key="idx" style="border: 1px solid #eee; border-top: 0; margin: 1rem; position: relative;"> |
| 17 | - <van-icon @click="onRemove(idx)" v-if="listData.length > 1" size="1.5rem" color="#ee0a24" name="clear" style="position: absolute; right: -0.5rem; top: -0.5rem;" /> | 17 | + <van-icon @click="onRemove(data, idx)" v-if="listData.length > 1" size="1.5rem" color="#ee0a24" name="clear" style="position: absolute; right: -0.5rem; top: -0.5rem;" /> |
| 18 | <van-cell-group :border="false"> | 18 | <van-cell-group :border="false"> |
| 19 | <component v-for="(item, index) in data" :id="item.key" :key="index" | 19 | <component v-for="(item, index) in data" :id="item.key" :key="index" |
| 20 | :is="item.component" :item="item" @active="onActive" /> | 20 | :is="item.component" :item="item" @active="onActive" /> |
| ... | @@ -28,10 +28,12 @@ | ... | @@ -28,10 +28,12 @@ |
| 28 | </template> | 28 | </template> |
| 29 | 29 | ||
| 30 | <script setup> | 30 | <script setup> |
| 31 | +import { v4 as uuidv4 } from "uuid"; | ||
| 31 | import { styleColor } from "@/constant.js"; | 32 | import { styleColor } from "@/constant.js"; |
| 32 | import { queryFormAPI } from "@/api/form.js"; | 33 | import { queryFormAPI } from "@/api/form.js"; |
| 33 | import { useRoute } from "vue-router"; | 34 | import { useRoute } from "vue-router"; |
| 34 | import { createComponentType } from "@/hooks/useComponentType"; | 35 | import { createComponentType } from "@/hooks/useComponentType"; |
| 36 | +import _ from 'lodash'; | ||
| 35 | 37 | ||
| 36 | const props = defineProps({ | 38 | const props = defineProps({ |
| 37 | item: Object, | 39 | item: Object, |
| ... | @@ -46,306 +48,19 @@ const HideShow = computed(() => { | ... | @@ -46,306 +48,19 @@ const HideShow = computed(() => { |
| 46 | return !props.item.component_props.disabled | 48 | return !props.item.component_props.disabled |
| 47 | }); | 49 | }); |
| 48 | 50 | ||
| 49 | -// TODO:模拟集合组数据源 | 51 | +// let obj = { |
| 50 | -const testData = props.item.component_props.field_groups; | 52 | +// "field_10_group[0]_7653" : "1", |
| 51 | - | 53 | +// "field_10_group[1]_4154" : "11", |
| 52 | -// TAG: 测试调整了input和name两个组件头部显示 | 54 | +// "field_11_group[0]_3440" : "2", |
| 55 | +// "field_11_group[1]_4282" : "22" | ||
| 56 | +// } | ||
| 53 | 57 | ||
| 54 | -/*const testData = [ | 58 | +// TODO:模拟集合组数据源 |
| 55 | - // { | 59 | +const groupData = _.cloneDeep(props.item.component_props.field_groups); |
| 56 | - // "tag": "radio", | 60 | +groupData.forEach(item => { |
| 57 | - // "name": "radio_8", | 61 | + let randomNum = Math.floor(1000 + Math.random() * 9000); |
| 58 | - // "note": "", | 62 | + item.field_name = item.field_name + "_group" + '[0]_' + randomNum; // 组合唯一标识 |
| 59 | - // "index": 8, | 63 | +}) |
| 60 | - // "label": "组别", | ||
| 61 | - // "options": [ | ||
| 62 | - // { | ||
| 63 | - // "title": "少年组", | ||
| 64 | - // "value": "少年组", | ||
| 65 | - // "checked": false, | ||
| 66 | - // "desc_url": "", | ||
| 67 | - // "is_input": false, | ||
| 68 | - // "desc_text": "", | ||
| 69 | - // "desc_type": "", | ||
| 70 | - // "desc_btn_name": "", | ||
| 71 | - // "input_required": false, | ||
| 72 | - // "input_placeholder": "请输入补充信息" | ||
| 73 | - // }, | ||
| 74 | - // { | ||
| 75 | - // "title": "成人组", | ||
| 76 | - // "value": "成人组", | ||
| 77 | - // "checked": false, | ||
| 78 | - // "desc_url": "", | ||
| 79 | - // "is_input": false, | ||
| 80 | - // "desc_text": "", | ||
| 81 | - // "desc_type": "", | ||
| 82 | - // "desc_btn_name": "", | ||
| 83 | - // "input_required": false, | ||
| 84 | - // "input_placeholder": "请输入补充信息" | ||
| 85 | - // }, | ||
| 86 | - // { | ||
| 87 | - // "title": "老年组", | ||
| 88 | - // "value": "老年组", | ||
| 89 | - // "checked": false, | ||
| 90 | - // "desc_url": "", | ||
| 91 | - // "is_input": false, | ||
| 92 | - // "desc_text": "", | ||
| 93 | - // "desc_type": "", | ||
| 94 | - // "desc_btn_name": "", | ||
| 95 | - // "input_required": false, | ||
| 96 | - // "input_placeholder": "请输入补充信息" | ||
| 97 | - // } | ||
| 98 | - // ], | ||
| 99 | - // "disabled": false, | ||
| 100 | - // "field_id": 799497, | ||
| 101 | - // "required": true, | ||
| 102 | - // "data_type": "text", | ||
| 103 | - // "direction": "vertical", | ||
| 104 | - // "field_name": "field_6", | ||
| 105 | - // "option_map": { | ||
| 106 | - // "少年组": { | ||
| 107 | - // "title": "少年组", | ||
| 108 | - // "value": "少年组", | ||
| 109 | - // "checked": false, | ||
| 110 | - // "desc_url": "", | ||
| 111 | - // "is_input": false, | ||
| 112 | - // "desc_text": "", | ||
| 113 | - // "desc_type": "", | ||
| 114 | - // "desc_btn_name": "", | ||
| 115 | - // "input_required": false, | ||
| 116 | - // "input_placeholder": "请输入补充信息" | ||
| 117 | - // }, | ||
| 118 | - // "成人组": { | ||
| 119 | - // "title": "成人组", | ||
| 120 | - // "value": "成人组", | ||
| 121 | - // "checked": false, | ||
| 122 | - // "desc_url": "", | ||
| 123 | - // "is_input": false, | ||
| 124 | - // "desc_text": "", | ||
| 125 | - // "desc_type": "", | ||
| 126 | - // "desc_btn_name": "", | ||
| 127 | - // "input_required": false, | ||
| 128 | - // "input_placeholder": "请输入补充信息" | ||
| 129 | - // }, | ||
| 130 | - // "老年组": { | ||
| 131 | - // "title": "老年组", | ||
| 132 | - // "value": "老年组", | ||
| 133 | - // "checked": false, | ||
| 134 | - // "desc_url": "", | ||
| 135 | - // "is_input": false, | ||
| 136 | - // "desc_text": "", | ||
| 137 | - // "desc_type": "", | ||
| 138 | - // "desc_btn_name": "", | ||
| 139 | - // "input_required": false, | ||
| 140 | - // "input_placeholder": "请输入补充信息" | ||
| 141 | - // } | ||
| 142 | - // }, | ||
| 143 | - // "interaction_type": "h5edit", | ||
| 144 | - // "default": "" | ||
| 145 | - // }, | ||
| 146 | - { | ||
| 147 | - "tag": "input", | ||
| 148 | - "name": "input_21", | ||
| 149 | - "index": 2, | ||
| 150 | - "label": "物品描述", | ||
| 151 | - "unique": false, | ||
| 152 | - "default": "", | ||
| 153 | - "disabled": false, | ||
| 154 | - "field_id": 7985071, | ||
| 155 | - "readonly": false, | ||
| 156 | - "required": false, | ||
| 157 | - "data_type": "text", | ||
| 158 | - "field_name": "field_21", | ||
| 159 | - "placeholder": "请输入", | ||
| 160 | - "is_camera_scan": false, | ||
| 161 | - "camera_scan_type": "", | ||
| 162 | - "interaction_type": "h5edit", | ||
| 163 | - "is_edit_camera_scan_result": false | ||
| 164 | - }, | ||
| 165 | - // { | ||
| 166 | - // "tag": "radio", | ||
| 167 | - // "name": "radio_3", | ||
| 168 | - // "note": "", | ||
| 169 | - // "index": 3, | ||
| 170 | - // "label": "单选框", | ||
| 171 | - // "options": [ | ||
| 172 | - // { | ||
| 173 | - // "title": "选项标题1", | ||
| 174 | - // "value": "选项标题1", | ||
| 175 | - // "checked": true, | ||
| 176 | - // "desc_url": "", | ||
| 177 | - // "is_input": false, | ||
| 178 | - // "desc_text": "", | ||
| 179 | - // "desc_type": "", | ||
| 180 | - // "desc_btn_name": "", | ||
| 181 | - // "input_required": false, | ||
| 182 | - // "input_placeholder": "请输入补充信息" | ||
| 183 | - // }, | ||
| 184 | - // { | ||
| 185 | - // "title": "选项标题2", | ||
| 186 | - // "value": "选项标题2", | ||
| 187 | - // "checked": false, | ||
| 188 | - // "desc_url": "", | ||
| 189 | - // "is_input": false, | ||
| 190 | - // "desc_text": "", | ||
| 191 | - // "desc_type": "", | ||
| 192 | - // "desc_btn_name": "", | ||
| 193 | - // "input_required": false, | ||
| 194 | - // "input_placeholder": "请输入补充信息" | ||
| 195 | - // } | ||
| 196 | - // ], | ||
| 197 | - // "disabled": false, | ||
| 198 | - // "field_id": 798510, | ||
| 199 | - // "required": false, | ||
| 200 | - // "data_type": "text", | ||
| 201 | - // "direction": "vertical", | ||
| 202 | - // "field_name": "field_4", | ||
| 203 | - // "option_map": { | ||
| 204 | - // "选项标题1": { | ||
| 205 | - // "title": "选项标题1", | ||
| 206 | - // "value": "选项标题1", | ||
| 207 | - // "checked": true, | ||
| 208 | - // "desc_url": "", | ||
| 209 | - // "is_input": false, | ||
| 210 | - // "desc_text": "", | ||
| 211 | - // "desc_type": "", | ||
| 212 | - // "desc_btn_name": "", | ||
| 213 | - // "input_required": false, | ||
| 214 | - // "input_placeholder": "请输入补充信息" | ||
| 215 | - // }, | ||
| 216 | - // "选项标题2": { | ||
| 217 | - // "title": "选项标题2", | ||
| 218 | - // "value": "选项标题2", | ||
| 219 | - // "checked": false, | ||
| 220 | - // "desc_url": "", | ||
| 221 | - // "is_input": false, | ||
| 222 | - // "desc_text": "", | ||
| 223 | - // "desc_type": "", | ||
| 224 | - // "desc_btn_name": "", | ||
| 225 | - // "input_required": false, | ||
| 226 | - // "input_placeholder": "请输入补充信息" | ||
| 227 | - // } | ||
| 228 | - // }, | ||
| 229 | - // "interaction_type": "h5edit", | ||
| 230 | - // "default": "选项标题1" | ||
| 231 | - // }, | ||
| 232 | - // { | ||
| 233 | - // "tag": "datetime", | ||
| 234 | - // "name": "datetime_4", | ||
| 235 | - // "index": 4, | ||
| 236 | - // "label": "日期时间", | ||
| 237 | - // "default": "", | ||
| 238 | - // "disabled": false, | ||
| 239 | - // "field_id": 798512, | ||
| 240 | - // "readonly": false, | ||
| 241 | - // "required": false, | ||
| 242 | - // "data_type": "text", | ||
| 243 | - // "field_name": "field_5", | ||
| 244 | - // "placeholder": "请选择", | ||
| 245 | - // "data_maxvalue": "", | ||
| 246 | - // "data_minvalue": "", | ||
| 247 | - // "data_dateformat": "YYYY-MM-DD HH:mm:ss", | ||
| 248 | - // "interaction_type": "h5edit" | ||
| 249 | - // }, | ||
| 250 | - // { | ||
| 251 | - // "tag": "email", | ||
| 252 | - // "name": "email_5", | ||
| 253 | - // "index": 5, | ||
| 254 | - // "label": "邮箱", | ||
| 255 | - // "unique": false, | ||
| 256 | - // "default": "", | ||
| 257 | - // "disabled": false, | ||
| 258 | - // "field_id": 799499, | ||
| 259 | - // "readonly": false, | ||
| 260 | - // "required": true, | ||
| 261 | - // "data_type": "text", | ||
| 262 | - // "field_name": "field_7", | ||
| 263 | - // "placeholder": "请输入", | ||
| 264 | - // "interaction_type": "h5edit" | ||
| 265 | - // }, | ||
| 266 | - // { | ||
| 267 | - // "tag": "gender", | ||
| 268 | - // "name": "gender_6", | ||
| 269 | - // "note": "", | ||
| 270 | - // "index": 6, | ||
| 271 | - // "label": "性别", | ||
| 272 | - // "options": [ | ||
| 273 | - // { | ||
| 274 | - // "title": "男", | ||
| 275 | - // "value": "男", | ||
| 276 | - // "checked": false, | ||
| 277 | - // "desc_url": "", | ||
| 278 | - // "is_input": false, | ||
| 279 | - // "desc_text": "", | ||
| 280 | - // "desc_type": "", | ||
| 281 | - // "desc_btn_name": "", | ||
| 282 | - // "input_required": false, | ||
| 283 | - // "input_placeholder": "请输入补充信息" | ||
| 284 | - // }, | ||
| 285 | - // { | ||
| 286 | - // "title": "女", | ||
| 287 | - // "value": "女", | ||
| 288 | - // "checked": false, | ||
| 289 | - // "desc_url": "", | ||
| 290 | - // "is_input": false, | ||
| 291 | - // "desc_text": "", | ||
| 292 | - // "desc_type": "", | ||
| 293 | - // "desc_btn_name": "", | ||
| 294 | - // "input_required": false, | ||
| 295 | - // "input_placeholder": "请输入补充信息" | ||
| 296 | - // } | ||
| 297 | - // ], | ||
| 298 | - // "disabled": false, | ||
| 299 | - // "field_id": 799501, | ||
| 300 | - // "required": true, | ||
| 301 | - // "data_type": "text", | ||
| 302 | - // "direction": "vertical", | ||
| 303 | - // "field_name": "field_8", | ||
| 304 | - // "option_map": { | ||
| 305 | - // "女": { | ||
| 306 | - // "title": "女", | ||
| 307 | - // "value": "女", | ||
| 308 | - // "checked": false, | ||
| 309 | - // "desc_url": "", | ||
| 310 | - // "is_input": false, | ||
| 311 | - // "desc_text": "", | ||
| 312 | - // "desc_type": "", | ||
| 313 | - // "desc_btn_name": "", | ||
| 314 | - // "input_required": false, | ||
| 315 | - // "input_placeholder": "请输入补充信息" | ||
| 316 | - // }, | ||
| 317 | - // "男": { | ||
| 318 | - // "title": "男", | ||
| 319 | - // "value": "男", | ||
| 320 | - // "checked": false, | ||
| 321 | - // "desc_url": "", | ||
| 322 | - // "is_input": false, | ||
| 323 | - // "desc_text": "", | ||
| 324 | - // "desc_type": "", | ||
| 325 | - // "desc_btn_name": "", | ||
| 326 | - // "input_required": false, | ||
| 327 | - // "input_placeholder": "请输入补充信息" | ||
| 328 | - // } | ||
| 329 | - // }, | ||
| 330 | - // "interaction_type": "h5edit" | ||
| 331 | - // }, | ||
| 332 | - { | ||
| 333 | - "tag": "name", | ||
| 334 | - "name": "name_71", | ||
| 335 | - "index": 7, | ||
| 336 | - "label": "序列号", | ||
| 337 | - "unique": false, | ||
| 338 | - "default": "", | ||
| 339 | - "disabled": false, | ||
| 340 | - "field_id": 7995031, | ||
| 341 | - "readonly": false, | ||
| 342 | - "required": true, | ||
| 343 | - "data_type": "text", | ||
| 344 | - "field_name": "field_91", | ||
| 345 | - "placeholder": "请输入", | ||
| 346 | - "interaction_type": "h5edit" | ||
| 347 | - }, | ||
| 348 | -]*/ | ||
| 349 | 64 | ||
| 350 | const listData = ref([]); | 65 | const listData = ref([]); |
| 351 | const formData = ref([]); | 66 | const formData = ref([]); |
| ... | @@ -367,15 +82,12 @@ const formatData = (data) => { | ... | @@ -367,15 +82,12 @@ const formatData = (data) => { |
| 367 | return arr; | 82 | return arr; |
| 368 | }; | 83 | }; |
| 369 | 84 | ||
| 370 | -const onRemove = (idx) => { // 移除列表item | ||
| 371 | - listData.value.splice(idx, 1) | ||
| 372 | -} | ||
| 373 | 85 | ||
| 374 | // const gender_value = ref(props.item.component_props.default); | 86 | // const gender_value = ref(props.item.component_props.default); |
| 375 | const $route = useRoute(); | 87 | const $route = useRoute(); |
| 376 | 88 | ||
| 377 | onMounted(async () => { | 89 | onMounted(async () => { |
| 378 | - const form_data = testData; | 90 | + const form_data = groupData; |
| 379 | let page_form = []; | 91 | let page_form = []; |
| 380 | form_data.forEach((element) => { | 92 | form_data.forEach((element) => { |
| 381 | page_form.push(element); | 93 | page_form.push(element); |
| ... | @@ -384,38 +96,44 @@ onMounted(async () => { | ... | @@ -384,38 +96,44 @@ onMounted(async () => { |
| 384 | // 生成自定义组件 | 96 | // 生成自定义组件 |
| 385 | createComponentType(formData.value); | 97 | createComponentType(formData.value); |
| 386 | 98 | ||
| 387 | - listData.value.push(formData.value) | 99 | + listData.value.push(formData.value); |
| 388 | - // gender_value.value = props.item.component_props.default ? props.item.component_props.default : ''; | ||
| 389 | - // // 发送自定义数据结构 | ||
| 390 | - // props.item.value = { key: props.item.key, value: gender_value.value, type: "gender" }; | ||
| 391 | - // emit("active", props.item.value); | ||
| 392 | }); | 100 | }); |
| 393 | 101 | ||
| 394 | -const emit = defineEmits(["active"]); | 102 | +const emit = defineEmits(["active", "remove"]); |
| 395 | 103 | ||
| 396 | const onChange = (item) => { | 104 | const onChange = (item) => { |
| 397 | - // // 发送自定义数据结构 | ||
| 398 | - // props.item.value = { key: props.item.key, value: gender_value.value, type: "gender" }; | ||
| 399 | - // emit("active", props.item.value); | ||
| 400 | } | 105 | } |
| 401 | 106 | ||
| 402 | -// 操作绑定自定义字段回调 | 107 | +const addData = async () => { // 添加一行数据 |
| 403 | -const onActive = (item) => { | 108 | + const groupData = _.cloneDeep(props.item.component_props.field_groups); |
| 404 | - emit("active", item); | 109 | + groupData.forEach(item => { |
| 405 | -}; | 110 | + let randomNum = Math.floor(1000 + Math.random() * 9000); |
| 111 | + item.field_name = `${item.field_name}_group[${listData.value.length}]_${randomNum}`; // 组合唯一标识 | ||
| 112 | + }) | ||
| 406 | 113 | ||
| 407 | -const addData = async () => { | 114 | + const form_data = groupData; |
| 408 | - const form_data = testData; | ||
| 409 | let page_form = []; | 115 | let page_form = []; |
| 410 | form_data.forEach((element) => { | 116 | form_data.forEach((element) => { |
| 411 | page_form.push(element); | 117 | page_form.push(element); |
| 412 | }); | 118 | }); |
| 119 | + | ||
| 413 | formData.value = formatData(page_form); | 120 | formData.value = formatData(page_form); |
| 121 | + | ||
| 414 | // 生成自定义组件 | 122 | // 生成自定义组件 |
| 415 | createComponentType(formData.value); | 123 | createComponentType(formData.value); |
| 416 | 124 | ||
| 417 | listData.value.push(formData.value) | 125 | listData.value.push(formData.value) |
| 418 | } | 126 | } |
| 127 | + | ||
| 128 | +const onRemove = (data, idx) => { // 移除列表item | ||
| 129 | + let item = listData.value.splice(idx, 1); | ||
| 130 | + emit("remove", item); | ||
| 131 | +} | ||
| 132 | + | ||
| 133 | +// 操作绑定自定义字段回调 | ||
| 134 | +const onActive = (item) => { | ||
| 135 | + emit("active", item); | ||
| 136 | +}; | ||
| 419 | </script> | 137 | </script> |
| 420 | 138 | ||
| 421 | <style lang="less" scoped> | 139 | <style lang="less" scoped> | ... | ... |
| 1 | <!-- | 1 | <!-- |
| 2 | * @Date: 2022-07-18 10:22:22 | 2 | * @Date: 2022-07-18 10:22:22 |
| 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 4 | - * @LastEditTime: 2024-05-29 14:28:37 | 4 | + * @LastEditTime: 2024-06-03 17:06:34 |
| 5 | * @FilePath: /data-table/src/views/index.vue | 5 | * @FilePath: /data-table/src/views/index.vue |
| 6 | * @Description: 首页 | 6 | * @Description: 首页 |
| 7 | --> | 7 | --> |
| ... | @@ -25,7 +25,7 @@ | ... | @@ -25,7 +25,7 @@ |
| 25 | <van-form @submit="onSubmit" :scroll-to-error="true"> | 25 | <van-form @submit="onSubmit" :scroll-to-error="true"> |
| 26 | <van-cell-group :border="false"> | 26 | <van-cell-group :border="false"> |
| 27 | <component v-for="(item, index) in formData" :id="item.key" :ref="(el) => setRefMap(el, item)" :key="index" | 27 | <component v-for="(item, index) in formData" :id="item.key" :ref="(el) => setRefMap(el, item)" :key="index" |
| 28 | - :is="item.component" :item="item" @active="onActive" /> | 28 | + :is="item.component" :item="item" @active="onActive" @remove="onRemove" /> |
| 29 | </van-cell-group> | 29 | </van-cell-group> |
| 30 | <div v-if="formData.length && PCommit.visible" style="margin: 16px"> | 30 | <div v-if="formData.length && PCommit.visible" style="margin: 16px"> |
| 31 | <van-button round block type="primary" native-type="submit" :disabled="submitStatus"> | 31 | <van-button round block type="primary" native-type="submit" :disabled="submitStatus"> |
| ... | @@ -253,63 +253,129 @@ onMounted(async () => { | ... | @@ -253,63 +253,129 @@ onMounted(async () => { |
| 253 | // name : "name_41", | 253 | // name : "name_41", |
| 254 | // placeholder : "请输入", | 254 | // placeholder : "请输入", |
| 255 | // readonly : false, | 255 | // readonly : false, |
| 256 | - // required : false, | 256 | + // required : true, |
| 257 | // tag : "tree", | 257 | // tag : "tree", |
| 258 | // unique : false, | 258 | // unique : false, |
| 259 | // }); | 259 | // }); |
| 260 | 260 | ||
| 261 | - // page_form.unshift({ | 261 | + page_form.unshift({ |
| 262 | - // data_type : "text", | 262 | + data_type : "text", |
| 263 | - // default : "", | 263 | + default : "", |
| 264 | - // disabled : false, | 264 | + disabled : false, |
| 265 | - // field_id : 1414832, | 265 | + field_id : 1414832, |
| 266 | - // field_name : "field_4", | 266 | + field_name : "field_4", |
| 267 | - // index : 41, | 267 | + index : 41, |
| 268 | - // interaction_type : "h5edit", | 268 | + interaction_type : "h5edit", |
| 269 | - // label : "物品详情", | 269 | + label : "物品详情", |
| 270 | - // name : "name_41", | 270 | + name : "name_41", |
| 271 | - // placeholder : "请输入", | 271 | + placeholder : "请输入", |
| 272 | - // readonly : false, | 272 | + readonly : false, |
| 273 | - // required : false, | 273 | + required : false, |
| 274 | - // tag : "group", | 274 | + tag : "group", |
| 275 | - // unique : false, | 275 | + unique : false, |
| 276 | - // field_groups: [{ | 276 | + field_groups: [{ |
| 277 | - // "tag": "input", | 277 | + "tag": "input", |
| 278 | - // "name": "input_21", | 278 | + "name": "input_21", |
| 279 | - // "index": 2, | 279 | + "index": 2, |
| 280 | - // "label": "物品描述", | 280 | + "label": "物品描述", |
| 281 | - // "unique": false, | 281 | + "unique": false, |
| 282 | - // "default": "", | 282 | + "default": "", |
| 283 | - // "disabled": false, | 283 | + "disabled": false, |
| 284 | - // "field_id": 7985071, | 284 | + "field_id": 7985071, |
| 285 | - // "readonly": false, | 285 | + "readonly": false, |
| 286 | - // "required": false, | 286 | + "required": false, |
| 287 | - // "data_type": "text", | 287 | + "data_type": "text", |
| 288 | - // "field_name": "field_21", | 288 | + "field_name": "field_10", |
| 289 | - // "placeholder": "请输入", | 289 | + "placeholder": "请输入", |
| 290 | - // "is_camera_scan": false, | 290 | + "is_camera_scan": false, |
| 291 | - // "camera_scan_type": "", | 291 | + "camera_scan_type": "", |
| 292 | - // "interaction_type": "h5edit", | 292 | + "interaction_type": "h5edit", |
| 293 | - // "is_edit_camera_scan_result": false, | 293 | + "is_edit_camera_scan_result": false, |
| 294 | - // "group_field_name" : "field_4", | 294 | + "group_field_name" : "field_4", |
| 295 | - // },{ | 295 | + },{ |
| 296 | - // "tag": "name", | 296 | + "tag": "gender", |
| 297 | - // "name": "name_71", | 297 | + "name": "gender_3", |
| 298 | - // "index": 7, | 298 | + "note": "", |
| 299 | - // "label": "序列号", | 299 | + "index": 3, |
| 300 | - // "unique": false, | 300 | + "label": "性别", |
| 301 | - // "default": "", | 301 | + "options": [ |
| 302 | - // "disabled": false, | 302 | + { |
| 303 | - // "field_id": 7995031, | 303 | + "title": "男", |
| 304 | - // "readonly": false, | 304 | + "value": "男", |
| 305 | - // "required": true, | 305 | + "checked": false, |
| 306 | - // "data_type": "text", | 306 | + "desc_url": "", |
| 307 | - // "field_name": "field_91", | 307 | + "is_input": false, |
| 308 | - // "placeholder": "请输入", | 308 | + "desc_text": "", |
| 309 | - // "interaction_type": "h5edit", | 309 | + "desc_type": "", |
| 310 | - // "group_field_name" : "field_4", | 310 | + "desc_btn_name": "", |
| 311 | - // },] | 311 | + "input_required": false, |
| 312 | - // }); | 312 | + "input_placeholder": "请输入补充信息" |
| 313 | + }, | ||
| 314 | + { | ||
| 315 | + "title": "女", | ||
| 316 | + "value": "女", | ||
| 317 | + "checked": false, | ||
| 318 | + "desc_url": "", | ||
| 319 | + "is_input": false, | ||
| 320 | + "desc_text": "", | ||
| 321 | + "desc_type": "", | ||
| 322 | + "desc_btn_name": "", | ||
| 323 | + "input_required": false, | ||
| 324 | + "input_placeholder": "请输入补充信息" | ||
| 325 | + } | ||
| 326 | + ], | ||
| 327 | + "disabled": false, | ||
| 328 | + "field_id": 799603, | ||
| 329 | + "required": false, | ||
| 330 | + "data_type": "text", | ||
| 331 | + "direction": "vertical", | ||
| 332 | + "field_name": "field_4", | ||
| 333 | + "option_map": { | ||
| 334 | + "女": { | ||
| 335 | + "title": "女", | ||
| 336 | + "value": "女", | ||
| 337 | + "checked": false, | ||
| 338 | + "desc_url": "", | ||
| 339 | + "is_input": false, | ||
| 340 | + "desc_text": "", | ||
| 341 | + "desc_type": "", | ||
| 342 | + "desc_btn_name": "", | ||
| 343 | + "input_required": false, | ||
| 344 | + "input_placeholder": "请输入补充信息" | ||
| 345 | + }, | ||
| 346 | + "男": { | ||
| 347 | + "title": "男", | ||
| 348 | + "value": "男", | ||
| 349 | + "checked": false, | ||
| 350 | + "desc_url": "", | ||
| 351 | + "is_input": false, | ||
| 352 | + "desc_text": "", | ||
| 353 | + "desc_type": "", | ||
| 354 | + "desc_btn_name": "", | ||
| 355 | + "input_required": false, | ||
| 356 | + "input_placeholder": "请输入补充信息" | ||
| 357 | + } | ||
| 358 | + }, | ||
| 359 | + "interaction_type": "h5edit" | ||
| 360 | + },] | ||
| 361 | + }); | ||
| 362 | + | ||
| 363 | + page_form.push({ | ||
| 364 | + "tag": "name", | ||
| 365 | + "name": "name_2", | ||
| 366 | + "index": 2, | ||
| 367 | + "label": "姓名", | ||
| 368 | + "unique": false, | ||
| 369 | + "default": "", | ||
| 370 | + "disabled": false, | ||
| 371 | + "field_id": 799599, | ||
| 372 | + "readonly": false, | ||
| 373 | + "required": true, | ||
| 374 | + "data_type": "text", | ||
| 375 | + "field_name": "field_2", | ||
| 376 | + "placeholder": "请输入", | ||
| 377 | + "interaction_type": "h5edit" | ||
| 378 | + }) | ||
| 313 | formData.value = formatData(page_form); | 379 | formData.value = formatData(page_form); |
| 314 | // TODO:再次提交测试, 需要获取原来表单数据 | 380 | // TODO:再次提交测试, 需要获取原来表单数据 |
| 315 | // formData.value.forEach((item) => { | 381 | // formData.value.forEach((item) => { |
| ... | @@ -645,6 +711,33 @@ const preValidData = (values) => { | ... | @@ -645,6 +711,33 @@ const preValidData = (values) => { |
| 645 | return _.assign(postData.value, rest_data); | 711 | return _.assign(postData.value, rest_data); |
| 646 | } | 712 | } |
| 647 | 713 | ||
| 714 | +const onRemove = (value) => { // 处理组件删除事件回调, 数据结构是二维数组,删除时返回被删除的一组数据 | ||
| 715 | + value[0].forEach(item => { | ||
| 716 | + for (const key in postData.value) { | ||
| 717 | + if (item.key === key) { | ||
| 718 | + delete postData.value[key]; // 删除对应的键值对 | ||
| 719 | + } | ||
| 720 | + } | ||
| 721 | + }); | ||
| 722 | +} | ||
| 723 | + | ||
| 724 | +const adjGroupData = (values) => { // 调整group组件的数据结构 | ||
| 725 | + // let obj = { | ||
| 726 | + // "field_10_group[0]_7653" : "1", | ||
| 727 | + // "field_10_group[1]_4154" : "11", | ||
| 728 | + // "field_11_group[0]_3440" : "2", | ||
| 729 | + // "field_11_group[1]_4282" : "22" | ||
| 730 | + // } | ||
| 731 | + | ||
| 732 | + // let arr = [{ | ||
| 733 | + // "field_10": "1", | ||
| 734 | + // "field_11": "2", | ||
| 735 | + // }, { | ||
| 736 | + // "field_10": "11", | ||
| 737 | + // "field_11": "22", | ||
| 738 | + // }] | ||
| 739 | +} | ||
| 740 | + | ||
| 648 | const submitStatus = ref(false); | 741 | const submitStatus = ref(false); |
| 649 | 742 | ||
| 650 | const onSubmit = async (values) => { | 743 | const onSubmit = async (values) => { | ... | ... |
-
Please register or login to post a comment