Skip to content

Commit 68c837f

Browse files
committed
wip
1 parent 1ac8b6e commit 68c837f

25 files changed

+1303
-512
lines changed

src/lib/server/db/getTours.ts

+70
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,73 @@ export const getTours = async (
7171
export type Tours = Awaited<ReturnType<typeof getTours>>;
7272
export type Tour = Tours[0];
7373
export type TourEvent = Tour['events'][0];
74+
75+
export const getToursWithRequests = async (
76+
selectCancelled: boolean,
77+
companyId?: number,
78+
timeRange?: [UnixtimeMs, UnixtimeMs]
79+
) => {
80+
return await db
81+
.selectFrom('tour')
82+
.$if(!selectCancelled, (qb) => qb.where('tour.cancelled', '=', false))
83+
.innerJoin('vehicle', 'vehicle.id', 'tour.vehicle')
84+
.innerJoin('company', 'company.id', 'vehicle.company')
85+
.$if(typeof companyId === 'number', (qb) => qb.where('company', '=', companyId!))
86+
.$if(!!timeRange, (qb) =>
87+
qb.where('tour.departure', '<', timeRange![1]).where('tour.arrival', '>', timeRange![0])
88+
)
89+
.select((eb) => [
90+
'tour.id as tourId',
91+
'tour.fare as fare',
92+
'tour.departure as startTime',
93+
'tour.arrival as endTime',
94+
'tour.cancelled',
95+
'tour.message',
96+
'company.id as companyId',
97+
'company.name as companyName',
98+
'company.address as companyAddress',
99+
'company.lat as companyLat',
100+
'company.lng as companyLng',
101+
'vehicle.id as vehicleId',
102+
'vehicle.licensePlate as licensePlate',
103+
jsonArrayFrom(
104+
eb
105+
.selectFrom('request')
106+
.$if(!selectCancelled, (qb) => qb.where('request.cancelled', '=', false))
107+
.whereRef('tour.id', '=', 'request.tour')
108+
.select((eb) => [
109+
'request.bikes',
110+
'request.customer',
111+
'request.luggage',
112+
'request.passengers',
113+
'request.wheelchairs',
114+
'request.id as requestId',
115+
jsonArrayFrom(
116+
eb
117+
.selectFrom('event')
118+
.$if(!selectCancelled, (qb) => qb.where('event.cancelled', '=', false))
119+
.whereRef('request.id', '=', 'event.request')
120+
.select([
121+
'event.id',
122+
'event.communicatedTime',
123+
'event.address',
124+
'event.eventGroup',
125+
'event.isPickup',
126+
'event.lat',
127+
'event.lng',
128+
'event.nextLegDuration',
129+
'event.prevLegDuration',
130+
'event.scheduledTimeStart',
131+
'event.scheduledTimeEnd',
132+
'event.cancelled'
133+
])
134+
).as('events')
135+
])
136+
).as('requests')
137+
])
138+
.execute();
139+
};
140+
141+
export type ToursWithRequests = Awaited<ReturnType<typeof getToursWithRequests>>;
142+
export type TourWithRequests = ToursWithRequests[0];
143+
export type TourRequest = TourWithRequests['requests'][0];
+22-20
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
1-
import type { UnixtimeMs } from "$lib/util/UnixtimeMs";
2-
import type { VehicleId } from "../booking/VehicleId";
3-
import { groupBy } from "./groupBy";
4-
import { Interval } from "./interval";
1+
import type { UnixtimeMs } from '$lib/util/UnixtimeMs';
2+
import type { VehicleId } from '../booking/VehicleId';
3+
import { groupBy } from '../../util/groupBy';
4+
import { Interval } from './interval';
55

6-
export function mergeAvailabilities(availabilities: {
7-
vehicleId: VehicleId,
8-
startTime: UnixtimeMs,
9-
endTime: UnixtimeMs
10-
}[]): Map<VehicleId, Interval[]> {
11-
// group availabilities by vehicle
12-
const availabilitiesPerVehicle = groupBy(
13-
availabilities,
14-
(a) => a.vehicleId,
15-
(a) => new Interval(a.startTime, a.endTime)
16-
);
17-
// merge availabilities belonging to same vehicle
18-
availabilitiesPerVehicle.forEach((availabilities, vehicle) =>
19-
availabilitiesPerVehicle.set(vehicle, Interval.merge(availabilities))
20-
);
21-
return availabilitiesPerVehicle;
6+
export function mergeAvailabilities(
7+
availabilities: {
8+
vehicleId: VehicleId;
9+
startTime: UnixtimeMs;
10+
endTime: UnixtimeMs;
11+
}[]
12+
): Map<VehicleId, Interval[]> {
13+
// group availabilities by vehicle
14+
const availabilitiesPerVehicle = groupBy(
15+
availabilities,
16+
(a) => a.vehicleId,
17+
(a) => new Interval(a.startTime, a.endTime)
18+
);
19+
// merge availabilities belonging to same vehicle
20+
availabilitiesPerVehicle.forEach((availabilities, vehicle) =>
21+
availabilitiesPerVehicle.set(vehicle, Interval.merge(availabilities))
22+
);
23+
return availabilitiesPerVehicle;
2224
}
+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import Root from "./range-calendar.svelte";
2+
import Cell from "./range-calendar-cell.svelte";
3+
import Day from "./range-calendar-day.svelte";
4+
import Grid from "./range-calendar-grid.svelte";
5+
import Header from "./range-calendar-header.svelte";
6+
import Months from "./range-calendar-months.svelte";
7+
import GridRow from "./range-calendar-grid-row.svelte";
8+
import Heading from "./range-calendar-heading.svelte";
9+
import GridBody from "./range-calendar-grid-body.svelte";
10+
import GridHead from "./range-calendar-grid-head.svelte";
11+
import HeadCell from "./range-calendar-head-cell.svelte";
12+
import NextButton from "./range-calendar-next-button.svelte";
13+
import PrevButton from "./range-calendar-prev-button.svelte";
14+
15+
export {
16+
Day,
17+
Cell,
18+
Grid,
19+
Header,
20+
Months,
21+
GridRow,
22+
Heading,
23+
GridBody,
24+
GridHead,
25+
HeadCell,
26+
NextButton,
27+
PrevButton,
28+
//
29+
Root as RangeCalendar,
30+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<script lang="ts">
2+
import { RangeCalendar as RangeCalendarPrimitive } from "bits-ui";
3+
import { cn } from "$lib/shadcn/utils.js";
4+
5+
let {
6+
ref = $bindable(null),
7+
class: className,
8+
...restProps
9+
}: RangeCalendarPrimitive.CellProps = $props();
10+
</script>
11+
12+
<RangeCalendarPrimitive.Cell
13+
bind:ref
14+
class={cn(
15+
"[&:has([data-selected])]:bg-accent [&:has([data-selected][data-outside-month])]:bg-accent/50 relative p-0 text-center text-sm focus-within:relative focus-within:z-20 first:[&:has([data-selected])]:rounded-l-md last:[&:has([data-selected])]:rounded-r-md [&:has([data-selected][data-selection-end])]:rounded-r-md [&:has([data-selected][data-selection-start])]:rounded-l-md",
16+
className
17+
)}
18+
{...restProps}
19+
/>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<script lang="ts">
2+
import { RangeCalendar as RangeCalendarPrimitive } from "bits-ui";
3+
import { buttonVariants } from "$lib/shadcn/button/index.js";
4+
import { cn } from "$lib/shadcn/utils.js";
5+
6+
let {
7+
ref = $bindable(null),
8+
class: className,
9+
...restProps
10+
}: RangeCalendarPrimitive.DayProps = $props();
11+
12+
export { className as class };
13+
</script>
14+
15+
<RangeCalendarPrimitive.Day
16+
bind:ref
17+
class={cn(
18+
buttonVariants({ variant: "ghost" }),
19+
"size-8 p-0 font-normal data-[selected]:opacity-100",
20+
// Today
21+
"[&[data-today]:not([data-selected])]:bg-accent [&[data-today]:not([data-selected])]:text-accent-foreground",
22+
// Selection Start
23+
"data-[selection-start]:bg-primary data-[selection-start]:text-primary-foreground data-[selection-start]:hover:bg-primary data-[selection-start]:hover:text-primary-foreground data-[selection-start]:focus:bg-primary data-[selection-start]:focus:text-primary-foreground",
24+
// Selection End
25+
"data-[selection-end]:bg-primary data-[selection-end]:text-primary-foreground data-[selection-end]:hover:bg-primary data-[selection-end]:hover:text-primary-foreground data-[selection-end]:focus:bg-primary data-[selection-end]:focus:text-primary-foreground",
26+
// Outside months
27+
"data-[outside-month]:text-muted-foreground [&[data-outside-month][data-selected]]:bg-accent/50 [&[data-outside-month][data-selected]]:text-muted-foreground data-[outside-month]:pointer-events-none data-[outside-month]:opacity-50 [&[data-outside-month][data-selected]]:opacity-30",
28+
// Disabled
29+
"data-[disabled]:text-muted-foreground data-[disabled]:opacity-50",
30+
// Unavailable
31+
"data-[unavailable]:text-destructive-foreground data-[unavailable]:line-through",
32+
className
33+
)}
34+
{...restProps}
35+
/>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<script lang="ts">
2+
import { RangeCalendar as RangeCalendarPrimitive } from "bits-ui";
3+
import { cn } from "$lib/shadcn/utils.js";
4+
5+
let {
6+
ref = $bindable(null),
7+
class: className,
8+
...restProps
9+
}: RangeCalendarPrimitive.GridBodyProps = $props();
10+
</script>
11+
12+
<RangeCalendarPrimitive.GridBody bind:ref class={cn(className)} {...restProps} />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<script lang="ts">
2+
import { RangeCalendar as RangeCalendarPrimitive } from "bits-ui";
3+
import { cn } from "$lib/shadcn/utils.js";
4+
5+
let {
6+
ref = $bindable(null),
7+
class: className,
8+
...restProps
9+
}: RangeCalendarPrimitive.GridHeadProps = $props();
10+
</script>
11+
12+
<RangeCalendarPrimitive.GridHead bind:ref class={cn(className)} {...restProps} />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<script lang="ts">
2+
import { RangeCalendar as RangeCalendarPrimitive } from "bits-ui";
3+
import { cn } from "$lib/shadcn/utils.js";
4+
5+
let {
6+
ref = $bindable(null),
7+
class: className,
8+
...restProps
9+
}: RangeCalendarPrimitive.GridRowProps = $props();
10+
</script>
11+
12+
<RangeCalendarPrimitive.GridRow bind:ref class={cn("flex", className)} {...restProps} />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<script lang="ts">
2+
import { RangeCalendar as RangeCalendarPrimitive } from "bits-ui";
3+
import { cn } from "$lib/shadcn/utils.js";
4+
5+
let {
6+
ref = $bindable(null),
7+
class: className,
8+
...restProps
9+
}: RangeCalendarPrimitive.GridProps = $props();
10+
</script>
11+
12+
<RangeCalendarPrimitive.Grid
13+
bind:ref
14+
class={cn("w-full border-collapse space-y-1", className)}
15+
{...restProps}
16+
/>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<script lang="ts">
2+
import { RangeCalendar as RangeCalendarPrimitive } from "bits-ui";
3+
import { cn } from "$lib/shadcn/utils.js";
4+
5+
let {
6+
ref = $bindable(null),
7+
class: className,
8+
...restProps
9+
}: RangeCalendarPrimitive.HeadCellProps = $props();
10+
</script>
11+
12+
<RangeCalendarPrimitive.HeadCell
13+
bind:ref
14+
class={cn("text-muted-foreground w-8 rounded-md text-[0.8rem] font-normal", className)}
15+
{...restProps}
16+
/>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<script lang="ts">
2+
import { RangeCalendar as RangeCalendarPrimitive } from "bits-ui";
3+
import { cn } from "$lib/shadcn/utils.js";
4+
5+
let {
6+
ref = $bindable(null),
7+
class: className,
8+
...restProps
9+
}: RangeCalendarPrimitive.HeaderProps = $props();
10+
</script>
11+
12+
<RangeCalendarPrimitive.Header
13+
bind:ref
14+
class={cn("relative flex w-full items-center justify-between pt-1", className)}
15+
{...restProps}
16+
/>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<script lang="ts">
2+
import { RangeCalendar as RangeCalendarPrimitive } from "bits-ui";
3+
import { cn } from "$lib/shadcn/utils.js";
4+
5+
let {
6+
ref = $bindable(null),
7+
class: className,
8+
...restProps
9+
}: RangeCalendarPrimitive.HeadingProps = $props();
10+
</script>
11+
12+
<RangeCalendarPrimitive.Heading
13+
bind:ref
14+
class={cn("text-sm font-medium", className)}
15+
{...restProps}
16+
/>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<script lang="ts">
2+
import type { WithElementRef } from "bits-ui";
3+
import type { HTMLAttributes } from "svelte/elements";
4+
import { cn } from "$lib/shadcn/utils.js";
5+
6+
let {
7+
ref = $bindable(null),
8+
class: className,
9+
children,
10+
...restProps
11+
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
12+
</script>
13+
14+
<div
15+
bind:this={ref}
16+
class={cn("mt-4 flex flex-col space-y-4 sm:flex-row sm:space-x-4 sm:space-y-0", className)}
17+
{...restProps}
18+
>
19+
{@render children?.()}
20+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<script lang="ts">
2+
import { RangeCalendar as RangeCalendarPrimitive } from "bits-ui";
3+
import ChevronRight from "lucide-svelte/icons/chevron-right";
4+
import { buttonVariants } from "$lib/shadcn/button/index.js";
5+
import { cn } from "$lib/shadcn/utils.js";
6+
let {
7+
ref = $bindable(null),
8+
class: className,
9+
children,
10+
...restProps
11+
}: RangeCalendarPrimitive.NextButtonProps = $props();
12+
</script>
13+
14+
{#snippet Fallback()}
15+
<ChevronRight />
16+
{/snippet}
17+
18+
<RangeCalendarPrimitive.NextButton
19+
bind:ref
20+
class={cn(
21+
buttonVariants({ variant: "outline" }),
22+
"size-7 bg-transparent p-0 opacity-50 hover:opacity-100",
23+
className
24+
)}
25+
{...restProps}
26+
children={children || Fallback}
27+
/>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<script lang="ts">
2+
import { RangeCalendar as RangeCalendarPrimitive } from "bits-ui";
3+
import ChevronLeft from "lucide-svelte/icons/chevron-left";
4+
import { buttonVariants } from "$lib/shadcn/button/index.js";
5+
import { cn } from "$lib/shadcn/utils.js";
6+
let {
7+
ref = $bindable(null),
8+
class: className,
9+
children,
10+
...restProps
11+
}: RangeCalendarPrimitive.PrevButtonProps = $props();
12+
</script>
13+
14+
{#snippet Fallback()}
15+
<ChevronLeft />
16+
{/snippet}
17+
18+
<RangeCalendarPrimitive.PrevButton
19+
bind:ref
20+
class={cn(
21+
buttonVariants({ variant: "outline" }),
22+
"size-7 bg-transparent p-0 opacity-50 hover:opacity-100",
23+
className
24+
)}
25+
{...restProps}
26+
children={children || Fallback}
27+
/>

0 commit comments

Comments
 (0)