diff --git a/webapp/packages/supersonic-fe/src/app.tsx b/webapp/packages/supersonic-fe/src/app.tsx index 3bd8ae5f3..5328589c9 100644 --- a/webapp/packages/supersonic-fe/src/app.tsx +++ b/webapp/packages/supersonic-fe/src/app.tsx @@ -143,6 +143,15 @@ export const layout: RunTimeLayoutConfig = (params) => { menuHeaderRender: undefined, childrenRender: (dom: any) => { return ( +
@@ -151,6 +160,7 @@ export const layout: RunTimeLayoutConfig = (params) => { )}
+
); }, ...initialState?.settings, diff --git a/webapp/packages/supersonic-fe/src/components/MStar/style.less b/webapp/packages/supersonic-fe/src/components/MStar/style.less index 0fa1f22a3..97390b9d3 100644 --- a/webapp/packages/supersonic-fe/src/components/MStar/style.less +++ b/webapp/packages/supersonic-fe/src/components/MStar/style.less @@ -1,5 +1,5 @@ .collectDashboard { - color: #546174; + color: #faad14; &.dashboardCollected { display: block !important; } 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 282a52afd..0a10f169e 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Detail.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Detail.tsx @@ -1,23 +1,14 @@ -import { message, Tag, Space, Layout, Tabs, Tooltip } from 'antd'; -import React, { useState, useEffect, ReactNode } from 'react'; +import { message } from 'antd'; +import React, { useState, useEffect } from 'react'; import { getMetricData } from '../service'; -import { connect, useParams, history } from 'umi'; +import { connect, useParams } from 'umi'; import type { StateType } from '../model'; -import moment from 'moment'; -import { - LeftOutlined, - UserOutlined, - CalendarOutlined, - InfoCircleOutlined, -} from '@ant-design/icons'; import styles from './style.less'; import MetricTrendSection from '@/pages/SemanticModel/Metric/components/MetricTrendSection'; -import { SENSITIVE_LEVEL_ENUM, SENSITIVE_LEVEL_COLOR } from '../constant'; -import type { TabsProps } from 'antd'; import { ISemantic } from '../data'; -import MetricStar from './components/MetricStar'; +import DimensionAndMetricRelationModal from '../components/DimensionAndMetricRelationModal'; +import MetricInfoSider from './MetricInfoSider'; -const { Content } = Layout; type Props = { metircData: any; domainManger: StateType; @@ -26,27 +17,18 @@ type Props = { [key: string]: any; }; -interface DescriptionItemProps { - title: string | ReactNode; - content: React.ReactNode; - icon: ReactNode; -} - -const DescriptionItem = ({ title, content, icon }: DescriptionItemProps) => ( - -
- - {icon} - {content} - -
-
-); +const siderStyle: React.CSSProperties = { + backgroundColor: '#fff', + width: 450, + minHeight: '100vh', + boxShadow: + '6px 0 16px 0 rgba(0, 0, 0, 0.08), 3px 0 6px -4px rgba(0, 0, 0, 0.12), 9px 0 28px 8px rgba(0, 0, 0, 0.05)', +}; const MetricDetail: React.FC = ({ domainManger }) => { const params: any = useParams(); const metricId = params.metricId; - + const [metricRelationModalOpenState, setMetricRelationModalOpenState] = useState(false); const [metircData, setMetircData] = useState(); useEffect(() => { queryMetricData(metricId); @@ -55,104 +37,41 @@ const MetricDetail: React.FC = ({ domainManger }) => { const queryMetricData = async (metricId: string) => { const { code, data, msg } = await getMetricData(metricId); if (code === 200) { - setMetircData(data); + setMetircData({ ...data }); return; } message.error(msg); }; - const tabItems: TabsProps['items'] = [ - { - key: 'metricTrend', - label: '图表', - children: , - }, - ]; - - const contentStyle: React.CSSProperties = { - minHeight: 120, - color: '#fff', - backgroundColor: '#fff', - }; - return ( - - - -

-
-
{ - history.push(`/metric/market`); - }} - > - -
- -
- - - - {metircData?.name} - {metircData?.alias && `[${metircData.alias}]`} - - {metircData?.name && ( - <> - | - {metircData?.bizName} - - )} - {metircData?.sensitiveLevel !== undefined && ( - - - {SENSITIVE_LEVEL_ENUM[metircData.sensitiveLevel]} - - - )} - - {metircData?.description ? ( -
- - - - {metircData?.description} - - -
- ) : ( - <> - )} -
-
-
- {metircData?.createdBy ? ( - <> -
- } - content={metircData?.createdBy} - /> - - } - content={moment(metircData?.updatedAt).format('YYYY-MM-DD HH:mm:ss')} - /> -
- - ) : ( - <> - )} -
-

+ <> +
+
- +
- - - +
+ { + setMetricRelationModalOpenState(true); + }} + /> +
+
+
+ { + setMetricRelationModalOpenState(false); + }} + onSubmit={(relations) => { + queryMetricData(metricId); + setMetricRelationModalOpenState(false); + }} + /> + ); }; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/MetricInfoSider.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/MetricInfoSider.tsx new file mode 100644 index 000000000..63c7b8f28 --- /dev/null +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/MetricInfoSider.tsx @@ -0,0 +1,188 @@ +import { message, Tag, Space, Tooltip } from 'antd'; +import React, { useState, useEffect, ReactNode } from 'react'; +import { getMetricData } from '../service'; +import { connect, useParams } from 'umi'; +import type { StateType } from '../model'; +import dayjs from 'dayjs'; +import { + ExportOutlined, + SolutionOutlined, + ContainerOutlined, + PartitionOutlined, + FallOutlined, + DeleteOutlined, +} from '@ant-design/icons'; +import styles from './style.less'; +import { SENSITIVE_LEVEL_ENUM, SENSITIVE_LEVEL_COLOR } from '../constant'; +import { ISemantic } from '../data'; +import MetricStar from './components/MetricStar'; + +type Props = { + metircData: any; + domainManger: StateType; + onNodeChange: (params?: { eventName?: string }) => void; + onEditBtnClick?: (metircData: any) => void; + onDimensionRelationBtnClick?: () => void; + [key: string]: any; +}; + +const MetricInfoSider: React.FC = ({ onDimensionRelationBtnClick }) => { + const params: any = useParams(); + const metricId = params.metricId; + + const [metircData, setMetircData] = useState(); + useEffect(() => { + queryMetricData(metricId); + }, [metricId]); + + const queryMetricData = async (metricId: string) => { + const { code, data, msg } = await getMetricData(metricId); + if (code === 200) { + setMetircData(data); + return; + } + message.error(msg); + }; + + return ( +
+
+
+ + + {metircData?.name} + {metircData?.alias && `[${metircData.alias}]`} + {metircData?.hasAdminRes && ( + { + window.open(`/webapp/model/${metircData.domainId}/${metircData.modelId}/`); + }} + > + + + + + )} + + {metircData?.sensitiveLevel !== undefined && ( + + + {SENSITIVE_LEVEL_ENUM[metircData.sensitiveLevel]} + + + )} + +
+ {metircData?.bizName &&
{metircData.bizName}
} +
+ +
+
+
+ + + + 基本信息 + + +
+ +
+ 所属模型: + + + } color="#3b5999"> + {metircData?.modelName || '模型名为空'} + + {metircData?.hasAdminRes && ( + { + window.open(`/webapp/model/${metircData.domainId}/0/overview`); + }} + > + + + + + )} + + +
+
+ 描述: + {metircData?.description} +
+
+ +
+
+ + + + 创建信息 + + +
+ +
+ 创建人: + {metircData?.createdBy} +
+
+ 创建时间: + + {metircData?.createdAt + ? dayjs(metircData?.createdAt).format('YYYY-MM-DD HH:mm:ss') + : ''} + +
+
+ 更新时间: + + {metircData?.createdAt + ? dayjs(metircData?.updatedAt).format('YYYY-MM-DD HH:mm:ss') + : ''} + +
+
+
+
+
    +
  • { + onDimensionRelationBtnClick?.(); + }} + > + + + + + + 下钻维度配置 + + +
  • + {/*
  • { + onDimensionRelationBtnClick?.(); + }} + > + + + + + 删除 + +
  • */} +
