From aa86fc9275d0e2ed7a2e2101a871a8d3bc4297ff Mon Sep 17 00:00:00 2001 From: tristanliu <37809633+sevenliu1896@users.noreply.github.com> Date: Sat, 24 Feb 2024 16:40:09 +0800 Subject: [PATCH] [improvement][headless-fe] Added search functionality to the field list in model editing. (#754) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [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. --- .../components/DataSourceFieldForm.tsx | 36 +++++++++++++-- .../Entity/DimensionValueSettingForm.tsx | 2 + .../components/MetricFieldFormTable.tsx | 15 +++--- .../components/MetricMeasuresFormTable.tsx | 46 +++++++++++++------ .../components/MetricMetricFormTable.tsx | 40 +++++++++------- .../src/pages/SemanticModel/service.ts | 9 +++- 6 files changed, 109 insertions(+), 39 deletions(-) diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceFieldForm.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceFieldForm.tsx index 936a6edbf..d672a7754 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceFieldForm.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceFieldForm.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useState, useEffect } from 'react'; import { Table, Select, Checkbox, Input, Alert, Space, Tooltip, Form, Switch } from 'antd'; import TableTitleTooltips from '../../components/TableTitleTooltips'; import { isUndefined } from 'lodash'; @@ -26,7 +26,7 @@ type FieldItem = { entityNames?: string[]; isTag?: number; }; - +const { Search } = Input; const FormItem = Form.Item; type Props = { @@ -54,6 +54,19 @@ const DataSourceFieldForm: React.FC = ({ fields, sql, onFieldChange, onSq [fieldName]: value, }); }; + const [filterValue, setFliterValue] = useState(); + const [tableData, setTableData] = useState([]); + + useEffect(() => { + if (filterValue) { + const filterData = fields.filter((item) => { + return item.bizName.includes(filterValue); + }); + setTableData(filterData); + return; + } + setTableData(fields); + }, [fields]); const columns = [ { @@ -296,10 +309,27 @@ const DataSourceFieldForm: React.FC = ({ fields, sql, onFieldChange, onSq }, ]; + const onSearch = (value: any) => { + setFliterValue(value); + const filterData = fields.filter((item) => { + return item.bizName.includes(value); + }); + setTableData(filterData); + }; return ( <> +
+ +
+ - dataSource={fields} + dataSource={tableData} columns={columns} rowKey="bizName" virtual 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 f83fde732..60bf6a84a 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 @@ -9,6 +9,7 @@ import { getDomainExtendDetailConfig, addDomainExtend, editDomainExtend, + searchKnowledgeConfigQuery, searchDictLatestTaskList, createDictTask, } from '../../service'; @@ -83,6 +84,7 @@ const DimensionValueSettingForm: ForwardRefRenderFunction = ( const queryDictLatestTaskList = async () => { setRefreshLoading(true); + searchKnowledgeConfigQuery({ itemId: dimensionItem.id }); const { code, data } = await searchDictLatestTaskList({ modelId, }); diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricFieldFormTable.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricFieldFormTable.tsx index 9fc6d71ca..4da89399b 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricFieldFormTable.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricFieldFormTable.tsx @@ -20,7 +20,7 @@ const MetricFieldFormTable: React.FC = ({ onFieldChange, onSqlChange, }) => { - const [tableData, setTableData] = useState([]); + const [tableData, setTableData] = useState([]); const [defineTypeParams, setDefineTypeParams] = useState( typeParams || { @@ -49,7 +49,7 @@ const MetricFieldFormTable: React.FC = ({ }); }); - const [selectedKeysMap, setSelectedKeysMap] = useState<{}>(() => { + const [selectedKeysMap, setSelectedKeysMap] = useState>(() => { return defineTypeParams.fields.reduce((keyMap, item: any) => { keyMap[item.fieldName] = true; return keyMap; @@ -69,21 +69,24 @@ const MetricFieldFormTable: React.FC = ({ const rowSelection = { selectedRowKeys: selectedKeys, - onSelect: (record, selected) => { + onSelect: (record: ISemantic.IFieldTypeParamsItem, selected: boolean) => { const updateKeys = { ...selectedKeysMap, [record.fieldName]: selected }; + const selectedKeys: string[] = []; setSelectedKeysMap(updateKeys); const fieldList = Object.entries(updateKeys).reduce((list: any[], item) => { const [fieldName, selected] = item; if (selected) { + selectedKeys.push(fieldName); list.push({ fieldName }); } return list; }, []); + setSelectedKeys(selectedKeys); onFieldChange(fieldList); }, - onChange: (_selectedRowKeys: any[]) => { - setSelectedKeys([..._selectedRowKeys]); - }, + // onChange: (_selectedRowKeys: any[]) => { + // setSelectedKeys([..._selectedRowKeys]); + // }, }; return ( diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricMeasuresFormTable.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricMeasuresFormTable.tsx index 0cc2013be..a28442d07 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricMeasuresFormTable.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricMeasuresFormTable.tsx @@ -42,6 +42,13 @@ const MetricMeasuresFormTable: React.FC = ({ }); }); + const [selectedKeysMap, setSelectedKeysMap] = useState>(() => { + return measuresParams.measures.reduce((keyMap, item: any) => { + keyMap[item.bizName] = true; + return keyMap; + }, {}); + }); + useEffect(() => { const datasource = datasourceId && Array.isArray(measuresList) @@ -101,19 +108,32 @@ const MetricMeasuresFormTable: React.FC = ({ const rowSelection = { selectedRowKeys: selectedKeys, - onChange: (_selectedRowKeys: any[], items: ISemantic.IMeasure[]) => { - setSelectedKeys([..._selectedRowKeys]); - - const measures = items.map(({ bizName, name, expr, datasourceId, agg }) => { - return { - bizName, - name, - expr, - agg, - datasourceId, - }; - }); - onFieldChange?.(measures); + onSelect: (record: ISemantic.IMeasure, selected: boolean) => { + const datasource = + datasourceId && Array.isArray(measuresList) + ? measuresList.filter((item) => item.datasourceId === datasourceId) + : measuresList; + const updateKeys = { ...selectedKeysMap, [record.bizName]: selected }; + setSelectedKeysMap(updateKeys); + const selectedKeys: string[] = []; + const measures = datasource.reduce( + (list: any[], { bizName, name, expr, datasourceId, agg }) => { + if (updateKeys[bizName] === true) { + selectedKeys.push(bizName); + list.push({ + bizName, + name, + expr, + agg, + datasourceId, + }); + } + return list; + }, + [], + ); + setSelectedKeys(selectedKeys); + onFieldChange(measures); }, }; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricMetricFormTable.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricMetricFormTable.tsx index 640322139..39a2c434c 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricMetricFormTable.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricMetricFormTable.tsx @@ -56,6 +56,13 @@ const MetricMetricFormTable: React.FC = ({ }); }); + const [selectedKeysMap, setSelectedKeysMap] = useState>(() => { + return defineTypeParams.metrics.reduce((keyMap, item: any) => { + keyMap[item.bizName] = true; + return keyMap; + }, {}); + }); + const columns = [ { dataIndex: 'name', @@ -69,22 +76,23 @@ const MetricMetricFormTable: React.FC = ({ const rowSelection = { selectedRowKeys: selectedKeys, - onChange: (_selectedRowKeys: any[]) => { - setSelectedKeys([..._selectedRowKeys]); - onFieldChange( - metricList.reduce( - (metrics: ISemantic.IMetricTypeParamsItem[], item: ISemantic.IMetricItem) => { - if (_selectedRowKeys.includes(item.bizName)) { - metrics.push({ - bizName: item.bizName, - id: item.id, - }); - } - return metrics; - }, - [], - ), - ); + onSelect: (record: ISemantic.IMeasure, selected: boolean) => { + const updateKeys = { ...selectedKeysMap, [record.bizName]: selected }; + setSelectedKeysMap(updateKeys); + const selectedKeys: string[] = []; + const metrics = metricList.reduce((list: any[], item) => { + const { bizName, id } = item; + if (updateKeys[bizName] === true) { + selectedKeys.push(bizName); + list.push({ + bizName, + id, + }); + } + return list; + }, []); + setSelectedKeys(selectedKeys); + onFieldChange(metrics); }, }; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/service.ts b/webapp/packages/supersonic-fe/src/pages/SemanticModel/service.ts index 9ea62d61f..0121cc91c 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/service.ts +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/service.ts @@ -458,7 +458,14 @@ export function deleteDictTask(data: any): Promise { } export function searchDictLatestTaskList(data: any): Promise { - return request(`${process.env.CHAT_API_BASE_URL}dict/task/search/latest`, { + return request(`${process.env.API_BASE_URL}knowledge/task/search`, { + method: 'POST', + data, + }); +} + +export function searchKnowledgeConfigQuery(data: any): Promise { + return request(`${process.env.API_BASE_URL}knowledge/conf/query`, { method: 'POST', data, });