mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-14 13:47:09 +00:00
[improvement][headless-fe] Term management interface transformation & Unified model management and canvas functionality entry (#1009)
* [improvement][semantic-fe] Add model alias setting & Add view permission restrictions to the model permission management tab. [improvement][semantic-fe] Add permission control to the action buttons for the main domain; apply high sensitivity filtering to the authorization of metrics/dimensions. [improvement][semantic-fe] Optimize the editing mode in the dimension/metric/datasource components to use the modelId stored in the database for data, instead of relying on the data from the state manager. * [improvement][semantic-fe] Add time granularity setting in the data source configuration. * [improvement][semantic-fe] Dictionary import for dimension values supported in Q&A visibility * [improvement][semantic-fe] Modification of data source creation prompt wording" * [improvement][semantic-fe] metric market experience optimization * [improvement][semantic-fe] enhance the analysis of metric trends * [improvement][semantic-fe] optimize the presentation of metric trend permissions * [improvement][semantic-fe] add metric trend download functionality * [improvement][semantic-fe] fix the dimension initialization issue in metric correlation * [improvement][semantic-fe] Fix the issue of database changes not taking effect when creating based on an SQL data source. * [improvement][semantic-fe] Optimizing pagination logic and some CSS styles * [improvement][semantic-fe] Fixing the API for the indicator list by changing "current" to "pageNum" * [improvement][semantic-fe] Fixing the default value setting for the indicator list * [improvement][semantic-fe] Adding batch operations for indicators/dimensions/models * [improvement][semantic-fe] Replacing the single status update API for indicators/dimensions with a batch update API * [improvement][semantic-fe] Redesigning the indicator homepage to incorporate trend charts and table functionality for indicators * [improvement][semantic-fe] Optimizing the logic for setting dimension values and editing data sources, and adding system settings functionality * [improvement][semantic-fe] Upgrading antd version to 5.x, extracting the batch operation button component, optimizing the interaction for system settings, and expanding the configuration generation types for list-to-select component. * [improvement][semantic-fe] Adding the ability to filter dimensions based on whether they are tags or not. * [improvement][semantic-fe] Adding the ability to edit relationships between models in the canvas. * [improvement][semantic-fe] Updating the datePicker component to use dayjs instead. * [improvement][semantic-fe] Fixing the issue with passing the model ID for dimensions in the indicator market. * [improvement][semantic-fe] Fixing the abnormal state of the popup when creating a model. * [improvement][semantic-fe] Adding permission logic for bulk operations in the indicator market. * [improvement][semantic-fe] Adding the ability to download and transpose data. * [improvement][semantic-fe] Fixing the initialization issue with the date selection component in the indicator details page when switching time granularity. * [improvement][semantic-fe] Fixing the logic error in the dimension value setting. * [improvement][semantic-fe] Fixing the synchronization issue with the question and answer settings information. * [improvement][semantic-fe] Optimizing the canvas functionality for better performance and user experience. * [improvement][semantic-fe] Optimizing the update process for drawing model relationship edges in the canvas. * [improvement][semantic-fe] Changing the line type for canvas connections. * [improvement][semantic-fe] Replacing the initialization variable from "semantic" to "headless". * [improvement][semantic-fe] Fixing the missing migration issue for default drill-down dimension configuration in model editing. Additionally, optimizing the data retrieval method for initializing fields in the model. * [improvement][semantic-fe] Updating the logic for the fieldName. * [improvement][semantic-fe] Adjusting the position of the metrics tab. * [improvement][semantic-fe] Changing the 字段名称 to 英文名称. * [improvement][semantic-fe] Fix metric measurement deletion. * [improvement][semantic-fe] UI optimization for metric details page. * [improvement][semantic-fe] UI optimization for metric details page. * [improvement][semantic-fe] UI adjustment for metric details page. * [improvement][semantic-fe] The granularity field in the time type of model editing now supports setting it as empty. * [improvement][semantic-fe] Added field type and metric type to the metric creation options. * [improvement][semantic-fe] The organization structure selection feature has been added to the permission management. * [improvement][semantic-fe] Improved user experience for the metric list. * [improvement][semantic-fe] fix update the metric list. * [improvement][headless-fe] Added view management functionality. * [improvement][headless-fe] The view management functionality has been added. This feature allows users to create, edit, and manage different views within the system. * [improvement][headless-fe] Added model editing side effect detection. * [improvement][headless-fe] Fixed the logic error in view editing. * [improvement][headless-fe] Fixed the issue with initializing dimension associations in metric settings. * [improvement][headless-fe] Added the ability to hide the Q&A settings entry point. * [improvement][headless-fe] Fixed the issue with selecting search results in metric field creation. * [improvement][headless-fe] Added search functionality to the field list in model editing. * [improvement][headless-fe] fix the field list in model editing * [improvement][headless-fe] Restructured the data for the dimension value settings interface. * [improvement][headless-fe] Added dynamic variable functionality to model creation based on SQL scripts. * [improvement][headless-fe] Added support for passing dynamic variables as parameters in the executeSql function. * [improvement][headless-fe] Resolved the issue where users were unable to select all options for dimensions, metrics, and fields in the metric generation process. * [improvement][headless-fe] Replaced the term "view" with "dataset" * [improvement][headless-fe] Added the ability to export metrics and dimensions to a specific target. * [improvement][headless-fe] Enhanced dataset creation to support the tag mode. * [improvement][headless-fe] Added tag value setting. * [improvement][headless-fe] Optimized the tag setting system. * [improvement][headless-fe] Optimized the tag setting system. * [improvement][headless-fe] Updated the data initialization for model editing to use API requests instead. * [improvement][headless-fe] Added search functionality to model management. * [improvement][headless-fe] Removed field null validation during model editing. * [improvement][headless-fe] Updated the batch operation button component. * [improvement][headless-fe] Optimized the logic for initializing indicators in dimension value settings. * [improvement][headless-fe] Adjusted the length of the input field for model editing names. * [improvement][headless-fe] Lock the version of the @ant-design/pro-table component and replace it with @ant-design/pro-components. * [improvement][headless-fe] Optimized the style of the metrics market and tags market. * [improvement][headless-fe] The quick creation of model fields now defaults to using the "comment" field for filling. * [improvement][headless-fe] The quick creation of model fields now defaults to using the "comment" field for filling * [improvement][headless-fe] The quick creation of model fields now defaults to using the "comment" field for filling. * [improvement][headless-fe] Fixed the issue where the conditions for metric measurement creation were not being saved correctly. * [improvement][headless-fe] Default value setting for hiding dimensions. * [improvement][headless-fe] Updated the file imports in the project. * [improvement][headless-fe] Adjusted the logic for displaying the tab in the theme domain. * [improvement][headless-fe] Added term management functionality. * [improvement][headless-fe] When creating a model, the current metric operator now allows for clearance. * [improvement][headless-fe] Term management interface transformation
This commit is contained in:
@@ -67,7 +67,13 @@ const MetricAddClass: React.FC<Props> = ({ ids = [], createModalVisible, onCance
|
|||||||
>
|
>
|
||||||
删 除
|
删 除
|
||||||
</Button>
|
</Button>
|
||||||
<Button type="primary" loading={saveLoading} onClick={handleSubmit}>
|
<Button
|
||||||
|
type="primary"
|
||||||
|
loading={saveLoading}
|
||||||
|
onClick={() => {
|
||||||
|
handleSubmit();
|
||||||
|
}}
|
||||||
|
>
|
||||||
添 加
|
添 加
|
||||||
</Button>
|
</Button>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -64,6 +64,12 @@ const MetricBasicInformation: React.FC<Props> = ({ metircData }) => {
|
|||||||
dataIndex: 'agg',
|
dataIndex: 'agg',
|
||||||
title: '聚合函数',
|
title: '聚合函数',
|
||||||
width: 80,
|
width: 80,
|
||||||
|
render: (_: string) => {
|
||||||
|
if (!_) {
|
||||||
|
return '--';
|
||||||
|
}
|
||||||
|
return _;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -189,9 +189,9 @@ const TrendChart: React.FC<Props> = ({
|
|||||||
(item: any) =>
|
(item: any) =>
|
||||||
`<div style="margin-top: 3px;">${
|
`<div style="margin-top: 3px;">${
|
||||||
item.marker
|
item.marker
|
||||||
} <span style="display: inline-block; width: 70px; margin-right: 5px;">${
|
} <span style="display: inline-block; width: 100px; margin-right: 5px;">${
|
||||||
item.seriesName
|
item.seriesName
|
||||||
}</span><span style="display: inline-block; width: 90px; text-align: right; font-weight: 500;">${
|
}</span><span style="display: inline-block; width: 120px; text-align: right; font-weight: 500;">${
|
||||||
item.value === ''
|
item.value === ''
|
||||||
? '-'
|
? '-'
|
||||||
: isPer
|
: isPer
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import { ColumnConfig } from '../data';
|
|||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import { ISemantic } from '../../data';
|
import { ISemantic } from '../../data';
|
||||||
import { DateFieldMap } from '@/pages/SemanticModel/constant';
|
import { DateFieldMap } from '@/pages/SemanticModel/constant';
|
||||||
import { ProCard } from '@ant-design/pro-components';
|
import { ProCard } from '@ant-design/pro-components';
|
||||||
|
|
||||||
import styles from '../style.less';
|
import styles from '../style.less';
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ const MetricTrendSection: React.FC<Props> = ({
|
|||||||
setMetricTrendLoading(false);
|
setMetricTrendLoading(false);
|
||||||
if (code === 200) {
|
if (code === 200) {
|
||||||
const { resultList, columns, queryAuthorization } = data;
|
const { resultList, columns, queryAuthorization } = data;
|
||||||
setMetricTrendData(resultList);
|
|
||||||
setTableColumnConfig(columns);
|
setTableColumnConfig(columns);
|
||||||
const message = queryAuthorization?.message;
|
const message = queryAuthorization?.message;
|
||||||
if (message) {
|
if (message) {
|
||||||
@@ -112,6 +112,22 @@ const MetricTrendSection: React.FC<Props> = ({
|
|||||||
if (targetConfig) {
|
if (targetConfig) {
|
||||||
setMetricColumnConfig(targetConfig);
|
setMetricColumnConfig(targetConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const dateConfig = columns.find((item: ISemantic.IMetricTrendColumn) => {
|
||||||
|
return item.type === 'DATE';
|
||||||
|
});
|
||||||
|
|
||||||
|
if (dateConfig) {
|
||||||
|
const sortDateField = dateConfig.nameEn;
|
||||||
|
setMetricTrendData(
|
||||||
|
[...resultList].sort((a, b) => {
|
||||||
|
return a[sortDateField].localeCompare(b[sortDateField]);
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
setMetricTrendData(resultList);
|
||||||
|
}
|
||||||
|
|
||||||
setDownloadBtnDisabledState(false);
|
setDownloadBtnDisabledState(false);
|
||||||
if (dimensionGroup[dimensionGroup.length - 1]) {
|
if (dimensionGroup[dimensionGroup.length - 1]) {
|
||||||
setGroupByDimensionFieldName(dimensionGroup[dimensionGroup.length - 1]);
|
setGroupByDimensionFieldName(dimensionGroup[dimensionGroup.length - 1]);
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ const DatabaseSettingModal: React.FC<CreateFormProps> = ({
|
|||||||
<DatabaseCreateForm
|
<DatabaseCreateForm
|
||||||
hideSubmitBtn={true}
|
hideSubmitBtn={true}
|
||||||
ref={createFormRef}
|
ref={createFormRef}
|
||||||
// dataBaseConfig={databaseItem}
|
|
||||||
databaseId={databaseItem?.id}
|
databaseId={databaseItem?.id}
|
||||||
onSubmit={() => {
|
onSubmit={() => {
|
||||||
onSubmit?.();
|
onSubmit?.();
|
||||||
|
|||||||
@@ -4,17 +4,16 @@ import styles from './style.less';
|
|||||||
import { useMounted } from '@/hooks/useMounted';
|
import { useMounted } from '@/hooks/useMounted';
|
||||||
import { message } from 'antd';
|
import { message } from 'antd';
|
||||||
import { formLayout } from '@/components/FormHelper/utils';
|
import { formLayout } from '@/components/FormHelper/utils';
|
||||||
import { EnumTransModelType } from '@/enum';
|
|
||||||
|
|
||||||
const FormItem = Form.Item;
|
const FormItem = Form.Item;
|
||||||
|
|
||||||
export type ProjectInfoFormProps = {
|
export type Props = {
|
||||||
basicInfo: any;
|
basicInfo: any;
|
||||||
onCancel: () => void;
|
onCancel: () => void;
|
||||||
onSubmit: (values: any) => Promise<any>;
|
onSubmit: (values: any) => Promise<any>;
|
||||||
};
|
};
|
||||||
|
|
||||||
const ProjectInfoForm: React.FC<ProjectInfoFormProps> = (props) => {
|
const DomaintInfoForm: React.FC<Props> = (props) => {
|
||||||
const { basicInfo, onSubmit: handleUpdate, onCancel } = props;
|
const { basicInfo, onSubmit: handleUpdate, onCancel } = props;
|
||||||
const { type, modelType } = basicInfo;
|
const { type, modelType } = basicInfo;
|
||||||
|
|
||||||
@@ -48,23 +47,13 @@ const ProjectInfoForm: React.FC<ProjectInfoFormProps> = (props) => {
|
|||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
const titleRender = () => {
|
const infoName = type === 'top' ? '主题域' : '模型集';
|
||||||
let str = EnumTransModelType[modelType];
|
|
||||||
if (type === 'top') {
|
|
||||||
str += '顶级';
|
|
||||||
} else if (modelType === 'add') {
|
|
||||||
str += '子';
|
|
||||||
}
|
|
||||||
str += '主题域';
|
|
||||||
return str;
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Modal
|
<Modal
|
||||||
width={640}
|
width={640}
|
||||||
styles={{ padding: '32px 40px 48px' }}
|
|
||||||
destroyOnClose
|
destroyOnClose
|
||||||
title={titleRender()}
|
title={`${modelType === 'add' ? '新增' : '编辑'}${infoName}`}
|
||||||
open={true}
|
open={true}
|
||||||
footer={footer}
|
footer={footer}
|
||||||
onCancel={onCancel}
|
onCancel={onCancel}
|
||||||
@@ -78,26 +67,26 @@ const ProjectInfoForm: React.FC<ProjectInfoFormProps> = (props) => {
|
|||||||
className={styles.form}
|
className={styles.form}
|
||||||
>
|
>
|
||||||
{type !== 'top' && modelType === 'add' && (
|
{type !== 'top' && modelType === 'add' && (
|
||||||
<FormItem name="parentName" label="父主题域名称">
|
<FormItem name="parentName" label="主题域名称">
|
||||||
<Input disabled placeholder="父主题域名称" />
|
<Input disabled placeholder="主题域名称" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
<FormItem
|
<FormItem
|
||||||
name="name"
|
name="name"
|
||||||
label="主题域名称"
|
label={`${infoName}名称`}
|
||||||
rules={[{ required: true, message: '请输入主题域名称!' }]}
|
rules={[{ required: true, message: `请输入${infoName}名称!` }]}
|
||||||
>
|
>
|
||||||
<Input placeholder="主题域名称不可重复" />
|
<Input placeholder="主题域名称不可重复" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
<FormItem
|
<FormItem
|
||||||
name="bizName"
|
name="bizName"
|
||||||
label="主题域英文名称"
|
label={`${infoName}英文名称`}
|
||||||
rules={[{ required: true, message: '请输入主题域英文名称!' }]}
|
rules={[{ required: true, message: `请输入${infoName}英文名称!` }]}
|
||||||
>
|
>
|
||||||
<Input placeholder="请输入主题域英文名称" />
|
<Input placeholder={`请输入${infoName}英文名称`} />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
<FormItem name="description" label="主题域描述" hidden={true}>
|
<FormItem name="description" label={`${infoName}描述`} hidden={true}>
|
||||||
<Input.TextArea placeholder="主题域描述" />
|
<Input.TextArea placeholder={`${infoName}描述`} />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
<FormItem name="isUnique" label="是否唯一" hidden={true}>
|
<FormItem name="isUnique" label="是否唯一" hidden={true}>
|
||||||
<Switch size="small" checked={true} />
|
<Switch size="small" checked={true} />
|
||||||
@@ -107,4 +96,4 @@ const ProjectInfoForm: React.FC<ProjectInfoFormProps> = (props) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ProjectInfoForm;
|
export default DomaintInfoForm;
|
||||||
@@ -8,7 +8,7 @@ import type { Dispatch } from 'umi';
|
|||||||
import type { StateType } from '../model';
|
import type { StateType } from '../model';
|
||||||
import { createDomain, updateDomain, deleteDomain } from '../service';
|
import { createDomain, updateDomain, deleteDomain } from '../service';
|
||||||
import { treeParentKeyLists } from '../utils';
|
import { treeParentKeyLists } from '../utils';
|
||||||
import ProjectInfoFormProps from './ProjectInfoForm';
|
import DomainInfoForm from './DomainInfoForm';
|
||||||
import { constructorClassTreeFromList, addPathInTreeData } from '../utils';
|
import { constructorClassTreeFromList, addPathInTreeData } from '../utils';
|
||||||
|
|
||||||
import styles from './style.less';
|
import styles from './style.less';
|
||||||
@@ -49,11 +49,10 @@ const DomainListTree: FC<DomainListProps> = ({
|
|||||||
onCreateDomainBtnClick,
|
onCreateDomainBtnClick,
|
||||||
onTreeSelected,
|
onTreeSelected,
|
||||||
onTreeDataUpdate,
|
onTreeDataUpdate,
|
||||||
dispatch,
|
|
||||||
}) => {
|
}) => {
|
||||||
const [projectTree, setProjectTree] = useState<DataNode[]>([]);
|
const [projectTree, setProjectTree] = useState<DataNode[]>([]);
|
||||||
const [projectInfoModalVisible, setProjectInfoModalVisible] = useState<boolean>(false);
|
const [projectInfoModalVisible, setProjectInfoModalVisible] = useState<boolean>(false);
|
||||||
const [projectInfoParams, setProjectInfoParams] = useState<any>({});
|
const [domainInfoParams, setDomainInfoParams] = useState<any>({});
|
||||||
const [filterValue, setFliterValue] = useState<string>('');
|
const [filterValue, setFliterValue] = useState<string>('');
|
||||||
const [expandedKeys, setExpandedKeys] = useState<string[]>([]);
|
const [expandedKeys, setExpandedKeys] = useState<string[]>([]);
|
||||||
const [classList, setClassList] = useState<ISemantic.IDomainItem[]>([]);
|
const [classList, setClassList] = useState<ISemantic.IDomainItem[]>([]);
|
||||||
@@ -91,9 +90,26 @@ const DomainListTree: FC<DomainListProps> = ({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const projectSubmit = async (values: any) => {
|
const createDefaultModelSet = async (domainId: number) => {
|
||||||
|
const { code, msg } = await createDomain({
|
||||||
|
modelType: 'add',
|
||||||
|
type: 'normal',
|
||||||
|
parentId: domainId,
|
||||||
|
name: '默认模型集',
|
||||||
|
bizName: 'defaultModelSet',
|
||||||
|
isUnique: 1,
|
||||||
|
});
|
||||||
|
if (code !== 200) {
|
||||||
|
message.error(msg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const domainSubmit = async (values: any) => {
|
||||||
if (values.modelType === 'add') {
|
if (values.modelType === 'add') {
|
||||||
await createDomain(values);
|
const { code, data } = await createDomain(values);
|
||||||
|
if (code === 200 && values.type === 'top') {
|
||||||
|
await createDefaultModelSet(data.id);
|
||||||
|
}
|
||||||
} else if (values.modelType === 'edit') {
|
} else if (values.modelType === 'edit') {
|
||||||
await editProject(values);
|
await editProject(values);
|
||||||
}
|
}
|
||||||
@@ -101,11 +117,10 @@ const DomainListTree: FC<DomainListProps> = ({
|
|||||||
setProjectInfoModalVisible(false);
|
setProjectInfoModalVisible(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
// 删除项目
|
const confirmDelete = async (domainId: string) => {
|
||||||
const confirmDelete = async (projectId: string) => {
|
const res = await deleteDomain(domainId);
|
||||||
const res = await deleteDomain(projectId);
|
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
message.success('编辑项目成功');
|
message.success('删除成功');
|
||||||
setProjectInfoModalVisible(false);
|
setProjectInfoModalVisible(false);
|
||||||
onTreeDataUpdate?.();
|
onTreeDataUpdate?.();
|
||||||
} else {
|
} else {
|
||||||
@@ -131,7 +146,7 @@ const DomainListTree: FC<DomainListProps> = ({
|
|||||||
<PlusOutlined
|
<PlusOutlined
|
||||||
className={styles.icon}
|
className={styles.icon}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setProjectInfoParams({
|
setDomainInfoParams({
|
||||||
modelType: 'add',
|
modelType: 'add',
|
||||||
type: 'normal',
|
type: 'normal',
|
||||||
parentId: id,
|
parentId: id,
|
||||||
@@ -145,7 +160,7 @@ const DomainListTree: FC<DomainListProps> = ({
|
|||||||
<EditOutlined
|
<EditOutlined
|
||||||
className={styles.icon}
|
className={styles.icon}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setProjectInfoParams({
|
setDomainInfoParams({
|
||||||
modelType: 'edit',
|
modelType: 'edit',
|
||||||
type: 'normal',
|
type: 'normal',
|
||||||
...node,
|
...node,
|
||||||
@@ -190,13 +205,13 @@ const DomainListTree: FC<DomainListProps> = ({
|
|||||||
</Col>
|
</Col>
|
||||||
{createDomainBtnVisible && (
|
{createDomainBtnVisible && (
|
||||||
<Col flex="0 0 45px" style={{ display: 'flex', alignItems: 'center' }}>
|
<Col flex="0 0 45px" style={{ display: 'flex', alignItems: 'center' }}>
|
||||||
<Tooltip title="新增顶级域">
|
<Tooltip title="新增主题域">
|
||||||
<Button
|
<Button
|
||||||
type="primary"
|
type="primary"
|
||||||
icon={<PlusOutlined />}
|
icon={<PlusOutlined />}
|
||||||
size="small"
|
size="small"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setProjectInfoParams({ type: 'top', modelType: 'add' });
|
setDomainInfoParams({ type: 'top', modelType: 'add' });
|
||||||
setProjectInfoModalVisible(true);
|
setProjectInfoModalVisible(true);
|
||||||
onCreateDomainBtnClick?.();
|
onCreateDomainBtnClick?.();
|
||||||
}}
|
}}
|
||||||
@@ -218,9 +233,9 @@ const DomainListTree: FC<DomainListProps> = ({
|
|||||||
titleRender={titleRender}
|
titleRender={titleRender}
|
||||||
/>
|
/>
|
||||||
{projectInfoModalVisible && (
|
{projectInfoModalVisible && (
|
||||||
<ProjectInfoFormProps
|
<DomainInfoForm
|
||||||
basicInfo={projectInfoParams}
|
basicInfo={domainInfoParams}
|
||||||
onSubmit={projectSubmit}
|
onSubmit={domainSubmit}
|
||||||
onCancel={() => {
|
onCancel={() => {
|
||||||
setProjectInfoModalVisible(false);
|
setProjectInfoModalVisible(false);
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Tabs, Breadcrumb, Space } from 'antd';
|
import { Tabs, Breadcrumb, Space, Radio } from 'antd';
|
||||||
import React, { useRef, useEffect } from 'react';
|
import React, { useRef, useEffect, useState } from 'react';
|
||||||
import { connect, history } from 'umi';
|
import { connect, history } from 'umi';
|
||||||
|
|
||||||
import ClassDimensionTable from './ClassDimensionTable';
|
import ClassDimensionTable from './ClassDimensionTable';
|
||||||
@@ -55,6 +55,8 @@ const DomainManagerTab: React.FC<Props> = ({
|
|||||||
initState.current = false;
|
initState.current = false;
|
||||||
}, [selectModelId]);
|
}, [selectModelId]);
|
||||||
|
|
||||||
|
const [showModelType, setShowModelType] = useState<string>('list');
|
||||||
|
|
||||||
const domainListParentIdList: number[] = Array.isArray(domainList)
|
const domainListParentIdList: number[] = Array.isArray(domainList)
|
||||||
? Array.from(new Set(domainList.map((item) => item.parentId)))
|
? Array.from(new Set(domainList.map((item) => item.parentId)))
|
||||||
: [];
|
: [];
|
||||||
@@ -64,15 +66,21 @@ const DomainManagerTab: React.FC<Props> = ({
|
|||||||
label: '模型管理',
|
label: '模型管理',
|
||||||
key: 'overview',
|
key: 'overview',
|
||||||
hidden: domainData && domainListParentIdList.includes(domainData.id),
|
hidden: domainData && domainListParentIdList.includes(domainData.id),
|
||||||
children: (
|
children:
|
||||||
<OverView
|
showModelType === 'list' ? (
|
||||||
key={selectDomainId}
|
<OverView
|
||||||
modelList={modelList}
|
key={selectDomainId}
|
||||||
onModelChange={(model) => {
|
modelList={modelList}
|
||||||
handleModelChange(model);
|
onModelChange={(model) => {
|
||||||
}}
|
handleModelChange(model);
|
||||||
/>
|
}}
|
||||||
),
|
/>
|
||||||
|
) : (
|
||||||
|
<div style={{ width: '100%' }}>
|
||||||
|
<SemanticGraphCanvas />
|
||||||
|
{/* <HeadlessFlows /> */}
|
||||||
|
</div>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '数据集管理',
|
label: '数据集管理',
|
||||||
@@ -99,17 +107,17 @@ const DomainManagerTab: React.FC<Props> = ({
|
|||||||
hidden: !!domainData?.parentId,
|
hidden: !!domainData?.parentId,
|
||||||
children: <TermTable />,
|
children: <TermTable />,
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
label: '画布',
|
// label: '画布',
|
||||||
key: 'xflow',
|
// key: 'xflow',
|
||||||
hidden: domainData && domainListParentIdList.includes(domainData.id),
|
// hidden: domainData && domainListParentIdList.includes(domainData.id),
|
||||||
children: (
|
// children: (
|
||||||
<div style={{ width: '100%' }}>
|
// <div style={{ width: '100%' }}>
|
||||||
<SemanticGraphCanvas />
|
// <SemanticGraphCanvas />
|
||||||
{/* <HeadlessFlows /> */}
|
// {/* <HeadlessFlows /> */}
|
||||||
</div>
|
// </div>
|
||||||
),
|
// ),
|
||||||
},
|
// },
|
||||||
{
|
{
|
||||||
label: '权限管理',
|
label: '权限管理',
|
||||||
key: 'permissonSetting',
|
key: 'permissonSetting',
|
||||||
@@ -212,6 +220,24 @@ const DomainManagerTab: React.FC<Props> = ({
|
|||||||
className={styles.tab}
|
className={styles.tab}
|
||||||
items={!isModel ? tabItem : isModelItem}
|
items={!isModel ? tabItem : isModelItem}
|
||||||
activeKey={getActiveKey()}
|
activeKey={getActiveKey()}
|
||||||
|
tabBarExtraContent={{
|
||||||
|
right:
|
||||||
|
getActiveKey() === 'overview' ? (
|
||||||
|
<Radio.Group
|
||||||
|
defaultValue="list"
|
||||||
|
buttonStyle="solid"
|
||||||
|
size="small"
|
||||||
|
style={{ marginRight: 25 }}
|
||||||
|
onChange={(e) => {
|
||||||
|
const showType = e.target.value;
|
||||||
|
setShowModelType(showType);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Radio.Button value="list">列表</Radio.Button>
|
||||||
|
<Radio.Button value="canvas">画布</Radio.Button>
|
||||||
|
</Radio.Group>
|
||||||
|
) : undefined,
|
||||||
|
}}
|
||||||
destroyInactiveTabPane
|
destroyInactiveTabPane
|
||||||
size="large"
|
size="large"
|
||||||
onChange={(menuKey: string) => {
|
onChange={(menuKey: string) => {
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
import React, { useEffect, useRef } from 'react';
|
import React, { useEffect, useRef } from 'react';
|
||||||
import { Form, Button, Modal, Input, Select } from 'antd';
|
import { Form, Button, Modal, Input, Select } from 'antd';
|
||||||
|
|
||||||
import { formLayout } from '@/components/FormHelper/utils';
|
import { formLayout } from '@/components/FormHelper/utils';
|
||||||
import styles from '../style.less';
|
import styles from '../style.less';
|
||||||
|
|
||||||
import { ISemantic } from '../../data';
|
import { ISemantic } from '../../data';
|
||||||
|
|
||||||
export type CreateFormProps = {
|
export type CreateFormProps = {
|
||||||
@@ -62,11 +60,7 @@ const TermCreateForm: React.FC<CreateFormProps> = ({
|
|||||||
<FormItem name="name" label="名称" rules={[{ required: true, message: '请输入名称' }]}>
|
<FormItem name="name" label="名称" rules={[{ required: true, message: '请输入名称' }]}>
|
||||||
<Input placeholder="名称不可重复" />
|
<Input placeholder="名称不可重复" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
<FormItem
|
<FormItem name="alias" label={'近义词'}>
|
||||||
name="similarTerms"
|
|
||||||
label={'近义词'}
|
|
||||||
rules={[{ required: true, message: '请输入业务口径' }]}
|
|
||||||
>
|
|
||||||
<Select
|
<Select
|
||||||
mode="tags"
|
mode="tags"
|
||||||
placeholder="输入近义词后回车确认,多近义词输入、复制粘贴支持英文逗号自动分隔"
|
placeholder="输入近义词后回车确认,多近义词输入、复制粘贴支持英文逗号自动分隔"
|
||||||
@@ -74,7 +68,11 @@ const TermCreateForm: React.FC<CreateFormProps> = ({
|
|||||||
maxTagCount={9}
|
maxTagCount={9}
|
||||||
/>
|
/>
|
||||||
</FormItem>
|
</FormItem>
|
||||||
<FormItem name="description" label={'描述'}>
|
<FormItem
|
||||||
|
name="description"
|
||||||
|
label={'描述'}
|
||||||
|
rules={[{ required: true, message: '请输入描述' }]}
|
||||||
|
>
|
||||||
<TextArea placeholder="请输入描述" />
|
<TextArea placeholder="请输入描述" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { message, Button, Space, Popconfirm, Typography } from 'antd';
|
|||||||
import React, { useRef, useState, useEffect } from 'react';
|
import React, { useRef, useState, useEffect } from 'react';
|
||||||
import { connect } from 'umi';
|
import { connect } from 'umi';
|
||||||
import type { StateType } from '../../model';
|
import type { StateType } from '../../model';
|
||||||
import { getTermList, saveOrUpdate } from '../../service';
|
import { getTermList, saveOrUpdate, deleteTerm } from '../../service';
|
||||||
|
|
||||||
import styles from '../style.less';
|
import styles from '../style.less';
|
||||||
import { ISemantic } from '../../data';
|
import { ISemantic } from '../../data';
|
||||||
@@ -36,21 +36,21 @@ const TermTable: React.FC<Props> = ({ domainManger }) => {
|
|||||||
const { code, data, msg } = await getTermList(selectDomainId);
|
const { code, data, msg } = await getTermList(selectDomainId);
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
if (code === 200) {
|
if (code === 200) {
|
||||||
setTableData(data?.terms || []);
|
setTableData(data || []);
|
||||||
} else {
|
} else {
|
||||||
message.error(msg);
|
message.error(msg);
|
||||||
setTableData([]);
|
setTableData([]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const queryTermConfig = async (terms: ISemantic.ITermItem[]) => {
|
const queryTermConfig = async (terms: ISemantic.ITermItem) => {
|
||||||
const { code, msg } = await saveOrUpdate({
|
const { code, msg } = await saveOrUpdate({
|
||||||
domainId: selectDomainId,
|
domainId: selectDomainId,
|
||||||
terms,
|
...terms,
|
||||||
});
|
});
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
if (code === 200) {
|
if (code === 200) {
|
||||||
setTableData(terms);
|
queryTagList();
|
||||||
} else {
|
} else {
|
||||||
message.error(msg);
|
message.error(msg);
|
||||||
}
|
}
|
||||||
@@ -75,9 +75,13 @@ const TermTable: React.FC<Props> = ({ domainManger }) => {
|
|||||||
queryTermConfig(terms);
|
queryTermConfig(terms);
|
||||||
};
|
};
|
||||||
|
|
||||||
const deleteTermConfig = (termItem: ISemantic.ITermItem) => {
|
const deleteTermConfig = async (termItem: ISemantic.ITermItem) => {
|
||||||
const terms = tableData.filter((item) => item.name !== termItem.name);
|
const { code, msg } = await deleteTerm(termItem.id);
|
||||||
queryTermConfig(terms);
|
if (code === 200) {
|
||||||
|
queryTagList();
|
||||||
|
} else {
|
||||||
|
message.error(msg);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const columnsConfig = ColumnsConfig();
|
const columnsConfig = ColumnsConfig();
|
||||||
@@ -89,17 +93,14 @@ const TermTable: React.FC<Props> = ({ domainManger }) => {
|
|||||||
search: false,
|
search: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
dataIndex: 'similarTerms',
|
dataIndex: 'alias',
|
||||||
title: '近义词',
|
title: '近义词',
|
||||||
search: false,
|
search: false,
|
||||||
render: (_: string[]) => {
|
render: (_: string[]) => {
|
||||||
const similarTerms = Array.isArray(_) ? _.join(',') : '-';
|
const alias = Array.isArray(_) ? _.join(',') : '-';
|
||||||
return (
|
return (
|
||||||
<Paragraph
|
<Paragraph ellipsis={{ tooltip: alias, rows: 3 }} style={{ width: 350, marginBottom: 0 }}>
|
||||||
ellipsis={{ tooltip: similarTerms, rows: 3 }}
|
{alias}
|
||||||
style={{ width: 350, marginBottom: 0 }}
|
|
||||||
>
|
|
||||||
{similarTerms}
|
|
||||||
</Paragraph>
|
</Paragraph>
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@@ -182,7 +183,7 @@ const TermTable: React.FC<Props> = ({ domainManger }) => {
|
|||||||
createModalVisible={createModalVisible}
|
createModalVisible={createModalVisible}
|
||||||
termItem={termItem}
|
termItem={termItem}
|
||||||
onSubmit={(termData) => {
|
onSubmit={(termData) => {
|
||||||
saveTermConfig(termData);
|
queryTermConfig(termData);
|
||||||
setCreateModalVisible(false);
|
setCreateModalVisible(false);
|
||||||
}}
|
}}
|
||||||
onCancel={() => {
|
onCancel={() => {
|
||||||
|
|||||||
@@ -436,6 +436,7 @@ export declare namespace ISemantic {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface ITermItem {
|
interface ITermItem {
|
||||||
|
id: number;
|
||||||
name: string;
|
name: string;
|
||||||
description: string;
|
description: string;
|
||||||
similarTerms: string[];
|
similarTerms: string[];
|
||||||
|
|||||||
@@ -741,3 +741,9 @@ export function saveOrUpdate(data: any): Promise<any> {
|
|||||||
data: { ...data },
|
data: { ...data },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function deleteTerm(id: number): Promise<any> {
|
||||||
|
return request(`${process.env.API_BASE_URL}term/${id}`, {
|
||||||
|
method: 'DELETE',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user