enhanced filters in coverMe report
This commit is contained in:
@ -1,7 +1,5 @@
|
|||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import axiosInstance from "../../../src/axiosSecure";
|
import axiosInstance from "../../../src/axiosSecure";
|
||||||
import { useRouter } from "next/router";
|
|
||||||
import Link from "next/link";
|
|
||||||
import { useSession } from "next-auth/react";
|
import { useSession } from "next-auth/react";
|
||||||
import Layout from "../../../components/layout";
|
import Layout from "../../../components/layout";
|
||||||
import ProtectedRoute from "../../../components/protectedRoute";
|
import ProtectedRoute from "../../../components/protectedRoute";
|
||||||
@ -14,24 +12,28 @@ const timeFilters = [
|
|||||||
{ label: "Всички", value: null },
|
{ label: "Всички", value: null },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const eventTypes = [
|
||||||
|
{ label: "Заявки", value: EventLogType.AssignmentReplacementRequested },
|
||||||
|
{ label: "Приети замествания", value: EventLogType.AssignmentReplacementAccepted },
|
||||||
|
{ label: "Ръчно въведени замествания", value: EventLogType.AssignmentReplacementManual },
|
||||||
|
];
|
||||||
|
|
||||||
export default function EventLogList() {
|
export default function EventLogList() {
|
||||||
const [eventLogs, setEventLog] = useState([]);
|
const [eventLogs, setEventLog] = useState([]);
|
||||||
const [requestedAssignments, setRequestedAssignments] = useState([]);
|
const [requestedAssignments, setRequestedAssignments] = useState([]);
|
||||||
const [locations, setLocations] = useState([]);
|
|
||||||
const [showOpenRequests, setShowOpenRequests] = useState(false);
|
const [showOpenRequests, setShowOpenRequests] = useState(false);
|
||||||
const [selectedTimeFilter, setSelectedTimeFilter] = useState(null); // Time filter state
|
const [selectedTimeFilter, setSelectedTimeFilter] = useState(null); // Time filter state
|
||||||
|
const [selectedEventTypes, setSelectedEventTypes] = useState(eventTypes.map((et) => et.value)); // Default: all types
|
||||||
const { data: session } = useSession();
|
const { data: session } = useSession();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchLocations = async () => {
|
const fetchEventLogs = async () => {
|
||||||
try {
|
try {
|
||||||
const where = encodeURIComponent(JSON.stringify({
|
const where = encodeURIComponent(
|
||||||
OR: [
|
JSON.stringify({
|
||||||
{ type: EventLogType.AssignmentReplacementAccepted },
|
OR: selectedEventTypes.map((type) => ({ type })),
|
||||||
{ type: EventLogType.AssignmentReplacementManual },
|
})
|
||||||
{ type: EventLogType.AssignmentReplacementRequested }
|
);
|
||||||
],
|
|
||||||
}));
|
|
||||||
|
|
||||||
const { data: eventLogsData } = await axiosInstance.get(
|
const { data: eventLogsData } = await axiosInstance.get(
|
||||||
`/api/data/prisma/eventLog?where=${where}&include={"publisher":{"select":{"firstName":true,"lastName":true}},"shift":{"include":{"assignments":{"include":{"publisher":{"select":{"firstName":true,"lastName":true}}}}}}}`
|
`/api/data/prisma/eventLog?where=${where}&include={"publisher":{"select":{"firstName":true,"lastName":true}},"shift":{"include":{"assignments":{"include":{"publisher":{"select":{"firstName":true,"lastName":true}}}}}}}`
|
||||||
@ -48,10 +50,8 @@ export default function EventLogList() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!locations.length) {
|
fetchEventLogs();
|
||||||
fetchLocations();
|
}, [selectedEventTypes]);
|
||||||
}
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
// Filter events based on the selected time range
|
// Filter events based on the selected time range
|
||||||
const filteredEventLogs = eventLogs.filter((event) => {
|
const filteredEventLogs = eventLogs.filter((event) => {
|
||||||
@ -62,6 +62,15 @@ export default function EventLogList() {
|
|||||||
return eventDate >= cutoffDate;
|
return eventDate >= cutoffDate;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Toggle event type selection
|
||||||
|
const toggleEventType = (eventType) => {
|
||||||
|
setSelectedEventTypes((prev) =>
|
||||||
|
prev.includes(eventType)
|
||||||
|
? prev.filter((type) => type !== eventType)
|
||||||
|
: [...prev, eventType]
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout>
|
<Layout>
|
||||||
<ProtectedRoute allowedRoles={[UserRole.POWERUSER, UserRole.ADMIN]}>
|
<ProtectedRoute allowedRoles={[UserRole.POWERUSER, UserRole.ADMIN]}>
|
||||||
@ -82,10 +91,10 @@ export default function EventLogList() {
|
|||||||
checked={!showOpenRequests}
|
checked={!showOpenRequests}
|
||||||
className="sr-only"
|
className="sr-only"
|
||||||
/>
|
/>
|
||||||
Приети заявки
|
Приети/затворени заявки
|
||||||
</label>
|
</label>
|
||||||
<label
|
<label
|
||||||
className={`cursor-pointer px-4 py-2 rounded-full ${showOpenRequests ? "bg-blue-500 text-white" : "bg-gray-200 text-gray-800"
|
className={`cursor-pointer px-4 py-2 rounded-full ${showOpenRequests ? "bg-yellow-500 text-white" : "bg-yellow-100 text-gray-800"
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
@ -100,6 +109,23 @@ export default function EventLogList() {
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{/* Event Type Filter Pills */}
|
||||||
|
<div className="flex gap-2 mb-4">
|
||||||
|
{eventTypes.map((type) => (
|
||||||
|
<button
|
||||||
|
key={type.value}
|
||||||
|
onClick={() => toggleEventType(type.value)}
|
||||||
|
className={`px-4 py-2 rounded-full ${selectedEventTypes.includes(type.value)
|
||||||
|
? "bg-blue-500 text-white"
|
||||||
|
: "bg-gray-200 text-gray-800"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{type.label}
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
{/* Time Filter Pills */}
|
{/* Time Filter Pills */}
|
||||||
<div className="flex gap-2 mb-4">
|
<div className="flex gap-2 mb-4">
|
||||||
{timeFilters.map((filter) => (
|
{timeFilters.map((filter) => (
|
||||||
@ -115,7 +141,6 @@ export default function EventLogList() {
|
|||||||
</button>
|
</button>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="mt-4 w-full overflow-x-auto">
|
<div className="mt-4 w-full overflow-x-auto">
|
||||||
<table className="w-full table-auto">
|
<table className="w-full table-auto">
|
||||||
<thead>
|
<thead>
|
||||||
|
Reference in New Issue
Block a user