|
|
@@ -19,13 +19,10 @@
|
|
|
<el-tab-pane v-for="item in tabsData" :key="item.name" lazy :name="item.name">
|
|
|
<template #label>{{ item.name }}<el-tag type="info" size="small">{{ item.icons.length }}</el-tag></template>
|
|
|
|
|
|
- <div class="sc-icon-select__list">
|
|
|
+ <div v-loading="loading" class="sc-icon-select__list">
|
|
|
<el-scrollbar>
|
|
|
<ul @click="selectIcon">
|
|
|
- <template v-if="!item.icons.length">
|
|
|
- <el-empty :image-size="100" description="未查询到相关图标" />
|
|
|
- <sc-iconify :icon="searchText" @load="load"></sc-iconify>
|
|
|
- </template>
|
|
|
+ <el-empty v-if="!item.icons.length" :image-size="100" description="未查询到相关图标" />
|
|
|
<li :class="icon == value ? 'select-icon' : ''" v-for="icon in item.icons" :key="icon">
|
|
|
<span :data-icon="icon"></span>
|
|
|
<sc-iconify :icon="icon"></sc-iconify>
|
|
|
@@ -56,8 +53,13 @@ export default {
|
|
|
|
|
|
data() {
|
|
|
return {
|
|
|
+ loading: false,
|
|
|
activeName: "默认",
|
|
|
- tabsData: XEUtils.clone(config.icons, true),
|
|
|
+ iconifys: [],
|
|
|
+ tabsData: [
|
|
|
+ ...XEUtils.clone(config.icons, true),
|
|
|
+ { name: "Iconify", icons: [] }
|
|
|
+ ],
|
|
|
|
|
|
value: "",
|
|
|
dialogVisible: false,
|
|
|
@@ -81,18 +83,20 @@ export default {
|
|
|
|
|
|
mounted() {
|
|
|
this.value = this.modelValue;
|
|
|
- if (this.modelValue) {
|
|
|
- this.activeName = config.selectIcon(this.modelValue).prefix ? config.selectIcon(this.modelValue).name : "Iconify";
|
|
|
- this.tabsData[2].icons.push(this.modelValue);
|
|
|
- }
|
|
|
},
|
|
|
|
|
|
methods: {
|
|
|
open() {
|
|
|
if (this.disabled) return false;
|
|
|
this.dialogVisible = true;
|
|
|
+
|
|
|
this.searchText = "";
|
|
|
- if (this.value && !config.selectIcon(this.value).prefix) this.tabsData[2].icons = XEUtils.uniq([...this.tabsData[2].icons, this.value]);
|
|
|
+ this.activeName = this.value ? config.selectIcon(this.value).name || "Iconify" : "默认";
|
|
|
+ if (this.activeName == "Iconify") {
|
|
|
+ this.iconifys = XEUtils.uniq([...this.iconifys, this.value]);
|
|
|
+ this.tabsData[2].icons = XEUtils.clone(this.iconifys, true);
|
|
|
+ }
|
|
|
+
|
|
|
nextTick(() => document.querySelector(".select-icon")?.scrollIntoView({ block: "center" }));
|
|
|
},
|
|
|
|
|
|
@@ -107,22 +111,23 @@ export default {
|
|
|
this.dialogVisible = false;
|
|
|
},
|
|
|
|
|
|
- search(text) {
|
|
|
+ search: XEUtils.debounce(async function(text) {
|
|
|
let filterData = XEUtils.clone(config.icons, true);
|
|
|
- if (this.value && !config.selectIcon(this.value).prefix) filterData[2].icons = XEUtils.uniq([...filterData[2].icons, this.value]);
|
|
|
+ let iconifyIcons = XEUtils.clone(this.iconifys, true)
|
|
|
|
|
|
if (text) {
|
|
|
- XEUtils.arrayEach(filterData, item => {
|
|
|
- item.icons = XEUtils.filter(item.icons, icon => icon.toLowerCase().includes(text.toLowerCase()))
|
|
|
- })
|
|
|
+ XEUtils.arrayEach(filterData, item => item.icons = XEUtils.filter(item.icons, icon => icon.toLowerCase().includes(text.toLowerCase())));
|
|
|
+
|
|
|
+ this.loading = true;
|
|
|
+ iconifyIcons = await this.fetchIconify(text);
|
|
|
+ this.loading = false;
|
|
|
}
|
|
|
|
|
|
- this.tabsData = filterData;
|
|
|
- },
|
|
|
+ this.tabsData = [...filterData, { name: "Iconify", icons: iconifyIcons }];
|
|
|
+ }, 600),
|
|
|
|
|
|
- load() {
|
|
|
- this.activeName = "Iconify";
|
|
|
- this.tabsData[2].icons = XEUtils.uniq([...this.tabsData[2].icons, this.searchText]);
|
|
|
+ fetchIconify(query) {
|
|
|
+ return new Promise(resolve => this.$API.common.iconify.get({ limit: 99999, query }).then(res => resolve(res.icons)).catch(() => resolve([])));
|
|
|
}
|
|
|
}
|
|
|
}
|