Update Schedule and Maintenace Overview Card Liner-Gradient

This commit is contained in:
Tola Leng
2025-07-01 19:57:51 +07:00
parent 9b1ccc7f8d
commit fda40de155
@@ -1,16 +1,13 @@
import React, { useEffect } from 'react'; import React, { useEffect } from 'react';
import { useLanguage } from '@/contexts/LanguageContext'; import { useLanguage } from '@/contexts/LanguageContext';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs'; import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs';
import { MaintenanceTable, MaintenanceStatusChecker } from './maintenance'; import { MaintenanceTable, MaintenanceStatusChecker } from './maintenance';
import { EmptyMaintenanceState } from './maintenance/EmptyMaintenanceState'; import { LoadingState } from '@/components/services/LoadingState';
import { OverviewCard } from './common/OverviewCard';
import { Calendar, Clock, CheckCircle } from 'lucide-react'; import { Calendar, Clock, CheckCircle } from 'lucide-react';
import { useMaintenanceData } from './hooks/useMaintenanceData'; import { useMaintenanceData } from './hooks/useMaintenanceData';
import { Skeleton } from '@/components/ui/skeleton';
import { useToast } from '@/hooks/use-toast'; import { useToast } from '@/hooks/use-toast';
import { LoadingState } from '@/components/services/LoadingState'; import { useTheme } from '@/contexts/ThemeContext';
interface ScheduledMaintenanceTabProps { interface ScheduledMaintenanceTabProps {
refreshTrigger?: number; refreshTrigger?: number;
@@ -18,25 +15,24 @@ interface ScheduledMaintenanceTabProps {
export const ScheduledMaintenanceTab = ({ refreshTrigger = 0 }: ScheduledMaintenanceTabProps) => { export const ScheduledMaintenanceTab = ({ refreshTrigger = 0 }: ScheduledMaintenanceTabProps) => {
const { t } = useLanguage(); const { t } = useLanguage();
const { theme } = useTheme();
const { toast } = useToast(); const { toast } = useToast();
const [manualRefresh, setManualRefresh] = React.useState(0); const [manualRefresh, setManualRefresh] = React.useState(0);
// Combine the external refresh trigger with our internal one
const combinedRefreshTrigger = refreshTrigger + manualRefresh; const combinedRefreshTrigger = refreshTrigger + manualRefresh;
const { const {
loading, loading,
filter, filter,
setFilter, setFilter,
maintenanceData, maintenanceData,
overviewStats, overviewStats,
fetchMaintenanceData, fetchMaintenanceData,
isEmpty, isEmpty,
error, error,
initialized initialized,
} = useMaintenanceData({ refreshTrigger: combinedRefreshTrigger }); } = useMaintenanceData({ refreshTrigger: combinedRefreshTrigger });
// Display toast when error occurs
useEffect(() => { useEffect(() => {
if (error) { if (error) {
toast({ toast({
@@ -47,66 +43,91 @@ export const ScheduledMaintenanceTab = ({ refreshTrigger = 0 }: ScheduledMainten
} }
}, [error, toast, t]); }, [error, toast, t]);
// Force fetch data on initial load
useEffect(() => { useEffect(() => {
console.log("ScheduledMaintenanceTab is mounted, fetching data");
fetchMaintenanceData(true); fetchMaintenanceData(true);
}, [fetchMaintenanceData]); }, [fetchMaintenanceData]);
// Handle maintenance updates
const handleMaintenanceUpdated = () => { const handleMaintenanceUpdated = () => {
console.log("Maintenance updated, refreshing data"); setManualRefresh((prev) => prev + 1);
setManualRefresh(prev => prev + 1);
}; };
// Handle tab changes
const handleTabChange = (value: string) => { const handleTabChange = (value: string) => {
setFilter(value); setFilter(value);
}; };
// Show full-page loading state during initial load
if (loading && !initialized) { if (loading && !initialized) {
return <LoadingState />; return <LoadingState />;
} }
const gradientCard = (
title: string,
value: string | number,
icon: JSX.Element,
gradient: string
) => (
<Card
className="border-none rounded-xl shadow-lg overflow-hidden transition-all duration-300 hover:shadow-xl transform hover:-translate-y-1 relative z-10"
style={{
background: theme === 'dark'
? `linear-gradient(135deg, rgba(65,59,55,0.8) 0%, ${gradient})`
: `linear-gradient(135deg, rgba(65,59,55,0.8) 0%, ${gradient})`,
}}
>
<div className="absolute inset-0 z-0 opacity-10">
<div
className="w-full h-full"
style={{
backgroundImage: `linear-gradient(#000 1px, transparent 1px),
linear-gradient(90deg, #fff 1px, transparent 1px)`,
backgroundSize: '20px 20px',
}}
/>
</div>
<CardHeader className="pb-2 relative z-10">
<CardTitle className="text-sm font-medium text-white">{title}</CardTitle>
</CardHeader>
<CardContent className="flex items-center justify-between relative z-10">
<span className="text-4xl font-bold text-white">{value}</span>
<div className="rounded-full p-3 bg-white/25 backdrop-blur-sm">
{icon}
</div>
</CardContent>
</Card>
);
return ( return (
<> <>
{/* Status checker for automatic updates */} <MaintenanceStatusChecker
<MaintenanceStatusChecker
maintenanceData={maintenanceData} maintenanceData={maintenanceData}
onStatusUpdated={handleMaintenanceUpdated} onStatusUpdated={handleMaintenanceUpdated}
/> />
{/* Overview Cards */} {/* Overview Cards */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-6"> <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6 mb-8 w-full">
<OverviewCard {gradientCard(
title={t('upcomingMaintenance')} t('upcomingMaintenance'),
value={loading ? '...' : overviewStats.upcoming} loading ? '...' : overviewStats.upcoming,
icon={<Calendar className="h-5 w-5 text-white" />} <Calendar className="h-6 w-6 text-white" />,
isLoading={loading} 'rgba(59,130,246,0.6)'
color="blue" )}
/> {gradientCard(
<OverviewCard t('ongoingMaintenance'),
title={t('ongoingMaintenance')} loading ? '...' : overviewStats.ongoing,
value={loading ? '...' : overviewStats.ongoing} <Clock className="h-6 w-6 text-white" />,
icon={<Clock className="h-5 w-5 text-white" />} 'rgba(251,191,36,0.6)'
isLoading={loading} )}
color="amber" {gradientCard(
/> t('completedMaintenance'),
<OverviewCard loading ? '...' : overviewStats.completed,
title={t('completedMaintenance')} <CheckCircle className="h-6 w-6 text-white" />,
value={loading ? '...' : overviewStats.completed} 'rgba(34,197,94,0.6)'
icon={<CheckCircle className="h-5 w-5 text-white" />} )}
isLoading={loading} {gradientCard(
color="green" t('totalScheduledHours'),
/> loading ? '...' : `${overviewStats.totalDuration}h`,
<OverviewCard <Clock className="h-6 w-6 text-white" />,
title={t('totalScheduledHours')} 'rgba(139,92,246,0.6)'
value={loading ? '...' : `${overviewStats.totalDuration}h`} )}
icon={<Clock className="h-5 w-5 text-white" />}
isLoading={loading}
color="purple"
/>
</div> </div>
<Card> <Card>
@@ -117,10 +138,10 @@ export const ScheduledMaintenanceTab = ({ refreshTrigger = 0 }: ScheduledMainten
</CardDescription> </CardDescription>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<Tabs <Tabs
defaultValue="upcoming" defaultValue="upcoming"
value={filter} value={filter}
className="w-full" className="w-full"
onValueChange={handleTabChange} onValueChange={handleTabChange}
> >
<TabsList className="mb-6"> <TabsList className="mb-6">
@@ -129,24 +150,24 @@ export const ScheduledMaintenanceTab = ({ refreshTrigger = 0 }: ScheduledMainten
<TabsTrigger value="completed">{t('completedMaintenance')}</TabsTrigger> <TabsTrigger value="completed">{t('completedMaintenance')}</TabsTrigger>
</TabsList> </TabsList>
<TabsContent value="upcoming" className="space-y-4"> <TabsContent value="upcoming">
<MaintenanceTable <MaintenanceTable
data={maintenanceData} data={maintenanceData}
isLoading={loading && initialized} isLoading={loading && initialized}
onMaintenanceUpdated={handleMaintenanceUpdated} onMaintenanceUpdated={handleMaintenanceUpdated}
/> />
</TabsContent> </TabsContent>
<TabsContent value="ongoing" className="space-y-4"> <TabsContent value="ongoing">
<MaintenanceTable <MaintenanceTable
data={maintenanceData} data={maintenanceData}
isLoading={loading && initialized} isLoading={loading && initialized}
onMaintenanceUpdated={handleMaintenanceUpdated} onMaintenanceUpdated={handleMaintenanceUpdated}
/> />
</TabsContent> </TabsContent>
<TabsContent value="completed" className="space-y-4"> <TabsContent value="completed">
<MaintenanceTable <MaintenanceTable
data={maintenanceData} data={maintenanceData}
isLoading={loading && initialized} isLoading={loading && initialized}
onMaintenanceUpdated={handleMaintenanceUpdated} onMaintenanceUpdated={handleMaintenanceUpdated}