"use client" import { DocumentCurrencyDollarIcon, HomeIcon, UsersIcon } from "@heroicons/react/24/outline"; import { Autocomplete, InputLabel, MenuItem, Select, TextField } from "@mui/material"; import { DatePicker } from "@mui/x-date-pickers"; import { BarChart2, CircleDollarSign, LogOut, RefreshCcw } from "lucide-react"; import Link from "next/link"; import logo from "../../../public/images/logo.png"; import midsuit from "../../../public/images/midsuit.png"; import Image from "next/image"; import { usePathname, useRouter } from "next/navigation"; import React from "react"; import { Filter } from "@/services/types"; import { useAppDispatch, useAppSelector } from "@/lib/hooks"; import { setFilter } from "@/lib/slice/filter"; import { format } from "date-fns"; import { useGetFilterOptionsQuery, useGetOrganizationsMapQuery } from "@/services/api"; import { NeedLoginRoute } from "../RouteGuard"; import { useLocale } from "@/lib/hooks/useLocale"; import { LanguageSwitcher } from "@/components/LanguageSwitcher"; export default function DashboardLayout({children}:{children: React.ReactNode}) { const pathname = usePathname(); const dispatch = useAppDispatch(); const filter = useAppSelector((state) => state.filter.filter); const {data: orgMap } = useGetOrganizationsMapQuery(); const {data: filterOptions } = useGetFilterOptionsQuery(filter); const [region, setRegion] = React.useState(""); const { t } = useLocale(); // Helper function to validate date range const isValidDateRange = (startDate: string, endDate: string) => { const start = new Date(startDate); const end = new Date(endDate); return start <= end; }; // Handle start date change with validation const handleStartDateChange = (date: Date | null) => { if (!date) return; const newStartDate = format(date, "yyyy-MM-dd"); const currentEndDate = filter.end_date || format(new Date(), "yyyy-MM-dd"); // Only update if the new start date doesn't make the range invalid if (isValidDateRange(newStartDate, currentEndDate)) { dispatch(setFilter({...filter, start_date: newStartDate})); } }; // Handle end date change with validation const handleEndDateChange = (date: Date | null) => { if (!date) return; const newEndDate = format(date, "yyyy-MM-dd"); const currentStartDate = filter.start_date || format(new Date(new Date().getFullYear(), new Date().getMonth(), 1), "yyyy-MM-dd"); // Only update if the new end date doesn't make the range invalid if (isValidDateRange(currentStartDate, newEndDate)) { dispatch(setFilter({...filter, end_date: newEndDate})); } }; return (
logo
{t('navigation.pages')}
{t('navigation.dataKaryawan')} {t('navigation.absensi')} {t('navigation.turnOverRate')} {t('navigation.produktifitasKaryawan')} {t('navigation.hrCost')} {t('navigation.logout')}
Powered by
midsuit
option.name} renderInput={(params) => } onChange={(e, value) => { dispatch(setFilter({...filter, organization_code: value?.codes ?? ""})); setRegion(value?.codes ?? ""); }} /> option.name} renderInput={(params) => } onChange={(e, value) => { dispatch(setFilter({...filter, organization_code: value?.code ?? ""})); if (value?.code == undefined) dispatch(setFilter({...filter, organization_code: region})); }} /> option.name} renderInput={(params) => } onChange={(e, value) => dispatch(setFilter({...filter, estate_name: value?.name ?? ""}))} />
dispatch(setFilter({...filter, job_name: e.target.value}))}> {t('filters.all')} {t('filters.staff')} {t('filters.nonStaff')} {t('filters.harvesters')} {t('filters.maintenance')}
{children}
) }