🚀 Initial commit: Versão atual do TrackSteel APP

This commit is contained in:
2026-03-18 21:17:53 +00:00
commit bde410c9ad
633 changed files with 108150 additions and 0 deletions
+124
View File
@@ -0,0 +1,124 @@
import React from 'react';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { AlertTriangle, Edit, Trash2, Clock } from 'lucide-react';
import { ApontamentoImprodutivo, calculateDuration } from '@/hooks/useRDOImprodutivos';
interface ImprodutivosListProps {
improdutivos: ApontamentoImprodutivo[];
onEdit?: (improdutivo: ApontamentoImprodutivo) => void;
onDelete?: (id: string) => void;
loading?: boolean;
}
export const ImproduitvosList: React.FC<ImprodutivosListProps> = ({
improdutivos,
onEdit,
onDelete,
loading = false,
}) => {
if (improdutivos.length === 0) {
return (
<Card>
<CardContent className="flex flex-col items-center justify-center py-8 text-center">
<AlertTriangle className="h-8 w-8 text-muted-foreground mb-2" />
<p className="text-muted-foreground">Nenhum tempo improdutivo registrado</p>
</CardContent>
</Card>
);
}
// Calcular total de tempo improdutivo
const totalMinutos = improdutivos.reduce((acc, item) => {
const duracao = calculateDuration(item.hora_inicio, item.hora_fim);
const [horas, minutos] = duracao.split(':').map(Number);
return acc + (horas * 60) + minutos;
}, 0);
const totalHoras = Math.floor(totalMinutos / 60);
const restoMinutos = totalMinutos % 60;
const totalFormatado = `${totalHoras}h ${restoMinutos.toString().padStart(2, '0')}m`;
return (
<Card>
<CardHeader className="pb-3">
<div className="flex items-center justify-between">
<CardTitle className="text-lg flex items-center gap-2">
<AlertTriangle className="w-5 h-5" />
Tempos Improdutivos
</CardTitle>
<Badge variant="destructive">
Total: {totalFormatado}
</Badge>
</div>
</CardHeader>
<CardContent className="space-y-3">
{improdutivos.map((improdutivo) => (
<div
key={improdutivo.id}
className="flex items-start justify-between p-3 border rounded-lg bg-muted/30"
>
<div className="flex-1">
<div className="flex items-center gap-2 mb-1">
<h5 className="font-medium">
{improdutivo.motivos_improdutivos?.motivo}
</h5>
<Badge variant="outline" className="text-xs">
{improdutivo.motivos_improdutivos?.categoria}
</Badge>
</div>
{improdutivo.motivos_improdutivos?.descricao && (
<p className="text-sm text-muted-foreground mb-2">
{improdutivo.motivos_improdutivos.descricao}
</p>
)}
<div className="flex items-center gap-4 text-sm text-muted-foreground mb-2">
<span className="flex items-center gap-1">
<Clock className="w-3 h-3" />
{improdutivo.hora_inicio} - {improdutivo.hora_fim}
</span>
<Badge variant="secondary" className="text-xs">
Duração: {calculateDuration(improdutivo.hora_inicio, improdutivo.hora_fim)}
</Badge>
</div>
{improdutivo.descricao && (
<div className="text-sm bg-muted/50 p-2 rounded">
<p className="text-muted-foreground text-xs mb-1">Descrição:</p>
<p>{improdutivo.descricao}</p>
</div>
)}
</div>
<div className="flex items-center gap-2 ml-4">
{onEdit && (
<Button
variant="ghost"
size="sm"
onClick={() => onEdit(improdutivo)}
disabled={loading}
>
<Edit className="w-4 h-4" />
</Button>
)}
{onDelete && (
<Button
variant="ghost"
size="sm"
onClick={() => onDelete(improdutivo.id)}
disabled={loading}
className="text-destructive hover:text-destructive"
>
<Trash2 className="w-4 h-4" />
</Button>
)}
</div>
</div>
))}
</CardContent>
</Card>
);
};