mirror of
https://gitee.com/dromara/go-view.git
synced 2025-04-22 13:36:23 +08:00
chore: 完成锁定及隐藏,列表方式功能占位
This commit is contained in:
parent
04539d605d
commit
e559ca928a
@ -60,7 +60,9 @@ import {
|
|||||||
FolderOpen as FolderOpenIcon,
|
FolderOpen as FolderOpenIcon,
|
||||||
Image as ImageIcon,
|
Image as ImageIcon,
|
||||||
Images as ImagesIcon,
|
Images as ImagesIcon,
|
||||||
List as ListIcon
|
List as ListIcon,
|
||||||
|
EyeOutline as EyeOutlineIcon,
|
||||||
|
EyeOffOutline as EyeOffOutlineIcon
|
||||||
} from '@vicons/ionicons5'
|
} from '@vicons/ionicons5'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@ -220,7 +222,10 @@ const ionicons5 = {
|
|||||||
// 多个图片
|
// 多个图片
|
||||||
ImagesIcon,
|
ImagesIcon,
|
||||||
// 列表
|
// 列表
|
||||||
ListIcon
|
ListIcon,
|
||||||
|
// 眼睛
|
||||||
|
EyeOutlineIcon,
|
||||||
|
EyeOffOutlineIcon
|
||||||
}
|
}
|
||||||
|
|
||||||
const carbon = {
|
const carbon = {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="go-content-layers-group-list-item">
|
<div class="go-content-layers-group-list-item">
|
||||||
<div
|
<div
|
||||||
class="root-item-content"
|
class="root-item-content"
|
||||||
:class="{ hover: hover, select: select }"
|
:class="{ hover: hover, select: select, 'list-mini': layerMode === 'text' }"
|
||||||
@click="clickHandle($event)"
|
@click="clickHandle($event)"
|
||||||
@mousedown="groupMousedownHandle($event)"
|
@mousedown="groupMousedownHandle($event)"
|
||||||
@mouseenter="mouseenterHandle(componentGroupData)"
|
@mouseenter="mouseenterHandle(componentGroupData)"
|
||||||
@ -18,11 +18,13 @@
|
|||||||
<folder-icon></folder-icon>
|
<folder-icon></folder-icon>
|
||||||
</template>
|
</template>
|
||||||
</n-icon>
|
</n-icon>
|
||||||
<n-ellipsis>
|
<n-ellipsis style="margin-right: auto">
|
||||||
<n-text class="go-ml-2 list-text" :depth="2">
|
<n-text class="go-ml-2 list-text" :depth="2">
|
||||||
{{ componentGroupData.chartConfig.title }}
|
{{ componentGroupData.chartConfig.title }}
|
||||||
</n-text>
|
</n-text>
|
||||||
</n-ellipsis>
|
</n-ellipsis>
|
||||||
|
<n-icon size="12" class="list-status-icon" :component="LockClosedOutlineIcon" />
|
||||||
|
<n-icon size="12" class="list-status-icon" :component="EyeOffOutlineIcon" />
|
||||||
</div>
|
</div>
|
||||||
<div :class="{ 'select-modal': select }"></div>
|
<div :class="{ 'select-modal': select }"></div>
|
||||||
</div>
|
</div>
|
||||||
@ -31,6 +33,7 @@
|
|||||||
v-for="element in componentGroupData.groupList"
|
v-for="element in componentGroupData.groupList"
|
||||||
:key="element.id"
|
:key="element.id"
|
||||||
:componentData="element"
|
:componentData="element"
|
||||||
|
:layer-mode="layerMode"
|
||||||
@mousedown="mousedownHandle($event, element, componentGroupData.id)"
|
@mousedown="mousedownHandle($event, element, componentGroupData.id)"
|
||||||
@mouseenter="mouseenterHandle(element)"
|
@mouseenter="mouseenterHandle(element)"
|
||||||
@mouseleave="mouseleaveHandle(element)"
|
@mouseleave="mouseleaveHandle(element)"
|
||||||
@ -50,13 +53,21 @@ import { useContextMenu, divider } from '@/views/chart/hooks/useContextMenu.hook
|
|||||||
import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d'
|
import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d'
|
||||||
import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
|
import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
|
||||||
import { LayersListItem } from '../LayersListItem'
|
import { LayersListItem } from '../LayersListItem'
|
||||||
import throttle from 'lodash/throttle'
|
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
|
import { LayerModeEnum } from '../../enums'
|
||||||
|
|
||||||
|
const { LockClosedOutlineIcon, EyeOffOutlineIcon } = icon.ionicons5
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
componentGroupData: {
|
componentGroupData: {
|
||||||
type: Object as PropType<CreateComponentGroupType>,
|
type: Object as PropType<CreateComponentGroupType>,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
layerMode: {
|
||||||
|
type: Object as PropType<LayerModeEnum>,
|
||||||
|
default(): LayerModeEnum {
|
||||||
|
return 'thumbnail'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -148,7 +159,11 @@ const groupMousedownHandle = (e: MouseEvent) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 公共点击事件
|
// 公共点击事件
|
||||||
const mousedownHandle = (e: MouseEvent, componentInstance: CreateComponentType | CreateComponentGroupType, id?: string) => {
|
const mousedownHandle = (
|
||||||
|
e: MouseEvent,
|
||||||
|
componentInstance: CreateComponentType | CreateComponentGroupType,
|
||||||
|
id?: string
|
||||||
|
) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
|
|
||||||
@ -169,6 +184,7 @@ const mouseleaveHandle = (componentInstance: CreateComponentType | CreateCompone
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
$centerHeight: 52px;
|
$centerHeight: 52px;
|
||||||
|
$centerMiniHeight: 28px;
|
||||||
$textSize: 10px;
|
$textSize: 10px;
|
||||||
|
|
||||||
@include go(content-layers-group-list-item) {
|
@include go(content-layers-group-list-item) {
|
||||||
@ -178,6 +194,11 @@ $textSize: 10px;
|
|||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
@extend .go-transition-quick;
|
@extend .go-transition-quick;
|
||||||
|
|
||||||
|
:deep(.go-content-layers-list-item) {
|
||||||
|
margin-right: 0 !important;
|
||||||
|
width: 95% !important;
|
||||||
|
}
|
||||||
|
|
||||||
.root-item-content {
|
.root-item-content {
|
||||||
height: $centerHeight;
|
height: $centerHeight;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
@ -196,6 +217,17 @@ $textSize: 10px;
|
|||||||
border: 1px solid v-bind('themeColor') !important;
|
border: 1px solid v-bind('themeColor') !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// mini样式
|
||||||
|
&.list-mini {
|
||||||
|
height: $centerMiniHeight;
|
||||||
|
.item-content {
|
||||||
|
height: calc(#{$centerMiniHeight} - 10px) !important;
|
||||||
|
}
|
||||||
|
.select-modal {
|
||||||
|
height: calc(#{$centerMiniHeight} + 2px) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.select-modal,
|
.select-modal,
|
||||||
.item-content {
|
.item-content {
|
||||||
@ -220,5 +252,9 @@ $textSize: 10px;
|
|||||||
padding-left: 6px;
|
padding-left: 6px;
|
||||||
font-size: $textSize;
|
font-size: $textSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.list-status-icon {
|
||||||
|
margin-left: 3px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="go-content-layers-list-item" :class="{ hover: hover, select: select }">
|
<div class="go-content-layers-list-item" :class="{ hover: hover, select: select, 'list-mini': layerMode === 'text' }">
|
||||||
<div class="go-flex-center item-content">
|
<div class="go-flex-center item-content">
|
||||||
<n-image
|
<n-image
|
||||||
class="list-img"
|
class="list-img"
|
||||||
@ -8,21 +8,27 @@
|
|||||||
:src="image"
|
:src="image"
|
||||||
:fallback-src="requireErrorImg()"
|
:fallback-src="requireErrorImg()"
|
||||||
></n-image>
|
></n-image>
|
||||||
<n-ellipsis>
|
<n-ellipsis style="margin-right: auto">
|
||||||
<n-text class="list-text" :depth="2">
|
<n-text class="list-text" :depth="2">
|
||||||
{{ props.componentData.chartConfig.title }}
|
{{ props.componentData.chartConfig.title }}
|
||||||
</n-text>
|
</n-text>
|
||||||
</n-ellipsis>
|
</n-ellipsis>
|
||||||
|
<n-icon size="12" class="list-status-icon" :component="LockClosedOutlineIcon" />
|
||||||
|
<n-icon size="12" class="list-status-icon" :component="EyeOffOutlineIcon" />
|
||||||
</div>
|
</div>
|
||||||
<div :class="{ 'select-modal': select }"></div>
|
<div :class="{ 'select-modal': select }"></div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { toRefs, computed } from 'vue'
|
import { toRefs, computed, PropType } from 'vue'
|
||||||
import { requireErrorImg } from '@/utils'
|
import { requireErrorImg } from '@/utils'
|
||||||
import { useDesignStore } from '@/store/modules/designStore/designStore'
|
import { useDesignStore } from '@/store/modules/designStore/designStore'
|
||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
|
import { LayerModeEnum } from '../../enums'
|
||||||
|
|
||||||
|
import { icon } from '@/plugins'
|
||||||
|
const { LockClosedOutlineIcon, EyeOffOutlineIcon } = icon.ionicons5
|
||||||
|
|
||||||
// 全局颜色
|
// 全局颜色
|
||||||
const designStore = useDesignStore()
|
const designStore = useDesignStore()
|
||||||
@ -37,6 +43,12 @@ const props = defineProps({
|
|||||||
componentData: {
|
componentData: {
|
||||||
type: Object,
|
type: Object,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
layerMode: {
|
||||||
|
type: Object as PropType<LayerModeEnum>,
|
||||||
|
default(): LayerModeEnum {
|
||||||
|
return 'thumbnail'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -56,6 +68,7 @@ const hover = computed(() => {
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
$centerHeight: 52px;
|
$centerHeight: 52px;
|
||||||
|
$centerMiniHeight: 28px;
|
||||||
$textSize: 10px;
|
$textSize: 10px;
|
||||||
|
|
||||||
@include go(content-layers-list-item) {
|
@include go(content-layers-list-item) {
|
||||||
@ -72,15 +85,7 @@ $textSize: 10px;
|
|||||||
&:hover {
|
&:hover {
|
||||||
@include fetch-bg-color('background-color4');
|
@include fetch-bg-color('background-color4');
|
||||||
}
|
}
|
||||||
/* 选中 */
|
|
||||||
&.select {
|
|
||||||
border: 1px solid v-bind('themeColor');
|
|
||||||
/* 需要设置最高级,覆盖 hover 的颜色 */
|
|
||||||
background-color: rgba(0, 0, 0, 0);
|
|
||||||
.list-img {
|
|
||||||
border: 1px solid v-bind('themeColor') !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.select-modal,
|
.select-modal,
|
||||||
.item-content {
|
.item-content {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -94,24 +99,46 @@ $textSize: 10px;
|
|||||||
width: calc(100% - 10px);
|
width: calc(100% - 10px);
|
||||||
height: calc(100% - 10px);
|
height: calc(100% - 10px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.select-modal {
|
.select-modal {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
opacity: 0.3;
|
opacity: 0.3;
|
||||||
background-color: v-bind('themeColor');
|
background-color: v-bind('themeColor');
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-img {
|
.list-img {
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
height: $centerHeight;
|
height: $centerHeight;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
border: 1px solid;
|
border: none !important;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
@include hover-border-color('hover-border-color');
|
@include hover-border-color('hover-border-color');
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-text {
|
.list-text {
|
||||||
padding-left: 6px;
|
padding-left: 6px;
|
||||||
font-size: $textSize;
|
font-size: $textSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.list-status-icon {
|
||||||
|
margin-left: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 选中样式 */
|
||||||
|
&.select {
|
||||||
|
border: 1px solid v-bind('themeColor');
|
||||||
|
/* 需要设置最高级,覆盖 hover 的颜色 */
|
||||||
|
background-color: rgba(0, 0, 0, 0);
|
||||||
|
// .list-img {
|
||||||
|
// border: 1px solid v-bind('themeColor') !important;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
// mini样式
|
||||||
|
&.list-mini {
|
||||||
|
height: $centerMiniHeight;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
1
src/views/chart/ContentLayers/enums.ts
Normal file
1
src/views/chart/ContentLayers/enums.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export type LayerModeEnum = 'thumbnail' | 'text'
|
@ -12,30 +12,23 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #top-right>
|
<template #top-right>
|
||||||
<n-radio-group v-model:value="layerMode" name="radiobuttongroup1" size="small" class="go-flex-center">
|
<n-button-group style="display: flex">
|
||||||
<n-radio-button value="thumbnail">
|
<n-button
|
||||||
<n-icon size="16" class="go-d-block" title="缩略图" :depth="2" :component="ImageIcon" />
|
v-for="(item, index) in layerModeEnumList"
|
||||||
</n-radio-button>
|
:key="index"
|
||||||
<n-radio-button value="text">
|
ghost
|
||||||
<n-icon size="16" class="go-d-block" title="文字列表" :depth="2" :component="ListIcon" />
|
size="tiny"
|
||||||
</n-radio-button>
|
:type="layerMode === item.value ? 'primary' : 'tertiary'"
|
||||||
</n-radio-group>
|
@click="layerMode = item.value as LayerModeEnum"
|
||||||
<!-- <n-icon
|
>
|
||||||
size="16"
|
<n-tooltip :show-arrow="false" trigger="hover">
|
||||||
class="go-cursor-pointer go-d-block"
|
<template #trigger>
|
||||||
title="缩略图"
|
<n-icon size="14" :component="item.icon" />
|
||||||
:depth="2"
|
</template>
|
||||||
:component="ImageIcon"
|
{{ item.label }}
|
||||||
:class="{ 'go-layer-mode-active': layerMode === 'thumbnail' }"
|
</n-tooltip>
|
||||||
/>
|
</n-button>
|
||||||
<n-icon
|
</n-button-group>
|
||||||
size="16"
|
|
||||||
class="go-cursor-pointer go-d-block"
|
|
||||||
title="文字列表"
|
|
||||||
:depth="2"
|
|
||||||
:component="ListIcon"
|
|
||||||
:class="{ 'go-layer-mode-active': layerMode === 'text' }"
|
|
||||||
/> -->
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<!-- 图层内容 -->
|
<!-- 图层内容 -->
|
||||||
@ -48,11 +41,16 @@
|
|||||||
<template #item="{ element }">
|
<template #item="{ element }">
|
||||||
<div class="go-content-layer-box">
|
<div class="go-content-layer-box">
|
||||||
<!-- 组合 -->
|
<!-- 组合 -->
|
||||||
<layers-group-list-item v-if="element.isGroup" :componentGroupData="element"></layers-group-list-item>
|
<layers-group-list-item
|
||||||
|
v-if="element.isGroup"
|
||||||
|
:componentGroupData="element"
|
||||||
|
:layer-mode="layerMode"
|
||||||
|
></layers-group-list-item>
|
||||||
<!-- 单组件 -->
|
<!-- 单组件 -->
|
||||||
<layers-list-item
|
<layers-list-item
|
||||||
v-else
|
v-else
|
||||||
:componentData="element"
|
:componentData="element"
|
||||||
|
:layer-mode="layerMode"
|
||||||
@mousedown="mousedownHandle($event, element)"
|
@mousedown="mousedownHandle($event, element)"
|
||||||
@mouseenter="mouseenterHandle(element)"
|
@mouseenter="mouseenterHandle(element)"
|
||||||
@mouseleave="mouseleaveHandle(element)"
|
@mouseleave="mouseleaveHandle(element)"
|
||||||
@ -79,16 +77,21 @@ import { MenuEnum, MouseEventButton, WinKeyboard, MacKeyboard } from '@/enums/ed
|
|||||||
|
|
||||||
import { LayersListItem } from './components/LayersListItem/index'
|
import { LayersListItem } from './components/LayersListItem/index'
|
||||||
import { LayersGroupListItem } from './components/LayersGroupListItem/index'
|
import { LayersGroupListItem } from './components/LayersGroupListItem/index'
|
||||||
|
import { LayerModeEnum } from './enums'
|
||||||
|
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
|
|
||||||
const { LayersIcon, ImageIcon, ListIcon } = icon.ionicons5
|
const { LayersIcon, ImageIcon, ImagesIcon, ListIcon } = icon.ionicons5
|
||||||
const chartLayoutStore = useChartLayoutStore()
|
const chartLayoutStore = useChartLayoutStore()
|
||||||
const chartEditStore = useChartEditStore()
|
const chartEditStore = useChartEditStore()
|
||||||
const { handleContextMenu, onClickOutSide } = useContextMenu()
|
const { handleContextMenu, onClickOutSide } = useContextMenu()
|
||||||
|
|
||||||
const layerList = ref<any>([])
|
const layerList = ref<any>([])
|
||||||
const layerMode = ref<'thumbnail' | 'text'>('thumbnail')
|
const layerModeEnumList = [
|
||||||
|
{ label: '缩略图', icon: ImagesIcon, value: 'thumbnail' },
|
||||||
|
{ label: '文本列表', icon: ListIcon, value: 'text' }
|
||||||
|
]
|
||||||
|
const layerMode = ref<LayerModeEnum>('thumbnail')
|
||||||
|
|
||||||
// 逆序展示
|
// 逆序展示
|
||||||
const reverseList = computed(() => {
|
const reverseList = computed(() => {
|
||||||
@ -187,7 +190,7 @@ const mouseleaveHandle = (item: CreateComponentType) => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
$wight: 180px;
|
$wight: 200px;
|
||||||
@include go(content-layers) {
|
@include go(content-layers) {
|
||||||
width: $wight;
|
width: $wight;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user