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.
269 lines
7.0 KiB
269 lines
7.0 KiB
<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>
|
|
|