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 { createGroupAuth, updateGroupAuth } from '../../service'; import PermissionCreateForm from './PermissionCreateForm'; import type { StateType } from '../../model'; import SqlEditor from '@/components/SqlEditor'; import { TransType } from '../../enum'; import DimensionMetricVisibleTransfer from '../Entity/DimensionMetricVisibleTransfer'; import { wrapperTransTypeAndId } from '../Entity/utils'; import styles from '../style.less'; type Props = { domainManger: StateType; permissonData: any; domainId: number; onCancel: () => void; visible: boolean; onSubmit: (params?: any) => void; }; const FormItem = Form.Item; const TextArea = Input.TextArea; const PermissionCreateDrawer: React.FC = ({ domainManger, visible, permissonData, domainId, onCancel, onSubmit, }) => { const { dimensionList, metricList } = domainManger; const [form] = Form.useForm(); const basicInfoFormRef = useRef(null); const [selectedDimensionKeyList, setSelectedDimensionKeyList] = useState([]); const [selectedMetricKeyList, setSelectedMetricKeyList] = useState([]); const [selectedKeyList, setSelectedKeyList] = useState([]); const saveAuth = async () => { const basicInfoFormValues = await basicInfoFormRef.current.formRef.validateFields(); const values = await form.validateFields(); const { dimensionFilters, dimensionFilterDescription } = values; const { authRules = [] } = permissonData; let target = authRules?.[0]; if (!target) { target = { dimensions: dimensionList }; } else { target.dimensions = dimensionList; } permissonData.authRules = [target]; let saveAuthQuery = createGroupAuth; if (basicInfoFormValues.groupId) { saveAuthQuery = updateGroupAuth; } const { code, msg } = await saveAuthQuery({ ...basicInfoFormValues, dimensionFilters: [dimensionFilters], dimensionFilterDescription, authRules: [ { dimensions: selectedDimensionKeyList, metrics: selectedMetricKeyList, }, ], domainId, }); if (code === 200) { onSubmit?.(); message.success('保存成功'); return; } message.error(msg); }; useEffect(() => { form.resetFields(); const { dimensionFilters, dimensionFilterDescription } = permissonData; form.setFieldsValue({ dimensionFilterDescription, dimensionFilters: Array.isArray(dimensionFilters) ? dimensionFilters[0] || '' : '', }); const dimensionAuth = permissonData?.authRules?.[0]?.dimensions || []; const metricAuth = permissonData?.authRules?.[0]?.metrics || []; setSelectedDimensionKeyList(dimensionAuth); setSelectedMetricKeyList(metricAuth); const dimensionKeys = dimensionList.reduce((dimensionChangeList: string[], item: any) => { if (dimensionAuth.includes(item.bizName)) { dimensionChangeList.push(wrapperTransTypeAndId(TransType.DIMENSION, item.id)); } return dimensionChangeList; }, []); const metricKeys = metricList.reduce((metricChangeList: string[], item: any) => { if (metricAuth.includes(item.bizName)) { metricChangeList.push(wrapperTransTypeAndId(TransType.METRIC, item.id)); } return metricChangeList; }, []); setSelectedKeyList([...dimensionKeys, ...metricKeys]); }, [permissonData]); const renderFooter = () => { return (
); }; return ( <>
{ const transType = TransType.DIMENSION; const { id } = item; return { ...item, transType, key: wrapperTransTypeAndId(transType, id), }; }), ...metricList.map((item) => { const transType = TransType.METRIC; const { id } = item; return { ...item, transType, key: wrapperTransTypeAndId(transType, id), }; }), ]} targetList={selectedKeyList} onChange={(newTargetKeys: string[]) => { setSelectedKeyList(newTargetKeys); const dimensionKeyChangeList = dimensionList.reduce( (dimensionChangeList: string[], item: any) => { if ( newTargetKeys.includes(wrapperTransTypeAndId(TransType.DIMENSION, item.id)) ) { dimensionChangeList.push(item.bizName); } return dimensionChangeList; }, [], ); const metricKeyChangeList = metricList.reduce( (metricChangeList: string[], item: any) => { if ( newTargetKeys.includes(wrapperTransTypeAndId(TransType.METRIC, item.id)) ) { metricChangeList.push(item.bizName); } return metricChangeList; }, [], ); setSelectedDimensionKeyList(dimensionKeyChangeList); setSelectedMetricKeyList(metricKeyChangeList); }} />