lms/resources/js/pages/installer/Step3.tsx
2025-12-15 12:26:23 +01:00

155 lines
5.2 KiB
TypeScript

import InputError from '@/components/input-error';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import { cn } from '@/lib/utils';
import { SharedData } from '@/types/global';
import { Link, router, useForm } from '@inertiajs/react';
import React, { ChangeEvent, ReactNode } from 'react';
import Layout from './Partials/Layout';
import Message from './Partials/Message';
import StepNavigator from './Partials/StepNavigator';
interface Props extends SharedData {
DB_HOST: string;
DB_PORT: string;
DB_DATABASE: string;
DB_USERNAME: string;
DB_PASSWORD: string;
DB_CONNECTION: string;
DB_CONNECTION_STATUS: string;
}
const Step3 = (props: Props) => {
const { DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD, DB_CONNECTION, DB_CONNECTION_STATUS, flash } = props;
const { data, errors, post, setData } = useForm({
db_connection: DB_CONNECTION || 'mysql',
db_host: DB_HOST || '',
db_port: DB_PORT || '',
db_database: DB_DATABASE || '',
db_username: DB_USERNAME || '',
db_password: DB_PASSWORD || '',
});
const dbConnectionStatus = Boolean(parseInt(DB_CONNECTION_STATUS));
const onHandleChange = (event: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
const target = event.target as HTMLInputElement;
setData({
...data,
[target.name]: target.value,
});
};
const testDBConnection = async (e: React.FormEvent) => {
e.preventDefault();
router.post(route('check-database'), data);
};
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
post(route('install.store-step3'));
};
return (
<div>
<StepNavigator step1="fill" step2="fill" step3="active" />
<form id="dataForm" onSubmit={handleSubmit}>
<Message error={flash.error} success={flash.success} />
<div className="mb-6">
<Label>Select Database Type</Label>
<Select name="db_connection" value={data.db_connection} onValueChange={(value) => setData('db_connection', value)}>
<SelectTrigger>
<SelectValue placeholder="Select Database Type" />
</SelectTrigger>
<SelectContent>
<SelectItem value="mysql">MySQL</SelectItem>
</SelectContent>
</Select>
</div>
<div className="mb-6">
<Label>DB Host</Label>
<Input id="db_host" type="text" name="db_host" value={data.db_host} onChange={onHandleChange} placeholder="127.0.0.1" />
<InputError message={errors.db_host} />
</div>
<div className="mb-6">
<Label>DB Port</Label>
<Input id="db_port" type="text" name="db_port" value={data.db_port} onChange={onHandleChange} placeholder="3306" />
<InputError message={errors.db_port} />
</div>
<div className="mb-6">
<Label>DB Database</Label>
<Input
id="db_database"
type="text"
name="db_database"
value={data.db_database}
onChange={onHandleChange}
placeholder="Database Name"
/>
<InputError message={errors.db_database} />
</div>
<div className="mb-6">
<Label>DB Username</Label>
<Input id="db_username" type="text" name="db_username" value={data.db_username} onChange={onHandleChange} placeholder="Username" />
<InputError message={errors.db_username} />
</div>
<div className="mb-6">
<Label>DB Password</Label>
<Input id="db_password" type="password" name="db_password" value={data.db_password} onChange={onHandleChange} placeholder="Password" />
<InputError message={errors.db_password} />
</div>
<Button
type="button"
className={cn('w-full', dbConnectionStatus && 'bg-green-500', flash.error && 'bg-red-500')}
onClick={testDBConnection}
disabled={dbConnectionStatus}
>
Test Connection
</Button>
<div className="mt-12 flex items-center justify-end gap-4">
<Link href={route('install.show-step2')}>
<Button type="button" variant="outline" className="border border-orange-500 !bg-transparent !text-orange-500 uppercase">
Previous Step
</Button>
</Link>
{dbConnectionStatus && (
<Button type="submit" className="bg-orange-500 px-6 py-3 text-white uppercase hover:bg-orange-600/90">
Next Step
</Button>
)}
</div>
</form>
</div>
);
};
Step3.layout = (page: ReactNode) => <Layout children={page} />;
export default Step3;