@voyant-travel/operations-react 0.10.0 → 0.12.0
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/availability/components/availability-columns.d.ts +14 -1
- package/dist/availability/components/availability-columns.d.ts.map +1 -1
- package/dist/availability/components/availability-columns.js +19 -2
- package/dist/availability/components/availability-dialogs/shared.d.ts +9 -1
- package/dist/availability/components/availability-dialogs/shared.d.ts.map +1 -1
- package/dist/availability/components/availability-dialogs/shared.js +2 -2
- package/dist/availability/components/availability-dialogs/slot-dialog.d.ts.map +1 -1
- package/dist/availability/components/availability-dialogs/slot-dialog.js +57 -3
- package/dist/availability/components/availability-tabs/slots-tab.d.ts +1 -1
- package/dist/availability/components/availability-tabs/slots-tab.d.ts.map +1 -1
- package/dist/availability/components/availability-tabs/slots-tab.js +29 -1
- package/dist/availability/i18n/provider.d.ts +36 -0
- package/dist/availability/i18n/provider.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -14,6 +14,9 @@ export interface AvailabilityColumnsMessages {
|
|
|
14
14
|
openLabel: string;
|
|
15
15
|
editLabel: string;
|
|
16
16
|
productLabel: string;
|
|
17
|
+
optionLabel: string;
|
|
18
|
+
optionMissingLabel: string;
|
|
19
|
+
optionMissingTooltip: string;
|
|
17
20
|
productLevelLabel: string;
|
|
18
21
|
reasonLabel: string;
|
|
19
22
|
recurrenceLabel: string;
|
|
@@ -36,7 +39,17 @@ export interface AvailabilityColumnsMessages {
|
|
|
36
39
|
export declare function getSlotStatusLabel(status: AvailabilitySlotRow["status"], messages: AvailabilityColumnsMessages): string;
|
|
37
40
|
export declare const availabilityRuleColumns: (products: ProductOption[], onView: (ruleId: string) => void, messages: AvailabilityColumnsMessages) => ColumnDef<AvailabilityRuleRow>[];
|
|
38
41
|
export declare const availabilityStartTimeColumns: (products: ProductOption[], onView: (startTimeId: string) => void, messages: AvailabilityColumnsMessages) => ColumnDef<AvailabilityStartTimeRow>[];
|
|
39
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Lookup data for the option column. `optionNameById` resolves a slot's
|
|
44
|
+
* `optionId` to a readable name; `productsWithOptions` is the set of product ids
|
|
45
|
+
* that have at least one active option, used to warn only when a missing option
|
|
46
|
+
* actually makes the departure unpriceable (#2062).
|
|
47
|
+
*/
|
|
48
|
+
export interface SlotOptionInfo {
|
|
49
|
+
optionNameById: Map<string, string>;
|
|
50
|
+
productsWithOptions: Set<string>;
|
|
51
|
+
}
|
|
52
|
+
export declare const availabilitySlotColumns: (products: ProductOption[], onView: (slotId: string) => void, messages: AvailabilityColumnsMessages, onEdit?: (slot: AvailabilitySlotRow) => void, optionInfo?: SlotOptionInfo) => ColumnDef<AvailabilitySlotRow>[];
|
|
40
53
|
export declare const availabilityCloseoutColumns: (products: ProductOption[], messages: AvailabilityColumnsMessages) => ColumnDef<AvailabilityCloseoutRow>[];
|
|
41
54
|
export declare const availabilityPickupPointColumns: (products: ProductOption[], messages: AvailabilityColumnsMessages) => ColumnDef<AvailabilityPickupPointRow>[];
|
|
42
55
|
//# sourceMappingURL=availability-columns.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"availability-columns.d.ts","sourceRoot":"","sources":["../../../src/availability/components/availability-columns.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"availability-columns.d.ts","sourceRoot":"","sources":["../../../src/availability/components/availability-columns.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAOtD,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAKnB,MAAM,aAAa,CAAA;AAGpB,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,oBAAoB,EAAE,MAAM,CAAA;IAC5B,iBAAiB,EAAE,MAAM,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EACrC,QAAQ,EAAE,2BAA2B,UAYtC;AAwCD,eAAO,MAAM,uBAAuB,GAClC,UAAU,aAAa,EAAE,EACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,EAChC,UAAU,2BAA2B,KACpC,SAAS,CAAC,mBAAmB,CAAC,EA2ChC,CAAA;AAED,eAAO,MAAM,4BAA4B,GACvC,UAAU,aAAa,EAAE,EACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,EACrC,UAAU,2BAA2B,KACpC,SAAS,CAAC,wBAAwB,CAAC,EAyCrC,CAAA;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CACjC;AAED,eAAO,MAAM,uBAAuB,GAClC,UAAU,aAAa,EAAE,EACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,EAChC,UAAU,2BAA2B,EACrC,SAAS,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,EAC5C,aAAa,cAAc,KAC1B,SAAS,CAAC,mBAAmB,CAAC,EAwFhC,CAAA;AAED,eAAO,MAAM,2BAA2B,GACtC,UAAU,aAAa,EAAE,EACzB,UAAU,2BAA2B,KACpC,SAAS,CAAC,uBAAuB,CAAC,EAoBpC,CAAA;AAED,eAAO,MAAM,8BAA8B,GACzC,UAAU,aAAa,EAAE,EACzB,UAAU,2BAA2B,KACpC,SAAS,CAAC,0BAA0B,CAAC,EA0BvC,CAAA"}
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { Badge, Button } from "@voyant-travel/ui/components";
|
|
4
4
|
import { DataTableColumnHeader } from "@voyant-travel/ui/components/data-table-column-header";
|
|
5
|
+
import { Tooltip, TooltipContent, TooltipTrigger } from "@voyant-travel/ui/components/tooltip";
|
|
5
6
|
import { cn } from "@voyant-travel/ui/lib/utils";
|
|
6
|
-
import { ExternalLink, Pencil } from "lucide-react";
|
|
7
|
+
import { AlertTriangle, ExternalLink, Pencil } from "lucide-react";
|
|
7
8
|
import { useAvailabilityUiMessagesOrDefault } from "../i18n/index.js";
|
|
8
9
|
import { productNameById, slotLocalEnd, slotLocalStart, slotStatusTone, } from "../index.js";
|
|
9
10
|
import { slotStatusToneClass } from "./slot-status-tone.js";
|
|
@@ -99,12 +100,28 @@ export const availabilityStartTimeColumns = (products, onView, messages) => [
|
|
|
99
100
|
cell: ({ row }) => (_jsx(ViewButton, { label: messages.openLabel, onClick: () => onView(row.original.id) })),
|
|
100
101
|
},
|
|
101
102
|
];
|
|
102
|
-
export const availabilitySlotColumns = (products, onView, messages, onEdit) => [
|
|
103
|
+
export const availabilitySlotColumns = (products, onView, messages, onEdit, optionInfo) => [
|
|
103
104
|
{
|
|
104
105
|
accessorKey: "productId",
|
|
105
106
|
header: ({ column }) => _jsx(DataTableColumnHeader, { column: column, title: messages.productLabel }),
|
|
106
107
|
cell: ({ row }) => productNameById(products, row.original.productId, row.original.productName),
|
|
107
108
|
},
|
|
109
|
+
{
|
|
110
|
+
id: "option",
|
|
111
|
+
header: () => messages.optionLabel,
|
|
112
|
+
cell: ({ row }) => {
|
|
113
|
+
const { optionId, productId } = row.original;
|
|
114
|
+
if (optionId) {
|
|
115
|
+
return optionInfo?.optionNameById.get(optionId) ?? messages.details.noValue;
|
|
116
|
+
}
|
|
117
|
+
// No option set: only flag it when the product actually has options, so a
|
|
118
|
+
// legitimately option-less product isn't warned.
|
|
119
|
+
if (optionInfo?.productsWithOptions.has(productId)) {
|
|
120
|
+
return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { className: "cursor-help", children: _jsxs(Badge, { variant: "outline", className: "gap-1 border-amber-500/40 text-amber-600 dark:text-amber-400", children: [_jsx(AlertTriangle, { className: "h-3 w-3" }), messages.optionMissingLabel] }) }), _jsx(TooltipContent, { children: messages.optionMissingTooltip })] }));
|
|
121
|
+
}
|
|
122
|
+
return messages.details.noValue;
|
|
123
|
+
},
|
|
124
|
+
},
|
|
108
125
|
{
|
|
109
126
|
accessorKey: "startsAt",
|
|
110
127
|
header: ({ column }) => (_jsx(DataTableColumnHeader, { column: column, title: messages.startsAtLabel })),
|
|
@@ -45,10 +45,16 @@ interface SlotDialogMessages {
|
|
|
45
45
|
validationDateRequired: string;
|
|
46
46
|
validationStartsAtRequired: string;
|
|
47
47
|
validationTimezoneRequired: string;
|
|
48
|
+
validationOptionRequired: string;
|
|
49
|
+
validationOptionsUnavailable: string;
|
|
48
50
|
editTitle: string;
|
|
49
51
|
newTitle: string;
|
|
50
52
|
productLabel: string;
|
|
51
53
|
selectProductPlaceholder: string;
|
|
54
|
+
optionLabel: string;
|
|
55
|
+
selectOptionPlaceholder: string;
|
|
56
|
+
noOption: string;
|
|
57
|
+
defaultOptionSuffix: string;
|
|
52
58
|
ruleLabel: string;
|
|
53
59
|
optionalRulePlaceholder: string;
|
|
54
60
|
noRule: string;
|
|
@@ -154,6 +160,7 @@ export type AvailabilityStartTimeSubmitPayload = {
|
|
|
154
160
|
};
|
|
155
161
|
export type AvailabilitySlotSubmitPayload = {
|
|
156
162
|
productId: string;
|
|
163
|
+
optionId: string | null;
|
|
157
164
|
availabilityRuleId: string | null;
|
|
158
165
|
startTimeId: string | null;
|
|
159
166
|
dateLocal: string;
|
|
@@ -201,12 +208,13 @@ export declare function SwitchField({ title, description, checked, onCheckedChan
|
|
|
201
208
|
checked: boolean;
|
|
202
209
|
onCheckedChange: (checked: boolean) => void;
|
|
203
210
|
}): import("react/jsx-runtime").JSX.Element;
|
|
204
|
-
export declare function DialogActions({ cancel, save, create, isEditing, isSubmitting, onCancel, }: {
|
|
211
|
+
export declare function DialogActions({ cancel, save, create, isEditing, isSubmitting, disabled, onCancel, }: {
|
|
205
212
|
cancel: string;
|
|
206
213
|
save: string;
|
|
207
214
|
create: string;
|
|
208
215
|
isEditing: boolean;
|
|
209
216
|
isSubmitting: boolean;
|
|
217
|
+
disabled?: boolean;
|
|
210
218
|
onCancel: () => void;
|
|
211
219
|
}): import("react/jsx-runtime").JSX.Element;
|
|
212
220
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/availability/components/availability-dialogs/shared.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/availability/components/availability-dialogs/shared.tsx"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,6 @@ export function ProductSelect({ label, placeholder, products, value, onValueChan
|
|
|
11
11
|
export function SwitchField({ title, description, checked, onCheckedChange, }) {
|
|
12
12
|
return (_jsxs("div", { className: "flex items-center justify-between rounded-md border px-3 py-2", children: [_jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium", children: title }), _jsx("p", { className: "text-xs text-muted-foreground", children: description })] }), _jsx(Switch, { checked: checked, onCheckedChange: onCheckedChange })] }));
|
|
13
13
|
}
|
|
14
|
-
export function DialogActions({ cancel, save, create, isEditing, isSubmitting, onCancel, }) {
|
|
15
|
-
return (_jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "ghost", onClick: onCancel, children: cancel }), _jsxs(Button, { type: "submit", disabled: isSubmitting, children: [isSubmitting && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), isEditing ? save : create] })] }));
|
|
14
|
+
export function DialogActions({ cancel, save, create, isEditing, isSubmitting, disabled, onCancel, }) {
|
|
15
|
+
return (_jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "ghost", onClick: onCancel, children: cancel }), _jsxs(Button, { type: "submit", disabled: isSubmitting || disabled, children: [isSubmitting && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), isEditing ? save : create] })] }));
|
|
16
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slot-dialog.d.ts","sourceRoot":"","sources":["../../../../src/availability/components/availability-dialogs/slot-dialog.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"slot-dialog.d.ts","sourceRoot":"","sources":["../../../../src/availability/components/availability-dialogs/slot-dialog.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACd,MAAM,gBAAgB,CAAA;AAUvB,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EAGlC,KAAK,aAAa,EAEnB,MAAM,aAAa,CAAA;AA0CpB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,QAAQ,EAAE,0BAA0B,CAAA;IACpC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,IAAI,CAAC,EAAE,mBAAmB,CAAA;IAC1B,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,KAAK,EAAE,mBAAmB,EAAE,CAAA;IAC5B,UAAU,EAAE,wBAAwB,EAAE,CAAA;IACtC,QAAQ,EAAE,CAAC,OAAO,EAAE,6BAA6B,EAAE,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3F,SAAS,EAAE,MAAM,IAAI,CAAA;CACtB,2CAwXA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useProductOptions } from "@voyant-travel/inventory-react";
|
|
3
4
|
import { Dialog, DialogBody, DialogContent, DialogHeader, DialogTitle, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Textarea, } from "@voyant-travel/ui/components";
|
|
4
5
|
import { DatePicker } from "@voyant-travel/ui/components/date-picker";
|
|
5
6
|
import { DateTimePicker } from "@voyant-travel/ui/components/date-time-picker";
|
|
6
|
-
import { useEffect } from "react";
|
|
7
|
+
import { useEffect, useMemo } from "react";
|
|
7
8
|
import { useForm } from "react-hook-form";
|
|
8
9
|
import { z } from "zod/v4";
|
|
9
10
|
import { zodResolver } from "../../form-resolver.js";
|
|
@@ -12,6 +13,7 @@ import { DialogActions, ProductSelect, SwitchField, } from "./shared.js";
|
|
|
12
13
|
function getSlotFormSchema(messages) {
|
|
13
14
|
return z.object({
|
|
14
15
|
productId: z.string().min(1, messages.dialogs.slot.validationProductRequired),
|
|
16
|
+
optionId: z.string().optional(),
|
|
15
17
|
availabilityRuleId: z.string().optional(),
|
|
16
18
|
startTimeId: z.string().optional(),
|
|
17
19
|
dateLocal: z.string().min(1, messages.dialogs.slot.validationDateRequired),
|
|
@@ -48,6 +50,7 @@ export function AvailabilitySlotDialog(props) {
|
|
|
48
50
|
resolver: zodResolver(slotFormSchema),
|
|
49
51
|
defaultValues: {
|
|
50
52
|
productId: "",
|
|
53
|
+
optionId: NONE_VALUE,
|
|
51
54
|
availabilityRuleId: NONE_VALUE,
|
|
52
55
|
startTimeId: NONE_VALUE,
|
|
53
56
|
dateLocal: "",
|
|
@@ -70,6 +73,7 @@ export function AvailabilitySlotDialog(props) {
|
|
|
70
73
|
if (props.open && props.slot) {
|
|
71
74
|
form.reset({
|
|
72
75
|
productId: props.slot.productId,
|
|
76
|
+
optionId: props.slot.optionId ?? NONE_VALUE,
|
|
73
77
|
availabilityRuleId: props.slot.availabilityRuleId ?? NONE_VALUE,
|
|
74
78
|
startTimeId: props.slot.startTimeId ?? NONE_VALUE,
|
|
75
79
|
dateLocal: props.slot.dateLocal,
|
|
@@ -98,9 +102,49 @@ export function AvailabilitySlotDialog(props) {
|
|
|
98
102
|
const filteredRules = props.rules.filter((rule) => rule.productId === selectedProductId);
|
|
99
103
|
const filteredStartTimes = props.startTimes.filter((startTime) => startTime.productId === selectedProductId);
|
|
100
104
|
const isEditing = Boolean(props.slot);
|
|
105
|
+
// A departure's price is derived from its option's rate plans, so the slot
|
|
106
|
+
// needs to point at one of the product's options. Load the selected product's
|
|
107
|
+
// active options so the operator can pick (and repair) the linkage (#2059).
|
|
108
|
+
const optionsQuery = useProductOptions({
|
|
109
|
+
productId: selectedProductId || undefined,
|
|
110
|
+
status: "active",
|
|
111
|
+
limit: 100,
|
|
112
|
+
enabled: Boolean(selectedProductId),
|
|
113
|
+
});
|
|
114
|
+
const productOptions = useMemo(() => {
|
|
115
|
+
const rows = optionsQuery.data?.data ?? [];
|
|
116
|
+
return [...rows].sort((a, b) => a.sortOrder - b.sortOrder || a.name.localeCompare(b.name));
|
|
117
|
+
}, [optionsQuery.data]);
|
|
118
|
+
const productHasOptions = productOptions.length > 0;
|
|
119
|
+
// Options are only *known* once the query for the selected product succeeds.
|
|
120
|
+
// Until then `productOptions` is empty for an unrelated reason (loading/error),
|
|
121
|
+
// so we must not treat the product as option-less.
|
|
122
|
+
const optionsResolved = !selectedProductId || optionsQuery.isSuccess;
|
|
101
123
|
const onSubmit = async (values) => {
|
|
124
|
+
const resolvedOptionId = values.optionId === NONE_VALUE ? null : (values.optionId ?? null);
|
|
125
|
+
// Guard against an unpriceable slot. When no explicit option is chosen we
|
|
126
|
+
// must be sure the product genuinely has none — block while the options
|
|
127
|
+
// query is still loading/errored so the race can't slip a null option past
|
|
128
|
+
// the required-option check (#2059).
|
|
129
|
+
if (!resolvedOptionId) {
|
|
130
|
+
if (!optionsResolved) {
|
|
131
|
+
form.setError("optionId", {
|
|
132
|
+
type: "manual",
|
|
133
|
+
message: slotMessages.validationOptionsUnavailable,
|
|
134
|
+
});
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (productHasOptions) {
|
|
138
|
+
form.setError("optionId", {
|
|
139
|
+
type: "manual",
|
|
140
|
+
message: slotMessages.validationOptionRequired,
|
|
141
|
+
});
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
102
145
|
await props.onSubmit({
|
|
103
146
|
productId: values.productId,
|
|
147
|
+
optionId: resolvedOptionId,
|
|
104
148
|
availabilityRuleId: values.availabilityRuleId === NONE_VALUE ? null : (values.availabilityRuleId ?? null),
|
|
105
149
|
startTimeId: values.startTimeId === NONE_VALUE ? null : (values.startTimeId ?? null),
|
|
106
150
|
dateLocal: values.dateLocal,
|
|
@@ -120,7 +164,17 @@ export function AvailabilitySlotDialog(props) {
|
|
|
120
164
|
}, { isEditing, id: props.slot?.id });
|
|
121
165
|
props.onSuccess();
|
|
122
166
|
};
|
|
123
|
-
return (_jsx(Dialog, { open: props.open, onOpenChange: props.onOpenChange, children: _jsxs(DialogContent, { size: "lg", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isEditing ? slotMessages.editTitle : slotMessages.newTitle }) }), _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), children: [_jsxs(DialogBody, { className: "grid gap-4", children: [_jsx(ProductSelect, { label: slotMessages.productLabel, placeholder: slotMessages.selectProductPlaceholder, products: props.products, value: form.watch("productId"), onValueChange: (value) =>
|
|
167
|
+
return (_jsx(Dialog, { open: props.open, onOpenChange: props.onOpenChange, children: _jsxs(DialogContent, { size: "lg", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isEditing ? slotMessages.editTitle : slotMessages.newTitle }) }), _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), children: [_jsxs(DialogBody, { className: "grid gap-4", children: [_jsx(ProductSelect, { label: slotMessages.productLabel, placeholder: slotMessages.selectProductPlaceholder, products: props.products, value: form.watch("productId"), onValueChange: (value) => {
|
|
168
|
+
form.setValue("productId", value ?? "");
|
|
169
|
+
// The previously selected option belongs to the old product.
|
|
170
|
+
form.setValue("optionId", NONE_VALUE);
|
|
171
|
+
form.clearErrors("optionId");
|
|
172
|
+
} }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.optionLabel }), _jsxs(Select, { value: form.watch("optionId") ?? NONE_VALUE, onValueChange: (value) => {
|
|
173
|
+
form.setValue("optionId", value ?? NONE_VALUE);
|
|
174
|
+
form.clearErrors("optionId");
|
|
175
|
+
}, children: [_jsx(SelectTrigger, { className: "w-full", disabled: !selectedProductId, children: _jsx(SelectValue, { placeholder: slotMessages.selectOptionPlaceholder }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: NONE_VALUE, children: slotMessages.noOption }), productOptions.map((option) => (_jsx(SelectItem, { value: option.id, children: option.isDefault
|
|
176
|
+
? `${option.name} (${slotMessages.defaultOptionSuffix})`
|
|
177
|
+
: option.name }, option.id)))] })] }), form.formState.errors.optionId ? (_jsx("p", { className: "text-destructive text-sm", children: form.formState.errors.optionId.message })) : null] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.ruleLabel }), _jsxs(Select, { value: form.watch("availabilityRuleId") ?? NONE_VALUE, onValueChange: (value) => form.setValue("availabilityRuleId", value ?? NONE_VALUE), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, { placeholder: slotMessages.optionalRulePlaceholder }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: NONE_VALUE, children: slotMessages.noRule }), filteredRules.map((rule) => (_jsxs(SelectItem, { value: rule.id, children: [rule.timezone, " \u00B7 ", rule.recurrenceRule] }, rule.id)))] })] })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.startTimeLabel }), _jsxs(Select, { value: form.watch("startTimeId") ?? NONE_VALUE, onValueChange: (value) => form.setValue("startTimeId", value ?? NONE_VALUE), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, { placeholder: slotMessages.optionalStartTimePlaceholder }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: NONE_VALUE, children: slotMessages.noStartTime }), filteredStartTimes.map((startTime) => (_jsx(SelectItem, { value: startTime.id, children: startTime.label ?? startTime.startTimeLocal }, startTime.id)))] })] })] })] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.dateLabel }), _jsx(DatePicker, { value: form.watch("dateLocal") || null, onChange: (nextValue) => form.setValue("dateLocal", nextValue ?? "", {
|
|
124
178
|
shouldDirty: true,
|
|
125
179
|
shouldValidate: true,
|
|
126
180
|
}) })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.timezoneLabel }), _jsx(Input, { ...form.register("timezone"), placeholder: slotMessages.timezonePlaceholder })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.startsAtLabel }), _jsx(DateTimePicker, { value: form.watch("startsAt") || null, onChange: (nextValue) => form.setValue("startsAt", nextValue ?? "", {
|
|
@@ -134,5 +188,5 @@ export function AvailabilitySlotDialog(props) {
|
|
|
134
188
|
closed: props.messages.statusClosed,
|
|
135
189
|
sold_out: props.messages.statusSoldOut,
|
|
136
190
|
cancelled: props.messages.statusCancelled,
|
|
137
|
-
}[option.value] }, option.value))) })] })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.unlimitedLabel }), _jsxs(Select, { items: booleanOptions, value: String(form.watch("unlimited")), onValueChange: (value) => form.setValue("unlimited", value === "true"), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: booleanOptions.map((option) => (_jsx(SelectItem, { value: option.value, children: option.value === "true" ? slotMessages.yes : slotMessages.no }, option.value))) })] })] })] }), _jsxs("div", { className: "grid grid-cols-3 gap-4", children: [_jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.initialPaxLabel }), _jsx(Input, { ...form.register("initialPax"), type: "number", min: 0 })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.remainingPaxLabel }), _jsx(Input, { ...form.register("remainingPax"), type: "number", min: 0 })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.remainingResourcesLabel }), _jsx(Input, { ...form.register("remainingResources"), type: "number", min: 0 })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.initialPickupsLabel }), _jsx(Input, { ...form.register("initialPickups"), type: "number", min: 0 })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.remainingPickupsLabel }), _jsx(Input, { ...form.register("remainingPickups"), type: "number", min: 0 })] })] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsx(SwitchField, { title: slotMessages.pastCutoffTitle, description: slotMessages.pastCutoffDescription, checked: form.watch("pastCutoff"), onCheckedChange: (checked) => form.setValue("pastCutoff", checked) }), _jsx(SwitchField, { title: slotMessages.tooEarlyTitle, description: slotMessages.tooEarlyDescription, checked: form.watch("tooEarly"), onCheckedChange: (checked) => form.setValue("tooEarly", checked) })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.notesLabel }), _jsx(Textarea, { ...form.register("notes"), placeholder: slotMessages.notesPlaceholder })] })] }), _jsx(DialogActions, { cancel: slotMessages.cancel, save: slotMessages.save, create: slotMessages.create, isEditing: isEditing, isSubmitting: form.formState.isSubmitting, onCancel: () => props.onOpenChange(false) })] })] }) }));
|
|
191
|
+
}[option.value] }, option.value))) })] })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.unlimitedLabel }), _jsxs(Select, { items: booleanOptions, value: String(form.watch("unlimited")), onValueChange: (value) => form.setValue("unlimited", value === "true"), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: booleanOptions.map((option) => (_jsx(SelectItem, { value: option.value, children: option.value === "true" ? slotMessages.yes : slotMessages.no }, option.value))) })] })] })] }), _jsxs("div", { className: "grid grid-cols-3 gap-4", children: [_jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.initialPaxLabel }), _jsx(Input, { ...form.register("initialPax"), type: "number", min: 0 })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.remainingPaxLabel }), _jsx(Input, { ...form.register("remainingPax"), type: "number", min: 0 })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.remainingResourcesLabel }), _jsx(Input, { ...form.register("remainingResources"), type: "number", min: 0 })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.initialPickupsLabel }), _jsx(Input, { ...form.register("initialPickups"), type: "number", min: 0 })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.remainingPickupsLabel }), _jsx(Input, { ...form.register("remainingPickups"), type: "number", min: 0 })] })] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsx(SwitchField, { title: slotMessages.pastCutoffTitle, description: slotMessages.pastCutoffDescription, checked: form.watch("pastCutoff"), onCheckedChange: (checked) => form.setValue("pastCutoff", checked) }), _jsx(SwitchField, { title: slotMessages.tooEarlyTitle, description: slotMessages.tooEarlyDescription, checked: form.watch("tooEarly"), onCheckedChange: (checked) => form.setValue("tooEarly", checked) })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx(Label, { children: slotMessages.notesLabel }), _jsx(Textarea, { ...form.register("notes"), placeholder: slotMessages.notesPlaceholder })] })] }), _jsx(DialogActions, { cancel: slotMessages.cancel, save: slotMessages.save, create: slotMessages.create, isEditing: isEditing, isSubmitting: form.formState.isSubmitting, disabled: Boolean(selectedProductId) && optionsQuery.isLoading, onCancel: () => props.onOpenChange(false) })] })] }) }));
|
|
138
192
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { OnChangeFn, RowSelectionState } from "@tanstack/react-table";
|
|
2
|
-
import type
|
|
2
|
+
import { type ReactNode } from "react";
|
|
3
3
|
import type { AvailabilitySlotRow, ProductOption } from "../../index.js";
|
|
4
4
|
import { type AvailabilityBulkDeleteFn, type AvailabilityBulkUpdateFn, type AvailabilityTabMessages } from "./shared.js";
|
|
5
5
|
export declare function AvailabilitySlotsTab(props: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slots-tab.d.ts","sourceRoot":"","sources":["../../../../src/availability/components/availability-tabs/slots-tab.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"slots-tab.d.ts","sourceRoot":"","sources":["../../../../src/availability/components/availability-tabs/slots-tab.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAe1E,OAAO,EAAE,KAAK,SAAS,EAAW,MAAM,OAAO,CAAA;AAE/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAIxE,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAE7B,MAAM,aAAa,CAAA;AAEpB,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,QAAQ,EAAE,uBAAuB,CAAA;IACjC,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,aAAa,EAAE,mBAAmB,EAAE,CAAA;IACpC,aAAa,EAAE,iBAAiB,CAAA;IAChC,gBAAgB,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IAC/C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,gBAAgB,EAAE,wBAAwB,CAAA;IAC1C,gBAAgB,EAAE,wBAAwB,CAAA;IAC1C,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,MAAM,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,IAAI,CAAA;IAC1C,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,2CA0LA"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useQueries } from "@tanstack/react-query";
|
|
4
|
+
import { getProductOptionsQueryOptions, useVoyantProductsContext, } from "@voyant-travel/inventory-react";
|
|
3
5
|
import { ConfirmActionButton, SelectionActionBar } from "@voyant-travel/ui/components";
|
|
4
6
|
import { DataTable } from "@voyant-travel/ui/components/data-table";
|
|
5
7
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@voyant-travel/ui/components/select";
|
|
6
8
|
import { TabsContent } from "@voyant-travel/ui/components/tabs";
|
|
9
|
+
import { useMemo } from "react";
|
|
7
10
|
import { useAvailabilityUiMessagesOrDefault } from "../../i18n/index.js";
|
|
8
11
|
import { formatLocalizedSelectionLabel } from "../../utils.js";
|
|
9
12
|
import { availabilitySlotColumns } from "../availability-columns.js";
|
|
@@ -11,9 +14,34 @@ import { AvailabilitySectionHeader } from "../availability-section-header.js";
|
|
|
11
14
|
import { formatTemplate, } from "./shared.js";
|
|
12
15
|
export function AvailabilitySlotsTab(props) {
|
|
13
16
|
useAvailabilityUiMessagesOrDefault();
|
|
17
|
+
// Resolve each slot's option name, and learn which products have options at
|
|
18
|
+
// all, so the option column can flag a missing option only when it actually
|
|
19
|
+
// makes the departure unpriceable (#2062). Scope the lookup to the products
|
|
20
|
+
// actually visible in the (paginated) table — one capped query per product —
|
|
21
|
+
// rather than an unbounded global read (the options API caps `limit` at 100).
|
|
22
|
+
const productsContext = useVoyantProductsContext();
|
|
23
|
+
const visibleProductIds = useMemo(() => [...new Set(props.filteredSlots.map((slot) => slot.productId))], [props.filteredSlots]);
|
|
24
|
+
const optionQueries = useQueries({
|
|
25
|
+
queries: visibleProductIds.map((productId) => getProductOptionsQueryOptions(productsContext, {
|
|
26
|
+
productId,
|
|
27
|
+
status: "active",
|
|
28
|
+
limit: 100,
|
|
29
|
+
})),
|
|
30
|
+
});
|
|
31
|
+
const optionInfo = useMemo(() => {
|
|
32
|
+
const optionNameById = new Map();
|
|
33
|
+
const productsWithOptions = new Set();
|
|
34
|
+
for (const query of optionQueries) {
|
|
35
|
+
for (const option of query.data?.data ?? []) {
|
|
36
|
+
optionNameById.set(option.id, option.name);
|
|
37
|
+
productsWithOptions.add(option.productId);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return { optionNameById, productsWithOptions };
|
|
41
|
+
}, [optionQueries]);
|
|
14
42
|
const selection = (count) => formatLocalizedSelectionLabel(count, props.messages.nouns.slotSingular, props.messages.nouns.slotPlural);
|
|
15
43
|
const asPanel = props.asPanel ?? true;
|
|
16
|
-
const body = (_jsxs(_Fragment, { children: [!props.hideHeader && (_jsx(AvailabilitySectionHeader, { title: props.messages.tabs.slots.title, description: props.messages.tabs.slots.description, actionLabel: props.messages.tabs.slots.actionLabel, onAction: props.onCreate })), props.toolbar, _jsx(DataTable, { columns: availabilitySlotColumns(props.products, props.onOpenRoute, props.messages, props.onEdit), data: props.filteredSlots, emptyMessage: props.messages.tabs.slots.emptyMessage, enableRowSelection: true, getRowId: (row) => row.id, rowSelection: props.slotSelection, onRowSelectionChange: props.setSlotSelection, renderSelectionActions: ({ selectedRows, clearSelection }) => (_jsxs(SelectionActionBar, { selectedCount: selectedRows.length, onClear: clearSelection, children: [props.bulkStatusSelect ? (_jsxs(Select, { value: "", onValueChange: (value) => {
|
|
44
|
+
const body = (_jsxs(_Fragment, { children: [!props.hideHeader && (_jsx(AvailabilitySectionHeader, { title: props.messages.tabs.slots.title, description: props.messages.tabs.slots.description, actionLabel: props.messages.tabs.slots.actionLabel, onAction: props.onCreate })), props.toolbar, _jsx(DataTable, { columns: availabilitySlotColumns(props.products, props.onOpenRoute, props.messages, props.onEdit, optionInfo), data: props.filteredSlots, emptyMessage: props.messages.tabs.slots.emptyMessage, enableRowSelection: true, getRowId: (row) => row.id, rowSelection: props.slotSelection, onRowSelectionChange: props.setSlotSelection, renderSelectionActions: ({ selectedRows, clearSelection }) => (_jsxs(SelectionActionBar, { selectedCount: selectedRows.length, onClear: clearSelection, children: [props.bulkStatusSelect ? (_jsxs(Select, { value: "", onValueChange: (value) => {
|
|
17
45
|
if (!value)
|
|
18
46
|
return;
|
|
19
47
|
const verb = value === "open"
|
|
@@ -221,10 +221,16 @@ export declare const availabilityUiEn: {
|
|
|
221
221
|
validationDateRequired: string;
|
|
222
222
|
validationStartsAtRequired: string;
|
|
223
223
|
validationTimezoneRequired: string;
|
|
224
|
+
validationOptionRequired: string;
|
|
225
|
+
validationOptionsUnavailable: string;
|
|
224
226
|
editTitle: string;
|
|
225
227
|
newTitle: string;
|
|
226
228
|
productLabel: string;
|
|
227
229
|
selectProductPlaceholder: string;
|
|
230
|
+
optionLabel: string;
|
|
231
|
+
selectOptionPlaceholder: string;
|
|
232
|
+
noOption: string;
|
|
233
|
+
defaultOptionSuffix: string;
|
|
228
234
|
ruleLabel: string;
|
|
229
235
|
optionalRulePlaceholder: string;
|
|
230
236
|
noRule: string;
|
|
@@ -360,6 +366,9 @@ export declare const availabilityUiEn: {
|
|
|
360
366
|
statusSoldOut: string;
|
|
361
367
|
statusCancelled: string;
|
|
362
368
|
productLabel: string;
|
|
369
|
+
optionLabel: string;
|
|
370
|
+
optionMissingLabel: string;
|
|
371
|
+
optionMissingTooltip: string;
|
|
363
372
|
timezoneLabel: string;
|
|
364
373
|
recurrenceLabel: string;
|
|
365
374
|
maxPaxLabel: string;
|
|
@@ -709,10 +718,16 @@ export declare const availabilityUiRo: {
|
|
|
709
718
|
validationDateRequired: string;
|
|
710
719
|
validationStartsAtRequired: string;
|
|
711
720
|
validationTimezoneRequired: string;
|
|
721
|
+
validationOptionRequired: string;
|
|
722
|
+
validationOptionsUnavailable: string;
|
|
712
723
|
editTitle: string;
|
|
713
724
|
newTitle: string;
|
|
714
725
|
productLabel: string;
|
|
715
726
|
selectProductPlaceholder: string;
|
|
727
|
+
optionLabel: string;
|
|
728
|
+
selectOptionPlaceholder: string;
|
|
729
|
+
noOption: string;
|
|
730
|
+
defaultOptionSuffix: string;
|
|
716
731
|
ruleLabel: string;
|
|
717
732
|
optionalRulePlaceholder: string;
|
|
718
733
|
noRule: string;
|
|
@@ -848,6 +863,9 @@ export declare const availabilityUiRo: {
|
|
|
848
863
|
statusSoldOut: string;
|
|
849
864
|
statusCancelled: string;
|
|
850
865
|
productLabel: string;
|
|
866
|
+
optionLabel: string;
|
|
867
|
+
optionMissingLabel: string;
|
|
868
|
+
optionMissingTooltip: string;
|
|
851
869
|
timezoneLabel: string;
|
|
852
870
|
recurrenceLabel: string;
|
|
853
871
|
maxPaxLabel: string;
|
|
@@ -1198,10 +1216,16 @@ export declare const availabilityUiMessageDefinitions: {
|
|
|
1198
1216
|
validationDateRequired: string;
|
|
1199
1217
|
validationStartsAtRequired: string;
|
|
1200
1218
|
validationTimezoneRequired: string;
|
|
1219
|
+
validationOptionRequired: string;
|
|
1220
|
+
validationOptionsUnavailable: string;
|
|
1201
1221
|
editTitle: string;
|
|
1202
1222
|
newTitle: string;
|
|
1203
1223
|
productLabel: string;
|
|
1204
1224
|
selectProductPlaceholder: string;
|
|
1225
|
+
optionLabel: string;
|
|
1226
|
+
selectOptionPlaceholder: string;
|
|
1227
|
+
noOption: string;
|
|
1228
|
+
defaultOptionSuffix: string;
|
|
1205
1229
|
ruleLabel: string;
|
|
1206
1230
|
optionalRulePlaceholder: string;
|
|
1207
1231
|
noRule: string;
|
|
@@ -1337,6 +1361,9 @@ export declare const availabilityUiMessageDefinitions: {
|
|
|
1337
1361
|
statusSoldOut: string;
|
|
1338
1362
|
statusCancelled: string;
|
|
1339
1363
|
productLabel: string;
|
|
1364
|
+
optionLabel: string;
|
|
1365
|
+
optionMissingLabel: string;
|
|
1366
|
+
optionMissingTooltip: string;
|
|
1340
1367
|
timezoneLabel: string;
|
|
1341
1368
|
recurrenceLabel: string;
|
|
1342
1369
|
maxPaxLabel: string;
|
|
@@ -1686,10 +1713,16 @@ export declare const availabilityUiMessageDefinitions: {
|
|
|
1686
1713
|
validationDateRequired: string;
|
|
1687
1714
|
validationStartsAtRequired: string;
|
|
1688
1715
|
validationTimezoneRequired: string;
|
|
1716
|
+
validationOptionRequired: string;
|
|
1717
|
+
validationOptionsUnavailable: string;
|
|
1689
1718
|
editTitle: string;
|
|
1690
1719
|
newTitle: string;
|
|
1691
1720
|
productLabel: string;
|
|
1692
1721
|
selectProductPlaceholder: string;
|
|
1722
|
+
optionLabel: string;
|
|
1723
|
+
selectOptionPlaceholder: string;
|
|
1724
|
+
noOption: string;
|
|
1725
|
+
defaultOptionSuffix: string;
|
|
1693
1726
|
ruleLabel: string;
|
|
1694
1727
|
optionalRulePlaceholder: string;
|
|
1695
1728
|
noRule: string;
|
|
@@ -1825,6 +1858,9 @@ export declare const availabilityUiMessageDefinitions: {
|
|
|
1825
1858
|
statusSoldOut: string;
|
|
1826
1859
|
statusCancelled: string;
|
|
1827
1860
|
productLabel: string;
|
|
1861
|
+
optionLabel: string;
|
|
1862
|
+
optionMissingLabel: string;
|
|
1863
|
+
optionMissingTooltip: string;
|
|
1828
1864
|
timezoneLabel: string;
|
|
1829
1865
|
recurrenceLabel: string;
|
|
1830
1866
|
maxPaxLabel: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/availability/i18n/provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,yBAAyB,EAIzB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EAEtB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,KAAK,wBAAwB,GAAG,CAAC,OAAO,yBAAyB,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAA;AAErF,MAAM,MAAM,sBAAsB,GAAG,wBAAwB,GAAG;IAC9D,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAA;QACf,UAAU,EAAE,MAAM,CAAA;QAClB,WAAW,EAAE,MAAM,CAAA;QACnB,OAAO,EAAE;YACP,WAAW,EAAE,MAAM,CAAA;YACnB,UAAU,EAAE,MAAM,CAAA;YAClB,cAAc,EAAE,MAAM,CAAA;YACtB,OAAO,EAAE,MAAM,CAAA;YACf,WAAW,EAAE,MAAM,CAAA;YACnB,SAAS,EAAE,MAAM,CAAA;YACjB,MAAM,EAAE,MAAM,CAAA;YACd,QAAQ,EAAE,MAAM,CAAA;YAChB,KAAK,EAAE,MAAM,CAAA;YACb,kBAAkB,EAAE,MAAM,CAAA;SAC3B,CAAA;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAA;YACZ,OAAO,EAAE,MAAM,CAAA;YACf,MAAM,EAAE,MAAM,CAAA;YACd,SAAS,EAAE,MAAM,CAAA;YACjB,QAAQ,EAAE,MAAM,CAAA;SACjB,CAAA;KACF,CAAA;CACF,CAAA;AAwDD,eAAO,MAAM,gBAAgB
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/availability/i18n/provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,yBAAyB,EAIzB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EAEtB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,KAAK,wBAAwB,GAAG,CAAC,OAAO,yBAAyB,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAA;AAErF,MAAM,MAAM,sBAAsB,GAAG,wBAAwB,GAAG;IAC9D,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAA;QACf,UAAU,EAAE,MAAM,CAAA;QAClB,WAAW,EAAE,MAAM,CAAA;QACnB,OAAO,EAAE;YACP,WAAW,EAAE,MAAM,CAAA;YACnB,UAAU,EAAE,MAAM,CAAA;YAClB,cAAc,EAAE,MAAM,CAAA;YACtB,OAAO,EAAE,MAAM,CAAA;YACf,WAAW,EAAE,MAAM,CAAA;YACnB,SAAS,EAAE,MAAM,CAAA;YACjB,MAAM,EAAE,MAAM,CAAA;YACd,QAAQ,EAAE,MAAM,CAAA;YAChB,KAAK,EAAE,MAAM,CAAA;YACb,kBAAkB,EAAE,MAAM,CAAA;SAC3B,CAAA;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAA;YACZ,OAAO,EAAE,MAAM,CAAA;YACf,MAAM,EAAE,MAAM,CAAA;YACd,SAAS,EAAE,MAAM,CAAA;YACjB,QAAQ,EAAE,MAAM,CAAA;SACjB,CAAA;KACF,CAAA;CACF,CAAA;AAwDD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGK,CAAA;AAElC,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGK,CAAA;AAIlC,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGe,CAAA;AAE5D,MAAM,MAAM,8BAA8B,GAAG,sBAAsB,CAAC,sBAAsB,CAAC,CAAA;AAU3F,wBAAgB,6BAA6B,CAAC,EAC5C,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACjC,SAAS,CAAC,EAAE,8BAA8B,GAAG,IAAI,CAAA;CAClD,0BAOA;AAED,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAClC,SAAS,CAAC,EAAE,8BAA8B,GAAG,IAAI,CAAA;CAClD,GAAG,gBAAgB,CAAC,sBAAsB,CAAC,CAU3C;AAED,wBAAgB,8BAA8B,CAAC,EAC7C,QAAQ,EACR,MAAM,EACN,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACjC,SAAS,CAAC,EAAE,8BAA8B,GAAG,IAAI,CAAA;CAClD,2CAWA;AAED,eAAO,MAAM,qBAAqB,gDAAgC,CAAA;AAClE,eAAO,MAAM,yBAAyB,8BAAoC,CAAA;AAE1E,wBAAgB,8BAA8B,6CAE7C;AAED,wBAAgB,kCAAkC,2BAEjD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyant-travel/operations-react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -248,9 +248,9 @@
|
|
|
248
248
|
"sonner": "^2.0.7",
|
|
249
249
|
"zod": "^4.0.0",
|
|
250
250
|
"@voyant-travel/admin": "^0.114.0",
|
|
251
|
-
"@voyant-travel/bookings-react": "^0.
|
|
252
|
-
"@voyant-travel/operations": "^0.2.
|
|
253
|
-
"@voyant-travel/inventory-react": "^0.
|
|
251
|
+
"@voyant-travel/bookings-react": "^0.131.0",
|
|
252
|
+
"@voyant-travel/operations": "^0.2.4",
|
|
253
|
+
"@voyant-travel/inventory-react": "^0.13.0",
|
|
254
254
|
"@voyant-travel/ui": "^0.108.0"
|
|
255
255
|
},
|
|
256
256
|
"peerDependenciesMeta": {
|
|
@@ -280,7 +280,7 @@
|
|
|
280
280
|
}
|
|
281
281
|
},
|
|
282
282
|
"dependencies": {
|
|
283
|
-
"@voyant-travel/i18n": "^0.107.
|
|
283
|
+
"@voyant-travel/i18n": "^0.107.3",
|
|
284
284
|
"@voyant-travel/react": "^0.104.1"
|
|
285
285
|
},
|
|
286
286
|
"devDependencies": {
|
|
@@ -297,10 +297,10 @@
|
|
|
297
297
|
"vitest": "^4.1.2",
|
|
298
298
|
"zod": "^4.3.6",
|
|
299
299
|
"@voyant-travel/admin": "^0.114.0",
|
|
300
|
-
"@voyant-travel/bookings-react": "^0.
|
|
301
|
-
"@voyant-travel/i18n": "^0.107.
|
|
302
|
-
"@voyant-travel/operations": "^0.2.
|
|
303
|
-
"@voyant-travel/inventory-react": "^0.
|
|
300
|
+
"@voyant-travel/bookings-react": "^0.131.0",
|
|
301
|
+
"@voyant-travel/i18n": "^0.107.3",
|
|
302
|
+
"@voyant-travel/operations": "^0.2.4",
|
|
303
|
+
"@voyant-travel/inventory-react": "^0.13.0",
|
|
304
304
|
"@voyant-travel/react": "^0.104.1",
|
|
305
305
|
"@voyant-travel/ui": "^0.108.0",
|
|
306
306
|
"@voyant-travel/voyant-typescript-config": "^0.1.0"
|