Add equipment fail feature

This commit is contained in:
Urtzi Alfaro
2026-01-11 17:03:46 +01:00
parent b66bfda100
commit ce4f3aff8c
19 changed files with 2101 additions and 51 deletions

View File

@@ -11,9 +11,14 @@ import { EquipmentModal } from '../../../../components/domain/equipment/Equipmen
import { DeleteEquipmentModal } from '../../../../components/domain/equipment/DeleteEquipmentModal';
import { MaintenanceHistoryModal } from '../../../../components/domain/equipment/MaintenanceHistoryModal';
import { ScheduleMaintenanceModal, type MaintenanceScheduleData } from '../../../../components/domain/equipment/ScheduleMaintenanceModal';
import { ReportFailureModal } from '../../../../components/domain/equipment/ReportFailureModal';
import { MarkAsRepairedModal } from '../../../../components/domain/equipment/MarkAsRepairedModal';
import { useEquipment, useCreateEquipment, useUpdateEquipment, useDeleteEquipment, useHardDeleteEquipment } from '../../../../api/hooks/equipment';
import { equipmentService } from '../../../../api/services/equipment';
import { useQueryClient } from '@tanstack/react-query';
const MaquinariaPage: React.FC = () => {
const queryClient = useQueryClient();
const { t } = useTranslation(['equipment', 'common']);
const [searchTerm, setSearchTerm] = useState('');
const [statusFilter, setStatusFilter] = useState('');
@@ -26,6 +31,8 @@ const MaquinariaPage: React.FC = () => {
const [showDeleteModal, setShowDeleteModal] = useState(false);
const [showHistoryModal, setShowHistoryModal] = useState(false);
const [showScheduleModal, setShowScheduleModal] = useState(false);
const [showReportFailureModal, setShowReportFailureModal] = useState(false);
const [showMarkRepairedModal, setShowMarkRepairedModal] = useState(false);
const [equipmentForAction, setEquipmentForAction] = useState<Equipment | null>(null);
const currentTenant = useCurrentTenant();
@@ -82,11 +89,75 @@ const MaquinariaPage: React.FC = () => {
}
};
const handleReportFailure = (equipment: Equipment) => {
setEquipmentForAction(equipment);
setShowReportFailureModal(true);
};
const handleMarkAsRepaired = (equipment: Equipment) => {
setEquipmentForAction(equipment);
setShowMarkRepairedModal(true);
};
const handleScheduleMaintenance = (equipment: Equipment) => {
setEquipmentForAction(equipment);
setShowScheduleModal(true);
};
const handleReportFailureSubmit = async (equipmentId: string, failureData: {
failureType: string;
severity: string;
description: string;
photos?: File[];
estimatedImpact: boolean;
}) => {
try {
// Use the new API endpoint
await equipmentService.reportEquipmentFailure(
tenantId,
equipmentId,
failureData
);
// Refresh equipment data
await queryClient.invalidateQueries({ queryKey: ['equipment', tenantId] });
setShowReportFailureModal(false);
setEquipmentForAction(null);
} catch (error) {
console.error('Error reporting failure:', error);
throw error;
}
};
const handleMarkAsRepairedSubmit = async (equipmentId: string, repairData: {
repairDate: string;
technicianName: string;
repairDescription: string;
partsReplaced: string[];
cost: number;
photos?: File[];
testResults: boolean;
}) => {
try {
// Use the new API endpoint
await equipmentService.markEquipmentAsRepaired(
tenantId,
equipmentId,
repairData
);
// Refresh equipment data
await queryClient.invalidateQueries({ queryKey: ['equipment', tenantId] });
setShowMarkRepairedModal(false);
setEquipmentForAction(null);
} catch (error) {
console.error('Error marking as repaired:', error);
throw error;
}
};
const handleScheduleMaintenanceSubmit = async (equipmentId: string, maintenanceData: MaintenanceScheduleData) => {
try {
// Update next maintenance date based on scheduled date
@@ -104,6 +175,8 @@ const MaquinariaPage: React.FC = () => {
}
};
const handleViewMaintenanceHistory = (equipment: Equipment) => {
setEquipmentForAction(equipment);
setShowHistoryModal(true);
@@ -380,6 +453,28 @@ const MaquinariaPage: React.FC = () => {
priority: 'primary',
onClick: () => handleShowMaintenanceDetails(equipment)
},
// Context-aware actions based on equipment status
...(equipment.status === 'operational' || equipment.status === 'warning' ? [
{
label: t('actions.report_failure'),
icon: AlertTriangle,
variant: 'outline' as const,
priority: 'secondary' as const,
highlighted: true,
destructive: true,
onClick: () => handleReportFailure(equipment)
}
] : []),
...(equipment.status === 'down' ? [
{
label: t('actions.mark_repaired'),
icon: CheckCircle,
variant: 'primary' as const,
priority: 'secondary' as const,
highlighted: true,
onClick: () => handleMarkAsRepaired(equipment)
}
] : []),
{
label: t('actions.view_history'),
icon: History,
@@ -459,6 +554,34 @@ const MaquinariaPage: React.FC = () => {
/>
)}
{/* Report Failure Modal */}
{showReportFailureModal && equipmentForAction && (
<ReportFailureModal
isOpen={showReportFailureModal}
onClose={() => {
setShowReportFailureModal(false);
setEquipmentForAction(null);
}}
equipment={equipmentForAction}
onReportFailure={(failureData) => handleReportFailureSubmit(equipmentForAction.id, failureData)}
isLoading={updateEquipmentMutation.isPending}
/>
)}
{/* Mark as Repaired Modal */}
{showMarkRepairedModal && equipmentForAction && (
<MarkAsRepairedModal
isOpen={showMarkRepairedModal}
onClose={() => {
setShowMarkRepairedModal(false);
setEquipmentForAction(null);
}}
equipment={equipmentForAction}
onMarkAsRepaired={(repairData) => handleMarkAsRepairedSubmit(equipmentForAction.id, repairData)}
isLoading={updateEquipmentMutation.isPending}
/>
)}
{/* Schedule Maintenance Modal */}
{showScheduleModal && equipmentForAction && (
<ScheduleMaintenanceModal