diff --git a/webapp/packages/supersonic-fe/config/routes.ts b/webapp/packages/supersonic-fe/config/routes.ts index 0326eabf3..946e72eca 100644 --- a/webapp/packages/supersonic-fe/config/routes.ts +++ b/webapp/packages/supersonic-fe/config/routes.ts @@ -57,24 +57,81 @@ const ROUTES = [ }, { path: '/model/', - component: './SemanticModel/DomainManager', + component: './SemanticModel/', name: 'semanticModel', envEnableList: [ENV_KEY.SEMANTIC], routes: [ { - path: '/model/:domainId/:modelId', + path: '/model/:domainId', component: './SemanticModel/DomainManager', - // name: 'semanticModel', envEnableList: [ENV_KEY.SEMANTIC], + routes: [ + { + path: '/model/:domainId/:menuKey', + component: './SemanticModel/DomainManager', + }, + ], }, { - path: '/model/:domainId/:modelId/:menuKey', - component: './SemanticModel/DomainManager', - // name: 'semanticModel', + path: '/model/manager/:domainId/:modelId', + component: './SemanticModel/ModelManager', envEnableList: [ENV_KEY.SEMANTIC], + routes: [ + { + path: '/model/manager/:domainId/:modelId/:menuKey', + component: './SemanticModel/ModelManager', + }, + ], }, + // { + // path: '/model/:domainId/:modelId/:menuKey', + // component: './SemanticModel/DomainManager', + // envEnableList: [ENV_KEY.SEMANTIC], + // }, + // { + // path: '/model/:domainId/:modelId/metric', + // component: './SemanticModel/components/ModelMetric', + // envEnableList: [ENV_KEY.SEMANTIC], + // routes: [ + // { + // path: '/model/:domainId/:modelId/metric/list', + // component: './SemanticModel/components/ClassMetricTable', + // envEnableList: [ENV_KEY.SEMANTIC], + // }, + // ], + // }, ], }, + // { + // path: '/model/', + // component: './SemanticModel/DomainManager', + // name: 'semanticModel', + // envEnableList: [ENV_KEY.SEMANTIC], + // routes: [ + // { + // path: '/model/:domainId/:modelId', + // component: './SemanticModel/DomainManager', + // envEnableList: [ENV_KEY.SEMANTIC], + // }, + // { + // path: '/model/:domainId/:modelId/:menuKey', + // component: './SemanticModel/DomainManager', + // envEnableList: [ENV_KEY.SEMANTIC], + // }, + // { + // path: '/model/:domainId/:modelId/metric', + // component: './SemanticModel/components/ModelMetric', + // envEnableList: [ENV_KEY.SEMANTIC], + // routes: [ + // { + // path: '/model/:domainId/:modelId/metric/list', + // component: './SemanticModel/components/ClassMetricTable', + // envEnableList: [ENV_KEY.SEMANTIC], + // }, + // ], + // }, + // ], + // }, // { // path: '/model/:domainId/:modelId/:menuKey', diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Dimension/index.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Dimension/index.tsx new file mode 100644 index 000000000..81dc60372 --- /dev/null +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Dimension/index.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { Outlet } from '@umijs/max'; + +const Dimension: React.FC = () => { + return ( + <> + + + ); +}; + +export default Dimension; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Dimension/style.less b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Dimension/style.less new file mode 100644 index 000000000..e69de29bb diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/DomainManager.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/DomainManager.tsx index 6b6106d62..4ff772a5d 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/DomainManager.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/DomainManager.tsx @@ -1,12 +1,108 @@ -import React from 'react'; -import OverviewContainer from './OverviewContainer'; +import { message } from 'antd'; +import React, { useEffect, useState } from 'react'; +import { history, useParams, useModel } from '@umijs/max'; +import { ISemantic } from './data'; +import { getDomainList, getDataSetList } from './service'; +import DomainManagerTab from './components/DomainManagerTab'; +import { isArrayOfValues } from '@/utils/utils'; type Props = {}; -const DomainManager: React.FC = () => { + +const DomainManager: React.FC = ({}) => { + const defaultTabKey = 'overview'; + const params: any = useParams(); + const domainId = params.domainId; + const domainModel = useModel('SemanticModel.domainData'); + const modelModel = useModel('SemanticModel.modelData'); + const databaseModel = useModel('SemanticModel.databaseData'); + const { selectDomainId, domainList, setSelectDomain, setDomainList } = domainModel; + const { selectModelId } = modelModel; + const { MrefreshDatabaseList } = databaseModel; + const menuKey = params.menuKey ? params.menuKey : defaultTabKey; + const [collapsedState, setCollapsedState] = useState(true); + const [activeKey, setActiveKey] = useState(menuKey); + const [dataSetList, setDataSetList] = useState([]); + + // const initSelectedDomain = (domainList: ISemantic.IDomainItem[]) => { + // const targetNode = domainList.filter((item: any) => { + // return `${item.id}` === domainId; + // })[0]; + // if (!targetNode) { + // const firstRootNode = domainList.filter((item: any) => { + // return item.parentId === 0; + // })[0]; + // if (firstRootNode) { + // const { id } = firstRootNode; + // setSelectDomain(firstRootNode); + // setActiveKey(menuKey); + // pushUrlMenu(id, 0, menuKey); + // } + // } else { + // setSelectDomain(targetNode); + // } + // }; + + // const initProjectTree = async () => { + // const { code, data, msg } = await getDomainList(); + // if (code === 200) { + // initSelectedDomain(data); + // setDomainList(data); + // } else { + // message.error(msg); + // } + // }; + + // useEffect(() => { + // initProjectTree(); + // MrefreshDatabaseList(); + // }, []); + + // useEffect(() => { + // if (!selectDomainId) { + // return; + // } + // // queryModelList(); + // queryDataSetList(); + // }, [selectDomainId]); + + // const queryDataSetList = async () => { + // const { code, data, msg } = await getDataSetList(selectDomainId); + // if (code === 200) { + // setDataSetList(data); + // if (!isArrayOfValues(data)) { + // setActiveKey(defaultTabKey); + // } + // } else { + // message.error(msg); + // } + // }; + + const pushUrlMenu = (domainId: number, menuKey: string) => { + history.push(`/model/${domainId}/${menuKey}`); + }; + + const cleanModelInfo = (domainId) => { + setActiveKey(defaultTabKey); + pushUrlMenu(domainId, defaultTabKey); + // setSelectModel(undefined); + }; + + // const handleCollapsedBtn = () => { + // setCollapsedState(!collapsedState); + // }; + return ( - <> - - + { + cleanModelInfo(selectDomainId); + }} + onMenuChange={(menuKey) => { + setActiveKey(menuKey); + pushUrlMenu(selectDomainId, menuKey); + }} + /> ); }; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/components/MetricInfoCreateForm.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/components/MetricInfoCreateForm.tsx index c7c0b6460..2efcc3291 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/components/MetricInfoCreateForm.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/components/MetricInfoCreateForm.tsx @@ -904,7 +904,9 @@ const MetricInfoCreateForm: React.FC = ({ type="primary" key="console" onClick={() => { - history.replace(`/model/${domainId}/${modelId || metricItem?.modelId}/dataSource`); + history.replace( + `/model/manager/${domainId}/${modelId || metricItem?.modelId}/dataSource`, + ); onCancel?.(); }} > diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/ModelManager.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/ModelManager.tsx new file mode 100644 index 000000000..9ec4abd73 --- /dev/null +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/ModelManager.tsx @@ -0,0 +1,71 @@ +import React, { useEffect, useState } from 'react'; +import { history, useParams, useModel } from '@umijs/max'; +import ModelManagerTab from './components/ModelManagerTab'; + +type Props = {}; + +const OverviewContainer: React.FC = ({}) => { + const defaultTabKey = 'overview'; + const params: any = useParams(); + const domainId = params.domainId; + const modelId = params.modelId; + const domainModel = useModel('SemanticModel.domainData'); + const modelModel = useModel('SemanticModel.modelData'); + const dimensionModel = useModel('SemanticModel.dimensionData'); + const metricModel = useModel('SemanticModel.metricData'); + const databaseModel = useModel('SemanticModel.databaseData'); + const { selectDomainId, domainList, setSelectDomain, setDomainList } = domainModel; + const { + selectModelId, + modelList, + MrefreshModelList, + setSelectModel, + setModelTableHistoryParams, + } = modelModel; + const { MrefreshDimensionList } = dimensionModel; + const { MrefreshMetricList } = metricModel; + const { MrefreshDatabaseList } = databaseModel; + const menuKey = params.menuKey ? params.menuKey : !Number(modelId) ? defaultTabKey : ''; + const [activeKey, setActiveKey] = useState(menuKey); + + const initModelConfig = () => { + const currentMenuKey = menuKey === defaultTabKey ? '' : menuKey; + pushUrlMenu(selectDomainId, selectModelId, currentMenuKey); + setActiveKey(currentMenuKey); + }; + + useEffect(() => { + if (!selectModelId) { + return; + } + initModelConfig(); + MrefreshDimensionList({ modelId: selectModelId }); + MrefreshMetricList({ modelId: selectModelId }); + }, [selectModelId]); + + const pushUrlMenu = (domainId: number, modelId: number, menuKey: string) => { + history.push(`/model/manager/${domainId}/${modelId}/${menuKey}`); + }; + + const cleanModelInfo = (domainId) => { + setActiveKey(defaultTabKey); + pushUrlMenu(domainId, 0, defaultTabKey); + setSelectModel(undefined); + }; + + return ( + { + cleanModelInfo(selectDomainId); + }} + onMenuChange={(menuKey) => { + setActiveKey(menuKey); + pushUrlMenu(selectDomainId, selectModelId, menuKey); + }} + /> + ); +}; + +export default OverviewContainer; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer1.tsx similarity index 97% rename from webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer.tsx rename to webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer1.tsx index 20786ca24..63534cd48 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer1.tsx @@ -8,14 +8,14 @@ import { ISemantic } from './data'; import { getDomainList, getDataSetList } from './service'; import DomainManagerTab from './components/DomainManagerTab'; import { isArrayOfValues } from '@/utils/utils'; +import OverviewContainerRight from './components/OverviewContainerRight'; type Props = { mode: 'domain'; }; -const OverviewContainer: React.FC = ({ mode }) => { +const OverviewContainer: React.FC = ({ mode = 'domain' }) => { const defaultTabKey = 'overview'; - // 'overview' dataSetManage const params: any = useParams(); const domainId = params.domainId; const modelId = params.modelId; @@ -184,6 +184,7 @@ const OverviewContainer: React.FC = ({ mode }) => {
{selectDomainId ? ( <> + { + const domainModel = useModel('SemanticModel.domainData'); + const modelModel = useModel('SemanticModel.modelData'); + + const { selectDomainId, selectDomainName, selectDomain: domainData } = domainModel; + const { selectModelId, selectModelName, setSelectModel } = modelModel; + + return ( + <> + { + // onBackDomainBtnClick?.(); + setSelectModel(undefined); + history.push(`/model/${selectDomainId}/overview`); + }} + style={ + selectModelName ? { cursor: 'pointer' } : { color: '#296df3', fontWeight: 'bold' } + } + > + + {selectDomainName} + + ), + }, + { + type: 'separator', + separator: selectModelName ? '/' : '', + }, + { + title: selectModelName ? ( + { + history.push(`/model/manager/${selectDomainId}/${selectModelId}/`); + }} + style={{ color: '#296df3' }} + > + + {selectModelName} + + ) : undefined, + }, + ]} + /> + + + ); +}; + +export default OverviewContainerRight; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DataSetTable.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DataSetTable.tsx index 260c61062..2fea630fd 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DataSetTable.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/components/DataSetTable.tsx @@ -13,11 +13,11 @@ import { ColumnsConfig } from '../../components/TableColumnRender'; import ViewSearchFormModal from './ViewSearchFormModal'; type Props = { - dataSetList: ISemantic.IDatasetItem[]; + // dataSetList: ISemantic.IDatasetItem[]; disabledEdit?: boolean; }; -const DataSetTable: React.FC = ({ dataSetList, disabledEdit = false }) => { +const DataSetTable: React.FC = ({ disabledEdit = false }) => { const domainModel = useModel('SemanticModel.domainData'); const { selectDomainId } = domainModel; @@ -43,14 +43,14 @@ const DataSetTable: React.FC = ({ dataSetList, disabledEdit = false }) => } }; - const [viewList, setViewList] = useState(dataSetList); + const [viewList, setViewList] = useState(); + + // useEffect(() => { + // setViewList(dataSetList); + // }, [dataSetList]); useEffect(() => { - setViewList(dataSetList); - }, [dataSetList]); - - useEffect(() => { - // queryDataSetList(); + queryDataSetList(); queryDomainAllModel(); }, [selectDomainId]); diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/index.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/index.tsx index 962b9e1f8..f36197f88 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/index.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/View/index.tsx @@ -4,13 +4,12 @@ import DataSetTable from './components/DataSetTable'; type Props = { disabledEdit?: boolean; - dataSetList: ISemantic.IDatasetItem[]; }; -const View: React.FC = ({ dataSetList, disabledEdit = false }) => { +const View: React.FC = ({ disabledEdit = false }) => { return (
- +
); }; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassMetricTable.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassMetricTable.tsx index c5da0348f..9e0958a2a 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassMetricTable.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassMetricTable.tsx @@ -142,7 +142,11 @@ const ClassMetricTable: React.FC = ({ onEmptyMetricData }) => { } }; - const columnsConfig = ColumnsConfig({ indicatorInfo: { url: '/model/metric/edit/' } }); + const columnsConfig = ColumnsConfig({ + indicatorInfo: { + url: '/model/metric/edit/', + }, + }); const columns: ProColumns[] = [ { diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainManagerTab.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainManagerTab.tsx index 9e54e39fd..0825af508 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainManagerTab.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainManagerTab.tsx @@ -11,23 +11,24 @@ import styles from './style.less'; import { HomeOutlined, FundViewOutlined } from '@ant-design/icons'; import { ISemantic } from '../data'; import SemanticGraphCanvas from '../SemanticGraphCanvas'; +import Dimension from '../Dimension'; +import ModelMetric from '../components/ModelMetric'; import View from '../View'; type Props = { - isModel: boolean; + // isModel: boolean; activeKey: string; - modelList: ISemantic.IModelItem[]; + // modelList: ISemantic.IModelItem[]; dataSetList: ISemantic.IDatasetItem[]; - handleModelChange: (model?: ISemantic.IModelItem) => void; + // handleModelChange: (model?: ISemantic.IModelItem) => void; onBackDomainBtnClick?: () => void; onMenuChange?: (menuKey: string) => void; }; const DomainManagerTab: React.FC = ({ - isModel, activeKey, - modelList, + // modelList, dataSetList, - handleModelChange, + // handleModelChange, onBackDomainBtnClick, onMenuChange, }) => { @@ -38,7 +39,7 @@ const DomainManagerTab: React.FC = ({ const modelModel = useModel('SemanticModel.modelData'); const { selectDomainId, selectDomainName, selectDomain: domainData } = domainModel; - const { selectModelId, selectModelName } = modelModel; + const { selectModelId, modelList, selectModelName } = modelModel; useEffect(() => { initState.current = false; @@ -50,7 +51,7 @@ const DomainManagerTab: React.FC = ({ label: '数据集管理', key: 'overview', hidden: !!domainData?.parentId, - children: , + children: , }, { label: '模型管理', @@ -59,9 +60,9 @@ const DomainManagerTab: React.FC = ({ showModelType === 'list' ? ( { - handleModelChange(model); - }} + // onModelChange={(model) => { + // handleModelChange(model); + // }} /> ) : (
@@ -98,36 +99,9 @@ const DomainManagerTab: React.FC = ({ return item.key !== 'permissonSetting'; }); - const isModelItem = [ - { - label: '指标管理', - key: 'metric', - children: ( - { - if (!initState.current) { - initState.current = true; - onMenuChange?.('dimenstion'); - } - }} - /> - ), - }, - { - label: '维度管理', - key: 'dimenstion', - children: , - }, - { - label: '权限管理', - key: 'permissonSetting', - children: , - }, - ]; - const getActiveKey = () => { const key = activeKey || defaultTabKey; - const tabItems = !isModel ? tabItem : isModelItem; + const tabItems = tabItem; const tabItemsKeys = tabItems.map((item) => item.key); if (!tabItemsKeys.includes(key)) { return tabItemsKeys[0]; @@ -137,47 +111,9 @@ const DomainManagerTab: React.FC = ({ return (
- { - onBackDomainBtnClick?.(); - }} - style={ - selectModelName ? { cursor: 'pointer' } : { color: '#296df3', fontWeight: 'bold' } - } - > - - {selectDomainName} - - ), - }, - { - type: 'separator', - separator: selectModelName ? '/' : '', - }, - { - title: selectModelName ? ( - { - history.push(`/model/${selectDomainId}/${selectModelId}/`); - }} - style={{ color: '#296df3' }} - > - - {selectModelName} - - ) : undefined, - }, - ]} - /> = ({ type="primary" key="console" onClick={() => { - history.replace(`/model/${domainId}/${modelId || metricItem?.modelId}/dataSource`); + history.replace( + `/model/manager/${domainId}/${modelId || metricItem?.modelId}/dataSource`, + ); onCancel?.(); }} > diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelManagerTab.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelManagerTab.tsx new file mode 100644 index 000000000..dcd8749eb --- /dev/null +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelManagerTab.tsx @@ -0,0 +1,102 @@ +import { Tabs, Breadcrumb, Space, Radio } from 'antd'; +import React, { useRef, useEffect, useState } from 'react'; +import { history, useModel } from '@umijs/max'; +import ClassDimensionTable from './ClassDimensionTable'; +import ClassMetricTable from './ClassMetricTable'; +import PermissionSection from './Permission/PermissionSection'; +import TagObjectTable from '../Insights/components/TagObjectTable'; +import TermTable from '../components/Term/TermTable'; +import OverView from './OverView'; +import styles from './style.less'; +import { HomeOutlined, FundViewOutlined } from '@ant-design/icons'; +import { ISemantic } from '../data'; +import SemanticGraphCanvas from '../SemanticGraphCanvas'; +import Dimension from '../Dimension'; +import ModelMetric from '../components/ModelMetric'; +import View from '../View'; + +type Props = { + activeKey: string; + modelList: ISemantic.IModelItem[]; + handleModelChange: (model?: ISemantic.IModelItem) => void; + onBackDomainBtnClick?: () => void; + onMenuChange?: (menuKey: string) => void; +}; +const ModelManagerTab: React.FC = ({ + activeKey, + modelList, + handleModelChange, + onBackDomainBtnClick, + onMenuChange, +}) => { + const initState = useRef(false); + const defaultTabKey = 'metric'; + const domainModel = useModel('SemanticModel.domainData'); + const modelModel = useModel('SemanticModel.modelData'); + + const { selectDomainId, selectDomainName, selectDomain: domainData } = domainModel; + const { selectModelId, selectModelName } = modelModel; + + useEffect(() => { + console.log(modelList, 'modelList'); + }, [modelList]); + + useEffect(() => { + initState.current = false; + }, [selectModelId]); + + const isModelItem = [ + { + label: '指标管理', + key: 'metric', + // children: , + children: ( + { + if (!initState.current) { + initState.current = true; + onMenuChange?.('dimension'); + } + }} + /> + ), + }, + { + label: '维度管理', + key: 'dimension', + children: , + // children: , + }, + { + label: '权限管理', + key: 'permissonSetting', + children: , + }, + ]; + + const getActiveKey = () => { + const key = activeKey || defaultTabKey; + const tabItems = isModelItem; + const tabItemsKeys = tabItems.map((item) => item.key); + if (!tabItemsKeys.includes(key)) { + return tabItemsKeys[0]; + } + return key; + }; + + return ( +
+ { + onMenuChange?.(menuKey); + }} + /> +
+ ); +}; + +export default ModelManagerTab; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelMetric/index.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelMetric/index.tsx new file mode 100644 index 000000000..81dc60372 --- /dev/null +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelMetric/index.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { Outlet } from '@umijs/max'; + +const Dimension: React.FC = () => { + return ( + <> + + + ); +}; + +export default Dimension; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelMetric/style.less b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelMetric/style.less new file mode 100644 index 000000000..e69de29bb diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelTable.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelTable.tsx index 1ecd296da..ecd69002f 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelTable.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelTable.tsx @@ -3,7 +3,7 @@ import { ProTable } from '@ant-design/pro-components'; import { message, Button, Space, Popconfirm, Input } from 'antd'; import React, { useRef, useState, useEffect } from 'react'; import { StatusEnum } from '../enum'; -import { useModel } from '@umijs/max'; +import { useModel, history } from '@umijs/max'; import { deleteModel, batchUpdateModelStatus } from '../service'; import ClassModelTypeModal from './ClassModelTypeModal'; import { ColumnsConfig } from './TableColumnRender'; @@ -22,14 +22,14 @@ const ModelTable: React.FC = ({ modelList, disabledEdit = false, onModelC const domainModel = useModel('SemanticModel.domainData'); const modelModel = useModel('SemanticModel.modelData'); const { selectDomainId } = domainModel; - const { modelTableHistoryParams, setModelTableHistoryParams } = modelModel; + const { modelTableHistoryParams, setModelTableHistoryParams, setSelectModel } = modelModel; const [modelItem, setModelItem] = useState(); const [filterParams, setFilterParams] = useState>({}); const [createDataSourceModalOpen, setCreateDataSourceModalOpen] = useState(false); const [currentPageNumber, setCurrentPageNumber] = useState(1); const actionRef = useRef(); - + const [isEditing, setIsEditing] = useState(false); const [tableData, setTableData] = useState([]); const params = modelTableHistoryParams?.[selectDomainId]; @@ -100,10 +100,14 @@ const ModelTable: React.FC = ({ modelList, disabledEdit = false, onModelC title: '模型名称', search: false, render: (_, record) => { + const { domainId, id } = record; return ( { - onModelChange?.(record); + setSelectModel(record); + + history.push(`/model/manager/${domainId}/${id}`); + // onModelChange?.(record); }} > {_} @@ -161,6 +165,7 @@ const ModelTable: React.FC = ({ modelList, disabledEdit = false, onModelC onClick={() => { setModelItem(record); setCreateDataSourceModalOpen(true); + setIsEditing(true); }} > 编辑 @@ -209,84 +214,88 @@ const ModelTable: React.FC = ({ modelList, disabledEdit = false, onModelC return ( <> - { - return false; - }} - pagination={{ - current: currentPageNumber, - onChange: (pageNumber) => { - setCurrentPageNumber(pageNumber); - dipatchParams({ - ...filterParams, - pageNumber: `${pageNumber}`, - }); - }, - }} - headerTitle={ - { - setCurrentPageNumber(1); - dipatchParams({ - ...filterParams, - key: value, - pageNumber: `1`, - }); - setFilterParams((preState) => { - return { - ...preState, +
+ { + return false; + }} + pagination={{ + current: currentPageNumber, + onChange: (pageNumber) => { + setCurrentPageNumber(pageNumber); + dipatchParams({ + ...filterParams, + pageNumber: `${pageNumber}`, + }); + }, + }} + headerTitle={ + { + setCurrentPageNumber(1); + dipatchParams({ + ...filterParams, key: value, - }; - }); + pageNumber: `1`, + }); + setFilterParams((preState) => { + return { + ...preState, + key: value, + }; + }); + }} + /> + ), + }, + ]} + /> + } + size="small" + options={{ reload: false, density: false, fullScreen: false }} + toolBarRender={() => + disabledEdit + ? [<>] + : [ + , - ] - } - /> + > + 创建模型 + , + ] + } + /> +
{createDataSourceModalOpen && ( { onModelChange?.(); + setIsEditing(false); setCreateDataSourceModalOpen(false); }} onCancel={() => { + setIsEditing(false); setCreateDataSourceModalOpen(false); }} /> diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/TableColumnRender.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/TableColumnRender.tsx index f592344c4..c24b816c3 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/TableColumnRender.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/TableColumnRender.tsx @@ -16,6 +16,7 @@ export const ColumnsConfig: any = (params?: { indicatorInfo?: { url?: string; starType?: StarType; + onNameClick?: (record: ISemantic.IMetricItem) => void; }; }) => { return { @@ -117,11 +118,15 @@ export const ColumnsConfig: any = (params?: { className={styles.textLink} style={{ fontWeight: 500 }} onClick={(event: any) => { - history.push(`${url}${id}`); + if (params?.indicatorInfo?.onNameClick) { + params?.indicatorInfo?.onNameClick(record); + } else { + history.push(`${url}${id}`); + } event.preventDefault(); event.stopPropagation(); }} - href={`/webapp${url}${id}`} + // href={`/webapp${url}${id}`} > {name}
diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/index.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/index.tsx index 01f7068a0..7120a1482 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/index.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/index.tsx @@ -1,7 +1,189 @@ -import React from 'react'; +import { message } from 'antd'; +import React, { useEffect, useState } from 'react'; +import { history, useParams, useModel } from '@umijs/max'; +import DomainListTree from './components/DomainList'; +import styles from './components/style.less'; +import { LeftOutlined, RightOutlined } from '@ant-design/icons'; +import { ISemantic } from './data'; +import { getDomainList, getDataSetList } from './service'; +import { isArrayOfValues } from '@/utils/utils'; +import OverviewContainerRight from './OverviewContainerRight'; -const classManager: React.FC = ({ children }) => { - return
{children}
; +type Props = { + mode: 'domain'; }; -export default classManager; +const OverviewContainer: React.FC = ({ mode = 'domain' }) => { + const defaultTabKey = 'overview'; + const params: any = useParams(); + const domainId = params.domainId; + const modelId = params.modelId; + const domainModel = useModel('SemanticModel.domainData'); + const modelModel = useModel('SemanticModel.modelData'); + const dimensionModel = useModel('SemanticModel.dimensionData'); + const metricModel = useModel('SemanticModel.metricData'); + const databaseModel = useModel('SemanticModel.databaseData'); + const { selectDomainId, domainList, setSelectDomain, setDomainList } = domainModel; + const { + selectModelId, + modelList, + MrefreshModelList, + setSelectModel, + setModelTableHistoryParams, + } = modelModel; + const { MrefreshDimensionList } = dimensionModel; + const { MrefreshMetricList } = metricModel; + const { MrefreshDatabaseList } = databaseModel; + const menuKey = params.menuKey ? params.menuKey : !Number(modelId) ? defaultTabKey : ''; + + const [collapsedState, setCollapsedState] = useState(true); + const [activeKey, setActiveKey] = useState(menuKey); + // const [dataSetList, setDataSetList] = useState([]); + + const initSelectedDomain = (domainList: ISemantic.IDomainItem[]) => { + const targetNode = domainList.filter((item: any) => { + return `${item.id}` === domainId; + })[0]; + if (!targetNode) { + const firstRootNode = domainList.filter((item: any) => { + return item.parentId === 0; + })[0]; + if (firstRootNode) { + const { id } = firstRootNode; + setSelectDomain(firstRootNode); + setActiveKey(menuKey); + pushUrlMenu(id, 0, menuKey); + } + } else { + setSelectDomain(targetNode); + } + }; + + const initProjectTree = async () => { + const { code, data, msg } = await getDomainList(); + if (code === 200) { + initSelectedDomain(data); + setDomainList(data); + } else { + message.error(msg); + } + }; + + useEffect(() => { + initProjectTree(); + MrefreshDatabaseList(); + return () => { + setSelectDomain(undefined); + // setSelectModel(undefined); + }; + }, []); + + useEffect(() => { + if (!selectDomainId) { + return; + } + console.log(selectDomainId, 'selectDomainIdselectDomainId'); + queryModelList(); + // queryDataSetList(); + }, [selectDomainId]); + + // const queryDataSetList = async () => { + // const { code, data, msg } = await getDataSetList(selectDomainId); + // if (code === 200) { + // setDataSetList(data); + // if (!isArrayOfValues(data)) { + // setActiveKey(defaultTabKey); + // } + // } else { + // message.error(msg); + // } + // }; + + const queryModelList = async () => { + await MrefreshModelList(selectDomainId); + }; + + // const initModelConfig = () => { + // const currentMenuKey = menuKey === defaultTabKey ? '' : menuKey; + // pushUrlMenu(selectDomainId, selectModelId, currentMenuKey); + // setActiveKey(currentMenuKey); + // }; + + // useEffect(() => { + // if (!selectModelId) { + // return; + // } + // // initModelConfig(); + // MrefreshDimensionList({ modelId: selectModelId }); + // MrefreshMetricList({ modelId: selectModelId }); + // }, [selectModelId]); + + const pushUrlMenu = (domainId: number, modelId: number, menuKey: string) => { + history.push(`/model/${domainId}/${menuKey}`); + }; + + // // const handleModelChange = (model?: ISemantic.IModelItem) => { + // // if (!model) { + // // return; + // // } + // // if (`${model.id}` === `${selectModelId}`) { + // // initModelConfig(); + // // } + // // setSelectModel(model); + // // }; + + const cleanModelInfo = (domainId) => { + setActiveKey(defaultTabKey); + pushUrlMenu(domainId, 0, defaultTabKey); + setSelectModel(undefined); + }; + + const handleCollapsedBtn = () => { + setCollapsedState(!collapsedState); + }; + + return ( +
+
+
+
+ { + const { id } = domainData; + cleanModelInfo(id); + setSelectDomain(domainData); + setModelTableHistoryParams({ + [id]: {}, + }); + }} + onTreeDataUpdate={() => { + initProjectTree(); + }} + /> +
+ +
{ + handleCollapsedBtn(); + }} + > + {collapsedState ? : } +
+
+
+ {selectDomainId ? ( + <> + + + ) : ( +

请选择项目

+ )} +
+
+
+ ); +}; + +export default OverviewContainer;