@voyant-travel/trips-react 0.110.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +30 -0
- package/dist/admin/admin-trips-page-controls.d.ts +28 -0
- package/dist/admin/admin-trips-page-controls.d.ts.map +1 -0
- package/dist/admin/admin-trips-page-controls.js +28 -0
- package/dist/admin/admin-trips-page-model.d.ts +87 -0
- package/dist/admin/admin-trips-page-model.d.ts.map +1 -0
- package/dist/admin/admin-trips-page-model.js +457 -0
- package/dist/admin/admin-trips-page.d.ts +6 -0
- package/dist/admin/admin-trips-page.d.ts.map +1 -0
- package/dist/admin/admin-trips-page.js +322 -0
- package/dist/admin/admin-trips-panels.d.ts +11 -0
- package/dist/admin/admin-trips-panels.d.ts.map +1 -0
- package/dist/admin/admin-trips-panels.js +11 -0
- package/dist/admin/index.d.ts +63 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +119 -0
- package/dist/admin/pages/trip-detail-page.d.ts +10 -0
- package/dist/admin/pages/trip-detail-page.d.ts.map +1 -0
- package/dist/admin/pages/trip-detail-page.js +12 -0
- package/dist/admin/trip-component-display.d.ts +10 -0
- package/dist/admin/trip-component-display.d.ts.map +1 -0
- package/dist/admin/trip-component-display.js +137 -0
- package/dist/admin/trip-detail-host.d.ts +12 -0
- package/dist/admin/trip-detail-host.d.ts.map +1 -0
- package/dist/admin/trip-detail-host.js +37 -0
- package/dist/admin/trip-detail-record-model.d.ts +30 -0
- package/dist/admin/trip-detail-record-model.d.ts.map +1 -0
- package/dist/admin/trip-detail-record-model.js +56 -0
- package/dist/admin/trip-detail-record.d.ts +47 -0
- package/dist/admin/trip-detail-record.d.ts.map +1 -0
- package/dist/admin/trip-detail-record.js +170 -0
- package/dist/admin/trip-list-filters.d.ts +33 -0
- package/dist/admin/trip-list-filters.d.ts.map +1 -0
- package/dist/admin/trip-list-filters.js +94 -0
- package/dist/admin/trips-host.d.ts +15 -0
- package/dist/admin/trips-host.d.ts.map +1 -0
- package/dist/admin/trips-host.js +233 -0
- package/dist/admin/trips-panels/catalog-configurator.d.ts +34 -0
- package/dist/admin/trips-panels/catalog-configurator.d.ts.map +1 -0
- package/dist/admin/trips-panels/catalog-configurator.js +200 -0
- package/dist/admin/trips-panels/catalog-options.d.ts +58 -0
- package/dist/admin/trips-panels/catalog-options.d.ts.map +1 -0
- package/dist/admin/trips-panels/catalog-options.js +124 -0
- package/dist/admin/trips-panels/committed-component-card.d.ts +27 -0
- package/dist/admin/trips-panels/committed-component-card.d.ts.map +1 -0
- package/dist/admin/trips-panels/committed-component-card.js +44 -0
- package/dist/admin/trips-panels/display.d.ts +51 -0
- package/dist/admin/trips-panels/display.d.ts.map +1 -0
- package/dist/admin/trips-panels/display.js +336 -0
- package/dist/admin/trips-panels/flight-configurator.d.ts +34 -0
- package/dist/admin/trips-panels/flight-configurator.d.ts.map +1 -0
- package/dist/admin/trips-panels/flight-configurator.js +208 -0
- package/dist/admin/trips-panels/manual-configurators.d.ts +16 -0
- package/dist/admin/trips-panels/manual-configurators.d.ts.map +1 -0
- package/dist/admin/trips-panels/manual-configurators.js +41 -0
- package/dist/admin/trips-panels/pending-component-card.d.ts +16 -0
- package/dist/admin/trips-panels/pending-component-card.d.ts.map +1 -0
- package/dist/admin/trips-panels/pending-component-card.js +29 -0
- package/dist/admin/trips-panels/shared.d.ts +122 -0
- package/dist/admin/trips-panels/shared.d.ts.map +1 -0
- package/dist/admin/trips-panels/shared.js +152 -0
- package/dist/admin/trips-panels/travelers-section.d.ts +53 -0
- package/dist/admin/trips-panels/travelers-section.d.ts.map +1 -0
- package/dist/admin/trips-panels/travelers-section.js +183 -0
- package/dist/admin/trips-panels/trip-preview-rail.d.ts +52 -0
- package/dist/admin/trips-panels/trip-preview-rail.d.ts.map +1 -0
- package/dist/admin/trips-panels/trip-preview-rail.js +122 -0
- package/dist/cache.d.ts +9 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +21 -0
- package/dist/client.d.ts +15 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +51 -0
- package/dist/hooks/index.d.ts +7 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/use-price-trip.d.ts +3 -0
- package/dist/hooks/use-price-trip.d.ts.map +1 -0
- package/dist/hooks/use-price-trip.js +17 -0
- package/dist/hooks/use-reserve-trip.d.ts +3 -0
- package/dist/hooks/use-reserve-trip.d.ts.map +1 -0
- package/dist/hooks/use-reserve-trip.js +17 -0
- package/dist/hooks/use-trip-checkout.d.ts +3 -0
- package/dist/hooks/use-trip-checkout.d.ts.map +1 -0
- package/dist/hooks/use-trip-checkout.js +17 -0
- package/dist/hooks/use-trip-components.d.ts +40 -0
- package/dist/hooks/use-trip-components.d.ts.map +1 -0
- package/dist/hooks/use-trip-components.js +13 -0
- package/dist/hooks/use-trip.d.ts +5 -0
- package/dist/hooks/use-trip.d.ts.map +1 -0
- package/dist/hooks/use-trip.js +13 -0
- package/dist/hooks/use-trips.d.ts +6 -0
- package/dist/hooks/use-trips.d.ts.map +1 -0
- package/dist/hooks/use-trips.js +12 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/operations.d.ts +212 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +92 -0
- package/dist/provider.d.ts +2 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +1 -0
- package/dist/query-keys.d.ts +10 -0
- package/dist/query-keys.d.ts.map +1 -0
- package/dist/query-keys.js +9 -0
- package/dist/query-options.d.ts +167 -0
- package/dist/query-options.d.ts.map +1 -0
- package/dist/query-options.js +22 -0
- package/dist/schemas.d.ts +69 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +16 -0
- package/package.json +133 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type Draft } from "@voyant-travel/bookings-react/journey";
|
|
2
|
+
import type { BookingDraftShape } from "@voyant-travel/catalog/booking-engine";
|
|
3
|
+
export declare function CatalogComponentOptions({ draft, shape, onDraftChange, }: {
|
|
4
|
+
draft: Draft | null;
|
|
5
|
+
shape: BookingDraftShape;
|
|
6
|
+
onDraftChange(draft: Draft): void;
|
|
7
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
8
|
+
export declare function CatalogProductOptionOptions({ draft, options, onDraftChange, }: {
|
|
9
|
+
draft: Draft;
|
|
10
|
+
options: ReadonlyArray<{
|
|
11
|
+
id: string;
|
|
12
|
+
code?: string | null;
|
|
13
|
+
name: string;
|
|
14
|
+
description?: string | null;
|
|
15
|
+
isDefault?: boolean;
|
|
16
|
+
units?: ReadonlyArray<{
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
description?: string | null;
|
|
20
|
+
unitType?: string | null;
|
|
21
|
+
minQuantity?: number | null;
|
|
22
|
+
maxQuantity?: number | null;
|
|
23
|
+
}>;
|
|
24
|
+
}>;
|
|
25
|
+
onDraftChange(draft: Draft): void;
|
|
26
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
27
|
+
export declare function setDraftOptionQuantity(draft: Draft, option: {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
}, unit: {
|
|
31
|
+
id: string;
|
|
32
|
+
name: string;
|
|
33
|
+
} | null, quantity: number): Draft;
|
|
34
|
+
export declare function CatalogAccommodationOptions({ draft, shape, onDraftChange, }: {
|
|
35
|
+
draft: Draft;
|
|
36
|
+
shape: BookingDraftShape;
|
|
37
|
+
onDraftChange(draft: Draft): void;
|
|
38
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
39
|
+
export declare function CatalogExtrasOptions({ draft, shape, onDraftChange, }: {
|
|
40
|
+
draft: Draft;
|
|
41
|
+
shape: BookingDraftShape;
|
|
42
|
+
onDraftChange(draft: Draft): void;
|
|
43
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
44
|
+
export declare function CatalogExtraRow({ draft, item, onDraftChange, }: {
|
|
45
|
+
draft: Draft;
|
|
46
|
+
item: {
|
|
47
|
+
id: string;
|
|
48
|
+
name: string;
|
|
49
|
+
description?: string | null;
|
|
50
|
+
};
|
|
51
|
+
onDraftChange(draft: Draft): void;
|
|
52
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
53
|
+
export declare function QuantityStepper({ value, onDecrement, onIncrement, }: {
|
|
54
|
+
value: number;
|
|
55
|
+
onDecrement(): void;
|
|
56
|
+
onIncrement(): void;
|
|
57
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
58
|
+
//# sourceMappingURL=catalog-options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-options.d.ts","sourceRoot":"","sources":["../../../src/admin/trips-panels/catalog-options.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,KAAK,EAA+B,MAAM,uCAAuC,CAAA;AAC/F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAK9E,wBAAgB,uBAAuB,CAAC,EACtC,KAAK,EACL,KAAK,EACL,aAAa,GACd,EAAE;IACD,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,KAAK,EAAE,iBAAiB,CAAA;IACxB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAClC,kDA4BA;AAED,wBAAgB,2BAA2B,CAAC,EAC1C,KAAK,EACL,OAAO,EACP,aAAa,GACd,EAAE;IACD,KAAK,EAAE,KAAK,CAAA;IACZ,OAAO,EAAE,aAAa,CAAC;QACrB,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACpB,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAC3B,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,KAAK,CAAC,EAAE,aAAa,CAAC;YACpB,EAAE,EAAE,MAAM,CAAA;YACV,IAAI,EAAE,MAAM,CAAA;YACZ,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;YAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;YACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;YAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAC5B,CAAC,CAAA;KACH,CAAC,CAAA;IACF,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAClC,kDA2DA;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE;IACN,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACb,EACD,IAAI,EAAE;IACJ,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACb,GAAG,IAAI,EACR,QAAQ,EAAE,MAAM,GACf,KAAK,CAoBP;AAED,wBAAgB,2BAA2B,CAAC,EAC1C,KAAK,EACL,KAAK,EACL,aAAa,GACd,EAAE;IACD,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,iBAAiB,CAAA;IACxB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAClC,kDAgGA;AAED,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,KAAK,EACL,aAAa,GACd,EAAE;IACD,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,iBAAiB,CAAA;IACxB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAClC,kDAkCA;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,IAAI,EACJ,aAAa,GACd,EAAE;IACD,KAAK,EAAE,KAAK,CAAA;IACZ,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;IAC/D,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAClC,2CA2BA;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,WAAW,EACX,WAAW,GACZ,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,IAAI,IAAI,CAAA;IACnB,WAAW,IAAI,IAAI,CAAA;CACpB,2CAYA"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useOperatorAdminMessages as useAdminMessages } from "@voyant-travel/admin";
|
|
4
|
+
import { setAccommodation, setAddons } from "@voyant-travel/bookings-react/journey";
|
|
5
|
+
import { Badge } from "@voyant-travel/ui/components/badge";
|
|
6
|
+
import { Button } from "@voyant-travel/ui/components/button";
|
|
7
|
+
import { Minus, Plus } from "lucide-react";
|
|
8
|
+
export function CatalogComponentOptions({ draft, shape, onDraftChange, }) {
|
|
9
|
+
if (!draft)
|
|
10
|
+
return null;
|
|
11
|
+
const hasAccommodation = shape.showsAccommodation &&
|
|
12
|
+
((shape.accommodation?.roomOptions?.length ?? 0) > 0 ||
|
|
13
|
+
(shape.accommodation?.subSteps?.length ?? 0) > 0);
|
|
14
|
+
const productOptionStep = shape.configureSubSteps?.find((step) => step.kind === "product-option");
|
|
15
|
+
const hasAddons = shape.showsAddons &&
|
|
16
|
+
((shape.addons?.catalog?.length ?? 0) > 0 || (shape.addons?.groups?.length ?? 0) > 0);
|
|
17
|
+
if (!productOptionStep && !hasAccommodation && !hasAddons)
|
|
18
|
+
return null;
|
|
19
|
+
return (_jsxs("div", { className: "flex flex-col gap-5 border-t pt-4", children: [productOptionStep ? (_jsx(CatalogProductOptionOptions, { draft: draft, options: productOptionStep.options, onDraftChange: onDraftChange })) : null, hasAccommodation ? (_jsx(CatalogAccommodationOptions, { draft: draft, shape: shape, onDraftChange: onDraftChange })) : null, hasAddons ? (_jsx(CatalogExtrasOptions, { draft: draft, shape: shape, onDraftChange: onDraftChange })) : null] }));
|
|
20
|
+
}
|
|
21
|
+
export function CatalogProductOptionOptions({ draft, options, onDraftChange, }) {
|
|
22
|
+
const t = useAdminMessages().trips.adminComposer.panels;
|
|
23
|
+
const selections = draft.configure.optionSelections ?? [];
|
|
24
|
+
if (options.length === 0)
|
|
25
|
+
return null;
|
|
26
|
+
return (_jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { children: [_jsx("h4", { className: "font-medium text-sm", children: t.optionsHeading }), _jsx("p", { className: "text-muted-foreground text-xs", children: t.optionsHint })] }), _jsx("div", { className: "grid gap-2 sm:grid-cols-2", children: options.map((option) => {
|
|
27
|
+
const unit = option.units?.[0];
|
|
28
|
+
const selected = selections.find((selection) => selection.optionId === option.id);
|
|
29
|
+
const quantity = selected?.quantity ?? 0;
|
|
30
|
+
const maxQuantity = unit?.maxQuantity ?? 99;
|
|
31
|
+
return (_jsx("div", { className: `rounded-md border p-3 text-left text-sm transition-colors ${quantity > 0 ? "border-primary bg-primary/10" : "bg-background"}`, children: _jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("span", { className: "min-w-0", children: [_jsxs("span", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "font-medium", children: option.name }), option.code ? (_jsx("span", { className: "text-muted-foreground text-xs uppercase", children: option.code })) : null, option.isDefault ? _jsx(Badge, { variant: "secondary", children: t.defaultOption }) : null] }), option.description ? (_jsx("span", { className: "mt-1 block text-muted-foreground text-xs", children: option.description })) : null, unit ? (_jsx("span", { className: "mt-1 block text-muted-foreground text-xs", children: unit.name })) : null] }), _jsx(QuantityStepper, { value: quantity, onDecrement: () => {
|
|
32
|
+
const nextQuantity = Math.max(0, quantity - 1);
|
|
33
|
+
onDraftChange(setDraftOptionQuantity(draft, option, unit ?? null, nextQuantity));
|
|
34
|
+
}, onIncrement: () => {
|
|
35
|
+
const nextQuantity = Math.min(maxQuantity, quantity + 1);
|
|
36
|
+
onDraftChange(setDraftOptionQuantity(draft, option, unit ?? null, nextQuantity));
|
|
37
|
+
} })] }) }, option.id));
|
|
38
|
+
}) })] }));
|
|
39
|
+
}
|
|
40
|
+
export function setDraftOptionQuantity(draft, option, unit, quantity) {
|
|
41
|
+
const existingSelections = draft.configure.optionSelections ?? [];
|
|
42
|
+
const nextSelections = existingSelections.filter((selection) => selection.optionId !== option.id);
|
|
43
|
+
if (quantity > 0) {
|
|
44
|
+
nextSelections.push({
|
|
45
|
+
optionId: option.id,
|
|
46
|
+
optionName: option.name,
|
|
47
|
+
...(unit ? { optionUnitId: unit.id, optionUnitName: unit.name } : {}),
|
|
48
|
+
quantity,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const firstSelection = nextSelections[0];
|
|
52
|
+
return {
|
|
53
|
+
...draft,
|
|
54
|
+
configure: {
|
|
55
|
+
...draft.configure,
|
|
56
|
+
variantId: firstSelection?.optionId,
|
|
57
|
+
optionSelections: nextSelections,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function CatalogAccommodationOptions({ draft, shape, onDraftChange, }) {
|
|
62
|
+
const t = useAdminMessages().trips.adminComposer.panels;
|
|
63
|
+
const rooms = shape.accommodation?.roomOptions ?? [];
|
|
64
|
+
const accommodation = draft.accommodation ?? { rooms: [], travelerAssignments: {} };
|
|
65
|
+
if (rooms.length === 0)
|
|
66
|
+
return null;
|
|
67
|
+
return (_jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { children: [_jsx("h4", { className: "font-medium text-sm", children: t.roomsHeading }), _jsx("p", { className: "text-muted-foreground text-xs", children: t.roomsHint })] }), _jsx("div", { className: "flex flex-col gap-2", children: rooms.map((room) => {
|
|
68
|
+
const current = accommodation.rooms.find((entry) => entry.optionUnitId === room.id);
|
|
69
|
+
const ratePlans = room.ratePlans ?? [];
|
|
70
|
+
const quantity = current?.quantity ?? 0;
|
|
71
|
+
return (_jsxs("div", { className: "flex flex-col gap-3 rounded-md border bg-muted/20 p-3", children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "font-medium text-sm", children: room.name }), room.description ? (_jsx("p", { className: "text-muted-foreground text-xs", children: room.description })) : null] }), _jsx(QuantityStepper, { value: quantity, onDecrement: () => {
|
|
72
|
+
const nextRooms = accommodation.rooms.filter((entry) => entry.optionUnitId !== room.id);
|
|
73
|
+
const nextQuantity = quantity - 1;
|
|
74
|
+
if (nextQuantity > 0) {
|
|
75
|
+
nextRooms.push({
|
|
76
|
+
optionUnitId: room.id,
|
|
77
|
+
quantity: nextQuantity,
|
|
78
|
+
ratePlanId: current?.ratePlanId,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
onDraftChange(setAccommodation(draft, { ...accommodation, rooms: nextRooms }));
|
|
82
|
+
}, onIncrement: () => {
|
|
83
|
+
const nextRooms = accommodation.rooms.filter((entry) => entry.optionUnitId !== room.id);
|
|
84
|
+
const ratePlanId = current?.ratePlanId ?? (ratePlans.length === 1 ? ratePlans[0]?.id : undefined);
|
|
85
|
+
nextRooms.push({ optionUnitId: room.id, quantity: quantity + 1, ratePlanId });
|
|
86
|
+
onDraftChange(setAccommodation(draft, { ...accommodation, rooms: nextRooms }));
|
|
87
|
+
} })] }), quantity > 0 && ratePlans.length > 0 ? (_jsx("div", { className: "grid gap-2 sm:grid-cols-2", children: ratePlans.map((plan) => {
|
|
88
|
+
const selected = current?.ratePlanId === plan.id;
|
|
89
|
+
return (_jsxs("button", { type: "button", onClick: () => {
|
|
90
|
+
const nextRooms = accommodation.rooms.map((entry) => entry.optionUnitId === room.id
|
|
91
|
+
? { ...entry, ratePlanId: plan.id }
|
|
92
|
+
: entry);
|
|
93
|
+
onDraftChange(setAccommodation(draft, { ...accommodation, rooms: nextRooms }));
|
|
94
|
+
}, className: `rounded-md border p-3 text-left text-sm transition-colors ${selected ? "border-primary bg-primary/10" : "bg-background"}`, children: [_jsx("span", { className: "font-medium", children: plan.name }), plan.description ? (_jsx("span", { className: "mt-1 block text-muted-foreground text-xs", children: plan.description })) : null, plan.inclusions && plan.inclusions.length > 0 ? (_jsxs("span", { className: "mt-1 block text-muted-foreground text-xs", children: ["Includes ", plan.inclusions.join(", ")] })) : null] }, plan.id));
|
|
95
|
+
}) })) : null] }, room.id));
|
|
96
|
+
}) })] }));
|
|
97
|
+
}
|
|
98
|
+
export function CatalogExtrasOptions({ draft, shape, onDraftChange, }) {
|
|
99
|
+
const t = useAdminMessages().trips.adminComposer.panels;
|
|
100
|
+
const flat = shape.addons?.catalog ?? [];
|
|
101
|
+
const groups = shape.addons?.groups ?? [];
|
|
102
|
+
const hasGroupedExtras = groups.some((group) => group.items.length > 0);
|
|
103
|
+
if (flat.length === 0 && !hasGroupedExtras)
|
|
104
|
+
return null;
|
|
105
|
+
return (_jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { children: [_jsx("h4", { className: "font-medium text-sm", children: t.optionsAndExtras }), _jsx("p", { className: "text-muted-foreground text-xs", children: t.optionsAndExtrasHint })] }), _jsxs("div", { className: "flex flex-col gap-3", children: [groups.map((group) => group.items.length > 0 ? (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("div", { className: "text-muted-foreground text-xs uppercase", children: group.label }), group.items.map((item) => (_jsx(CatalogExtraRow, { draft: draft, item: item, onDraftChange: onDraftChange }, item.id)))] }, group.label)) : null), flat.map((item) => (_jsx(CatalogExtraRow, { draft: draft, item: item, onDraftChange: onDraftChange }, item.id)))] })] }));
|
|
106
|
+
}
|
|
107
|
+
export function CatalogExtraRow({ draft, item, onDraftChange, }) {
|
|
108
|
+
const current = draft.addons.find((entry) => entry.extraId === item.id);
|
|
109
|
+
const quantity = current?.quantity ?? 0;
|
|
110
|
+
return (_jsxs("div", { className: "flex items-center justify-between gap-3 rounded-md border bg-muted/20 p-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "font-medium text-sm", children: item.name }), item.description ? (_jsx("p", { className: "text-muted-foreground text-xs", children: item.description })) : null] }), _jsx(QuantityStepper, { value: quantity, onDecrement: () => {
|
|
111
|
+
const nextAddons = draft.addons.filter((entry) => entry.extraId !== item.id);
|
|
112
|
+
const nextQuantity = quantity - 1;
|
|
113
|
+
if (nextQuantity > 0)
|
|
114
|
+
nextAddons.push({ extraId: item.id, quantity: nextQuantity });
|
|
115
|
+
onDraftChange(setAddons(draft, nextAddons));
|
|
116
|
+
}, onIncrement: () => {
|
|
117
|
+
const nextAddons = draft.addons.filter((entry) => entry.extraId !== item.id);
|
|
118
|
+
nextAddons.push({ extraId: item.id, quantity: quantity + 1 });
|
|
119
|
+
onDraftChange(setAddons(draft, nextAddons));
|
|
120
|
+
} })] }));
|
|
121
|
+
}
|
|
122
|
+
export function QuantityStepper({ value, onDecrement, onIncrement, }) {
|
|
123
|
+
return (_jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [_jsx(Button, { variant: "outline", size: "sm", type: "button", onClick: onDecrement, disabled: value <= 0, children: _jsx(Minus, { className: "size-3.5" }) }), _jsx("span", { className: "min-w-6 text-center text-sm", children: value }), _jsx(Button, { variant: "outline", size: "sm", type: "button", onClick: onIncrement, children: _jsx(Plus, { className: "size-3.5" }) })] }));
|
|
124
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type PaymentScheduleValue } from "@voyant-travel/bookings-react/ui";
|
|
2
|
+
import type { TripComponent } from "@voyant-travel/trips";
|
|
3
|
+
export declare function CommittedComponentCard({ component, selectable, selected, onSelectedChange, onRemove, removePending, bookingSetupEditable, bookingSetupSaving, onBookingSetupChange, }: {
|
|
4
|
+
component: TripComponent;
|
|
5
|
+
index: number;
|
|
6
|
+
selectable?: boolean;
|
|
7
|
+
selected?: boolean;
|
|
8
|
+
onSelectedChange?: (checked: boolean) => void;
|
|
9
|
+
onRemove?: () => void;
|
|
10
|
+
removePending?: boolean;
|
|
11
|
+
bookingSetupEditable?: boolean;
|
|
12
|
+
bookingSetupSaving?: boolean;
|
|
13
|
+
onBookingSetupChange?: (component: TripComponent, setup: ComponentBookingSetup) => void;
|
|
14
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export declare function ComponentSetupCheckbox({ id, checked, label, onCheckedChange, }: {
|
|
16
|
+
id: string;
|
|
17
|
+
checked: boolean;
|
|
18
|
+
label: string;
|
|
19
|
+
onCheckedChange(value: boolean): void;
|
|
20
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
export interface ComponentBookingSetup {
|
|
22
|
+
paymentSchedule: PaymentScheduleValue;
|
|
23
|
+
generateContractDocument: boolean;
|
|
24
|
+
generateInvoiceDocument: boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare function componentBookingSetupFor(component: TripComponent): ComponentBookingSetup;
|
|
27
|
+
//# sourceMappingURL=committed-component-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"committed-component-card.d.ts","sourceRoot":"","sources":["../../../src/admin/trips-panels/committed-component-card.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA0B,KAAK,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACpG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAoBzD,wBAAgB,sBAAsB,CAAC,EACrC,SAAS,EACT,UAAkB,EAClB,QAAgB,EAChB,gBAAgB,EAChB,QAAQ,EACR,aAAqB,EACrB,oBAA4B,EAC5B,kBAA0B,EAC1B,oBAAoB,GACrB,EAAE;IACD,SAAS,EAAE,aAAa,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC7C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAA;CACxF,2CA0JA;AAED,wBAAgB,sBAAsB,CAAC,EACrC,EAAE,EACF,OAAO,EACP,KAAK,EACL,eAAe,GAChB,EAAE;IACD,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;CACtC,2CAaA;AAED,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,oBAAoB,CAAA;IACrC,wBAAwB,EAAE,OAAO,CAAA;IACjC,uBAAuB,EAAE,OAAO,CAAA;CACjC;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,aAAa,GAAG,qBAAqB,CAaxF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useOperatorAdminMessages as useAdminMessages } from "@voyant-travel/admin";
|
|
4
|
+
import { PaymentScheduleSection } from "@voyant-travel/bookings-react/ui";
|
|
5
|
+
import { Badge } from "@voyant-travel/ui/components/badge";
|
|
6
|
+
import { Button } from "@voyant-travel/ui/components/button";
|
|
7
|
+
import { Checkbox } from "@voyant-travel/ui/components/checkbox";
|
|
8
|
+
import { Label } from "@voyant-travel/ui/components/label";
|
|
9
|
+
import { CalendarClock, CircleAlert, Loader2, Trash2 } from "lucide-react";
|
|
10
|
+
import { componentIcon, componentOptionSummaryFor, componentThumbnailFor, componentTitleFor, formatMoney, formatScheduleLabel, isUserVisibleWarning, paymentScheduleValueFromUnknown, Reference, recordFromUnknown, } from "./display.js";
|
|
11
|
+
export function CommittedComponentCard({ component, selectable = false, selected = false, onSelectedChange, onRemove, removePending = false, bookingSetupEditable = false, bookingSetupSaving = false, onBookingSetupChange, }) {
|
|
12
|
+
const t = useAdminMessages().trips.adminComposer.panels;
|
|
13
|
+
const Icon = componentIcon(component);
|
|
14
|
+
const coverUrl = componentThumbnailFor(component);
|
|
15
|
+
const componentName = componentTitleFor(component);
|
|
16
|
+
const optionSummary = componentOptionSummaryFor(component);
|
|
17
|
+
const bookingSetup = componentBookingSetupFor(component);
|
|
18
|
+
const canEditBookingSetup = bookingSetupEditable && component.kind === "catalog_booking" && !component.bookingId;
|
|
19
|
+
return (_jsxs("div", { className: `flex flex-col gap-3 rounded-md border bg-card p-4 ${selected ? "ring-2 ring-destructive/40" : ""}`, children: [_jsxs("div", { className: "flex items-start gap-3", children: [selectable ? (_jsx(Checkbox, { className: "mt-1", checked: selected, onCheckedChange: (value) => onSelectedChange?.(Boolean(value)), "aria-label": `Select ${componentName} for cancellation` })) : null, coverUrl ? (_jsx("img", { src: coverUrl, alt: "", className: "size-12 shrink-0 rounded-md object-cover ring-1 ring-border", loading: "lazy" })) : (_jsx("div", { className: "flex size-12 shrink-0 items-center justify-center rounded-md bg-muted", children: _jsx(Icon, { className: "size-5 text-muted-foreground" }) })), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "font-medium", children: componentName }), component.status === "failed" ? (_jsx(Badge, { variant: "destructive", children: t.committedCard.statusFailed })) : component.status === "cancelled" ? (_jsx(Badge, { variant: "secondary", children: t.committedCard.statusCancelled })) : null] }), (() => {
|
|
20
|
+
const label = formatScheduleLabel(component);
|
|
21
|
+
return label ? (_jsxs("p", { className: "flex items-center gap-1 text-muted-foreground text-sm", children: [_jsx(CalendarClock, { className: "size-3.5" }), label] })) : null;
|
|
22
|
+
})(), component.description ? (_jsx("p", { className: "truncate text-muted-foreground text-sm", children: component.description })) : null, optionSummary ? (_jsx("p", { className: "truncate text-muted-foreground text-sm", children: optionSummary })) : null, _jsxs("div", { className: "flex flex-wrap gap-x-4 gap-y-1 text-muted-foreground text-xs", children: [_jsx(Reference, { label: t.committedCard.bookingLabel, value: component.bookingId, href: component.bookingId ? `/bookings/${component.bookingId}` : undefined }), _jsx(Reference, { label: t.committedCard.orderLabel, value: component.orderId }), _jsx(Reference, { label: t.committedCard.paymentLabel, value: component.paymentSessionId })] })] }), _jsxs("div", { className: "flex flex-col items-end gap-1 text-right", children: [_jsx("p", { className: "font-semibold", children: formatMoney(component.componentTotalAmountCents, component.componentCurrency) }), component.componentTaxAmountCents != null && component.componentTaxAmountCents > 0 ? (_jsxs("p", { className: "text-muted-foreground text-xs", children: ["tax ", formatMoney(component.componentTaxAmountCents, component.componentCurrency)] })) : null, onRemove ? (_jsx(Button, { variant: "ghost", size: "sm", onClick: onRemove, disabled: removePending, "aria-label": t.removeComponent, className: "text-muted-foreground hover:text-destructive", children: removePending ? (_jsx(Loader2, { className: "size-3.5 animate-spin" })) : (_jsx(Trash2, { className: "size-3.5" })) })) : null] })] }), canEditBookingSetup ? (_jsxs("div", { className: "flex flex-col gap-3 border-t pt-3", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("div", { children: [_jsx("p", { className: "font-medium text-sm", children: t.bookingSetupHeading }), _jsx("p", { className: "text-muted-foreground text-xs", children: t.committedCard.bookingSetupHint })] }), bookingSetupSaving ? (_jsx(Loader2, { className: "size-4 animate-spin text-muted-foreground" })) : null] }), _jsx(PaymentScheduleSection, { value: bookingSetup.paymentSchedule, onChange: (paymentSchedule) => onBookingSetupChange?.(component, { ...bookingSetup, paymentSchedule }), currency: component.componentCurrency ?? undefined, totalAmountCents: component.componentTotalAmountCents ?? undefined, labels: { heading: t.committedCard.paymentScheduleHeading } }), _jsxs("div", { className: "grid gap-2 sm:grid-cols-2", children: [_jsx(ComponentSetupCheckbox, { id: `${component.id}-contract-document`, checked: bookingSetup.generateContractDocument, label: t.committedCard.generateContract, onCheckedChange: (generateContractDocument) => onBookingSetupChange?.(component, { ...bookingSetup, generateContractDocument }) }), _jsx(ComponentSetupCheckbox, { id: `${component.id}-invoice-document`, checked: bookingSetup.generateInvoiceDocument, label: t.committedCard.generateInvoice, onCheckedChange: (generateInvoiceDocument) => onBookingSetupChange?.(component, { ...bookingSetup, generateInvoiceDocument }) })] })] })) : component.bookingId ? (_jsx("p", { className: "border-t pt-3 text-muted-foreground text-xs", children: t.committedCard.committedFooter })) : null, (() => {
|
|
23
|
+
const visibleCodes = component.warningCodes.filter(isUserVisibleWarning);
|
|
24
|
+
if (visibleCodes.length === 0)
|
|
25
|
+
return null;
|
|
26
|
+
return (_jsxs("p", { className: "flex items-center gap-1 text-amber-600 text-xs", children: [_jsx(CircleAlert, { className: "size-3" }), visibleCodes.join(", ")] }));
|
|
27
|
+
})()] }));
|
|
28
|
+
}
|
|
29
|
+
export function ComponentSetupCheckbox({ id, checked, label, onCheckedChange, }) {
|
|
30
|
+
return (_jsxs("div", { className: "flex items-center gap-2 text-sm", children: [_jsx(Checkbox, { id: id, checked: checked, onCheckedChange: (value) => onCheckedChange(value === true) }), _jsx(Label, { htmlFor: id, className: "cursor-pointer text-sm", children: label })] }));
|
|
31
|
+
}
|
|
32
|
+
export function componentBookingSetupFor(component) {
|
|
33
|
+
const metadata = recordFromUnknown(component.metadata);
|
|
34
|
+
const bookingSetup = recordFromUnknown(metadata?.bookingSetup);
|
|
35
|
+
const draft = recordFromUnknown(metadata?.bookingDraftV1);
|
|
36
|
+
const draftDocumentGeneration = recordFromUnknown(draft?.documentGeneration);
|
|
37
|
+
const setupDocumentGeneration = recordFromUnknown(bookingSetup?.documentGeneration);
|
|
38
|
+
const documentGeneration = setupDocumentGeneration ?? draftDocumentGeneration;
|
|
39
|
+
return {
|
|
40
|
+
paymentSchedule: paymentScheduleValueFromUnknown(bookingSetup?.paymentSchedule),
|
|
41
|
+
generateContractDocument: documentGeneration?.contractDocument === true,
|
|
42
|
+
generateInvoiceDocument: documentGeneration?.invoiceDocument === true,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { PaymentScheduleValue, PersonPickerValue } from "@voyant-travel/bookings-react/ui";
|
|
2
|
+
import type { AncillarySelection, FlightOffer } from "@voyant-travel/flights/contract/types";
|
|
3
|
+
import type { TripComponent } from "@voyant-travel/trips";
|
|
4
|
+
import type { AvailabilitySlot, PanelsMessages, PendingComponent } from "./shared.js";
|
|
5
|
+
interface BillingDisplay {
|
|
6
|
+
primary: string;
|
|
7
|
+
secondary: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function resolveBillingDisplay(billing: PersonPickerValue, person: {
|
|
10
|
+
firstName?: string | null;
|
|
11
|
+
lastName?: string | null;
|
|
12
|
+
email?: string | null;
|
|
13
|
+
} | undefined, org: {
|
|
14
|
+
name?: string | null;
|
|
15
|
+
} | undefined, messages: PanelsMessages): BillingDisplay;
|
|
16
|
+
export declare function Reference({ label, value, href, }: {
|
|
17
|
+
label: string;
|
|
18
|
+
value: string | null | undefined;
|
|
19
|
+
href?: string;
|
|
20
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
21
|
+
export declare function componentIcon(component: TripComponent): import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
22
|
+
export declare function readComponentSchedule(component: TripComponent): {
|
|
23
|
+
start: string | null;
|
|
24
|
+
end: string | null;
|
|
25
|
+
};
|
|
26
|
+
export declare function formatScheduleLabel(component: TripComponent): string | null;
|
|
27
|
+
export declare function sortComponentsBySchedule(components: TripComponent[]): TripComponent[];
|
|
28
|
+
export declare function readPendingSchedule(pending: PendingComponent): {
|
|
29
|
+
start: string | null;
|
|
30
|
+
end: string | null;
|
|
31
|
+
};
|
|
32
|
+
export declare function readFlightOfferSchedule(offer: FlightOffer | null): {
|
|
33
|
+
start: string | null;
|
|
34
|
+
end: string | null;
|
|
35
|
+
};
|
|
36
|
+
export declare function toRange(start: string | null, end: string | null): [number, number] | null;
|
|
37
|
+
export declare function findOverlappingComponent(pending: PendingComponent, committed: TripComponent[]): TripComponent | null;
|
|
38
|
+
export declare function componentTitleFor(component: TripComponent, resolvedEntityName?: string | null): string;
|
|
39
|
+
export declare function componentOptionSummaryFor(component: TripComponent): string | null;
|
|
40
|
+
export declare function flightSelectionLabels(offer: FlightOffer | null, ancillaries: AncillarySelection | null): string[];
|
|
41
|
+
export declare function componentThumbnailFor(component: TripComponent): string | null;
|
|
42
|
+
export declare function componentReferenceLabelFor(component: TripComponent): string;
|
|
43
|
+
export declare function cleanDisplayLabel(value: string | null | undefined): string | null;
|
|
44
|
+
export declare function recordFromUnknown(value: unknown): Record<string, unknown> | null;
|
|
45
|
+
export declare function paymentScheduleValueFromUnknown(value: unknown): PaymentScheduleValue;
|
|
46
|
+
export declare function isUserVisibleWarning(code: string): boolean;
|
|
47
|
+
export declare function formatDateTime(iso: string): string;
|
|
48
|
+
export declare function formatDepartureLabel(slot: AvailabilitySlot): string;
|
|
49
|
+
export declare function formatMoney(amountCents: number | null | undefined, currencyCode: string | null | undefined): string;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../../src/admin/trips-panels/display.tsx"],"names":[],"mappings":"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"}
|