hir_web/src/views/trials/trials-inspection/components/trials-select.vue

320 lines
7.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<el-popover
v-model="visible"
class="trials-select"
placement="top"
trigger="manual"
width="300"
>
<div class="trials-select-box">
<div
style="
position: absolute;
top: 0;
left: 0;
width: 300px;
background: #fff;
padding: 15px 15px 0;
"
>
<el-input
v-model="inputValue"
prefix-icon="el-icon-search"
clearable
@input="inputChange"
/>
<div
style="
display: flex;
justify-content: space-between;
align-items: center;
line-height: 36px;
padding: 0 5px;
"
>
<div
style="
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 150px;
"
>
{{ $t("trials:trials-list:table:researchNumber") }}
</div>
<div
style="
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 80px;
"
>
{{ $t("trials:trials-list:table:sponsor") }}
</div>
<div
style="
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 160px;
"
>
{{ $t("trials:trials-list:table:experimentName") }}
</div>
</div>
</div>
<el-tooltip
placement="left"
class="trials-select"
width="300"
trigger="hover"
:open-delay="500"
v-for="(item, index) of resultFilter"
:key="item.Id"
>
<div slot="content">
{{ $t("trials:trials-list:table:researchNumber") }}:
{{ item.ResearchProgramNo }}
<br />
{{ $t("trials:trials-list:table:sponsor") }}:
{{ item.Sponsor }}
<br />
{{ $t("trials:trials-list:table:experimentName") }}:
{{ item.ExperimentName }}
</div>
<div
class="options_item"
:class="{
selected: item.TrialId === data.TrialId,
selectedIndex: selectIndex === index,
}"
@click.stop="selectTrials(item, index)"
>
<div
style="
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 150px;
"
>
{{ item.ResearchProgramNo }}
</div>
<div
style="
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 80px;
"
>
{{ item.Sponsor }}
</div>
<div
style="
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 160px;
"
>
{{ item.ExperimentName }}
</div>
</div>
</el-tooltip>
</div>
<div
slot="reference"
:class="{ 'trials-select-reference': true, disabled: status === 'visit' }"
@click.stop="status === 'trial' ? (visible = !visible) : false"
>
<el-tooltip content="Top center" placement="top" style="width: 100%">
<div slot="content">
{{ $t("trials:trials-list:table:researchNumber") }}:
{{ data.ResearchProgramNo }}
<br />
{{ $t("trials:trials-list:table:experimentName") }}:
{{ data.ExperimentName }}
<br />
{{ $t("trials:trials-list:table:sponsor") }}:
{{ data.Sponsor }}
</div>
<span class="text-ellipsis"> {{ data.ResearchProgramNo }}</span>
</el-tooltip>
<span class="tip-span">
<span
class="el-icon-arrow-down tip-span"
:class="{ selected: visible }"
/>
</span>
</div>
</el-popover>
</template>
<script>
export default {
name: "trialsSelect",
props: {
options: {
required: true,
default: () => [],
},
data: {
required: true,
default: () => {},
},
status: {
required: true,
default: "trial",
},
},
data() {
return {
visible: false,
resultFilter: [],
inputValue: null,
selectIndex: null,
};
},
mounted() {
document.onkeydown = (e) => {
if (!this.visible) return;
//事件对象兼容
let e1 =
e || event || window.event || arguments.callee.caller.arguments[0];
//键盘按键判断:左箭头-37;上箭头-38右箭头-39;下箭头-40
//左
if (e1 && e1.keyCode == 40) {
// 按下箭头
if (this.resultFilter.length - 1 === this.selectIndex) return;
this.selectIndex++;
} else if (e1 && e1.keyCode == 38) {
// 按上箭头
if (this.selectIndex === 0) return;
this.selectIndex--;
} else if (e1 && e1.keyCode == 13) {
this.selectTrials(
this.resultFilter[this.selectIndex],
this.selectIndex
);
}
document
.querySelector(".trials-select-box")
.scrollTo(
0,
document.querySelector(".options_item.selectedIndex").offsetTop - 200
);
};
},
watch: {
options: {
handler() {
this.resultFilter = this.options.filter(() => true);
},
deep: true,
immediate: true,
},
},
methods: {
selectTrials(item, index) {
this.selectIndex = index;
let obj = JSON.parse(JSON.stringify(this.data));
obj = Object.assign(obj, item);
this.$emit("update:data", obj);
this.visible = false;
},
inputChange(v) {
this.resultFilter = this.options.filter((o) => {
var reg = new RegExp(v, "ig");
return (
reg.test(o.ResearchProgramNo) ||
reg.test(o.ExperimentName) ||
reg.test(o.Sponsor)
);
});
},
},
};
</script>
<style lang="scss" scoped>
.trials-select {
cursor: pointer;
.trials-select-reference {
height: 36px;
line-height: 36px;
border: 1px solid #dcdfe6;
border-radius: 4px;
padding: 0 15px;
padding-right: 30px;
width: 200px;
position: relative;
.tip-span {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
position: absolute;
top: 0;
right: 5px;
}
}
}
.disabled {
background-color: #f5f7fa;
cursor: not-allowed;
}
.trials-select-box {
width: 100%;
max-height: 400px;
height: auto;
overflow-y: auto;
padding-top: 76px;
}
.trials-select-box::-webkit-scrollbar {
display: none; /* Chrome Safari */
}
.trials-select-reference {
line-height: 40px;
height: 40px;
.el-icon-arrow-down {
transition: all 0.3s;
}
.el-icon-arrow-down.selected {
transform: rotate(180deg);
}
}
.options_item {
display: flex;
justify-content: space-between;
cursor: pointer;
line-height: 30px;
padding: 0 5px;
transition: all 0.3s;
&:hover {
background: #eee;
}
}
.options_item.selected {
color: #428bca;
background: #eee;
}
.options_item.selectedIndex {
background: #eee;
}
.text-ellipsis {
display: inline-block;
width: 90%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
}
</style>