mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-20 06:34:55 +00:00
[improvement][headless-fe] Migrating scaffold version to @umi/max (#1030)
* [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 * [improvement][headless-fe] Migrating scaffold version to @umi/max
This commit is contained in:
@@ -2,9 +2,7 @@ import type { ActionType, ProColumns } from '@ant-design/pro-components';
|
||||
import { ProTable } from '@ant-design/pro-components';
|
||||
import { message, Button, Space, Popconfirm, Input, Tag, Select } from 'antd';
|
||||
import React, { useRef, useState, useEffect } from 'react';
|
||||
import type { Dispatch } from 'umi';
|
||||
import { connect } from 'umi';
|
||||
import type { StateType } from '../model';
|
||||
import { useModel } from '@umijs/max';
|
||||
import { StatusEnum } from '../enum';
|
||||
import { SENSITIVE_LEVEL_ENUM, SENSITIVE_LEVEL_OPTIONS, TAG_DEFINE_TYPE } from '../constant';
|
||||
import {
|
||||
@@ -22,13 +20,15 @@ import BatchCtrlDropDownButton from '@/components/BatchCtrlDropDownButton';
|
||||
import { ColumnsConfig } from './TableColumnRender';
|
||||
import styles from './style.less';
|
||||
|
||||
type Props = {
|
||||
dispatch: Dispatch;
|
||||
domainManger: StateType;
|
||||
};
|
||||
type Props = {};
|
||||
|
||||
const ClassDimensionTable: React.FC<Props> = ({ domainManger, dispatch }) => {
|
||||
const { selectModelId: modelId, selectDomainId: domainId } = domainManger;
|
||||
const ClassDimensionTable: React.FC<Props> = ({}) => {
|
||||
const domainModel = useModel('SemanticModel.domainData');
|
||||
const modelModel = useModel('SemanticModel.modelData');
|
||||
const dimensionModel = useModel('SemanticModel.dimensionData');
|
||||
const { selectDomainId: domainId } = domainModel;
|
||||
const { selectModelId: modelId } = modelModel;
|
||||
const { MrefreshDimensionList } = dimensionModel;
|
||||
const [createModalVisible, setCreateModalVisible] = useState<boolean>(false);
|
||||
const [dimensionItem, setDimensionItem] = useState<ISemantic.IDimensionItem>();
|
||||
const [dataSourceList, setDataSourceList] = useState<IDataSource.IDataSourceItem[]>([]);
|
||||
@@ -103,12 +103,7 @@ const ClassDimensionTable: React.FC<Props> = ({ domainManger, dispatch }) => {
|
||||
setLoading(false);
|
||||
if (code === 200) {
|
||||
queryDimensionList({ ...filterParams, ...pagination });
|
||||
dispatch({
|
||||
type: 'domainManger/queryDimensionList',
|
||||
payload: {
|
||||
modelId,
|
||||
},
|
||||
});
|
||||
MrefreshDimensionList({ modelId });
|
||||
return;
|
||||
}
|
||||
message.error(msg);
|
||||
@@ -131,12 +126,7 @@ const ClassDimensionTable: React.FC<Props> = ({ domainManger, dispatch }) => {
|
||||
setLoading(false);
|
||||
if (code === 200) {
|
||||
queryDimensionList({ ...filterParams, ...pagination });
|
||||
dispatch({
|
||||
type: 'domainManger/queryDimensionList',
|
||||
payload: {
|
||||
modelId,
|
||||
},
|
||||
});
|
||||
MrefreshDimensionList({ modelId });
|
||||
return;
|
||||
}
|
||||
message.error(msg);
|
||||
@@ -447,12 +437,7 @@ const ClassDimensionTable: React.FC<Props> = ({ domainManger, dispatch }) => {
|
||||
onSubmit={() => {
|
||||
setCreateModalVisible(false);
|
||||
queryDimensionList({ ...filterParams, ...defaultPagination });
|
||||
dispatch({
|
||||
type: 'domainManger/queryDimensionList',
|
||||
payload: {
|
||||
modelId,
|
||||
},
|
||||
});
|
||||
MrefreshDimensionList({ modelId });
|
||||
return;
|
||||
}}
|
||||
onCancel={() => {
|
||||
@@ -466,22 +451,13 @@ const ClassDimensionTable: React.FC<Props> = ({ domainManger, dispatch }) => {
|
||||
open={dimensionValueSettingModalVisible}
|
||||
dimensionItem={dimensionItem}
|
||||
onCancel={() => {
|
||||
dispatch({
|
||||
type: 'domainManger/queryDimensionList',
|
||||
payload: {
|
||||
modelId,
|
||||
},
|
||||
});
|
||||
MrefreshDimensionList({ modelId });
|
||||
|
||||
setDimensionValueSettingModalVisible(false);
|
||||
}}
|
||||
onSubmit={() => {
|
||||
queryDimensionList({ ...filterParams, ...defaultPagination });
|
||||
dispatch({
|
||||
type: 'domainManger/queryDimensionList',
|
||||
payload: {
|
||||
modelId,
|
||||
},
|
||||
});
|
||||
MrefreshDimensionList({ modelId });
|
||||
setDimensionValueSettingModalVisible(false);
|
||||
}}
|
||||
/>
|
||||
@@ -489,6 +465,4 @@ const ClassDimensionTable: React.FC<Props> = ({ domainManger, dispatch }) => {
|
||||
</>
|
||||
);
|
||||
};
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(ClassDimensionTable);
|
||||
export default ClassDimensionTable;
|
||||
|
||||
@@ -2,10 +2,8 @@ import type { ActionType, ProColumns } from '@ant-design/pro-components';
|
||||
import { ProTable } from '@ant-design/pro-components';
|
||||
import { message, Button, Space, Popconfirm, Input, Select, Tag } from 'antd';
|
||||
import React, { useRef, useState, useEffect } from 'react';
|
||||
import type { Dispatch } from 'umi';
|
||||
import { StatusEnum } from '../enum';
|
||||
import { connect, history } from 'umi';
|
||||
import type { StateType } from '../model';
|
||||
import { useModel } from '@umijs/max';
|
||||
import { SENSITIVE_LEVEL_ENUM, SENSITIVE_LEVEL_OPTIONS, TAG_DEFINE_TYPE } from '../constant';
|
||||
import {
|
||||
queryMetric,
|
||||
@@ -25,12 +23,16 @@ import { ColumnsConfig } from './TableColumnRender';
|
||||
|
||||
type Props = {
|
||||
onEmptyMetricData?: () => void;
|
||||
dispatch: Dispatch;
|
||||
domainManger: StateType;
|
||||
};
|
||||
|
||||
const ClassMetricTable: React.FC<Props> = ({ onEmptyMetricData, domainManger, dispatch }) => {
|
||||
const { selectModelId: modelId, selectDomainId } = domainManger;
|
||||
const ClassMetricTable: React.FC<Props> = ({ onEmptyMetricData }) => {
|
||||
const domainModel = useModel('SemanticModel.domainData');
|
||||
const modelModel = useModel('SemanticModel.modelData');
|
||||
const metricModel = useModel('SemanticModel.metricData');
|
||||
const { selectDomainId } = domainModel;
|
||||
const { selectModelId: modelId } = modelModel;
|
||||
const { MrefreshMetricList } = metricModel;
|
||||
|
||||
const [createModalVisible, setCreateModalVisible] = useState<boolean>(false);
|
||||
const [metricItem, setMetricItem] = useState<ISemantic.IMetricItem>();
|
||||
const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);
|
||||
@@ -60,12 +62,7 @@ const ClassMetricTable: React.FC<Props> = ({ onEmptyMetricData, domainManger, di
|
||||
});
|
||||
if (code === 200) {
|
||||
queryMetricList({ ...filterParams, ...defaultPagination });
|
||||
dispatch({
|
||||
type: 'domainManger/queryMetricList',
|
||||
payload: {
|
||||
modelId,
|
||||
},
|
||||
});
|
||||
MrefreshMetricList({ modelId });
|
||||
return;
|
||||
}
|
||||
message.error(msg);
|
||||
@@ -87,12 +84,7 @@ const ClassMetricTable: React.FC<Props> = ({ onEmptyMetricData, domainManger, di
|
||||
setLoading(false);
|
||||
if (code === 200) {
|
||||
queryMetricList({ ...filterParams, ...defaultPagination });
|
||||
dispatch({
|
||||
type: 'domainManger/queryMetricList',
|
||||
payload: {
|
||||
modelId,
|
||||
},
|
||||
});
|
||||
MrefreshMetricList({ modelId });
|
||||
return;
|
||||
}
|
||||
message.error(msg);
|
||||
@@ -108,12 +100,7 @@ const ClassMetricTable: React.FC<Props> = ({ onEmptyMetricData, domainManger, di
|
||||
});
|
||||
if (code === 200) {
|
||||
queryMetricList({ ...filterParams, ...defaultPagination });
|
||||
dispatch({
|
||||
type: 'domainManger/queryMetricList',
|
||||
payload: {
|
||||
modelId,
|
||||
},
|
||||
});
|
||||
MrefreshMetricList({ modelId });
|
||||
return;
|
||||
}
|
||||
message.error(msg);
|
||||
@@ -151,7 +138,7 @@ const ClassMetricTable: React.FC<Props> = ({ onEmptyMetricData, domainManger, di
|
||||
}
|
||||
};
|
||||
|
||||
const columnsConfig = ColumnsConfig();
|
||||
const columnsConfig = ColumnsConfig({ indicatorInfo: { url: '/model/metric/edit/' } });
|
||||
|
||||
const columns: ProColumns[] = [
|
||||
{
|
||||
@@ -481,12 +468,7 @@ const ClassMetricTable: React.FC<Props> = ({ onEmptyMetricData, domainManger, di
|
||||
onSubmit={() => {
|
||||
setCreateModalVisible(false);
|
||||
queryMetricList({ ...filterParams, ...defaultPagination });
|
||||
dispatch({
|
||||
type: 'domainManger/queryMetricList',
|
||||
payload: {
|
||||
modelId,
|
||||
},
|
||||
});
|
||||
MrefreshMetricList({ modelId });
|
||||
}}
|
||||
onCancel={() => {
|
||||
setCreateModalVisible(false);
|
||||
@@ -496,6 +478,4 @@ const ClassMetricTable: React.FC<Props> = ({ onEmptyMetricData, domainManger, di
|
||||
</>
|
||||
);
|
||||
};
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(ClassMetricTable);
|
||||
export default ClassMetricTable;
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
import { Drawer, Modal, Card, Row, Col, message } from 'antd';
|
||||
import { ConsoleSqlOutlined, CoffeeOutlined } from '@ant-design/icons';
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import type { Dispatch } from 'umi';
|
||||
import { connect } from 'umi';
|
||||
import ModelCreateForm from '../Datasource/components/ModelCreateForm';
|
||||
import { excuteSql, getModelDetail } from '../service';
|
||||
import type { StateType } from '../model';
|
||||
import { getModelDetail } from '../service';
|
||||
import DataSource from '../Datasource';
|
||||
import { IDataSource, ISemantic } from '../data';
|
||||
import styles from './style.less';
|
||||
@@ -17,8 +14,6 @@ type Props = {
|
||||
onTypeChange?: (type: 'fast' | 'normal') => void;
|
||||
onSubmit?: () => void;
|
||||
onCancel?: () => void;
|
||||
dispatch: Dispatch;
|
||||
domainManger: StateType;
|
||||
};
|
||||
|
||||
const ClassModelTypeModal: React.FC<Props> = ({
|
||||
@@ -26,17 +21,12 @@ const ClassModelTypeModal: React.FC<Props> = ({
|
||||
onTypeChange,
|
||||
onSubmit,
|
||||
modelItem: modelBasicItem,
|
||||
domainManger,
|
||||
onCancel,
|
||||
dispatch,
|
||||
}) => {
|
||||
const { selectDomainId } = domainManger;
|
||||
const [createModalVisible, setCreateModalVisible] = useState<boolean>(false);
|
||||
|
||||
const [dataSourceModalVisible, setDataSourceModalVisible] = useState(false);
|
||||
const [fastModeSql, setFastModeSql] = useState<string>('');
|
||||
const [sql, setSql] = useState<string>('');
|
||||
|
||||
const [createDataSourceModalOpen, setCreateDataSourceModalOpen] = useState<boolean>(false);
|
||||
const [dataSourceEditOpen, setDataSourceEditOpen] = useState<boolean>(false);
|
||||
const [currentDatabaseId, setCurrentDatabaseId] = useState<number>();
|
||||
@@ -77,22 +67,12 @@ const ClassModelTypeModal: React.FC<Props> = ({
|
||||
const queryDataBaseExcuteSql = (tableName: string) => {
|
||||
const sql = `select * from ${tableName}`;
|
||||
setFastModeSql(sql);
|
||||
|
||||
dispatch({
|
||||
type: 'domainManger/queryDataBaseExcuteSql',
|
||||
payload: {
|
||||
sql,
|
||||
domainId: selectDomainId,
|
||||
tableName,
|
||||
},
|
||||
});
|
||||
};
|
||||
const handleCancel = () => {
|
||||
onCancel?.();
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
// queryTableColumnListByScript(modelItem);
|
||||
setSql(modelItem?.modelDetail?.sqlQuery);
|
||||
|
||||
const modelDetailFields = modelItem?.modelDetail?.fields;
|
||||
@@ -135,7 +115,7 @@ const ClassModelTypeModal: React.FC<Props> = ({
|
||||
cover={
|
||||
<CoffeeOutlined
|
||||
width={240}
|
||||
style={{ paddingTop: '45px', height: 75, fontSize: '48px', color: '#1890ff' }}
|
||||
style={{ marginTop: '45px', height: 75, fontSize: '48px', color: '#1890ff' }}
|
||||
/>
|
||||
}
|
||||
>
|
||||
@@ -154,7 +134,7 @@ const ClassModelTypeModal: React.FC<Props> = ({
|
||||
style={{ height: 220 }}
|
||||
cover={
|
||||
<ConsoleSqlOutlined
|
||||
style={{ paddingTop: '45px', height: 75, fontSize: '48px', color: '#1890ff' }}
|
||||
style={{ marginTop: '45px', height: 75, fontSize: '48px', color: '#1890ff' }}
|
||||
/>
|
||||
}
|
||||
>
|
||||
@@ -233,6 +213,4 @@ const ClassModelTypeModal: React.FC<Props> = ({
|
||||
</>
|
||||
);
|
||||
};
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(ClassModelTypeModal);
|
||||
export default ClassModelTypeModal;
|
||||
|
||||
@@ -4,8 +4,6 @@ import type { TransferItem } from 'antd/es/transfer';
|
||||
import type { CheckboxChangeEvent } from 'antd/es/checkbox';
|
||||
import difference from 'lodash/difference';
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { connect } from 'umi';
|
||||
import type { StateType } from '../model';
|
||||
import TransTypeTag from './TransTypeTag';
|
||||
import TableTitleTooltips from '../components/TableTitleTooltips';
|
||||
import { ISemantic } from '../data';
|
||||
@@ -23,7 +21,6 @@ interface RecordType {
|
||||
|
||||
type Props = {
|
||||
metricItem: ISemantic.IMetricItem;
|
||||
domainManger: StateType;
|
||||
relationsInitialValue?: ISemantic.IDrillDownDimensionItem[];
|
||||
onChange: (relations: ISemantic.IDrillDownDimensionItem[]) => void;
|
||||
};
|
||||
@@ -31,11 +28,9 @@ type Props = {
|
||||
const DimensionMetricRelationTableTransfer: React.FC<Props> = ({
|
||||
metricItem,
|
||||
relationsInitialValue,
|
||||
domainManger,
|
||||
onChange,
|
||||
}) => {
|
||||
const [targetKeys, setTargetKeys] = useState<string[]>([]);
|
||||
const { selectModelId: modelId } = domainManger;
|
||||
const [checkedMap, setCheckedMap] = useState<Record<string, ISemantic.IDrillDownDimensionItem>>(
|
||||
{},
|
||||
);
|
||||
@@ -47,7 +42,7 @@ const DimensionMetricRelationTableTransfer: React.FC<Props> = ({
|
||||
}, [metricItem, relationsInitialValue]);
|
||||
|
||||
const queryDimensionList = async () => {
|
||||
const { code, data, msg } = await getDimensionInModelCluster(metricItem?.modelId || modelId);
|
||||
const { code, data, msg } = await getDimensionInModelCluster(metricItem?.modelId);
|
||||
if (code === 200 && Array.isArray(data)) {
|
||||
setDimensionList(data);
|
||||
} else {
|
||||
@@ -220,7 +215,7 @@ const DimensionMetricRelationTableTransfer: React.FC<Props> = ({
|
||||
selectedKeys: listSelectedKeys,
|
||||
disabled: listDisabled,
|
||||
}) => {
|
||||
const columns = direction === 'left' ? leftColumns : rightColumns;
|
||||
const columns: any = direction === 'left' ? leftColumns : rightColumns;
|
||||
const rowSelection: TableRowSelection<TransferItem> = {
|
||||
getCheckboxProps: (item) => ({ disabled: listDisabled || item.disabled }),
|
||||
onSelectAll(selected, selectedRows) {
|
||||
@@ -277,6 +272,4 @@ const DimensionMetricRelationTableTransfer: React.FC<Props> = ({
|
||||
);
|
||||
};
|
||||
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(DimensionMetricRelationTableTransfer);
|
||||
export default DimensionMetricRelationTableTransfer;
|
||||
|
||||
@@ -4,9 +4,7 @@ import { InfoCircleOutlined } from '@ant-design/icons';
|
||||
import { ISemantic } from '../data';
|
||||
import CommonEditTable from './CommonEditTable';
|
||||
import { updateDimension, mockDimensionValuesAlias } from '../service';
|
||||
import { connect } from 'umi';
|
||||
import DimensionValueSettingForm from './Entity/DimensionValueSettingForm';
|
||||
import type { StateType } from '../model';
|
||||
|
||||
export type CreateFormProps = {
|
||||
dimensionValueSettingList: ISemantic.IDimensionValueSettingItem[];
|
||||
@@ -14,7 +12,6 @@ export type CreateFormProps = {
|
||||
dimensionItem: ISemantic.IDimensionItem;
|
||||
open: boolean;
|
||||
onSubmit: (values?: any) => void;
|
||||
domainManger: StateType;
|
||||
};
|
||||
|
||||
type TableDataSource = { techName: string; bizName: string; alias?: string[] };
|
||||
@@ -24,11 +21,9 @@ const DimensionValueSettingModal: React.FC<CreateFormProps> = ({
|
||||
open,
|
||||
dimensionItem,
|
||||
dimensionValueSettingList,
|
||||
domainManger,
|
||||
onSubmit,
|
||||
}) => {
|
||||
const [tableDataSource, setTableDataSource] = useState<TableDataSource[]>([]);
|
||||
const { selectDomainId, selectModelId: modelId } = domainManger;
|
||||
const [dimValueMaps, setDimValueMaps] = useState<ISemantic.IDimensionValueSettingItem[]>([]);
|
||||
const [llmLoading, setLlmLoading] = useState<boolean>(false);
|
||||
const [menuKey, setMenuKey] = useState<string>('default');
|
||||
@@ -49,7 +44,6 @@ const DimensionValueSettingModal: React.FC<CreateFormProps> = ({
|
||||
}
|
||||
const queryParams = {
|
||||
...dimensionItem,
|
||||
domainId: selectDomainId,
|
||||
...fieldsValue,
|
||||
};
|
||||
const { code, msg } = await updateDimension(queryParams);
|
||||
@@ -215,6 +209,4 @@ const DimensionValueSettingModal: React.FC<CreateFormProps> = ({
|
||||
);
|
||||
};
|
||||
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(DimensionValueSettingModal);
|
||||
export default DimensionValueSettingModal;
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
import { DownOutlined, PlusOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons';
|
||||
import { Input, message, Tree, Popconfirm, Space, Tooltip, Row, Col, Button } from 'antd';
|
||||
import { Input, message, Tree, Popconfirm, Tooltip, Row, Col, Button } from 'antd';
|
||||
import type { DataNode } from 'antd/lib/tree';
|
||||
import { useEffect, useState } from 'react';
|
||||
import type { FC, Key } from 'react';
|
||||
import { connect } from 'umi';
|
||||
import type { Dispatch } from 'umi';
|
||||
import type { StateType } from '../model';
|
||||
import { useModel } from '@umijs/max';
|
||||
import { createDomain, updateDomain, deleteDomain } from '../service';
|
||||
import { treeParentKeyLists } from '../utils';
|
||||
import DomainInfoForm from './DomainInfoForm';
|
||||
@@ -17,11 +15,7 @@ import { ISemantic } from '../data';
|
||||
const { Search } = Input;
|
||||
|
||||
type DomainListProps = {
|
||||
selectDomainId: number;
|
||||
selectDomainName: string;
|
||||
domainList: ISemantic.IDomainItem[];
|
||||
createDomainBtnVisible?: boolean;
|
||||
dispatch: Dispatch;
|
||||
onCreateDomainBtnClick?: () => void;
|
||||
onTreeSelected?: (targetNodeData: ISemantic.IDomainItem) => void;
|
||||
onTreeDataUpdate?: () => void;
|
||||
@@ -43,8 +37,6 @@ const projectTreeFlat = (projectTree: DataNode[], filterValue: string): DataNode
|
||||
};
|
||||
|
||||
const DomainListTree: FC<DomainListProps> = ({
|
||||
selectDomainId,
|
||||
domainList,
|
||||
createDomainBtnVisible = true,
|
||||
onCreateDomainBtnClick,
|
||||
onTreeSelected,
|
||||
@@ -56,6 +48,8 @@ const DomainListTree: FC<DomainListProps> = ({
|
||||
const [filterValue, setFliterValue] = useState<string>('');
|
||||
const [expandedKeys, setExpandedKeys] = useState<string[]>([]);
|
||||
const [classList, setClassList] = useState<ISemantic.IDomainItem[]>([]);
|
||||
const domainModel = useModel('SemanticModel.domainData');
|
||||
const { selectDomainId, domainList } = domainModel;
|
||||
|
||||
useEffect(() => {
|
||||
const treeData = addPathInTreeData(constructorClassTreeFromList(domainList));
|
||||
@@ -68,7 +62,7 @@ const DomainListTree: FC<DomainListProps> = ({
|
||||
setFliterValue(value);
|
||||
};
|
||||
|
||||
const handleSelect = (selectedKeys: string, projectName: string) => {
|
||||
const handleSelect = (selectedKeys: string) => {
|
||||
if (`${selectedKeys}` === `${selectDomainId}`) {
|
||||
return;
|
||||
}
|
||||
@@ -135,7 +129,7 @@ const DomainListTree: FC<DomainListProps> = ({
|
||||
<span
|
||||
className={styles.projectItemTitle}
|
||||
onClick={() => {
|
||||
handleSelect(id, name);
|
||||
handleSelect(id);
|
||||
}}
|
||||
>
|
||||
{name}
|
||||
@@ -195,11 +189,11 @@ const DomainListTree: FC<DomainListProps> = ({
|
||||
<div className={styles.domainList}>
|
||||
<div className={styles.searchContainer}>
|
||||
<Row style={{ gap: 10 }}>
|
||||
<Col flex="1 1 215px">
|
||||
<Col flex="1 1 150px">
|
||||
<Search
|
||||
allowClear
|
||||
className={styles.search}
|
||||
placeholder="请输入主题域名称"
|
||||
placeholder="请输入主题域"
|
||||
onSearch={onSearch}
|
||||
/>
|
||||
</Col>
|
||||
@@ -245,14 +239,4 @@ const DomainListTree: FC<DomainListProps> = ({
|
||||
);
|
||||
};
|
||||
|
||||
export default connect(
|
||||
({
|
||||
domainManger: { selectDomainId, selectDomainName, domainList },
|
||||
}: {
|
||||
domainManger: StateType;
|
||||
}) => ({
|
||||
selectDomainId,
|
||||
selectDomainName,
|
||||
domainList,
|
||||
}),
|
||||
)(DomainListTree);
|
||||
export default DomainListTree;
|
||||
|
||||
@@ -1,26 +1,18 @@
|
||||
import { Tabs, Breadcrumb, Space, Radio } from 'antd';
|
||||
import React, { useRef, useEffect, useState } from 'react';
|
||||
import { connect, history } from 'umi';
|
||||
|
||||
import { history, useModel } from '@umijs/max';
|
||||
import ClassDimensionTable from './ClassDimensionTable';
|
||||
import ClassMetricTable from './ClassMetricTable';
|
||||
import PermissionSection from './Permission/PermissionSection';
|
||||
// import ClassTagTable from '../Insights/components/ClassTagTable';
|
||||
import TagObjectTable from '../Insights/components/TagObjectTable';
|
||||
import TermTable from '../components/Term/TermTable';
|
||||
import OverView from './OverView';
|
||||
import styles from './style.less';
|
||||
import type { StateType } from '../model';
|
||||
import { HomeOutlined, FundViewOutlined } from '@ant-design/icons';
|
||||
import { ISemantic } from '../data';
|
||||
import SemanticGraphCanvas from '../SemanticGraphCanvas';
|
||||
// import HeadlessFlows from '../HeadlessFlows';
|
||||
// import SemanticFlows from '../SemanticFlows';
|
||||
import RecommendedQuestionsSection from '../components/Entity/RecommendedQuestionsSection';
|
||||
import View from '../View';
|
||||
// import DatabaseTable from '../components/Database/DatabaseTable';
|
||||
|
||||
import type { Dispatch } from 'umi';
|
||||
|
||||
type Props = {
|
||||
isModel: boolean;
|
||||
@@ -29,28 +21,24 @@ type Props = {
|
||||
handleModelChange: (model?: ISemantic.IModelItem) => void;
|
||||
onBackDomainBtnClick?: () => void;
|
||||
onMenuChange?: (menuKey: string) => void;
|
||||
domainManger: StateType;
|
||||
dispatch: Dispatch;
|
||||
};
|
||||
const DomainManagerTab: React.FC<Props> = ({
|
||||
isModel,
|
||||
activeKey,
|
||||
modelList,
|
||||
domainManger,
|
||||
handleModelChange,
|
||||
onBackDomainBtnClick,
|
||||
onMenuChange,
|
||||
}) => {
|
||||
const initState = useRef<boolean>(false);
|
||||
const defaultTabKey = 'metric';
|
||||
const {
|
||||
selectDomainId,
|
||||
selectModelId,
|
||||
selectModelName,
|
||||
selectDomainName,
|
||||
domainData,
|
||||
domainList,
|
||||
} = domainManger;
|
||||
|
||||
const domainModel = useModel('SemanticModel.domainData');
|
||||
const modelModel = useModel('SemanticModel.modelData');
|
||||
|
||||
const { selectDomainId, selectDomainName, selectDomain: domainData, domainList } = domainModel;
|
||||
const { selectModelId, selectModelName } = modelModel;
|
||||
|
||||
useEffect(() => {
|
||||
initState.current = false;
|
||||
}, [selectModelId]);
|
||||
@@ -238,7 +226,7 @@ const DomainManagerTab: React.FC<Props> = ({
|
||||
</Radio.Group>
|
||||
) : undefined,
|
||||
}}
|
||||
destroyInactiveTabPane
|
||||
// destroyInactiveTabPane
|
||||
size="large"
|
||||
onChange={(menuKey: string) => {
|
||||
onMenuChange?.(menuKey);
|
||||
@@ -248,6 +236,4 @@ const DomainManagerTab: React.FC<Props> = ({
|
||||
);
|
||||
};
|
||||
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(DomainManagerTab);
|
||||
export default DomainManagerTab;
|
||||
|
||||
@@ -3,8 +3,6 @@ import type { ColumnsType, TableRowSelection } from 'antd/es/table/interface';
|
||||
import type { TransferItem } from 'antd/es/transfer';
|
||||
import difference from 'lodash/difference';
|
||||
import React from 'react';
|
||||
import { connect } from 'umi';
|
||||
import type { StateType } from '../../model';
|
||||
import type { IChatConfig } from '../../data';
|
||||
import TransTypeTag from '../TransTypeTag';
|
||||
import { SemanticNodeType, TransType } from '../../enum';
|
||||
@@ -17,7 +15,6 @@ interface RecordType {
|
||||
}
|
||||
|
||||
type Props = {
|
||||
domainManger: StateType;
|
||||
knowledgeInfosMap?: IChatConfig.IKnowledgeInfosItemMap;
|
||||
onKnowledgeInfosMapChange?: (knowledgeInfosMap: IChatConfig.IKnowledgeInfosItemMap) => void;
|
||||
[key: string]: any;
|
||||
@@ -83,7 +80,7 @@ const DimensionMetricVisibleTableTransfer: React.FC<Props> = ({
|
||||
onItemSelect,
|
||||
selectedKeys: listSelectedKeys,
|
||||
}) => {
|
||||
const columns = direction === 'left' ? leftColumns : rightColumns;
|
||||
const columns:any = direction === 'left' ? leftColumns : rightColumns;
|
||||
const rowSelection: TableRowSelection<TransferItem> = {
|
||||
onSelectAll(selected, selectedRows) {
|
||||
const treeSelectedKeys = selectedRows.map(({ key }) => key);
|
||||
@@ -119,6 +116,4 @@ const DimensionMetricVisibleTableTransfer: React.FC<Props> = ({
|
||||
);
|
||||
};
|
||||
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(DimensionMetricVisibleTableTransfer);
|
||||
export default DimensionMetricVisibleTableTransfer;
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
import { useState, useEffect, forwardRef, useImperativeHandle } from 'react';
|
||||
import type { ForwardRefRenderFunction } from 'react';
|
||||
import { useState, useEffect } from 'react';
|
||||
import { Form, Switch, Space, Button, Tooltip, message, Select } from 'antd';
|
||||
import FormItemTitle from '@/components/FormHelper/FormItemTitle';
|
||||
import { useModel } from '@umijs/max';
|
||||
import { RedoOutlined, InfoCircleOutlined } from '@ant-design/icons';
|
||||
import DisabledWheelNumberInput from '@/components/DisabledWheelNumberInput';
|
||||
import { formLayout } from '@/components/FormHelper/utils';
|
||||
import { ProCard } from '@ant-design/pro-components';
|
||||
import { connect } from 'umi';
|
||||
import { ProCard } from '@ant-design/pro-components';
|
||||
import {
|
||||
DictTaskState,
|
||||
KnowledgeConfigTypeEnum,
|
||||
@@ -26,7 +25,6 @@ import {
|
||||
} from '../../service';
|
||||
import type { ISemantic } from '../../data';
|
||||
import type { StateType } from '../../model';
|
||||
import { isString } from 'lodash';
|
||||
import styles from '../style.less';
|
||||
import CommonEditList from '../../components/CommonEditList';
|
||||
|
||||
@@ -34,7 +32,6 @@ type Props = {
|
||||
dataItem: ISemantic.IDimensionItem | ISemantic.ITagItem;
|
||||
type?: KnowledgeConfigTypeEnum;
|
||||
onSubmit?: () => void;
|
||||
domainManger: StateType;
|
||||
};
|
||||
|
||||
const FormItem = Form.Item;
|
||||
@@ -42,11 +39,10 @@ const FormItem = Form.Item;
|
||||
const DimensionValueSettingForm: React.FC<Props> = ({
|
||||
dataItem,
|
||||
type = KnowledgeConfigTypeEnum.DIMENSION,
|
||||
domainManger,
|
||||
}) => {
|
||||
const [form] = Form.useForm();
|
||||
const { selectDomainId } = domainManger;
|
||||
const exchangeFields = ['blackList', 'whiteList'];
|
||||
const domainModel = useModel('SemanticModel.domainData');
|
||||
const { selectDomainId } = domainModel;
|
||||
const [dimensionVisible, setDimensionVisible] = useState<boolean>(false);
|
||||
const [taskItemState, setTaskItemState] = useState<ISemantic.IDictKnowledgeTaskItem>();
|
||||
const [saveLoading, setSaveLoading] = useState<boolean>(false);
|
||||
@@ -484,6 +480,4 @@ const DimensionValueSettingForm: React.FC<Props> = ({
|
||||
);
|
||||
};
|
||||
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(DimensionValueSettingForm);
|
||||
export default DimensionValueSettingForm;
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
import { message } from 'antd';
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { connect } from 'umi';
|
||||
import { useModel } from '@umijs/max';
|
||||
import type { StateType } from '../../model';
|
||||
import { getDomainExtendConfig, addDomainExtend, editDomainExtend } from '../../service';
|
||||
import { ProCard } from '@ant-design/pro-components';
|
||||
import { ProCard } from '@ant-design/pro-components';
|
||||
|
||||
import TextAreaCommonEditList from '../../components/CommonEditList/TextArea';
|
||||
|
||||
type Props = {
|
||||
domainManger: StateType;
|
||||
};
|
||||
type Props = {};
|
||||
|
||||
const RecommendedQuestionsSection: React.FC<Props> = ({ domainManger }) => {
|
||||
const { selectModelId: modelId } = domainManger;
|
||||
const RecommendedQuestionsSection: React.FC<Props> = ({}) => {
|
||||
const modelModel = useModel('SemanticModel.modelData');
|
||||
const { selectModelId: modelId } = modelModel;
|
||||
|
||||
const [questionData, setQuestionData] = useState<string[]>([]);
|
||||
const [currentRecordId, setCurrentRecordId] = useState<number>(0);
|
||||
@@ -85,6 +84,4 @@ const RecommendedQuestionsSection: React.FC<Props> = ({ domainManger }) => {
|
||||
</div>
|
||||
);
|
||||
};
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(RecommendedQuestionsSection);
|
||||
export default RecommendedQuestionsSection;
|
||||
|
||||
@@ -41,10 +41,10 @@ import { history } from 'umi';
|
||||
|
||||
export type CreateFormProps = {
|
||||
datasourceId?: number;
|
||||
domainId: number;
|
||||
modelId: number;
|
||||
domainId?: number;
|
||||
modelId?: number;
|
||||
createModalVisible: boolean;
|
||||
metricItem: any;
|
||||
metricItem?: ISemantic.IMetricItem;
|
||||
onCancel?: () => void;
|
||||
onSubmit?: (values: any) => void;
|
||||
};
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React, { useState, useRef, useEffect } from 'react';
|
||||
import { Input, Space, Tag } from 'antd';
|
||||
import { Input, Space, Tag, Divider } from 'antd';
|
||||
import { ProTable } from '@ant-design/pro-components';
|
||||
import { ProCard } from '@ant-design/pro-components';
|
||||
import SqlEditor from '@/components/SqlEditor';
|
||||
@@ -94,7 +94,7 @@ const MetricMeasuresFormTable: React.FC<Props> = ({
|
||||
{
|
||||
dataIndex: 'constraint',
|
||||
title: '限定条件',
|
||||
width: 250,
|
||||
width: 350,
|
||||
tooltip:
|
||||
'该限定条件用于在计算指标时限定口径,作用于度量,所用于过滤的维度必须在创建模型的时候被标记为日期或者维度,不需要加where关键字。比如:维度A="值1" and 维度B="值2"',
|
||||
render: (_: any, record: any) => {
|
||||
@@ -103,6 +103,7 @@ const MetricMeasuresFormTable: React.FC<Props> = ({
|
||||
<TextArea
|
||||
placeholder="请输入限定条件"
|
||||
value={constraint}
|
||||
style={{ height: 42 }}
|
||||
disabled={!selectedKeysMap[bizName]}
|
||||
onChange={(event) => {
|
||||
const { value } = event.target;
|
||||
@@ -129,7 +130,7 @@ const MetricMeasuresFormTable: React.FC<Props> = ({
|
||||
{
|
||||
dataIndex: 'agg',
|
||||
title: '聚合函数',
|
||||
width: 80,
|
||||
width: 150,
|
||||
},
|
||||
];
|
||||
|
||||
@@ -201,12 +202,13 @@ const MetricMeasuresFormTable: React.FC<Props> = ({
|
||||
},
|
||||
}}
|
||||
pagination={{ defaultPageSize: 10 }}
|
||||
size="small"
|
||||
// size="small"
|
||||
options={false}
|
||||
tableAlertRender={false}
|
||||
scroll={{ y: 500 }}
|
||||
scroll={{ y: 700 }}
|
||||
rowSelection={rowSelection}
|
||||
/>
|
||||
<Divider style={{ marginBottom: 0 }} />
|
||||
<ProCard
|
||||
title={<FormLabelRequire title="表达式" />}
|
||||
// tooltip="由于度量已自带聚合函数,因此通过度量创建指标时,表达式中无需再写聚合函数,如
|
||||
|
||||
@@ -3,10 +3,8 @@ import { ProTable } from '@ant-design/pro-components';
|
||||
import { message, Button, Space, Popconfirm, Input } from 'antd';
|
||||
import React, { useRef, useState, useEffect } from 'react';
|
||||
import { StatusEnum } from '../enum';
|
||||
import type { Dispatch } from 'umi';
|
||||
import { connect, history } from 'umi';
|
||||
import type { StateType } from '../model';
|
||||
import { deleteModel, updateModel } from '../service';
|
||||
import { useModel } from '@umijs/max';
|
||||
import { deleteModel, updateModel, batchUpdateModelStatus } from '../service';
|
||||
import ClassModelTypeModal from './ClassModelTypeModal';
|
||||
import { ColumnsConfig } from './TableColumnRender';
|
||||
import TableHeaderFilter from './TableHeaderFilter';
|
||||
@@ -18,18 +16,14 @@ type Props = {
|
||||
disabledEdit?: boolean;
|
||||
modelList: ISemantic.IModelItem[];
|
||||
onModelChange?: (model?: ISemantic.IModelItem) => void;
|
||||
dispatch: Dispatch;
|
||||
domainManger: StateType;
|
||||
};
|
||||
|
||||
const ModelTable: React.FC<Props> = ({
|
||||
modelList,
|
||||
disabledEdit = false,
|
||||
onModelChange,
|
||||
dispatch,
|
||||
domainManger,
|
||||
}) => {
|
||||
const { selectDomainId, modelTableHistoryParams } = domainManger;
|
||||
const ModelTable: React.FC<Props> = ({ modelList, disabledEdit = false, onModelChange }) => {
|
||||
const domainModel = useModel('SemanticModel.domainData');
|
||||
const modelModel = useModel('SemanticModel.modelData');
|
||||
const { selectDomainId } = domainModel;
|
||||
const { modelTableHistoryParams, setModelTableHistoryParams } = modelModel;
|
||||
|
||||
const [modelItem, setModelItem] = useState<ISemantic.IModelItem>();
|
||||
const [saveLoading, setSaveLoading] = useState<boolean>(false);
|
||||
const [filterParams, setFilterParams] = useState<Record<string, any>>({});
|
||||
@@ -63,12 +57,9 @@ const ModelTable: React.FC<Props> = ({
|
||||
}, []);
|
||||
|
||||
const dipatchParams = (params: Record<string, any>) => {
|
||||
dispatch({
|
||||
type: 'domainManger/setModelTableHistoryParams',
|
||||
payload: {
|
||||
[selectDomainId]: {
|
||||
...params,
|
||||
},
|
||||
setModelTableHistoryParams({
|
||||
[selectDomainId]: {
|
||||
...params,
|
||||
},
|
||||
});
|
||||
};
|
||||
@@ -81,17 +72,19 @@ const ModelTable: React.FC<Props> = ({
|
||||
}
|
||||
};
|
||||
|
||||
const updateModelStatus = async (modelData: ISemantic.IModelItem) => {
|
||||
setSaveLoading(true);
|
||||
const { code, msg } = await updateModel({
|
||||
...modelData,
|
||||
const queryBatchUpdateStatus = async (ids: React.Key[], status: StatusEnum) => {
|
||||
if (Array.isArray(ids) && ids.length === 0) {
|
||||
return;
|
||||
}
|
||||
const { code, msg } = await batchUpdateModelStatus({
|
||||
ids,
|
||||
status,
|
||||
});
|
||||
setSaveLoading(false);
|
||||
if (code === 200) {
|
||||
onModelChange?.();
|
||||
} else {
|
||||
message.error(msg);
|
||||
return;
|
||||
}
|
||||
message.error(msg);
|
||||
};
|
||||
|
||||
const columnsConfig = ColumnsConfig();
|
||||
@@ -178,10 +171,7 @@ const ModelTable: React.FC<Props> = ({
|
||||
type="link"
|
||||
key="editStatusOfflineBtn"
|
||||
onClick={() => {
|
||||
updateModelStatus({
|
||||
...record,
|
||||
status: StatusEnum.OFFLINE,
|
||||
});
|
||||
queryBatchUpdateStatus([record.id], StatusEnum.OFFLINE);
|
||||
}}
|
||||
>
|
||||
停用
|
||||
@@ -191,10 +181,7 @@ const ModelTable: React.FC<Props> = ({
|
||||
type="link"
|
||||
key="editStatusOnlineBtn"
|
||||
onClick={() => {
|
||||
updateModelStatus({
|
||||
...record,
|
||||
status: StatusEnum.ONLINE,
|
||||
});
|
||||
queryBatchUpdateStatus([record.id], StatusEnum.ONLINE);
|
||||
}}
|
||||
>
|
||||
启用
|
||||
@@ -308,6 +295,4 @@ const ModelTable: React.FC<Props> = ({
|
||||
</>
|
||||
);
|
||||
};
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(ModelTable);
|
||||
export default ModelTable;
|
||||
|
||||
@@ -1,16 +1,11 @@
|
||||
import React from 'react';
|
||||
import { ISemantic } from '../data';
|
||||
import { connect } from 'umi';
|
||||
import type { Dispatch } from 'umi';
|
||||
import type { StateType } from '../model';
|
||||
import ModelTable from './ModelTable';
|
||||
|
||||
type Props = {
|
||||
disabledEdit?: boolean;
|
||||
modelList: ISemantic.IModelItem[];
|
||||
onModelChange?: (model?: ISemantic.IModelItem) => void;
|
||||
domainManger: StateType;
|
||||
dispatch: Dispatch;
|
||||
};
|
||||
|
||||
const OverView: React.FC<Props> = ({ modelList, disabledEdit = false, onModelChange }) => {
|
||||
@@ -21,6 +16,4 @@ const OverView: React.FC<Props> = ({ modelList, disabledEdit = false, onModelCha
|
||||
);
|
||||
};
|
||||
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(OverView);
|
||||
export default OverView
|
||||
|
||||
@@ -2,33 +2,27 @@ import React, { useState, useEffect } from 'react';
|
||||
import { Form, Input, Switch, message } from 'antd';
|
||||
import SelectPartner from '@/components/SelectPartner';
|
||||
import SelectTMEPerson from '@/components/SelectTMEPerson';
|
||||
import { connect } from 'umi';
|
||||
import type { Dispatch } from 'umi';
|
||||
import type { StateType } from '../../model';
|
||||
import { useModel } from '@umijs/max';
|
||||
import FormItemTitle from '@/components/FormHelper/FormItemTitle';
|
||||
import { updateDomain, updateModel, getDomainDetail, getModelDetail } from '../../service';
|
||||
|
||||
import styles from '../style.less';
|
||||
type Props = {
|
||||
permissionTarget: 'model' | 'domain';
|
||||
dispatch: Dispatch;
|
||||
domainManger: StateType;
|
||||
onSubmit?: (data?: any) => void;
|
||||
onValuesChange?: (value, values) => void;
|
||||
};
|
||||
|
||||
const FormItem = Form.Item;
|
||||
|
||||
const PermissionAdminForm: React.FC<Props> = ({
|
||||
permissionTarget,
|
||||
domainManger,
|
||||
onValuesChange,
|
||||
}) => {
|
||||
const PermissionAdminForm: React.FC<Props> = ({ permissionTarget, onValuesChange }) => {
|
||||
const [form] = Form.useForm();
|
||||
const [isOpenState, setIsOpenState] = useState<boolean>(true);
|
||||
const [classDetail, setClassDetail] = useState<any>({});
|
||||
const { selectModelId: modelId, selectDomainId } = domainManger;
|
||||
const { APP_TARGET } = process.env;
|
||||
const domainModel = useModel('SemanticModel.domainData');
|
||||
const modelModel = useModel('SemanticModel.modelData');
|
||||
const { selectDomainId } = domainModel;
|
||||
const { selectModelId: modelId } = modelModel;
|
||||
|
||||
const queryClassDetail = async () => {
|
||||
const selectId = permissionTarget === 'model' ? modelId : selectDomainId;
|
||||
@@ -146,6 +140,4 @@ const PermissionAdminForm: React.FC<Props> = ({
|
||||
);
|
||||
};
|
||||
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(PermissionAdminForm);
|
||||
export default PermissionAdminForm;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import React, { useEffect, useState, useRef } from 'react';
|
||||
import { Button, message, Form, Space, Drawer, Input } from 'antd';
|
||||
import { ProCard } from '@ant-design/pro-components';
|
||||
import { connect } from 'umi';
|
||||
import { useModel } from 'umi';
|
||||
import { createGroupAuth, updateGroupAuth } from '../../service';
|
||||
import PermissionCreateForm from './PermissionCreateForm';
|
||||
import type { StateType } from '../../model';
|
||||
@@ -12,7 +12,6 @@ import { wrapperTransTypeAndId } from '../../utils';
|
||||
import styles from '../style.less';
|
||||
|
||||
type Props = {
|
||||
domainManger: StateType;
|
||||
permissonData: any;
|
||||
onCancel: () => void;
|
||||
visible: boolean;
|
||||
@@ -21,13 +20,19 @@ type Props = {
|
||||
const FormItem = Form.Item;
|
||||
const TextArea = Input.TextArea;
|
||||
const PermissionCreateDrawer: React.FC<Props> = ({
|
||||
domainManger,
|
||||
visible,
|
||||
permissonData,
|
||||
onCancel,
|
||||
onSubmit,
|
||||
}) => {
|
||||
const { dimensionList, metricList, selectModelId: modelId } = domainManger;
|
||||
const modelModel = useModel('SemanticModel.modelData');
|
||||
const dimensionModel = useModel('SemanticModel.dimensionData');
|
||||
const metricModel = useModel('SemanticModel.metricData');
|
||||
|
||||
const { selectModelId: modelId } = modelModel;
|
||||
const { MdimensionList: dimensionList } = dimensionModel;
|
||||
const { MmetricList: metricList } = metricModel;
|
||||
|
||||
const [form] = Form.useForm();
|
||||
const basicInfoFormRef = useRef<any>(null);
|
||||
const [selectedDimensionKeyList, setSelectedDimensionKeyList] = useState<string[]>([]);
|
||||
@@ -217,6 +222,4 @@ const PermissionCreateDrawer: React.FC<Props> = ({
|
||||
);
|
||||
};
|
||||
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(PermissionCreateDrawer);
|
||||
export default PermissionCreateDrawer;
|
||||
|
||||
@@ -1,16 +1,11 @@
|
||||
import { Space } from 'antd';
|
||||
import React from 'react';
|
||||
import type { Dispatch } from 'umi';
|
||||
import { connect } from 'umi';
|
||||
import type { StateType } from '../../model';
|
||||
import { ProCard } from '@ant-design/pro-components';
|
||||
import { ProCard } from '@ant-design/pro-components';
|
||||
import PermissionTable from './PermissionTable';
|
||||
import PermissionAdminForm from './PermissionAdminForm';
|
||||
|
||||
type Props = {
|
||||
permissionTarget: 'model' | 'domain';
|
||||
dispatch: Dispatch;
|
||||
domainManger: StateType;
|
||||
};
|
||||
|
||||
const PermissionSection: React.FC<Props> = ({ permissionTarget }) => {
|
||||
@@ -27,6 +22,4 @@ const PermissionSection: React.FC<Props> = ({ permissionTarget }) => {
|
||||
</>
|
||||
);
|
||||
};
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(PermissionSection);
|
||||
export default PermissionSection;
|
||||
|
||||
@@ -2,24 +2,29 @@ import type { ActionType, ProColumns } from '@ant-design/pro-components';
|
||||
import { ProTable } from '@ant-design/pro-components';
|
||||
import { message, Button, Space, Popconfirm, Tooltip } from 'antd';
|
||||
import React, { useRef, useState, useEffect } from 'react';
|
||||
import type { Dispatch } from 'umi';
|
||||
import { connect } from 'umi';
|
||||
import type { StateType } from '../../model';
|
||||
import { useModel } from '@umijs/max';
|
||||
import { getGroupAuthInfo, removeGroupAuth } from '../../service';
|
||||
import { getOrganizationTree } from '@/components/SelectPartner/service';
|
||||
import { getAllUser } from '@/components/SelectTMEPerson/service';
|
||||
import PermissionCreateDrawer from './PermissionCreateDrawer';
|
||||
import { findDepartmentTree } from '@/pages/SemanticModel/utils';
|
||||
|
||||
type Props = {
|
||||
dispatch: Dispatch;
|
||||
domainManger: StateType;
|
||||
};
|
||||
type Props = {};
|
||||
|
||||
const PermissionTable: React.FC<Props> = ({ domainManger }) => {
|
||||
const PermissionTable: React.FC<Props> = ({}) => {
|
||||
const { APP_TARGET } = process.env;
|
||||
const isInner = APP_TARGET === 'inner';
|
||||
const { dimensionList, metricList, selectModelId: modelId } = domainManger;
|
||||
|
||||
const modelModel = useModel('SemanticModel.modelData');
|
||||
const dimensionModel = useModel('SemanticModel.dimensionData');
|
||||
const metricModel = useModel('SemanticModel.metricData');
|
||||
const allUserModel = useModel('allUserData');
|
||||
const { allUserList, MrefreshUserList } = allUserModel;
|
||||
|
||||
const { selectModelId: modelId } = modelModel;
|
||||
const { MdimensionList: dimensionList } = dimensionModel;
|
||||
const { MmetricList: metricList } = metricModel;
|
||||
|
||||
const [createModalVisible, setCreateModalVisible] = useState<boolean>(false);
|
||||
|
||||
const [permissonData, setPermissonData] = useState<any>({});
|
||||
@@ -59,16 +64,19 @@ const PermissionTable: React.FC<Props> = ({ domainManger }) => {
|
||||
};
|
||||
|
||||
const queryTmePersonData = async () => {
|
||||
const { code, data } = await getAllUser();
|
||||
if (code === 200 || Number(code) === 0) {
|
||||
setTmePerson(data);
|
||||
}
|
||||
const list = await MrefreshUserList();
|
||||
|
||||
setTmePerson(list);
|
||||
};
|
||||
useEffect(() => {
|
||||
if (isInner) {
|
||||
queryDepartmentData();
|
||||
}
|
||||
queryTmePersonData();
|
||||
if (Array.isArray(allUserList) && allUserList.length > 0) {
|
||||
setTmePerson(allUserList);
|
||||
} else {
|
||||
queryTmePersonData();
|
||||
}
|
||||
}, []);
|
||||
|
||||
const columns: ProColumns[] = [
|
||||
@@ -273,6 +281,4 @@ const PermissionTable: React.FC<Props> = ({ domainManger }) => {
|
||||
</>
|
||||
);
|
||||
};
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(PermissionTable);
|
||||
export default PermissionTable;
|
||||
|
||||
@@ -2,10 +2,9 @@ import type { ActionType, ProColumns } from '@ant-design/pro-components';
|
||||
import { ProTable } from '@ant-design/pro-components';
|
||||
import { message, Button, Space, Popconfirm, Typography } from 'antd';
|
||||
import React, { useRef, useState, useEffect } from 'react';
|
||||
import { connect } from 'umi';
|
||||
import type { StateType } from '../../model';
|
||||
import { useModel } from '@umijs/max';
|
||||
import { getTermList, saveOrUpdate, deleteTerm } from '../../service';
|
||||
|
||||
import dayjs from 'dayjs';
|
||||
import styles from '../style.less';
|
||||
import { ISemantic } from '../../data';
|
||||
import { ColumnsConfig } from '../../components/TableColumnRender';
|
||||
@@ -13,12 +12,11 @@ import TermCreateForm from './TermCreateForm';
|
||||
|
||||
const { Paragraph } = Typography;
|
||||
|
||||
type Props = {
|
||||
domainManger: StateType;
|
||||
};
|
||||
type Props = {};
|
||||
|
||||
const TermTable: React.FC<Props> = ({ domainManger }) => {
|
||||
const { selectDomainId } = domainManger;
|
||||
const TermTable: React.FC<Props> = ({}) => {
|
||||
const domainModel = useModel('SemanticModel.domainData');
|
||||
const { selectDomainId } = domainModel;
|
||||
const [createModalVisible, setCreateModalVisible] = useState<boolean>(false);
|
||||
const [termItem, setTermItem] = useState<ISemantic.ITermItem>();
|
||||
|
||||
@@ -96,7 +94,7 @@ const TermTable: React.FC<Props> = ({ domainManger }) => {
|
||||
dataIndex: 'alias',
|
||||
title: '近义词',
|
||||
search: false,
|
||||
render: (_: string[]) => {
|
||||
render: (_) => {
|
||||
const alias = Array.isArray(_) ? _.join(',') : '-';
|
||||
return (
|
||||
<Paragraph ellipsis={{ tooltip: alias, rows: 3 }} style={{ width: 350, marginBottom: 0 }}>
|
||||
@@ -106,11 +104,24 @@ const TermTable: React.FC<Props> = ({ domainManger }) => {
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
dataIndex: 'createdBy',
|
||||
title: '创建人',
|
||||
search: false,
|
||||
},
|
||||
{
|
||||
dataIndex: 'updatedAt',
|
||||
title: '更新时间',
|
||||
search: false,
|
||||
render: (value: any) => {
|
||||
return value && value !== '-' ? dayjs(value).format('YYYY-MM-DD HH:mm:ss') : '-';
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
dataIndex: 'description',
|
||||
title: '描述',
|
||||
search: false,
|
||||
render: columnsConfig.description.render,
|
||||
},
|
||||
|
||||
{
|
||||
@@ -194,6 +205,4 @@ const TermTable: React.FC<Props> = ({ domainManger }) => {
|
||||
</>
|
||||
);
|
||||
};
|
||||
export default connect(({ domainManger }: { domainManger: StateType }) => ({
|
||||
domainManger,
|
||||
}))(TermTable);
|
||||
export default TermTable;
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
position: relative;
|
||||
.sider {
|
||||
flex: 0 0 auto;
|
||||
width: 285px;
|
||||
width: 250px;
|
||||
border-right: 5px solid #eee;
|
||||
position: relative;
|
||||
transition: all 0.2s,background 0s;
|
||||
@@ -81,7 +81,7 @@
|
||||
}
|
||||
}
|
||||
.search {
|
||||
width: 205px;
|
||||
width: 175px;
|
||||
margin: 10px 0 10px 16px;
|
||||
}
|
||||
|
||||
@@ -235,7 +235,7 @@
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
.searchContainer {
|
||||
width: 280px;
|
||||
width: 250px;
|
||||
padding:3px 0;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
@@ -369,12 +369,12 @@
|
||||
|
||||
.desc {
|
||||
margin: 0;
|
||||
padding: 25px;
|
||||
// padding: 25px;
|
||||
color: #667085;
|
||||
font-size: 14px;
|
||||
border-bottom: 1px solid #eee;
|
||||
border-top: 1px solid #eee;
|
||||
margin-bottom: 10px;
|
||||
// border-bottom: 1px solid #eee;
|
||||
// border-top: 1px solid #eee;
|
||||
// margin-bottom: 10px;
|
||||
.markerTag {
|
||||
color: #2499ef;
|
||||
font-size: 14px;
|
||||
@@ -398,4 +398,90 @@
|
||||
width: max-content;
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.infoCard {
|
||||
min-height: 100%;
|
||||
background-color: rgb(255, 255, 255);
|
||||
color: rgb(38, 38, 38);
|
||||
transition: box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
|
||||
position: relative;
|
||||
border: 1px solid rgb(230, 235, 241);
|
||||
border-radius: 4px;
|
||||
box-shadow: inherit;
|
||||
.infoCardTitle {
|
||||
display: flex;
|
||||
border-bottom: 1px solid #e6ebf1;
|
||||
padding: 20px 20px 20px 40px;
|
||||
align-items: center;
|
||||
color: rgb(38, 38, 38);
|
||||
margin: 0px;
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
line-height: 1.57;
|
||||
font-family: "tencentFont", sans-serif;
|
||||
}
|
||||
.infoCardContainer {
|
||||
padding: 20px;
|
||||
height: calc(100vh - 260px);
|
||||
overflow: scroll;
|
||||
}
|
||||
.infoCardFooter {
|
||||
border-top: 1px solid #e6ebf1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
flex: 0 0 auto;
|
||||
padding: 20px;
|
||||
.infoCardFooterContainer {
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-flow: wrap;
|
||||
// width: 100%;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.supersonicForm {
|
||||
padding: 0 20px;
|
||||
:global {
|
||||
.ant-input-search .ant-input-search-button {
|
||||
height: 42px;
|
||||
}
|
||||
.ant-form-item .ant-form-item-label > label {
|
||||
color:#262626;
|
||||
}
|
||||
.ant-form-item-label {
|
||||
font-family: "tencentFont", sans-serif;
|
||||
}
|
||||
.ant-input {
|
||||
padding: 9px 14px 9px 12px;
|
||||
}
|
||||
.ant-select {
|
||||
&.ant-select-single {
|
||||
height: auto;
|
||||
}
|
||||
&.ant-select-multiple {
|
||||
.ant-select-selector {
|
||||
padding: 6px 14px 6px 12px;
|
||||
}
|
||||
}
|
||||
.ant-select-selector {
|
||||
padding: 5px 14px 5px 12px;
|
||||
.ant-select-selection-placeholder {
|
||||
padding: 0px 8px 0px 8px;
|
||||
}
|
||||
.ant-select-selection-overflow-item {
|
||||
.ant-select-selection-item {
|
||||
color: rgb(22, 119, 255);
|
||||
background-color: rgb(230, 244, 255);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user