diff --git a/webapp/packages/supersonic-fe/src/components/FormHelper/FormItemTitle.tsx b/webapp/packages/supersonic-fe/src/components/FormHelper/FormItemTitle.tsx index 09bca627f..2e572ab1f 100644 --- a/webapp/packages/supersonic-fe/src/components/FormHelper/FormItemTitle.tsx +++ b/webapp/packages/supersonic-fe/src/components/FormHelper/FormItemTitle.tsx @@ -1,15 +1,43 @@ -import { Space } from 'antd'; +import { Space, Typography } from 'antd'; import { ReactNode } from 'react'; +import styles from './index.less'; export interface IProps { title: string | ReactNode; subTitle?: string; + subTitleEditable?: boolean; + onSubTitleChange?: (title: string) => void; } -const FormItemTitle: React.FC = ({ title, subTitle }) => { +const { Paragraph } = Typography; + +const FormItemTitle: React.FC = ({ + title, + subTitle, + subTitleEditable = false, + onSubTitleChange, +}) => { return ( - - {title} - {subTitle && {subTitle}} + //
+ + //
+ +
{title}
+
+ {subTitleEditable ? ( + { + onSubTitleChange?.(title); + }, + }} + > + {subTitle || '添加描述'} + + ) : ( + subTitle && {subTitle} + )} +
); }; diff --git a/webapp/packages/supersonic-fe/src/components/FormHelper/index.less b/webapp/packages/supersonic-fe/src/components/FormHelper/index.less index 6e2788896..53da3a121 100644 --- a/webapp/packages/supersonic-fe/src/components/FormHelper/index.less +++ b/webapp/packages/supersonic-fe/src/components/FormHelper/index.less @@ -1,39 +1,13 @@ -.normalState { - position: static; - height: 100%; - - .backNormal { - display: none; - } -} - -.maxState { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 999; - - .innerWrap { - position: absolute; - right: 0; - bottom: 0; - left: 0; - background: #fff; - } - - .backNormal { - display: block; - height: 30px; - padding-right: 20px; - color: #02a7f0; - font-size: 22px; - line-height: 30px; - text-align: right; - - .fullscreenExitIcon { - cursor: pointer; +.subTitleContainer { + width: 500px; + :global { + .ant-typography{ + font-size: 12px; + color: #6a6a6a; + } + .ant-typography-edit-content { + margin-left: 12px; + margin-top: 8px; } } -} +} \ No newline at end of file diff --git a/webapp/packages/supersonic-fe/src/global.less b/webapp/packages/supersonic-fe/src/global.less index 279eeef5c..54de84b5a 100644 --- a/webapp/packages/supersonic-fe/src/global.less +++ b/webapp/packages/supersonic-fe/src/global.less @@ -88,6 +88,10 @@ ol { padding: 24px !important; } +.ant-modal-body { + padding: 24px; +} + .ant-pro-page-container-children-content { margin: 12px 12px 0 !important; } diff --git a/webapp/packages/supersonic-fe/src/pages/Login/components/ForgetPwdForm.tsx b/webapp/packages/supersonic-fe/src/pages/Login/components/ForgetPwdForm.tsx index 5d8e48211..714baa7d6 100644 --- a/webapp/packages/supersonic-fe/src/pages/Login/components/ForgetPwdForm.tsx +++ b/webapp/packages/supersonic-fe/src/pages/Login/components/ForgetPwdForm.tsx @@ -54,7 +54,7 @@ const ForgetPwdForm: React.FC = (props) => { return ( = (props) => { return ( = () => { - // const isModelItem = [ - // { - // label: '指标模式', - // key: 'metric', - // children: , - // }, - // { - // label: '实体模式', - // key: 'dimenstion', - // children: , - // }, - // { - // label: '推荐问题', - // key: 'recommendedQuestions', - // children: , - // }, - // ]; - return (
- {/* */} - +
diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/ChatSetting/ChatSettingTab.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/ChatSetting/ChatSettingTab.tsx index b2008fb81..4928b400a 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/ChatSetting/ChatSettingTab.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/ChatSetting/ChatSettingTab.tsx @@ -41,7 +41,7 @@ const ChatSetting: React.FC = ({ children: , }, { - label: '实体模式', + label: '标签模式', key: 'dimenstion', children: , }, diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceCreateForm.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceCreateForm.tsx index d1ced256c..ee9c9681e 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceCreateForm.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceCreateForm.tsx @@ -1,7 +1,7 @@ -import React, { ReactNode, useEffect, useRef, useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import { Form, Button, Modal, Steps, message } from 'antd'; import DataSourceBasicForm from './DataSourceBasicForm'; -import FieldForm from './DataSourceFieldForm'; +import DataSourceFieldForm from './DataSourceFieldForm'; import { formLayout } from '@/components/FormHelper/utils'; import { EnumDataSourceType } from '../constants'; import styles from '../style.less'; @@ -94,6 +94,8 @@ const DataSourceCreateForm: React.FC = ({ name, isCreateMetric: createMetric, dateFormat, + entityNames, + isTag, } = item; const isCreateDimension = createDimension ? 1 : 0; const isCreateMetric = createMetric ? 1 : 0; @@ -104,6 +106,7 @@ const DataSourceCreateForm: React.FC = ({ type, isCreateDimension, name, + isTag: isTag ? 1 : 0, }); break; case EnumDataSourceType.TIME: @@ -125,6 +128,7 @@ const DataSourceCreateForm: React.FC = ({ bizName, name, type, + entityNames, }); break; case EnumDataSourceType.MEASURES: @@ -325,7 +329,7 @@ const DataSourceCreateForm: React.FC = ({ return ( <>
- { @@ -410,7 +414,7 @@ const DataSourceCreateForm: React.FC = ({ { ? 'isCreateDimension' : 'isCreateMetric'; return isCreateName; - // const editState = !isUndefined(record[isCreateName]) ? !!record[isCreateName] : true; }; const FieldForm: React.FC = ({ fields, sql, onFieldChange, onSqlChange }) => { @@ -117,9 +118,31 @@ const FieldForm: React.FC = ({ fields, sql, onFieldChange, onSqlChange }) { title: '扩展配置', dataIndex: 'extender', - width: 180, + width: 185, render: (_: any, record: FieldItem) => { const { type } = record; + if (type === EnumDataSourceType.PRIMARY) { + const entityNames = + fields.find((field) => field.bizName === record.bizName)?.entityNames || []; + return ( + + ); } + if (type === EnumDataSourceType.CATEGORICAL) { + const isTag = fields.find((field) => field.bizName === record.bizName)?.isTag; + return ( + + 设为标签 + { + handleFieldChange(record, 'isTag', value); + }} + /> + + + + + ); + } if (type === EnumDataSourceType.TIME) { const dateFormat = fields.find((field) => field.bizName === record.bizName)?.dateFormat; const timeGranularity = fields.find( @@ -222,7 +264,6 @@ const FieldForm: React.FC = ({ fields, sql, onFieldChange, onSqlChange }) [isCreateName]: value, }); } else { - // handleFieldChange(record, isCreateName, value); onFieldChange(record.bizName, { ...record, checked: value, @@ -237,7 +278,6 @@ const FieldForm: React.FC = ({ fields, sql, onFieldChange, onSqlChange }) disabled={!editState} onChange={(e) => { const value = e.target.value; - // handleFieldChange(record, 'name', value); onFieldChange(record.bizName, { ...record, name: value, diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer.tsx index 284222946..0b0ac789e 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer.tsx @@ -5,7 +5,7 @@ import DomainListTree from './components/DomainList'; import styles from './components/style.less'; import type { StateType } from './model'; -import { DownOutlined, LeftOutlined } from '@ant-design/icons'; +import { LeftOutlined, RightOutlined } from '@ant-design/icons'; import { ISemantic } from './data'; import { getDomainList, getModelList } from './service'; import ChatSettingTab from './ChatSetting/ChatSettingTab'; @@ -24,17 +24,12 @@ const OverviewContainer: React.FC = ({ mode, domainManger, dispatch }) => const modelId = params.modelId; const menuKey = params.menuKey ? params.menuKey : !Number(modelId) ? 'overview' : ''; - const { selectDomainId, selectModelId, selectDomainName, selectModelName, domainList } = - domainManger; + const { selectDomainId, selectModelId, domainList } = domainManger; const [modelList, setModelList] = useState([]); const [isModel, setIsModel] = useState(false); - const [open, setOpen] = useState(false); + const [collapsedState, setCollapsedState] = useState(true); const [activeKey, setActiveKey] = useState(menuKey); - const handleOpenChange = (newOpen: boolean) => { - setOpen(newOpen); - }; - const initSelectedDomain = (domainList: ISemantic.IDomainItem[]) => { const targetNode = domainList.filter((item: any) => { return `${item.id}` === domainId; @@ -198,39 +193,43 @@ const OverviewContainer: React.FC = ({ mode, domainManger, dispatch }) => }); }; + const handleCollapsedBtn = () => { + setCollapsedState(!collapsedState); + }; + return (
-
- {/*
- - {selectDomainName ? `${selectDomainName}` : '主题域信息'} - {selectModelName && ( - <> - | - {selectModelName} - - )} - -
*/} - { - setOpen(false); - const { id, name } = domainData; - cleanModelInfo(id); - dispatch({ - type: 'domainManger/setSelectDomain', - selectDomainId: id, - selectDomainName: name, - domainData, - }); +
+
+ { + const { id, name } = domainData; + cleanModelInfo(id); + dispatch({ + type: 'domainManger/setSelectDomain', + selectDomainId: id, + selectDomainName: name, + domainData, + }); + }} + onTreeDataUpdate={() => { + initProjectTree(); + }} + /> +
+ +
{ + handleCollapsedBtn(); }} - onTreeDataUpdate={() => { - initProjectTree(); - }} - /> + > + {collapsedState ? : } +
+ {/* */}
{selectDomainId ? ( diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDataSourceTable.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDataSourceTable.tsx index 663d435bc..1e1504ec4 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDataSourceTable.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDataSourceTable.tsx @@ -55,6 +55,7 @@ const ClassDataSourceTable: React.FC = ({ dispatch, domainManger }) => { title: '操作', dataIndex: 'x', valueType: 'option', + width: 100, render: (_, record) => { return ( diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDataSourceTypeModal.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDataSourceTypeModal.tsx index af7cf934e..14116e269 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDataSourceTypeModal.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDataSourceTypeModal.tsx @@ -8,6 +8,7 @@ import { excuteSql } from '../service'; import type { StateType } from '../model'; import DataSource from '../Datasource'; import { IDataSource } from '../data'; +import styles from './style.less'; const { Meta } = Card; type Props = { @@ -95,6 +96,7 @@ const ClassDataSourceTypeModal: React.FC = ({ return ( <> { setCreateDataSourceModalOpen(false); diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDimensionTable.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDimensionTable.tsx index 03f607a66..3be4ec9b3 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDimensionTable.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDimensionTable.tsx @@ -1,6 +1,6 @@ import type { ActionType, ProColumns } from '@ant-design/pro-table'; import ProTable from '@ant-design/pro-table'; -import { message, Button, Space, Popconfirm, Input, Tag, Dropdown } from 'antd'; +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'; @@ -168,6 +168,31 @@ const ClassDimensionTable: React.FC = ({ domainManger, dispatch }) => { width: 80, valueEnum: SENSITIVE_LEVEL_ENUM, }, + { + dataIndex: 'isTag', + title: '是否为标签', + // search: false, + renderFormItem: () => ( + = ( } return false; }} - placeholder="请选择展示维度/指标信息" + placeholder="请选择圈选结果展示字段" options={dataItemListOptions} /> )} - {chatConfigType === ChatConfigType.AGG && ( - <> - {/* - } - > - { - const { label } = item; - if (label.includes(inputValue)) { - return true; - } - return false; - }} - placeholder="请选择同环比指标" - options={metricListOptions} - /> - */} - - )} ; +// type TaskStateMap = Record; const DimensionMetricVisibleTableTransfer: React.FC = ({ - domainManger, + // domainManger, knowledgeInfosMap, - onKnowledgeInfosMapChange, + // onKnowledgeInfosMapChange, ...restProps }) => { - // const { selectModelId: modelId } = domainManger; - // const [dimensionValueSettingModalVisible, setDimensionValueSettingModalVisible] = - // useState(false); - // const [currentRecord, setCurrentRecord] = useState({} as RecordType); - // const [currentDimensionSettingFormData, setCurrentDimensionSettingFormData] = - // useState(); - - // const [recordLoadingMap, setRecordLoadingMap] = useState>({}); - - // const [taskStateMap, setTaskStateMap] = useState({}); - - // useEffect(() => { - // queryDictLatestTaskList(); - // }, []); - - // const updateKnowledgeInfosMap = (record: RecordType, updateData: Record) => { - // const { bizName, id } = record; - // const knowledgeMap = { - // ...knowledgeInfosMap, - // }; - // const target = knowledgeMap[bizName]; - // if (target) { - // knowledgeMap[bizName] = { - // ...target, - // ...updateData, - // }; - // } else { - // knowledgeMap[bizName] = { - // itemId: id, - // bizName, - // ...updateData, - // }; - // } - // onKnowledgeInfosMapChange?.(knowledgeMap); - // }; - - // const queryDictLatestTaskList = async () => { - // const { code, data } = await searchDictLatestTaskList({ - // modelId, - // }); - // if (code !== 200) { - // message.error('获取字典导入任务失败!'); - // return; - // } - // const tastMap = data.reduce( - // (stateMap: TaskStateMap, item: { dimId: number; status: DictTaskState }) => { - // const { dimId, status } = item; - // stateMap[dimId] = status; - // return stateMap; - // }, - // {}, - // ); - // setTaskStateMap(tastMap); - // }; - - // const createDictTaskQuery = async (recordData: RecordType) => { - // setRecordLoadingMap({ - // ...recordLoadingMap, - // [recordData.id]: true, - // }); - // const { code } = await createDictTask({ - // updateMode: 'REALTIME_ADD', - // modelAndDimPair: { - // [modelId]: [recordData.id], - // }, - // }); - // setRecordLoadingMap({ - // ...recordLoadingMap, - // [recordData.id]: false, - // }); - // if (code !== 200) { - // message.error('字典导入任务创建失败!'); - // return; - // } - // setTimeout(() => { - // queryDictLatestTaskList(); - // }, 2000); - // }; - - // const deleteDictTask = async (recordData: RecordType) => { - // const { code } = await createDictTask({ - // updateMode: 'REALTIME_DELETE', - // modelAndDimPair: { - // [modelId]: [recordData.id], - // }, - // }); - // if (code !== 200) { - // message.error('删除字典导入任务创建失败!'); - // } - // }; - let rightColumns: ColumnsType = [ { dataIndex: 'name', @@ -141,104 +44,6 @@ const DimensionMetricVisibleTableTransfer: React.FC = ({ return ; }, }, - // { - // dataIndex: 'y', - // title: ( - // - // ), - // width: 120, - // render: (_: any, record: RecordType) => { - // const { type, bizName } = record; - // return type === TransType.DIMENSION ? ( - // { - // updateKnowledgeInfosMap(record, { searchEnable: e.target.checked }); - // if (!e.target.checked) { - // deleteDictTask(record); - // } - // }} - // onClick={(event) => { - // event.stopPropagation(); - // }} - // /> - // ) : ( - // <> - // ); - // }, - // }, - // { - // dataIndex: 'taskState', - // width: 130, - // title: ( - // - // 导入字典状态 - // { - // queryDictLatestTaskList(); - // }} - // > - // - // - // - // - // - // ), - // render: (_, record) => { - // const { id, type } = record; - // const target = taskStateMap[id]; - // if (type === TransType.DIMENSION && target) { - // return DictTaskState[target] || '未知状态'; - // } - // return '--'; - // }, - // }, - // { - // title: '操作', - // dataIndex: 'x', - // render: (_: any, record: RecordType) => { - // const { type, bizName, id } = record; - // return type === TransType.DIMENSION ? ( - // - // - // - // - // ) : ( - // <> - // ); - // }, - // }, ]; const leftColumns: ColumnsType = [ @@ -299,17 +104,6 @@ const DimensionMetricVisibleTableTransfer: React.FC = ({ ); }} - {/* { - updateKnowledgeInfosMap(currentRecord, { knowledgeAdvancedConfig: formValues }); - setDimensionValueSettingModalVisible(false); - }} - onCancel={() => { - setDimensionValueSettingModalVisible(false); - }} - /> */} ); }; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionValueSettingForm.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionValueSettingForm.tsx index 7521fe483..561c9c690 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionValueSettingForm.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/Entity/DimensionValueSettingForm.tsx @@ -209,7 +209,7 @@ const DimensionValueSettingForm: ForwardRefRenderFunction = ( className={styles.form} > = ( {dimensionVisible && ( <> - + /> */}
void; -}; - -const FormItem = Form.Item; - -const EntityCreateForm: ForwardRefRenderFunction = ( - { modelData, dimensionList, modelId, onSubmit }, - ref, -) => { - const [form] = Form.useForm(); - const [dimensionListOptions, setDimensionListOptions] = useState([]); - const getFormValidateFields = async () => { - return await form.validateFields(); - }; - - useEffect(() => { - form.resetFields(); - if (!modelData?.entity) { - return; - } - const { entity } = modelData; - form.setFieldsValue({ - ...entity, - name: entity.names.join(','), - }); - }, [modelData]); - - useImperativeHandle(ref, () => ({ - getFormValidateFields, - })); - - useEffect(() => { - const dimensionEnum = dimensionList.map((item: ISemantic.IDimensionItem) => { - return { - label: item.name, - value: item.id, - }; - }); - setDimensionListOptions(dimensionEnum); - }, [dimensionList]); - - const saveEntity = async () => { - const values = await form.validateFields(); - const { name = '' } = values; - const { code, msg, data } = await updateModel({ - ...modelData, - entity: { - ...values, - names: name.split(','), - }, - id: modelId, - modelId, - }); - - if (code === 200) { - form.setFieldValue('id', data); - onSubmit?.(); - message.success('保存成功'); - return; - } - message.error(msg); - }; - - return ( - <> -
- - - - - -