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.

270 lines
7.0 KiB

6 months ago
<template>
<div>
<a-form-item-rest>
<div class="shuttleFrame-form-input" @click="openModal" v-if="openMode == 'input'">
<div class="shuttleFrame-form-input-field_select">
<span class="shuttleFrame-deep-select">
<span class="shuttleFrame-deep-select-input">
<span class="shuttleFrame-deep-select-typeAlert">
<button class="shuttleFrame-deep-select-button">
<plus-circle-outlined />
{{ searchType == 'dept' ? '选择部门' : '选择人员' }}
</button>
</span>
<span v-if="selectedValueAll.length > 0" class="shuttleFrame-deep-select-text">
<span
class="shuttleFrame-deep-select-text-name"
v-for="(item, index) in selectedValueAll"
:key="index">
{{ item.name }}
</span>
</span>
</span>
</span>
</div>
</div>
<div v-else>
<button @click="openModal">权限</button>
</div>
<ns-modal
v-model:visible="pageFormVisible"
:maskClosable="false"
style="width: 80%"
:keyboard="false"
:title="title"
:ok-button-props="{ disabled: emitData.length <= 0 }"
@ok="pageFormOk"
:destroyOnClose="true"
okText="确认"
cancelText="取消"
@cancel="pageFormCancel">
<NsShuttleFrameOuter ref="nsShuttleFrameOuter" :tabs="tabs" />
</ns-modal>
</a-form-item-rest>
</div>
</template>
<script lang="ts">
import { defineComponent, inject, provide, reactive, ref, unref, watch } from 'vue';
import { PlusCircleOutlined } from '@ant-design/icons-vue';
import mitt from 'mitt';
type selectedObj = {
id?: number;
name?: string;
type?: string;
};
export default defineComponent({
name: 'NsShuttleFrame',
components: { PlusCircleOutlined },
props: {
openMode: {
type: String,
default: 'input',
},
searchType: {
type: String,
default: 'dept',
},
tabs: {
type: Array,
},
title: {
type: String,
default: '设置成员',
},
value: [Array, String],
},
emits: ['change'],
setup(props, ctx) {
console.log('props', props);
const lmEmitter = mitt();
provide('lmEmitter', lmEmitter);
const emitData = ref([]);
const selectedValueAll = ref<selectedObj[]>([]);
lmEmitter.on('setEmitData', (val: []) => {
emitData.value = val;
});
const pageFormVisible = ref(false);
const modalTypeTitle = ref('');
const pageFormRef = ref();
const pageFormOk = () => {
pageFormVisible.value = false;
selectedValueAll.value = JSON.parse(JSON.stringify(emitData.value));
let data;
if (props.openMode == 'input') {
if (props.tabs[0].filterMultiple) {
data = [];
selectedValueAll.value.map((item) => {
data.push(item.name);
});
} else {
data = selectedValueAll.value[0].name;
}
ctx.emit('change', data);
} else {
ctx.emit('change', selectedValueAll.value);
}
};
const pageFormCancel = () => {};
const nsShuttleFrameOuter = ref(null);
const openModal = () => {
pageFormVisible.value = true;
let sendData = JSON.parse(JSON.stringify(selectedValueAll.value));
setTimeout(() => {
lmEmitter.emit('setDefaultDataMAD', sendData);
lmEmitter.emit('setDefaultDataMOD', sendData);
}, 100);
};
watch(
() => props.value,
(val) => {
selectedValueAll.value = [];
if (val) {
if (props.openMode == 'input') {
if (!props.tabs[0].filterMultiple) {
selectedValueAll.value = [
{
name: val,
type: props.searchType,
},
];
} else {
val.map((item) => {
selectedValueAll.value.push({
name: item,
type: props.searchType,
});
});
}
}
}
},
{ immediate: true, deep: true },
);
return {
pageFormVisible,
pageFormRef,
pageFormOk,
modalTypeTitle,
pageFormCancel,
openModal,
emitData,
selectedValueAll,
nsShuttleFrameOuter,
};
},
});
</script>
<style lang="less" scoped>
.shuttleFrame-form-input {
display: flex;
-webkit-box-align: start;
align-items: flex-start;
&-field_select {
flex: 1;
overflow: hidden;
}
.shuttleFrame-deep-select {
width: 100%;
display: inline-block;
.icon-add {
transform: scale(1);
margin-left: 0;
margin-right: 4px;
display: inline-block;
vertical-align: middle;
font-family: NextIcon;
font-style: normal;
font-weight: 400;
text-transform: none;
-webkit-font-smoothing: antialiased;
&::before {
width: 12px;
font-size: 12px;
line-height: inherit;
content: '\e8b5';
display: inline-block;
vertical-align: middle;
text-align: center;
color: #171a1d;
}
}
&-input {
display: inline-flex;
-webkit-box-align: baseline;
white-space: nowrap;
align-items: baseline;
height: auto;
padding: 3px 8px 0 3px;
width: 100%;
min-width: 100px;
outline: 0;
vertical-align: middle;
border-collapse: separate;
font-size: 0;
line-height: 1;
border-spacing: 0;
transition: all 0.1s linear;
border: 1px solid #e5e6e8;
border-radius: 6px;
cursor: pointer;
}
&-typeAlert {
display: inline-block;
line-height: inherit;
vertical-align: top;
margin-bottom: 3px;
width: auto;
font-size: 14px;
white-space: nowrap;
button {
border-radius: 6px;
padding: 0 8px;
height: 28px;
font-size: 12px;
border-width: 1px;
border-style: solid;
background: #fff;
border-color: #e5e6e8;
cursor: pointer;
}
}
&-button:hover {
border: 1px solid @primary-color;
color: @primary-color;
}
&-text {
line-height: 22px;
height: 22px;
display: inline !important;
font-size: 14px;
margin-left: 6px;
&-name {
vertical-align: middle;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
display: inline-block;
margin-right: 6px;
}
}
}
}
</style>