@voyantjs/bookings-ui 0.80.10 → 0.80.11
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/dist/components/traveler-category-buttons.d.ts +21 -0
- package/dist/components/traveler-category-buttons.d.ts.map +1 -0
- package/dist/components/traveler-category-buttons.js +28 -0
- package/dist/components/travelers-section.d.ts.map +1 -1
- package/dist/components/travelers-section.js +11 -12
- package/package.json +30 -30
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type TravelerCategoryRole = "lead" | "adult" | "child" | "infant";
|
|
2
|
+
export interface TravelerCategoryState {
|
|
3
|
+
role: TravelerCategoryRole;
|
|
4
|
+
roomUnitId: string | null;
|
|
5
|
+
}
|
|
6
|
+
export interface TravelerCategoryUnitState {
|
|
7
|
+
unitId: string;
|
|
8
|
+
unitCode: string | null;
|
|
9
|
+
}
|
|
10
|
+
export declare function inferTravelerRoleFromUnit(unit: TravelerCategoryUnitState): Exclude<TravelerCategoryRole, "lead">;
|
|
11
|
+
export declare function getStaticTravelerCategoryButtonState(traveler: TravelerCategoryState, category: Exclude<TravelerCategoryRole, "lead">): {
|
|
12
|
+
active: boolean;
|
|
13
|
+
nextRole: TravelerCategoryRole;
|
|
14
|
+
shouldUpdate: boolean;
|
|
15
|
+
};
|
|
16
|
+
export declare function getDynamicTravelerCategoryButtonState(traveler: TravelerCategoryState, unit: TravelerCategoryUnitState): {
|
|
17
|
+
active: boolean;
|
|
18
|
+
nextRole: TravelerCategoryRole;
|
|
19
|
+
shouldUpdate: boolean;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=traveler-category-buttons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traveler-category-buttons.d.ts","sourceRoot":"","sources":["../../src/components/traveler-category-buttons.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAA;AAExE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,oBAAoB,CAAA;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAKvC;AAED,wBAAgB,oCAAoC,CAClD,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC,GAC9C;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,oBAAoB,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAS5E;AAED,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,qBAAqB,EAC/B,IAAI,EAAE,yBAAyB,GAC9B;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,oBAAoB,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAY5E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export function inferTravelerRoleFromUnit(unit) {
|
|
2
|
+
const codeLower = (unit.unitCode ?? "").toLowerCase();
|
|
3
|
+
if (codeLower === "child")
|
|
4
|
+
return "child";
|
|
5
|
+
if (codeLower === "infant")
|
|
6
|
+
return "infant";
|
|
7
|
+
return "adult";
|
|
8
|
+
}
|
|
9
|
+
export function getStaticTravelerCategoryButtonState(traveler, category) {
|
|
10
|
+
const active = traveler.role === category || (traveler.role === "lead" && category === "adult");
|
|
11
|
+
const nextRole = traveler.role === "lead" && category === "adult" ? "lead" : category;
|
|
12
|
+
return {
|
|
13
|
+
active,
|
|
14
|
+
nextRole,
|
|
15
|
+
shouldUpdate: traveler.role !== nextRole,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function getDynamicTravelerCategoryButtonState(traveler, unit) {
|
|
19
|
+
const inferredRole = inferTravelerRoleFromUnit(unit);
|
|
20
|
+
const active = traveler.roomUnitId === unit.unitId ||
|
|
21
|
+
(traveler.role === "lead" && inferredRole === "adult" && traveler.roomUnitId == null);
|
|
22
|
+
const nextRole = traveler.role === "lead" && inferredRole === "adult" ? "lead" : inferredRole;
|
|
23
|
+
return {
|
|
24
|
+
active,
|
|
25
|
+
nextRole,
|
|
26
|
+
shouldUpdate: traveler.roomUnitId !== unit.unitId || traveler.role !== nextRole,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"travelers-section.d.ts","sourceRoot":"","sources":["../../src/components/travelers-section.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"travelers-section.d.ts","sourceRoot":"","sources":["../../src/components/travelers-section.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import { Combobox, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxI
|
|
|
7
7
|
import { Pencil, Trash2, UserPlus } from "lucide-react";
|
|
8
8
|
import * as React from "react";
|
|
9
9
|
import { useBookingsUiMessagesOrDefault } from "../i18n/provider.js";
|
|
10
|
+
import { getDynamicTravelerCategoryButtonState, getStaticTravelerCategoryButtonState, } from "./traveler-category-buttons.js";
|
|
10
11
|
export const emptyTravelerListValue = { travelers: [] };
|
|
11
12
|
/** Factory for a blank row — `role` defaults to `adult` unless the list is empty. */
|
|
12
13
|
export function createBlankTraveler(role = "adult") {
|
|
@@ -377,21 +378,19 @@ function TravelerCategoryButtons({ traveler, roomGroups, fallbackLabels, onPickU
|
|
|
377
378
|
["child", fallbackLabels.child],
|
|
378
379
|
["infant", fallbackLabels.infant],
|
|
379
380
|
].map(([category, label]) => {
|
|
380
|
-
const active = traveler
|
|
381
|
-
|
|
382
|
-
|
|
381
|
+
const { active, nextRole, shouldUpdate } = getStaticTravelerCategoryButtonState(traveler, category);
|
|
382
|
+
return (_jsx(Button, { type: "button", size: "sm", variant: active ? "default" : "outline", className: "h-7 text-xs", onClick: () => {
|
|
383
|
+
if (shouldUpdate)
|
|
384
|
+
onPickUnit(traveler.roomUnitId, nextRole);
|
|
385
|
+
}, children: label }, category));
|
|
383
386
|
}) })] }));
|
|
384
387
|
}
|
|
385
388
|
return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(Label, { className: "text-xs", children: fallbackLabels.category }), _jsx("div", { className: "grid gap-1", style: { gridTemplateColumns: `repeat(${categoryUnits.length}, minmax(0, 1fr))` }, children: categoryUnits.map((unit) => {
|
|
386
|
-
const active = traveler
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
const codeLower = (unit.unitCode ?? "").toLowerCase();
|
|
392
|
-
const inferredRole = codeLower === "child" ? "child" : codeLower === "infant" ? "infant" : "adult";
|
|
393
|
-
const nextRole = traveler.role === "lead" && inferredRole === "adult" ? "lead" : inferredRole;
|
|
394
|
-
return (_jsx(Button, { type: "button", size: "sm", variant: active ? "default" : "outline", className: "h-7 text-xs", onClick: () => onPickUnit(unit.unitId, nextRole), title: unit.minAge != null || unit.maxAge != null
|
|
389
|
+
const { active, nextRole, shouldUpdate } = getDynamicTravelerCategoryButtonState(traveler, unit);
|
|
390
|
+
return (_jsx(Button, { type: "button", size: "sm", variant: active ? "default" : "outline", className: "h-7 text-xs", onClick: () => {
|
|
391
|
+
if (shouldUpdate)
|
|
392
|
+
onPickUnit(unit.unitId, nextRole);
|
|
393
|
+
}, title: unit.minAge != null || unit.maxAge != null
|
|
395
394
|
? `${unit.minAge ?? "0"}–${unit.maxAge ?? "∞"}`
|
|
396
395
|
: undefined, children: unit.unitName }, unit.unitId));
|
|
397
396
|
}) })] }));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyantjs/bookings-ui",
|
|
3
|
-
"version": "0.80.
|
|
3
|
+
"version": "0.80.11",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -51,24 +51,24 @@
|
|
|
51
51
|
"react-dom": "^19.0.0",
|
|
52
52
|
"react-hook-form": "^7.60.0",
|
|
53
53
|
"zod": "^4.3.6",
|
|
54
|
-
"@voyantjs/availability-react": "0.80.
|
|
55
|
-
"@voyantjs/bookings-react": "0.80.
|
|
56
|
-
"@voyantjs/catalog": "0.80.
|
|
57
|
-
"@voyantjs/catalog-react": "0.80.
|
|
58
|
-
"@voyantjs/crm-react": "0.80.
|
|
59
|
-
"@voyantjs/crm-ui": "0.80.
|
|
60
|
-
"@voyantjs/extras-react": "0.80.
|
|
61
|
-
"@voyantjs/finance-react": "0.80.
|
|
62
|
-
"@voyantjs/identity-react": "0.80.
|
|
63
|
-
"@voyantjs/legal-react": "0.80.
|
|
64
|
-
"@voyantjs/pricing-react": "0.80.
|
|
65
|
-
"@voyantjs/products-react": "0.80.
|
|
66
|
-
"@voyantjs/suppliers-react": "0.80.
|
|
67
|
-
"@voyantjs/ui": "0.80.
|
|
54
|
+
"@voyantjs/availability-react": "0.80.11",
|
|
55
|
+
"@voyantjs/bookings-react": "0.80.11",
|
|
56
|
+
"@voyantjs/catalog": "0.80.11",
|
|
57
|
+
"@voyantjs/catalog-react": "0.80.11",
|
|
58
|
+
"@voyantjs/crm-react": "0.80.11",
|
|
59
|
+
"@voyantjs/crm-ui": "0.80.11",
|
|
60
|
+
"@voyantjs/extras-react": "0.80.11",
|
|
61
|
+
"@voyantjs/finance-react": "0.80.11",
|
|
62
|
+
"@voyantjs/identity-react": "0.80.11",
|
|
63
|
+
"@voyantjs/legal-react": "0.80.11",
|
|
64
|
+
"@voyantjs/pricing-react": "0.80.11",
|
|
65
|
+
"@voyantjs/products-react": "0.80.11",
|
|
66
|
+
"@voyantjs/suppliers-react": "0.80.11",
|
|
67
|
+
"@voyantjs/ui": "0.80.11"
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
70
|
"sonner": "^2.0.7",
|
|
71
|
-
"@voyantjs/i18n": "0.80.
|
|
71
|
+
"@voyantjs/i18n": "0.80.11"
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
74
74
|
"@tanstack/react-query": "^5.100.11",
|
|
@@ -82,20 +82,20 @@
|
|
|
82
82
|
"typescript": "^6.0.2",
|
|
83
83
|
"vitest": "^4.1.2",
|
|
84
84
|
"zod": "^4.3.6",
|
|
85
|
-
"@voyantjs/availability-react": "0.80.
|
|
86
|
-
"@voyantjs/bookings-react": "0.80.
|
|
87
|
-
"@voyantjs/catalog": "0.80.
|
|
88
|
-
"@voyantjs/catalog-react": "0.80.
|
|
89
|
-
"@voyantjs/crm-react": "0.80.
|
|
90
|
-
"@voyantjs/crm-ui": "0.80.
|
|
91
|
-
"@voyantjs/extras-react": "0.80.
|
|
92
|
-
"@voyantjs/finance-react": "0.80.
|
|
93
|
-
"@voyantjs/identity-react": "0.80.
|
|
94
|
-
"@voyantjs/legal-react": "0.80.
|
|
95
|
-
"@voyantjs/pricing-react": "0.80.
|
|
96
|
-
"@voyantjs/products-react": "0.80.
|
|
97
|
-
"@voyantjs/suppliers-react": "0.80.
|
|
98
|
-
"@voyantjs/ui": "0.80.
|
|
85
|
+
"@voyantjs/availability-react": "0.80.11",
|
|
86
|
+
"@voyantjs/bookings-react": "0.80.11",
|
|
87
|
+
"@voyantjs/catalog": "0.80.11",
|
|
88
|
+
"@voyantjs/catalog-react": "0.80.11",
|
|
89
|
+
"@voyantjs/crm-react": "0.80.11",
|
|
90
|
+
"@voyantjs/crm-ui": "0.80.11",
|
|
91
|
+
"@voyantjs/extras-react": "0.80.11",
|
|
92
|
+
"@voyantjs/finance-react": "0.80.11",
|
|
93
|
+
"@voyantjs/identity-react": "0.80.11",
|
|
94
|
+
"@voyantjs/legal-react": "0.80.11",
|
|
95
|
+
"@voyantjs/pricing-react": "0.80.11",
|
|
96
|
+
"@voyantjs/products-react": "0.80.11",
|
|
97
|
+
"@voyantjs/suppliers-react": "0.80.11",
|
|
98
|
+
"@voyantjs/ui": "0.80.11",
|
|
99
99
|
"@voyantjs/voyant-typescript-config": "0.1.0"
|
|
100
100
|
},
|
|
101
101
|
"files": [
|