diff --git a/src/app/dashboard/page.js b/src/app/dashboard/page.js
index 16a2c5a..959bf67 100644
--- a/src/app/dashboard/page.js
+++ b/src/app/dashboard/page.js
@@ -1,5 +1,6 @@
-// src/app/dashboard/page.js
+
"use client";
+
import { useRouter } from "next/navigation";
import { useAuth } from "../context/AuthContext";
import { useEffect } from "react";
@@ -22,12 +23,16 @@ export default function DashboardPage() {
return (
@@ -39,12 +44,28 @@ export default function DashboardPage() {
return null;
}
+ // Check if user is admin or staff to show entries table
+ const canViewEntries = userRole === "admin" || userRole === "staff";
+
return (
-
+
-
+ {canViewEntries ? (
+
+ ) : (
+
+
+ Welcome to your Dashboard
+
+
+ You don't have permission to view entries.
+
+
+ )}
);
diff --git a/src/app/pages/MultiBooking/page.js b/src/app/pages/MultiBooking/page.js
index fd4d9ad..35915e7 100644
--- a/src/app/pages/MultiBooking/page.js
+++ b/src/app/pages/MultiBooking/page.js
@@ -1,44 +1,126 @@
+
"use client";
-import { useState } from 'react';
-import { useRouter } from 'next/navigation';
+import { useState, useEffect } from "react";
+import { useRouter } from "next/navigation";
import Header from "../../components/partials/header";
import { useTheme } from "../../context/ThemeContext";
+import { databases, Query } from "../../lib/appwrite";
+import { DATABASE_ID, COLLECTION_ID } from "../../lib/api";
export default function MultiBooking() {
const { darkMode } = useTheme();
const router = useRouter();
- const [appointmentDate, setAppointmentDate] = useState(new Date().toISOString().split('T')[0]);
+
+ const [appointmentDate, setAppointmentDate] = useState(
+ new Date().toISOString().split("T")[0]
+ );
const [patients, setPatients] = useState(
- Array(5).fill().map((_, i) => ({ id: i+1, name: "" }))
+ Array(5)
+ .fill()
+ .map((_, i) => ({ id: i + 1, name: "" }))
);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
+ // Header related states - matching EntriesTable
+ const [entries, setEntries] = useState([]);
+ const [currentToken, setCurrentToken] = useState(null);
+ const [previousToken, setPreviousToken] = useState(null);
+ const [nextToken, setNextToken] = useState(null);
+ const [missedTokens, setMissedTokens] = useState("");
+ const [dataLoading, setDataLoading] = useState(true);
+
const handleNameChange = (id, value) => {
- setPatients(patients.map(p =>
- p.id === id ? { ...p, name: value } : p
- ));
+ setPatients(patients.map((p) => (p.id === id ? { ...p, name: value } : p)));
};
+ // Get entries from database - similar to EntriesTable
+ const getEntries = async () => {
+ try {
+ const today = new Date().toISOString().split("T")[0];
+ const response = await databases.listDocuments(
+ DATABASE_ID,
+ COLLECTION_ID,
+ [Query.equal("date", today), Query.orderAsc("tokenNumber")],
+ 100
+ );
+ return response.documents;
+ } catch (error) {
+ console.error("Fetch error:", error);
+ throw error;
+ }
+ };
+
+ // Update token information - same as EntriesTable
+ const updateTokenInfo = (entries) => {
+ if (entries.length === 0) {
+ setCurrentToken(null);
+ setPreviousToken(null);
+ setNextToken(null);
+ setMissedTokens("");
+ return;
+ }
+
+ const currentIndex = entries.findIndex(
+ (entry) => entry.status === "booked"
+ );
+ const current = currentIndex >= 0 ? entries[currentIndex] : null;
+
+ setCurrentToken(current?.tokenNumber || null);
+ setPreviousToken(
+ currentIndex > 0 ? entries[currentIndex - 1]?.tokenNumber : null
+ );
+ setNextToken(
+ currentIndex < entries.length - 1
+ ? entries[currentIndex + 1]?.tokenNumber
+ : null
+ );
+
+ const missed = entries
+ .filter((entry) => entry.status === "missed")
+ .map((entry) => entry.tokenNumber)
+ .join(", ");
+ setMissedTokens(missed || "None");
+ };
+
+ // Load token data - similar to EntriesTable
+ useEffect(() => {
+ const loadTokenData = async () => {
+ try {
+ setDataLoading(true);
+ const data = await getEntries();
+ setEntries(data);
+ updateTokenInfo(data);
+ } catch (err) {
+ console.error("Error loading token data:", err);
+ } finally {
+ setDataLoading(false);
+ }
+ };
+
+ loadTokenData();
+ }, []);
+
const handleSubmit = async (e) => {
e.preventDefault();
setLoading(true);
setError(null);
try {
- // Filter out empty names and validate
- const validPatients = patients.filter(p => p.name.trim() !== "");
+ const validPatients = patients.filter((p) => p.name.trim() !== "");
if (validPatients.length === 0) {
- throw new Error("Please enter at least one patient name");
+ throw new Error("Please enter at least one patient name.");
}
- // Store in session to use in MultiBooked page
- sessionStorage.setItem('multiBookingData', JSON.stringify({
- date: appointmentDate,
- patients: validPatients
- }));
+ sessionStorage.setItem(
+ "multiBookingData",
+ JSON.stringify({
+ date: appointmentDate,
+ patients: validPatients,
+ })
+ );
- router.push('/pages/MultiBooked');
+ router.push("/pages/MultiBooked");
} catch (error) {
setError(error.message);
} finally {
@@ -47,23 +129,32 @@ export default function MultiBooking() {
};
const addMorePatients = () => {
- const newId = patients.length > 0 ?
- Math.max(...patients.map(p => p.id)) + 1 : 1;
+ if (patients.length >= 20) return;
+ const newId =
+ patients.length > 0 ? Math.max(...patients.map((p) => p.id)) + 1 : 1;
setPatients([...patients, { id: newId, name: "" }]);
};
return (
-
- {/* Content Area */}
+
- {/* Sticky Header */}
- {/* Main Content */}
{error && (
@@ -73,47 +164,72 @@ export default function MultiBooking() {
)}
-
+