175 lines
4.2 KiB
TypeScript
175 lines
4.2 KiB
TypeScript
import {
|
|
Button,
|
|
Col,
|
|
Form,
|
|
Input,
|
|
InputNumber,
|
|
Modal,
|
|
Row,
|
|
Select,
|
|
} from 'antd';
|
|
|
|
// Camera types
|
|
const CAMERA_TYPES = [
|
|
{ label: 'HIKVISION', value: 'HIKVISION' },
|
|
{ label: 'DAHUA', value: 'DAHUA' },
|
|
{ label: 'GENERIC', value: 'GENERIC' },
|
|
];
|
|
|
|
interface CameraFormValues {
|
|
name: string;
|
|
type: string;
|
|
account: string;
|
|
password: string;
|
|
ipAddress: string;
|
|
rtspPort: number;
|
|
httpPort: number;
|
|
stream: number;
|
|
channel: number;
|
|
}
|
|
|
|
interface CameraFormModalProps {
|
|
open: boolean;
|
|
onCancel: () => void;
|
|
onSubmit: (values: CameraFormValues) => void;
|
|
}
|
|
|
|
const CameraFormModal: React.FC<CameraFormModalProps> = ({
|
|
open,
|
|
onCancel,
|
|
onSubmit,
|
|
}) => {
|
|
const [form] = Form.useForm<CameraFormValues>();
|
|
|
|
const handleSubmit = async () => {
|
|
try {
|
|
const values = await form.validateFields();
|
|
onSubmit(values);
|
|
form.resetFields();
|
|
} catch (error) {
|
|
console.error('Validation failed:', error);
|
|
}
|
|
};
|
|
|
|
const handleCancel = () => {
|
|
form.resetFields();
|
|
onCancel();
|
|
};
|
|
|
|
return (
|
|
<Modal
|
|
title="Tạo mới camera"
|
|
open={open}
|
|
onCancel={handleCancel}
|
|
footer={[
|
|
<Button key="cancel" onClick={handleCancel}>
|
|
Hủy
|
|
</Button>,
|
|
<Button key="submit" type="primary" onClick={handleSubmit}>
|
|
Đồng ý
|
|
</Button>,
|
|
]}
|
|
width={500}
|
|
>
|
|
<Form
|
|
form={form}
|
|
layout="vertical"
|
|
initialValues={{
|
|
type: 'HIKVISION',
|
|
rtspPort: 554,
|
|
httpPort: 80,
|
|
stream: 0,
|
|
channel: 0,
|
|
}}
|
|
>
|
|
<Form.Item
|
|
label="Tên"
|
|
name="name"
|
|
rules={[{ required: true, message: 'Vui lòng nhập tên' }]}
|
|
>
|
|
<Input placeholder="nhập dữ liệu" />
|
|
</Form.Item>
|
|
|
|
<Form.Item
|
|
label="Loại"
|
|
name="type"
|
|
rules={[{ required: true, message: 'Vui lòng chọn loại' }]}
|
|
>
|
|
<Select options={CAMERA_TYPES} />
|
|
</Form.Item>
|
|
|
|
<Form.Item
|
|
label="Tài khoản"
|
|
name="account"
|
|
rules={[{ required: true, message: 'Vui lòng nhập tài khoản' }]}
|
|
>
|
|
<Input placeholder="nhập tài khoản" autoComplete="off" />
|
|
</Form.Item>
|
|
|
|
<Form.Item
|
|
label="Mật khẩu"
|
|
name="password"
|
|
rules={[{ required: true, message: 'Vui lòng nhập mật khẩu' }]}
|
|
>
|
|
<Input.Password
|
|
placeholder="nhập mật khẩu"
|
|
autoComplete="new-password"
|
|
/>
|
|
</Form.Item>
|
|
|
|
<Form.Item
|
|
label="Địa chỉ IP"
|
|
name="ipAddress"
|
|
rules={[{ required: true, message: 'Vui lòng nhập địa chỉ IP' }]}
|
|
>
|
|
<Input placeholder="192.168.1.10" />
|
|
</Form.Item>
|
|
|
|
<Row gutter={16}>
|
|
<Col span={12}>
|
|
<Form.Item
|
|
label="Cổng RTSP"
|
|
name="rtspPort"
|
|
rules={[{ required: true, message: 'Vui lòng nhập cổng RTSP' }]}
|
|
>
|
|
<InputNumber style={{ width: '100%' }} min={0} max={65535} />
|
|
</Form.Item>
|
|
</Col>
|
|
<Col span={12}>
|
|
<Form.Item
|
|
label="Cổng HTTP"
|
|
name="httpPort"
|
|
rules={[{ required: true, message: 'Vui lòng nhập cổng HTTP' }]}
|
|
>
|
|
<InputNumber style={{ width: '100%' }} min={0} max={65535} />
|
|
</Form.Item>
|
|
</Col>
|
|
</Row>
|
|
|
|
<Row gutter={16}>
|
|
<Col span={12}>
|
|
<Form.Item
|
|
label="Luồng"
|
|
name="stream"
|
|
rules={[{ required: true, message: 'Vui lòng nhập luồng' }]}
|
|
>
|
|
<InputNumber style={{ width: '100%' }} min={0} />
|
|
</Form.Item>
|
|
</Col>
|
|
<Col span={12}>
|
|
<Form.Item
|
|
label="Kênh"
|
|
name="channel"
|
|
rules={[{ required: true, message: 'Vui lòng nhập kênh' }]}
|
|
>
|
|
<InputNumber style={{ width: '100%' }} min={0} />
|
|
</Form.Item>
|
|
</Col>
|
|
</Row>
|
|
</Form>
|
|
</Modal>
|
|
);
|
|
};
|
|
|
|
export default CameraFormModal;
|