123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- <template>
- <j-modal
- title="选择部门"
- :width="modalWidth"
- :visible="visible"
- :confirmLoading="confirmLoading"
- @ok="handleSubmit"
- @cancel="handleCancel"
- @update:fullscreen="isFullscreen"
- wrapClassName="j-depart-select-modal"
- switchFullscreen
- cancelText="关闭">
- <a-spin tip="Loading..." :spinning="false">
- <a-input-search style="margin-bottom: 1px" placeholder="请输入部门名称按回车进行搜索" @search="onSearch" />
- <a-tree
- checkable
- :class="treeScreenClass"
- :treeData="treeData"
- :checkStrictly="checkStrictly"
- @check="onCheck"
- @select="onSelect"
- @expand="onExpand"
- :autoExpandParent="autoExpandParent"
- :expandedKeys="expandedKeys"
- :checkedKeys="checkedKeys">
- <template slot="title" slot-scope="{title}">
- <span v-if="title.indexOf(searchValue) > -1">
- {{title.substr(0, title.indexOf(searchValue))}}
- <span style="color: #f50">{{searchValue}}</span>
- {{title.substr(title.indexOf(searchValue) + searchValue.length)}}
- </span>
- <span v-else>{{title}}</span>
- </template>
- </a-tree>
- </a-spin>
- <!--底部父子关联操作和确认取消按钮-->
- <template slot="footer" v-if="treeOpera && multi">
- <div class="drawer-bootom-button">
- <a-dropdown style="float: left" :trigger="['click']" placement="topCenter">
- <a-menu slot="overlay">
- <a-menu-item key="1" @click="switchCheckStrictly(1)">父子关联</a-menu-item>
- <a-menu-item key="2" @click="switchCheckStrictly(2)">取消关联</a-menu-item>
- </a-menu>
- <a-button>
- 树操作 <a-icon type="up" />
- </a-button>
- </a-dropdown>
- <a-button @click="handleCancel" type="primary" style="margin-right: 0.8rem">关闭</a-button>
- <a-button @click="handleSubmit" type="primary" >确认</a-button>
- </div>
- </template>
- </j-modal>
- </template>
- <script>
- import { queryDepartTreeList } from '@/api/api'
- export default {
- name: 'JSelectDepartModal',
- props:['modalWidth','multi','rootOpened','departId', 'store', 'text','treeOpera'],
- data(){
- return {
- visible:false,
- confirmLoading:false,
- treeData:[],
- autoExpandParent:true,
- expandedKeys:[],
- dataList:[],
- checkedKeys:[],
- checkedRows:[],
- searchValue:"",
- checkStrictly: true,
- fullscreen:false
- }
- },
- created(){
- this.loadDepart();
- },
- watch:{
- departId(){
- this.initDepartComponent()
- },
- visible: {
- handler() {
- this.initDepartComponent(true)
- }
- }
- },
- computed:{
- treeScreenClass() {
- return {
- 'my-dept-select-tree': true,
- 'fullscreen': this.fullscreen,
- }
- },
- },
- methods:{
- show(){
- this.visible=true
- this.checkedRows=[]
- this.checkedKeys=[]
- },
- loadDepart(){
- // 这个方法是找到所有的部门信息
- queryDepartTreeList().then(res=>{
- if(res.success){
- let arr = [...res.result]
- this.reWriterWithSlot(arr)
- this.treeData = arr
- this.initDepartComponent()
- if(this.rootOpened){
- this.initExpandedKeys(res.result)
- }
- }
- })
- },
- initDepartComponent(flag){
- let arr = []
- //该方法两个地方用 1.visible改变事件重新设置选中项 2.组件编辑页面回显
- let fieldName = flag==true?'key':this.text
- if(this.departId){
- let arr2 = this.departId.split(',')
- for(let item of this.dataList){
- if(arr2.indexOf(item[this.store])>=0){
- arr.push(item[fieldName])
- }
- }
- }
- if(flag==true){
- this.checkedKeys = [...arr]
- }else{
- this.$emit("initComp", arr.join(','))
- }
- },
- reWriterWithSlot(arr){
- for(let item of arr){
- if(item.children && item.children.length>0){
- this.reWriterWithSlot(item.children)
- let temp = Object.assign({},item)
- temp.children = {}
- this.dataList.push(temp)
- }else{
- this.dataList.push(item)
- item.scopedSlots={ title: 'title' }
- }
- }
- },
- initExpandedKeys(arr){
- if(arr && arr.length>0){
- let keys = []
- for(let item of arr){
- if(item.children && item.children.length>0){
- keys.push(item.id)
- }
- }
- this.expandedKeys=[...keys]
- //全部keys
- //this.allTreeKeys = [...keys]
- }else{
- this.expandedKeys=[]
- //this.allTreeKeys = []
- }
- },
- onCheck (checkedKeys,info) {
- if(!this.multi){
- let arr = checkedKeys.checked.filter(item => this.checkedKeys.indexOf(item) < 0)
- this.checkedKeys = [...arr]
- this.checkedRows = (this.checkedKeys.length === 0) ? [] : [info.node.dataRef]
- }else{
- if(this.checkStrictly){
- this.checkedKeys = checkedKeys.checked
- }else{
- this.checkedKeys = checkedKeys
- }
- this.checkedRows = this.getCheckedRows(this.checkedKeys)
- }
- },
- onSelect(selectedKeys,info) {
- //取消关联的情况下才走onSelect的逻辑
- if(this.checkStrictly){
- let keys = []
- keys.push(selectedKeys[0])
- if(!this.checkedKeys || this.checkedKeys.length===0 || !this.multi){
- this.checkedKeys = [...keys]
- this.checkedRows=[info.node.dataRef]
- }else{
- let currKey = info.node.dataRef.key
- if(this.checkedKeys.indexOf(currKey)>=0){
- this.checkedKeys = this.checkedKeys.filter(item=> item !==currKey)
- }else{
- this.checkedKeys.push(...keys)
- }
- }
- this.checkedRows = this.getCheckedRows(this.checkedKeys)
- }
- },
- onExpand (expandedKeys) {
- this.expandedKeys = expandedKeys
- this.autoExpandParent = false
- },
- handleSubmit(){
- if(!this.checkedKeys || this.checkedKeys.length==0){
- this.$emit("ok",'')
- }else{
- let checkRow = this.getCheckedRows(this.checkedKeys)
- let keyStr = this.checkedKeys.join(",")
- this.$emit("ok", checkRow, keyStr)
- }
- this.handleClear()
- },
- handleCancel(){
- this.handleClear()
- },
- handleClear(){
- this.visible=false
- this.checkedKeys=[]
- },
- getParentKey(currKey,treeData){
- let parentKey
- for (let i = 0; i < treeData.length; i++) {
- const node = treeData[i]
- if (node.children) {
- if (node.children.some(item => item.key === currKey)) {
- parentKey = node.key
- } else if (this.getParentKey(currKey, node.children)) {
- parentKey = this.getParentKey(currKey, node.children)
- }
- }
- }
- return parentKey
- },
- onSearch(value){
- const expandedKeys = this.dataList.map((item) => {
- if (item.title.indexOf(value) > -1) {
- return this.getParentKey(item.key,this.treeData)
- }
- return null
- }).filter((item, i, self) => item && self.indexOf(item) === i)
- Object.assign(this, {
- expandedKeys,
- searchValue: value,
- autoExpandParent: true,
- })
- },
- // 根据 checkedKeys 获取 rows
- getCheckedRows(checkedKeys) {
- const forChildren = (list, key) => {
- for (let item of list) {
- if (item.id === key) {
- return item
- }
- if (item.children instanceof Array) {
- let value = forChildren(item.children, key)
- if (value != null) {
- return value
- }
- }
- }
- return null
- }
- let rows = []
- for (let key of checkedKeys) {
- let row = forChildren(this.treeData, key)
- if (row != null) {
- rows.push(row)
- }
- }
- return rows
- },
- switchCheckStrictly (v) {
- if(v==1){
- this.checkStrictly = false
- }else if(v==2){
- this.checkStrictly = true
- }
- },
- isFullscreen(val){
- this.fullscreen=val
- }
- }
- }
- </script>
- <style lang="less" scoped>
- // 限制部门选择树高度,避免部门太多时点击确定不便
- .my-dept-select-tree{
- height:350px;
-
- &.fullscreen{
- height: calc(100vh - 250px);
- }
- overflow-y: scroll;
- }
- .drawer-bootom-button {
- position: absolute;
- bottom: 0;
- width: 100%;
- border-top: 1px solid #e8e8e8;
- padding: 10px 16px;
- text-align: right;
- left: 0;
- background: #fff;
- border-radius: 0 0 2px 2px;
- }
- </style>
|