105 lines
2.9 KiB
Vue
Raw Normal View History

2023-04-02 01:01:56 +08:00
<template>
<div class="relative" :style="{ 'width': width }">
<el-input v-model="modelValue" readonly placeholder="点击选择图标" @click="visible = !visible">
2023-04-03 00:05:09 +08:00
<template #prepend>
2023-11-30 11:13:29 +08:00
<svg-icon :icon-class="modelValue" />
2023-04-03 00:05:09 +08:00
</template>
</el-input>
2023-03-15 15:59:21 +08:00
2023-04-03 00:05:09 +08:00
<el-popover shadow="none" :visible="visible" placement="bottom-end" trigger="click" :width="450">
<template #reference>
<div class="cursor-pointer text-[#999] absolute right-[10px] top-0 height-[32px] leading-[32px]" @click="visible = !visible">
2023-04-03 00:05:09 +08:00
<i-ep-caret-top v-show="visible"></i-ep-caret-top>
<i-ep-caret-bottom v-show="!visible"></i-ep-caret-bottom>
</div>
</template>
2023-03-15 15:59:21 +08:00
<el-input v-model="filterValue" class="p-2" placeholder="搜索图标" clearable @input="filterIcons" />
2023-04-02 01:01:56 +08:00
2023-04-03 00:05:09 +08:00
<el-scrollbar height="w-[200px]">
<ul class="icon-list">
<el-tooltip v-for="(iconName, index) in iconNames" :key="index" :content="iconName" placement="bottom" effect="light">
<li :class="['icon-item', { active: modelValue == iconName }]" @click="selectedIcon(iconName)">
2023-04-03 00:05:09 +08:00
<svg-icon color="var(--el-text-color-regular)" :icon-class="iconName" />
</li>
</el-tooltip>
</ul>
</el-scrollbar>
</el-popover>
</div>
2023-04-02 01:01:56 +08:00
</template>
2023-04-03 00:26:04 +08:00
<script setup lang="ts">
import icons from '@/components/IconSelect/requireIcons';
import { propTypes } from '@/utils/propTypes';
2023-04-03 00:26:04 +08:00
const props = defineProps({
modelValue: propTypes.string.isRequired,
width: propTypes.string.def('400px')
2023-04-03 00:26:04 +08:00
});
const emit = defineEmits(['update:modelValue']);
const visible = ref(false);
const { modelValue, width } = toRefs(props);
const iconNames = ref<string[]>(icons);
const filterValue = ref('');
/**
* 筛选图标
*/
const filterIcons = () => {
if (filterValue.value) {
iconNames.value = icons.filter((iconName) => iconName.includes(filterValue.value));
} else {
iconNames.value = icons;
}
};
2023-04-03 00:26:04 +08:00
/**
* 选择图标
* @param iconName 选择的图标名称
*/
const selectedIcon = (iconName: string) => {
emit('update:modelValue', iconName);
visible.value = false;
};
2023-04-03 00:26:04 +08:00
</script>
2023-04-02 01:01:56 +08:00
<style scoped lang="scss">
2023-08-29 15:48:03 +08:00
.el-scrollbar {
max-height: calc(50vh - 100px) !important;
2023-08-29 15:48:03 +08:00
overflow-y: auto;
}
2023-04-02 01:01:56 +08:00
.el-divider--horizontal {
margin: 10px auto !important;
}
.icon-list {
display: flex;
flex-wrap: wrap;
padding-left: 10px;
margin-top: 10px;
.icon-item {
cursor: pointer;
width: 10%;
margin: 0 10px 10px 0;
padding: 5px;
display: flex;
flex-direction: column;
justify-items: center;
align-items: center;
border: 1px solid #ccc;
&:hover {
border-color: var(--el-color-primary);
color: var(--el-color-primary);
transition: all 0.2s;
transform: scaleX(1.1);
2023-03-15 15:59:21 +08:00
}
}
.active {
border-color: var(--el-color-primary);
color: var(--el-color-primary);
}
2023-03-15 15:59:21 +08:00
}
2023-04-02 01:01:56 +08:00
</style>