feat: 新增定位和style处理

This commit is contained in:
MTrun 2022-03-09 17:37:32 +08:00
parent a6e5dec2c0
commit a467283618
10 changed files with 167 additions and 11 deletions

View File

@ -1,4 +1,18 @@
<template> <template>
<n-divider style="margin: 10px 0;" />
<n-space :size="8" justify="space-between" style="margin-top: 10px;">
<n-button
secondary
v-for="item in positionList"
:key="item.key"
@click="positonHandle(item.key)"
>
<template #icon>
<component :is="item.icon" />
</template>
</n-button>
</n-space>
<!-- </SettingItemBox> -->
<SettingItemBox name="边距"> <SettingItemBox name="边距">
<n-input-number <n-input-number
v-model:value="chartAttr.y" v-model:value="chartAttr.y"
@ -27,11 +41,92 @@
import { PropType } from 'vue' import { PropType } from 'vue'
import { PickCreateComponentType } from '@/packages/index.d' import { PickCreateComponentType } from '@/packages/index.d'
import { SettingItemBox } from '@/components/ChartItemSetting/index' import { SettingItemBox } from '@/components/ChartItemSetting/index'
import { renderIcon } from '@/utils'
import { icon } from '@/plugins/index'
import { EditCanvasConfigType } from '@/store/modules/chartEditStore/chartEditStore.d'
const {
AlignHorizontalLeftIcon,
AlignVerticalCenterIcon,
AlignVerticalTopIcon,
AlignHorizontalCenterIcon,
AlignHorizontalRightIcon,
AlignVerticalBottomIcon
} = icon.carbon
const positionList = [
{
key: 'AlignHorizontalLeftIcon',
lable: '局左',
icon: renderIcon(AlignHorizontalLeftIcon)
},
{
key: 'AlignVerticalCenterIcon',
lable: 'X轴居中',
icon: renderIcon(AlignVerticalCenterIcon)
},
{
key: 'AlignHorizontalRightIcon',
lable: '局右',
icon: renderIcon(AlignHorizontalRightIcon)
},
{
key: 'AlignVerticalTopIcon',
lable: '顶部',
icon: renderIcon(AlignVerticalTopIcon)
},
{
key: 'AlignHorizontalCenterIcon',
lable: 'Y轴居中',
icon: renderIcon(AlignHorizontalCenterIcon)
},
{
key: 'AlignVerticalBottomIcon',
lable: '底部',
icon: renderIcon(AlignVerticalBottomIcon)
}
]
const props = defineProps({ const props = defineProps({
canvasConfig: {
type: Object as PropType<EditCanvasConfigType>,
required: true
},
chartAttr: { chartAttr: {
type: Object as PropType<Omit<PickCreateComponentType<'attr'>, 'node' | 'conNode'>>, type: Object as PropType<
Omit<PickCreateComponentType<'attr'>, 'node' | 'conNode'>
>,
required: true required: true
} }
}) })
const positonHandle = (key: string) => {
console.log(key)
switch (key) {
//
case positionList[0]['key']:
props.chartAttr.x = 0
break
// X
case positionList[1]['key']:
props.chartAttr.y = (props.canvasConfig.height - props.chartAttr.h) / 2
break
//
case positionList[2]['key']:
props.chartAttr.x = props.canvasConfig.width - props.chartAttr.w
break
//
case positionList[3]['key']:
props.chartAttr.y = 0
break
// Y
case positionList[4]['key']:
props.chartAttr.x = (props.canvasConfig.width - props.chartAttr.w) / 2
break
//
case positionList[5]['key']:
props.chartAttr.y = props.canvasConfig.height - props.chartAttr.h
break
}
}
</script> </script>

View File

@ -1,7 +1,9 @@
<template> <template>
<div class="go-config-item-box"> <div class="go-config-item-box">
<n-text class="item-left" depth="2">{{ name }}</n-text> <n-text class="item-left" depth="2">{{ name }}</n-text>
<div class="item-right" justify="space-between"> <div class="item-right" justify="space-between" :style="{
gridTemplateColumns: alone? '1fr': '1fr 1fr'
}">
<slot /> <slot />
</div> </div>
</div> </div>
@ -12,6 +14,11 @@ defineProps({
name: { name: {
type: String, type: String,
required: true required: true
},
alone: {
type: Boolean,
default: false,
required: false
} }
}) })
</script> </script>

View File

@ -0,0 +1,31 @@
<template>
<CollapseItem name="通用样式" :expanded="true">
<SettingItemBox name="透明度" :alone="true">
<!-- 透明度 -->
<n-slider
v-model:value="chartStyles.opacity"
:step="0.1"
:min="0"
:max="1"
/>
</SettingItemBox>
</CollapseItem>
</template>
<script setup lang="ts">
import { PropType } from 'vue'
import { PickCreateComponentType } from '@/packages/index.d'
import {
SettingItemBox,
CollapseItem
} from '@/components/ChartItemSetting/index'
const props = defineProps({
chartStyles: {
type: Object as PropType<PickCreateComponentType<'styles'>>,
required: true
}
})
</script>
<style lang="scss" scoped></style>

View File

@ -9,5 +9,7 @@ import GlobalSetting from './GlobalSetting.vue'
import PositionSetting from './PositionSetting.vue' import PositionSetting from './PositionSetting.vue'
// 尺寸 // 尺寸
import SizeSetting from './SizeSetting.vue' import SizeSetting from './SizeSetting.vue'
// 样式
import StylesSetting from './StylesSetting.vue'
export { CollapseItem, SettingItemBox, SettingItem, GlobalSetting, PositionSetting, SizeSetting } export { CollapseItem, SettingItemBox, SettingItem, GlobalSetting, PositionSetting, SizeSetting, StylesSetting }

