Merge branch 'dev' into master-fetch-dev
This commit is contained in:
commit
586db5aca1
@ -69,6 +69,22 @@
|
|||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
|
|
||||||
|
<!-- 预设滤镜 -->
|
||||||
|
<div v-if="presetImageList.length" class="preset-filter">
|
||||||
|
<n-image
|
||||||
|
class="preset-img"
|
||||||
|
width="46"
|
||||||
|
preview-disabled
|
||||||
|
object-fit="scale-down"
|
||||||
|
v-for="(item, index) in presetImageList"
|
||||||
|
:key="index"
|
||||||
|
:class="{ 'active-preset': item.hueRotate === chartStyles.hueRotate }"
|
||||||
|
:style="{ filter: `hue-rotate(${item.hueRotate}deg)` }"
|
||||||
|
:src="item.src"
|
||||||
|
@click="() => (chartStyles.hueRotate = item.hueRotate)"
|
||||||
|
></n-image>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- 混合模式 -->
|
<!-- 混合模式 -->
|
||||||
<setting-item-box v-if="!isCanvas" :alone="true">
|
<setting-item-box v-if="!isCanvas" :alone="true">
|
||||||
<template #name>
|
<template #name>
|
||||||
@ -149,10 +165,12 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { PropType } from 'vue'
|
import { ref, PropType } from 'vue'
|
||||||
import { PickCreateComponentType, BlendModeEnumList } from '@/packages/index.d'
|
import { PickCreateComponentType, BlendModeEnumList } from '@/packages/index.d'
|
||||||
import { SettingItemBox, SettingItem, CollapseItem } from '@/components/Pages/ChartItemSetting'
|
import { SettingItemBox, SettingItem, CollapseItem } from '@/components/Pages/ChartItemSetting'
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
|
import logoImg from '@/assets/logo.png'
|
||||||
|
import { useDesignStore } from '@/store/modules/designStore/designStore'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
isGroup: {
|
isGroup: {
|
||||||
@ -175,10 +193,48 @@ const { HelpOutlineIcon } = icon.ionicons5
|
|||||||
const sliderFormatTooltip = (v: string) => {
|
const sliderFormatTooltip = (v: string) => {
|
||||||
return `${(parseFloat(v) * 100).toFixed(0)}%`
|
return `${(parseFloat(v) * 100).toFixed(0)}%`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 角度格式化
|
// 角度格式化
|
||||||
const degFormatTooltip = (v: string) => {
|
const degFormatTooltip = (v: string) => {
|
||||||
return `${v}deg`
|
return `${v}deg`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 预设滤镜
|
||||||
|
interface presetImageData {
|
||||||
|
index: number
|
||||||
|
src: string
|
||||||
|
hueRotate: number
|
||||||
|
}
|
||||||
|
|
||||||
|
const presetImageList = ref([] as presetImageData[])
|
||||||
|
for (let i = 1; i <= 12; i++) {
|
||||||
|
presetImageList.value.push({
|
||||||
|
index: i,
|
||||||
|
src: logoImg,
|
||||||
|
hueRotate: i * 30
|
||||||
|
})
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped></style>
|
<style lang="scss" scoped>
|
||||||
|
// 预设滤镜
|
||||||
|
.preset-filter {
|
||||||
|
margin: 20px 0 10px 0;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: space-between;
|
||||||
|
.preset-img {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
padding: 2px;
|
||||||
|
border-radius: 6px;
|
||||||
|
transition: 0.2s all;
|
||||||
|
cursor: pointer;
|
||||||
|
&:hover {
|
||||||
|
box-shadow: 0 0 0 2px #66a9c9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.active-preset {
|
||||||
|
box-shadow: 0 0 0 2px #66a9c9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@ -30,10 +30,10 @@ export const useChartInteract = (
|
|||||||
const { Params, Header } = toRefs(chartEditStore.requestGlobalConfig.requestDataPond[globalConfigPindAprndex].dataPondRequestConfig.requestParams)
|
const { Params, Header } = toRefs(chartEditStore.requestGlobalConfig.requestDataPond[globalConfigPindAprndex].dataPondRequestConfig.requestParams)
|
||||||
|
|
||||||
Object.keys(item.interactFn).forEach(key => {
|
Object.keys(item.interactFn).forEach(key => {
|
||||||
if (Params.value[key]) {
|
if (key in Params.value) {
|
||||||
Params.value[key] = param[item.interactFn[key]]
|
Params.value[key] = param[item.interactFn[key]]
|
||||||
}
|
}
|
||||||
if (Header.value[key]) {
|
if (key in Header.value) {
|
||||||
Header.value[key] = param[item.interactFn[key]]
|
Header.value[key] = param[item.interactFn[key]]
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -43,10 +43,10 @@ export const useChartInteract = (
|
|||||||
const { Params, Header } = toRefs(chartEditStore.componentList[index].request.requestParams)
|
const { Params, Header } = toRefs(chartEditStore.componentList[index].request.requestParams)
|
||||||
|
|
||||||
Object.keys(item.interactFn).forEach(key => {
|
Object.keys(item.interactFn).forEach(key => {
|
||||||
if (Params.value[key]) {
|
if (key in Params.value) {
|
||||||
Params.value[key] = param[item.interactFn[key]]
|
Params.value[key] = param[item.interactFn[key]]
|
||||||
}
|
}
|
||||||
if (Header.value[key]) {
|
if (key in Header.value) {
|
||||||
Header.value[key] = param[item.interactFn[key]]
|
Header.value[key] = param[item.interactFn[key]]
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -1,218 +1,218 @@
|
|||||||
import throttle from 'lodash/throttle'
|
import throttle from 'lodash/throttle'
|
||||||
|
|
||||||
// 拆出来是为了更好的分离单独复用
|
// 拆出来是为了更好的分离单独复用
|
||||||
|
|
||||||
// * 屏幕缩放适配(两边留白)
|
// * 屏幕缩放适配(两边留白)
|
||||||
export const usePreviewFitScale = (
|
export const usePreviewFitScale = (
|
||||||
width: number,
|
width: number,
|
||||||
height: number,
|
height: number,
|
||||||
scaleDom: HTMLElement | null,
|
scaleDom: HTMLElement | null,
|
||||||
callback?: (scale: {
|
callback?: (scale: {
|
||||||
width: number;
|
width: number;
|
||||||
height: number;
|
height: number;
|
||||||
}) => void
|
}) => void
|
||||||
) => {
|
) => {
|
||||||
// * 画布尺寸(px)
|
// * 画布尺寸(px)
|
||||||
const baseWidth = width
|
const baseWidth = width
|
||||||
const baseHeight = height
|
const baseHeight = height
|
||||||
|
|
||||||
// * 默认缩放值
|
// * 默认缩放值
|
||||||
const scale = {
|
const scale = {
|
||||||
width: 1,
|
width: 1,
|
||||||
height: 1,
|
height: 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 需保持的比例
|
// * 需保持的比例
|
||||||
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
|
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
|
||||||
const calcRate = () => {
|
const calcRate = () => {
|
||||||
// 当前屏幕宽高比
|
// 当前屏幕宽高比
|
||||||
const currentRate = parseFloat(
|
const currentRate = parseFloat(
|
||||||
(window.innerWidth / window.innerHeight).toFixed(5)
|
(window.innerWidth / window.innerHeight).toFixed(5)
|
||||||
)
|
)
|
||||||
if (scaleDom) {
|
if (scaleDom) {
|
||||||
if (currentRate > baseProportion) {
|
if (currentRate > baseProportion) {
|
||||||
// 表示更宽
|
// 表示更宽
|
||||||
scale.width = parseFloat(((window.innerHeight * baseProportion) / baseWidth).toFixed(5))
|
scale.width = parseFloat(((window.innerHeight * baseProportion) / baseWidth).toFixed(5))
|
||||||
scale.height = parseFloat((window.innerHeight / baseHeight).toFixed(5))
|
scale.height = parseFloat((window.innerHeight / baseHeight).toFixed(5))
|
||||||
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
||||||
} else {
|
} else {
|
||||||
// 表示更高
|
// 表示更高
|
||||||
scale.height = parseFloat(((window.innerWidth / baseProportion) / baseHeight).toFixed(5))
|
scale.height = parseFloat(((window.innerWidth / baseProportion) / baseHeight).toFixed(5))
|
||||||
scale.width = parseFloat((window.innerWidth / baseWidth).toFixed(5))
|
scale.width = parseFloat((window.innerWidth / baseWidth).toFixed(5))
|
||||||
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
||||||
}
|
}
|
||||||
if (callback) callback(scale)
|
if (callback) callback(scale)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const resize = throttle(() => {
|
const resize = throttle(() => {
|
||||||
calcRate()
|
calcRate()
|
||||||
}, 200)
|
}, 200)
|
||||||
|
|
||||||
// * 改变窗口大小重新绘制
|
// * 改变窗口大小重新绘制
|
||||||
const windowResize = () => {
|
const windowResize = () => {
|
||||||
window.addEventListener('resize', resize)
|
window.addEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 改变窗口大小重新绘制
|
// * 卸载监听
|
||||||
const unWindowResize = () => {
|
const unWindowResize = () => {
|
||||||
window.removeEventListener('resize', resize)
|
window.removeEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
calcRate,
|
calcRate,
|
||||||
windowResize,
|
windowResize,
|
||||||
unWindowResize,
|
unWindowResize,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// * X轴撑满,Y轴滚动条
|
// * X轴撑满,Y轴滚动条
|
||||||
export const usePreviewScrollYScale = (
|
export const usePreviewScrollYScale = (
|
||||||
width: number,
|
width: number,
|
||||||
height: number,
|
height: number,
|
||||||
scaleDom: HTMLElement | null,
|
scaleDom: HTMLElement | null,
|
||||||
callback?: (scale: {
|
callback?: (scale: {
|
||||||
width: number;
|
width: number;
|
||||||
height: number;
|
height: number;
|
||||||
}) => void
|
}) => void
|
||||||
) => {
|
) => {
|
||||||
// * 画布尺寸(px)
|
// * 画布尺寸(px)
|
||||||
const baseWidth = width
|
const baseWidth = width
|
||||||
const baseHeight = height
|
const baseHeight = height
|
||||||
|
|
||||||
// * 默认缩放值
|
// * 默认缩放值
|
||||||
const scale = {
|
const scale = {
|
||||||
width: 1,
|
width: 1,
|
||||||
height: 1,
|
height: 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 需保持的比例
|
// * 需保持的比例
|
||||||
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
|
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
|
||||||
const calcRate = () => {
|
const calcRate = () => {
|
||||||
if (scaleDom) {
|
if (scaleDom) {
|
||||||
scale.height = parseFloat(((window.innerWidth / baseProportion) / baseHeight).toFixed(5))
|
scale.height = parseFloat(((window.innerWidth / baseProportion) / baseHeight).toFixed(5))
|
||||||
scale.width = parseFloat((window.innerWidth / baseWidth).toFixed(5))
|
scale.width = parseFloat((window.innerWidth / baseWidth).toFixed(5))
|
||||||
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
||||||
if (callback) callback(scale)
|
if (callback) callback(scale)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const resize = throttle(() => {
|
const resize = throttle(() => {
|
||||||
calcRate()
|
calcRate()
|
||||||
}, 200)
|
}, 200)
|
||||||
|
|
||||||
// * 改变窗口大小重新绘制
|
// * 改变窗口大小重新绘制
|
||||||
const windowResize = () => {
|
const windowResize = () => {
|
||||||
window.addEventListener('resize', resize)
|
window.addEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 改变窗口大小重新绘制
|
// * 卸载监听
|
||||||
const unWindowResize = () => {
|
const unWindowResize = () => {
|
||||||
window.removeEventListener('resize', resize)
|
window.removeEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
calcRate,
|
calcRate,
|
||||||
windowResize,
|
windowResize,
|
||||||
unWindowResize,
|
unWindowResize,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// * Y轴撑满,X轴滚动条
|
// * Y轴撑满,X轴滚动条
|
||||||
export const usePreviewScrollXScale = (
|
export const usePreviewScrollXScale = (
|
||||||
width: number,
|
width: number,
|
||||||
height: number,
|
height: number,
|
||||||
scaleDom: HTMLElement | null,
|
scaleDom: HTMLElement | null,
|
||||||
callback?: (scale: {
|
callback?: (scale: {
|
||||||
width: number;
|
width: number;
|
||||||
height: number;
|
height: number;
|
||||||
}) => void
|
}) => void
|
||||||
) => {
|
) => {
|
||||||
// * 画布尺寸(px)
|
// * 画布尺寸(px)
|
||||||
const baseWidth = width
|
const baseWidth = width
|
||||||
const baseHeight = height
|
const baseHeight = height
|
||||||
|
|
||||||
// * 默认缩放值
|
// * 默认缩放值
|
||||||
const scale = {
|
const scale = {
|
||||||
height: 1,
|
height: 1,
|
||||||
width: 1,
|
width: 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 需保持的比例
|
// * 需保持的比例
|
||||||
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
|
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
|
||||||
const calcRate = () => {
|
const calcRate = () => {
|
||||||
if (scaleDom) {
|
if (scaleDom) {
|
||||||
scale.width = parseFloat(((window.innerHeight * baseProportion) / baseWidth).toFixed(5))
|
scale.width = parseFloat(((window.innerHeight * baseProportion) / baseWidth).toFixed(5))
|
||||||
scale.height = parseFloat((window.innerHeight / baseHeight).toFixed(5))
|
scale.height = parseFloat((window.innerHeight / baseHeight).toFixed(5))
|
||||||
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
||||||
if (callback) callback(scale)
|
if (callback) callback(scale)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const resize = throttle(() => {
|
const resize = throttle(() => {
|
||||||
calcRate()
|
calcRate()
|
||||||
}, 200)
|
}, 200)
|
||||||
|
|
||||||
// * 改变窗口大小重新绘制
|
// * 改变窗口大小重新绘制
|
||||||
const windowResize = () => {
|
const windowResize = () => {
|
||||||
window.addEventListener('resize', resize)
|
window.addEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 改变窗口大小重新绘制
|
// * 卸载监听
|
||||||
const unWindowResize = () => {
|
const unWindowResize = () => {
|
||||||
window.removeEventListener('resize', resize)
|
window.removeEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
calcRate,
|
calcRate,
|
||||||
windowResize,
|
windowResize,
|
||||||
unWindowResize,
|
unWindowResize,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 变形内容,宽高铺满
|
// * 变形内容,宽高铺满
|
||||||
export const usePreviewFullScale = (
|
export const usePreviewFullScale = (
|
||||||
width: number,
|
width: number,
|
||||||
height: number,
|
height: number,
|
||||||
scaleDom: HTMLElement | null,
|
scaleDom: HTMLElement | null,
|
||||||
callback?: (scale: {
|
callback?: (scale: {
|
||||||
width: number;
|
width: number;
|
||||||
height: number;
|
height: number;
|
||||||
}) => void
|
}) => void
|
||||||
) => {
|
) => {
|
||||||
|
|
||||||
// * 默认缩放值
|
// * 默认缩放值
|
||||||
const scale = {
|
const scale = {
|
||||||
width: 1,
|
width: 1,
|
||||||
height: 1,
|
height: 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
const calcRate = () => {
|
const calcRate = () => {
|
||||||
if (scaleDom) {
|
if (scaleDom) {
|
||||||
scale.width = parseFloat((window.innerWidth / width).toFixed(5))
|
scale.width = parseFloat((window.innerWidth / width).toFixed(5))
|
||||||
scale.height = parseFloat((window.innerHeight / height).toFixed(5))
|
scale.height = parseFloat((window.innerHeight / height).toFixed(5))
|
||||||
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
||||||
if (callback) callback(scale)
|
if (callback) callback(scale)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const resize = throttle(() => {
|
const resize = throttle(() => {
|
||||||
calcRate()
|
calcRate()
|
||||||
}, 200)
|
}, 200)
|
||||||
|
|
||||||
// * 改变窗口大小重新绘制
|
// * 改变窗口大小重新绘制
|
||||||
const windowResize = () => {
|
const windowResize = () => {
|
||||||
window.addEventListener('resize', resize)
|
window.addEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 改变窗口大小重新绘制
|
// * 卸载监听
|
||||||
const unWindowResize = () => {
|
const unWindowResize = () => {
|
||||||
window.removeEventListener('resize', resize)
|
window.removeEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
calcRate,
|
calcRate,
|
||||||
windowResize,
|
windowResize,
|
||||||
unWindowResize,
|
unWindowResize,
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -63,7 +63,7 @@ watch(
|
|||||||
() => props.chartConfig.option,
|
() => props.chartConfig.option,
|
||||||
newVal => {
|
newVal => {
|
||||||
try {
|
try {
|
||||||
updateDatasetHandler((newVal as OptionType).dataset)
|
updateDatasetHandler((newVal as any as OptionType).dataset)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
console.log(error)
|
||||||
}
|
}
|
||||||
|
13
src/packages/components/Informations/Inputs/InputsDate/config.ts
Normal file → Executable file
13
src/packages/components/Informations/Inputs/InputsDate/config.ts
Normal file → Executable file
@ -4,7 +4,7 @@ import { PublicConfigClass } from '@/packages/public'
|
|||||||
import { CreateComponentType } from '@/packages/index.d'
|
import { CreateComponentType } from '@/packages/index.d'
|
||||||
import { chartInitConfig } from '@/settings/designSetting'
|
import { chartInitConfig } from '@/settings/designSetting'
|
||||||
import { COMPONENT_INTERACT_EVENT_KET } from '@/enums/eventEnum'
|
import { COMPONENT_INTERACT_EVENT_KET } from '@/enums/eventEnum'
|
||||||
import { interactActions, ComponentInteractEventEnum } from './interact'
|
import { interactActions, ComponentInteractEventEnum, DefaultTypeEnum, DifferUnitEnum } from './interact'
|
||||||
import { InputsDateConfig } from './index'
|
import { InputsDateConfig } from './index'
|
||||||
|
|
||||||
export const option = {
|
export const option = {
|
||||||
@ -12,9 +12,14 @@ export const option = {
|
|||||||
[COMPONENT_INTERACT_EVENT_KET]: ComponentInteractEventEnum.DATE,
|
[COMPONENT_INTERACT_EVENT_KET]: ComponentInteractEventEnum.DATE,
|
||||||
// 下拉展示
|
// 下拉展示
|
||||||
isPanel: 0,
|
isPanel: 0,
|
||||||
dataset: dayjs().valueOf(),
|
// 默认值
|
||||||
differValue: 0
|
dataset: dayjs().valueOf() as number | number[] | null,
|
||||||
|
// 默认值类型
|
||||||
|
defaultType: DefaultTypeEnum.STATIC,
|
||||||
|
// 动态默认值偏移单位
|
||||||
|
differUnit: [DifferUnitEnum.DAY, DifferUnitEnum.DAY],
|
||||||
|
// 动态默认值偏移值
|
||||||
|
differValue: [0, 0]
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class Config extends PublicConfigClass implements CreateComponentType {
|
export default class Config extends PublicConfigClass implements CreateComponentType {
|
||||||
|
135
src/packages/components/Informations/Inputs/InputsDate/config.vue
Normal file → Executable file
135
src/packages/components/Informations/Inputs/InputsDate/config.vue
Normal file → Executable file
@ -8,39 +8,67 @@
|
|||||||
<collapse-item name="时间配置" :expanded="true">
|
<collapse-item name="时间配置" :expanded="true">
|
||||||
<setting-item-box name="基础">
|
<setting-item-box name="基础">
|
||||||
<setting-item name="类型">
|
<setting-item name="类型">
|
||||||
<n-select v-model:value="optionData.componentInteractEventKey" size="small" :options="datePickerTypeOptions" />
|
<n-select v-model:value="optionData.componentInteractEventKey" size="small" :options="datePickerTypeOptions"
|
||||||
|
@update:value="datePickerTypeUpdate"/>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
|
|
||||||
<setting-item-box name="默认值" :alone="true">
|
<setting-item-box name="默认值">
|
||||||
<n-date-picker size="small" v-model:value="optionData.dataset" :type="optionData.componentInteractEventKey" />
|
<setting-item name="类型">
|
||||||
</setting-item-box>
|
<n-select v-model:value="optionData.defaultType" size="small" :options="defaultTypeOptions"
|
||||||
|
@update:value="defaultTypeUpdate" />
|
||||||
|
</setting-item>
|
||||||
|
|
||||||
<setting-item-box :alone="true">
|
</setting-item-box>
|
||||||
|
<setting-item-box v-if="optionData.defaultType === DefaultTypeEnum.STATIC" :alone="true">
|
||||||
|
<setting-item name="静态默认值">
|
||||||
|
<n-date-picker size="small" clearable v-model:value="optionData.dataset" :type="optionData.componentInteractEventKey" />
|
||||||
|
</setting-item>
|
||||||
|
</setting-item-box>
|
||||||
|
<setting-item-box v-if="optionData.defaultType === DefaultTypeEnum.DYNAMIC" >
|
||||||
<template #name>
|
<template #name>
|
||||||
<n-text>动态</n-text>
|
<n-text></n-text>
|
||||||
<n-tooltip trigger="hover">
|
<n-tooltip trigger="hover">
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<n-icon size="21" :depth="3">
|
<n-icon size="21" :depth="3">
|
||||||
<help-outline-icon></help-outline-icon>
|
<help-outline-icon></help-outline-icon>
|
||||||
</n-icon>
|
</n-icon>
|
||||||
</template>
|
</template>
|
||||||
<n-text>动态值不为0时,默认值:取当天时间相加当前值</n-text>
|
<span>打开页面时浏览器操作系统的系统时间+偏移量(单位)</span>
|
||||||
</n-tooltip>
|
</n-tooltip>
|
||||||
</template>
|
</template>
|
||||||
<n-input-number v-model:value="optionData.differValue" class="input-num-width" size="small" :min="-40" :max="40">
|
<setting-item :name="differValueName">
|
||||||
<template #suffix> 天 </template>
|
<n-input-number v-model:value="optionData.differValue[0]" class="input-num-width" size="small">
|
||||||
</n-input-number>
|
<template #suffix>
|
||||||
|
{{DifferUnitObject[optionData.differUnit[0]]}}
|
||||||
|
</template>
|
||||||
|
</n-input-number>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item :name="differUnitName">
|
||||||
|
<n-select v-model:value="optionData.differUnit[0]" size="small" :options="differUnitOptions" />
|
||||||
|
</setting-item>
|
||||||
|
<setting-item v-if="isRange" name="结束值动态偏移量">
|
||||||
|
<n-input-number v-model:value="optionData.differValue[1]" class="input-num-width" size="small">
|
||||||
|
<template #suffix>
|
||||||
|
{{DifferUnitObject[optionData.differUnit[1]]}}
|
||||||
|
</template>
|
||||||
|
</n-input-number>
|
||||||
|
</setting-item>
|
||||||
|
<setting-item v-if="isRange" name="结束值偏移单位">
|
||||||
|
<n-select v-model:value="optionData.differUnit[1]" size="small" :options="differUnitOptions" />
|
||||||
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
|
|
||||||
</collapse-item>
|
</collapse-item>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { PropType } from 'vue'
|
import { PropType, computed } from 'vue'
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
|
import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
|
||||||
import { option } from './config'
|
import { option } from './config'
|
||||||
import { ComponentInteractEventEnum } from './interact'
|
import { ComponentInteractEventEnum, DefaultTypeEnum, DifferUnitEnum, DifferUnitObject } from './interact'
|
||||||
|
import dayjs from "dayjs";
|
||||||
|
|
||||||
const { HelpOutlineIcon } = icon.ionicons5
|
const { HelpOutlineIcon } = icon.ionicons5
|
||||||
|
|
||||||
@ -100,4 +128,87 @@ const datePickerTypeOptions = [
|
|||||||
value: ComponentInteractEventEnum.QUARTER_RANGE
|
value: ComponentInteractEventEnum.QUARTER_RANGE
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
const defaultTypeOptions = [
|
||||||
|
{
|
||||||
|
label: '静态',
|
||||||
|
value: DefaultTypeEnum.STATIC
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '动态',
|
||||||
|
value: DefaultTypeEnum.DYNAMIC
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '无',
|
||||||
|
value: DefaultTypeEnum.NONE
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
const differUnitOptions = [
|
||||||
|
// ManipulateType
|
||||||
|
{
|
||||||
|
value: DifferUnitEnum.DAY,
|
||||||
|
label: DifferUnitObject[DifferUnitEnum.DAY]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: DifferUnitEnum.WEEK,
|
||||||
|
label: DifferUnitObject[DifferUnitEnum.WEEK]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: DifferUnitEnum.MONTH,
|
||||||
|
label: DifferUnitObject[DifferUnitEnum.MONTH]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: DifferUnitEnum.QUARTER,
|
||||||
|
label: DifferUnitObject[DifferUnitEnum.QUARTER]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: DifferUnitEnum.YEAR,
|
||||||
|
label: DifferUnitObject[DifferUnitEnum.YEAR]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: DifferUnitEnum.HOUR,
|
||||||
|
label: DifferUnitObject[DifferUnitEnum.HOUR]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: DifferUnitEnum.MINUTE,
|
||||||
|
label: DifferUnitObject[DifferUnitEnum.MINUTE]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: DifferUnitEnum.SECOND,
|
||||||
|
label: DifferUnitObject[DifferUnitEnum.SECOND]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: DifferUnitEnum.MILLISECOND,
|
||||||
|
label: DifferUnitObject[DifferUnitEnum.MILLISECOND]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
const isRange = computed(() => {
|
||||||
|
return props.optionData.componentInteractEventKey.endsWith('range')
|
||||||
|
})
|
||||||
|
|
||||||
|
const differValueName = computed(() => {
|
||||||
|
return isRange.value ? '开始值动态偏移量' : '动态偏移量'
|
||||||
|
})
|
||||||
|
|
||||||
|
const differUnitName = computed(() => {
|
||||||
|
return isRange.value ? '开始值偏移单位' : '偏移单位'
|
||||||
|
})
|
||||||
|
|
||||||
|
const datePickerTypeUpdate = () => {
|
||||||
|
props.optionData.dataset = isRange.value ? [dayjs().valueOf(), dayjs().valueOf()] : dayjs().valueOf()
|
||||||
|
}
|
||||||
|
|
||||||
|
const defaultTypeUpdate = (v: string) => {
|
||||||
|
if (v === DefaultTypeEnum.STATIC) {
|
||||||
|
datePickerTypeUpdate()
|
||||||
|
} else {
|
||||||
|
// DefaultTypeEnum.
|
||||||
|
props.optionData.dataset = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
135
src/packages/components/Informations/Inputs/InputsDate/index.vue
Normal file → Executable file
135
src/packages/components/Informations/Inputs/InputsDate/index.vue
Normal file → Executable file
@ -1,6 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<n-date-picker
|
<n-date-picker
|
||||||
v-model:value="option.dataset"
|
v-model:value="option.dataset"
|
||||||
|
clearable
|
||||||
:panel="!!chartConfig.option.isPanel"
|
:panel="!!chartConfig.option.isPanel"
|
||||||
:type="chartConfig.option.componentInteractEventKey"
|
:type="chartConfig.option.componentInteractEventKey"
|
||||||
:style="`width:${w}px;`"
|
:style="`width:${w}px;`"
|
||||||
@ -9,13 +10,15 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { PropType, toRefs, ref, shallowReactive, watch } from 'vue'
|
import { computed, PropType, ref, shallowReactive, toRefs, watch } from 'vue'
|
||||||
import dayjs from 'dayjs'
|
|
||||||
import { CreateComponentType } from '@/packages/index.d'
|
import { CreateComponentType } from '@/packages/index.d'
|
||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
import { useChartInteract } from '@/hooks'
|
import { useChartInteract } from '@/hooks'
|
||||||
import { InteractEventOn } from '@/enums/eventEnum'
|
import { InteractEventOn } from '@/enums/eventEnum'
|
||||||
import { ComponentInteractParamsEnum } from './interact'
|
import {ComponentInteractEventEnum, ComponentInteractParamsEnum, DefaultTypeEnum} from './interact'
|
||||||
|
import dayjs, {ManipulateType} from 'dayjs'
|
||||||
|
import quarterOfYear from 'dayjs/plugin/quarterOfYear';
|
||||||
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
chartConfig: {
|
chartConfig: {
|
||||||
@ -31,61 +34,107 @@ const option = shallowReactive({
|
|||||||
dataset: props.chartConfig.option.dataset
|
dataset: props.chartConfig.option.dataset
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const isRange = computed(() => {
|
||||||
|
return props.chartConfig.option.componentInteractEventKey.endsWith('range')
|
||||||
|
})
|
||||||
|
|
||||||
// 监听事件改变
|
// 监听事件改变
|
||||||
const onChange = (v: number | number[]) => {
|
const onChange = (v: number | number[] | null) => {
|
||||||
if (v instanceof Array) {
|
if (isRange.value) {
|
||||||
|
let dateStart = null
|
||||||
|
let dateEnd = null
|
||||||
|
let daterange = null
|
||||||
|
if(v instanceof Array){
|
||||||
|
dateStart = v[0]
|
||||||
|
dateEnd = v[1]
|
||||||
|
daterange = `${v[0]}-${v[1]}`
|
||||||
|
}
|
||||||
// 存储到联动数据
|
// 存储到联动数据
|
||||||
useChartInteract(
|
useChartInteract(
|
||||||
props.chartConfig,
|
props.chartConfig,
|
||||||
useChartEditStore,
|
useChartEditStore,
|
||||||
{
|
{
|
||||||
[ComponentInteractParamsEnum.DATE_START]: v[0] || dayjs().valueOf(),
|
[ComponentInteractParamsEnum.DATE_START]: dateStart,
|
||||||
[ComponentInteractParamsEnum.DATE_END]: v[1] || dayjs().valueOf(),
|
[ComponentInteractParamsEnum.DATE_END]: dateEnd,
|
||||||
[ComponentInteractParamsEnum.DATE_RANGE]: `${v[0] || dayjs().valueOf()}-${v[1] || dayjs().valueOf()}`
|
[ComponentInteractParamsEnum.DATE_RANGE]: daterange
|
||||||
},
|
},
|
||||||
InteractEventOn.CHANGE
|
InteractEventOn.CHANGE
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
// 存储到联动数据
|
// 存储到联动数据
|
||||||
useChartInteract(
|
useChartInteract(
|
||||||
props.chartConfig,
|
props.chartConfig,
|
||||||
useChartEditStore,
|
useChartEditStore,
|
||||||
{ [ComponentInteractParamsEnum.DATE]: v || dayjs().valueOf() },
|
{ [ComponentInteractParamsEnum.DATE]: v },
|
||||||
InteractEventOn.CHANGE
|
InteractEventOn.CHANGE
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
watch(
|
const getDiffDate = (type: ComponentInteractEventEnum, date: dayjs.Dayjs) => {
|
||||||
() => props.chartConfig.option.dataset,
|
// 注册 quarterOfYear 插件
|
||||||
(newData: number | number[]) => {
|
dayjs.extend(quarterOfYear)
|
||||||
option.dataset = newData
|
switch (type) {
|
||||||
// 关联目标组件首次请求带上默认内容
|
case ComponentInteractEventEnum.DATE:
|
||||||
onChange(newData)
|
case ComponentInteractEventEnum.DATE_RANGE:
|
||||||
},
|
date = date.startOf('day')
|
||||||
{
|
break
|
||||||
immediate: true
|
case ComponentInteractEventEnum.MONTH:
|
||||||
|
case ComponentInteractEventEnum.MONTH_RANGE:
|
||||||
|
date = date.startOf('month')
|
||||||
|
break
|
||||||
|
case ComponentInteractEventEnum.YEAR:
|
||||||
|
case ComponentInteractEventEnum.YEAR_RANGE:
|
||||||
|
date = date.startOf('year')
|
||||||
|
break
|
||||||
|
case ComponentInteractEventEnum.QUARTER:
|
||||||
|
case ComponentInteractEventEnum.QUARTER_RANGE:
|
||||||
|
date = date.startOf('quarter')
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
break
|
||||||
}
|
}
|
||||||
)
|
return date
|
||||||
|
}
|
||||||
|
|
||||||
// 手动更新
|
|
||||||
watch(
|
watch(
|
||||||
() => props.chartConfig.option.differValue,
|
() => {
|
||||||
(newData: number) => {
|
return {
|
||||||
if (props.chartConfig.option.differValue === 0) return
|
type: props.chartConfig.option.componentInteractEventKey as ComponentInteractEventEnum,
|
||||||
if (typeof option.dataset === 'object') {
|
defaultType: props.chartConfig.option.defaultType as string,
|
||||||
option.dataset[0] = dayjs().add(newData, 'day').valueOf()
|
differValue: props.chartConfig.option.differValue as number[],
|
||||||
option.dataset[1] = dayjs().add(newData, 'day').valueOf()
|
differUnit: props.chartConfig.option.differUnit as ManipulateType[],
|
||||||
} else {
|
dataset: props.chartConfig.option.dataset as number | number[] | null,
|
||||||
option.dataset = dayjs().add(newData, 'day').valueOf()
|
};
|
||||||
|
},
|
||||||
|
(newData, oldData) => {
|
||||||
|
const hasTypeChanged = newData.type !== oldData?.type;
|
||||||
|
const hasDefaultTypeChanged = newData.defaultType !== oldData?.defaultType;
|
||||||
|
const hasDifferValueChanged = newData.differValue !== oldData?.differValue;
|
||||||
|
const hasDifferUnitChanged = newData.differUnit !== oldData?.differUnit;
|
||||||
|
|
||||||
|
if (hasTypeChanged || hasDefaultTypeChanged || hasDifferValueChanged || hasDifferUnitChanged) {
|
||||||
|
if (newData.defaultType === DefaultTypeEnum.NONE) {
|
||||||
|
props.chartConfig.option.dataset = null;
|
||||||
|
} else if (newData.defaultType === DefaultTypeEnum.DYNAMIC) {
|
||||||
|
let date = dayjs();
|
||||||
|
if (isRange.value) {
|
||||||
|
props.chartConfig.option.dataset = [
|
||||||
|
getDiffDate(newData.type,date.add(newData.differValue[0], newData.differUnit[0])).valueOf(),
|
||||||
|
getDiffDate(newData.type,date.add(newData.differValue[1], newData.differUnit[1])).valueOf(),
|
||||||
|
];
|
||||||
|
} else {
|
||||||
|
props.chartConfig.option.dataset = getDiffDate(newData.type,date.add(newData.differValue[0], newData.differUnit[0])).valueOf()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
option.dataset = props.chartConfig.option.dataset;
|
||||||
|
onChange(option.dataset);
|
||||||
|
},
|
||||||
|
{
|
||||||
|
immediate: true,
|
||||||
}
|
}
|
||||||
// 关联目标组件首次请求带上默认内容
|
);
|
||||||
onChange(newData)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
immediate: true
|
|
||||||
}
|
|
||||||
)
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
31
src/packages/components/Informations/Inputs/InputsDate/interact.ts
Normal file → Executable file
31
src/packages/components/Informations/Inputs/InputsDate/interact.ts
Normal file → Executable file
@ -22,6 +22,37 @@ export enum ComponentInteractParamsEnum {
|
|||||||
DATE_RANGE = 'daterange'
|
DATE_RANGE = 'daterange'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum DefaultTypeEnum {
|
||||||
|
NONE = "none",
|
||||||
|
STATIC = "static",
|
||||||
|
DYNAMIC = "dynamic"
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum DifferUnitEnum {
|
||||||
|
DAY = 'd',
|
||||||
|
WEEK = 'w',
|
||||||
|
MONTH = 'M',
|
||||||
|
QUARTER = 'Q',
|
||||||
|
YEAR = 'y',
|
||||||
|
HOUR = 'h',
|
||||||
|
MINUTE = 'm',
|
||||||
|
SECOND = 's',
|
||||||
|
MILLISECOND = 'ms',
|
||||||
|
}
|
||||||
|
|
||||||
|
export const DifferUnitObject = {
|
||||||
|
// https://day.js.org/docs/en/manipulate/add
|
||||||
|
[DifferUnitEnum.DAY]: '天',
|
||||||
|
[DifferUnitEnum.WEEK]: '周',
|
||||||
|
[DifferUnitEnum.MONTH]: '月',
|
||||||
|
[DifferUnitEnum.QUARTER]: '季度',
|
||||||
|
[DifferUnitEnum.YEAR]: '年',
|
||||||
|
[DifferUnitEnum.HOUR]: '小时',
|
||||||
|
[DifferUnitEnum.MINUTE]: '分钟',
|
||||||
|
[DifferUnitEnum.SECOND]: '秒',
|
||||||
|
[DifferUnitEnum.MILLISECOND]: '毫秒',
|
||||||
|
}
|
||||||
|
|
||||||
const time = [
|
const time = [
|
||||||
{
|
{
|
||||||
value: ComponentInteractParamsEnum.DATE,
|
value: ComponentInteractParamsEnum.DATE,
|
||||||
|
@ -131,7 +131,11 @@ const sendHandle = async () => {
|
|||||||
loading.value = false
|
loading.value = false
|
||||||
if (res) {
|
if (res) {
|
||||||
const { data } = res
|
const { data } = res
|
||||||
if (!data && !targetData.value.filter) window['$message'].warning('您的数据不符合默认格式,请配置过滤器!')
|
if (!data && !targetData.value.filter) {
|
||||||
|
window['$message'].warning('您的数据不符合默认格式,请配置过滤器!')
|
||||||
|
showMatching.value = true
|
||||||
|
return
|
||||||
|
}
|
||||||
targetData.value.option.dataset = newFunctionHandle(data, res, targetData.value.filter)
|
targetData.value.option.dataset = newFunctionHandle(data, res, targetData.value.filter)
|
||||||
showMatching.value = true
|
showMatching.value = true
|
||||||
return
|
return
|
||||||
|
@ -117,7 +117,11 @@ const sendHandle = async () => {
|
|||||||
const res = await customizeHttp(toRaw(targetData.value.request), toRaw(chartEditStore.getRequestGlobalConfig))
|
const res = await customizeHttp(toRaw(targetData.value.request), toRaw(chartEditStore.getRequestGlobalConfig))
|
||||||
loading.value = false
|
loading.value = false
|
||||||
if (res) {
|
if (res) {
|
||||||
if (!res?.data && !targetData.value.filter) window['$message'].warning('您的数据不符合默认格式,请配置过滤器!')
|
if (!res?.data && !targetData.value.filter) {
|
||||||
|
window['$message'].warning('您的数据不符合默认格式,请配置过滤器!')
|
||||||
|
showMatching.value = true
|
||||||
|
return
|
||||||
|
}
|
||||||
targetData.value.option.dataset = newFunctionHandle(res?.data, res, targetData.value.filter)
|
targetData.value.option.dataset = newFunctionHandle(res?.data, res, targetData.value.filter)
|
||||||
showMatching.value = true
|
showMatching.value = true
|
||||||
return
|
return
|
||||||
|
@ -159,9 +159,11 @@ const dragCanvas = (e: any) => {
|
|||||||
const canvasBox = () => {
|
const canvasBox = () => {
|
||||||
const layoutDom = document.getElementById('go-chart-edit-layout')
|
const layoutDom = document.getElementById('go-chart-edit-layout')
|
||||||
if (layoutDom) {
|
if (layoutDom) {
|
||||||
|
// 此处减去滚动条的宽度和高度
|
||||||
|
const scrollW = 20
|
||||||
return {
|
return {
|
||||||
height: layoutDom.clientHeight - 25,
|
height: layoutDom.clientHeight - scrollW,
|
||||||
width: layoutDom.clientWidth
|
width: layoutDom.clientWidth - scrollW
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
|
@ -13,7 +13,33 @@ export const useScale = (localStorageInfo: ChartEditStorageType) => {
|
|||||||
const height = ref(localStorageInfo.editCanvasConfig.height)
|
const height = ref(localStorageInfo.editCanvasConfig.height)
|
||||||
const scaleRef = ref({ width: 1, height: 1 })
|
const scaleRef = ref({ width: 1, height: 1 })
|
||||||
|
|
||||||
provide(SCALE_KEY, scaleRef);
|
provide(SCALE_KEY, scaleRef)
|
||||||
|
|
||||||
|
// 监听鼠标滚轮 +ctrl 键
|
||||||
|
const useAddWheelHandle = (removeEvent: Function) => {
|
||||||
|
addEventListener(
|
||||||
|
'wheel',
|
||||||
|
(e: any) => {
|
||||||
|
if (window?.$KeyboardActive?.ctrl) {
|
||||||
|
e.preventDefault()
|
||||||
|
e.stopPropagation()
|
||||||
|
removeEvent()
|
||||||
|
const fitDom = document.querySelector(".go-preview.fit") as HTMLElement
|
||||||
|
if (fitDom) fitDom.style.overflow = 'auto'
|
||||||
|
const transform = previewRef.value.style.transform
|
||||||
|
// 使用正则解析 scale(1, 1) 中的两个数值
|
||||||
|
const regRes = transform.match(/scale\((\d+\.?\d*)*/) as RegExpMatchArray
|
||||||
|
const width = regRes[1]
|
||||||
|
if (e.wheelDelta > 0) {
|
||||||
|
previewRef.value.style.transform = `scale(${parseFloat(Number(width).toFixed(2)) + 0.1})`
|
||||||
|
} else {
|
||||||
|
previewRef.value.style.transform = `scale(${parseFloat(Number(width).toFixed(2)) - 0.1})`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ passive: false }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
const updateScaleRef = (scale: { width: number; height: number }) => {
|
const updateScaleRef = (scale: { width: number; height: number }) => {
|
||||||
// 这里需要解构,保证赋值给scaleRef的为一个新对象
|
// 这里需要解构,保证赋值给scaleRef的为一个新对象
|
||||||
@ -24,74 +50,82 @@ export const useScale = (localStorageInfo: ChartEditStorageType) => {
|
|||||||
// 屏幕适配
|
// 屏幕适配
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
switch (localStorageInfo.editCanvasConfig.previewScaleType) {
|
switch (localStorageInfo.editCanvasConfig.previewScaleType) {
|
||||||
case PreviewScaleEnum.FIT: (() => {
|
case PreviewScaleEnum.FIT:
|
||||||
const { calcRate, windowResize, unWindowResize } = usePreviewFitScale(
|
;(() => {
|
||||||
width.value as number,
|
const { calcRate, windowResize, unWindowResize } = usePreviewFitScale(
|
||||||
height.value as number,
|
width.value as number,
|
||||||
previewRef.value,
|
height.value as number,
|
||||||
updateScaleRef
|
previewRef.value,
|
||||||
)
|
updateScaleRef
|
||||||
calcRate()
|
)
|
||||||
windowResize()
|
calcRate()
|
||||||
onUnmounted(() => {
|
windowResize()
|
||||||
unWindowResize()
|
useAddWheelHandle(unWindowResize)
|
||||||
})
|
onUnmounted(() => {
|
||||||
})()
|
unWindowResize()
|
||||||
break;
|
})
|
||||||
case PreviewScaleEnum.SCROLL_Y: (() => {
|
})()
|
||||||
const { calcRate, windowResize, unWindowResize } = usePreviewScrollYScale(
|
break
|
||||||
width.value as number,
|
case PreviewScaleEnum.SCROLL_Y:
|
||||||
height.value as number,
|
;(() => {
|
||||||
previewRef.value,
|
const { calcRate, windowResize, unWindowResize } = usePreviewScrollYScale(
|
||||||
(scale) => {
|
width.value as number,
|
||||||
const dom = entityRef.value
|
height.value as number,
|
||||||
dom.style.width = `${width.value * scale.width}px`
|
previewRef.value,
|
||||||
dom.style.height = `${height.value * scale.height}px`
|
scale => {
|
||||||
updateScaleRef(scale)
|
const dom = entityRef.value
|
||||||
}
|
dom.style.width = `${width.value * scale.width}px`
|
||||||
)
|
dom.style.height = `${height.value * scale.height}px`
|
||||||
calcRate()
|
updateScaleRef(scale)
|
||||||
windowResize()
|
}
|
||||||
onUnmounted(() => {
|
)
|
||||||
unWindowResize()
|
calcRate()
|
||||||
})
|
windowResize()
|
||||||
})()
|
useAddWheelHandle(unWindowResize)
|
||||||
|
onUnmounted(() => {
|
||||||
|
unWindowResize()
|
||||||
|
})
|
||||||
|
})()
|
||||||
|
|
||||||
break;
|
break
|
||||||
case PreviewScaleEnum.SCROLL_X: (() => {
|
case PreviewScaleEnum.SCROLL_X:
|
||||||
const { calcRate, windowResize, unWindowResize } = usePreviewScrollXScale(
|
;(() => {
|
||||||
width.value as number,
|
const { calcRate, windowResize, unWindowResize } = usePreviewScrollXScale(
|
||||||
height.value as number,
|
width.value as number,
|
||||||
previewRef.value,
|
height.value as number,
|
||||||
(scale) => {
|
previewRef.value,
|
||||||
const dom = entityRef.value
|
scale => {
|
||||||
dom.style.width = `${width.value * scale.width}px`
|
const dom = entityRef.value
|
||||||
dom.style.height = `${height.value * scale.height}px`
|
dom.style.width = `${width.value * scale.width}px`
|
||||||
updateScaleRef(scale)
|
dom.style.height = `${height.value * scale.height}px`
|
||||||
}
|
updateScaleRef(scale)
|
||||||
)
|
}
|
||||||
calcRate()
|
)
|
||||||
windowResize()
|
calcRate()
|
||||||
onUnmounted(() => {
|
windowResize()
|
||||||
unWindowResize()
|
useAddWheelHandle(unWindowResize)
|
||||||
})
|
onUnmounted(() => {
|
||||||
})()
|
unWindowResize()
|
||||||
|
})
|
||||||
|
})()
|
||||||
|
|
||||||
break;
|
break
|
||||||
case PreviewScaleEnum.FULL: (() => {
|
case PreviewScaleEnum.FULL:
|
||||||
const { calcRate, windowResize, unWindowResize } = usePreviewFullScale(
|
;(() => {
|
||||||
width.value as number,
|
const { calcRate, windowResize, unWindowResize } = usePreviewFullScale(
|
||||||
height.value as number,
|
width.value as number,
|
||||||
previewRef.value,
|
height.value as number,
|
||||||
updateScaleRef
|
previewRef.value,
|
||||||
)
|
updateScaleRef
|
||||||
calcRate()
|
)
|
||||||
windowResize()
|
calcRate()
|
||||||
onUnmounted(() => {
|
windowResize()
|
||||||
unWindowResize()
|
useAddWheelHandle(unWindowResize)
|
||||||
})
|
onUnmounted(() => {
|
||||||
})()
|
unWindowResize()
|
||||||
break;
|
})
|
||||||
|
})()
|
||||||
|
break
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
import { computed } from 'vue'
|
import { computed } from 'vue'
|
||||||
import { PreviewRenderList } from './components/PreviewRenderList'
|
import { PreviewRenderList } from './components/PreviewRenderList'
|
||||||
import { getFilterStyle, setTitle } from '@/utils'
|
import { getFilterStyle, setTitle } from '@/utils'
|
||||||
import { getEditCanvasConfigStyle, getSessionStorageInfo } from './utils'
|
import { getEditCanvasConfigStyle, getSessionStorageInfo, keyRecordHandle } from './utils'
|
||||||
import { useComInstall } from './hooks/useComInstall.hook'
|
import { useComInstall } from './hooks/useComInstall.hook'
|
||||||
import { useScale } from './hooks/useScale.hook'
|
import { useScale } from './hooks/useScale.hook'
|
||||||
import { useStore } from './hooks/useStore.hook'
|
import { useStore } from './hooks/useStore.hook'
|
||||||
@ -60,6 +60,9 @@ const showEntity = computed(() => {
|
|||||||
useStore(chartEditStore)
|
useStore(chartEditStore)
|
||||||
const { entityRef, previewRef } = useScale(chartEditStore)
|
const { entityRef, previewRef } = useScale(chartEditStore)
|
||||||
const { show } = useComInstall(chartEditStore)
|
const { show } = useComInstall(chartEditStore)
|
||||||
|
|
||||||
|
// 开启键盘监听
|
||||||
|
keyRecordHandle()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
export * from './style'
|
export * from './style'
|
||||||
export * from './storage'
|
export * from './storage'
|
||||||
|
export * from './keyboard'
|
32
src/views/preview/utils/keyboard.ts
Normal file
32
src/views/preview/utils/keyboard.ts
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// 处理键盘记录
|
||||||
|
export const keyRecordHandle = () => {
|
||||||
|
// 默认赋值
|
||||||
|
window.$KeyboardActive = {
|
||||||
|
ctrl: false,
|
||||||
|
space: false
|
||||||
|
}
|
||||||
|
|
||||||
|
document.onkeydown = (e: KeyboardEvent) => {
|
||||||
|
const { keyCode } = e
|
||||||
|
if (keyCode == 32 && e.target == document.body) e.preventDefault()
|
||||||
|
|
||||||
|
if ([17, 32].includes(keyCode) && window.$KeyboardActive) {
|
||||||
|
switch (keyCode) {
|
||||||
|
case 17: window.$KeyboardActive.ctrl = true; break
|
||||||
|
case 32: window.$KeyboardActive.space = true; break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
document.onkeyup = (e: KeyboardEvent) => {
|
||||||
|
const { keyCode } = e
|
||||||
|
if (keyCode == 32 && e.target == document.body) e.preventDefault()
|
||||||
|
|
||||||
|
if ([17, 32].includes(keyCode) && window.$KeyboardActive) {
|
||||||
|
switch (keyCode) {
|
||||||
|
case 17: window.$KeyboardActive.ctrl = false; break
|
||||||
|
case 32: window.$KeyboardActive.space = false; break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user