feat: 新增图表独立配置混合
This commit is contained in:
parent
f8095ca52a
commit
4e9e492c29
@ -1,3 +0,0 @@
|
|||||||
import AppleControlBtn from './index.vue';
|
|
||||||
|
|
||||||
export { AppleControlBtn };
|
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<n-divider style="margin: 10px 0;" />
|
<n-divider style="margin: 10px 0;" />
|
||||||
<n-collapse arrow-placement="right" :default-expanded-names="name" accordion>
|
<n-collapse arrow-placement="right" :default-expanded-names="expanded ? name : null" accordion>
|
||||||
<!-- 右侧 -->
|
<!-- 右侧 -->
|
||||||
<template #header-extra>
|
<template #header-extra>
|
||||||
<div @click="click">
|
<div @click="click">
|
||||||
@ -19,6 +19,11 @@ defineProps({
|
|||||||
name: {
|
name: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
expanded: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
3
src/components/MacOsControlBtn/index.ts
Normal file
3
src/components/MacOsControlBtn/index.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
import MacOsControlBtn from './index.vue';
|
||||||
|
|
||||||
|
export { MacOsControlBtn };
|
@ -6,49 +6,55 @@ import cloneDeep from 'lodash/cloneDeep'
|
|||||||
|
|
||||||
export const includes = ['legend', 'xAxis', 'yAxis']
|
export const includes = ['legend', 'xAxis', 'yAxis']
|
||||||
|
|
||||||
// 图表配置项
|
export const option = {
|
||||||
const option = echartOptionProfixHandle(
|
tooltip: {
|
||||||
{
|
show: true,
|
||||||
tooltip: {
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
show: true,
|
show: true,
|
||||||
trigger: 'axis',
|
type: 'shadow'
|
||||||
axisPointer: {
|
}
|
||||||
show: true,
|
|
||||||
type: 'shadow'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
legend: {
|
|
||||||
show: true,
|
|
||||||
},
|
|
||||||
xAxis: {
|
|
||||||
show: true,
|
|
||||||
type: 'category',
|
|
||||||
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
|
|
||||||
},
|
|
||||||
yAxis: {
|
|
||||||
show: true,
|
|
||||||
type: 'value'
|
|
||||||
},
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
name: 'data1',
|
|
||||||
type: 'bar',
|
|
||||||
data: [120, 200, 150, 80, 70, 110, 130]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'data2',
|
|
||||||
type: 'bar',
|
|
||||||
data: [130, 130, 312, 268, 155, 117, 160]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
includes
|
legend: {
|
||||||
)
|
show: true,
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
show: true,
|
||||||
|
type: 'category',
|
||||||
|
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
show: true,
|
||||||
|
type: 'value'
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: 'data1',
|
||||||
|
type: 'bar',
|
||||||
|
barWidth: null,
|
||||||
|
itemStyle: {
|
||||||
|
color: null,
|
||||||
|
borderRadius: 0
|
||||||
|
},
|
||||||
|
data: [120, 200, 150, 80, 70, 110, 130]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'data2',
|
||||||
|
type: 'bar',
|
||||||
|
barWidth: null,
|
||||||
|
itemStyle: {
|
||||||
|
color: null,
|
||||||
|
borderRadius: 0
|
||||||
|
},
|
||||||
|
data: [130, 130, 312, 268, 155, 117, 160]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
export default class Config extends publicConfig
|
export default class Config extends publicConfig
|
||||||
implements CreateComponentType {
|
implements CreateComponentType {
|
||||||
public key = BarCommonConfig.key
|
public key = BarCommonConfig.key
|
||||||
public chartConfig = omit(cloneDeep(BarCommonConfig), ['node'])
|
public chartConfig = omit(cloneDeep(BarCommonConfig), ['node'])
|
||||||
// 图表配置项
|
// 图表配置项
|
||||||
public option = option
|
public option = echartOptionProfixHandle(option, includes)
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,45 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>配置项目</div>
|
<CollapseItem v-for="(item, index) in seriesList" :key="index" :name="`柱状图-数据-${index+1}`" :expanded="true">
|
||||||
|
<SettingItemBox name="图形">
|
||||||
|
<SettingItem name="颜色">
|
||||||
|
<n-color-picker size="small" :modes="['hex']" v-model:value="item.itemStyle.color" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem>
|
||||||
|
<n-button size="small" @click="item.itemStyle.color = null">恢复默认</n-button>
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem name="宽度">
|
||||||
|
<n-input-number
|
||||||
|
v-model:value="item.barWidth"
|
||||||
|
:min="1"
|
||||||
|
:max="100"
|
||||||
|
size="small"
|
||||||
|
placeholder="自动计算"
|
||||||
|
/>
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem name="圆角">
|
||||||
|
<n-input-number
|
||||||
|
v-model:value="item.itemStyle.borderRadius"
|
||||||
|
:min="0"
|
||||||
|
size="small"
|
||||||
|
/>
|
||||||
|
</SettingItem>
|
||||||
|
</SettingItemBox>
|
||||||
|
</CollapseItem>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { PropType, computed } from 'vue'
|
||||||
|
import { CollapseItem, SettingItemBox, SettingItem } from '@/components/ChartItemSetting/index'
|
||||||
|
import { option } from './config'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
optionData: {
|
||||||
|
type: Object as PropType<typeof option>,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const seriesList = computed(() => {
|
||||||
|
return props.optionData.series
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import BarCommon from './index.vue'
|
import BarCommon from './index.vue'
|
||||||
|
import Configuration from './config.vue'
|
||||||
import image from '@/assets/images/chart/charts/bar_x.png'
|
import image from '@/assets/images/chart/charts/bar_x.png'
|
||||||
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
|
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
|
||||||
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
|
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
|
||||||
@ -10,5 +11,6 @@ export const BarCommonConfig: ConfigType = {
|
|||||||
categoryName: ChatCategoryEnumName.BAR,
|
categoryName: ChatCategoryEnumName.BAR,
|
||||||
package: PackagesCategoryEnum.CHARTS,
|
package: PackagesCategoryEnum.CHARTS,
|
||||||
node: BarCommon,
|
node: BarCommon,
|
||||||
|
conNode: () => Configuration,
|
||||||
image: image,
|
image: image,
|
||||||
}
|
}
|
||||||
|
@ -6,48 +6,55 @@ import cloneDeep from 'lodash/cloneDeep'
|
|||||||
|
|
||||||
export const includes = ['legend', 'xAxis', 'yAxis']
|
export const includes = ['legend', 'xAxis', 'yAxis']
|
||||||
|
|
||||||
const option = echartOptionProfixHandle(
|
export const option = {
|
||||||
{
|
tooltip: {
|
||||||
tooltip: {
|
show: true,
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
show: true,
|
show: true,
|
||||||
trigger: 'axis',
|
type: 'shadow',
|
||||||
axisPointer: {
|
|
||||||
show: true,
|
|
||||||
type: 'shadow'
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
legend: {
|
|
||||||
show: true,
|
|
||||||
},
|
|
||||||
xAxis: {
|
|
||||||
show: true,
|
|
||||||
type: 'value',
|
|
||||||
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
|
|
||||||
},
|
|
||||||
yAxis: {
|
|
||||||
show: true,
|
|
||||||
type: 'category'
|
|
||||||
},
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
name: 'data1',
|
|
||||||
type: 'bar',
|
|
||||||
data: [120, 200, 150, 80, 70, 110, 130]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'data2',
|
|
||||||
type: 'bar',
|
|
||||||
data: [130, 130, 312, 268, 155, 117, 160]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
includes
|
legend: {
|
||||||
)
|
show: true,
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
show: true,
|
||||||
|
type: 'value',
|
||||||
|
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
show: true,
|
||||||
|
type: 'category',
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: 'data1',
|
||||||
|
type: 'bar',
|
||||||
|
barWidth: null,
|
||||||
|
itemStyle: {
|
||||||
|
color: null,
|
||||||
|
borderRadius: 0,
|
||||||
|
},
|
||||||
|
data: [120, 200, 150, 80, 70, 110, 130],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'data2',
|
||||||
|
type: 'bar',
|
||||||
|
barWidth: null,
|
||||||
|
itemStyle: {
|
||||||
|
color: null,
|
||||||
|
borderRadius: 0,
|
||||||
|
},
|
||||||
|
data: [130, 130, 312, 268, 155, 117, 160],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
export default class Config extends publicConfig
|
export default class Config extends publicConfig
|
||||||
implements CreateComponentType {
|
implements CreateComponentType {
|
||||||
public key: string = BarCrossrangefig.key
|
public key: string = BarCrossrangefig.key
|
||||||
public chartConfig = omit(cloneDeep(BarCrossrangefig), ['node'])
|
public chartConfig = omit(cloneDeep(BarCrossrangefig), ['node'])
|
||||||
// 图表配置项
|
// 图表配置项
|
||||||
public option = option
|
public option = echartOptionProfixHandle(option, includes)
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,45 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>配置项目</div>
|
<CollapseItem v-for="(item, index) in seriesList" :key="index" :name="`柱状图-数据-${index+1}`" :expanded="true">
|
||||||
|
<SettingItemBox name="图形">
|
||||||
|
<SettingItem name="颜色">
|
||||||
|
<n-color-picker size="small" :modes="['hex']" v-model:value="item.itemStyle.color" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem>
|
||||||
|
<n-button size="small" @click="item.itemStyle.color = null">恢复默认</n-button>
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem name="宽度">
|
||||||
|
<n-input-number
|
||||||
|
v-model:value="item.barWidth"
|
||||||
|
:min="1"
|
||||||
|
:max="100"
|
||||||
|
size="small"
|
||||||
|
placeholder="自动计算"
|
||||||
|
/>
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem name="圆角">
|
||||||
|
<n-input-number
|
||||||
|
v-model:value="item.itemStyle.borderRadius"
|
||||||
|
:min="0"
|
||||||
|
size="small"
|
||||||
|
/>
|
||||||
|
</SettingItem>
|
||||||
|
</SettingItemBox>
|
||||||
|
</CollapseItem>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { PropType, computed } from 'vue'
|
||||||
|
import { CollapseItem, SettingItemBox, SettingItem } from '@/components/ChartItemSetting/index'
|
||||||
|
import { option } from './config'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
optionData: {
|
||||||
|
type: Object as PropType<typeof option>,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const seriesList = computed(() => {
|
||||||
|
return props.optionData.series
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import BarCrossrange from './index.vue'
|
import BarCrossrange from './index.vue'
|
||||||
|
import Configuration from './config.vue'
|
||||||
import image from '@/assets/images/chart/charts/bar_y.png'
|
import image from '@/assets/images/chart/charts/bar_y.png'
|
||||||
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
|
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
|
||||||
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
|
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
|
||||||
@ -10,5 +11,6 @@ export const BarCrossrangefig: ConfigType = {
|
|||||||
categoryName: ChatCategoryEnumName.BAR,
|
categoryName: ChatCategoryEnumName.BAR,
|
||||||
package: PackagesCategoryEnum.CHARTS,
|
package: PackagesCategoryEnum.CHARTS,
|
||||||
node: BarCrossrange,
|
node: BarCrossrange,
|
||||||
|
conNode: () => Configuration,
|
||||||
image: image
|
image: image
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ import omit from 'lodash/omit'
|
|||||||
|
|
||||||
export const includes = ['legend', 'xAxis', 'yAxis']
|
export const includes = ['legend', 'xAxis', 'yAxis']
|
||||||
|
|
||||||
const options = echartOptionProfixHandle({
|
const option = {
|
||||||
legend: {
|
legend: {
|
||||||
show: true,
|
show: true,
|
||||||
},
|
},
|
||||||
@ -23,18 +23,13 @@ const options = echartOptionProfixHandle({
|
|||||||
name: 'data1',
|
name: 'data1',
|
||||||
type: 'line',
|
type: 'line',
|
||||||
data: [120, 200, 150, 80, 70, 110, 130]
|
data: [120, 200, 150, 80, 70, 110, 130]
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'data2',
|
|
||||||
type: 'line',
|
|
||||||
data: [130, 130, 312, 268, 155, 117, 160]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}, includes)
|
}
|
||||||
|
|
||||||
export default class Config extends publicConfig implements CreateComponentType {
|
export default class Config extends publicConfig implements CreateComponentType {
|
||||||
public key: string = LineCommonConfig.key
|
public key: string = LineCommonConfig.key
|
||||||
public chartConfig = omit(LineCommonConfig, ['node'])
|
public chartConfig = omit(LineCommonConfig, ['node'])
|
||||||
// 图表配置项
|
// 图表配置项
|
||||||
public option = options
|
public option = echartOptionProfixHandle(option, includes)
|
||||||
}
|
}
|
@ -1,5 +1,4 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>配置项目</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import LineCommon from './index.vue'
|
import LineCommon from './index.vue'
|
||||||
|
import Configuration from './config.vue'
|
||||||
import image from '@/assets/images/chart/charts/line.png'
|
import image from '@/assets/images/chart/charts/line.png'
|
||||||
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
|
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
|
||||||
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
|
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
|
||||||
@ -10,5 +11,6 @@ export const LineCommonConfig: ConfigType = {
|
|||||||
categoryName: ChatCategoryEnumName.LINE,
|
categoryName: ChatCategoryEnumName.LINE,
|
||||||
package: PackagesCategoryEnum.CHARTS,
|
package: PackagesCategoryEnum.CHARTS,
|
||||||
node: LineCommon,
|
node: LineCommon,
|
||||||
|
conNode: () => Configuration,
|
||||||
image: image
|
image: image
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>配置项目</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import LineGradientSingle from './index.vue'
|
import LineGradientSingle from './index.vue'
|
||||||
|
import Configuration from './config.vue'
|
||||||
import image from '@/assets/images/chart/charts/line_gradient_single.png'
|
import image from '@/assets/images/chart/charts/line_gradient_single.png'
|
||||||
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
|
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
|
||||||
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
|
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
|
||||||
@ -10,5 +11,6 @@ export const LineGradientSingleConfig: ConfigType = {
|
|||||||
categoryName: ChatCategoryEnumName.LINE,
|
categoryName: ChatCategoryEnumName.LINE,
|
||||||
package: PackagesCategoryEnum.CHARTS,
|
package: PackagesCategoryEnum.CHARTS,
|
||||||
node: LineGradientSingle,
|
node: LineGradientSingle,
|
||||||
|
conNode: () => Configuration,
|
||||||
image: image
|
image: image
|
||||||
}
|
}
|
||||||
|
@ -6,72 +6,69 @@ import omit from 'lodash/omit'
|
|||||||
|
|
||||||
export const includes = ['legend', 'xAxis', 'yAxis']
|
export const includes = ['legend', 'xAxis', 'yAxis']
|
||||||
|
|
||||||
const options = echartOptionProfixHandle(
|
const option = {
|
||||||
{
|
legend: {
|
||||||
legend: {
|
show: true,
|
||||||
show: true
|
},
|
||||||
|
xAxis: {
|
||||||
|
show: true,
|
||||||
|
type: 'category',
|
||||||
|
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
show: true,
|
||||||
|
type: 'value',
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: 'data1',
|
||||||
|
type: 'line',
|
||||||
|
smooth: false,
|
||||||
|
data: [120, 200, 150, 80, 70, 110, 130],
|
||||||
|
areaStyle: {
|
||||||
|
opacity: 0.8,
|
||||||
|
color: new graphic.LinearGradient(0, 0, 0, 1, [
|
||||||
|
{
|
||||||
|
offset: 0,
|
||||||
|
color: 'rgba(25,163,223,.3)',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
offset: 1,
|
||||||
|
color: 'rgba(25,163,223, 0)',
|
||||||
|
},
|
||||||
|
]),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
xAxis: {
|
{
|
||||||
show: true,
|
name: 'data2',
|
||||||
type: 'category',
|
type: 'line',
|
||||||
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
|
smooth: false,
|
||||||
},
|
areaStyle: {
|
||||||
yAxis: {
|
normal: {
|
||||||
show: true,
|
|
||||||
type: 'value'
|
|
||||||
},
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
name: 'data1',
|
|
||||||
type: 'line',
|
|
||||||
smooth: false,
|
|
||||||
data: [120, 200, 150, 80, 70, 110, 130],
|
|
||||||
areaStyle: {
|
|
||||||
opacity: 0.8,
|
opacity: 0.8,
|
||||||
color: new graphic.LinearGradient(0, 0, 0, 1, [
|
color: new graphic.LinearGradient(0, 0, 0, 1, [
|
||||||
{
|
{
|
||||||
offset: 0,
|
offset: 0,
|
||||||
color: 'rgba(25,163,223,.3)'
|
color: 'rgba(0,202,149,0.3)',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
offset: 1,
|
offset: 1,
|
||||||
color: 'rgba(25,163,223, 0)'
|
color: 'rgba(0,202,149,0)',
|
||||||
}
|
},
|
||||||
])
|
]),
|
||||||
}
|
shadowColor: 'rgba(0,202,149, 0.9)',
|
||||||
},
|
shadowBlur: 20,
|
||||||
{
|
|
||||||
name: 'data2',
|
|
||||||
type: 'line',
|
|
||||||
smooth: false,
|
|
||||||
areaStyle: {
|
|
||||||
normal: {
|
|
||||||
opacity: 0.8,
|
|
||||||
color: new graphic.LinearGradient(0, 0, 0, 1, [
|
|
||||||
{
|
|
||||||
offset: 0,
|
|
||||||
color: 'rgba(0,202,149,0.3)'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
offset: 1,
|
|
||||||
color: 'rgba(0,202,149,0)'
|
|
||||||
}
|
|
||||||
]),
|
|
||||||
shadowColor: 'rgba(0,202,149, 0.9)',
|
|
||||||
shadowBlur: 20
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
data: [130, 130, 312, 268, 155, 117, 160]
|
},
|
||||||
}
|
data: [130, 130, 312, 268, 155, 117, 160],
|
||||||
]
|
},
|
||||||
},
|
],
|
||||||
includes
|
}
|
||||||
)
|
|
||||||
|
|
||||||
export default class Config extends publicConfig
|
export default class Config extends publicConfig
|
||||||
implements CreateComponentType {
|
implements CreateComponentType {
|
||||||
public key: string = LineGradientsConfig.key
|
public key: string = LineGradientsConfig.key
|
||||||
public chartConfig = omit(LineGradientsConfig, ['node'])
|
public chartConfig = omit(LineGradientsConfig, ['node'])
|
||||||
// 图表配置项
|
// 图表配置项
|
||||||
public option = options
|
public option = echartOptionProfixHandle(option, includes)
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>配置项目</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import LineGradients from './index.vue'
|
import LineGradients from './index.vue'
|
||||||
|
import Configuration from './config.vue'
|
||||||
import image from '@/assets/images/chart/charts/line_gradient2.png'
|
import image from '@/assets/images/chart/charts/line_gradient2.png'
|
||||||
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
|
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
|
||||||
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
|
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
|
||||||
@ -10,5 +11,6 @@ export const LineGradientsConfig: ConfigType = {
|
|||||||
categoryName: ChatCategoryEnumName.LINE,
|
categoryName: ChatCategoryEnumName.LINE,
|
||||||
package: PackagesCategoryEnum.CHARTS,
|
package: PackagesCategoryEnum.CHARTS,
|
||||||
node: LineGradients,
|
node: LineGradients,
|
||||||
|
conNode: () => Configuration,
|
||||||
image: image
|
image: image
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ import omit from 'lodash/omit'
|
|||||||
|
|
||||||
export const includes = ['legend']
|
export const includes = ['legend']
|
||||||
|
|
||||||
const option = echartOptionProfixHandle({
|
const option = {
|
||||||
tooltip: {
|
tooltip: {
|
||||||
show: true,
|
show: true,
|
||||||
trigger: 'item'
|
trigger: 'item'
|
||||||
@ -17,7 +17,7 @@ const option = echartOptionProfixHandle({
|
|||||||
{
|
{
|
||||||
name: 'Access From',
|
name: 'Access From',
|
||||||
type: 'pie',
|
type: 'pie',
|
||||||
radius: ['40%', '70%'],
|
radius: ['40%', '65%'],
|
||||||
center: ['50%', '60%'],
|
center: ['50%', '60%'],
|
||||||
avoidLabelOverlap: false,
|
avoidLabelOverlap: false,
|
||||||
itemStyle: {
|
itemStyle: {
|
||||||
@ -49,7 +49,7 @@ const option = echartOptionProfixHandle({
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}, includes)
|
}
|
||||||
|
|
||||||
export default class Config extends publicConfig implements CreateComponentType {
|
export default class Config extends publicConfig implements CreateComponentType {
|
||||||
public key: string = PieCommonConfig.key
|
public key: string = PieCommonConfig.key
|
||||||
@ -57,5 +57,5 @@ export default class Config extends publicConfig implements CreateComponentType
|
|||||||
public chartConfig = omit(PieCommonConfig, ['node'])
|
public chartConfig = omit(PieCommonConfig, ['node'])
|
||||||
|
|
||||||
// 图表配置项
|
// 图表配置项
|
||||||
public option = option
|
public option = echartOptionProfixHandle(option, includes)
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>配置项目</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import PieCommon from './index.vue'
|
import PieCommon from './index.vue'
|
||||||
|
import Configuration from './config.vue'
|
||||||
import image from '@/assets/images/chart/charts/pie.png'
|
import image from '@/assets/images/chart/charts/pie.png'
|
||||||
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
|
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
|
||||||
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
|
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
|
||||||
@ -10,5 +11,6 @@ export const PieCommonConfig: ConfigType = {
|
|||||||
categoryName: ChatCategoryEnumName.PIE,
|
categoryName: ChatCategoryEnumName.PIE,
|
||||||
package: PackagesCategoryEnum.CHARTS,
|
package: PackagesCategoryEnum.CHARTS,
|
||||||
node: PieCommon,
|
node: PieCommon,
|
||||||
|
conNode: () => Configuration,
|
||||||
image
|
image
|
||||||
}
|
}
|
||||||
|
1
src/packages/index.d.ts
vendored
1
src/packages/index.d.ts
vendored
@ -9,6 +9,7 @@ export type ConfigType = {
|
|||||||
categoryName: string
|
categoryName: string
|
||||||
package: string
|
package: string
|
||||||
node: Component
|
node: Component
|
||||||
|
conNode: () => Component
|
||||||
image: string | (() => Promise<typeof import('*.png')>)
|
image: string | (() => Promise<typeof import('*.png')>)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ import { packagesList } from '@/packages/index'
|
|||||||
export const usePackagesStore = defineStore({
|
export const usePackagesStore = defineStore({
|
||||||
id: 'usePackagesStore',
|
id: 'usePackagesStore',
|
||||||
state: (): PackagesStoreType => ({
|
state: (): PackagesStoreType => ({
|
||||||
packagesList
|
packagesList: Object.freeze(packagesList)
|
||||||
}),
|
}),
|
||||||
getters: {
|
getters: {
|
||||||
getPackagesList(): PackagesType {
|
getPackagesList(): PackagesType {
|
||||||
|
@ -5,7 +5,7 @@ import { AsyncLoading, AsyncSkeletonLoading } from '@/components/LoadingComponen
|
|||||||
* * 动态注册组件
|
* * 动态注册组件
|
||||||
*/
|
*/
|
||||||
export const componentInstall = <T> (key:string, node: T) => {
|
export const componentInstall = <T> (key:string, node: T) => {
|
||||||
if(!window['$vue'].component(key)) {
|
if(!window['$vue'].component(key) && key && node) {
|
||||||
window['$vue'].component(key, node)
|
window['$vue'].component(key, node)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@ import * as CryptoJS from 'crypto-ts'
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
AES_KEY: 'mt',
|
AES_KEY: 'mt',
|
||||||
encode(data: string): string {
|
cryptoEncode(data: string): string {
|
||||||
if (typeof data !== 'string') return ''
|
if (typeof data !== 'string') return ''
|
||||||
// 加密
|
// 加密
|
||||||
const key = CryptoJS.enc.Utf8.parse(this.AES_KEY)
|
const key = CryptoJS.enc.Utf8.parse(this.AES_KEY)
|
||||||
@ -15,7 +15,7 @@ export default {
|
|||||||
return encryptedData.toString()
|
return encryptedData.toString()
|
||||||
},
|
},
|
||||||
// 解密
|
// 解密
|
||||||
decode(data: string): string {
|
cryptoDecode(data: string): string {
|
||||||
if (typeof data !== 'string') return ''
|
if (typeof data !== 'string') return ''
|
||||||
const encryptedHexStr = CryptoJS.enc.Utf8.parse(data)
|
const encryptedHexStr = CryptoJS.enc.Utf8.parse(data)
|
||||||
const encryptedBase64Str = CryptoJS.enc.Utf8.stringify(encryptedHexStr)
|
const encryptedBase64Str = CryptoJS.enc.Utf8.stringify(encryptedHexStr)
|
||||||
|
@ -7,7 +7,7 @@ import throttle from 'lodash/throttle'
|
|||||||
* * 生成一个不重复的ID
|
* * 生成一个不重复的ID
|
||||||
* @param { Number } randomLength
|
* @param { Number } randomLength
|
||||||
*/
|
*/
|
||||||
export function getUUID(randomLength = 10) {
|
export const getUUID = (randomLength = 10) =>{
|
||||||
return Number(
|
return Number(
|
||||||
Math.random().toString().substr(2, randomLength) + Date.now()
|
Math.random().toString().substr(2, randomLength) + Date.now()
|
||||||
).toString(36)
|
).toString(36)
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
@dragstart="handleDragStart($event, item)"
|
@dragstart="handleDragStart($event, item)"
|
||||||
>
|
>
|
||||||
<div class="list-header">
|
<div class="list-header">
|
||||||
<AppleControlBtn :mini="true" :disabled="true"></AppleControlBtn>
|
<MacOsControlBtn :mini="true" :disabled="true"></MacOsControlBtn>
|
||||||
<n-text class="list-header-text" depth="3">{{ item.title }}</n-text>
|
<n-text class="list-header-text" depth="3">{{ item.title }}</n-text>
|
||||||
</div>
|
</div>
|
||||||
<div class="list-center go-flex-center">
|
<div class="list-center go-flex-center">
|
||||||
@ -26,7 +26,8 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { AppleControlBtn } from '@/components/AppleControlBtn/index'
|
import { PropType } from 'vue'
|
||||||
|
import { MacOsControlBtn } from '@/components/MacOsControlBtn/index'
|
||||||
import { requireFallbackImg, componentInstall } from '@/utils'
|
import { requireFallbackImg, componentInstall } from '@/utils'
|
||||||
import { DragKeyEnum } from '@/enums/editPageEnum'
|
import { DragKeyEnum } from '@/enums/editPageEnum'
|
||||||
import { ConfigType } from '@/packages/index.d'
|
import { ConfigType } from '@/packages/index.d'
|
||||||
@ -34,13 +35,14 @@ import omit from 'lodash/omit'
|
|||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
menuOptions: {
|
menuOptions: {
|
||||||
type: Array,
|
type: Array as PropType<ConfigType[]>,
|
||||||
default: () => []
|
default: () => []
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// 拖拽处理
|
// 拖拽处理
|
||||||
const handleDragStart = (e: DragEvent, item: ConfigType) => {
|
const handleDragStart = (e: DragEvent, item: ConfigType) => {
|
||||||
|
// 动态注册图表组件
|
||||||
componentInstall(item.key, item.node)
|
componentInstall(item.key, item.node)
|
||||||
// 将配置项绑定到拖拽属性上
|
// 将配置项绑定到拖拽属性上
|
||||||
e!.dataTransfer!.setData(DragKeyEnum.DROG_KEY, JSON.stringify(omit(item, ['node', 'image'])))
|
e!.dataTransfer!.setData(DragKeyEnum.DROG_KEY, JSON.stringify(omit(item, ['node', 'image'])))
|
||||||
|
@ -17,12 +17,12 @@ const {
|
|||||||
|
|
||||||
// 图表
|
// 图表
|
||||||
const { getPackagesList } = usePackagesStore()
|
const { getPackagesList } = usePackagesStore()
|
||||||
const menuOptions = shallowReactive<{
|
const menuOptions:{
|
||||||
key: string
|
key: string
|
||||||
icon: ReturnType<typeof renderIcon>
|
icon: ReturnType<typeof renderIcon>
|
||||||
label: ReturnType<typeof renderLang>
|
label: ReturnType<typeof renderLang>
|
||||||
list: PackagesType
|
list: PackagesType
|
||||||
}[]>([])
|
}[] = []
|
||||||
|
|
||||||
const packagesListObj = {
|
const packagesListObj = {
|
||||||
[PackagesCategoryEnum.CHARTS]: {
|
[PackagesCategoryEnum.CHARTS]: {
|
||||||
|
@ -43,7 +43,6 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { reactive, ref, toRefs } from 'vue'
|
|
||||||
import { ContentBox } from '../ContentBox/index'
|
import { ContentBox } from '../ContentBox/index'
|
||||||
import { OptionContent } from './components/OptionContent'
|
import { OptionContent } from './components/OptionContent'
|
||||||
import {
|
import {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="go-chart-content-details" v-if="targetData">
|
<div class="go-chart-content-details" v-if="targetData">
|
||||||
|
<!-- 名称 -->
|
||||||
<SettingItemBox name="名称">
|
<SettingItemBox name="名称">
|
||||||
<n-input
|
<n-input
|
||||||
type="text"
|
type="text"
|
||||||
@ -10,7 +11,11 @@
|
|||||||
v-model:value="targetData.chartConfig.title"
|
v-model:value="targetData.chartConfig.title"
|
||||||
/>
|
/>
|
||||||
</SettingItemBox>
|
</SettingItemBox>
|
||||||
|
<!-- 位置 -->
|
||||||
<PositionSetting :chartAttr="targetData.attr" />
|
<PositionSetting :chartAttr="targetData.attr" />
|
||||||
|
<!-- 自定义配置项 -->
|
||||||
|
<component :is="targetData.chartConfig.conNode()" :optionData="targetData.option"></component>
|
||||||
|
<!-- 全局设置 -->
|
||||||
<GlobalSetting :optionData="targetData.option" :in-chart="true" />
|
<GlobalSetting :optionData="targetData.option" :in-chart="true" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
3
src/views/chart/ContentConfigurations/index.ts
Normal file
3
src/views/chart/ContentConfigurations/index.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
import ContentConfigurations from './index.vue'
|
||||||
|
|
||||||
|
export { ContentConfigurations }
|
@ -1,3 +0,0 @@
|
|||||||
import ContentDetails from './index.vue'
|
|
||||||
|
|
||||||
export { ContentDetails }
|
|
@ -11,7 +11,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, computed, PropType, h } from 'vue';
|
import { ref, computed, PropType } from 'vue';
|
||||||
import { useChartEditStoreStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStoreStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
import { useDesignStore } from '@/store/modules/designStore/designStore'
|
import { useDesignStore } from '@/store/modules/designStore/designStore'
|
||||||
import { CreateComponentType } from '@/packages/index.d'
|
import { CreateComponentType } from '@/packages/index.d'
|
||||||
|
@ -61,7 +61,7 @@ const btnList = reactive<ItemType[]>([
|
|||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
// store 描述的是展示的值,所以和 ContentDetails 的 collapsed 是相反的
|
// store 描述的是展示的值,所以和 ContentConfigurations 的 collapsed 是相反的
|
||||||
const styleHandle = (item: ItemType) => {
|
const styleHandle = (item: ItemType) => {
|
||||||
if (item.key === ChartLayoutStoreEnum.DETAILS) {
|
if (item.key === ChartLayoutStoreEnum.DETAILS) {
|
||||||
return item.select ? '' : 'success'
|
return item.select ? '' : 'success'
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<n-layout-content content-style="overflow:hidden; display: flex">
|
<n-layout-content content-style="overflow:hidden; display: flex">
|
||||||
<ContentCharts />
|
<ContentCharts />
|
||||||
<ContentLayers />
|
<ContentLayers />
|
||||||
<ContentDetails />
|
<ContentConfigurations />
|
||||||
</n-layout-content>
|
</n-layout-content>
|
||||||
</n-layout>
|
</n-layout>
|
||||||
</div>
|
</div>
|
||||||
@ -60,8 +60,8 @@ const ContentLayers = loadAsyncComponent(() =>
|
|||||||
const ContentCharts = loadAsyncComponent(() =>
|
const ContentCharts = loadAsyncComponent(() =>
|
||||||
import('./ContentCharts/index.vue')
|
import('./ContentCharts/index.vue')
|
||||||
)
|
)
|
||||||
const ContentDetails = loadAsyncComponent(() =>
|
const ContentConfigurations = loadAsyncComponent(() =>
|
||||||
import('./ContentDetails/index.vue')
|
import('./ContentConfigurations/index.vue')
|
||||||
)
|
)
|
||||||
|
|
||||||
// 右键
|
// 右键
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<div class="list-content">
|
<div class="list-content">
|
||||||
<!-- 顶部按钮 -->
|
<!-- 顶部按钮 -->
|
||||||
<div class="list-content-top">
|
<div class="list-content-top">
|
||||||
<AppleControlBtn
|
<MacOsControlBtn
|
||||||
class="top-btn"
|
class="top-btn"
|
||||||
:hidden="['remove']"
|
:hidden="['remove']"
|
||||||
@close="deleteHanlde"
|
@close="deleteHanlde"
|
||||||
@ -85,7 +85,7 @@
|
|||||||
import { reactive, ref } from 'vue'
|
import { reactive, ref } from 'vue'
|
||||||
import { renderIcon, renderLang, requireUrl, requireFallbackImg } from '@/utils'
|
import { renderIcon, renderLang, requireUrl, requireFallbackImg } from '@/utils'
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
import { AppleControlBtn } from '@/components/AppleControlBtn'
|
import { MacOsControlBtn } from '@/components/MacOsControlBtn'
|
||||||
|
|
||||||
const {
|
const {
|
||||||
EllipsisHorizontalCircleSharpIcon,
|
EllipsisHorizontalCircleSharpIcon,
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
</n-space>
|
</n-space>
|
||||||
<!-- 顶部按钮 -->
|
<!-- 顶部按钮 -->
|
||||||
<n-space class="list-content-top">
|
<n-space class="list-content-top">
|
||||||
<AppleControlBtn
|
<MacOsControlBtn
|
||||||
:narrow="true"
|
:narrow="true"
|
||||||
:hidden="['close']"
|
:hidden="['close']"
|
||||||
@remove="closeHandle"
|
@remove="closeHandle"
|
||||||
@ -78,7 +78,7 @@
|
|||||||
import { reactive } from 'vue'
|
import { reactive } from 'vue'
|
||||||
import { renderIcon, renderLang, requireUrl } from '@/utils'
|
import { renderIcon, renderLang, requireUrl } from '@/utils'
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
import { AppleControlBtn } from '@/components/AppleControlBtn'
|
import { MacOsControlBtn } from '@/components/MacOsControlBtn'
|
||||||
|
|
||||||
const { HammerIcon } = icon.ionicons5
|
const { HammerIcon } = icon.ionicons5
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user