View File

@ -63,6 +63,12 @@ import {
StackedMove as StackedMoveIcon, StackedMove as StackedMoveIcon,
PaintBrush as PaintBrushIcon, PaintBrush as PaintBrushIcon,
ComposerEdit as ZAxisIcon, ComposerEdit as ZAxisIcon,
AlignHorizontalLeft as AlignHorizontalLeftIcon,
AlignVerticalCenter as AlignVerticalCenterIcon,
AlignVerticalTop as AlignVerticalTopIcon,
AlignHorizontalCenter as AlignHorizontalCenterIcon,
AlignHorizontalRight as AlignHorizontalRightIcon,
AlignVerticalBottom as AlignVerticalBottomIcon
} from '@vicons/carbon' } from '@vicons/carbon'
const ionicons5 = { const ionicons5 = {
@ -190,7 +196,13 @@ const carbon = {
// 清空剪切板(刷子) // 清空剪切板(刷子)
PaintBrushIcon, PaintBrushIcon,
// 坐标轴 // 坐标轴
ZAxisIcon ZAxisIcon,
AlignHorizontalLeftIcon,
AlignVerticalCenterIcon,
AlignVerticalTopIcon,
AlignHorizontalCenterIcon,
AlignHorizontalRightIcon,
AlignVerticalBottomIcon
} }
// https://www.xicons.org/#/ 还有很多 // https://www.xicons.org/#/ 还有很多

View File

@ -54,7 +54,7 @@ const targetData: Ref<CreateComponentType> = computed(() => {
return list[targetIndex] return list[targetIndex]
}) })
// * // *
const activeIndex = (value: string) => { const activeIndex = (value: string) => {
const selectValue = targetData.value.styles.animations const selectValue = targetData.value.styles.animations
if (!selectValue.length) return false if (!selectValue.length) return false

View File

@ -14,7 +14,9 @@
<!-- 尺寸 --> <!-- 尺寸 -->
<SizeSetting :chartAttr="targetData.attr" /> <SizeSetting :chartAttr="targetData.attr" />
<!-- 位置 --> <!-- 位置 -->
<PositionSetting :chartAttr="targetData.attr" /> <PositionSetting :chartAttr="targetData.attr" :canvasConfig="chartEditStore.getEditCanvasConfig"/>
<!-- 样式 -->
<StylesSetting :chartStyles="targetData.styles" />
<!-- 自定义配置项 --> <!-- 自定义配置项 -->
<component :is="targetData.chartConfig.conKey" :optionData="targetData.option"></component> <component :is="targetData.chartConfig.conKey" :optionData="targetData.option"></component>
<!-- 全局设置 --> <!-- 全局设置 -->
@ -25,7 +27,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed, Ref } from 'vue' import { computed, Ref } from 'vue'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { GlobalSetting, PositionSetting, SizeSetting } from '@/components/ChartItemSetting/index' import { GlobalSetting, PositionSetting, SizeSetting, StylesSetting } from '@/components/ChartItemSetting/index'
import { CreateComponentType } from '@/packages/index.d' import { CreateComponentType } from '@/packages/index.d'
import { SettingItemBox } from '@/components/ChartItemSetting/index' import { SettingItemBox } from '@/components/ChartItemSetting/index'

View File

@ -10,7 +10,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { reactive } from 'vue' import { shallowReactive } from 'vue'
import { renderIcon, fetchPathByName, routerTurnByPath, setLocalStorage, getLocalStorage } from '@/utils' import { renderIcon, fetchPathByName, routerTurnByPath, setLocalStorage, getLocalStorage } from '@/utils'
import { PreviewEnum } from '@/enums/pageEnum' import { PreviewEnum } from '@/enums/pageEnum'
import { StorageEnum } from '@/enums/storageEnum' import { StorageEnum } from '@/enums/storageEnum'
@ -58,7 +58,7 @@ const sendHandle = () => {
window['$message'].warning('该功能暂未实现(因为压根没有后台)') window['$message'].warning('该功能暂未实现(因为压根没有后台)')
} }
const btnList = reactive([ const btnList = shallowReactive([
{ {
key: '', key: '',
select: true, select: true,

View File

@ -4,7 +4,7 @@
:class="animationsClass(item.styles.animations)" :class="animationsClass(item.styles.animations)"
v-for="(item, index) in localStorageInfo.componentList" v-for="(item, index) in localStorageInfo.componentList"
:key="item.id" :key="item.id"
:style="{ ...useComponentAttrStyle(item.attr, index), ...useSizeStyle(item.attr) }" :style="{ ...useComponentAttrStyle(item.attr, index), ...useSizeStyle(item.attr), ...useStyle(item.styles)}"
> >
<component <component
:is="item.key" :is="item.key"
@ -19,7 +19,7 @@
import { PropType, computed } from 'vue' import { PropType, computed } from 'vue'
import { ChartEditStorageType } from '../../index.d' import { ChartEditStorageType } from '../../index.d'
import { chartColors } from '@/settings/chartThemes/index' import { chartColors } from '@/settings/chartThemes/index'
import { useSizeStyle, useComponentAttrStyle, animationsClass } from '../../utils' import { useSizeStyle, useStyle, useComponentAttrStyle, animationsClass } from '../../utils'
const props = defineProps({ const props = defineProps({
localStorageInfo: { localStorageInfo: {

View File

@ -43,3 +43,10 @@ export const animationsClass = (animations: string[]) => {
} }
return '' return ''
} }
export const useStyle = (styles: StylesType) => {
return {
// 透明度
opacity: styles.opacity
}
}