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.
232 lines
5.9 KiB
232 lines
5.9 KiB
7 months ago
|
<!-- @format -->
|
||
|
|
||
|
<template>
|
||
|
<div>
|
||
|
<ns-input
|
||
|
v-if="!baseStyle"
|
||
|
class="ns-input-area"
|
||
|
:disabled="true"
|
||
|
v-model:value="itemName"
|
||
|
placeholder="请选择">
|
||
|
<template #addonAfter>
|
||
|
<a-button type="primary" class="ns-area" style="height: 32px" @click="showModal">{{
|
||
|
buttonLabel
|
||
|
}}</a-button>
|
||
|
<!-- <ns-button type="primary" class="ns-area" style="height: 32px" @click="showModal"
|
||
|
>{{ buttonLabel }}
|
||
|
</ns-button> -->
|
||
|
</template>
|
||
|
</ns-input>
|
||
|
<span v-else @click="showModal">{{ buttonLabel }}</span>
|
||
|
<ns-modal
|
||
|
width="1000px"
|
||
|
v-if="visible"
|
||
|
v-model:visible="visible"
|
||
|
:maskClosable="false"
|
||
|
class="modal"
|
||
|
wrapClassName="ns-modeBase"
|
||
|
:title="title">
|
||
|
<div class="ns-basic-modecontent">
|
||
|
<!-- <h4 class="title">{{ title }}</h4> -->
|
||
|
<ns-view-list-table :model="data" v-bind="tableConfig" :row-selection="rowSelection" />
|
||
|
</div>
|
||
|
<template #footer>
|
||
|
<a-button key="back" @click="handleCancel">取消</a-button>
|
||
|
<a-button
|
||
|
key="submit"
|
||
|
:style="{ borderColor: !ischeck ? '#dfe3e9' : '' }"
|
||
|
:disabled="!ischeck"
|
||
|
type="primary"
|
||
|
@click="handleOk"
|
||
|
>确定</a-button
|
||
|
>
|
||
|
</template>
|
||
|
</ns-modal>
|
||
|
</div>
|
||
|
</template>
|
||
|
<script lang="ts">
|
||
|
import { defineComponent, reactive, ref, watch } from 'vue';
|
||
|
export default defineComponent({
|
||
|
name: 'NsInputModal',
|
||
|
props: {
|
||
|
baseStyle: {
|
||
|
type: String,
|
||
|
default: '',
|
||
|
},
|
||
|
title: {
|
||
|
type: String,
|
||
|
default: '',
|
||
|
},
|
||
|
defaultValue: {
|
||
|
type: String,
|
||
|
default: '',
|
||
|
},
|
||
|
showLabel: {
|
||
|
type: String,
|
||
|
},
|
||
|
buttonLabel: {
|
||
|
type: String,
|
||
|
default: '选择',
|
||
|
},
|
||
|
rebackInfo: {
|
||
|
type: Array,
|
||
|
default: () => [],
|
||
|
},
|
||
|
tableConfig: {
|
||
|
type: Object,
|
||
|
default: () => ({}),
|
||
|
},
|
||
|
reName: {
|
||
|
type: Array,
|
||
|
default: () => [],
|
||
|
},
|
||
|
data: {
|
||
|
type: Object,
|
||
|
default: () => ({}),
|
||
|
},
|
||
|
formModel: {
|
||
|
type: Object,
|
||
|
default: () => ({}),
|
||
|
},
|
||
|
},
|
||
|
emits: ['change', 'getItem'],
|
||
|
setup(props) {
|
||
|
// eslint-disable-next-line vue/no-setup-props-destructure
|
||
|
const { showLabel, rebackInfo, tableConfig, data, reName } = props;
|
||
|
const visible = ref(false);
|
||
|
const itemName = ref('');
|
||
|
const showModal = () => {
|
||
|
visible.value = true;
|
||
|
};
|
||
|
const selectItem = ref({});
|
||
|
const ischeck = ref(false);
|
||
|
const handleCancel = () => {
|
||
|
visible.value = false;
|
||
|
};
|
||
|
watch(
|
||
|
() => props.defaultValue,
|
||
|
(e: any) => {
|
||
|
itemName.value = e;
|
||
|
},
|
||
|
);
|
||
|
|
||
|
return {
|
||
|
visible,
|
||
|
showModal,
|
||
|
// eslint-disable-next-line vue/no-dupe-keys
|
||
|
showLabel,
|
||
|
// eslint-disable-next-line vue/no-dupe-keys
|
||
|
rebackInfo,
|
||
|
// eslint-disable-next-line vue/no-dupe-keys
|
||
|
data,
|
||
|
// eslint-disable-next-line vue/no-dupe-keys
|
||
|
tableConfig,
|
||
|
// eslint-disable-next-line vue/no-dupe-keys
|
||
|
reName,
|
||
|
selectItem,
|
||
|
ischeck,
|
||
|
itemName,
|
||
|
handleCancel,
|
||
|
rowSelection: {
|
||
|
type: 'radio',
|
||
|
onSelect: (record: T, selected: Boolean) => {
|
||
|
ischeck.value = true;
|
||
|
selectItem.value = record;
|
||
|
},
|
||
|
},
|
||
|
};
|
||
|
},
|
||
|
methods: {
|
||
|
handleOk() {
|
||
|
if (this.reName.length === 0) {
|
||
|
this.itemName = this.selectItem[this.showLabel];
|
||
|
if (this.rebackInfo.length === 0) {
|
||
|
this.$emit('change', this.selectItem);
|
||
|
this.$emit('getItem', this.selectItem);
|
||
|
} else {
|
||
|
if (this.rebackInfo.length === 1) {
|
||
|
this.$emit('change', this.selectItem[this.rebackInfo[0]]);
|
||
|
this.$emit('getItem', this.selectItem[this.rebackInfo[0]]);
|
||
|
} else {
|
||
|
let info = {};
|
||
|
this.rebackInfo.forEach((item) => {
|
||
|
info[item] = this.selectItem[item];
|
||
|
});
|
||
|
this.$emit('change', info);
|
||
|
this.$emit('getItem', info);
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
if (this.reName.length === this.rebackInfo.length && this.reName.length > 0) {
|
||
|
if (this.rebackInfo.length === 1) {
|
||
|
let info = {};
|
||
|
info[this.reName[0]] = this.selectItem[this.rebackInfo[0]];
|
||
|
this.$emit('change', info);
|
||
|
this.$emit('getItem', info);
|
||
|
} else {
|
||
|
let info = {};
|
||
|
this.rebackInfo.forEach((item, index) => {
|
||
|
info[this.reName[index]] = this.selectItem[item];
|
||
|
});
|
||
|
this.$emit('change', info);
|
||
|
this.$emit('getItem', info);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
this.visible = false;
|
||
|
// this.$emit('ceshi', 'qaq');
|
||
|
//this.$emit('change', this.itemName);
|
||
|
},
|
||
|
},
|
||
|
});
|
||
|
</script>
|
||
|
<style lang="less" scoped>
|
||
|
.ns-area:hover,
|
||
|
// :focus {
|
||
|
// color: white !important;
|
||
|
// }
|
||
|
.ns-area {
|
||
|
color: white;
|
||
|
}
|
||
|
:deep(.ant-input) {
|
||
|
border-right: 0;
|
||
|
}
|
||
|
:deep(.ns-area) {
|
||
|
border: 0;
|
||
|
}
|
||
|
.title {
|
||
|
font-size: 14px;
|
||
|
font-weight: bold;
|
||
|
}
|
||
|
|
||
|
:deep(.ns-line) {
|
||
|
display: none;
|
||
|
}
|
||
|
:deep(.ant-modal-content) {
|
||
|
max-width: 900px;
|
||
|
}
|
||
|
:deep(.ns-form-item) {
|
||
|
width: 250px;
|
||
|
}
|
||
|
:deep(.ant-input-group-addon) {
|
||
|
padding: 0 !important;
|
||
|
border: 0px solid #dcdfe2 !important;
|
||
|
height: 30px !important;
|
||
|
}
|
||
|
:deep(.ant-btn) {
|
||
|
height: 30px !important;
|
||
|
}
|
||
|
// :deep(.ns-table-main) {
|
||
|
// padding: 0 !important;
|
||
|
// }
|
||
|
:deep(.ant-input-disabled) {
|
||
|
color: #172e3d !important;
|
||
|
}
|
||
|
:deep(.ns-table-header){
|
||
|
padding-left:24px;
|
||
|
}
|
||
|
// :deep(.ns-table .ns-table-search) {
|
||
|
// border-bottom: none !important;
|
||
|
// }
|
||
|
</style>
|