feat(ideContainer): ideContainer侧边栏开发

- 增加子菜单数据整合逻辑,将数据整合进递归数据结构中
- 增加menuData数据的全局共享方法
master
钟良源 4 months ago
parent 9bb142e403
commit b4bc83436c

@ -104,3 +104,8 @@ export function getPublishApi(appId: string) {
export function refreshToken(data: publishApi) { export function refreshToken(data: publishApi) {
return axios.post<paramsT>(`${urlPrefix}/apps/apiTokenRefresh`, data); return axios.post<paramsT>(`${urlPrefix}/apps/apiTokenRefresh`, data);
} }
// 获取当前工程下的所有应用及引用下的事件名称和组件名称
export function getProjectEnv(id) {
return axios.get<paramsT>(`${urlPrefix}/apps/env/${id}`);
}

@ -7,12 +7,10 @@ import RightSideBar from './rightSideBar';
import NavBar from './navBar'; import NavBar from './navBar';
import ProjectContainer from '@/pages/orchestration/project'; import ProjectContainer from '@/pages/orchestration/project';
import ApplicationContainer from '@/pages/orchestration/application'; import ApplicationContainer from '@/pages/orchestration/application';
import { menuData1, menuData2 } from './config/menuData';
import { Selected } from '@/pages/ideContainer/types'; import { Selected } from '@/pages/ideContainer/types';
import { updateInfo } from '@/store/ideContainer'; import { updateInfo } from '@/store/ideContainer';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
import { getAppListBySceneId } from '@/api/apps'; import { getAppListBySceneId } from '@/api/apps';
import * as url from 'node:url';
type UrlParamsOptions = { type UrlParamsOptions = {
identity?: string; identity?: string;

@ -4,8 +4,9 @@ import { IconApps } from '@arco-design/web-react/icon';
import { menuData1, menuData2 } from './config/menuData'; import { menuData1, menuData2 } from './config/menuData';
import { ResizeBox, Tree } from '@arco-design/web-react'; import { ResizeBox, Tree } from '@arco-design/web-react';
import { Selected } from '@/pages/ideContainer/types'; import { Selected } from '@/pages/ideContainer/types';
import { useDispatch } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
import { updateMenuData } from '@/store/ideContainer'; import { updateMenuData } from '@/store/ideContainer';
import { getProjectEnv } from '@/api/apps';
import _ from 'lodash'; import _ from 'lodash';
const TreeNode = Tree.Node; const TreeNode = Tree.Node;
@ -27,12 +28,18 @@ interface SideBarProps {
onMenuSelect?: (selected: Selected) => void; onMenuSelect?: (selected: Selected) => void;
} }
const compTypeMap = {
appComponent: '普通组件',
subComponent: '复合组件'
};
const SideBar: React.FC<SideBarProps> = ({ selectedKey, identity, subMenuData, onMenuSelect }) => { const SideBar: React.FC<SideBarProps> = ({ selectedKey, identity, subMenuData, onMenuSelect }) => {
const [menu, setMenu] = useState<MenuItemType[]>([]); const [menu, setMenu] = useState<MenuItemType[]>([]);
const [subMenuWidth, setSubMenuWidth] = useState(200); // 子菜单宽度状态 const [subMenuWidth, setSubMenuWidth] = useState(200); // 子菜单宽度状态
const [isSubMenuCollapsed, setIsSubMenuCollapsed] = useState(false); // 子菜单收起状态 const [isSubMenuCollapsed, setIsSubMenuCollapsed] = useState(false); // 子菜单收起状态
const [activeKey, setActiveKey] = useState(0); const [activeKey, setActiveKey] = useState(0);
const [mainMenuSelectedKey, setMainMenuSelectedKey] = useState<string>(''); const [mainMenuSelectedKey, setMainMenuSelectedKey] = useState<string>('');
const { menuData } = useSelector(state => state.ideContainer);
const dispatch = useDispatch(); const dispatch = useDispatch();
function getMenuData(): MenuItemType[] { function getMenuData(): MenuItemType[] {
@ -49,7 +56,16 @@ const SideBar: React.FC<SideBarProps> = ({ selectedKey, identity, subMenuData, o
v.key = `compFlow-${v.id}`; v.key = `compFlow-${v.id}`;
v.path = 'compFlow'; v.path = 'compFlow';
v.parentKey = menu[activeKey]?.key; v.parentKey = menu[activeKey]?.key;
v.children = null; v.children = [
{
title: '事件',
children: null
},
{
title: '组件列表',
children: null
}
];
}); });
menuData[menuIndex]['children'] = subMenuValue; menuData[menuIndex]['children'] = subMenuValue;
dispatch(updateMenuData({ 'scene': menuData })); dispatch(updateMenuData({ 'scene': menuData }));
@ -94,6 +110,44 @@ const SideBar: React.FC<SideBarProps> = ({ selectedKey, identity, subMenuData, o
onMenuSelect?.({ ...item }); onMenuSelect?.({ ...item });
}; };
const getProjectEnvData = async (data) => {
if (!data.path || !data.key) return;
const parentKey = menu[activeKey]?.key;
const currentMenu = _.cloneDeep(menuData[identity]);
const index = currentMenu.findIndex(v => v.key === parentKey);
const res: any = await getProjectEnv(data.id);
if (res.code === 200) {
const children = currentMenu[index].children.find(v => v.id === data.id);
children.children[0].children = res.data.events.map(item => {
return {
title: item,
children: null
};
});
children.children[1].children = Object.keys(res.data.compList).map(item => {
return {
title: compTypeMap[item],
children: res.data.compList[item].map(item => {
return {
title: item,
children: null
};
})
};
});
// 更新 menuData 中的数据
dispatch(updateMenuData({ ...menuData, [identity]: currentMenu }));
// 同时更新本地 menu 状态以触发重新渲染
setMenu(prevMenu => {
const newMenu = [...prevMenu];
newMenu[activeKey] = { ...newMenu[activeKey], children: currentMenu[index].children };
return newMenu;
});
}
};
// 渲染子菜单 // 渲染子菜单
const renderMenuItems = (menuItems?: MenuItemType[], parentKey = '0') => { const renderMenuItems = (menuItems?: MenuItemType[], parentKey = '0') => {
if (menuItems && menuItems.length) { if (menuItems && menuItems.length) {
@ -166,7 +220,7 @@ const SideBar: React.FC<SideBarProps> = ({ selectedKey, identity, subMenuData, o
onSelect={(_selectedKeys, info) => { onSelect={(_selectedKeys, info) => {
const selectedNode = info.node; const selectedNode = info.node;
const originalData = selectedNode.props.dataRef; const originalData = selectedNode.props.dataRef;
getProjectEnvData(originalData);
// 保持主菜单的选中状态 // 保持主菜单的选中状态
const mainMenuKey = `${menu[activeKey]?.key}`; const mainMenuKey = `${menu[activeKey]?.key}`;
setMainMenuSelectedKey(mainMenuKey); setMainMenuSelectedKey(mainMenuKey);

@ -3,12 +3,14 @@ import { createSlice } from '@reduxjs/toolkit';
interface IDEContainerState { interface IDEContainerState {
info: any; info: any;
menuData: any; menuData: any;
flowData: any;
logBarStatus?: boolean; logBarStatus?: boolean;
} }
const initialState: IDEContainerState = { const initialState: IDEContainerState = {
info: {}, info: {},
menuData: {}, menuData: {},
flowData: {},
logBarStatus: false logBarStatus: false
}; };
@ -22,12 +24,15 @@ const ideContainerSlice = createSlice({
updateMenuData(state, action) { updateMenuData(state, action) {
state.menuData = action.payload; state.menuData = action.payload;
}, },
updateFlowData(state, action) {
state.flowData = action.payload;
},
updateLogBarStatus(state, action) { updateLogBarStatus(state, action) {
state.logBarStatus = action.payload; state.logBarStatus = action.payload;
} }
} }
}); });
export const { updateInfo, updateMenuData, updateLogBarStatus } = ideContainerSlice.actions; export const { updateInfo, updateMenuData, updateFlowData, updateLogBarStatus } = ideContainerSlice.actions;
export default ideContainerSlice.reducer; export default ideContainerSlice.reducer;
Loading…
Cancel
Save