<script lang="ts" setup name="edit">
import type { Ref } from 'vue'
import { nextTick, reactive, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import type { FormInstance, FormRules } from 'element-plus'
import { addGroup, editGroup, videoTree } from '@/api/ycjg/aqbb'
import { getDictByCode } from '@/api/system/dict'
// ----------------------- 以下是字段定义 emits props ---------------------
const emits = defineEmits(['closeRefresh'])
const treeRef = ref(null)
const data = ref([])
// id: 1,
// name: '一级 1',
// children: [{
// id: 4,
// name: '二级 1-1',
// children: [{
// id: 9,
// name: '三级 1-1-1',
// }, {
// id: 10,
// name: '三级 1-1-2',
// }],
// }],
// }, {
// id: 2,
// name: '一级 2',
// children: [{
// id: 5,
// name: '二级 2-1',
// }, {
// id: 6,
// name: '二级 2-2',
// }],
// }, {
// id: 3,
// name: '一级 3',
// children: [{
// id: 7,
// name: '二级 3-1',
// }, {
// id: 8,
// name: '二级 3-2',
// }],
// }])
const defaultProps = ref({
children: 'children',
label: 'name',
isDisabled: 'disabled',
})
// 对话框类型
const dialogStatus = ref('create')
const dialogVisible = ref(false)
// 显示标题
const textMap: { [key: string]: string } = {
update: '编辑分组',
create: '新增分组',
detail: '分组详情',
}
// 表单数据对象
const formData: Ref<any> = ref({
id: '',
groupName: '',
description: '',
safe: '',
cameraIds: '',
})
const safeList = ref<any[]>([])
// 保存按钮加载状态
const btnLoading = ref(false)
// ---------------表单提交--------------------------------
// 表单对象
const dataFormRef = ref<FormInstance>()
// 校验规则
const rules = reactive<FormRules>({
groupName: [{ required: true, message: '分组名称不可为空', trigger: ['blur', 'change'] }],
// cameraIds: [{ required: true, message: '请选择分组相机', trigger: ['blur', 'change'] }],
safe: [{ required: true, message: '请选择密级', trigger: ['blur', 'change'] }],
})
function submitForm() {
const checkedNodes = treeRef.value!.getCheckedNodes()
const arr = checkedNodes.filter((item: any) => item.device !== '').map((item: any) => {
return item.id
})
if (arr.length === 0) {
ElMessage.warning('请选择分组相机')
return
}
formData.value.cameraIds = arr.toString()
if (dataFormRef.value) {
dataFormRef.value?.validate((valid: boolean) => {
if (valid) {
if (dialogStatus.value === 'create') {
createData()
}
else if (dialogStatus.value === 'update') {
updateData()
}
}
})
}
}
// 新增数据
function createData() {
btnLoading.value = true
addGroup(formData.value).then((res) => {
if (res.code === 200) {
ElMessage.success('创建成功')
closeRefresh()
btnLoading.value = false
}
}).catch((_) => {
btnLoading.value = false
})
}
// 更新数据
function updateData() {
btnLoading.value = true
editGroup(formData.value).then((res) => {
if (res.code === 200) {
ElMessage.success('修改成功')
closeRefresh()
btnLoading.value = false
}
}).catch((_) => { // 异常情况,loading置为false
btnLoading.value = false
})
}
// 重置表单
function resetForm() {
formData.value = {
id: '',
groupName: '',
description: '',
safe: '',
cameraIds: '',
}
console.log('resetForm')
nextTick(() => {
dataFormRef.value?.clearValidate()
})
}
function traverseArray(arr: [], disabled: any) {
arr.forEach((item: any) => {
item.disabled = disabled
if (item.children.length !== 0) {
traverseArray(item.children, disabled)
}
})
return arr
}
// ----------初始化、关闭对话框相关-----------------
function initDialog(dialogstatus: string, row: any) {
dialogStatus.value = dialogstatus
dialogVisible.value = true
btnLoading.value = false
// 获取权属
if (dialogstatus === 'create') {
resetForm()
nextTick(() => {
dataFormRef.value?.clearValidate()
})
data.value = traverseArray(data.value,false)
}
else if (dialogstatus === 'update') {
nextTick(() => {
dataFormRef.value?.clearValidate()
})
const cameras = row.cameras.map((item: any) => item.id)
const arr = row.cameraIds.split(',').filter((item: any) => cameras.includes(item))
formData.value = {
id: row.id,
groupName: row.groupName,
description: row.description,
safe: row.safe,
cameraIds: arr,
}
data.value = traverseArray(data.value,false)
}
else {
nextTick(() => {
dataFormRef.value?.clearValidate()
})
const cameras = row.cameras.map((item: any) => item.id)
const arr = row.cameraIds.split(',').filter((item: any) => cameras.includes(item))
formData.value = {
id: row.id,
groupName: row.groupName,
description: row.description,
safe: row.safe,
cameraIds: arr,
}
data.value = traverseArray(data.value,true)
}
}
// 关闭并刷新
function closeRefresh() {
dialogVisible.value = false
resetForm()
emits('closeRefresh')
}
// 关闭弹窗
function dialogClose() {
dialogVisible.value = false
resetForm()
}
onMounted(() => {
getDictByCode('secretLevel').then((response) => {
if (response.code === 200) {
safeList.value = response.data
}
})
videoTree().then((response) => {
if (response.code === 200) {
data.value = response.data
}
})
})
// ----------------------- 以下是暴露的方法内容 ----------------------------
defineExpose({ initDialog })
</script>
<template>
<el-dialog
v-model="dialogVisible"
:title="textMap[dialogStatus]"
width="500"
:before-close="dialogClose"
append-to-body
:open-delay="0"
:close-on-click-modal="false"
>
<el-form
ref="dataFormRef" :model="formData" :rules="rules" label-position="left" label-width="80px" class="form-container"
size="default" @submit.prevent
>
<el-row :gutter="10">
<el-col :span="24" class="grid-cell">
<el-form-item label="分组名称" prop="groupName" class="required">
<el-input v-model="formData.groupName" :disabled="dialogStatus === 'detail'" type="text" placeholder="必填" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="24" class="grid-cell">
<el-form-item label="分组相机" class="required">
<el-tree
ref="treeRef"
v-if="dialogVisible"
:disabled="dialogStatus === 'detail'"
style="max-height: 200px;overflow-y: scroll;width: 100%;"
:data="data"
show-checkbox
node-key="id"
:default-expand-all="true"
:default-checked-keys="formData.cameraIds"
:props="defaultProps"/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="24" class="grid-cell">
<el-form-item label="内容描述" class="required">
<el-input v-model="formData.description" :disabled="dialogStatus === 'detail'" type="text" placeholder="内容描述" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="24" class="grid-cell">
<el-form-item label="密级" prop="safe" class="required">
<el-select v-model="formData.safe" :disabled="dialogStatus === 'detail'" placeholder="必选" style="width: 100%">
<el-option
v-for="item in safeList"
:key="item.value"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer" v-show="dialogStatus !== 'detail'">
<el-button :loading="btnLoading" type="primary" @click="submitForm">
保存
</el-button>
<el-button @click="dialogClose">
取消
</el-button>
</div>
</template>
</el-dialog>
</template>
<style lang="scss" scoped>
.form-container {
width: 100%;
.full-width-input {
width: 100%;
}
}
</style>