You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

181 lines
4.7 KiB

7 months ago
<template>
<div class="all-group">
<!-- 样式修改 -->
<div class="message-list">
<a-checkbox
v-model:checked="checkAll"
:indeterminate="indeterminate"
@change="onCheckAllChange"
:disabled="promptWord.checked"
>
全选
</a-checkbox>
</div>
<div class="warp" v-if="options.length">
<a-checkbox-group
v-model:value="checkedList"
:options="options"
:disabled="promptWord.checked"
>
<slot></slot>
</a-checkbox-group>
<!-- <ns-checkbox-group v-model:value="checkedList" :options="options" /> -->
</div>
<div class="no-warp" v-if="!options.length">
<ul class="prompt-information">
<ns-icon class="icon" name="account1" size="25" style="margin-right: 5px" />
<li>暂无数据, 请先维护</li
><li @click="jumpMaintenanceInformation()">{{ promptWord.maintenanceInformation }}</li></ul
>
</div>
<p class="remark-prompt">{{ promptWord.message }}</p>
</div>
</template>
<script lang="ts">
import { defineComponent, toRefs, reactive, watch, computed, ref } from 'vue';
import { http } from '/nerv-lib/util/http';
import { useRouter } from 'vue-router';
export default defineComponent({
name: 'NsCheckboxAllGroup',
props: {
api: String,
field: String,
title: String,
message: String,
maintenanceInformation: String, //没有数据的情况下的维护信息
route: String, //维护信息跳转的路由
optionsName: Array,
resultField: String,
checked: String,
options: Array
},
setup(props) {
const options = ref([]); //创建options接受请求回来的值
const state = reactive({
indeterminate: false,
checkAll: false,
checkedList: [],
});
const router = useRouter();
// 获取标题和备注信息
const promptWord = computed(() => {
return props;
});
// 获取后端的区域
const getData = () => {
options.value = [];
if(props.options){
options.value= props.options
}
http.get(props.api).then((res) => {
if (promptWord.value.resultField == 'data') {
res.data.forEach((element) => {
element['label'] = element[promptWord.value.optionsName[0]];
element['value'] = element[promptWord.value.optionsName[1]];
});
options.value = res.data;
} else {
res.data.data.forEach((element) => {
element['label'] = element[promptWord.value.optionsName[0]];
element['value'] = element[promptWord.value.optionsName[1]];
});
options.value = res.data.data;
}
});
};
const jumpMaintenanceInformation = () => {
router.push(props.route);
};
getData();
// 全选的时候会触发这个方法
const onCheckAllChange = (e: any) => {
state.checkedList = [];
if (e.target.checked) {
(state.indeterminate = false),
options.value.forEach((item) => {
state.checkedList.push(item['value']);
});
}
state.indeterminate = false;
};
// 监听选中的数据
watch(
() => state.checkedList,
(val) => {
state.indeterminate = !!val.length && val.length < options.value.length;
state.checkAll = val.length === options.value.length;
}
);
return {
...toRefs(state),
onCheckAllChange,
promptWord,
options,
jumpMaintenanceInformation,
};
},
});
</script>
<style lang="less" scoped>
.all-group {
// margin-left: 22.22%;
}
.warp {
width: 100%;
height: 100%;
border: 1px solid #dcdfe2;
background: #f8f9fc;
}
.no-warp {
width: 100%;
height: 100px;
border: 1px solid #dcdfe2;
background: #f8f9fc;
display: flex;
justify-content: center;
align-items: center;
position: relative;
.prompt-information {
list-style: none;
display: flex;
padding-left: 7px;
// position: absolute;
// left: 50%;
// top: 40%;
li:nth-of-type(1) {
color: #828282;
}
li:nth-of-type(2) {
color: #6865ea;
}
}
}
.message-list {
display: flex;
}
.message-list p {
margin-right: 5px;
color: #606060;
}
.ant-checkbox-group {
margin: 22px 18px 26px !important;
}
:deep(.ant-checkbox-group-item) {
margin-right: 110px !important;
}
.remark-prompt {
font-family: PingFang SC;
font-style: normal;
font-weight: normal;
font-size: 14px;
line-height: 22px;
color: #c1c1c1;
margin-top: 7px;
}
</style>