216 lines
6.1 KiB
JavaScript
216 lines
6.1 KiB
JavaScript
import React, { useState, useEffect } from 'react';
|
|
import { Form, Card, Input, Select, message,Button } from 'antd';
|
|
import { supabaseService } from '@/hooks/supabaseService';
|
|
import {ArrowLeftOutlined}from '@ant-design/icons'
|
|
import TaskList from '@/components/TaskList';
|
|
const TYPE = 'task'
|
|
const TaskTemplate = ({ id, isView, onCancel,isEdit }) => {
|
|
const [form] = Form.useForm();
|
|
const [loading, setLoading] = useState(false);
|
|
const [formValues, setFormValues] = useState({
|
|
sections: [{ items: [{}] }],
|
|
});
|
|
const [categories, setCategories] = useState([]);
|
|
useEffect(() => {
|
|
if (id) {
|
|
fetchServiceTemplate();
|
|
}
|
|
fetchCategories();
|
|
}, [id]);
|
|
|
|
const fetchServiceTemplate = async () => {
|
|
try {
|
|
setLoading(true);
|
|
const { data } = await supabaseService.select('resources', {
|
|
filter: {
|
|
id: { eq: id },
|
|
type: { eq: 'serviceTemplate' },
|
|
'attributes->>template_type': { eq: TYPE }
|
|
}
|
|
});
|
|
|
|
if (data?.[0]) {
|
|
const formData = {
|
|
templateName: data[0].attributes.templateName,
|
|
description: data[0].attributes.description,
|
|
category: data[0].attributes.category?.map(v => v.id) || [],
|
|
sections: data[0].attributes.sections || [{ items: [{}] }],
|
|
currency: data[0].attributes.currency || "CNY",
|
|
};
|
|
form.setFieldsValue(formData);
|
|
setFormValues(formData);
|
|
}
|
|
} catch (error) {
|
|
console.error("获取服务模版失败:", error);
|
|
message.error("获取服务模版失败");
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
const fetchCategories = async () => {
|
|
try {
|
|
const { data } = await supabaseService.select('resources', {
|
|
filter: {
|
|
type: { eq: 'categories' },
|
|
'attributes->>template_type': { in: `(${TYPE},common)` }
|
|
},
|
|
order: {
|
|
column: 'created_at',
|
|
ascending: false
|
|
}
|
|
});
|
|
|
|
const formattedCategories = (data || []).map(category => ({
|
|
value: category.id,
|
|
label: category.attributes.name
|
|
}));
|
|
|
|
setCategories(formattedCategories);
|
|
} catch (error) {
|
|
message.error('获取分类数据失败');
|
|
console.error(error);
|
|
}
|
|
};
|
|
|
|
const handleValuesChange = (changedValues, allValues) => {
|
|
setFormValues(allValues);
|
|
};
|
|
|
|
const onFinish = async (values) => {
|
|
try {
|
|
setLoading(true);
|
|
const categoryData = values.category.map(categoryId => {
|
|
const category = categories.find(c => c.value === categoryId);
|
|
return {
|
|
id: categoryId,
|
|
name: category.label
|
|
};
|
|
});
|
|
const serviceData = {
|
|
type: "serviceTemplate",
|
|
attributes: {
|
|
template_type: TYPE,
|
|
templateName: values.templateName,
|
|
description: values.description,
|
|
sections: values.sections,
|
|
category: categoryData,
|
|
},
|
|
};
|
|
|
|
if (id) {
|
|
await supabaseService.update('resources',
|
|
{ id },
|
|
serviceData
|
|
);
|
|
} else {
|
|
// 新增
|
|
await supabaseService.insert('resources', serviceData);
|
|
}
|
|
|
|
message.success("保存成功");
|
|
onCancel();
|
|
} catch (error) {
|
|
console.error("保存失败:", error);
|
|
message.error("保存失败");
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
return (
|
|
<>
|
|
<Form
|
|
form={form}
|
|
onFinish={onFinish}
|
|
onValuesChange={handleValuesChange}
|
|
layout="vertical"
|
|
variant="filled"
|
|
disabled={isView}
|
|
>
|
|
<Card
|
|
className="shadow-sm rounded-lg mb-6"
|
|
type="inner"
|
|
title={
|
|
<span className="flex items-center space-x-2 text-gray-700">
|
|
<span className="w-1 h-4 bg-blue-500 rounded-full" />
|
|
<span>基本信息</span>
|
|
</span>
|
|
}
|
|
bordered={false}
|
|
>
|
|
<div className="grid grid-cols-2 gap-6">
|
|
<Form.Item
|
|
label="模版名称"
|
|
name="templateName"
|
|
rules={[{ required: true, message: "请输入模版名称" }]}
|
|
>
|
|
<Input placeholder="请输入模版名称" />
|
|
</Form.Item>
|
|
<Form.Item
|
|
label="模版分类"
|
|
name="category"
|
|
rules={[{ required: true, message: "请选择或输入分类" }]}
|
|
>
|
|
<Select
|
|
placeholder="请选择或输入分类"
|
|
showSearch
|
|
allowClear
|
|
mode="tags"
|
|
options={categories}
|
|
loading={loading}
|
|
/>
|
|
</Form.Item>
|
|
<Form.Item
|
|
label="模版描述"
|
|
name="description"
|
|
className="col-span-2"
|
|
>
|
|
<Input.TextArea rows={4} placeholder="请输入模版描述" />
|
|
</Form.Item>
|
|
</div>
|
|
</Card>
|
|
|
|
<Card
|
|
className="shadow-sm rounded-lg"
|
|
type="inner"
|
|
title={
|
|
<span className="flex items-center space-x-2 text-gray-700">
|
|
<span className="w-1 h-4 bg-blue-500 rounded-full" />
|
|
<span>相关任务</span>
|
|
</span>
|
|
}
|
|
bordered={false}
|
|
>
|
|
<TaskList
|
|
type={TYPE}
|
|
form={form}
|
|
isView={isView}
|
|
formValues={formValues}
|
|
onValuesChange={handleValuesChange}
|
|
/>
|
|
</Card>
|
|
|
|
</Form>
|
|
<div className="flex justify-end pt-4 space-x-4">
|
|
<Button
|
|
icon={<ArrowLeftOutlined />}
|
|
onClick={onCancel}
|
|
>
|
|
返回
|
|
</Button>
|
|
{!isView && (
|
|
<Button
|
|
type="primary"
|
|
onClick={() => form.submit()}
|
|
loading={loading}
|
|
>
|
|
保存
|
|
</Button>
|
|
)}
|
|
</div>
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default TaskTemplate; |