mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-13 21:17:08 +00:00
[improvement][semantic-fe] Add model alias setting & Add view permission restrictions to the model permission management tab. (#63)
[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.
This commit is contained in:
@@ -34,17 +34,11 @@ const ROUTES = [
|
|||||||
component: './Agent',
|
component: './Agent',
|
||||||
envEnableList: [ENV_KEY.CHAT],
|
envEnableList: [ENV_KEY.CHAT],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/model',
|
path: '/model',
|
||||||
name: 'semanticModel',
|
name: 'semanticModel',
|
||||||
component: './SemanticModel/DomainManager',
|
|
||||||
envEnableList: [ENV_KEY.SEMANTIC],
|
envEnableList: [ENV_KEY.SEMANTIC],
|
||||||
routes: [
|
routes: [
|
||||||
{
|
|
||||||
path: '/model',
|
|
||||||
redirect: '/model/:domainId?/:modelId?/:menuKey?',
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
{
|
||||||
path: '/model/:domainId?/:modelId?/:menuKey?',
|
path: '/model/:domainId?/:modelId?/:menuKey?',
|
||||||
component: './SemanticModel/DomainManager',
|
component: './SemanticModel/DomainManager',
|
||||||
@@ -59,6 +53,7 @@ const ROUTES = [
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
path: '/database',
|
path: '/database',
|
||||||
name: 'database',
|
name: 'database',
|
||||||
@@ -66,7 +61,6 @@ const ROUTES = [
|
|||||||
component: './SemanticModel/components/Database/DatabaseTable',
|
component: './SemanticModel/components/Database/DatabaseTable',
|
||||||
envEnableList: [ENV_KEY.SEMANTIC],
|
envEnableList: [ENV_KEY.SEMANTIC],
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
path: '/metric',
|
path: '/metric',
|
||||||
name: 'metric',
|
name: 'metric',
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ const GlobalHeaderRight: React.FC = () => {
|
|||||||
const { navTheme, layout } = initialState.settings;
|
const { navTheme, layout } = initialState.settings;
|
||||||
let className = styles.right;
|
let className = styles.right;
|
||||||
|
|
||||||
if ((navTheme === 'dark' && layout === 'top') || layout === 'mix') {
|
if (layout === 'top' || layout === 'mix') {
|
||||||
className = cx(styles.right, styles.dark);
|
className = cx(styles.right, styles.dark);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,19 +4,21 @@ import DataSourceBasicForm from './DataSourceBasicForm';
|
|||||||
import FieldForm from './DataSourceFieldForm';
|
import FieldForm from './DataSourceFieldForm';
|
||||||
import { formLayout } from '@/components/FormHelper/utils';
|
import { formLayout } from '@/components/FormHelper/utils';
|
||||||
import { EnumDataSourceType } from '../constants';
|
import { EnumDataSourceType } from '../constants';
|
||||||
import type { DataInstanceItem } from '../data';
|
// import type { DataInstanceItem } from '../data';
|
||||||
import styles from '../style.less';
|
import styles from '../style.less';
|
||||||
import { createDatasource, updateDatasource, getColumns } from '../../service';
|
import { createDatasource, updateDatasource, getColumns } from '../../service';
|
||||||
import type { Dispatch } from 'umi';
|
import type { Dispatch } from 'umi';
|
||||||
import type { StateType } from '../../model';
|
import type { StateType } from '../../model';
|
||||||
import { connect } from 'umi';
|
import { connect } from 'umi';
|
||||||
|
import { IDataSource } from '../../data';
|
||||||
|
|
||||||
export type CreateFormProps = {
|
export type CreateFormProps = {
|
||||||
domainManger: StateType;
|
domainManger: StateType;
|
||||||
dispatch: Dispatch;
|
dispatch: Dispatch;
|
||||||
createModalVisible: boolean;
|
createModalVisible: boolean;
|
||||||
sql?: string;
|
sql?: string;
|
||||||
dataSourceItem: DataInstanceItem | any;
|
databaseItem?: any;
|
||||||
|
dataSourceItem: IDataSource.IDataSourceItem;
|
||||||
onCancel?: () => void;
|
onCancel?: () => void;
|
||||||
onSubmit?: (dataSourceInfo: any) => void;
|
onSubmit?: (dataSourceInfo: any) => void;
|
||||||
scriptColumns?: any[] | undefined;
|
scriptColumns?: any[] | undefined;
|
||||||
@@ -39,6 +41,7 @@ const DataSourceCreateForm: React.FC<CreateFormProps> = ({
|
|||||||
sql = '',
|
sql = '',
|
||||||
onSubmit,
|
onSubmit,
|
||||||
dataSourceItem,
|
dataSourceItem,
|
||||||
|
databaseItem,
|
||||||
basicInfoFormMode,
|
basicInfoFormMode,
|
||||||
}) => {
|
}) => {
|
||||||
const isEdit = !!dataSourceItem?.id;
|
const isEdit = !!dataSourceItem?.id;
|
||||||
@@ -160,10 +163,10 @@ const DataSourceCreateForm: React.FC<CreateFormProps> = ({
|
|||||||
const queryParams = {
|
const queryParams = {
|
||||||
...submitForm,
|
...submitForm,
|
||||||
sqlQuery: sql,
|
sqlQuery: sql,
|
||||||
databaseId: dataSourceItem?.databaseId || formDatabaseId,
|
databaseId: dataSourceItem?.databaseId || formDatabaseId || databaseItem?.key,
|
||||||
queryType: basicInfoFormMode === 'fast' ? 'table_query' : 'sql_query',
|
queryType: basicInfoFormMode === 'fast' ? 'table_query' : 'sql_query',
|
||||||
tableQuery: dbName && tableName ? `${dbName}.${tableName}` : '',
|
tableQuery: dbName && tableName ? `${dbName}.${tableName}` : '',
|
||||||
modelId,
|
modelId: isEdit ? dataSourceItem.modelId : modelId,
|
||||||
};
|
};
|
||||||
const queryDatasource = isEdit ? updateDatasource : createDatasource;
|
const queryDatasource = isEdit ? updateDatasource : createDatasource;
|
||||||
const { code, msg, data } = await queryDatasource(queryParams);
|
const { code, msg, data } = await queryDatasource(queryParams);
|
||||||
@@ -303,7 +306,7 @@ const DataSourceCreateForm: React.FC<CreateFormProps> = ({
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div style={{ display: currentStep === 1 ? 'block' : 'none' }}>
|
<div style={{ display: currentStep === 1 ? 'block' : 'none' }}>
|
||||||
<FieldForm fields={fields} onFieldChange={handleFieldChange} />;
|
<FieldForm fields={fields} onFieldChange={handleFieldChange} />
|
||||||
</div>
|
</div>
|
||||||
<div style={{ display: currentStep !== 1 ? 'block' : 'none' }}>
|
<div style={{ display: currentStep !== 1 ? 'block' : 'none' }}>
|
||||||
<DataSourceBasicForm
|
<DataSourceBasicForm
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import {
|
|||||||
import { isFunction } from 'lodash';
|
import { isFunction } from 'lodash';
|
||||||
import FullScreen from '@/components/FullScreen';
|
import FullScreen from '@/components/FullScreen';
|
||||||
import SqlEditor from '@/components/SqlEditor';
|
import SqlEditor from '@/components/SqlEditor';
|
||||||
import type { TaskResultItem, DataInstanceItem, TaskResultColumn } from '../data';
|
import type { TaskResultItem, TaskResultColumn } from '../data';
|
||||||
import { excuteSql } from '@/pages/SemanticModel/service';
|
import { excuteSql } from '@/pages/SemanticModel/service';
|
||||||
import DataSourceCreateForm from './DataSourceCreateForm';
|
import DataSourceCreateForm from './DataSourceCreateForm';
|
||||||
import type { Dispatch } from 'umi';
|
import type { Dispatch } from 'umi';
|
||||||
@@ -36,7 +36,6 @@ type IProps = {
|
|||||||
onUpdateSql?: (sql: string) => void;
|
onUpdateSql?: (sql: string) => void;
|
||||||
sql?: string;
|
sql?: string;
|
||||||
onSubmitSuccess?: (dataSourceInfo: any) => void;
|
onSubmitSuccess?: (dataSourceInfo: any) => void;
|
||||||
onJdbcSourceChange?: (jdbcId: number) => void;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
type ResultTableItem = Record<string, any>;
|
type ResultTableItem = Record<string, any>;
|
||||||
@@ -60,7 +59,6 @@ const SqlDetail: React.FC<IProps> = ({
|
|||||||
onSubmitSuccess,
|
onSubmitSuccess,
|
||||||
sql = '',
|
sql = '',
|
||||||
onUpdateSql,
|
onUpdateSql,
|
||||||
onJdbcSourceChange,
|
|
||||||
}) => {
|
}) => {
|
||||||
const { databaseConfigList, selectModelId: modelId } = domainManger;
|
const { databaseConfigList, selectModelId: modelId } = domainManger;
|
||||||
const [resultTable, setResultTable] = useState<ResultTableItem[]>([]);
|
const [resultTable, setResultTable] = useState<ResultTableItem[]>([]);
|
||||||
@@ -101,20 +99,6 @@ const SqlDetail: React.FC<IProps> = ({
|
|||||||
|
|
||||||
const [scriptColumns, setScriptColumns] = useState<any[]>([]);
|
const [scriptColumns, setScriptColumns] = useState<any[]>([]);
|
||||||
|
|
||||||
// useEffect(() => {
|
|
||||||
// const list = databaseConfigList.map((item: ISemantic.IDatabaseItem) => {
|
|
||||||
// return {
|
|
||||||
// label: item.name,
|
|
||||||
// key: item.id,
|
|
||||||
// disabled: !item.hasUsePermission,
|
|
||||||
// };
|
|
||||||
// });
|
|
||||||
// setJdbcSourceItems(list);
|
|
||||||
// const config = list[0];
|
|
||||||
// setCurrentJdbcSourceItem(config);
|
|
||||||
// onJdbcSourceChange?.(config?.key && Number(config?.key));
|
|
||||||
// }, [databaseConfigList]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const list = databaseConfigList.map((item: ISemantic.IDatabaseItem) => {
|
const list = databaseConfigList.map((item: ISemantic.IDatabaseItem) => {
|
||||||
return {
|
return {
|
||||||
@@ -133,9 +117,12 @@ const SqlDetail: React.FC<IProps> = ({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
setCurrentJdbcSourceItem(targetDataBase);
|
setCurrentJdbcSourceItem(targetDataBase);
|
||||||
// onJdbcSourceChange?.(targetDataBase?.key && Number(targetDataBase?.key));
|
|
||||||
}, [dataSourceItem, databaseConfigList]);
|
}, [dataSourceItem, databaseConfigList]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setRunState(undefined);
|
||||||
|
}, [currentJdbcSourceItem]);
|
||||||
|
|
||||||
function creatCalcItem(key: string, data: string) {
|
function creatCalcItem(key: string, data: string) {
|
||||||
const line = document.createElement('div'); // 需要每条数据一行,这样避免数据换行的时候获得的宽度不准确
|
const line = document.createElement('div'); // 需要每条数据一行,这样避免数据换行的时候获得的宽度不准确
|
||||||
const child = document.createElement('span');
|
const child = document.createElement('span');
|
||||||
@@ -408,9 +395,7 @@ const SqlDetail: React.FC<IProps> = ({
|
|||||||
return item.key === Number(value);
|
return item.key === Number(value);
|
||||||
})[0];
|
})[0];
|
||||||
if (target) {
|
if (target) {
|
||||||
// setJdbcSourceName(target.label);
|
|
||||||
setCurrentJdbcSourceItem(target);
|
setCurrentJdbcSourceItem(target);
|
||||||
onJdbcSourceChange?.(Number(value));
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}}
|
}}
|
||||||
@@ -520,6 +505,7 @@ const SqlDetail: React.FC<IProps> = ({
|
|||||||
{dataSourceModalVisible && (
|
{dataSourceModalVisible && (
|
||||||
<DataSourceCreateForm
|
<DataSourceCreateForm
|
||||||
sql={sql}
|
sql={sql}
|
||||||
|
databaseItem={currentJdbcSourceItem}
|
||||||
dataSourceItem={dataSourceItem}
|
dataSourceItem={dataSourceItem}
|
||||||
scriptColumns={scriptColumns}
|
scriptColumns={scriptColumns}
|
||||||
onCancel={() => {
|
onCancel={() => {
|
||||||
|
|||||||
@@ -43,8 +43,6 @@ const SqlSide: React.FC<Props> = ({ initialValues, onSubmitSuccess }) => {
|
|||||||
const tableRef: TableRef = useRef();
|
const tableRef: TableRef = useRef();
|
||||||
const panesRef = useRef<Panes[]>(defaultPanes);
|
const panesRef = useRef<Panes[]>(defaultPanes);
|
||||||
|
|
||||||
const [dataSourceItem, setDataSourceItem] = useState<any>(initialValues || {});
|
|
||||||
|
|
||||||
const updatePane = (list: Panes[]) => {
|
const updatePane = (list: Panes[]) => {
|
||||||
setPanes(list);
|
setPanes(list);
|
||||||
panesRef.current = list;
|
panesRef.current = list;
|
||||||
@@ -96,16 +94,10 @@ const SqlSide: React.FC<Props> = ({ initialValues, onSubmitSuccess }) => {
|
|||||||
>
|
>
|
||||||
<SqlDetail
|
<SqlDetail
|
||||||
onSubmitSuccess={onSubmitSuccess}
|
onSubmitSuccess={onSubmitSuccess}
|
||||||
dataSourceItem={dataSourceItem}
|
dataSourceItem={initialValues}
|
||||||
onUpdateSql={(sql: string) => {
|
onUpdateSql={(sql: string) => {
|
||||||
updateTabSql(sql, pane.key);
|
updateTabSql(sql, pane.key);
|
||||||
}}
|
}}
|
||||||
onJdbcSourceChange={(databaseId) => {
|
|
||||||
setDataSourceItem({
|
|
||||||
...dataSourceItem,
|
|
||||||
databaseId,
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
sql={pane.sql}
|
sql={pane.sql}
|
||||||
/>
|
/>
|
||||||
</TabPane>
|
</TabPane>
|
||||||
|
|||||||
@@ -101,7 +101,6 @@ const XflowJsonSchemaFormDrawerForm: React.FC<CreateFormProps> = (props) => {
|
|||||||
{dataSourceModalVisible && (
|
{dataSourceModalVisible && (
|
||||||
<DataSourceCreateForm
|
<DataSourceCreateForm
|
||||||
basicInfoFormMode="fast"
|
basicInfoFormMode="fast"
|
||||||
domainId={Number(selectDomainId)}
|
|
||||||
dataSourceItem={dataSourceItem}
|
dataSourceItem={dataSourceItem}
|
||||||
onCancel={() => {
|
onCancel={() => {
|
||||||
setDataSourceModalVisible(false);
|
setDataSourceModalVisible(false);
|
||||||
|
|||||||
@@ -113,15 +113,15 @@ const NodeInfoDrawer: React.FC<Props> = ({
|
|||||||
{
|
{
|
||||||
title: '应用信息',
|
title: '应用信息',
|
||||||
children: [
|
children: [
|
||||||
{
|
// {
|
||||||
label: '全路径',
|
// label: '全路径',
|
||||||
value: fullPath,
|
// value: fullPath,
|
||||||
content: (
|
// content: (
|
||||||
<Paragraph style={{ width: 275, margin: 0 }} ellipsis={{ tooltip: fullPath }}>
|
// <Paragraph style={{ width: 275, margin: 0 }} ellipsis={{ tooltip: fullPath }}>
|
||||||
{fullPath}
|
// {fullPath}
|
||||||
</Paragraph>
|
// </Paragraph>
|
||||||
),
|
// ),
|
||||||
},
|
// },
|
||||||
{
|
{
|
||||||
label: '敏感度',
|
label: '敏感度',
|
||||||
value: SENSITIVE_LEVEL_ENUM[sensitiveLevel],
|
value: SENSITIVE_LEVEL_ENUM[sensitiveLevel],
|
||||||
|
|||||||
@@ -124,7 +124,6 @@ const ClassDataSourceTypeModal: React.FC<Props> = ({
|
|||||||
<DataSourceCreateForm
|
<DataSourceCreateForm
|
||||||
sql={fastModeSql}
|
sql={fastModeSql}
|
||||||
basicInfoFormMode="fast"
|
basicInfoFormMode="fast"
|
||||||
domainId={Number(selectDomainId)}
|
|
||||||
dataSourceItem={dataSourceItem}
|
dataSourceItem={dataSourceItem}
|
||||||
onCancel={() => {
|
onCancel={() => {
|
||||||
setDataSourceModalVisible(false);
|
setDataSourceModalVisible(false);
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ const DimensionInfoModal: React.FC<CreateFormProps> = ({
|
|||||||
|
|
||||||
const saveDimension = async (fieldsValue: any, isSilenceSubmit = false) => {
|
const saveDimension = async (fieldsValue: any, isSilenceSubmit = false) => {
|
||||||
const queryParams = {
|
const queryParams = {
|
||||||
modelId,
|
modelId: isEdit ? dimensionItem.modelId : modelId,
|
||||||
type: 'categorical',
|
type: 'categorical',
|
||||||
...fieldsValue,
|
...fieldsValue,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ const DomainListTree: FC<DomainListProps> = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const titleRender = (node: any) => {
|
const titleRender = (node: any) => {
|
||||||
const { id, name, path } = node as any;
|
const { id, name, path, hasEditPermission } = node as any;
|
||||||
return (
|
return (
|
||||||
<div className={styles.projectItem}>
|
<div className={styles.projectItem}>
|
||||||
<span
|
<span
|
||||||
@@ -126,7 +126,7 @@ const DomainListTree: FC<DomainListProps> = ({
|
|||||||
>
|
>
|
||||||
{name}
|
{name}
|
||||||
</span>
|
</span>
|
||||||
{createDomainBtnVisible && (
|
{createDomainBtnVisible && hasEditPermission && (
|
||||||
<span className={styles.operation}>
|
<span className={styles.operation}>
|
||||||
{Array.isArray(path) && path.length < 2 && (
|
{Array.isArray(path) && path.length < 2 && (
|
||||||
<PlusOutlined
|
<PlusOutlined
|
||||||
|
|||||||
@@ -33,12 +33,13 @@ const DomainManagerTab: React.FC<Props> = ({
|
|||||||
isModel,
|
isModel,
|
||||||
activeKey,
|
activeKey,
|
||||||
modelList,
|
modelList,
|
||||||
|
domainManger,
|
||||||
handleModelChange,
|
handleModelChange,
|
||||||
onBackDomainBtnClick,
|
onBackDomainBtnClick,
|
||||||
onMenuChange,
|
onMenuChange,
|
||||||
}) => {
|
}) => {
|
||||||
const defaultTabKey = 'xflow';
|
const defaultTabKey = 'xflow';
|
||||||
|
const { selectDomainId, domainList } = domainManger;
|
||||||
const tabItem = [
|
const tabItem = [
|
||||||
{
|
{
|
||||||
label: '模型',
|
label: '模型',
|
||||||
@@ -62,7 +63,13 @@ const DomainManagerTab: React.FC<Props> = ({
|
|||||||
key: 'permissonSetting',
|
key: 'permissonSetting',
|
||||||
children: <PermissionSection permissionTarget={'domain'} />,
|
children: <PermissionSection permissionTarget={'domain'} />,
|
||||||
},
|
},
|
||||||
];
|
].filter((item) => {
|
||||||
|
const target = domainList.find((domain) => domain.id === selectDomainId);
|
||||||
|
if (target?.hasEditPermission) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return item.key !== 'permissonSetting';
|
||||||
|
});
|
||||||
|
|
||||||
const isModelItem = [
|
const isModelItem = [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -28,11 +28,10 @@ const FormItem = Form.Item;
|
|||||||
const Option = Select.Option;
|
const Option = Select.Option;
|
||||||
|
|
||||||
const DefaultSettingForm: ForwardRefRenderFunction<any, Props> = (
|
const DefaultSettingForm: ForwardRefRenderFunction<any, Props> = (
|
||||||
{ metricList, dimensionList, domainId, entityData, chatConfigKey, chatConfigType, onSubmit },
|
{ metricList, dimensionList, entityData, chatConfigKey, chatConfigType, onSubmit },
|
||||||
ref,
|
ref,
|
||||||
) => {
|
) => {
|
||||||
const [form] = Form.useForm();
|
const [form] = Form.useForm();
|
||||||
const [metricListOptions, setMetricListOptions] = useState<any>([]);
|
|
||||||
const [dataItemListOptions, setDataItemListOptions] = useState<any>([]);
|
const [dataItemListOptions, setDataItemListOptions] = useState<any>([]);
|
||||||
const formatEntityData = formatRichEntityDataListToIds(entityData);
|
const formatEntityData = formatRichEntityDataListToIds(entityData);
|
||||||
const getFormValidateFields = async () => {
|
const getFormValidateFields = async () => {
|
||||||
@@ -74,16 +73,6 @@ const DefaultSettingForm: ForwardRefRenderFunction<any, Props> = (
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const metricOption = metricList.map((item: any) => {
|
|
||||||
return {
|
|
||||||
label: item.name,
|
|
||||||
value: item.id,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
setMetricListOptions(metricOption);
|
|
||||||
}, [metricList]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (Array.isArray(dimensionList) && Array.isArray(metricList)) {
|
if (Array.isArray(dimensionList) && Array.isArray(metricList)) {
|
||||||
const dimensionEnum = dimensionList.map((item: ISemantic.IDimensionItem) => {
|
const dimensionEnum = dimensionList.map((item: ISemantic.IDimensionItem) => {
|
||||||
@@ -141,9 +130,10 @@ const DefaultSettingForm: ForwardRefRenderFunction<any, Props> = (
|
|||||||
...formatEntityData,
|
...formatEntityData,
|
||||||
chatDefaultConfig: { ...values, ...dimensionConfig },
|
chatDefaultConfig: { ...values, ...dimensionConfig },
|
||||||
};
|
};
|
||||||
|
const { modelId } = entityData;
|
||||||
const { code, msg, data } = await saveDomainExtendQuery({
|
const { code, msg, data } = await saveDomainExtendQuery({
|
||||||
[chatConfigKey]: params,
|
[chatConfigKey]: params,
|
||||||
// domainId,
|
modelId,
|
||||||
id,
|
id,
|
||||||
});
|
});
|
||||||
if (code === 200) {
|
if (code === 200) {
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ const DimensionAndMetricVisibleModal: React.FC<Props> = ({
|
|||||||
if (globalKnowledgeConfigFormFields) {
|
if (globalKnowledgeConfigFormFields) {
|
||||||
globalKnowledgeConfig = globalKnowledgeConfigFormFields;
|
globalKnowledgeConfig = globalKnowledgeConfigFormFields;
|
||||||
}
|
}
|
||||||
const { id } = entityData;
|
const { id, modelId } = entityData;
|
||||||
let saveDomainExtendQuery = addDomainExtend;
|
let saveDomainExtendQuery = addDomainExtend;
|
||||||
if (id) {
|
if (id) {
|
||||||
saveDomainExtendQuery = editDomainExtend;
|
saveDomainExtendQuery = editDomainExtend;
|
||||||
@@ -126,8 +126,8 @@ const DimensionAndMetricVisibleModal: React.FC<Props> = ({
|
|||||||
|
|
||||||
const { code, msg } = await saveDomainExtendQuery({
|
const { code, msg } = await saveDomainExtendQuery({
|
||||||
[chatConfigKey]: params,
|
[chatConfigKey]: params,
|
||||||
// domainId,
|
|
||||||
id,
|
id,
|
||||||
|
modelId,
|
||||||
});
|
});
|
||||||
if (code === 200) {
|
if (code === 200) {
|
||||||
if (!isSilenceSubmit) {
|
if (!isSilenceSubmit) {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ type Props = {
|
|||||||
const FormLabelRequire: React.FC<Props> = ({ title, labelStyles = {} }) => {
|
const FormLabelRequire: React.FC<Props> = ({ title, labelStyles = {} }) => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="ant-col ant-form-item-label">
|
<div className="ant-col ant-form-item-label" style={{ padding: 0 }}>
|
||||||
<label
|
<label
|
||||||
htmlFor="description"
|
htmlFor="description"
|
||||||
className="ant-form-item-required"
|
className="ant-form-item-required"
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ const MetricInfoCreateForm: React.FC<CreateFormProps> = ({
|
|||||||
sensitiveLevel,
|
sensitiveLevel,
|
||||||
description,
|
description,
|
||||||
// isPercent,
|
// isPercent,
|
||||||
dataFormatType,
|
dataFormatType: dataFormatType || '',
|
||||||
alias: alias && alias.trim() ? alias.split(',') : [],
|
alias: alias && alias.trim() ? alias.split(',') : [],
|
||||||
dataFormat: dataFormat || {
|
dataFormat: dataFormat || {
|
||||||
decimalPlaces: 2,
|
decimalPlaces: 2,
|
||||||
@@ -163,7 +163,7 @@ const MetricInfoCreateForm: React.FC<CreateFormProps> = ({
|
|||||||
|
|
||||||
const saveMetric = async (fieldsValue: any) => {
|
const saveMetric = async (fieldsValue: any) => {
|
||||||
const queryParams = {
|
const queryParams = {
|
||||||
modelId,
|
modelId: isEdit ? metricItem.modelId : modelId,
|
||||||
...fieldsValue,
|
...fieldsValue,
|
||||||
};
|
};
|
||||||
const { typeParams, alias, dataFormatType } = queryParams;
|
const { typeParams, alias, dataFormatType } = queryParams;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { Form, Button, Modal, Input, Switch } from 'antd';
|
import { Form, Button, Modal, Input, Switch, Select } from 'antd';
|
||||||
import styles from './style.less';
|
import styles from './style.less';
|
||||||
import { message } from 'antd';
|
import { message } from 'antd';
|
||||||
import { formLayout } from '@/components/FormHelper/utils';
|
import { formLayout } from '@/components/FormHelper/utils';
|
||||||
@@ -22,13 +22,20 @@ const ModelCreateFormModal: React.FC<ModelCreateFormModalProps> = (props) => {
|
|||||||
const [form] = Form.useForm();
|
const [form] = Form.useForm();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
form.setFieldsValue(basicInfo);
|
form.setFieldsValue({
|
||||||
|
...basicInfo,
|
||||||
|
alias: basicInfo?.alias && basicInfo.alias.trim() ? basicInfo.alias.split(',') : [],
|
||||||
|
});
|
||||||
}, [basicInfo]);
|
}, [basicInfo]);
|
||||||
|
|
||||||
const handleConfirm = async () => {
|
const handleConfirm = async () => {
|
||||||
const fieldsValue = await form.validateFields();
|
const fieldsValue = await form.validateFields();
|
||||||
const columnsValue = { ...fieldsValue, isUnique: 1, domainId };
|
const columnsValue = { ...fieldsValue, isUnique: 1, domainId };
|
||||||
const submitData = { ...formVals, ...columnsValue };
|
const submitData = {
|
||||||
|
...formVals,
|
||||||
|
...columnsValue,
|
||||||
|
alias: Array.isArray(fieldsValue.alias) ? fieldsValue.alias.join(',') : '',
|
||||||
|
};
|
||||||
setFormVals(submitData);
|
setFormVals(submitData);
|
||||||
setSaveLoading(true);
|
setSaveLoading(true);
|
||||||
const { code, msg } = await (!submitData.id ? createModel : updateModel)(submitData);
|
const { code, msg } = await (!submitData.id ? createModel : updateModel)(submitData);
|
||||||
@@ -81,6 +88,14 @@ const ModelCreateFormModal: React.FC<ModelCreateFormModalProps> = (props) => {
|
|||||||
>
|
>
|
||||||
<Input placeholder="请输入模型英文名称" />
|
<Input placeholder="请输入模型英文名称" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
|
<FormItem name="alias" label="别名">
|
||||||
|
<Select
|
||||||
|
mode="tags"
|
||||||
|
placeholder="输入别名后回车确认,多别名输入、复制粘贴支持英文逗号自动分隔"
|
||||||
|
tokenSeparators={[',']}
|
||||||
|
maxTagCount={9}
|
||||||
|
/>
|
||||||
|
</FormItem>
|
||||||
<FormItem name="description" label="模型描述">
|
<FormItem name="description" label="模型描述">
|
||||||
<Input.TextArea placeholder="模型描述" />
|
<Input.TextArea placeholder="模型描述" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
|
|||||||
@@ -141,24 +141,28 @@ const PermissionCreateDrawer: React.FC<Props> = ({
|
|||||||
<DimensionMetricVisibleTransfer
|
<DimensionMetricVisibleTransfer
|
||||||
titles={['未授权维度/指标', '已授权维度/指标']}
|
titles={['未授权维度/指标', '已授权维度/指标']}
|
||||||
sourceList={[
|
sourceList={[
|
||||||
...dimensionList.map((item) => {
|
...dimensionList
|
||||||
const transType = TransType.DIMENSION;
|
.map((item) => {
|
||||||
const { id } = item;
|
const transType = TransType.DIMENSION;
|
||||||
return {
|
const { id } = item;
|
||||||
...item,
|
return {
|
||||||
transType,
|
...item,
|
||||||
key: wrapperTransTypeAndId(transType, id),
|
transType,
|
||||||
};
|
key: wrapperTransTypeAndId(transType, id),
|
||||||
}),
|
};
|
||||||
...metricList.map((item) => {
|
})
|
||||||
const transType = TransType.METRIC;
|
.filter((item) => item.sensitiveLevel === 2),
|
||||||
const { id } = item;
|
...metricList
|
||||||
return {
|
.map((item) => {
|
||||||
...item,
|
const transType = TransType.METRIC;
|
||||||
transType,
|
const { id } = item;
|
||||||
key: wrapperTransTypeAndId(transType, id),
|
return {
|
||||||
};
|
...item,
|
||||||
}),
|
transType,
|
||||||
|
key: wrapperTransTypeAndId(transType, id),
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.filter((item) => item.sensitiveLevel === 2),
|
||||||
]}
|
]}
|
||||||
targetList={selectedKeyList}
|
targetList={selectedKeyList}
|
||||||
onChange={(newTargetKeys: string[]) => {
|
onChange={(newTargetKeys: string[]) => {
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ export declare namespace IDataSource {
|
|||||||
name: string;
|
name: string;
|
||||||
bizName: string;
|
bizName: string;
|
||||||
description: string;
|
description: string;
|
||||||
|
modelId: number;
|
||||||
status: number | null;
|
status: number | null;
|
||||||
sensitiveLevel: SensitiveLevel;
|
sensitiveLevel: SensitiveLevel;
|
||||||
domainId: number;
|
domainId: number;
|
||||||
@@ -79,6 +80,7 @@ export declare namespace ISemantic {
|
|||||||
name: string;
|
name: string;
|
||||||
bizName: string;
|
bizName: string;
|
||||||
description: any;
|
description: any;
|
||||||
|
hasEditPermission: boolean;
|
||||||
status?: number;
|
status?: number;
|
||||||
typeEnum?: any;
|
typeEnum?: any;
|
||||||
sensitiveLevel?: number;
|
sensitiveLevel?: number;
|
||||||
@@ -135,6 +137,7 @@ export declare namespace ISemantic {
|
|||||||
expr: string;
|
expr: string;
|
||||||
fullPath: string;
|
fullPath: string;
|
||||||
datasourceId: number;
|
datasourceId: number;
|
||||||
|
modelId: number;
|
||||||
datasourceName: string;
|
datasourceName: string;
|
||||||
datasourceBizName: string;
|
datasourceBizName: string;
|
||||||
semanticType: string;
|
semanticType: string;
|
||||||
@@ -178,6 +181,7 @@ export declare namespace ISemantic {
|
|||||||
sensitiveLevel: number;
|
sensitiveLevel: number;
|
||||||
domainId: number;
|
domainId: number;
|
||||||
domainName: string;
|
domainName: string;
|
||||||
|
modelId: number;
|
||||||
type: string;
|
type: string;
|
||||||
typeParams: ITypeParams;
|
typeParams: ITypeParams;
|
||||||
fullPath: string;
|
fullPath: string;
|
||||||
|
|||||||
Reference in New Issue
Block a user