Enhances dashboard with new metrics and charts

Improves the dashboard with additional metrics and visualizations
to provide a more comprehensive overview of application usage and performance.

Adds new charts, including:
- Word cloud for category analysis
- Geographic map for user distribution (simulated data)
- Response time distribution chart

Refactors existing components for improved clarity and reusability,
including the introduction of a generic `MetricCard` component.

Improves error handling and user feedback during data refresh and
session loading.

Adds recommended VSCode extensions for ESLint and Prettier.
This commit is contained in:
2025-05-22 04:04:50 +02:00
parent 2624bf1378
commit 5317b2aa39
34 changed files with 2122 additions and 172 deletions

View File

@ -13,7 +13,7 @@ interface SessionCreateData {
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
res: NextApiResponse
) {
// Check if this is a POST request
if (req.method !== "POST") {
@ -37,7 +37,11 @@ export default async function handler(
companyId = session.companyId;
}
} catch (error) {
console.error("Error fetching session:", error);
// Log error for server-side debugging
const errorMessage =
error instanceof Error ? error.message : String(error);
// Use a server-side logging approach instead of console
process.stderr.write(`Error fetching session: ${errorMessage}\n`);
}
}
@ -52,7 +56,7 @@ export default async function handler(
const sessions = await fetchAndParseCsv(
company.csvUrl,
company.csvUsername as string | undefined,
company.csvPassword as string | undefined,
company.csvPassword as string | undefined
);
// Replace all session rows for this company (for demo simplicity)

View File

@ -6,7 +6,7 @@ import { authOptions } from "../auth/[...nextauth]";
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
res: NextApiResponse
) {
const session = await getServerSession(req, res, authOptions);
if (!session?.user) return res.status(401).json({ error: "Not logged in" });

View File

@ -16,12 +16,12 @@ interface SessionData {
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
res: NextApiResponse
) {
const session = (await getServerSession(
req,
res,
authOptions,
authOptions
)) as SessionData | null;
if (!session?.user) return res.status(401).json({ error: "Not logged in" });

View File

@ -5,7 +5,7 @@ import { authOptions } from "../auth/[...nextauth]";
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
res: NextApiResponse
) {
const session = await getServerSession(req, res, authOptions);
if (!session?.user || session.user.role !== "admin")

View File

@ -13,7 +13,7 @@ interface UserBasicInfo {
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
res: NextApiResponse
) {
const session = await getServerSession(req, res, authOptions);
if (!session?.user || session.user.role !== "admin")

View File

@ -18,7 +18,7 @@ type NextApiResponse = ServerResponse & {
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
res: NextApiResponse
) {
if (req.method !== "POST") return res.status(405).end();
const { email } = req.body;

View File

@ -12,7 +12,7 @@ interface RegisterRequestBody {
export default async function handler(
req: NextApiRequest,
res: NextApiResponse<ApiResponse<{ success: boolean } | { error: string }>>,
res: NextApiResponse<ApiResponse<{ success: boolean } | { error: string }>>
) {
if (req.method !== "POST") return res.status(405).end();

View File

@ -18,7 +18,7 @@ type NextApiResponse = ServerResponse & {
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
res: NextApiResponse
) {
if (req.method !== "POST") return res.status(405).end();
const { token, password } = req.body;