|
|
@@ -1,25 +1,65 @@
|
|
|
<template>
|
|
|
- <div class="tagWrapper">
|
|
|
+ <div
|
|
|
+ class="tagWrapper"
|
|
|
+ @mouseenter="isHover = true"
|
|
|
+ @mouseleave="isHover = false"
|
|
|
+ :style="{ opacity: isHover ? 0.7 : 1 }"
|
|
|
+ >
|
|
|
<ElTag
|
|
|
hit
|
|
|
:type="props.isActive ? '' : 'info'"
|
|
|
:class="{ isOpen: props.isOpen, isClose: !props.isOpen }"
|
|
|
- >{{ props.label }}</ElTag
|
|
|
+ @click="handleHit"
|
|
|
>
|
|
|
+ {{ props.label }}
|
|
|
+ </ElTag>
|
|
|
+ <el-icon v-show="isHover" color="#8f8f8f" style="margin: 4px" @click="handleRemoveAlgo">
|
|
|
+ <CircleCloseFilled />
|
|
|
+ </el-icon>
|
|
|
</div>
|
|
|
</template>
|
|
|
<script lang="ts" setup>
|
|
|
- const props = defineProps<{ isActive: boolean; label: string; isOpen: boolean }>();
|
|
|
+ import { CircleCloseFilled } from '@element-plus/icons-vue';
|
|
|
+ import { ref } from 'vue';
|
|
|
+
|
|
|
+ const props = defineProps<{
|
|
|
+ isActive: boolean;
|
|
|
+ label: string;
|
|
|
+ isOpen: boolean;
|
|
|
+ algoId: number;
|
|
|
+ }>();
|
|
|
+ const emits = defineEmits<{
|
|
|
+ (e: 'onRemove', algoId: number): Promise<unknown>;
|
|
|
+ (e: 'onHit', algoId: number): Promise<unknown>;
|
|
|
+ }>();
|
|
|
+
|
|
|
+ const isHover = ref(false);
|
|
|
+
|
|
|
+ const handleRemoveAlgo = () => {
|
|
|
+ emits('onRemove', props.algoId);
|
|
|
+ };
|
|
|
+
|
|
|
+ const handleHit = () => {
|
|
|
+ emits('onHit', props.algoId);
|
|
|
+ };
|
|
|
</script>
|
|
|
<style scoped>
|
|
|
.tagWrapper {
|
|
|
margin: 10px 0;
|
|
|
cursor: pointer;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ }
|
|
|
+
|
|
|
+ .el-tag--info.isOpen {
|
|
|
+ background-color: #fafafa;
|
|
|
+ color: #409eff;
|
|
|
+ border-color: #909399;
|
|
|
}
|
|
|
|
|
|
.el-tag--info.isClose {
|
|
|
background-color: #fafafa;
|
|
|
- color: #bfbfbf;
|
|
|
- border-color: #dadada;
|
|
|
+ color: #909399;
|
|
|
+ border-color: #909399;
|
|
|
}
|
|
|
</style>
|