|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 897 B |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 867 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 55 KiB |
@ -0,0 +1,82 @@ |
|||
<!-- |
|||
@ 作者: 秦东 |
|||
@ 时间: 2024-04-22 14:39:07 |
|||
@ 备注: 选择图标弹窗 |
|||
--> |
|||
<script lang='ts' setup> |
|||
import SvgIcon from "@/components/SvgIcon/index.vue"; |
|||
import SvgPage from "@/components/IconSelect/svgPage.vue"; |
|||
|
|||
const props = defineProps({ |
|||
isShow:{ |
|||
type: Boolean, |
|||
default: false, |
|||
}, |
|||
svgName:{ |
|||
type:String, |
|||
require: false, |
|||
default:"" |
|||
}, |
|||
iconList:{ |
|||
type:Object, |
|||
default(){ |
|||
return {} |
|||
} |
|||
} |
|||
}); |
|||
const visible = ref(false); // 弹窗显示状态 |
|||
const iconSelectorRef = ref(); |
|||
const iconSelectorDialogRef = ref(); |
|||
const emits = defineEmits(["update:isShow","update:svgName"]); |
|||
const filterIconNames = ref<string[]>([]); |
|||
//点击窗外。取消显示 |
|||
onClickOutside(iconSelectorRef, () => (visible.value = false), { |
|||
ignore: [iconSelectorDialogRef], |
|||
}); |
|||
|
|||
|
|||
watch(() => props.isShow, (val:boolean) =>{ |
|||
if(val){ |
|||
filterIconNames.value = props.iconList |
|||
} |
|||
}) |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2024-04-22 16:43:49 |
|||
@ 功能: 关闭 |
|||
*/ |
|||
const handleClose = () => { |
|||
emits("update:isShow",false) |
|||
} |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2024-04-22 16:54:03 |
|||
@ 功能: 确定 |
|||
*/ |
|||
const sendClick = () => { |
|||
emits("update:svgName","liuChengBiaoDan") |
|||
handleClose() |
|||
} |
|||
</script> |
|||
<template> |
|||
<el-dialog |
|||
v-model="props.isShow" |
|||
title="选择图标" |
|||
width="500" |
|||
:before-close="handleClose" |
|||
> |
|||
<span>{{filterIconNames}}</span> |
|||
|
|||
<template #footer> |
|||
<div class="dialog-footer"> |
|||
<el-button @click="handleClose">取消</el-button> |
|||
<el-button type="primary" @click="sendClick"> |
|||
确定 |
|||
</el-button> |
|||
</div> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
<style lang='scss' scoped> |
|||
|
|||
</style> |
|||
@ -0,0 +1,87 @@ |
|||
<!-- |
|||
@ 作者: 秦东 |
|||
@ 时间: 2024-04-22 16:05:27 |
|||
@ 备注: 图标选择列表 |
|||
--> |
|||
<script lang='ts' setup> |
|||
|
|||
const allIconNames: string[] = []; // 所有的图标名称集合 |
|||
|
|||
const filterValue = ref(""); // 筛选的值 |
|||
const filterIconNames = ref<string[]>([]); // 过滤后的图标名称集合 |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2024-04-22 16:05:52 |
|||
@ 功能: 加载svg |
|||
*/ |
|||
const loadIcons =() => { |
|||
const icons = import.meta.glob("../../assets/icons/*.svg"); |
|||
for (const icon in icons) { |
|||
const iconName = icon.split("assets/icons/")[1].split(".svg")[0]; |
|||
allIconNames.push(iconName); |
|||
} |
|||
filterIconNames.value = allIconNames; |
|||
// console.log("icon 加载--->",allIconNames); |
|||
} |
|||
onMounted(()=>{ |
|||
loadIcons(); |
|||
}) |
|||
</script> |
|||
<template> |
|||
<div class="svgBox"> |
|||
<el-input |
|||
v-model="filterValue" |
|||
class="p-2" |
|||
placeholder="搜索图标" |
|||
clearable |
|||
@input="handleFilter" |
|||
/> |
|||
<el-divider border-style="dashed" style="margin:0px;" /> |
|||
<el-scrollbar height="150px"> |
|||
<ul class="icon_list"> |
|||
<li |
|||
v-for="(iconName, index) in filterIconNames" |
|||
:key="index" |
|||
class="icon-item" |
|||
@click="handleSelect(iconName)" |
|||
> |
|||
<el-tooltip :content="iconName" placement="bottom" effect="light"> |
|||
<svg-icon color="var(--el-text-color-regular)" :icon-class="iconName" /> |
|||
</el-tooltip> |
|||
</li> |
|||
</ul> |
|||
</el-scrollbar> |
|||
</div> |
|||
</template> |
|||
<style lang='scss' scoped> |
|||
.icon_list { |
|||
display: flex; |
|||
flex-wrap: wrap; |
|||
padding-left: 10px; |
|||
margin-top: 10px; |
|||
|
|||
.icon-item { |
|||
display: flex; |
|||
flex-direction: column; |
|||
align-items: center; |
|||
justify-items: center; |
|||
width: 10%; |
|||
padding: 5px; |
|||
margin: 0 5px 5px 0; |
|||
cursor: pointer; |
|||
border: 1px solid #ccc; |
|||
padding: 5px 10px; |
|||
&:hover { |
|||
color: var(--el-color-primary); |
|||
border-color: var(--el-color-primary); |
|||
transition: all 0.2s; |
|||
transform: scaleX(1.1); |
|||
} |
|||
} |
|||
} |
|||
.svgBox{ |
|||
:deep(.el-popper){ |
|||
padding:0px; |
|||
} |
|||
} |
|||
</style> |
|||
@ -0,0 +1,114 @@ |
|||
<!-- |
|||
@ 作者: 秦东 |
|||
@ 时间: 2024-04-22 08:56:40 |
|||
@ 备注: |
|||
--> |
|||
<script lang='ts' setup> |
|||
import type { |
|||
AllowDropType, |
|||
NodeDropType, |
|||
} from 'element-plus/es/components/tree/src/tree.type' |
|||
import SvgIcon from "@/components/SvgIcon/index.vue"; |
|||
import { threeShiyanData } from "@/api/date/type" |
|||
import AppMenuSvgPage from "@/components/IconSelect/appMenuSvgPage.vue"; |
|||
|
|||
const props = defineProps({ |
|||
formKey:{ |
|||
type:String, |
|||
default:"" |
|||
} |
|||
}); |
|||
const svgIsShow = ref(false) |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2024-04-22 10:06:20 |
|||
@ 功能: 树移动完毕后执行的操作 |
|||
*/ |
|||
const handleDrop = ( |
|||
draggingNode: Node, |
|||
dropNode: Node, |
|||
dropType: NodeDropType, |
|||
ev: DragEvents |
|||
) => { |
|||
console.log('tree drop:', dropNode.label, dropNode.key) |
|||
console.log('tree drop-->上级:', dropNode.parent.label, dropNode.parent.key) |
|||
} |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2024-04-22 15:53:35 |
|||
@ 功能: 加载SVG图标 |
|||
*/ |
|||
const allIconNames:string[] = []; |
|||
const loadIcons = () => { |
|||
const icons = import.meta.glob("../../../../assets/icons/*.svg"); |
|||
for (const icon in icons) { |
|||
const iconName = icon.split("assets/icons/")[1].split(".svg")[0]; |
|||
allIconNames.push(iconName); |
|||
} |
|||
console.log("icons",icons) |
|||
console.log("allIconNames",allIconNames) |
|||
} |
|||
onMounted(()=>{ |
|||
loadIcons(); |
|||
}) |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2024-04-22 16:52:03 |
|||
@ 功能: 设置表单图标 |
|||
*/ |
|||
const svgName = ref("") |
|||
const setAppMenusSvg = (val:any) =>{ |
|||
svgName.value = val.svg |
|||
svgIsShow.value = true; |
|||
} |
|||
</script> |
|||
<template> |
|||
<el-tree |
|||
:data="threeShiyanData" |
|||
draggable |
|||
default-expand-all |
|||
node-key="id" |
|||
:expand-on-click-node="false" |
|||
@node-drop="handleDrop" |
|||
> |
|||
<template #default="{ node, data }"> |
|||
<div class="appMenuTitle"> |
|||
<el-space wrap> |
|||
<svg-icon prefix="icon" :icon-class="data.svg" @click="setAppMenusSvg(data)" /> |
|||
<el-text>{{node.label}}</el-text> |
|||
</el-space> |
|||
<el-dropdown> |
|||
<svg-icon class="svgBox" prefix="icon" icon-class="set" /> |
|||
<template #dropdown> |
|||
<el-dropdown-item>修改名称</el-dropdown-item> |
|||
<el-dropdown-item>复制</el-dropdown-item> |
|||
<el-dropdown-item>移动到</el-dropdown-item> |
|||
<el-dropdown-item divided>新建子分组</el-dropdown-item> |
|||
<el-dropdown-item>新建普通表单</el-dropdown-item> |
|||
<el-dropdown-item>新建流程表单</el-dropdown-item> |
|||
<el-dropdown-item divided>隐藏PC端</el-dropdown-item> |
|||
<el-dropdown-item>隐藏移动端</el-dropdown-item> |
|||
<el-dropdown-item divided><el-text class="mx-1" type="danger">删除</el-text></el-dropdown-item> |
|||
</template> |
|||
</el-dropdown> |
|||
</div> |
|||
|
|||
</template> |
|||
</el-tree> |
|||
<AppMenuSvgPage v-model:is-show="svgIsShow" v-model:svg-name="svgName" :icon-list="allIconNames" /> |
|||
</template> |
|||
<style lang='scss' scoped> |
|||
.appMenuTitle{ |
|||
width: 100%; |
|||
padding-right: 5px; |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: space-between; |
|||
.svgBox{ |
|||
display: none; |
|||
} |
|||
} |
|||
.appMenuTitle:hover .svgBox{ |
|||
display: block; |
|||
} |
|||
</style> |
|||