refactor(auto-group): 将内容库选择器替换为流量池选择器

将原有的内容库选择组件(ContentSelector)替换为流量池选择组件(PoolSelector),并更新相关类型定义和表单逻辑
This commit is contained in:
2025-08-21 16:58:12 +08:00
parent cfb752509a
commit eadb7a8f3e
3 changed files with 42 additions and 51 deletions

View File

@@ -6,21 +6,21 @@ import {
PoolPackageItem, PoolPackageItem,
} from "@/components/PoolSelection/data"; } from "@/components/PoolSelection/data";
interface ContentSelectorProps { interface PoolSelectorProps {
selectedContent: PoolSelectionItem[]; selectedPools: PoolSelectionItem[];
onNext: (data: { onNext: (data: {
contentGroups: string[]; poolGroups: string[];
contentGroupsOptions: PoolSelectionItem[]; poolGroupsOptions: PoolSelectionItem[];
}) => void; }) => void;
} }
export interface ContentSelectorRef { export interface PoolSelectorRef {
validate: () => Promise<boolean>; validate: () => Promise<boolean>;
getValues: () => any; getValues: () => any;
} }
const ContentSelector = forwardRef<ContentSelectorRef, ContentSelectorProps>( const PoolSelector = forwardRef<PoolSelectorRef, PoolSelectorProps>(
({ selectedContent, onNext }, ref) => { ({ selectedPools, onNext }, ref) => {
const [form] = Form.useForm(); const [form] = Form.useForm();
// 暴露方法给父组件 // 暴露方法给父组件
@@ -30,7 +30,7 @@ const ContentSelector = forwardRef<ContentSelectorRef, ContentSelectorProps>(
await form.validateFields(); await form.validateFields();
return true; return true;
} catch (error) { } catch (error) {
console.log("ContentSelector 表单验证失败:", error); console.log("PoolSelector 表单验证失败:", error);
return false; return false;
} }
}, },
@@ -40,12 +40,12 @@ const ContentSelector = forwardRef<ContentSelectorRef, ContentSelectorProps>(
})); }));
// 处理选择变化 // 处理选择变化
const handleContentChange = (contentGroupsOptions: PoolSelectionItem[]) => { const handlePoolChange = (poolGroupsOptions: PoolSelectionItem[]) => {
const contentGroups = contentGroupsOptions.map(c => c.id.toString()); const poolGroups = poolGroupsOptions.map(c => c.id.toString());
form.setFieldValue("contentGroups", contentGroups); form.setFieldValue("poolGroups", poolGroups);
onNext({ onNext({
contentGroups, poolGroups,
contentGroupsOptions, poolGroupsOptions,
}); });
}; };
@@ -61,7 +61,7 @@ const ContentSelector = forwardRef<ContentSelectorRef, ContentSelectorProps>(
form={form} form={form}
layout="vertical" layout="vertical"
initialValues={{ initialValues={{
contentGroups: selectedContent.map(c => c.id.toString()), poolGroups: selectedPools.map(c => c.id.toString()),
}} }}
> >
<div style={{ marginBottom: 16 }}> <div style={{ marginBottom: 16 }}>
@@ -74,7 +74,7 @@ const ContentSelector = forwardRef<ContentSelectorRef, ContentSelectorProps>(
</div> </div>
<Form.Item <Form.Item
name="contentGroups" name="poolGroups"
rules={[ rules={[
{ required: true, message: "请选择至少一个流量池包" }, { required: true, message: "请选择至少一个流量池包" },
{ type: "array", min: 1, message: "请选择至少一个流量池包" }, { type: "array", min: 1, message: "请选择至少一个流量池包" },
@@ -82,14 +82,8 @@ const ContentSelector = forwardRef<ContentSelectorRef, ContentSelectorProps>(
]} ]}
> >
<PoolSelection <PoolSelection
selectedOptions={selectedContent} selectedOptions={selectedPools}
onSelect={handleContentChange} onSelect={handlePoolChange}
onSelectDetail={handleSelectDetail}
placeholder="选择流量池包"
showInput={true}
showSelectedList={true}
readonly={false}
selectedListMaxHeight={320}
/> />
</Form.Item> </Form.Item>
</Form> </Form>
@@ -99,6 +93,6 @@ const ContentSelector = forwardRef<ContentSelectorRef, ContentSelectorProps>(
}, },
); );
ContentSelector.displayName = "ContentSelector"; PoolSelector.displayName = "PoolSelector";
export default ContentSelector; export default PoolSelector;

