middle-admin-ant/src/application/mk/components/editors/MkFormDataSelector.vue

462 lines
13 KiB
Vue

<template>
<div class="edit-down-table">
<vxe-pulldown class="edit-down-pulldown" ref="xDown" transfer>
<template>
<vxe-input class="edit-down-input" ref="inputx" :type="enalbedPopup ? 'search' : 'input'" v-model="textboxValue"
:readonly="readonly" @keyup="keyupEvent" @keydown="keydownEvent" :placeholder="placeholder" @click="clickEvent"
@suffix-click="suffixClick" @focus="onFocus" @search-click="popupEvent"></vxe-input>
<div style="margin-top: 10px;" v-if="buttons && buttons.length">
<a-icon v-for="(btn, index) in buttons" :key="index" @click="buttonClick(btn)" :type="btn.type"
:style="{ fontSize: '26px', color: '#08c' }"></a-icon>
</div>
</template>
<template #dropdown>
<vxe-grid :keyboard-config="{ isArrow: true }" auto-resize height="400" ref="xgrid"
:row-config="{ isCurrent: true, isHover: true }" :loading="loading" :pager-config="tablePage" :data="tableData"
:columns="tableColumn" :treeConfig="treeConfig" @cell-click="selectEvent" @page-change="pageChangeEvent">
</vxe-grid>
</template>
</vxe-pulldown>
<vxe-modal show-footer class-name="vxe-table--ignore-clear edit-popup-box" title="选择数据" :width="modalWidth"
:height="modalHeight" v-model="modalVisible" @confirm="confirmEvent">
<!-- vxe-modal 有以下属性
show-footer 显示底部按钮
width 宽度
height 高度
v-model 显示隐藏
@confirm 确认按钮事件
-->
<template #default>
<component :is="popupPage" ref="popup" :pageOptions="popupPageOptions" :pageMode="popupPageMode"></component>
</template>
</vxe-modal>
</div>
</template>
<script>
import BASE_URL from '@/services/base/api.js'; // 加载api地址
export default {
name: 'MkFormDataSelector', // 组件名称
props: { // 组件属性
readonly: Boolean,
params: Object,
value: [Array, String, Object]
},
data() {
return {
actions: { // api地址
getList: `${BASE_URL}/api/web/listdata` // 获取列表数据
},
actionParams: null,
buttons: [],
modalVisible: false, // 弹出框显示
lastKey: '', // 上次输入的值
modelName: '', // 模块名称
orderBy: '', // 排序
textboxValue: '', // 输入框值
placeholder: '', // 提示
row: null, // 行
column: null, // 列
loading: false, // 加载中
tableData: [], // 表格数据
enalbedPopup: false, // 是否启用弹出框
popupPage: null, // 弹出框页面
popupPageOptions: {}, // 弹出框页面参数
popupPageMode: '', // 弹出框页面模式
tableColumn: [ // 表格列
{ field: 'name', title: '名称' }, // 字段名称,字段标题
{ field: 'code', title: '编码' } // 字段名称,字段标题
],
treeConfig: null,
modalWidth: 800, // 弹出框宽度
modalHeight: 600, // 弹出框高度
searchFieldNames: ['name'], // 搜索字段
tablePage: { // 表格分页
total: 0, // 总数
currentPage: 1, // 当前页
pageSize: 100 // 每页显示条数
}
}
},
created() { // 创建
this.load() // 加载
this.heightInit(); // 高度初始化
const { params } = this
if (params.autoFocus) {
this.$nextTick(() => {
setTimeout(() => {
this.$refs.inputx.focus();
}, 100)
});
}
},
beforeDestroy() {
},
watch: {
value() {
const { params } = this
if (params.dataType == "string") {
this.textboxValue = this.value || "";
}
else if (params.dataType == "object") {
if (this.value) {
this.textboxValue = this.getShowValue({ obj: this.value, path: params.textField });
}
}
else if (this.value && this.value[1]) {
this.textboxValue = this.value[1];
} else {
this.textboxValue = "";
}
}
},
methods: {
getShowValue({ obj, path }) {
const parts = path.split('.');
let value = obj;
for (let i = 0; i < parts.length; i++) {
const part = parts[i];
if (!value[part]) return null;
value = value[part];
}
return value;
},
heightInit() { // 高度初始化
this.$nextTick(() => { // 下一次
this.modalHeight = this.$mk.getWindowSize().height * 0.9; // 弹出框高度
this.modalWidth = this.$mk.getWindowSize().width * 0.9; // 弹出框宽度
});
},
load() { // 加载
const { params } = this // 参数
if (params) { // 如果参数存在
this.modelName = params.modelName; // 模块名称
this.orderBy = params.orderBy; // 排序
this.placeholder = params.placeholder; // 提示
if (params.searchFieldNames) { // 如果搜索字段存在
this.searchFieldNames = params.searchFieldNames; // 搜索字段
}
if (params.columns) { // 如果列存在
this.tableColumn = params.columns; // 表格列
}
if (params.treeConfig) {
this.treeConfig = params.treeConfig;
}
if (params.popup) { // 如果弹出框存在
this.enalbedPopup = true; // 是否启用弹出框
this.popupPage = params.popup.page; // 弹出框页面
}
if (params.dataUrl) {
this.actions.getList = params.dataUrl;
}
if (params.actionParams) {
this.actionParams = params.actionParams;
}
}
if (params.dataType == "string") {
this.textboxValue = this.value || "";
}
else if (params.dataType == "object") {
if (this.value) {
this.textboxValue = this.getShowValue({ obj: this.value, path: params.textField });
}
}
else if (params && params.dataType == 'mapper') {
this.textboxValue = this.row[params.showField];
}
else if (this.value && this.value[1]) {
this.textboxValue = this.value[1];
} else {
this.textboxValue = "";
}
let f = params.listdataFieldName || "Records";
this.getData().then(data => {
if ('Total' in data) {
this.tablePage.total = data.Total;
} else {
this.tablePage.total = data.total;
}
this.tableData = data[f];
});
},
getData(key) { // 获取数据
var params = Object.assign({}, this.params.actionParams || {}) // 定义请求参数
params.page = this.tablePage.currentPage; // 当前页码
params.limit = this.tablePage.pageSize; // 每页条数
params.order_bys = params.order_bys || []; // 排序信息
params.search_rules = params.search_rules || []; // 搜索信息
if (key) {
key = this.$mk.trim(key);
}
if (key) {
for (let i = 0; i < this.searchFieldNames.length; i++) {
let field = this.searchFieldNames[i];
params.search_rules.push({ // 添加搜索参数
column: field, // 字段名
mode: "like", // 搜索模式
value: "%" + key + "%" // 值
});
}
}
return this.$mk.getPagedData({
url: this.actions.getList,
useBigInt: true,
data: params
});
},
clickEvent() { // 点击事件
if (this.readonly) { // 如果只读
return; // 返回
}
this.$refs.xDown.showPanel() // 显示面板
},
handleScanInput(event) {
const { params } = this
const input = event.target;
const inputValue = input.value;
this.scanEntry = input.value;
if (event.key === 'Enter') {
setTimeout(() => {
input.value = '';
this.scanEntry = '';
}, 10);
if (params.scan) {
console.log(inputValue)
params.scan({ value: inputValue, input: input })
}
}
},
keydownEvent(e) {
const { params } = this
if (params.scan) {
this.handleScanInput(e.$event);
}
},
keyupEvent(e) {
const { params } = this
if (this.readonly) {
return;
}
let keyCode = e.$event.keyCode;
if (keyCode == 38 || keyCode == 113 || keyCode == 115) {
return;
}
if (keyCode == 40) {
this.$refs.xDown.showPanel()
const grid = this.$refs.xgrid;
console.log(grid)
if (!grid) return;
grid.focus();
let row = grid.getCurrentRecord();
var ds = grid.getTableData();
if (!row) {
grid.setCurrentRow(ds.tableData[0]);
}
return false;
}
if (keyCode == 13) {
const grid = this.$refs.xgrid;
if (!grid) return;
let row = grid.getCurrentRecord();
this.selectEvent({
row: row
})
return false;
}
const cellValue = this.textboxValue;
if (!cellValue) {
if (params.dataType == "string") {
this.$emit('input', "");
if (params.onDataChanged) {
params.onDataChanged({ value: "" })
}
}
else if (params.dataType == "object") {
this.$emit('input', null);
if (params.onDataChanged) {
params.onDataChanged({ value: null })
}
}
else {
this.$emit('input', ["", ""]);
if (params.onDataChanged) {
params.onDataChanged({ value: ["", ""] })
}
}
}
this.loading = true // 加载
let f = params.listdataFieldName || "Records";
this.getData(cellValue).then(data => {
this.loading = false
if ('Total' in data) {
this.tablePage.total = data.Total;
} else {
this.tablePage.total = data.total;
}
this.tableData = data[f];
})
},
onFocus(){
const { params } = this
console.log(params)
if (params.focusToLoad) {
const cellValue = this.textboxValue;
let f = params.listdataFieldName || "Records";
this.loading = true
this.getData(cellValue).then(data => {
this.loading = false
if ('Total' in data) {
this.tablePage.total = data.Total;
} else {
this.tablePage.total = data.total;
}
this.tableData = data[f];
})
}
},
suffixClick() { // 后缀点击事件
this.$refs.xDown.togglePanel();
},
pageChangeEvent({ currentPage, pageSize }) { // 分页改变事件
this.tablePage.currentPage = currentPage
this.tablePage.pageSize = pageSize
this.loading = true
const { params } = this
let f = params.listdataFieldName || "Records";
this.getData(this.lastKey).then(data => {
this.loading = false
if ('Total' in data) {
this.tablePage.total = data.Total;
} else {
this.tablePage.total = data.total;
}
this.tableData = data[f];
})
},
selectEvent(e) { // 选择事件
const { params } = this
let textField = params.textField;
this.textboxValue = e.row[textField];
if (params.dataType == "string") {
this.$emit('input', e.row[textField]);
}
else if (params.dataType == "object") {
this.$emit('input', e.row);
}
else if (params.dataType == 'mapper') {
if (params.showField) {
this.$emit('input', e.row[params.showField]);
}
}
else {
this.$emit('input', [e.row.ID, e.row[textField]]);
}
if (params.onDataChanged) {
params.onDataChanged({ value: [e.row.ID, e.row[textField]], data: e.row })
}
this.$refs.xDown.hidePanel()
},
popupEvent() {
console.log("popupEvent");
this.modalVisible = true;
},
confirmEvent() {
const { params } = this
let selectedRow = this.$refs.popup.getSelectdRow();
let textField = params.textField;
this.textboxValue = selectedRow[textField];
this.modalVisible = false;
if (params.dataType == "string") {
this.$emit('input', selectedRow[textField]);
}
else if (params.dataType == "object") {
this.$emit('input', selectedRow);
}
else if (params.dataType == 'mapper') {
if (params.showField) {
this.$emit('input', selectedRow[params.showField]);
}
}
else {
this.$emit('input', [selectedRow.ID, selectedRow[textField]]);
}
if (params.onDataChanged) {
params.onDataChanged({ value: [selectedRow.ID, selectedRow[textField]], data: selectedRow })
}
}
}
}
</script>
<style>
.edit-down-pulldown {
width: 100%;
}
.edit-down-wrapper {
width: 600px;
height: 300px;
background-color: #fff;
border: 1px solid #dcdfe6;
box-shadow: 0 0 6px 2px rgba(0, 0, 0, 0.1);
}
</style>