Files
ruoyi-ui/src/views/tool/build/IconsDialog.vue
2022-12-16 17:26:54 +08:00

120 lines
2.5 KiB
Vue

<template>
<div class="icon-dialog">
<el-dialog
v-bind="$attrs"
width="980px"
:modal-append-to-body="false"
@open="onOpen"
@close="onClose"
>
<!-- v-on="$listeners" -->
<div slot="title">
选择图标
<el-input
v-model="key"
size="small"
:style="{ width: '260px' }"
placeholder="请输入图标名称"
prefix-icon="search"
clearable
/>
</div>
<ul class="icon-ul">
<li
v-for="icon in iconList"
:key="icon"
:class="active === icon ? 'active-item' : ''"
@click="onSelect(icon)"
>
<ElIcon>
<component :is="icon"></component>
</ElIcon>
<div>{{ icon }}</div>
</li>
</ul>
</el-dialog>
</div>
</template>
<script setup>
import iconListJson from "@/utils/generator/icon.json";
import { ref, toRefs, watch } from "vue";
// const originList = iconListJson.map((name) => `el-icon-${name}`);
const inheritAttrs = false;
const emit = defineEmits(["select", "update:modelValue"]);
const props = defineProps(["current"]);
const { current } = toRefs(props);
const iconList = ref(iconListJson);
const active = ref(null);
const key = ref("");
watch(key, (val) => {
if (val) {
iconList.value = iconListJson.filter((name) => name.indexOf(val) > -1);
} else {
iconList.value = iconListJson;
}
});
const onOpen = () => {
active.value = current.value;
key.value = "";
};
const onClose = () => {};
const onSelect = (icon) => {
active.value = icon;
emit("select", icon);
emit("update:modelValue", false);
};
</script>
<style lang="scss" scoped>
.icon-ul {
margin: 0;
padding: 0;
font-size: 0;
li {
list-style-type: none;
text-align: center;
font-size: 14px;
display: inline-block;
width: 16.66%;
box-sizing: border-box;
height: 108px;
padding: 15px 6px 6px 6px;
cursor: pointer;
overflow: hidden;
&:hover {
background: #f2f2f2;
}
&.active-item {
background: #e1f3fb;
color: #7a6df0;
}
> i {
font-size: 30px;
line-height: 50px;
}
}
}
.icon-dialog {
:deep(.el-dialog) {
border-radius: 8px;
margin-bottom: 0;
margin-top: 4vh !important;
display: flex;
flex-direction: column;
max-height: 92vh;
overflow: hidden;
box-sizing: border-box;
.el-dialog__header {
padding-top: 14px;
}
.el-dialog__body {
margin: 0 20px 20px 20px;
padding: 0;
overflow: auto;
}
}
}
</style>