Compare commits

...

3 Commits

5 changed files with 169 additions and 58 deletions

View File

@ -6,6 +6,26 @@ import { EventBus } from '@/utils/eventBus';
const chartEditStore = useChartEditStore(); const chartEditStore = useChartEditStore();
const ceshiFunction = mapFun(); const ceshiFunction = mapFun();
//递归获取某个id在数组里的位置或者父id
export const queryFun = (array, value, peg?: any) => {
var res = [];
function _find(array, value, peg) {
array.forEach((item, index) => {
if (item.id === value) {
if (peg) {
res.push(peg);
}
res.push(index);
return;
} else if (item.groupList instanceof Array) {
_find(item.groupList, value, index);
}
});
}
_find(array, value, peg);
return res;
};
export const eventCommonHandler = ( export const eventCommonHandler = (
componentList: any, componentList: any,
elementList: any, elementList: any,
@ -53,28 +73,53 @@ export const eventCommonHandler = (
} else if (elementList[j].movement == 'reveal') { } else if (elementList[j].movement == 'reveal') {
// 显示 // 显示
for (let k = 0; k < elementList[j].elementId.length; k++) { for (let k = 0; k < elementList[j].elementId.length; k++) {
if (componentList[i].id == elementList[j].elementId[k]) { //获取位置
obj = componentList[i]; const arr = queryFun(componentList, elementList[j].elementId[k]);
index = i; console.log(arr);
if (arr.length > 1) {
obj = componentList[arr[0]].groupList[arr[1]];
obj.status.hide = false; obj.status.hide = false;
chartEditStore.updateComponentList(index, obj); console.log(obj);
// chartEditStore.updateComponentList(arr[0], obj, arr[1]);
} else if (arr.length == 1) {
obj = componentList[arr[0]];
obj.status.hide = false;
console.log(obj);
// chartEditStore.updateComponentList(arr[0], obj);
} }
// if (componentList[i].id == elementList[j].elementId[k]) {
// obj = componentList[i];
// index = i;
// obj.status.hide = false;
// chartEditStore.updateComponentList(index, obj);
// }
} }
} else if (elementList[j].movement == 'hidden') { } else if (elementList[j].movement == 'hidden') {
// 隐藏 // 隐藏
for (let k = 0; k < elementList[j].elementId.length; k++) { for (let k = 0; k < elementList[j].elementId.length; k++) {
if (componentList[i].id == elementList[j].elementId[k]) { //获取位置
obj = componentList[i]; const arr = queryFun(componentList, elementList[j].elementId[k]);
index = i; if (arr.length > 1) {
obj = componentList[arr[0]].groupList[arr[1]];
obj.status.hide = true; obj.status.hide = true;
chartEditStore.updateComponentList(index, obj); // chartEditStore.updateComponentList(arr[0], obj, arr[1]);
} else if (arr.length == 1) {
obj = componentList[arr[0]];
obj.status.hide = true;
// chartEditStore.updateComponentList(arr[0], obj);
} }
// if (componentList[i].id == elementList[j].elementId[k]) {
// obj = componentList[i];
// index = i;
// obj.status.hide = true;
// chartEditStore.updateComponentList(index, obj);
// }
} }
} else if (elementList[j].movement == 'map') { } else if (elementList[j].movement == 'map') {
// 地图事件联动 // 地图事件联动
for (let k = 0; k < elementList[j].elementId.length; k++) { for (let k = 0; k < elementList[j].elementId.length; k++) {
if (componentList[i].id == elementList[j].elementId[k]) { if (componentList[i].id == elementList[j].elementId[k]) {
console.log("elementList[j].funName",elementList[j]) console.log('elementList[j].funName', elementList[j]);
if (elementList[j].params) { if (elementList[j].params) {
ceshiFunction[elementList[j].funName](elementList[j].params); ceshiFunction[elementList[j].funName](elementList[j].params);
} else { } else {
@ -89,7 +134,6 @@ export const eventCommonHandler = (
EventBus.emit(elementList[j].elementId[k] + type, params); EventBus.emit(elementList[j].elementId[k] + type, params);
} }
} }
} else if (elementList[j].movement == 'graphic') { } else if (elementList[j].movement == 'graphic') {
// //
for (let k = 0; k < elementList[j].elementId.length; k++) { for (let k = 0; k < elementList[j].elementId.length; k++) {
@ -97,15 +141,17 @@ export const eventCommonHandler = (
EventBus.emit(elementList[j].elementId[k] + type, params); EventBus.emit(elementList[j].elementId[k] + type, params);
} }
} }
} else if (elementList[j].movement == 'style') { } else if (elementList[j].movement == 'style') {
// 修改组件样式 //获取位置
// for (let k = 0; k < elementList[j].elementId.length; k++) {} const arr = queryFun(componentList, elementList[j].elementId);
if (componentList[i].id == elementList[j].elementId) { if (arr.length > 1) {
obj = componentList[i]; obj = componentList[arr[0]].groupList[arr[1]];
index = i;
obj.option = elementList[j].option; obj.option = elementList[j].option;
chartEditStore.updateComponentList(index, obj); // chartEditStore.updateComponentList(arr[0], obj, arr[1]);
} else if (arr.length == 1) {
obj = componentList[arr[0]];
obj.option = elementList[j].option;
// chartEditStore.updateComponentList(arr[0], obj);
} }
} }
} }

View File

@ -406,7 +406,11 @@ export const useChartEditStore = defineStore({
chartHistoryStore.createMoveHistory(item); chartHistoryStore.createMoveHistory(item);
}, },
// * 更新组件列表某一项的值 // * 更新组件列表某一项的值
updateComponentList(index: number, newData: CreateComponentType | CreateComponentGroupType) { updateComponentList(
index: number,
newData: CreateComponentType | CreateComponentGroupType,
childIndex?: number,
) {
if (index < 1 && index > this.getComponentList.length) return; if (index < 1 && index > this.getComponentList.length) return;
this.componentList[index] = newData; this.componentList[index] = newData;
}, },

View File

@ -54,14 +54,13 @@
<n-divider vertical style="height: 450px" /> <n-divider vertical style="height: 450px" />
<div class="movement-type"> <div class="movement-type">
<template v-if="panel.movement != 'newaddress'"> <template v-if="panel.movement != 'newaddress'">
<div class="movement-type__element" v-if="panel.movement == 'style'"> <div class="movement-type__element" v-if="panel.movement == 'style'">
关联组件 关联组件可选择分组里的单组件
<n-select <n-select
v-model:value="panel.elementId" v-model:value="panel.elementId"
placeholder="请选择" placeholder="请选择"
:options="elementSelectOptions" :options="elementSelectSingleOptions"
@update:value="handleUpdateValue(panel.elementId, panel.movement, panelIndex)" @update:value="handleUpdateValue(panel.elementId, panel.movement, panelIndex)"
/> />
</div> </div>
@ -86,7 +85,13 @@
/> />
</div> </div>
<div class="movement-type__element" v-if="panel.movement == 'map' && currentMapFunction?.group == 'layer' || panel.movement == 'graphic'" > <div
class="movement-type__element"
v-if="
(panel.movement == 'map' && currentMapFunction?.group == 'layer') ||
panel.movement == 'graphic'
"
>
选择图层对象 选择图层对象
<n-select <n-select
v-model:value="panel.params" v-model:value="panel.params"
@ -170,17 +175,19 @@
import { useTargetData } from '../../../../hooks/useTargetData.hook'; import { useTargetData } from '../../../../hooks/useTargetData.hook';
import { getMenuList } from '@/api/sys/menu'; import { getMenuList } from '@/api/sys/menu';
import { projectListApi } from '@/api/path/project.api'; import { projectListApi } from '@/api/path/project.api';
import { funSelectOptions,layerOptions } from '@/hooks/ceshiFun.hook'; import { funSelectOptions, layerOptions } from '@/hooks/ceshiFun.hook';
import { getLoad } from '@/api/sys/sysDataItemDetail'; import { getLoad } from '@/api/sys/sysDataItemDetail';
const EventComponent = loadAsyncComponent(() => import('./EventComponent.vue')); const EventComponent = loadAsyncComponent(() => import('./EventComponent.vue'));
const { targetData, chartEditStore } = useTargetData(); const { targetData, chartEditStore } = useTargetData();
const targetDataOption = ref([]); const targetDataOption = ref([]);
const chartConfig = ref([]); const chartConfig = ref([]);
const componentGroupList = ref([]);
// //
const handleUpdateValue = (value, movement, index) => { const handleUpdateValue = (value, movement, index) => {
chartEditStore.getComponentList.map((item) => { componentGroupList.value.map((item: any) => {
if (item.id == value) { if (item.id == value) {
console.log('item', item);
targetDataOption.value[index] = item.option; targetDataOption.value[index] = item.option;
chartConfig.value[index] = item.chartConfig; chartConfig.value[index] = item.chartConfig;
chartConfig.value[index].config = acquiesceAsyncComponent( chartConfig.value[index].config = acquiesceAsyncComponent(
@ -297,6 +304,8 @@
}; };
}), }),
); );
//
const elementSelectSingleOptions: any = ref([]);
const treeIterator = (tree) => { const treeIterator = (tree) => {
tree.forEach((node) => { tree.forEach((node) => {
var obj = {}; var obj = {};
@ -352,22 +361,38 @@
getRouteList(); getRouteList();
getPublishedPageList(); getPublishedPageList();
getMsgTypeList(); getMsgTypeList();
chartEditStore.getComponentList.forEach((item) => {
if (item.isGroup) {
item.groupList?.forEach((groupItem) => {
elementSelectSingleOptions.value.push({
label: '分组-' + item.chartConfig.title + '>> 组件-' + groupItem.chartConfig.title,
value: groupItem.id,
});
componentGroupList.value.push({
...groupItem,
});
});
}
elementSelectSingleOptions.value.push({
label: item.isGroup ? '分组-' + item.chartConfig.title : '组件-' + item.chartConfig.title,
value: item.id,
});
componentGroupList.value.push({
...item,
});
});
}); });
// //
const currentMapFunction = ref(null); const currentMapFunction = ref(null);
const handlerMapFunChange = (e) => { const handlerMapFunChange = (e) => {
let selected = funSelectOptions.filter((item, index) => {
let selected = funSelectOptions.filter((item,index)=>{
return item.value == e; return item.value == e;
}) });
if(selected?.length>0){ if (selected?.length > 0) {
currentMapFunction.value = selected[0]; currentMapFunction.value = selected[0];
} }
} };
const changeOption = (index, data) => { const changeOption = (index, data) => {
props.eventData.movementList[index].option = data; props.eventData.movementList[index].option = data;
@ -391,7 +416,6 @@
}, },
{ deep: true }, { deep: true },
); );
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.event-item { .event-item {

View File

@ -28,23 +28,31 @@
<div :class="{ 'select-modal': select }"></div> <div :class="{ 'select-modal': select }"></div>
</div> </div>
<n-collapse-transition :show="expend"> <n-collapse-transition :show="expend">
<LayersListItem <draggable
v-for="element in componentGroupData.groupList" item-key="id"
:key="element.id" v-model="layerList"
:componentData="element" ghostClass="ghost"
:layer-mode="layerMode" @change="onMoveCallback"
:isGroup="true" :group="{ name: 'items', pull: true, put: true }"
@mousedown="mousedownHandle($event, element, componentGroupData.id)" >
@mouseenter="mouseenterHandle(element)" <template #item="{ element }">
@mouseleave="mouseleaveHandle(element)" <LayersListItem
@contextmenu="handleContextMenu($event, componentGroupData, optionsHandle)" :componentData="element"
></LayersListItem> :layer-mode="layerMode"
:isGroup="true"
@mousedown="mousedownHandle($event, element, componentGroupData.id)"
@mouseenter="mouseenterHandle(element)"
@mouseleave="mouseleaveHandle(element)"
@contextmenu="handleContextMenu($event, componentGroupData, optionsHandle)"
></LayersListItem>
</template>
</draggable>
</n-collapse-transition> </n-collapse-transition>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, computed, PropType } from 'vue'; import { ref, computed, PropType, watch } from 'vue';
import { MouseEventButton, WinKeyboard, MacKeyboard } from '@/enums/editPageEnum'; import { MouseEventButton, WinKeyboard, MacKeyboard } from '@/enums/editPageEnum';
import { MenuEnum } from '@/enums/editPageEnum'; import { MenuEnum } from '@/enums/editPageEnum';
import { useDesignStore } from '@/store/modules/designStore/designStore'; import { useDesignStore } from '@/store/modules/designStore/designStore';
@ -56,6 +64,7 @@
import { LayersListItem } from '../LayersListItem'; import { LayersListItem } from '../LayersListItem';
import { LayersStatus } from '../LayersStatus/index'; import { LayersStatus } from '../LayersStatus/index';
import { icon } from '@/plugins'; import { icon } from '@/plugins';
import Draggable from 'vuedraggable';
const props = defineProps({ const props = defineProps({
componentGroupData: { componentGroupData: {
@ -67,7 +76,14 @@
default: LayerModeEnum.THUMBNAIL, default: LayerModeEnum.THUMBNAIL,
}, },
}); });
const layerList = ref<any>(props.componentGroupData.groupList);
watch(
() => props.componentGroupData,
(newValue) => {
layerList.value = newValue.groupList;
},
);
// //
const pickOptionsList = [MenuEnum.UN_GROUP]; const pickOptionsList = [MenuEnum.UN_GROUP];
@ -187,6 +203,15 @@
const mouseleaveHandle = (componentInstance: CreateComponentType | CreateComponentGroupType) => { const mouseleaveHandle = (componentInstance: CreateComponentType | CreateComponentGroupType) => {
chartEditStore.setTargetHoverChart(undefined); chartEditStore.setTargetHoverChart(undefined);
}; };
//
const onMoveCallback = (val: any) => {
const { newIndex, element } = val.added;
const groupIndex = chartEditStore.getComponentList.findIndex(
(item) => item.id == props.componentGroupData.id,
);
chartEditStore.getComponentList[groupIndex].groupList.splice(newIndex, 0, element);
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -37,7 +37,13 @@
</n-space> </n-space>
<!-- https://github.com/SortableJS/vue.draggable.next --> <!-- https://github.com/SortableJS/vue.draggable.next -->
<draggable item-key="id" v-model="layerList" ghostClass="ghost" @change="onMoveCallback"> <draggable
item-key="id"
v-model="layerList"
ghostClass="ghost"
@change="onMoveCallback"
:group="{ name: 'items', pull: true, put: true }"
>
<template #item="{ element }"> <template #item="{ element }">
<div class="go-content-layer-box"> <div class="go-content-layer-box">
<!-- 组合 --> <!-- 组合 -->
@ -144,19 +150,25 @@
// //
const onMoveCallback = (val: any) => { const onMoveCallback = (val: any) => {
const { oldIndex, newIndex } = val.moved; if (val.moved) {
if (newIndex - oldIndex > 0) { const { oldIndex, newIndex } = val.moved;
// if (newIndex - oldIndex > 0) {
const moveTarget = chartEditStore.getComponentList.splice(-(oldIndex + 1), 1)[0]; //
chartEditStore.getComponentList.splice(-newIndex, 0, moveTarget); const moveTarget = chartEditStore.getComponentList.splice(-(oldIndex + 1), 1)[0];
} else {
//
const moveTarget = chartEditStore.getComponentList.splice(-(oldIndex + 1), 1)[0];
if (newIndex === 0) {
chartEditStore.getComponentList.push(moveTarget);
} else {
chartEditStore.getComponentList.splice(-newIndex, 0, moveTarget); chartEditStore.getComponentList.splice(-newIndex, 0, moveTarget);
} else {
//
const moveTarget = chartEditStore.getComponentList.splice(-(oldIndex + 1), 1)[0];
if (newIndex === 0) {
chartEditStore.getComponentList.push(moveTarget);
} else {
chartEditStore.getComponentList.splice(-newIndex, 0, moveTarget);
}
} }
} else if (val.removed) {
const { oldIndex, element } = val.removed;
const index = chartEditStore.getComponentList.findIndex((item) => item.id == element.id);
chartEditStore.getComponentList.splice(index, 1);
} }
}; };