[update] 企标立项、变更流程

This commit is contained in:
lideqin
2023-12-01 17:29:22 +08:00
parent 9cba85a0c7
commit 7189765b73
11 changed files with 1372 additions and 244 deletions
+262
View File
@@ -0,0 +1,262 @@
<template>
<ul class="list-menu" v-if="data.length">
<li v-for="(item, i) in data" :key="i" @click.stop="selectItem(item)" v-show="expandFlag">
<div class="item">
<div class="item-left">
<!-- 展开的图标 -->
<i class='expandIcon'
@click.stop="expandItem(item, i)"
:class="[expandArr.includes(i) ? 'reduce' : 'add',item.children && item.children.length ? '' : 'disabled']">
</i>
<!-- 选项名 -->
<span class=" value-span">{{ item[labelKey] }}</span>
</div>
<!-- 选择的图标 -->
<template v-if="!multiple">
<i class='selectIcon'
:class="[value[valueKey] == item[valueKey] ? 'checked' : 'noChecked']">
</i>
</template>
<template v-else>
<i class='selectIcon multiple-select-icon'
:class="[checkedArr.includes(item[valueKey]) ? 'checked' : 'noChecked']">
</i>
</template>
</div>
<list-menu
v-if='item.children'
@input='input'
:data='item.children'
:valueKey='valueKey'
:labelKey='labelKey'
:value="value"
:toastText='toastText'
:expandFlag='expandArr.includes(i)'
:multiple="multiple"
/>
</li>
</ul>
</template>
<script>
export default {
// 组件名必写
name: 'ListMenu',
props: {
// 选中的值的属性名,必传
valueKey: String,
// 在页面要展示的选项属性名,必传
labelKey: String,
// 选中的值,必传
value: [Object, String, Array],
// 控制展开,不需要传
expandFlag: {
type: Boolean,
default: true
},
// 总数据,必传
data: Array,
// 不可选提示文字,非必传
toastText: String,
// 是否多选
multiple: {
type: Boolean,
default: false
}
},
watch: {
value: {
immediate: true,
deep: true,
handler (val) {
return val
}
}
},
data () {
return {
// 当前级组件已展开的项
expandArr: []
}
},
computed: {
// 已经选中的数据 由key组成
checkedArr () {
return this.value.map(tt => tt[this.valueKey])
}
},
methods: {
// 子组件逐级传递选中项
input (item) {
this.$emit('input', item)
},
// 选择
selectItem (item) {
if (!this.multiple) {
this.$emit('input', item)
} else {
// 多选的时候 想要value值是所有选中的obj组成的数组
// 先判断保存的值中有没有改数据,存在的话删除,不存在的话增加
const eleIndex = this.value.findIndex(a => item[this.valueKey] === a[this.valueKey])
if (eleIndex > -1) {
const arr = [...this.value]
arr.splice(eleIndex, 1)
this.$emit('input', arr)
} else {
this.$emit('input', [...this.value, item])
}
}
},
// 展开
expandItem (item, i) {
if (item.children && item.children.length) {
const index = this.expandArr.indexOf(i)
if (index > -1) {
this.expandArr.splice(index, 1)
} else {
this.expandArr.push(i)
}
}
}
}
}
</script>
<style lang="less" scoped>
@import '~@assets/less/common.less';
.popup-box > ul {
padding-right: @pad-base;
}
ul {
width: 100%;
color: #2a2a2a;
font-size: 0.22rem;
overflow: hidden;
background: #fff;
border-bottom: .8px solid #e1e1e1;
//height: calc(100% - 0.9rem);
//overflow: auto;
li {
padding-right: 0;
.item {
padding: @pad-base;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
font-size: 0.3rem;
&-left {
display: flex;
flex: 1;
}
.expandIcon {
height: 0.4rem;
width: 0.4rem;
font-style: normal;
position: relative;
&:after {
position: absolute;
top: 50%;
left: 50%;
font-size:0.4rem;
transform: translate(-50%, -50%);
}
&.add {
border-color: #2a2a2a;
&:after {
color: #2a2a2a;
content: '';
}
}
&.reduce {
border-color: @primary-color;
&:after {
color: @primary-color;
content: '';
}
}
&.disabled {
border-color: #ddd;
opacity: 0;
&:after {
color: #ddd;
}
}
}
.value-span {
text-align: left;
flex: 1;
}
.selectIcon {
float: right;
height: 0.3rem;
width: 0.3rem;
border: 1.5px solid;
border-radius: 50%;
position: relative;
&:after {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
&.checked {
border-color: @primary-color;
background: @primary-color;;
&:after {
color: #fff;
content: '✓';
}
}
&.noChecked {
border-color: @primary-color;
}
&.disabled {
border-color: #ddd;
}
}
.multiple-select-icon {
border-radius: 0.04rem;
}
}
&:not(:first-child) {
border-top: .8px solid #e1e1e1;
}
> ul {
border-bottom: 0;
padding-left: 0.35rem;
box-sizing: border-box;
li {
.item {
padding-left: 0.35rem;
box-sizing: border-box;
}
.item-left span{
width: 0;
overflow: auto;
}
border-top: .8px solid #e1e1e1;
}
}
}
}
</style>
+21 -21
View File
@@ -23,7 +23,7 @@
</template>
<script>
import {ajaxGetDictItems, getDictItemsFromCache} from '../../api/api'
import { ajaxGetDictItems, getDictItemsFromCache } from '@/api/api'
export default {
name: 'PickerDictField',
@@ -55,7 +55,7 @@ export default {
default: false
}
},
data() {
data () {
return {
showPicker: false,
showValue: '',
@@ -69,53 +69,53 @@ export default {
this.initVal()
}
},
dictCode:{
immediate:true,
handler() {
dictCode: {
immediate: true,
handler () {
this.initDictData()
this.initVal()
},
},
}
}
},
computed: {
//透传给下级组件的事件,需要排除本组件使用的change事件
childListeners() {
// 透传给下级组件的事件,需要排除本组件使用的change事件
childListeners () {
// const vm = this
let result = Object.assign({},
this.$listeners,
const result = Object.assign({},
this.$listeners
)
delete result.change
return result
}
},
methods: {
showPickerFunc() {
if(this.readonly) return
showPickerFunc () {
if (this.readonly) return
this.showPicker = true
},
initVal() {
initVal () {
// 防止数据字典的值是0
if (this.value + '') {
let item = this.columnData.find(tt => (tt[this.valueKey] + '') === (this.value + ''))
const item = this.columnData.find(tt => (tt[this.valueKey] + '') === (this.value + ''))
this.showValue = (item || {})[this.showKey]
} else {
this.showValue = ''
}
},
initDictData() {
//优先从缓存中读取字典配置
if(getDictItemsFromCache(this.dictCode)){
initDictData () {
// 优先从缓存中读取字典配置
if (getDictItemsFromCache(this.dictCode)) {
this.columnData = getDictItemsFromCache(this.dictCode)
return
}
//根据字典Code, 初始化字典数组
// 根据字典Code, 初始化字典数组
ajaxGetDictItems(this.dictCode, null).then((res) => {
if (res.success) {
this.columnData = res.result
}
})
},
onConfirm(value) {
onConfirm (value) {
this.showPicker = false
if (!this.valueKey) {
this.$emit('change', value)
@@ -137,4 +137,4 @@ export default {
<style scoped>
</style>
</style>
+264
View File
@@ -0,0 +1,264 @@
<!-- form表单中下拉框样式的组件-->
<template>
<div>
<van-field
readonly
clickable
name="picker"
:value="showValue"
v-bind="$attrs"
v-on="childListeners"
@click="showPickerFunc"
:rules="rules"
/>
<van-popup v-model="showPicker" style="height: 50vh" :class="{'dict-checkbox-field-popup': multiple}" position="bottom">
<!--background="#3074F6"-->
<van-search
v-if="canSearch"
v-model="searchValue"
placeholder="请输入搜索关键词"
input-align="left"
@search="onSearch"
@clear="onClear"
/>
<template v-if="!multiple">
<van-picker
show-toolbar
:columns="columnDataShow"
@confirm="onConfirm"
@cancel="showPicker = false"
:value-key="showKey"
>
</van-picker>
</template>
<template v-if="multiple">
<div class="item-ope">
<span class="van-picker__cancel" @click="onCancel">取消</span>
<span class="van-picker__confirm" @click="onConfirm">确认</span>
</div>
<van-checkbox-group class="dict-checkbox-group" v-model="checkedArr" ref="checkboxGroup">
<van-checkbox
v-for="(item) in columnDataShow"
:key="item[valueKey]"
:name="item[valueKey]"
shape="square"
>
{{ item[showKey] }}
</van-checkbox>
</van-checkbox-group>
</template>
</van-popup>
</div>
</template>
<script>
export default {
name: 'PickerField',
props: {
value: {
type: [String, Number, Object],
required: false
},
columnData: {
type: Array,
required: false,
default: () => {
return [
// {name: '1name', value: '1', text: 3},
// {name: '2name', value: '2', text: 3},
]
}
},
rules: {
type: [Array, null],
required: false,
default: null
},
// 默认是否有其他值
valueKey: {
type: String,
required: false,
default: 'value'
},
// picker中显示的key值
showKey: {
type: String,
required: false,
default: 'name'
},
readonly: {
type: Boolean,
required: false,
default: false
},
// 是否多选
multiple: {
type: Boolean,
required: false,
default: false
},
// 是否可以查询
canSearch: {
type: Boolean,
required: false,
default: true
},
// 当值不存在于下拉框中,是否要回显传的value
needShowValue: {
type: Boolean,
required: false,
default: false
}
},
data () {
return {
showPicker: false,
showValue: '', // 当前显示的input的值
searchValue: '', // 查询的字段
columnDataShow: [], // 当前显示的下拉框数据
checkedArr: [] // 选中的数据,在多选的情况下使用
}
},
watch: {
value: {
immediate: true,
handler: function () {
this.initVal()
// console.log('--------value----------', this.value)
}
},
columnData: {
immediate: true,
handler: function () {
this.columnDataShow = this.columnData
this.initVal()
// console.log('--------columnData----------', this.columnData)
}
},
showPicker (val) {
this.searchValue = ''
if (val) {
this.columnDataShow = [...this.columnData]
}
}
},
computed: {
// 透传给下级组件的事件,需要排除本组件使用的change事件
childListeners () {
// const vm = this
const result = Object.assign({},
this.$listeners
)
delete result.change
return result
}
},
methods: {
showPickerFunc () {
if (this.readonly || this.$attrs.disabled) return
this.showPicker = true
},
initVal () {
if (!this.multiple) {
if (this.value) {
let item
if (this.columnData.length > 0) {
item = this.columnData.find(tt => (tt[this.valueKey] + '') === (this.value + ''))
}
// 如果下拉列表中没有这一项,就回显值
if (!item) {
this.showValue = this.needShowValue ? this.value : ''
} else {
this.showValue = (item || {})[this.showKey]
}
} else {
this.showValue = ''
}
} else {
// 多选下拉框
if (this.value) {
this.checkedArr = this.value.split(',')
const showArr = []
this.checkedArr.map(item => {
const column = this.columnData.find(tt => (tt[this.valueKey] + '') === (item + ''))
if (column) {
showArr.push((column || {})[this.showKey])
}
this.showValue = showArr.join('')
})
} else {
this.showValue = ''
this.checkedArr = []
}
}
},
onConfirm (value) {
console.log('--------------')
if (!value) return
if (this.multiple) {
if (this.checkedArr.length === 0) {
this.$toast('请至少选择一条数据')
return
}
this.showPicker = false
this.$emit('change', this.checkedArr.join())
} else {
if (!this.valueKey) {
this.$emit('change', value)
} else {
this.showValue = value[this.showKey]
this.$emit('change', value[this.valueKey])
}
this.showPicker = false
}
},
onCancel () {
this.showPicker = false
},
onSearch (val) {
if (val) {
this.columnDataShow = this.columnData.filter(tt => tt[this.showKey].indexOf(val) > -1)
} else {
this.columnDataShow = [...this.columnData]
}
},
onClear () {
this.columnDataShow = [...this.columnData]
}
},
model: {
prop: 'value',
event: 'change'
}
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
/deep/ .dict-checkbox-field-popup {
height: 375px;
font-size: 16px;
.item-ope {
display: flex;
align-items: center;
justify-content: space-between;
height: 44px;
line-height: 44px;
}
.dict-checkbox-group {
padding: @pad-base;
height: calc(100% - 44px - 2 * @pad-base - 54px);
overflow: auto;
div + div {
margin-top: @pad-base;
}
}
}
</style>
+98 -73
View File
@@ -1,106 +1,112 @@
<!-- 选择评价人员 -->
<template>
<div class="list-container">
<van-search
v-model="filters.realname"
show-action
:clearable="true"
input-align="center"
label="姓名"
placeholder="请输入姓名"
@search="onSearch"
>
<template #action>
<div @click="onSearch">搜索</div>
</template>
</van-search>
<van-list
v-model="loading"
:finished="listFinished"
:finished-text="listData.length > 0 ? '没有更多了' : '暂无数据'"
@load="onLoadMore"
:immediate-check="false"
>
<van-checkbox-group v-if="type === 'checkbox'" v-model="checkedArr" ref="checkboxGroup">
<van-swipe-cell
v-for="(item, index) in listData"
:key="index"
:name="index"
stop-propagation
:before-close="handleBeforeClose"
>
<div class="item-box">
<van-checkbox :name="item.id" @click="checkboxClick(item)" shape="square" :disabled="readonly"></van-checkbox>
<div>
<div class="item-title">
<span class="title">{{ item.realname }}</span>
<span class="score">工号({{ item.username || '暂无数据' }})</span>
</div>
<div class="item-content">
<van-popup class="history-list-popup" v-model="isShow" position="right" :style="{ width: '100%', height: '100%' }" >
<!-- 增加一个标题-->
<custom-header :title="$t('selectUser')" :leftArrow="true" :handle-left="handleLeft"></custom-header>
<div class="list-container">
<van-search
v-model="filters.realname"
show-action
:clearable="true"
input-align="center"
label="姓名"
placeholder="请输入姓名"
@search="onSearch"
>
<template #action>
<div @click="onSearch">搜索</div>
</template>
</van-search>
<van-list
v-model="loading"
:finished="listFinished"
:finished-text="listData.length > 0 ? '没有更多了' : '暂无数据'"
@load="onLoadMore"
:immediate-check="false"
>
<van-checkbox-group v-if="type === 'checkbox'" v-model="checkedArr" ref="checkboxGroup">
<van-swipe-cell
v-for="(item, index) in listData"
:key="index"
:name="index"
stop-propagation
:before-close="handleBeforeClose"
>
<div class="item-box">
<van-checkbox :name="item.id" @click="checkboxClick(item)" shape="square" :disabled="readonly"></van-checkbox>
<div>
<div class="item-title">
<span class="title">{{ item.realname }}</span>
<span class="score">工号({{ item.username || '暂无数据' }})</span>
</div>
<div class="item-content">
<span>
<span class="label">角色: </span>
<span class="text">{{ item.roleTxt || '暂无数据' }}</span>
</span>
<span>
<span>
<span class="label">岗位: </span>
<span class="text">{{ item.post || '暂无数据' }}</span>
</span>
</div>
</div>
</div>
</div>
</van-swipe-cell>
</van-checkbox-group>
<van-radio-group v-else v-model="checkedArr" ref="checkboxGroup">
<van-swipe-cell
v-for="(item, index) in listData"
:key="index"
:name="index"
stop-propagation
:before-close="handleBeforeClose"
>
<div class="item-box">
<van-radio :name="item.id" @click="checkboxClick(item)" :disabled="readonly"></van-radio>
<div>
<div class="item-title">
<span class="title">{{ item.realname }}</span>
<span class="score">工号({{ item.username || '暂无数据' }})</span>
</div>
<div class="item-content">
</van-swipe-cell>
</van-checkbox-group>
<van-radio-group v-else v-model="checkedArr" ref="checkboxGroup">
<van-swipe-cell
v-for="(item, index) in listData"
:key="index"
:name="index"
stop-propagation
:before-close="handleBeforeClose"
>
<div class="item-box">
<van-radio :name="item.id" @click="checkboxClick(item)" :disabled="readonly"></van-radio>
<div>
<div class="item-title">
<span class="title">{{ item.realname }}</span>
<span class="score">工号({{ item.username || '暂无数据' }})</span>
</div>
<div class="item-content">
<span>
<span class="label">角色: </span>
<span class="text">{{ item.roleTxt || '暂无数据' }}</span>
</span>
<span>
<span>
<span class="label">岗位: </span>
<span class="text">{{ item.post || '暂无数据' }}</span>
</span>
</div>
</div>
</div>
</div>
</van-swipe-cell>
</van-radio-group>
</van-list>
</van-swipe-cell>
</van-radio-group>
</van-list>
<!-- 底部的按钮 -->
<div class="bottom-button-container">
<div class="bottom-btn bottom-justify-div">
<van-button size="small" color="#C6C7CA" native-type="button" plain :disabled="disabled" @click="resetFunc">重置
</van-button>
<van-button v-if="type === 'checkbox'" size="small" color="#E63636" native-type="button" :disabled="disabled" @click="checkAll">全选</van-button>
<van-button size="small" color="#E63636" native-type="button" :disabled="disabled" @click="confirmFunc()">确定
</van-button>
<van-button size="small" color="#C6C7CA" native-type="button" plain :disabled="disabled" @click="$emit('cancel')">取消
</van-button>
<!-- 底部的按钮 -->
<div class="bottom-button-container">
<div class="bottom-btn bottom-justify-div">
<van-button size="small" color="#C6C7CA" native-type="button" plain :disabled="disabled" @click="resetFunc">重置
</van-button>
<van-button v-if="type === 'checkbox'" size="small" color="#E63636" native-type="button" :disabled="disabled" @click="checkAll">全选</van-button>
<van-button size="small" color="#E63636" native-type="button" :disabled="disabled" @click="confirmFunc()">确定
</van-button>
<van-button size="small" color="#C6C7CA" native-type="button" plain :disabled="disabled" @click="hide()">取消
</van-button>
</div>
</div>
</div>
</div>
</van-popup>
</template>
<script>
import ListMixin from '../mixins/ListMixin'
import CustomHeader from '@/components/CustomHeader'
export default {
name: 'SelectUser',
components: { CustomHeader },
mixins: [ListMixin],
props: {
selectedData: {
@@ -141,6 +147,7 @@ export default {
// },
data () {
return {
isShow: false,
loading: false, // 加载数据的标识,
listFinished: false, // 完成加载的标识
refreshing: false, // 下拉刷新的标志
@@ -164,6 +171,11 @@ export default {
}
},
methods: {
open () {
this.isShow = true
this.initData()
this.getListData()
},
checkboxClick (item) {
console.log(item)
if (this.type === 'checkbox') {
@@ -234,9 +246,16 @@ export default {
this.$emit('selected-change', this.checkedArr)
}
this.$emit('selected-change-name', this.selectedDataArr.map(item => item.realname + '(' + item.username + ')').join(','))
this.hide()
},
onSearch () {
this.getListData()
},
handleLeft () {
this.hide()
},
hide () {
this.isShow = false
}
}
@@ -247,6 +266,12 @@ export default {
@import '~@assets/less/list.less';
@import '~@assets/less/common.less';
.history-list-popup{
background: @global-bg;
display: flex;
flex-direction: column;
}
.list-container{
flex: 1;
display: flex;
+11 -130
View File
@@ -12,30 +12,23 @@
>
</van-field>
<van-popup class="history-list-popup" v-model="isShow" position="right" :style="{ width: '100%', height: '100%' }" >
<!-- 增加一个标题-->
<custom-header :title="$t('selectUser')" :leftArrow="true" :handle-left="handleLeft"></custom-header>
<select-user
ref="evaluatePersonSelectedList"
:selected-data="value"
:filter-data="filterData"
@selected-change="selectedChange"
@selected-change-name="selectedChangeName"
@cancel="hide()"
v-bind="$attrs"
:readonly="readonly"
></select-user>
</van-popup>
<select-user
ref="evaluatePersonSelectedList"
:selected-data="value"
:filter-data="filterData"
@selected-change="selectedChange"
@selected-change-name="selectedChangeName"
v-bind="$attrs"
:readonly="readonly"
></select-user>
</div>
</template>
<script>
import SelectUser from './SelectUser'
import CustomHeader from './CustomHeader'
export default {
name: 'SelectUserField',
components: { SelectUser, CustomHeader },
components: { SelectUser },
props: {
// 选中的多个id 以逗号“,”拼接
value: {
@@ -87,7 +80,6 @@ export default {
},
data () {
return {
isShow: false,
selectedDataNames: ''
}
},
@@ -96,22 +88,13 @@ export default {
if (this.readonly) {
return
}
this.isShow = true
this.$nextTick(() => {
this.$refs.evaluatePersonSelectedList.initData()
this.$refs.evaluatePersonSelectedList.getListData()
this.$refs.evaluatePersonSelectedList.open()
})
},
handleLeft () {
this.hide()
},
hide () {
this.isShow = false
},
// 选择人员组件 选择后返回的方法
selectedChange (value) {
this.$emit('select', value)
this.hide()
},
selectedChangeName (value) {
this.selectedDataNames = value
@@ -128,106 +111,4 @@ export default {
<style scoped lang="less">
@import '~@assets/less/common.less';
.history-list-popup{
background: @global-bg;
display: flex;
flex-direction: column;
}
.van-list{
padding: @pad-base;
flex: 1;
overflow: auto;
}
.item-box .item-title.full-width .title{
width: 100%;
}
// 底部按钮
.bottom-justify-div{
display: flex;
align-items: center;
justify-content: space-around;
.van-button{
padding: 0 @pad-base;
}
}
// 中间内容
.item-box{
background: #FFFFFF;
padding: @pad-base;
& + .item-box{
margin-top: 0.24rem;
}
// 左滑后 样式的变化
&.item-box-has-swipe{
border-radius: 0.1rem 0 0 0.1rem;
.item-state{
border-radius: 0 0 0 0.1rem;
}
}
.van-checkbox{
width: 100%;
display: flex;
align-items: center;
/deep/.van-checkbox__label{
flex: 1;
display: flex;
flex-direction: row;
align-items: center;
margin-left: 0;
}
}
.left-img{
display: flex;
flex-direction: row;
flex-basis: 1.5rem;
.van-image{
width: 1.2rem;
height: 1.2rem;
margin: 0 0.24rem;
}
}
.right-content{
width: 0;
flex: 1;
.title{
width: 3.05rem;
font-weight: bold;
}
.item-title{
font-size: 0.28rem;
text-align: left;
display: flex;
align-items: center;
span {
display: inline-block;
text-align: left;
}
}
.item-content{
padding: 0.2rem 0 0;
span {
display: flex;
align-items: baseline;
color: @font-color;
font-size: 0.22rem;
text-align: left;
white-space: pre-wrap;
word-break: break-all;
}
}
}
}
.history-btn{
padding: 0 @pad-base;
}
//.van-cell{
// padding: 0.27rem 0!important;
//}
</style>
+186
View File
@@ -0,0 +1,186 @@
<!--树形结构的多选组件value-所选树形结构体的id的集合 text所选树形结构名字-->
<template>
<div>
<van-field
v-bind="$attrs"
readonly
clearable
@click="showPopup"
v-model="showValue"
/>
<van-popup
v-model="show"
style="height: 60vh"
position="bottom"
safe-area-inset-bottom
:close-on-click-overlay="false"
:close-on-popstate="true"
>
<div class="popup-box">
<div class="operate">
<span @click="cancel">取消</span>
<span @click="handleOk">确认</span>
</div>
<link-menu
:data="list"
value-key="key"
label-key="title"
:value="selectedDepartTemp"
@input="selected"
:multiple="multiple"
></link-menu>
</div>
</van-popup>
</div>
</template>
<script>
import LinkMenu from './LinkMenu'
export default {
name: 'TreeSelectMultiple',
components: {
LinkMenu
},
props: {
value: {
type: [Object, Array],
required: true,
default: () => []
},
list: {
type: Array,
default: () => []
},
readonly: {
type: Boolean,
required: false,
default: false
},
// 是否多选 默认是true
multiple: {
type: Boolean,
required: false,
default: true
}
},
watch: {
value: {
immediate: true,
deep: true,
handler () {
this.handleInitData()
}
},
list: {
immediate: true,
deep: true,
handler () {
this.handleInitData()
}
}
},
computed: {
// 当前显示的部门名称的字符串
showValue () {
if (this.multiple) {
return this.selectedDepart.map(tt => tt.title).join('')
} else {
return this.selectedDepart.title
}
}
},
data () {
return {
show: false, // 控制popup的显示隐藏
selectedDepart: [], // 选中的部门
selectedDepartTemp: [], // 选中的部门暂存 多选的时候是数组,单选的时候是对象
confirm: false // 是否点击了确认
}
},
methods: {
cancel () {
this.show = false
},
handleOk () {
if (this.multiple) {
this.$emit('input', this.selectedDepartTemp.map(tt => tt.key))
} else {
this.$emit('input', [this.selectedDepartTemp.key])
}
this.show = false
},
// 弹出层显示
showPopup () {
if (this.readonly) return
this.selectedDepartTemp = JSON.parse(JSON.stringify(this.selectedDepart))
this.show = true
},
selected (val) {
// 先临时转换
this.selectedDepartTemp = JSON.parse(JSON.stringify(val))
},
// 初始化数据,将id的形式转成所有对象的形式
handleInitData () {
const selectedDepart = []
this.findSelectedItemByKey(this.list, selectedDepart)
if (this.multiple) {
this.selectedDepart = [...selectedDepart]
} else {
this.selectedDepart = selectedDepart.length > 0 ? selectedDepart[0] : {}
}
},
// 循环遍历数据进行 选中的判断
findSelectedItemByKey (arr, result) {
arr.forEach(item => {
if (this.value.includes(item.key)) {
result.push(item)
}
if (item.children && item.children.length > 0) {
this.findSelectedItemByKey(item.children, result)
}
})
}
}
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
.wrap {
display: flex;
flex-direction: column;
padding: 0 @pad-base;
box-sizing: border-box;
height: 100%;
}
// 解决线上滚动条不灵敏的bug
.popup-box{
height: 100%;
position: relative;
/deep/& > .list-menu {
height: calc(100% - 0.8rem);
overflow: auto;
}
}
.operate {
padding: 0 @pad-base;
box-sizing: border-box;
font-size: 0.3rem;
font-weight: 600;
height: 0.8rem;
display: flex;
justify-content: space-between;
align-items: center;
}
.content {
width: 100%;
flex: 1;
}
</style>