main page

This commit is contained in:
2025-12-17 17:55:13 +01:00
commit 7fb446c53a
8943 changed files with 1209030 additions and 0 deletions

162
src/hooks/useWorkorders.js Normal file
View File

@@ -0,0 +1,162 @@
import { useState, useEffect, useCallback } from 'react'
import { databases, DATABASE_ID, COLLECTIONS, Query, ID } from '../lib/appwrite'
const DEMO_MODE = !import.meta.env.VITE_APPWRITE_PROJECT_ID
// Demo data for testing without Appwrite
const DEMO_WORKORDERS = [
{ $id: '1', title: 'Server Wartung', description: 'Monatliche Wartung', status: 'Open', priority: 2, type: 'Maintenance', customerName: 'Kunde A', assignedName: 'Max M.', response: 'Onsite', $createdAt: new Date().toISOString() },
{ $id: '2', title: 'Netzwerk Problem', description: 'WLAN funktioniert nicht', status: 'Occupied', priority: 3, type: 'Support', customerName: 'Kunde B', assignedName: 'Lisa S.', response: 'Remote', $createdAt: new Date().toISOString() },
{ $id: '3', title: 'Software Installation', description: 'Office 365 Setup', status: 'Assigned', priority: 1, type: 'Installation', customerName: 'Kunde C', assignedName: 'Tom K.', response: 'Onsite', $createdAt: new Date().toISOString() },
{ $id: '4', title: 'Drucker defekt', description: 'Papierstau', status: 'Awaiting', priority: 2, type: 'Hardware', customerName: 'Kunde D', assignedName: '', response: 'Pickup', $createdAt: new Date().toISOString() },
{ $id: '5', title: 'Kritischer Serverausfall', description: 'Produktionsserver down', status: 'Open', priority: 4, type: 'Emergency', customerName: 'Kunde E', assignedName: 'Max M.', response: 'Onsite', $createdAt: new Date().toISOString() },
]
export function useWorkorders(filters = {}) {
const [workorders, setWorkorders] = useState([])
const [loading, setLoading] = useState(true)
const [error, setError] = useState(null)
const fetchWorkorders = useCallback(async () => {
setLoading(true)
if (DEMO_MODE) {
// Filter demo data
let filtered = [...DEMO_WORKORDERS]
if (filters.status?.length > 0) {
filtered = filtered.filter(wo => filters.status.includes(wo.status))
}
if (filters.priority?.length > 0) {
filtered = filtered.filter(wo => filters.priority.includes(wo.priority))
}
if (filters.limit) {
filtered = filtered.slice(0, filters.limit)
}
setWorkorders(filtered)
setLoading(false)
return
}
try {
const queries = [Query.orderDesc('$createdAt')]
if (filters.limit) {
queries.push(Query.limit(filters.limit))
}
if (filters.status && filters.status.length > 0) {
queries.push(Query.equal('status', filters.status))
}
if (filters.type && filters.type.length > 0) {
queries.push(Query.equal('type', filters.type))
}
if (filters.priority && filters.priority.length > 0) {
queries.push(Query.equal('priority', filters.priority))
}
if (filters.customerId) {
queries.push(Query.equal('customerId', filters.customerId))
}
if (filters.assignedTo) {
queries.push(Query.equal('assignedTo', filters.assignedTo))
}
const response = await databases.listDocuments(
DATABASE_ID,
COLLECTIONS.WORKORDERS,
queries
)
setWorkorders(response.documents)
setError(null)
} catch (err) {
setError(err.message)
console.error('Error fetching workorders:', err)
} finally {
setLoading(false)
}
}, [filters])
useEffect(() => {
fetchWorkorders()
}, [fetchWorkorders])
const createWorkorder = async (data) => {
if (DEMO_MODE) {
const newWo = { ...data, $id: Date.now().toString(), status: 'Open', $createdAt: new Date().toISOString() }
setWorkorders(prev => [newWo, ...prev])
return { success: true, data: newWo }
}
try {
const response = await databases.createDocument(
DATABASE_ID,
COLLECTIONS.WORKORDERS,
ID.unique(),
{
...data,
status: 'Open',
createdAt: new Date().toISOString()
}
)
setWorkorders(prev => [response, ...prev])
return { success: true, data: response }
} catch (err) {
return { success: false, error: err.message }
}
}
const updateWorkorder = async (id, data) => {
if (DEMO_MODE) {
setWorkorders(prev => prev.map(wo => wo.$id === id ? { ...wo, ...data } : wo))
return { success: true }
}
try {
const response = await databases.updateDocument(
DATABASE_ID,
COLLECTIONS.WORKORDERS,
id,
data
)
setWorkorders(prev =>
prev.map(wo => wo.$id === id ? response : wo)
)
return { success: true, data: response }
} catch (err) {
return { success: false, error: err.message }
}
}
const deleteWorkorder = async (id) => {
if (DEMO_MODE) {
setWorkorders(prev => prev.filter(wo => wo.$id !== id))
return { success: true }
}
try {
await databases.deleteDocument(
DATABASE_ID,
COLLECTIONS.WORKORDERS,
id
)
setWorkorders(prev => prev.filter(wo => wo.$id !== id))
return { success: true }
} catch (err) {
return { success: false, error: err.message }
}
}
return {
workorders,
loading,
error,
refresh: fetchWorkorders,
createWorkorder,
updateWorkorder,
deleteWorkorder
}
}