Search available rooms, create reservation requests, manage approvals,
and monitor resource usage through live PostgreSQL reports.
Live dashboard
Reservation Control Center
Online
RoomsAvailability search
ApprovalsRole-based decisions
ReportsAdvanced analytics
Search available rooms
Create pending reservation
Approve through stored function
);
}
function LoginScreen({ onLogin, onBack, onRegisterClick }) {
const [form, setForm] = useState({
identifier: "",
password: "",
});
const [loading, setLoading] = useState(false);
function updateField(field, value) {
setForm((prev) => ({ ...prev, [field]: value }));
}
async function submit(e) {
e.preventDefault();
if (!form.identifier.trim()) {
toast.error("Username or email is required.");
return;
}
if (!form.password.trim()) {
toast.error("Password is required.");
return;
}
setLoading(true);
try {
const user = await loginUser({
identifier: form.identifier,
password: form.password,
});
onLogin(user);
} catch (err) {
toast.error(err.message);
} finally {
setLoading(false);
}
}
return (
Role-based access
Access the reservation workspace.
Continue to the reservation system with the permissions assigned
to your user role. Manage reservations, approvals, reports and
administrative modules.
);
}
function RegisterScreen({ onBack, onLoginClick, onRegistered }) {
const [form, setForm] = useState({
fullName: "",
email: "",
username: "",
password: "",
confirmPassword: "",
});
const [loading, setLoading] = useState(false);
function updateField(field, value) {
setForm((prev) => ({
...prev,
[field]: value,
}));
}
async function submit(e) {
e.preventDefault();
if (!form.fullName.trim()) {
toast.error("Full name is required.");
return;
}
if (!form.email.trim()) {
toast.error("Email is required.");
return;
}
if (!form.username.trim()) {
toast.error("Username is required.");
return;
}
if (!form.password.trim()) {
toast.error("Password is required.");
return;
}
if (form.password.length < 8) {
toast.error("Password must contain at least 8 characters.");
return;
}
if (form.password !== form.confirmPassword) {
toast.error("Passwords do not match.");
return;
}
setLoading(true);
try {
const user = await registerUser({
fullName: form.fullName.trim(),
email: form.email.trim(),
username: form.username.trim(),
password: form.password,
});
toast.success("Account created successfully.");
onRegistered(user);
} catch (err) {
toast.error(err.message);
} finally {
setLoading(false);
}
}
return (
Account creation
Create your account
Create a standard user account to submit room and equipment reservation requests.
Administrative permissions are assigned separately by the system administrator.