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.
294 lines
7.5 KiB
294 lines
7.5 KiB
<template>
|
|
<div>
|
|
<el-dialog :visible.sync="dialogVisible">
|
|
<template>
|
|
<div class="select">
|
|
<Select
|
|
v-model="select.filter[0].key"
|
|
style="width: 100px"
|
|
placeholder="搜索条目"
|
|
>
|
|
<Option v-for="item in fields" :key="item.id" :value="item.field">{{
|
|
item.name
|
|
}}</Option>
|
|
</Select>
|
|
<Select
|
|
v-model="select.filter[0].op"
|
|
style="width: 100px; margin-left: 10px"
|
|
placeholder="搜索条件"
|
|
>
|
|
<Option v-for="item in op" :key="item.value" :value="item.value">{{
|
|
item.label
|
|
}}</Option>
|
|
</Select>
|
|
<template v-if="select.filter[0].op !== 'range'">
|
|
<Input
|
|
clearable
|
|
v-model="select.filter[0].value"
|
|
style="width: 150px; margin-left: 10px"
|
|
placeholder="请填写关键词"
|
|
/>
|
|
</template>
|
|
<template v-else>
|
|
<Input
|
|
:value="select.filter[0].value.split(',')[0]"
|
|
style="width: 150px; margin-left: 10px"
|
|
placeholder="范围开始关键词"
|
|
@input="(e) => inputStartHandler(e, select.filter[0])"
|
|
/>
|
|
<span style="margin-left: 10px; display: flex; align-items: center"
|
|
>至</span
|
|
>
|
|
<Input
|
|
:value="select.filter[0].value.split(',')[1]"
|
|
style="width: 150px; margin-left: 10px"
|
|
placeholder="范围结束关键词"
|
|
@input="(e) => inputEndHandler(e, select.filter[0])"
|
|
/>
|
|
</template>
|
|
<Button
|
|
style="margin-left: 10px"
|
|
type="primary"
|
|
@click="$refs['table'].getTableData(true)"
|
|
>查询</Button
|
|
>
|
|
</div>
|
|
<xy-table
|
|
:is-first-req="false"
|
|
ref="table"
|
|
:row-key="(row) => row.id"
|
|
:height="380"
|
|
:action="index"
|
|
:delay-req="true"
|
|
:req-opt="select"
|
|
:table-item="columns"
|
|
@row-click="rowPick"
|
|
@loaded="selectRows"
|
|
@select="selectBk"
|
|
></xy-table>
|
|
</template>
|
|
<template #footer>
|
|
<span>
|
|
<el-button size="mini" @click="dialogVisible = false"
|
|
>取 消</el-button
|
|
>
|
|
<el-button size="mini" type="primary" @click="confirm"
|
|
>确 定</el-button
|
|
>
|
|
</span>
|
|
</template>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { op } from '@/const/op'
|
|
import { index } from "@/api/system/baseForm";
|
|
import { index as customFormIndex, show } from "@/api/system/customForm";
|
|
export default {
|
|
props: {
|
|
linkType: String,
|
|
linkTableName: String,
|
|
field: String,
|
|
originalRows: {
|
|
default: () => [],
|
|
type: Array,
|
|
},
|
|
},
|
|
data() {
|
|
return {
|
|
op,
|
|
tempRow: {},
|
|
dialogVisible: false,
|
|
select: {
|
|
table_name: "",
|
|
table_id: "",
|
|
filter: [
|
|
{
|
|
key: '',
|
|
op: '',
|
|
value: ''
|
|
}
|
|
]
|
|
},
|
|
fields: [],
|
|
columns: [],
|
|
originalRowIds: [],
|
|
};
|
|
},
|
|
methods: {
|
|
index,
|
|
show() {
|
|
this.dialogVisible = true;
|
|
},
|
|
hide() {
|
|
this.dialogVisible = false;
|
|
},
|
|
|
|
//target要为内存地址引用类型
|
|
inputStartHandler(e, target) {
|
|
let temp = target?.value.split(",")[1];
|
|
target.value = `${e},${temp ? temp : ""}`;
|
|
},
|
|
inputEndHandler(e, target) {
|
|
let temp = target?.value.split(",")[0];
|
|
target.value = `${temp ? temp : ""},${e}`;
|
|
},
|
|
|
|
async getDataTableName() {
|
|
if (this.linkType === "hasMany" || this.linkType === "newHasMany") {
|
|
const tables = (
|
|
await customFormIndex({
|
|
page: 1,
|
|
page_size: 999,
|
|
})
|
|
)?.data;
|
|
|
|
const id = tables?.find((i) => i.table_name === this.linkTableName)?.id;
|
|
const res = (
|
|
await show(
|
|
{
|
|
id,
|
|
},
|
|
false
|
|
)
|
|
)?.relation[0]?.link_table_name;
|
|
|
|
this.select.table_name = res;
|
|
this.select.table_id = tables.find(
|
|
(i) => i.table_name === this.select.table_name
|
|
)?.id;
|
|
}
|
|
if (this.linkType === "hasOne" || this.linkType === "newHasOne") {
|
|
const tables = (
|
|
await customFormIndex({
|
|
page: 1,
|
|
page_size: 999,
|
|
})
|
|
)?.data;
|
|
|
|
const table = tables?.find((i) => i.table_name === this.linkTableName);
|
|
this.select.table_name = table.table_name;
|
|
this.select.table_id = table.id;
|
|
}
|
|
},
|
|
async getColumns() {
|
|
const res = await show(
|
|
{
|
|
id: this.select.table_id,
|
|
},
|
|
false
|
|
);
|
|
|
|
console.log(res);
|
|
this.fields = res.fields;
|
|
this.columns = res.fields
|
|
?.filter((i) => i.list_show)
|
|
.map((i) => {
|
|
let linkOb = {};
|
|
|
|
if (
|
|
i.select_item &&
|
|
typeof i.select_item === "object" &&
|
|
!(i.select_item instanceof Array)
|
|
) {
|
|
let keys = Object.keys(i.select_item);
|
|
linkOb.customFn = (row) => {
|
|
let paramMap = new Map();
|
|
keys.forEach((key) => {
|
|
paramMap.set(i.select_item[key], key);
|
|
});
|
|
|
|
return <span>{paramMap.get(row[i.field]?.toString())}</span>;
|
|
};
|
|
}
|
|
|
|
return Object.assign(
|
|
{
|
|
prop: i.field,
|
|
label: i.name,
|
|
width: i.width,
|
|
fixed: i.is_fixed,
|
|
},
|
|
linkOb
|
|
);
|
|
});
|
|
this.columns.unshift({
|
|
type: "index",
|
|
width: 50,
|
|
});
|
|
|
|
if (this.linkType === "hasMany" || this.linkType === "newHasMany") {
|
|
this.columns.unshift({
|
|
type: "selection",
|
|
width: 50,
|
|
reserveSelection: true,
|
|
});
|
|
}
|
|
},
|
|
|
|
selectRows() {
|
|
this.originalRowIds.forEach((id) => {
|
|
let data = this.$refs["table"].getListData();
|
|
|
|
let row = data.find((i) => i.id === id);
|
|
if (row) {
|
|
this.$refs["table"].toggleRowSelection(row);
|
|
}
|
|
});
|
|
},
|
|
rowPick({ row }) {
|
|
this.tempRow = row;
|
|
},
|
|
selectBk(selections, row) {
|
|
if (!selections.find((i) => i.id === row.id)) {
|
|
this.originalRowIds.splice(this.originalRowIds.indexOf(row.id), 1);
|
|
}
|
|
},
|
|
confirm() {
|
|
this.linkType === "hasMany" || this.linkType === "newHasMany"
|
|
? this.$emit("confirm", {
|
|
field: this.field,
|
|
value: Array.from(
|
|
new Set([
|
|
...this.$refs["table"].getSelection()?.map((i) => i.id),
|
|
...this.originalRowIds,
|
|
])
|
|
),
|
|
})
|
|
: this.$emit("confirm", {
|
|
field: this.field,
|
|
value: this.tempRow.id,
|
|
});
|
|
this.dialogVisible = false;
|
|
},
|
|
},
|
|
computed: {},
|
|
watch: {
|
|
async linkTableName(newVal) {
|
|
await this.getDataTableName();
|
|
await this.getColumns();
|
|
await this.$refs["table"].getTableData();
|
|
},
|
|
dialogVisible(newVal) {
|
|
if (newVal) {
|
|
} else {
|
|
this.tempRow = {};
|
|
this.$refs["table"].clearSelection();
|
|
}
|
|
},
|
|
originalRows(newVal) {
|
|
this.originalRowIds = newVal.map((i) => i[this.field]);
|
|
|
|
this.selectRows();
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.select {
|
|
margin-bottom: 10px;
|
|
}
|
|
</style>
|