import React, { useState, useRef, useEffect } from 'react'; 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'; import FormLabelRequire from './FormLabelRequire'; import styles from './style.less'; import { ISemantic } from '../data'; type Props = { datasourceId?: number; typeParams: ISemantic.IMeasureTypeParams; measuresList: ISemantic.IMeasure[]; onFieldChange: (measures: ISemantic.IMeasure[]) => void; onSqlChange: (sql: string) => void; }; const { TextArea } = Input; const MetricMeasuresFormTable: React.FC = ({ datasourceId, typeParams, measuresList, onFieldChange, onSqlChange, }) => { const actionRef = useRef(); const [tableData, setTableData] = useState([]); const [measuresParams, setMeasuresParams] = useState( typeParams || { expr: '', measures: [], }, ); const [selectedKeys, setSelectedKeys] = useState(() => { return measuresParams?.measures.map((item: ISemantic.IMeasure) => { return item.bizName; }); }); const [selectedKeysMap, setSelectedKeysMap] = useState>(() => { if (!Array.isArray(measuresParams?.measures)) { return {}; } return measuresParams.measures.reduce((keyMap: any, item: ISemantic.IMeasure) => { keyMap[item.bizName] = true; return keyMap; }, {}); }); const getTableData = () => { const datasource = datasourceId && Array.isArray(measuresList) ? measuresList.filter((item) => item.datasourceId === datasourceId) : measuresList; const { measures } = measuresParams; if (!Array.isArray(measures)) { return datasource; } const tableData = datasource.map((item) => { const { bizName } = item; const target = measures.find((measureItem) => measureItem.bizName === bizName); if (target) { return { ...item, constraint: target.constraint, }; } return item; }); return tableData; }; useEffect(() => { setTableData(getTableData()); }, [measuresList, measuresParams]); useEffect(() => { setMeasuresParams({ ...typeParams }); }, [typeParams]); const [exprString, setExprString] = useState(typeParams?.expr || ''); const columns = [ { dataIndex: 'bizName', title: '度量名称', tooltip: '由模型名称_字段名称拼接而来', }, { dataIndex: 'constraint', title: '限定条件', width: 350, tooltip: '该限定条件用于在计算指标时限定口径,作用于度量,所用于过滤的维度必须在创建模型的时候被标记为日期或者维度,不需要加where关键字。比如:维度A="值1" and 维度B="值2"', render: (_: any, record: any) => { const { constraint, bizName } = record; return (