[update] 企标立项、变更流程
This commit is contained in:
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user