View File

@@ -8,14 +8,11 @@ import { AutoGroupFormData, StepItem } from "./types";
import StepIndicator from "@/components/StepIndicator"; import StepIndicator from "@/components/StepIndicator";
import BasicSettings, { BasicSettingsRef } from "./components/BasicSettings"; import BasicSettings, { BasicSettingsRef } from "./components/BasicSettings";
import DeviceSelector, { DeviceSelectorRef } from "./components/DeviceSelector"; import DeviceSelector, { DeviceSelectorRef } from "./components/DeviceSelector";
import ContentSelector, { import PoolSelector, { PoolSelectorRef } from "./components/PoolSelector";
ContentSelectorRef,
} from "./components/ContentSelector";
import NavCommon from "@/components/NavCommon/index"; import NavCommon from "@/components/NavCommon/index";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { DeviceSelectionItem } from "@/components/DeviceSelection/data"; import { DeviceSelectionItem } from "@/components/DeviceSelection/data";
import { PoolSelectionItem } from "@/components/PoolSelection/data"; import { PoolSelectionItem } from "@/components/PoolSelection/data";
import { GroupSelectionItem } from "../../../../../components/GroupSelection/data";
const steps: StepItem[] = [ const steps: StepItem[] = [
{ id: 1, title: "步骤 1", subtitle: "基础设置" }, { id: 1, title: "步骤 1", subtitle: "基础设置" },
@@ -28,8 +25,8 @@ const defaultForm: AutoGroupFormData = {
type: 4, type: 4,
deveiceGroups: [], // 设备组 deveiceGroups: [], // 设备组
deveiceGroupsOptions: [], // 设备组选项 deveiceGroupsOptions: [], // 设备组选项
contentGroups: [], // 内容库 poolGroups: [], // 内容库
contentGroupsOptions: [], // 内容库选项 poolGroupsOptions: [], // 内容库选项
startTime: dayjs().format("HH:mm"), // 开始时间 (HH:mm) startTime: dayjs().format("HH:mm"), // 开始时间 (HH:mm)
endTime: dayjs().add(1, "hour").format("HH:mm"), // 结束时间 (HH:mm) endTime: dayjs().add(1, "hour").format("HH:mm"), // 结束时间 (HH:mm)
groupSizeMin: 20, // 群组最小人数 groupSizeMin: 20, // 群组最小人数
@@ -51,14 +48,14 @@ const AutoGroupForm: React.FC = () => {
const [deviceGroupsOptions, setDeviceGroupsOptions] = useState< const [deviceGroupsOptions, setDeviceGroupsOptions] = useState<
DeviceSelectionItem[] DeviceSelectionItem[]
>([]); >([]);
const [contentGroupsOptions, setContentGroupsOptions] = useState< const [poolGroupsOptions, setpoolGroupsOptions] = useState<
PoolSelectionItem[] PoolSelectionItem[]
>([]); >([]);
// 创建子组件的ref // 创建子组件的ref
const basicSettingsRef = useRef<BasicSettingsRef>(null); const basicSettingsRef = useRef<BasicSettingsRef>(null);
const deviceSelectorRef = useRef<DeviceSelectorRef>(null); const deviceSelectorRef = useRef<DeviceSelectorRef>(null);
const contentSelectorRef = useRef<ContentSelectorRef>(null); const poolSelectorRef = useRef<PoolSelectorRef>(null);
useEffect(() => { useEffect(() => {
if (!id) return; if (!id) return;
@@ -69,8 +66,8 @@ const AutoGroupForm: React.FC = () => {
name: res.name, name: res.name,
deveiceGroups: res.config.deveiceGroups || [], deveiceGroups: res.config.deveiceGroups || [],
deveiceGroupsOptions: res.config.deveiceGroupsOptions || [], deveiceGroupsOptions: res.config.deveiceGroupsOptions || [],
contentGroups: res.config.contentGroups || [], poolGroups: res.config.poolGroups || [],
contentGroupsOptions: res.config.contentGroupsOptions || [], poolGroupsOptions: res.config.poolGroupsOptions || [],
startTime: res.config.startTime, startTime: res.config.startTime,
endTime: res.config.endTime, endTime: res.config.endTime,
groupSizeMin: res.config.groupSizeMin, groupSizeMin: res.config.groupSizeMin,
@@ -84,7 +81,7 @@ const AutoGroupForm: React.FC = () => {
}; };
setFormData(updatedForm); setFormData(updatedForm);
setDeviceGroupsOptions(res.config.deveiceGroupsOptions || []); setDeviceGroupsOptions(res.config.deveiceGroupsOptions || []);
setContentGroupsOptions(res.config.contentGroupsOptions || []); setpoolGroupsOptions(res.config.poolGroupsOptions || []);
setDataLoaded(true); // 标记数据已加载 setDataLoaded(true); // 标记数据已加载
}); });
}, [id]); }, [id]);
@@ -106,12 +103,12 @@ const AutoGroupForm: React.FC = () => {
}; };
// 流量池包选择 // 流量池包选择
const handleContentChange = (data: { const handlePoolsChange = (data: {
contentGroups: string[]; poolGroups: string[];
contentGroupsOptions: PoolSelectionItem[]; poolGroupsOptions: PoolSelectionItem[];
}) => { }) => {
setFormData(prev => ({ ...prev, contentGroups: data.contentGroups })); setFormData(prev => ({ ...prev, poolGroups: data.poolGroups }));
setContentGroupsOptions(data.contentGroupsOptions); setpoolGroupsOptions(data.poolGroupsOptions);
}; };
const handleSave = async () => { const handleSave = async () => {
@@ -123,7 +120,7 @@ const AutoGroupForm: React.FC = () => {
Toast.show({ content: "请选择至少一个设备组" }); Toast.show({ content: "请选择至少一个设备组" });
return; return;
} }
if (formData.contentGroups.length === 0) { if (formData.poolGroups.length === 0) {
Toast.show({ content: "请选择至少一个流量池包" }); Toast.show({ content: "请选择至少一个流量池包" });
return; return;
} }
@@ -133,7 +130,7 @@ const AutoGroupForm: React.FC = () => {
const submitData = { const submitData = {
...formData, ...formData,
deveiceGroupsOptions: deviceGroupsOptions, deveiceGroupsOptions: deviceGroupsOptions,
contentGroupsOptions: contentGroupsOptions, poolGroupsOptions: poolGroupsOptions,
}; };
if (isEdit) { if (isEdit) {
@@ -228,10 +225,10 @@ const AutoGroupForm: React.FC = () => {
); );
case 3: case 3:
return ( return (
<ContentSelector <PoolSelector
ref={contentSelectorRef} ref={poolSelectorRef}
selectedContent={contentGroupsOptions} selectedPools={poolGroupsOptions}
onNext={handleContentChange} onNext={handlePoolsChange}
/> />
); );
default: default:

View File

@@ -1,5 +1,5 @@
import { DeviceSelectionItem } from "@/components/DeviceSelection/data"; import { DeviceSelectionItem } from "@/components/DeviceSelection/data";
import { ContentItem } from "@/components/ContentSelection/data"; import { PoolSelectionItem } from "@/components/PoolSelection/data";
// 自动建群表单数据类型定义 // 自动建群表单数据类型定义
export interface AutoGroupFormData { export interface AutoGroupFormData {
@@ -8,8 +8,8 @@ export interface AutoGroupFormData {
name: string; // 任务名称 name: string; // 任务名称
deveiceGroups: string[]; // 设备组 deveiceGroups: string[]; // 设备组
deveiceGroupsOptions: DeviceSelectionItem[]; // 设备组选项 deveiceGroupsOptions: DeviceSelectionItem[]; // 设备组选项
contentGroups: string[]; // 内容库 poolGroups: string[]; // 流量池
contentGroupsOptions: ContentItem[]; // 内容库选项 poolGroupsOptions: PoolSelectionItem[]; // 流量池选项
startTime: string; // 开始时间 (YYYY-MM-DD HH:mm:ss) startTime: string; // 开始时间 (YYYY-MM-DD HH:mm:ss)
endTime: string; // 结束时间 (YYYY-MM-DD HH:mm:ss) endTime: string; // 结束时间 (YYYY-MM-DD HH:mm:ss)
groupSizeMin: number; // 群组最小人数 groupSizeMin: number; // 群组最小人数
@@ -38,7 +38,7 @@ export const formValidationRules = {
{ required: true, message: "请选择设备组" }, { required: true, message: "请选择设备组" },
{ type: "array", min: 1, message: "至少选择一个设备组" }, { type: "array", min: 1, message: "至少选择一个设备组" },
], ],
contentGroups: [ poolGroups: [
{ required: true, message: "请选择内容库" }, { required: true, message: "请选择内容库" },
{ type: "array", min: 1, message: "至少选择一个内容库" }, { type: "array", min: 1, message: "至少选择一个内容库" },
], ],