From 66ed71141684bf528d4dbb226b75411f84710555 Mon Sep 17 00:00:00 2001 From: tristanliu Date: Sat, 30 Nov 2024 17:55:50 +0800 Subject: [PATCH] [improvement][headless-fe] Revamped the interaction for semantic modeling routing and successfully implemented the switching between dimension and dataset management. --- .../packages/supersonic-fe/config/routes.ts | 17 + .../pages/SemanticModel/Dimension/Detail.tsx | 101 +++++ .../src/pages/SemanticModel/Metric/Detail.tsx | 7 +- .../src/pages/SemanticModel/Metric/Edit.tsx | 24 +- .../components/MetricInfoCreateForm.tsx | 383 ++++++++--------- .../src/pages/SemanticModel/ModelManager.tsx | 4 +- .../pages/SemanticModel/PageBreadcrumb.tsx | 57 ++- .../View/components/DataSetTable.tsx | 9 +- .../View/components/DatasetCreateForm.tsx | 397 +++++++----------- .../SemanticModel/View/components/Detail.tsx | 82 ++-- .../View/components/ViewCreateFormModal.tsx | 1 - .../components/ViewModelConfigTransfer.tsx | 2 +- .../components/ClassDimensionTable.tsx | 31 +- .../components/ClassMetricTable.tsx | 9 +- .../DetailContainer/DetailSider.tsx | 54 ++- .../components/DetailContainer/style.less | 14 +- .../components/DimensionInfoForm.tsx | 343 +++++++++++++++ .../components/TableColumnRender.tsx | 35 +- .../src/pages/SemanticModel/index.tsx | 7 + .../SemanticModel/models/dimensionData.ts | 8 +- .../pages/SemanticModel/models/domainData.ts | 21 +- .../pages/SemanticModel/models/modelData.ts | 14 +- .../src/pages/SemanticModel/service.ts | 3 - .../src/pages/SemanticModel/utils.tsx | 24 +- 24 files changed, 1106 insertions(+), 541 deletions(-) create mode 100644 webapp/packages/supersonic-fe/src/pages/SemanticModel/Dimension/Detail.tsx create mode 100644 webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DimensionInfoForm.tsx diff --git a/webapp/packages/supersonic-fe/config/routes.ts b/webapp/packages/supersonic-fe/config/routes.ts index 8f91deed4..03f2cd484 100644 --- a/webapp/packages/supersonic-fe/config/routes.ts +++ b/webapp/packages/supersonic-fe/config/routes.ts @@ -95,6 +95,12 @@ const ROUTES = [ path: '/model/dataset/:domainId/:datasetId', component: './SemanticModel/View/components/Detail', envEnableList: [ENV_KEY.SEMANTIC], + routes: [ + { + path: '/model/dataset/:domainId/:datasetId/:menuKey', + component: './SemanticModel/View/components/Detail', + }, + ], }, { path: '/model/metric/:domainId/:modelId/:metricId', @@ -107,6 +113,17 @@ const ROUTES = [ // }, // ], }, + { + path: '/model/dimension/:domainId/:modelId/:dimensionId', + component: './SemanticModel/Dimension/Detail', + envEnableList: [ENV_KEY.SEMANTIC], + // routes: [ + // { + // path: '/model/manager/:domainId/:modelId/:menuKey', + // component: './SemanticModel/ModelManager', + // }, + // ], + }, ], }, diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Dimension/Detail.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Dimension/Detail.tsx new file mode 100644 index 000000000..56ec85a1c --- /dev/null +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Dimension/Detail.tsx @@ -0,0 +1,101 @@ +import { message } from 'antd'; +import React, { useState, useEffect, useRef } from 'react'; +import { useParams, useModel, Helmet } from '@umijs/max'; +import { BASE_TITLE } from '@/common/constants'; +import { ISemantic } from '../data'; +import { getDimensionList } from '../service'; +import DetailContainer from '@/pages/SemanticModel/components/DetailContainer'; +import DetailSider from '@/pages/SemanticModel/components/DetailContainer/DetailSider'; +import { ProjectOutlined, ConsoleSqlOutlined } from '@ant-design/icons'; +import DimensionInfoForm from '../components/DimensionInfoForm'; +import DetailFormWrapper from '@/pages/SemanticModel/components/DetailContainer/DetailFormWrapper'; + +type Props = Record; + +const DataSetDetail: React.FC = () => { + const settingList = [ + { + icon: , + key: 'basic', + text: '基本信息', + }, + ]; + const params: any = useParams(); + const detailId = params.dimensionId; + const modelId = params.modelId; + const domainId = params.domainId; + const menuKey = params.menuKey; + const [detailData, setDetailData] = useState(); + const dimensionModel = useModel('SemanticModel.dimensionData'); + const { setSelectDimension } = dimensionModel; + const [activeMenu, setActiveMenu] = useState(() => { + if (menuKey) { + const target = settingList.find((item) => item.key === menuKey); + if (target) { + return target; + } + } + + return settingList[0]; + }); + const detailFormRef = useRef(); + + useEffect(() => { + return () => { + setSelectDimension(undefined); + }; + }, []); + + useEffect(() => { + if (!detailId) { + return; + } + queryDetailData(detailId); + }, [detailId]); + + const queryDetailData = async (id: number) => { + const { code, data, msg } = await getDimensionList({ ids: [id] }); + if (code === 200) { + const target = data?.list?.[0]; + setDetailData(target); + setSelectDimension(target); + return; + } + message.error(msg); + }; + + return ( + <> + + { + setActiveMenu(menu); + }} + /> + } + containerNode={ + { + detailFormRef.current.onSave(); + }} + > + + + } + /> + + ); +}; + +export default DataSetDetail; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Detail.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Detail.tsx index 1d76f26a9..d927eb203 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Detail.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Detail.tsx @@ -33,6 +33,9 @@ const MetricDetail: React.FC = () => { }, [metricId]); const queryMetricData = async (metricId: string) => { + if (!metricId) { + return; + } const { code, data, msg } = await getMetricData(metricId); if (code === 200) { setMetircData({ ...data }); @@ -104,7 +107,9 @@ const MetricDetail: React.FC = () => { return ( <> - +
diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Edit.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Edit.tsx index 359ff1ef4..0c70217fe 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Edit.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Edit.tsx @@ -14,7 +14,9 @@ type Props = Record; const MetricDetail: React.FC = () => { const params: any = useParams(); - const metricId = params.metricId; + const metricId = +params.metricId; + const modelId = +params.modelId; + const domainId = +params.domainId; const [metircData, setMetircData] = useState(); const metricModel = useModel('SemanticModel.metricData'); const { setSelectMetric } = metricModel; @@ -33,7 +35,10 @@ const MetricDetail: React.FC = () => { }; }, []); - const queryMetricData = async (metricId: string) => { + const queryMetricData = async (metricId: number) => { + if (!metricId) { + return; + } const { code, data, msg } = await getMetricData(metricId); if (code === 200) { setMetircData({ ...data }); @@ -58,7 +63,11 @@ const MetricDetail: React.FC = () => { return ( <> - + = () => { }} /> } - containerNode={} + containerNode={ + + } /> ); 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 075ccd2fe..46a0b14f1 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 @@ -37,9 +37,12 @@ import { createMetric, updateMetric, mockMetricAlias, getMetricTags } from '../. import { MetricSettingKey, MetricSettingWording } from '../constants'; import { ISemantic } from '../../data'; import { history } from '@umijs/max'; +import { toDomainList, toModelList } from '@/pages/SemanticModel/utils'; import globalStyles from '@/global.less'; export type CreateFormProps = { + modelId: number; + domainId: number; datasourceId?: number; metricItem: any; settingKey: MetricSettingKey; @@ -58,6 +61,8 @@ const queryParamsTypeParamsKey = { }; const MetricInfoCreateForm: React.FC = ({ + modelId, + domainId, datasourceId, onCancel, settingKey, @@ -65,8 +70,6 @@ const MetricInfoCreateForm: React.FC = ({ onSubmit, }) => { const isEdit = !!metricItem?.id; - const domainId = metricItem?.domainId; - const modelId = metricItem?.modelId; const formValRef = useRef({} as any); const [form] = Form.useForm(); const updateFormVal = (val: any) => { @@ -381,6 +384,9 @@ const MetricInfoCreateForm: React.FC = ({ } message.success('编辑指标成功'); onSubmit?.(queryParams); + if (!isEdit) { + toModelList(domainId, modelId!, 'metric'); + } return; } message.error(msg); @@ -480,10 +486,11 @@ const MetricInfoCreateForm: React.FC = ({ }; const renderContent = () => { - if (settingKey === MetricSettingKey.SQL_CONFIG) { - return ( + return ( + <>
@@ -607,211 +614,211 @@ const MetricInfoCreateForm: React.FC = ({ )}
- ); - } - return ( - <> - - - - - - - - - - - - - - - - - - - - - -