snowy/snowy-admin-web/src/views/dev/slideshow/subForm.vue

163 lines
4.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<a-form
:model="formData"
ref="formRef"
name="basic"
autocomplete="off"
>
<a-table :columns="columns" :dataSource="formData" size="middle">
<template #bodyCell="{text, record, index, column}">
<template v-if="column.dataIndex === 'whetherToClick'">
<a-form-item :validate-status="validateStatus(record, 'whetherToClick')">
<a-radio-group v-model:value="record.whetherToClick" placeholder="请选择跳转方式" :options="whetherToClickOptions" />
</a-form-item>
</template>
<template v-if="column.dataIndex === 'skipMode'">
<a-form-item :validate-status="validateStatus(record, 'skipMode')">
<a-select v-model:value="record.skipMode" placeholder="请选择跳转方式" :disabled="record.whetherToClick === 'DISABLE'" :options="skipModeOptions" />
</a-form-item>
</template>
<template v-if="column.dataIndex === 'url'">
<a-form-item :validate-status="validateStatus(record, 'url')">
<a-input v-model:value="formData[index].url" :disabled="record.whetherToClick === 'DISABLE'" placeholder="请输入URL或路由地址"/>
</a-form-item>
</template>
</template>
</a-table>
</a-form>
</template>
<script name="subForm" setup>
import tool from "@/utils/tool"
import { remove, isEmpty, cloneDeep } from 'lodash-es'
const formRef = ref()
const formData = ref([])
const skipModeOptions = ref(tool.dictList('SKIP_MODE'))
const whetherToClickOptions = ref(tool.dictList('WHETHER_TO_CLICK'))
const props = defineProps({
dataArray: {
type: Object,
default: []
},
place: {
type: Object,
default: []
}
})
const columns = ref([
{
title: '位置',
dataIndex: 'label',
width: '20%',
},
{
title: '点击事件',
dataIndex: 'whetherToClick',
width: '25%',
},
{
title: '跳转方式',
dataIndex: 'skipMode',
width: '20%',
},
{
title: 'URL',
dataIndex: 'url'
}
])
// 每行的校验
const validateStatus = (record, name) => {
if (record[name]) {
return 'success'
} else {
return 'error'
}
}
// 返回多的数据,用于增减行
const dataFiltrate = (newVal, oldVal) => {
let result = ''
oldVal.forEach((data) => {
if (!newVal.some(item => item === data)) {
result = data
}
})
return result
}
watch(
() => props.place,
(newVal, oldVal) => {
if (!isEmpty(props.dataArray) && isEmpty(formData.value)) {
formData.value = cloneDeep(props.dataArray)
} else {
if (typeof newVal === "object") {
if (!isEmpty(formData.value)) {
formData.value.forEach(() => {
// 如果包含
if (!newVal.some(item => item === item.key)) {
// 需要减少的
if (formData.value.length > newVal.length) {
const deleteData = dataFiltrate(newVal, oldVal)
remove(formData.value, (item) => item.key === deleteData)
}
// 需要增加的
if (formData.value.length < newVal.length) {
const deleteData = dataFiltrate(oldVal, newVal)
// 如果没有,就不增加
if (!formData.value.some(item => item === deleteData)) {
const obj = {
key: deleteData,
label: tool.dictTypeData('DEV_SLIDESHOW_PLACE' , deleteData),
whetherToClick: 'DISABLE',
skipMode: 'URL',
url: ''
}
formData.value.push(obj)
}
}
}
})
} else {
newVal.forEach((item) => {
const obj = {
key: item,
label: tool.dictTypeData('DEV_SLIDESHOW_PLACE' , item),
whetherToClick: 'DISABLE',
skipMode: 'URL',
url: ''
}
formData.value.push(obj)
})
}
}
}
},
{ immediate: true, deep: true }
)
// 获取值校验不通过返回false
const getData = () => {
if (isEmpty(formData.value)) {
return false
} else {
let result = true
formData.value.forEach((item) => {
if (item.whetherToClick === 'ENABLE' && isEmpty(item.url)) {
result = false
}
})
if (result === false) {
return false
} else {
return formData.value
}
}
}
defineExpose({
getData
})
</script>
<style lang="less" scoped>
.ant-form-item {
margin-bottom: 0 !important;
}
</style>