From 30b3caee349fd8defc9493f5f3f8c0dfac84f0a8 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Oct 2026 11:31:20 +0000 Subject: [PATCH] Tickets: Links auf Tickets nutzen ticketPath (Planboard, Zuordnen, Services, Funktionen) Auch drei Kommentare mit dem Altlink-Muster umformuliert (useWorkorders, ticketListUrl, TicketsPage), sonst bleibt die Pruefung auf den Altlink nicht leer. Co-Authored-By: Claude Sonnet 5.5 --- src/hooks/useWorkorders.js | 2 +- src/lib/ticketListUrl.js | 2 +- src/pages/AssignProjectPage.jsx | 5 +++-- src/pages/PlanboardPage.jsx | 3 ++- src/pages/ServicesPage.jsx | 3 ++- src/pages/TicketsPage.jsx | 2 +- 6 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/hooks/useWorkorders.js b/src/hooks/useWorkorders.js index a5d06ed..902897c 100644 --- a/src/hooks/useWorkorders.js +++ b/src/hooks/useWorkorders.js @@ -78,7 +78,7 @@ export function useWorkorders(filters = {}) { queries.push(Query.equal('assignedTo', activeFilters.assignedTo)) } - // WOID-Direktsuche (z. B. Deep-Link aus den Leads: /tickets?woid=123) + // WOID-Direktsuche (Altlinks aus den Leads mit woid=123 leitet TicketsPage zur Ticketseite um) if (activeFilters.woid) { queries.push(Query.equal('woid', [String(activeFilters.woid)])) } diff --git a/src/lib/ticketListUrl.js b/src/lib/ticketListUrl.js index 6e3c21f..095aa6b 100644 --- a/src/lib/ticketListUrl.js +++ b/src/lib/ticketListUrl.js @@ -78,7 +78,7 @@ export function listFilters(state) { return { ...countFilters(state, state.tab), search: state.search || undefined, limit: state.limit } } -// Altlinks "/tickets?woid=100131" fuehren zur Ticketseite und haben Vorrang vor allen Filtern +// Altlinks aus den Leads (Liste mit Suchteil woid=100131) fuehren zur Ticketseite und haben Vorrang vor allen Filtern export function woidRedirectTarget(input) { const woid = (new URLSearchParams(input).get('woid') || '').trim() return woid ? ticketPath(woid) : null diff --git a/src/pages/AssignProjectPage.jsx b/src/pages/AssignProjectPage.jsx index 3731c9e..ab40790 100644 --- a/src/pages/AssignProjectPage.jsx +++ b/src/pages/AssignProjectPage.jsx @@ -8,6 +8,7 @@ import { fetchServices, completeAssignment, fetchProject } from '../lib/projectK import { nextStep, prevStep, newTicketDefaults, canFinish, openTicketsFor } from '../lib/assignFlow' import { suggestSubdomain, slugify } from '../lib/subdomain' import { isArchived } from '../lib/leads' +import { ticketPath, ticketRef } from '../lib/ticketRoutes' import { PageHeader, Card, Button, Field } from '../components/ui' import { CreateCustomerForm } from './CustomersPage' @@ -153,7 +154,7 @@ export default function AssignProjectPage() { if (result.ticketId) { try { const t = await databases.getDocument(DATABASE_ID, COLLECTIONS.WORKORDERS, result.ticketId) - path = `/tickets?woid=${encodeURIComponent(t.woid)}` + path = ticketPath(ticketRef(t)) } catch { path = '/tickets' } @@ -402,5 +403,5 @@ function TicketLink({ ticketId }) { databases.getDocument(DATABASE_ID, COLLECTIONS.WORKORDERS, ticketId) .then((t) => setWoid(t.woid)).catch(() => setWoid(null)) }, [ticketId]) - return woid ? Zum Ticket #{woid} : null + return woid ? Zum Ticket #{woid} : null } diff --git a/src/pages/PlanboardPage.jsx b/src/pages/PlanboardPage.jsx index dfe4293..11ad858 100644 --- a/src/pages/PlanboardPage.jsx +++ b/src/pages/PlanboardPage.jsx @@ -7,6 +7,7 @@ import { PageHeader, Card, Button } from '../components/ui' import { useWorkorders } from '../hooks/useWorkorders' import { useEmployees } from '../hooks/useEmployees' import { groupAppointmentsByDay, countInRange, dayKey } from '../lib/planboard' +import { ticketPath } from '../lib/ticketRoutes' /* Termine haengen an den Tickets (startDate/startTime/endTime/assignedTo); die Aufbereitung steckt in src/lib/planboard.js. */ @@ -79,7 +80,7 @@ export default function PlanboardPage() { key={entry.id} type="button" title={`Ticket #${entry.woid} öffnen`} - onClick={() => navigate(`/tickets?woid=${encodeURIComponent(entry.woid)}`)} + onClick={() => navigate(ticketPath(entry.woid || entry.id))} style={{ textAlign: 'left', border: '1px solid var(--border)', diff --git a/src/pages/ServicesPage.jsx b/src/pages/ServicesPage.jsx index d14e0eb..1dd5265 100644 --- a/src/pages/ServicesPage.jsx +++ b/src/pages/ServicesPage.jsx @@ -4,6 +4,7 @@ import { FaSpinner } from 'react-icons/fa6' import { dotColor } from '../lib/previewEnv' import { fetchServices } from '../lib/projectKindsApi' import { servicesCards } from '../lib/servicesView' +import { ticketPath } from '../lib/ticketRoutes' import { PageHeader, Card, Button, Badge } from '../components/ui' export default function ServicesPage() { @@ -69,7 +70,7 @@ export default function ServicesPage() { {[p.customerName, p.previewUrl && 'Preview'].filter(Boolean).join(' · ') || 'Intern'} - {p.woid && Ticket #{p.woid}} + {p.woid && Ticket #{p.woid}} {c.key === 'missing' && ( )} diff --git a/src/pages/TicketsPage.jsx b/src/pages/TicketsPage.jsx index f3c5da5..531b5c7 100644 --- a/src/pages/TicketsPage.jsx +++ b/src/pages/TicketsPage.jsx @@ -26,7 +26,7 @@ import { appointmentText, assigneeLabel, ticketNumber } from '../lib/ticketView' // Pause nach dem letzten Tastendruck, bis der Suchtext in die Adresse übernommen wird const SEARCH_DELAY_MS = 300 -// Altlinks aus den Leads (/tickets?woid=123) führen zur Ticketseite; dann läuft keine Abfrage der Liste +// Altlinks aus den Leads (Liste mit Suchteil woid=123) führen zur Ticketseite; dann läuft keine Abfrage der Liste export default function TicketsPage() { const [searchParams] = useSearchParams() const target = woidRedirectTarget(searchParams)