From 5d8130e8eff318de9de1565584a0214eede25ef0 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 6 Oct 2026 15:42:02 +0000 Subject: [PATCH] Tickets: Standardansicht zeigt alle Arten, auch Akquise-Tickets Bisher startete die Liste mit dem Art-Filter "Auftraege", der Akquise-Tickets ausschliesst. Neue Kunden bekommen ein Akquise-Ticket, das dann unter Tickets nicht zu finden war. Standard ist jetzt "Alle Arten"; "Auftraege (ohne Akquise)" bleibt als Filter waehlbar. Co-Authored-By: Claude Opus 5.5 --- src/hooks/useWorkorders.js | 2 +- src/lib/ticketListUrl.js | 2 +- src/lib/ticketStatus.js | 6 +++--- src/pages/TicketsPage.jsx | 2 +- tests/unit/ticketListUrl.test.mjs | 12 ++++++++++-- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/hooks/useWorkorders.js b/src/hooks/useWorkorders.js index 902897c..340cf4d 100644 --- a/src/hooks/useWorkorders.js +++ b/src/hooks/useWorkorders.js @@ -61,7 +61,7 @@ export function useWorkorders(filters = {}) { queries.push(Query.equal('type', activeFilters.type)) } - // Standardansicht "Auftraege": alles ausser Akquise-Tickets + // Filter "Auftraege": alles ausser Akquise-Tickets if (activeFilters.excludeType) { queries.push(Query.notEqual('type', activeFilters.excludeType)) } diff --git a/src/lib/ticketListUrl.js b/src/lib/ticketListUrl.js index 095aa6b..0125533 100644 --- a/src/lib/ticketListUrl.js +++ b/src/lib/ticketListUrl.js @@ -12,7 +12,7 @@ export const LIST_TABS = [ { id: 'alle', label: 'Alle', groups: null }, ] -export const LIST_DEFAULTS = { tab: 'aktiv', typeId: 'orders', urgentOnly: false, search: '', limit: 10 } +export const LIST_DEFAULTS = { tab: 'aktiv', typeId: 'all', urgentOnly: false, search: '', limit: 10 } const MIN_LIMIT = 10 const MAX_LIMIT = 500 diff --git a/src/lib/ticketStatus.js b/src/lib/ticketStatus.js index 216c9f9..f596427 100644 --- a/src/lib/ticketStatus.js +++ b/src/lib/ticketStatus.js @@ -93,14 +93,14 @@ export function ticketTypeLabel(type) { return TYPE_LABELS[type] || type } -// Filter nach Art: "Auftraege" = alles ausser Akquise +// Filter nach Art: Standard "Alle Arten" (auch Akquise), "Auftraege" = alles ausser Akquise export const TYPE_FILTERS = [ - { id: 'orders', label: 'Aufträge', excludeType: 'Akquise' }, + { id: 'all', label: 'Alle Arten' }, + { id: 'orders', label: 'Aufträge (ohne Akquise)', excludeType: 'Akquise' }, { id: 'Webpage', label: 'Webpage', types: ['Webpage'] }, { id: 'Migration', label: 'Migration', types: ['Migration'] }, { id: 'Project', label: 'Projekt', types: ['Project'] }, { id: 'Akquise', label: 'Akquise', types: ['Akquise'] }, - { id: 'all', label: 'Aufträge und Akquise' }, ] // Suche in Kunde, Betreff, "Angefragt von" und WOID, ohne Gross-/Kleinschreibung diff --git a/src/pages/TicketsPage.jsx b/src/pages/TicketsPage.jsx index 60bd8f8..e483476 100644 --- a/src/pages/TicketsPage.jsx +++ b/src/pages/TicketsPage.jsx @@ -168,7 +168,7 @@ function TicketList() { content = ( Neues Ticket} /> ) diff --git a/tests/unit/ticketListUrl.test.mjs b/tests/unit/ticketListUrl.test.mjs index 204e65c..befdd95 100644 --- a/tests/unit/ticketListUrl.test.mjs +++ b/tests/unit/ticketListUrl.test.mjs @@ -8,7 +8,7 @@ const { TYPE_FILTERS } = await loadModule('src/lib/ticketStatus.js') test('Reiter und Art-Auswahl nach Spec', () => { assert.deepEqual(LIST_TABS.map((t) => [t.id, t.label]), [['aktiv', 'Aktiv'], ['open', 'Offen'], ['working', 'In Arbeit'], ['waiting', 'Wartet auf Kunde'], ['review', 'Prüfung'], ['done', 'Erledigt'], ['cancelled', 'Storniert'], ['alle', 'Alle']]) - assert.deepEqual(TYPE_FILTERS.map((f) => f.label), ['Aufträge', 'Webpage', 'Migration', 'Projekt', 'Akquise', 'Aufträge und Akquise']) + assert.deepEqual(TYPE_FILTERS.map((f) => f.label), ['Alle Arten', 'Aufträge (ohne Akquise)', 'Webpage', 'Migration', 'Projekt', 'Akquise']) }) test('parse: Standard, gültige und ungültige Werte', () => { @@ -31,7 +31,7 @@ test('Filteränderung setzt limit zurück, Mehr laden +10 bis 500', () => { }) test('listFilters und countFilters', () => { - assert.deepEqual(listFilters(LIST_DEFAULTS), { status: ['Open', 'Occupied', 'Assigned', 'Added Info', 'In Kontakt', 'Awaiting', 'Halted', 'In Test'], type: [], excludeType: 'Akquise', priority: [], search: undefined, limit: 10 }) + assert.deepEqual(listFilters(LIST_DEFAULTS), { status: ['Open', 'Occupied', 'Assigned', 'Added Info', 'In Kontakt', 'Awaiting', 'Halted', 'In Test'], type: [], excludeType: undefined, priority: [], search: undefined, limit: 10 }) assert.deepEqual(listFilters({ ...LIST_DEFAULTS, tab: 'alle', typeId: 'Akquise', urgentOnly: true, search: 'abc' }), { status: [], type: ['Akquise'], excludeType: undefined, priority: [3, 4], search: 'abc', limit: 10 }) assert.deepEqual(listFilters({ ...LIST_DEFAULTS, tab: 'done' }).status, ['Closed', 'Zugesagt']) const s = { ...LIST_DEFAULTS, typeId: 'Webpage', urgentOnly: true, search: 'zzz', limit: 80 } @@ -39,6 +39,14 @@ test('listFilters und countFilters', () => { for (const t of LIST_TABS) assert.deepEqual(countFilters(s, t.id).status, listFilters({ ...s, tab: t.id }).status, t.id) }) +test('Standardansicht zeigt alle Arten, auch Akquise', () => { + assert.equal(LIST_DEFAULTS.typeId, 'all') + assert.equal(parse('').typeId, 'all') + assert.equal(ser({ ...LIST_DEFAULTS }).get('art'), null) + assert.equal(parse(ser({ ...LIST_DEFAULTS, typeId: 'orders' })).typeId, 'orders') + assert.deepEqual(listFilters({ ...LIST_DEFAULTS, typeId: 'orders' }).excludeType, 'Akquise') +}) + test('woid-Umleitung hat Vorrang', () => { assert.equal(woidRedirectTarget('?woid=100131'), '/tickets/100131') assert.equal(woidRedirectTarget('?woid=%20100131%20&status=done&q=x'), '/tickets/100131')