[improvement][semantic-fe] Fixing the synchronization issue with the question and answer settings information. (#508)

* [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.
This commit is contained in:
tristanliu
2023-12-14 16:37:19 +08:00
committed by GitHub
parent 3d30632b41
commit 3bf5b86535
7 changed files with 114 additions and 84 deletions

View File

@@ -126,6 +126,11 @@ export async function patchRoutes({ routes }) {
} }
} }
export function onRouteChange() {
const title = window.document.title.split('-SuperSonic')[0];
window.document.title = `${title}-SuperSonic`;
}
export const layout: RunTimeLayoutConfig = (params) => { export const layout: RunTimeLayoutConfig = (params) => {
const { initialState } = params as any; const { initialState } = params as any;
return { return {

View File

@@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { connect, Helmet } from 'umi'; import { connect } from 'umi';
import type { StateType } from '../model'; import type { StateType } from '../model';
import OverviewContainer from '../OverviewContainer'; import OverviewContainer from '../OverviewContainer';
import type { Dispatch } from 'umi'; import type { Dispatch } from 'umi';
@@ -11,7 +11,6 @@ type Props = {
const ChatSetting: React.FC<Props> = () => { const ChatSetting: React.FC<Props> = () => {
return ( return (
<> <>
<Helmet title={'语义模型-超音数'} />
<OverviewContainer mode={'chatSetting'} /> <OverviewContainer mode={'chatSetting'} />
</> </>
); );

View File

@@ -1,4 +1,4 @@
import React from 'react'; import React, { useRef } from 'react';
import { connect } from 'umi'; import { connect } from 'umi';
import type { StateType } from '../model'; import type { StateType } from '../model';
import ProCard from '@ant-design/pro-card'; import ProCard from '@ant-design/pro-card';
@@ -12,13 +12,27 @@ type Props = {
}; };
const ChatSettingSection: React.FC<Props> = () => { const ChatSettingSection: React.FC<Props> = () => {
const metricRef = useRef<any>();
const tagRef = useRef<any>();
return ( return (
<div style={{ width: 900, margin: '20px auto' }}> <div style={{ width: 900, margin: '20px auto' }}>
<ProCard bordered title="指标模式" style={{ marginBottom: 20 }}> <ProCard bordered title="指标模式" style={{ marginBottom: 20 }}>
<EntitySection chatConfigType={ChatConfigType.AGG} /> <EntitySection
ref={metricRef}
chatConfigType={ChatConfigType.AGG}
onConfigSave={() => {
tagRef.current.refreshConfigData();
}}
/>
</ProCard> </ProCard>
<ProCard bordered title="标签模式" style={{ marginBottom: 20 }}> <ProCard bordered title="标签模式" style={{ marginBottom: 20 }}>
<EntitySection chatConfigType={ChatConfigType.DETAIL} /> <EntitySection
ref={tagRef}
chatConfigType={ChatConfigType.DETAIL}
onConfigSave={() => {
metricRef.current.refreshConfigData();
}}
/>
</ProCard> </ProCard>
</div> </div>
); );

View File

@@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { connect, Helmet } from 'umi'; import { connect } from 'umi';
import type { StateType } from './model'; import type { StateType } from './model';
import OverviewContainer from './OverviewContainer'; import OverviewContainer from './OverviewContainer';
import type { Dispatch } from 'umi'; import type { Dispatch } from 'umi';
@@ -11,7 +11,6 @@ type Props = {
const DomainManager: React.FC<Props> = () => { const DomainManager: React.FC<Props> = () => {
return ( return (
<> <>
<Helmet title={'语义模型-超音数'} />
<OverviewContainer mode={'domain'} /> <OverviewContainer mode={'domain'} />
</> </>
); );

View File

@@ -1,6 +1,6 @@
import { Popover, message, Space } from 'antd'; import { Popover, message, Space } from 'antd';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { connect, Helmet, history, useParams } from 'umi'; import { connect, history, useParams } from 'umi';
import DomainListTree from './components/DomainList'; import DomainListTree from './components/DomainList';
import styles from './components/style.less'; import styles from './components/style.less';
@@ -199,7 +199,6 @@ const OverviewContainer: React.FC<Props> = ({ mode, domainManger, dispatch }) =>
return ( return (
<div className={styles.projectBody}> <div className={styles.projectBody}>
<Helmet title={'语义模型-超音数'} />
<div className={styles.projectManger}> <div className={styles.projectManger}>
<div className={`${styles.sider} ${!collapsedState ? styles.siderCollapsed : ''}`}> <div className={`${styles.sider} ${!collapsedState ? styles.siderCollapsed : ''}`}>
<div className={styles.treeContainer}> <div className={styles.treeContainer}>

View File

@@ -27,6 +27,12 @@ type Props = {
const FormItem = Form.Item; const FormItem = Form.Item;
const Option = Select.Option; const Option = Select.Option;
const formDefaultValue = {
unit: 7,
period: 'DAY',
timeMode: 'LAST',
};
const DefaultSettingForm: ForwardRefRenderFunction<any, Props> = ( const DefaultSettingForm: ForwardRefRenderFunction<any, Props> = (
{ metricList, dimensionList, entityData, chatConfigKey, chatConfigType, onSubmit }, { metricList, dimensionList, entityData, chatConfigKey, chatConfigType, onSubmit },
ref, ref,
@@ -44,11 +50,12 @@ const DefaultSettingForm: ForwardRefRenderFunction<any, Props> = (
useEffect(() => { useEffect(() => {
form.resetFields(); form.resetFields();
if (!entityData?.chatDefaultConfig) { if (!(entityData?.id && entityData?.chatDefaultConfig)) {
return; return;
} }
const { chatDefaultConfig, id } = formatEntityData; const { chatDefaultConfig, id } = formatEntityData;
form.setFieldsValue({ form.setFieldsValue({
...formDefaultValue,
...chatDefaultConfig, ...chatDefaultConfig,
id, id,
}); });
@@ -152,11 +159,7 @@ const DefaultSettingForm: ForwardRefRenderFunction<any, Props> = (
form={form} form={form}
layout="vertical" layout="vertical"
className={styles.form} className={styles.form}
initialValues={{ initialValues={formDefaultValue}
unit: 7,
period: 'DAY',
timeMode: 'LAST',
}}
> >
<FormItem hidden={true} name="id" label="ID"> <FormItem hidden={true} name="id" label="ID">
<Input placeholder="id" /> <Input placeholder="id" />

View File

@@ -1,5 +1,6 @@
import { message, Space } from 'antd'; import { message, Space } from 'antd';
import React, { useState, useEffect } from 'react'; import { useEffect, useState, forwardRef, useImperativeHandle, Ref } from 'react';
import type { ForwardRefRenderFunction } from 'react';
import type { Dispatch } from 'umi'; import type { Dispatch } from 'umi';
import { connect } from 'umi'; import { connect } from 'umi';
import type { StateType } from '../../model'; import type { StateType } from '../../model';
@@ -12,82 +13,92 @@ import { ChatConfigType } from '../../enum';
type Props = { type Props = {
chatConfigType: ChatConfigType.DETAIL | ChatConfigType.AGG; chatConfigType: ChatConfigType.DETAIL | ChatConfigType.AGG;
onConfigSave?: () => void;
dispatch: Dispatch; dispatch: Dispatch;
domainManger: StateType; domainManger: StateType;
}; };
const EntitySection: React.FC<Props> = ({ const EntitySection: React.FC<Props> = forwardRef(
domainManger, ({ domainManger, chatConfigType = ChatConfigType.DETAIL, onConfigSave }, ref: Ref<any>) => {
chatConfigType = ChatConfigType.DETAIL, const { selectDomainId, selectModelId: modelId, dimensionList, metricList } = domainManger;
}) => {
const { selectDomainId, selectModelId: modelId, dimensionList, metricList } = domainManger;
const [entityData, setEntityData] = useState<IChatConfig.IChatRichConfig>(); const [entityData, setEntityData] = useState<IChatConfig.IChatRichConfig>();
const queryThemeListData: any = async () => { useImperativeHandle(ref, () => ({
const { code, data } = await getDomainExtendDetailConfig({ refreshConfigData: queryThemeListData,
modelId, }));
});
if (code === 200) { const queryThemeListData: any = async () => {
const { chatAggRichConfig, chatDetailRichConfig, id, domainId, modelId } = data; const { code, data } = await getDomainExtendDetailConfig({
if (chatConfigType === ChatConfigType.DETAIL) { modelId,
setEntityData({ ...chatDetailRichConfig, id, domainId, modelId }); });
if (code === 200) {
const { chatAggRichConfig, chatDetailRichConfig, id, domainId, modelId } = data;
if (chatConfigType === ChatConfigType.DETAIL) {
setEntityData({ ...chatDetailRichConfig, id, domainId, modelId });
}
if (chatConfigType === ChatConfigType.AGG) {
setEntityData({ ...chatAggRichConfig, id, domainId, modelId });
}
return;
} }
if (chatConfigType === ChatConfigType.AGG) {
setEntityData({ ...chatAggRichConfig, id, domainId, modelId }); message.error('获取问答设置信息失败');
};
const initPage = async () => {
queryThemeListData();
};
useEffect(() => {
if (!modelId) {
return;
} }
return; initPage();
} }, [modelId]);
message.error('获取问答设置信息失败'); return (
}; <div style={{ width: 800, margin: '0 auto' }}>
<Space direction="vertical" style={{ width: '100%' }} size={20}>
const initPage = async () => { <ProCard bordered title="默认设置">
queryThemeListData(); <DefaultSettingForm
}; domainId={Number(selectDomainId)}
entityData={entityData || {}}
useEffect(() => { chatConfigType={chatConfigType}
if (!modelId) { chatConfigKey={
return; chatConfigType === ChatConfigType.DETAIL ? 'chatDetailConfig' : 'chatAggConfig'
}
initPage();
}, [modelId]);
return (
<div style={{ width: 800, margin: '0 auto' }}>
<Space direction="vertical" style={{ width: '100%' }} size={20}>
<ProCard bordered title="默认设置">
<DefaultSettingForm
domainId={Number(selectDomainId)}
entityData={entityData || {}}
chatConfigType={chatConfigType}
chatConfigKey={
chatConfigType === ChatConfigType.DETAIL ? 'chatDetailConfig' : 'chatAggConfig'
}
dimensionList={dimensionList.filter((item) => {
const blackDimensionList = entityData?.visibility?.blackDimIdList;
if (Array.isArray(blackDimensionList)) {
return !blackDimensionList.includes(item.id);
} }
return false; dimensionList={dimensionList.filter((item) => {
})} const blackDimensionList = entityData?.visibility?.blackDimIdList;
metricList={metricList.filter((item) => { if (Array.isArray(blackDimensionList)) {
const blackMetricIdList = entityData?.visibility?.blackMetricIdList; return !blackDimensionList.includes(item.id);
if (Array.isArray(blackMetricIdList)) { }
return !blackMetricIdList.includes(item.id); return false;
} })}
return false; metricList={metricList.filter((item) => {
})} const blackMetricIdList = entityData?.visibility?.blackMetricIdList;
onSubmit={() => { if (Array.isArray(blackMetricIdList)) {
queryThemeListData(); return !blackMetricIdList.includes(item.id);
}} }
/> return false;
</ProCard> })}
</Space> onSubmit={() => {
</div> queryThemeListData();
); onConfigSave?.();
}; }}
export default connect(({ domainManger }: { domainManger: StateType }) => ({ />
domainManger, </ProCard>
}))(EntitySection); </Space>
</div>
);
},
);
export default connect(
({ domainManger }: { domainManger: StateType }) => ({
domainManger,
}),
() => {},
null,
{ forwardRef: true },
)(EntitySection);