[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) => {
const { initialState } = params as any;
return {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,6 @@
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 { connect } from 'umi';
import type { StateType } from '../../model';
@@ -12,82 +13,92 @@ import { ChatConfigType } from '../../enum';
type Props = {
chatConfigType: ChatConfigType.DETAIL | ChatConfigType.AGG;
onConfigSave?: () => void;
dispatch: Dispatch;
domainManger: StateType;
};
const EntitySection: React.FC<Props> = ({
domainManger,
chatConfigType = ChatConfigType.DETAIL,
}) => {
const { selectDomainId, selectModelId: modelId, dimensionList, metricList } = domainManger;
const EntitySection: React.FC<Props> = forwardRef(
({ domainManger, chatConfigType = ChatConfigType.DETAIL, onConfigSave }, ref: Ref<any>) => {
const { selectDomainId, selectModelId: modelId, dimensionList, metricList } = domainManger;
const [entityData, setEntityData] = useState<IChatConfig.IChatRichConfig>();
const [entityData, setEntityData] = useState<IChatConfig.IChatRichConfig>();
const queryThemeListData: any = async () => {
const { code, data } = await getDomainExtendDetailConfig({
modelId,
});
useImperativeHandle(ref, () => ({
refreshConfigData: queryThemeListData,
}));
if (code === 200) {
const { chatAggRichConfig, chatDetailRichConfig, id, domainId, modelId } = data;
if (chatConfigType === ChatConfigType.DETAIL) {
setEntityData({ ...chatDetailRichConfig, id, domainId, modelId });
const queryThemeListData: any = async () => {
const { code, data } = await getDomainExtendDetailConfig({
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('获取问答设置信息失败');
};
const initPage = async () => {
queryThemeListData();
};
useEffect(() => {
if (!modelId) {
return;
}
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 (
<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'
}
return false;
})}
metricList={metricList.filter((item) => {
const blackMetricIdList = entityData?.visibility?.blackMetricIdList;
if (Array.isArray(blackMetricIdList)) {
return !blackMetricIdList.includes(item.id);
}
return false;
})}
onSubmit={() => {
queryThemeListData();
}}
/>
</ProCard>
</Space>
</div>
);
};
export default connect(({ domainManger }: { domainManger: StateType }) => ({
domainManger,
}))(EntitySection);
dimensionList={dimensionList.filter((item) => {
const blackDimensionList = entityData?.visibility?.blackDimIdList;
if (Array.isArray(blackDimensionList)) {
return !blackDimensionList.includes(item.id);
}
return false;
})}
metricList={metricList.filter((item) => {
const blackMetricIdList = entityData?.visibility?.blackMetricIdList;
if (Array.isArray(blackMetricIdList)) {
return !blackMetricIdList.includes(item.id);
}
return false;
})}
onSubmit={() => {
queryThemeListData();
onConfigSave?.();
}}
/>
</ProCard>
</Space>
</div>
);
},
);
export default connect(
({ domainManger }: { domainManger: StateType }) => ({
domainManger,
}),
() => {},
null,
{ forwardRef: true },
)(EntitySection);