| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955 |
- import { toRaw } from 'vue'
- import { defineStore } from 'pinia'
- import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
- import { PublicGroupConfigClass } from '@/packages/public/publicConfig'
- import debounce from 'lodash/debounce'
- import cloneDeep from 'lodash/cloneDeep'
- import { defaultTheme, globalThemeJson } from '@/settings/chartThemes/index'
- import { requestInterval, previewScaleType, requestIntervalUnit } from '@/settings/designSetting'
- // 记录记录
- import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
- // 全局设置
- import { useSettingStore } from '@/store/modules/settingStore/settingStore'
- import {
- HistoryActionTypeEnum,
- HistoryItemType,
- HistoryTargetTypeEnum
- } from '@/store/modules/chartHistoryStore/chartHistoryStore.d'
- import { MenuEnum } from '@/enums/editPageEnum'
- import { getUUID, loadingStart, loadingFinish, loadingError, isString, isArray } from '@/utils'
- import {
- ChartEditStoreEnum,
- ChartEditStorage,
- ChartEditStoreType,
- EditCanvasType,
- MousePositionType,
- TargetChartType,
- RecordChartType,
- RequestGlobalConfigType,
- EditCanvasConfigType
- } from './chartEditStore.d'
- const chartHistoryStore = useChartHistoryStore()
- const settingStore = useSettingStore()
- // 编辑区域内容
- export const useChartEditStore = defineStore({
- id: 'useChartEditStore',
- state: (): ChartEditStoreType => ({
- // 画布属性
- editCanvas: {
- // 编辑区域 Dom
- editLayoutDom: null,
- editContentDom: null,
- // 偏移量
- offset: 20,
- // 系统控制缩放
- scale: 1,
- // 用户控制的缩放
- userScale: 1,
- // 锁定缩放
- lockScale: false,
- // 初始化
- isCreate: false,
- // 拖拽中
- isDrag: false,
- // 框选中
- isSelect: false
- },
- // 右键菜单
- rightMenuShow: false,
- // 鼠标定位
- mousePosition: {
- startX: 0,
- startY: 0,
- x: 0,
- y: 0
- },
- // 目标图表
- targetChart: {
- hoverId: undefined,
- selectId: []
- },
- // 记录临时数据(复制等)
- recordChart: undefined,
- // -----------------------
- // 画布属性(需存储给后端)
- editCanvasConfig: {
- // 默认宽度
- width: 1920,
- // 默认高度
- height: 1080,
- // 启用滤镜
- filterShow: false,
- // 色相
- hueRotate: 0,
- // 饱和度
- saturate: 1,
- // 对比度
- contrast: 1,
- // 亮度
- brightness: 1,
- // 透明度
- opacity: 1,
- // 变换(暂不更改)
- rotateZ: 0,
- rotateX: 0,
- rotateY: 0,
- skewX: 0,
- skewY: 0,
- // 默认背景色
- background: undefined,
- backgroundImage: undefined,
- // 是否使用纯颜色
- selectColor: true,
- // chart 主题色
- chartThemeColor: defaultTheme || 'dark',
- // 全局配置
- chartThemeSetting: globalThemeJson,
- // 预览方式
- previewScaleType: previewScaleType
- },
- // 数据请求处理(需存储给后端)
- requestGlobalConfig: {
- requestOriginUrl: '',
- requestInterval: requestInterval,
- requestIntervalUnit: requestIntervalUnit,
- requestParams: {
- Body: {
- 'form-data': {},
- 'x-www-form-urlencoded': {},
- json: '',
- xml: ''
- },
- Header: {},
- Params: {}
- }
- },
- // 图表数组(需存储给后端)
- componentList: []
- }),
- getters: {
- getMousePosition(): MousePositionType {
- return this.mousePosition
- },
- getRightMenuShow(): boolean {
- return this.rightMenuShow
- },
- getEditCanvas(): EditCanvasType {
- return this.editCanvas
- },
- getEditCanvasConfig(): EditCanvasConfigType {
- return this.editCanvasConfig
- },
- getTargetChart(): TargetChartType {
- return this.targetChart
- },
- getRecordChart(): RecordChartType | undefined {
- return this.recordChart
- },
- getRequestGlobalConfig(): RequestGlobalConfigType {
- return this.requestGlobalConfig
- },
- getComponentList(): Array<CreateComponentType | CreateComponentGroupType> {
- return this.componentList
- },
- // 获取需要存储的数据项
- getStorageInfo(): ChartEditStorage {
- return {
- [ChartEditStoreEnum.EDIT_CANVAS_CONFIG]: this.getEditCanvasConfig,
- [ChartEditStoreEnum.COMPONENT_LIST]: this.getComponentList,
- [ChartEditStoreEnum.REQUEST_GLOBAL_CONFIG]: this.getRequestGlobalConfig
- }
- }
- },
- actions: {
- // * 设置 editCanvas 数据项
- setEditCanvas<T extends keyof EditCanvasType, K extends EditCanvasType[T]>(key: T, value: K) {
- this.editCanvas[key] = value
- },
- // * 设置 editCanvasConfig(需保存后端) 数据项
- setEditCanvasConfig<T extends keyof EditCanvasConfigType, K extends EditCanvasConfigType[T]>(key: T, value: K) {
- this.editCanvasConfig[key] = value
- },
- // * 设置右键菜单
- setRightMenuShow(value: boolean) {
- this.rightMenuShow = value
- },
- // * 设置目标数据 hover
- setTargetHoverChart(hoverId?: TargetChartType['hoverId']) {
- this.targetChart.hoverId = hoverId
- },
- // * 设置目标数据 select
- setTargetSelectChart(selectId?: string | string[], push: boolean = false) {
- // 重复选中
- if (this.targetChart.selectId.find((e: string) => e === selectId)) return
- // 无 id 清空
- if (!selectId) {
- this.targetChart.selectId = []
- return
- }
- // 多选
- if (push) {
- // 字符串
- if (isString(selectId)) {
- this.targetChart.selectId.push(selectId)
- return
- }
- // 数组
- if (isArray(selectId)) {
- this.targetChart.selectId.push(...selectId)
- return
- }
- } else {
- // 字符串
- if (isString(selectId)) {
- this.targetChart.selectId = [selectId]
- return
- }
- // 数组
- if (isArray(selectId)) {
- this.targetChart.selectId = selectId
- return
- }
- }
- },
- // * 设置记录数据
- setRecordChart(item: RecordChartType | undefined) {
- this.recordChart = cloneDeep(item)
- },
- // * 设置鼠标位置
- setMousePosition(x?: number, y?: number, startX?: number, startY?: number): void {
- if (x) this.mousePosition.x = x
- if (y) this.mousePosition.y = y
- if (startX) this.mousePosition.startX = startX
- if (startY) this.mousePosition.startY = startY
- },
- // * 找到目标 id 数据的下标位置,id可为父级或子集数组(无则返回-1)
- fetchTargetIndex(id?: string): number {
- const targetId = id || (this.getTargetChart.selectId.length && this.getTargetChart.selectId[0]) || undefined
- if (!targetId) {
- loadingFinish()
- return -1
- }
- const targetIndex = this.componentList.findIndex(e => e.id === targetId)
- // 当前
- if (targetIndex !== -1) {
- return targetIndex
- } else {
- const length = this.getComponentList.length
- for (let i = 0; i < length; i++) {
- if (this.getComponentList[i].isGroup) {
- for (const cItem of (this.getComponentList[i] as CreateComponentGroupType).groupList) {
- if (cItem.id === targetId) {
- return i
- }
- }
- }
- }
- }
- return -1
- },
- // * 统一格式化处理入参 id
- idPreFormat(id?: string | string[]) {
- const idArr = []
- if (!id) {
- idArr.push(...this.getTargetChart.selectId)
- return idArr
- }
- if (isString(id)) idArr.push(id)
- if (isArray(id)) idArr.push(...id)
- return idArr
- },
- /**
- * * 新增组件列表
- * @param componentInstance 新图表实例
- * @param isHead 是否头部插入
- * @param isHistory 是否进行记录
- * @returns
- */
- addComponentList(
- componentInstance:
- | CreateComponentType
- | CreateComponentGroupType
- | Array<CreateComponentType | CreateComponentGroupType>,
- isHead = false,
- isHistory = false
- ): void {
- if (componentInstance instanceof Array) {
- componentInstance.forEach(item => {
- this.addComponentList(item, isHead, isHistory)
- })
- return
- }
- if (isHistory) {
- chartHistoryStore.createAddHistory([componentInstance])
- }
- if (isHead) {
- this.componentList.unshift(componentInstance)
- return
- }
- this.componentList.push(componentInstance)
- },
- // * 删除组件
- removeComponentList(id?: string | string[], isHistory = true): void {
- try {
- const idArr = this.idPreFormat(id)
- const history: Array<CreateComponentType | CreateComponentGroupType> = []
- // 遍历所有对象
- if (!idArr.length) return
- loadingStart()
- idArr.forEach(ids => {
- const index = this.fetchTargetIndex(ids)
- if (index !== -1) {
- history.push(this.getComponentList[index])
- this.componentList.splice(index, 1)
- }
- })
- isHistory && chartHistoryStore.createDeleteHistory(history)
- loadingFinish()
- return
- } catch (value) {
- loadingError()
- }
- },
- // * 重置组件位置
- resetComponentPosition(item: CreateComponentType | CreateComponentGroupType, isForward: boolean): void {
- const index = this.fetchTargetIndex(item.id)
- if (index > -1) {
- const componentInstance = this.getComponentList[index]
- if (isForward) {
- componentInstance.attr = Object.assign(componentInstance.attr, {
- x: item.attr.x + item.attr.offsetX,
- y: item.attr.y + item.attr.offsetY
- })
- } else {
- componentInstance.attr = Object.assign(componentInstance.attr, {
- x: item.attr.x,
- y: item.attr.y
- })
- }
- }
- },
- // * 移动组件
- moveComponentList(item: Array<CreateComponentType | CreateComponentGroupType>) {
- chartHistoryStore.createMoveHistory(item)
- },
- // * 更新组件列表某一项的值
- updateComponentList(index: number, newData: CreateComponentType | CreateComponentGroupType) {
- if (index < 1 && index > this.getComponentList.length) return
- this.componentList[index] = newData
- },
- // * 设置页面样式属性
- setPageStyle<T extends keyof CSSStyleDeclaration>(key: T, value: any): void {
- const dom = this.getEditCanvas.editContentDom
- if (dom) {
- dom.style[key] = value
- }
- },
- // * 移动组件列表层级位置到两端
- setBothEnds(isEnd = false, isHistory = true): void {
- try {
- // 暂不支持多选
- if (this.getTargetChart.selectId.length > 1) return
- loadingStart()
- const length = this.getComponentList.length
- if (length < 2) {
- loadingFinish()
- return
- }
- const index = this.fetchTargetIndex()
- const targetData = this.getComponentList[index]
- if (index !== -1) {
- // 置底排除最底层, 置顶排除最顶层
- if ((isEnd && index === 0) || (!isEnd && index === length - 1)) {
- loadingFinish()
- return
- }
- // 记录原有位置
- const setIndex = (componentInstance: CreateComponentType | CreateComponentGroupType, i: number) => {
- const temp = cloneDeep(componentInstance)
- temp.attr.zIndex = i
- return temp
- }
- // 历史记录
- if (isHistory) {
- chartHistoryStore.createLayerHistory(
- [setIndex(targetData, index)],
- isEnd ? HistoryActionTypeEnum.BOTTOM : HistoryActionTypeEnum.TOP
- )
- }
- // 插入两端
- this.addComponentList(targetData, isEnd)
- this.getComponentList.splice(isEnd ? index + 1 : index, 1)
- loadingFinish()
- return
- }
- } catch (value) {
- loadingError()
- }
- },
- // * 置顶
- setTop(isHistory = true): void {
- this.setBothEnds(false, isHistory)
- },
- // * 置底
- setBottom(isHistory = true): void {
- this.setBothEnds(true, isHistory)
- },
- // * 上移/下移互换图表位置
- wrap(isDown = false, isHistory = true) {
- try {
- // 暂不支持多选
- if (this.getTargetChart.selectId.length > 1) return
- loadingStart()
- const length = this.getComponentList.length
- if (length < 2) {
- loadingFinish()
- return
- }
- const index: number = this.fetchTargetIndex()
- if (index !== -1) {
- // 下移排除最底层, 上移排除最顶层
- if ((isDown && index === 0) || (!isDown && index === length - 1)) {
- loadingFinish()
- return
- }
- // 互换位置
- const swapIndex = isDown ? index - 1 : index + 1
- const targetItem = this.getComponentList[index]
- const swapItem = this.getComponentList[swapIndex]
- // 历史记录
- if (isHistory) {
- chartHistoryStore.createLayerHistory(
- [targetItem],
- isDown ? HistoryActionTypeEnum.DOWN : HistoryActionTypeEnum.UP
- )
- }
- this.updateComponentList(index, swapItem)
- this.updateComponentList(swapIndex, targetItem)
- loadingFinish()
- return
- }
- } catch (value) {
- loadingError()
- }
- },
- // * 图层上移
- setUp(isHistory = true) {
- this.wrap(false, isHistory)
- },
- // * 图层下移
- setDown(isHistory = true) {
- this.wrap(true, isHistory)
- },
- // * 复制
- setCopy(isCut = false) {
- try {
- // 暂不支持多选
- if (this.getTargetChart.selectId.length > 1) return
- // 处理弹窗普通复制的场景
- if (document.getElementsByClassName('n-modal-body-wrapper').length) return
- loadingStart()
- const index: number = this.fetchTargetIndex()
- if (index !== -1) {
- const copyData: RecordChartType = {
- charts: this.getComponentList[index],
- type: isCut ? HistoryActionTypeEnum.CUT : HistoryActionTypeEnum.COPY
- }
- this.setRecordChart(copyData)
- window['$message'].success(isCut ? '剪切图表成功' : '复制图表成功!')
- loadingFinish()
- }
- } catch (value) {
- loadingError()
- }
- },
- // * 剪切
- setCut() {
- this.setCopy(true)
- },
- // * 粘贴
- setParse() {
- try {
- loadingStart()
- const recordCharts = this.getRecordChart
- if (recordCharts === undefined) {
- loadingFinish()
- return
- }
- const parseHandle = (e: CreateComponentType | CreateComponentGroupType) => {
- e = cloneDeep(e)
- // 生成新 id
- e.id = getUUID()
- e.attr.x = this.getMousePosition.x + 30
- e.attr.y = this.getMousePosition.y + 30
- return e
- }
- const isCut = recordCharts.type === HistoryActionTypeEnum.CUT
- // 多项
- if (Array.isArray(recordCharts.charts)) {
- recordCharts.charts.forEach((e: CreateComponentType) => {
- this.addComponentList(parseHandle(e), undefined, true)
- // 剪切需删除原数据
- if (isCut) {
- this.setTargetSelectChart(e.id)
- this.removeComponentList(undefined, true)
- }
- })
- if (isCut) this.setRecordChart(undefined)
- loadingFinish()
- return
- }
- // 单项
- this.addComponentList(parseHandle(recordCharts.charts), undefined, true)
- if (isCut) {
- this.setTargetSelectChart(recordCharts.charts.id)
- this.removeComponentList()
- this.setRecordChart(undefined)
- }
- loadingFinish()
- } catch (value) {
- loadingError()
- }
- },
- // * 撤回/前进 目标处理
- setBackAndSetForwardHandle(HistoryItem: HistoryItemType, isForward = false) {
- // 处理画布
- if (HistoryItem.targetType === HistoryTargetTypeEnum.CANVAS) {
- this.editCanvas = HistoryItem.historyData[0] as EditCanvasType
- return
- }
- let historyData = HistoryItem.historyData as Array<CreateComponentType | CreateComponentGroupType>
- if (isArray(historyData)) {
- // 选中目标元素,支持多个
- historyData.forEach((item: CreateComponentType | CreateComponentGroupType) => {
- this.setTargetSelectChart(item.id, true)
- })
- }
- // 处理新增类型
- const isAdd = HistoryItem.actionType === HistoryActionTypeEnum.ADD
- const isDel = HistoryItem.actionType === HistoryActionTypeEnum.DELETE
- if (isAdd || isDel) {
- if ((isAdd && isForward) || (isDel && !isForward)) {
- historyData.forEach(item => {
- this.addComponentList(item)
- })
- return
- }
- historyData.forEach(item => {
- this.removeComponentList(item.id, false)
- })
- return
- }
- // 处理移动
- const isMove = HistoryItem.actionType === HistoryActionTypeEnum.MOVE
- if (isMove) {
- historyData.forEach(item => {
- this.resetComponentPosition(item, isForward)
- })
- return
- }
- // 处理层级
- const isTop = HistoryItem.actionType === HistoryActionTypeEnum.TOP
- const isBottom = HistoryItem.actionType === HistoryActionTypeEnum.BOTTOM
- if (isTop || isBottom) {
- if (!isForward) {
- // 插入到原有位置
- if (isTop) this.getComponentList.pop()
- if (isBottom) this.getComponentList.shift()
- this.getComponentList.splice(historyData[0].attr.zIndex, 0, historyData[0])
- return
- }
- if (isTop) this.setTop(false)
- if (isBottom) this.setBottom(false)
- }
- const isUp = HistoryItem.actionType === HistoryActionTypeEnum.UP
- const isDown = HistoryItem.actionType === HistoryActionTypeEnum.DOWN
- if (isUp || isDown) {
- if ((isUp && isForward) || (isDown && !isForward)) {
- this.setUp(false)
- return
- }
- this.setDown(false)
- return
- }
- // 处理分组
- const isGroup = HistoryItem.actionType === HistoryActionTypeEnum.GROUP
- const isUnGroup = HistoryItem.actionType === HistoryActionTypeEnum.UN_GROUP
- if (isGroup || isUnGroup) {
- if ((isGroup && isForward) || (isUnGroup && !isForward)) {
- const ids: string[] = []
- if (historyData.length > 1) {
- historyData.forEach(item => {
- ids.push(item.id)
- })
- } else {
- const group = historyData[0] as CreateComponentGroupType
- group.groupList.forEach(item => {
- ids.push(item.id)
- })
- }
- this.setGroup(ids, false)
- return
- }
- // 都需使用子组件的id去解组
- if (historyData.length > 1) {
- this.setUnGroup([(historyData[0] as CreateComponentType).id], undefined, false)
- } else {
- this.setUnGroup([(historyData[0] as CreateComponentGroupType).groupList[0].id], undefined, false)
- }
- return
- }
- switch (HistoryItem.actionType) {
- // 锁定处理
- case HistoryActionTypeEnum.LOCK:
- case HistoryActionTypeEnum.UNLOCK:
- if (!isForward) {
- // 恢复原来状态
- if (HistoryItem.actionType === HistoryActionTypeEnum.LOCK) historyData[0].status.lock = false
- if (HistoryItem.actionType === HistoryActionTypeEnum.UNLOCK) historyData[0].status.lock = true
- return
- }
- this.setLock(!historyData[0].status.lock, false)
- break
- // 隐藏处理
- case HistoryActionTypeEnum.HIDE:
- case HistoryActionTypeEnum.SHOW:
- if (!isForward) {
- // 恢复原来状态
- if (HistoryItem.actionType === HistoryActionTypeEnum.HIDE) historyData[0].status.hide = false
- if (HistoryItem.actionType === HistoryActionTypeEnum.SHOW) historyData[0].status.hide = true
- return
- }
- this.setHide(!historyData[0].status.hide, false)
- break
- }
- },
- // * 撤回
- setBack() {
- try {
- loadingStart()
- const targetData = chartHistoryStore.backAction()
- if (!targetData) {
- loadingFinish()
- return
- }
- this.setBackAndSetForwardHandle(targetData)
- loadingFinish()
- } catch (value) {
- loadingError()
- }
- },
- // * 前进
- setForward() {
- try {
- loadingStart()
- const targetData = chartHistoryStore.forwardAction()
- if (!targetData) {
- loadingFinish()
- return
- }
- this.setBackAndSetForwardHandle(targetData, true)
- loadingFinish()
- } catch (value) {
- loadingError()
- }
- },
- // * 移动位置
- setMove(keyboardValue: MenuEnum) {
- const index = this.fetchTargetIndex()
- if (index === -1) return
- const attr = this.getComponentList[index].attr
- const distance = settingStore.getChartMoveDistance
- switch (keyboardValue) {
- case MenuEnum.ARROW_UP:
- attr.y -= distance
- break
- case MenuEnum.ARROW_RIGHT:
- attr.x += distance
- break
- case MenuEnum.ARROW_DOWN:
- attr.y += distance
- break
- case MenuEnum.ARROW_LEFT:
- attr.x -= distance
- break
- }
- },
- // * 创建分组
- setGroup(id?: string | string[], isHistory = true) {
- try {
- const selectIds = this.idPreFormat(id) || this.getTargetChart.selectId
- if (selectIds.length < 2) return
- loadingStart()
- const groupClass = new PublicGroupConfigClass()
- // 记录整体坐标
- const groupAttr = {
- l: this.getEditCanvasConfig.width,
- t: this.getEditCanvasConfig.height,
- r: 0,
- b: 0
- }
- const targetList: CreateComponentType[] = []
- const historyList: CreateComponentType[] = []
- // 若目标中有数组则先解组
- const newSelectIds: string[] = []
- selectIds.forEach((id: string) => {
- const targetIndex = this.fetchTargetIndex(id)
- if (targetIndex !== -1 && this.getComponentList[targetIndex].isGroup) {
- this.setUnGroup(
- [id],
- (e: CreateComponentType[]) => {
- e.forEach(e => {
- this.addComponentList(e)
- newSelectIds.push(e.id)
- })
- },
- false
- )
- } else if (targetIndex !== -1) {
- newSelectIds.push(id)
- }
- })
- newSelectIds.forEach((id: string) => {
- // 获取目标数据并从 list 中移除 (成组后不可再次成组, 断言处理)
- const item = this.componentList.splice(this.fetchTargetIndex(id), 1)[0] as CreateComponentType
- const { x, y, w, h } = item.attr
- const { l, t, r, b } = groupAttr
- // 左
- groupAttr.l = l > x ? x : l
- // 上
- groupAttr.t = t > y ? y : t
- // 宽
- groupAttr.r = r < x + w ? x + w : r
- // 高
- groupAttr.b = b < y + h ? y + h : b
- targetList.push(item)
- historyList.push(toRaw(item))
- })
- // 修改原数据之前,先记录
- if (isHistory) chartHistoryStore.createGroupHistory(historyList)
- // 设置子组件的位置
- targetList.forEach((item: CreateComponentType) => {
- item.attr.x = item.attr.x - groupAttr.l
- item.attr.y = item.attr.y - groupAttr.t
- groupClass.groupList.push(item)
- })
- // 设置 group 属性
- groupClass.attr.x = groupAttr.l
- groupClass.attr.y = groupAttr.t
- groupClass.attr.w = groupAttr.r - groupAttr.l
- groupClass.attr.h = groupAttr.b - groupAttr.t
- this.addComponentList(groupClass)
- this.setTargetSelectChart(groupClass.id)
- loadingFinish()
- } catch (error) {
- console.log(error)
- window['$message'].error('创建分组失败,请联系管理员!')
- loadingFinish()
- }
- },
- // * 解除分组
- setUnGroup(ids?: string[], callBack?: (e: CreateComponentType[]) => void, isHistory = true) {
- try {
- const selectGroupIdArr = ids || this.getTargetChart.selectId
- if (selectGroupIdArr.length !== 1) return
- loadingStart()
- // 解组
- const unGroup = (targetIndex: number) => {
- const targetGroup = this.getComponentList[targetIndex] as CreateComponentGroupType
- if (!targetGroup.isGroup) return
- // 记录数据
- if (isHistory) chartHistoryStore.createUnGroupHistory(cloneDeep([targetGroup]))
- // 分离组件并还原位置属性
- targetGroup.groupList.forEach(item => {
- item.attr.x = item.attr.x + targetGroup.attr.x
- item.attr.y = item.attr.y + targetGroup.attr.y
- if (!callBack) {
- this.addComponentList(item)
- }
- })
- this.setTargetSelectChart(targetGroup.id)
- // 删除分组
- this.removeComponentList(targetGroup.id, false)
- if (callBack) {
- callBack(targetGroup.groupList)
- }
- }
- const targetIndex = this.fetchTargetIndex(selectGroupIdArr[0])
- // 判断目标是否为分组父级
- if (targetIndex !== -1) {
- unGroup(targetIndex)
- }
- loadingFinish()
- } catch (error) {
- console.log(error)
- window['$message'].error('解除分组失败,请联系管理员!')
- loadingFinish()
- }
- },
- // * 锁定
- setLock(status: boolean = true, isHistory: boolean = true) {
- try {
- // 暂不支持多选
- if (this.getTargetChart.selectId.length > 1) return
- loadingStart()
- const index: number = this.fetchTargetIndex()
- if (index !== -1) {
- // 更新状态
- const targetItem = this.getComponentList[index]
- targetItem.status.lock = status
- // 历史记录
- if (isHistory) {
- chartHistoryStore.createLockHistory(
- [targetItem],
- status ? HistoryActionTypeEnum.LOCK : HistoryActionTypeEnum.UNLOCK
- )
- }
- this.updateComponentList(index, targetItem)
- loadingFinish()
- return
- }
- } catch (value) {
- loadingError()
- }
- },
- // * 解除锁定
- setUnLock(isHistory: boolean = true) {
- this.setLock(false, isHistory)
- },
- // * 隐藏
- setHide(status: boolean = true, isHistory: boolean = true) {
- try {
- // 暂不支持多选
- if (this.getTargetChart.selectId.length > 1) return
- loadingStart()
- const index: number = this.fetchTargetIndex()
- if (index !== -1) {
- // 更新状态
- const targetItem = this.getComponentList[index]
- targetItem.status.hide = status
- // 历史记录
- if (isHistory) {
- chartHistoryStore.createHideHistory(
- [targetItem],
- status ? HistoryActionTypeEnum.HIDE : HistoryActionTypeEnum.SHOW
- )
- }
- this.updateComponentList(index, targetItem)
- loadingFinish()
- // 取消选择隐藏
- if (status) {
- const chartEditStore = useChartEditStore()
- chartEditStore.setTargetSelectChart(undefined)
- }
- return
- }
- } catch (value) {
- loadingError()
- }
- },
- // * 显示
- setShow(isHistory: boolean = true) {
- this.setHide(false, isHistory)
- },
- // ----------------
- // * 设置页面大小
- setPageSize(scale: number): void {
- this.setPageStyle('height', `${this.editCanvasConfig.height * scale}px`)
- this.setPageStyle('width', `${this.editCanvasConfig.width * scale}px`)
- },
- // * 计算缩放
- computedScale() {
- if (this.getEditCanvas.editLayoutDom) {
- // 现有展示区域
- const width = this.getEditCanvas.editLayoutDom.clientWidth - this.getEditCanvas.offset * 2 - 5
- const height = this.getEditCanvas.editLayoutDom.clientHeight - this.getEditCanvas.offset * 4
- // 用户设定大小
- const editCanvasWidth = this.editCanvasConfig.width
- const editCanvasHeight = this.editCanvasConfig.height
- // 需保持的比例
- const baseProportion = parseFloat((editCanvasWidth / editCanvasHeight).toFixed(5))
- const currentRate = parseFloat((width / height).toFixed(5))
- if (currentRate > baseProportion) {
- // 表示更宽
- const scaleWidth = parseFloat(((height * baseProportion) / editCanvasWidth).toFixed(5))
- this.setScale(scaleWidth > 1 ? 1 : scaleWidth)
- } else {
- // 表示更高
- const scaleHeight = parseFloat((width / baseProportion / editCanvasHeight).toFixed(5))
- this.setScale(scaleHeight > 1 ? 1 : scaleHeight)
- }
- } else {
- window['$message'].warning('请先创建画布,再进行缩放')
- }
- },
- // * 监听缩放
- listenerScale(): Function {
- const resize = debounce(this.computedScale, 200)
- // 默认执行一次
- resize()
- // 开始监听
- window.addEventListener('resize', resize)
- // 销毁函数
- const remove = () => {
- window.removeEventListener('resize', resize)
- }
- return remove
- },
- /**
- * * 设置缩放
- * @param scale 0~1 number 缩放比例;
- * @param force boolean 强制缩放
- */
- setScale(scale: number, force = false): void {
- if (!this.getEditCanvas.lockScale || force) {
- this.setPageSize(scale)
- this.getEditCanvas.userScale = scale
- this.getEditCanvas.scale = scale
- }
- }
- }
- })
|