diff --git a/src/lib/ui/AccountingView.svelte b/src/lib/ui/AccountingView.svelte index 291b5c2e..07ad2e77 100644 --- a/src/lib/ui/AccountingView.svelte +++ b/src/lib/ui/AccountingView.svelte @@ -209,7 +209,7 @@ addSumRow: boolean ) => { let data = []; - data.push(cols.map((col) => col.text.trim())); + data.push(cols.map((col) => col.text.join(' '))); for (let row of rows) { data.push(cols.map((col) => col.toTableEntry(row))); } diff --git a/src/lib/ui/SortableTable.svelte b/src/lib/ui/SortableTable.svelte index 4532eb9e..b4ab7c01 100644 --- a/src/lib/ui/SortableTable.svelte +++ b/src/lib/ui/SortableTable.svelte @@ -12,7 +12,7 @@ }: { rows: T[]; cols: { - text: string; + text: string[]; sort: undefined | ((r1: T, r2: T) => number); toTableEntry: (r: T) => string | number; }[]; @@ -36,25 +36,31 @@ }; +{#snippet tableHead(text: string[], i: number, sort: boolean)} + {#if sort} + + + + {:else} + + {#each text as line} + {line}
+ {/each}
+ {/if} +{/snippet} +
{#each cols as col, i} - {#if col.sort != undefined} - - - - {:else} - {col.text} - {/if} + {@render tableHead(col.text, i, col.sort != undefined)} {/each} diff --git a/src/lib/ui/tableData.ts b/src/lib/ui/tableData.ts index 163d01ef..773fa031 100644 --- a/src/lib/ui/tableData.ts +++ b/src/lib/ui/tableData.ts @@ -21,7 +21,7 @@ export type Subtractions = CompanyRow & { }; export type Column = { - text: string; + text: string[]; sort: undefined | ((r1: T, r2: T) => number); toTableEntry: (r: T) => string | number; }; @@ -64,7 +64,7 @@ const displayDuration = (duration: number) => { }; const firstTourColAdmin: Column = { - text: 'Unternehmen', + text: ['Unternehmen'], sort: (a: TourWithRequests, b: TourWithRequests) => a.companyId - b.companyId, toTableEntry: (r: TourWithRequests) => r.companyName ?? '' }; @@ -72,39 +72,39 @@ const firstTourColAdmin: Column = { const restTourCols = (isAdmin: boolean): Column[] => { return [ { - text: 'Fahrzeug', + text: ['Fahrzeug'], sort: (a: TourWithRequests, b: TourWithRequests) => a.vehicleId - b.vehicleId, toTableEntry: (r: TourWithRequests) => r.licensePlate ?? '' }, { - text: 'Abfahrt ', + text: ['Abfahrt'], sort: (t1: TourWithRequests, t2: TourWithRequests) => t1.startTime - t2.startTime, toTableEntry: (r: TourWithRequests) => displayUnixtimeMs(r.startTime, true) }, { - text: 'Ankunft', + text: ['Ankunft'], sort: (t1: TourWithRequests, t2: TourWithRequests) => t1.endTime - t2.endTime, toTableEntry: (r: TourWithRequests) => displayUnixtimeMs(r.endTime, true) }, { - text: 'Kunden', + text: ['Kunden'], sort: (t1: TourWithRequests, t2: TourWithRequests) => getCustomerCount(t1, false) - getCustomerCount(t2, false), toTableEntry: (r: TourWithRequests) => getCustomerCount(r, false) }, { - text: 'erschienene Kunden ', + text: ['erschienene', 'Kunden'], sort: (t1: TourWithRequests, t2: TourWithRequests) => getCustomerCount(t1, true) - getCustomerCount(t2, true), toTableEntry: (r: TourWithRequests) => getCustomerCount(r, true) }, { - text: 'Taxameterstand ', + text: ['Taxameterstand'], sort: (t1: TourWithRequests, t2: TourWithRequests) => (t1.fare ?? 0) - (t2.fare ?? 0), toTableEntry: (r: TourWithRequests) => getEuroString(r.fare) }, { - text: isAdmin ? 'Kosten ' : 'Einnahmen ', + text: isAdmin ? ['Kosten'] : ['Einnahmen'], sort: (t1: TourWithRequests, t2: TourWithRequests) => getTourCost(t1) - getTourCost(t2), toTableEntry: (r: TourWithRequests) => getEuroString(getTourCost(r)) } @@ -116,52 +116,52 @@ export const tourColsCompany = restTourCols(false); export const subtractionColsAdmin: Column[] = [ { - text: 'Unternehmen', + text: ['Unternehmen'], sort: (a: Subtractions, b: Subtractions) => a.companyId - b.companyId, toTableEntry: (r: Subtractions) => r.companyName ?? '' }, { - text: 'Fahrzeug', + text: ['Fahrzeug'], sort: (a: Subtractions, b: Subtractions) => a.vehicleId - b.vehicleId, toTableEntry: (r: Subtractions) => r.licensePlate ?? '' }, { - text: 'Tag ', + text: ['Tag'], sort: (a: Subtractions, b: Subtractions) => a.timestamp - b.timestamp, toTableEntry: (r: Subtractions) => displayUnixtimeMs(r.timestamp) }, { - text: 'Kunden', + text: ['Kunden'], sort: (a: Subtractions, b: Subtractions) => a.customerCount - b.customerCount, toTableEntry: (r: Subtractions) => r.customerCount }, { - text: 'erschienene Kunden ', + text: ['erschienene', 'Kunden'], sort: (a: Subtractions, b: Subtractions) => a.verifiedCustomerCount - b.verifiedCustomerCount, toTableEntry: (r: Subtractions) => r.verifiedCustomerCount }, { - text: 'Taxameterstand kumuliert ', + text: ['Taxameterstand', 'kumuliert'], sort: (a: Subtractions, b: Subtractions) => a.taxameter - b.taxameter, toTableEntry: (r: Subtractions) => getEuroString(r.taxameter) }, { - text: 'Einnahmen ohne Obergrenze ', + text: ['Einnahmen', 'ohne Obergrenze'], sort: (a: Subtractions, b: Subtractions) => a.uncapped - b.uncapped, toTableEntry: (r: Subtractions) => getEuroString(r.uncapped) }, { - text: 'gesetzte Verfügbarkeit', + text: ['gesetzte', 'Verfügbarkeit'], sort: (a: Subtractions, b: Subtractions) => a.availabilityDuration - b.availabilityDuration, toTableEntry: (r: Subtractions) => displayDuration(r.availabilityDuration) }, { - text: 'Obergrenze', + text: ['Obergrenze'], sort: (a: Subtractions, b: Subtractions) => a.availabilityDuration - b.availabilityDuration, toTableEntry: (r: Subtractions) => getEuroString((r.availabilityDuration / HOUR) * CAP) }, { - text: 'über Obergrenze', + text: ['über', 'Obergrenze'], sort: (a: Subtractions, b: Subtractions) => a.uncapped - (a.availabilityDuration / HOUR) * CAP - @@ -170,12 +170,12 @@ export const subtractionColsAdmin: Column[] = [ getEuroString(r.uncapped - (r.availabilityDuration / HOUR) * CAP) }, { - text: 'Einnahmen mit Obergrenze ', + text: ['Einnahmen', 'mit Obergrenze'], sort: (a: Subtractions, b: Subtractions) => a.capped - b.capped, toTableEntry: (r: Subtractions) => getEuroString(r.capped) }, { - text: 'Abzüge ', + text: ['Abzüge'], sort: (a: Subtractions, b: Subtractions) => a.uncapped - a.capped - b.uncapped + b.capped, toTableEntry: (r: Subtractions) => getEuroString(r.uncapped - r.capped) } @@ -185,33 +185,37 @@ export const subtractionColsCompany = subtractionColsAdmin.slice(1); export const companyColsAdmin: Column[] = [ { - text: 'Unternehmen', + text: ['Unternehmen'], sort: (a: CompanyRow, b: CompanyRow) => a.companyId - b.companyId, toTableEntry: (r: CompanyRow) => r.companyName ?? '' }, - { text: 'Kunden', sort: undefined, toTableEntry: (r: CompanyRow) => r.customerCount }, { - text: 'erschienene Kunden ', - sort: undefined, + text: ['Kunden'], + sort: (a: CompanyRow, b: CompanyRow) => a.customerCount - b.customerCount, + toTableEntry: (r: CompanyRow) => r.customerCount + }, + { + text: ['erschienene', 'Kunden'], + sort: (a: CompanyRow, b: CompanyRow) => a.verifiedCustomerCount - b.verifiedCustomerCount, toTableEntry: (r: CompanyRow) => r.verifiedCustomerCount }, { - text: 'Taxameterstand kumuliert ', + text: ['Taxameterstand', 'kumuliert'], sort: (a: CompanyRow, b: CompanyRow) => a.taxameter - b.taxameter, toTableEntry: (r: CompanyRow) => getEuroString(r.taxameter) }, { - text: 'Kosten ohne Obergrenze ', + text: ['Kosten ohne', 'Obergrenze'], sort: (a: CompanyRow, b: CompanyRow) => a.uncapped - b.uncapped, toTableEntry: (r: CompanyRow) => getEuroString(r.uncapped) }, { - text: 'Kosten mit Obergrenze ', + text: ['Kosten mit Obergrenze'], sort: (a: CompanyRow, b: CompanyRow) => a.capped - b.capped, toTableEntry: (r: CompanyRow) => getEuroString(r.capped) }, { - text: 'Abzüge ', + text: ['Abzüge'], sort: (a: CompanyRow, b: CompanyRow) => a.uncapped - a.capped - b.uncapped + b.capped, toTableEntry: (r: CompanyRow) => getEuroString(r.uncapped - r.capped) }