Update Schedule and Maintenace Overview Card Liner-Gradient
This commit is contained in:
@@ -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}
|
||||||
|
|||||||
Reference in New Issue
Block a user