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.

234 lines
7.0 KiB

7 months ago
<template>
<div>
<div>
<h2>{{ title }} </h2>
<div class="shuttleFrame">
<div class="shuttleFrame-left">
<div v-if="tabs?.length <= 1">
<shuttleFrameMemberAndDept
v-if="tabs[0].searchType == 'account' && tabs[0].useScenario == 'component'"
functionType="component"
:searchType="tabs[0].searchType"
:filterMultiple="tabs[0].filterMultiple || false"
:api="tabs[0].api"
@selected="selected" />
<shuttleFrameDeptOrMember
v-else-if="tabs[0].searchType == 'dept' && tabs[0].useScenario == 'component'"
functionType="component"
:placeholder="tabs[0].placeholder"
:searchType="tabs[0].searchType"
:filterMultiple="tabs[0].filterMultiple || false"
:api="tabs[0].api"
@selected="selected" />
</div>
<a-tabs v-else v-model:activeKey="activeKey">
<a-tab-pane v-for="(item, index) in tabs" :key="index">
<shuttleFrameMemberAndDept
v-if="item.useScenario == 'jurisdiction' && item.searchType == 'account'"
:placeholder="item.placeholder"
:filterMultiple="item.filterMultiple || false"
:searchType="item.searchType"
:api="item.api"
@selected="selected" />
<shuttleFrameDeptOrMember
v-if="item.useScenario == 'jurisdiction' && item.searchType == 'dept'"
:placeholder="item.placeholder"
:filterMultiple="item.filterMultiple || false"
:searchType="item.searchType"
:api="item.api"
@selected="selected" />
</a-tab-pane>
<!-- <a-tab-pane key="0" tab="部门">
<shuttleFrameDept
placeholder="搜索部门"
:filterMultiple="true"
componentRef="organization"
type="dept"
ref="organization"
@selected="selected" />
</a-tab-pane> -->
<!-- <a-tab-pane key="1" tab="人员" force-render>
<shuttleFrameMember
functionType="jurisdiction"
ref="memberJurisdiction"
componentRef="memberJurisdiction"
@selected="selected" />
</a-tab-pane> -->
<!-- <a-tab-pane key="2" tab="组件人员" force-render>
<shuttleFrameMember
functionType="component"
ref="memberComponent"
componentRef="memberComponent"
@selected="selected" />
</a-tab-pane> -->
<!-- <a-tab-pane key="3" tab="人员单选" force-render>
<shuttleFrameDept
placeholder="搜索人员"
:filterMultiple="false"
type="account"
ref="account"
componentRef="account"
@selected="selected" />
</a-tab-pane> -->
</a-tabs>
</div>
<div class="shuttleFrame-right">
<p class="shuttleFrame-right-title"
>已选择({{ selectedValueAll.length }})
<span class="shuttleFrame-right-title-delAll" @click="delAll">清空</span>
</p>
<div class="shuttleFrame-right-select">
<span
v-for="(item, index) in selectedValueAll"
:key="index"
class="shuttleFrame-right-select-span">
<a-tag :closable="true" @close="closeTag(item)" :key="index">
<ns-icon
class="iconfont"
style="vertical-align: text-top; width: 12px; height: 12px"
:name="item.type == 'account' ? 'selectedAccount' : 'dept'" />
{{ item.name }}</a-tag
>
</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, inject, ref, unref, watch } from 'vue';
import shuttleFrameDeptOrMember from './shuttleFrameDeptOrMember.vue';
import shuttleFrameMemberAndDept from './shuttleFrameMemberAndDept.vue';
import { remove } from 'lodash-es';
import mitt, { Emitter } from 'mitt';
type selectedObj = {
id: number;
name?: string;
type?: string;
componentRef?: string;
};
type tabsObj = {
placeholder?: string;
searchType?: string;
filterMultiple?: boolean;
useScenario?: string;
api?: object;
};
export default defineComponent({
name: 'NsShuttleFrameOuter',
components: {
shuttleFrameDeptOrMember,
shuttleFrameMemberAndDept,
},
props: {
title: String,
tabs: {
type: Array<tabsObj>,
default: [],
},
// default: Object,
},
setup(props) {
console.log('NsShuttleFrameOuter', props.tabs);
const activeKey = ref('1');
// const selectedValue = ref<any>([]);
const selectedValueAll = ref<any>([]);
const memberJurisdiction = ref();
const memberComponent = ref();
const organization = ref();
const account = ref();
function selected(val: Array, type: String) {
if (type == 'add') {
selectedValueAll.value =
selectedValueAll.value.length > 0 ? selectedValueAll.value.concat(val) : val;
} else if (type == 'del') {
val.map((item: selectedObj) => {
remove(unref(selectedValueAll.value), (elem: selectedObj) => {
return (
elem.id === item.id &&
elem.type == item.type &&
elem.componentRef == item.componentRef
);
});
});
}
}
//发送给app.vue
const lmEmitter = inject('lmEmitter') as Emitter<emitEvents>;
watch(
() => selectedValueAll.value,
(val) => {
lmEmitter.emit('setEmitData', val);
},
);
//单个清除
function closeTag(item) {
lmEmitter.emit('deleteSelected', item);
}
//清空
function delAll() {
lmEmitter.emit('deleteAllSelected');
}
return {
activeKey,
selected,
// selectedValue,
memberComponent,
memberJurisdiction,
organization,
closeTag,
delAll,
selectedValueAll,
account,
};
},
});
</script>
<style lang="less" scoped>
.shuttleFrame {
display: flex;
justify-content: space-between;
width: 100%;
&-left {
width: 50%;
border-right: 1px solid #f0f0f0;
padding-right: 14px;
}
&-right {
width: 50%;
padding-left: 12px;
padding-top: 6px;
&-title {
color: #747677;
}
&-title-delAll {
float: right;
color: @primary-color;
cursor: pointer;
}
&-select {
&-span {
}
}
}
}
:deep(.ant-tag) {
color: #747677;
background-color: #f1f2f3;
margin-bottom: 8px;
}
:deep(.ant-tabs-top > .ant-tabs-nav::before) {
border-bottom: none;
}
</style>