Spaces:
Sleeping
Sleeping
File size: 2,637 Bytes
e85fa50 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
import React, { useState } from 'react';
import Input from '../common/Input';
import Button from '../common/Button';
import { Category } from '../../types';
interface CategoryFormProps {
initialCategory?: Partial<Category>;
onSubmit: (category: Omit<Category, '_id'>) => void;
onCancel: () => void;
}
const CategoryForm: React.FC<CategoryFormProps> = ({
initialCategory = {},
onSubmit,
onCancel
}) => {
const [name, setName] = useState(initialCategory.name || '');
const [color, setColor] = useState(initialCategory.color || '#007AFF');
const [error, setError] = useState('');
const colorOptions = [
{ color: '#007AFF', name: '蓝色' },
{ color: '#4CD964', name: '绿色' },
{ color: '#FF3B30', name: '红色' },
{ color: '#FF9500', name: '橙色' },
{ color: '#FFCC00', name: '黄色' },
{ color: '#5856D6', name: '紫色' },
{ color: '#FF2D55', name: '粉色' },
{ color: '#5AC8FA', name: '浅蓝色' },
];
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
if (!name.trim()) {
setError('请输入分类名称');
return;
}
onSubmit({
name: name.trim(),
color
});
};
return (
<form onSubmit={handleSubmit} className="space-y-4">
<Input
label="分类名称"
placeholder="输入分类名称"
value={name}
onChange={(e) => {
setName(e.target.value);
if (error) setError('');
}}
error={error}
required
/>
<div>
<label className="block text-sm font-medium mb-1 text-gray-700">
颜色
</label>
<div className="flex flex-wrap gap-2">
{colorOptions.map((option) => (
<div
key={option.color}
className={`
w-8 h-8 rounded-full cursor-pointer
${color === option.color ? 'ring-2 ring-offset-2 ring-gray-400' : ''}
`}
style={{ backgroundColor: option.color }}
onClick={() => setColor(option.color)}
title={option.name}
/>
))}
</div>
</div>
<div className="flex justify-end space-x-2 mt-4">
<Button
variant="secondary"
onClick={onCancel}
>
取消
</Button>
<Button
variant="primary"
type="submit"
>
保存
</Button>
</div>
</form>
);
};
export default CategoryForm; |