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

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>