+
+
+
+ ); +}; + +export default connect(({ domainManger }: { domainManger: StateType }) => ({ + domainManger, +}))(MetricInfoSider); diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/components/MetricTrend.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/components/MetricTrend.tsx index 5f931d9a5..92e17be6a 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/components/MetricTrend.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/components/MetricTrend.tsx @@ -251,7 +251,7 @@ const TrendChart: React.FC = ({ 300 ? 15 : 6 }} + paragraph={{ rows: height && height > 300 ? 10 : 6 }} />
= ({ metircData }) => { initDimensionData(metircData); setDrillDownDimensions(metircData?.relateDimension?.drillDownDimensions || []); } - }, [metircData?.id, periodDate]); + }, [metircData, periodDate]); return ( -
-
+
+
= ({ metircData }) => {
- - - {metircData?.hasAdminRes && ( - - )} - - - - - -
{authMessage &&
{authMessage}
} - - - - - - ), - value: 'chart', - }, - { - label: ( - - - - ), - value: 'table', - }, - ]} - onChange={(e) => { - setChartType(e.target.value); - }} - value={chartType} - optionType="button" +
+ + - {/* - 0 && - chartType === 'chart' - ? 'block' - : 'none', - }} - onChange={(value) => { - setRowNumber(value); - }} - > - - - - - - - - - {chartType === 'chart' && ( - - )} -
- +
+