diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Market.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Market.tsx index 150670a32..e64f6d19a 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Market.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Market.tsx @@ -161,10 +161,10 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => { }; const columns: ProColumns[] = [ - { - dataIndex: 'id', - title: 'ID', - }, + // { + // dataIndex: 'id', + // title: 'ID', + // }, { dataIndex: 'name', title: '指标', diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricFieldFormTable.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricFieldFormTable.tsx new file mode 100644 index 000000000..18593e2ae --- /dev/null +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricFieldFormTable.tsx @@ -0,0 +1,137 @@ +import React, { useState, useRef, useEffect } from 'react'; +import { Button, Tag, Space } from 'antd'; +import ProTable from '@ant-design/pro-table'; +import ProCard from '@ant-design/pro-card'; +import SqlEditor from '@/components/SqlEditor'; +import styles from './style.less'; +import FormLabelRequire from './FormLabelRequire'; +import { ISemantic } from '../data'; + +type Props = { + typeParams: ISemantic.IFieldTypeParams; + fieldList: string[]; + onFieldChange: (fields: ISemantic.IFieldTypeParamsItem[]) => void; + onSqlChange: (sql: string) => void; +}; + +const MetricMeasuresFormTable: React.FC = ({ + typeParams, + fieldList, + onFieldChange, + onSqlChange, +}) => { + const [tableData, setTableData] = useState([]); + + const [defineTypeParams, setDefineTypeParams] = useState( + typeParams || { + expr: '', + metrics: [], + }, + ); + + useEffect(() => { + if (!Array.isArray(fieldList)) { + setTableData([]); + return; + } + setTableData(fieldList); + }, [fieldList]); + + useEffect(() => { + setDefineTypeParams({ ...typeParams }); + }, [typeParams]); + + const [exprString, setExprString] = useState(typeParams?.expr || ''); + + const [selectedKeys, setSelectedKeys] = useState(() => { + return defineTypeParams.fields.map((item: any) => { + return item.fieldName; + }); + }); + + const columns = [ + { + dataIndex: 'fieldName', + title: '字段名称', + }, + { + dataIndex: 'dataType', + title: '字段类型', + }, + ]; + + const rowSelection = { + selectedRowKeys: selectedKeys, + onChange: (_selectedRowKeys: any[]) => { + setSelectedKeys([..._selectedRowKeys]); + onFieldChange( + _selectedRowKeys.map((fieldName) => { + return { fieldName }; + }), + ); + }, + }; + + return ( + <> + + } + rowKey="fieldName" + columns={columns} + dataSource={tableData} + pagination={false} + search={false} + toolbar={{ + search: { + placeholder: '请输入字段名称', + onSearch: (value: string) => { + setTableData( + fieldList.reduce((data: ISemantic.IFieldTypeParamsItem[], fieldName) => { + if (fieldName.includes(value)) { + data.push({ fieldName }); + } + return data; + }, []), + ); + }, + }, + }} + size="small" + options={false} + tableAlertRender={false} + scroll={{ y: 500 }} + rowSelection={rowSelection} + /> + } + // tooltip="度量表达式由上面选择的度量组成,如选择了度量A和B,则可将表达式写成A+B" + > +
+

+ 由于字段上是不带聚合函数的,因此通过字段x和y创建指标时,表达式需要写 + + 聚合函数 + + 如: sum(x) + sum(y) +

+ { + const expr = sql; + setExprString(expr); + onSqlChange?.(expr); + }} + height={'150px'} + /> +
+
+
+ + ); +}; + +export default MetricMeasuresFormTable; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricInfoCreateForm.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricInfoCreateForm.tsx index 21c51cfeb..0a86f161d 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricInfoCreateForm.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricInfoCreateForm.tsx @@ -336,7 +336,9 @@ const MetricInfoCreateForm: React.FC = ({ } }; const queryMetricsToCreateNewMetric = async () => { - const { code, data } = await getMetricsToCreateNewMetric({ modelId }); + const { code, data } = await getMetricsToCreateNewMetric({ + modelId: modelId || metricItem?.modelId, + }); if (code === 200) { setCreateNewMetricList(data); } else { @@ -737,7 +739,7 @@ const MetricInfoCreateForm: React.FC = ({ type="primary" key="console" onClick={() => { - history.replace(`/model/${domainId}/${modelId}/dataSource`); + history.replace(`/model/${domainId}/${modelId || metricItem?.modelId}/dataSource`); onCancel?.(); }} > diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricMetricFormTable.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricMetricFormTable.tsx new file mode 100644 index 000000000..59a26f87d --- /dev/null +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricMetricFormTable.tsx @@ -0,0 +1,153 @@ +import React, { useState, useRef, useEffect } from 'react'; +import { Tag, Space } from 'antd'; +import ProTable from '@ant-design/pro-table'; +import ProCard from '@ant-design/pro-card'; +import SqlEditor from '@/components/SqlEditor'; +import FormLabelRequire from './FormLabelRequire'; +import styles from './style.less'; +import { ISemantic } from '../data'; + +type Props = { + typeParams: ISemantic.IMetricTypeParams; + metricList: ISemantic.IMetricItem[]; + // selectedMeasuresList: any; + onFieldChange: (metrics: ISemantic.IMetricTypeParamsItem[]) => void; + onSqlChange: (sql: string) => void; +}; + +const MetricMetricFormTable: React.FC = ({ + typeParams, + // selectedMeasuresList = [], + metricList, + onFieldChange, + onSqlChange, +}) => { + const actionRef = useRef(); + + const [tableData, setTableData] = useState([]); + + useEffect(() => { + if (!Array.isArray(metricList)) { + setTableData([]); + return; + } + setTableData(metricList); + }, [metricList]); + + const [defineTypeParams, setDefineTypeParams] = useState( + typeParams || { + expr: '', + metrics: [], + }, + ); + + useEffect(() => { + setDefineTypeParams({ ...typeParams }); + }, [typeParams]); + + const [exprString, setExprString] = useState(typeParams?.expr || ''); + + // const [selectMeasuresList, setSelectMeasuresList] = useState([]); + + const [selectedMeasuresKeys, setSelectedMeasuresKeys] = useState(() => { + // return []; + return defineTypeParams.metrics.map((item: any) => { + return item.bizName; + }); + }); + + const columns = [ + { + dataIndex: 'name', + title: '指标名称', + }, + { + dataIndex: 'bizName', + title: '英文名称', + }, + ]; + + const rowSelection = { + selectedRowKeys: selectedMeasuresKeys, + onChange: (_selectedRowKeys: any[]) => { + setSelectedMeasuresKeys([..._selectedRowKeys]); + onFieldChange( + metricList.reduce( + (metrics: ISemantic.IMetricTypeParamsItem[], item: ISemantic.IMetricItem) => { + if (_selectedRowKeys.includes(item.bizName)) { + metrics.push({ + bizName: item.bizName, + id: item.id, + }); + } + return metrics; + }, + [], + ), + ); + }, + }; + + return ( + <> + + } + rowKey="bizName" + columns={columns} + dataSource={tableData} + pagination={false} + search={false} + toolbar={{ + search: { + placeholder: '请输入指标名称', + onSearch: (value: string) => { + setTableData( + metricList.reduce( + (data: ISemantic.IMetricItem[], item: ISemantic.IMetricItem) => { + if (item.name.includes(value)) { + data.push(item); + } + return data; + }, + [], + ), + ); + }, + }, + }} + size="small" + options={false} + tableAlertRender={false} + scroll={{ y: 500 }} + rowSelection={rowSelection} + /> + } tooltip=""> +

+ 已创建的指标已经过聚合,因此通过这些指标来创建新的指标无需指定 + + 聚合函数 + + ,如根据指标c和指标d来创建新的指标,因为指标本身带有聚合函数,因此表达式可以写成: + c+d-100 +

+ { + const expr = sql; + setExprString(expr); + onSqlChange?.(expr); + }} + height={'150px'} + /> +
+
+ + ); +}; + +export default MetricMetricFormTable; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricTableColumnRender.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricTableColumnRender.tsx new file mode 100644 index 000000000..651f7991d --- /dev/null +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricTableColumnRender.tsx @@ -0,0 +1,190 @@ +import { Space, Tag, Typography } from 'antd'; +import { StatusEnum } from '../enum'; +import { SENSITIVE_LEVEL_ENUM, SENSITIVE_LEVEL_COLOR } from '../constant'; +import { TagsOutlined, UserOutlined, FieldNumberOutlined, ReadOutlined } from '@ant-design/icons'; +import { history } from 'umi'; +import { ISemantic } from '../data'; +import { isString } from 'lodash'; +import { isArrayOfValues } from '@/utils/utils'; +import styles from './style.less'; +import MetricStar from '../Metric/components/MetricStar'; + +const { Text, Link } = Typography; + +export const ColumnsConfig = { + metricInfo: { + render: (_, record: ISemantic.IMetricItem) => { + const { name, alias, bizName, sensitiveLevel, createdBy, tags, id, isCollect } = record; + return ( + <> +
+ + + + { + history.push(`/metric/detail/${id}`); + }} + > + {name} + + + {SENSITIVE_LEVEL_ENUM[sensitiveLevel]} + + +
+
{bizName}
+ +
+ + {alias && ( + + +
别名:
+ + + {isString(alias) && + alias.split(',').map((aliasName: string) => { + return ( + + + {aliasName} + + + ); + })} + + +
+ )} + + {isArrayOfValues(tags) && ( + + +
标签:
+ + + {tags.map((tag: string) => { + return ( + + + {tag} + + + ); + })} + + +
+ )} + + + + : + {id} + + + + : + {createdBy} + + +
+
+ + ); + }, + }, + state: { + render: (status) => { + let tagProps = { + color: 'default', + label: '未知', + }; + switch (status) { + case StatusEnum.ONLINE: + tagProps = { + color: 'success', + // color: '#87d068', + label: '已启用', + }; + break; + case StatusEnum.OFFLINE: + tagProps = { + color: 'warning', + label: '未启用', + }; + break; + case StatusEnum.INITIALIZED: + tagProps = { + color: 'processing', + label: '初始化', + }; + break; + case StatusEnum.DELETED: + tagProps = { + color: 'default', + label: '已删除', + }; + break; + default: + break; + } + return ( + + {tagProps.label} + + ); + }, + }, +}; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Permission/PermissionAdminForm.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Permission/PermissionAdminForm.tsx index 588f6a63a..3fc2e36ba 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Permission/PermissionAdminForm.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Permission/PermissionAdminForm.tsx @@ -102,16 +102,16 @@ const PermissionAdminForm: React.FC = ({ > - {APP_TARGET === 'inner' && ( - - - - )} + {/* {APP_TARGET === 'inner' && ( */} + + + + {/* )} */} = ({ {!isOpenState && ( <> - {APP_TARGET === 'inner' && ( - - - - )} + {/* {APP_TARGET === 'inner' && ( */} + + + + {/* )} */} diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Permission/PermissionCreateForm.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Permission/PermissionCreateForm.tsx index d1048513b..92ea8bdff 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Permission/PermissionCreateForm.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Permission/PermissionCreateForm.tsx @@ -51,16 +51,16 @@ const PermissionCreateForm: ForwardRefRenderFunction = ( - {APP_TARGET === 'inner' && ( - - - - )} + {/* {APP_TARGET === 'inner' && ( */} + + + + {/* )} */}