mautourco-components 0.2.93 → 0.2.94
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/organisms/DateTimePicker/DateTimePicker.js +10 -1
- package/dist/components/organisms/RoundTrip/RoundTrip.js +20 -5
- package/dist/components/organisms/SearchBarTransfer/SearchBarTransfer.js +4 -2
- package/package.json +1 -1
- package/src/components/organisms/DateTimePicker/DateTimePicker.tsx +8 -3
- package/src/components/organisms/RoundTrip/RoundTrip.tsx +21 -5
- package/src/components/organisms/SearchBarTransfer/SearchBarTransfer.tsx +5 -1
|
@@ -82,7 +82,16 @@ var DateTimePicker = function (_a) {
|
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
|
-
if (!payload.dateRange && payload.time) {
|
|
85
|
+
else if (!payload.dateRange && !payload.time) {
|
|
86
|
+
// Handle clearing: return empty string for single mode, empty array for range mode
|
|
87
|
+
if (selectionMode === 'range') {
|
|
88
|
+
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange([]);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange('');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else if (!payload.dateRange && payload.time) {
|
|
86
95
|
var timeStr = "".concat(payload.time.hour, ":").concat(payload.time.minute, " ").concat(payload.time.meridiem);
|
|
87
96
|
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(timeStr);
|
|
88
97
|
}
|
|
@@ -168,10 +168,11 @@ var RoundTrip = function (_a) {
|
|
|
168
168
|
onPaxChange === null || onPaxChange === void 0 ? void 0 : onPaxChange(newPaxData);
|
|
169
169
|
};
|
|
170
170
|
var handleDateRangeChange = function (dates) {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
171
|
+
console.log({ dates: dates });
|
|
172
|
+
if (Array.isArray(dates)) {
|
|
173
|
+
setInternalArrivalDate(dates === null || dates === void 0 ? void 0 : dates[0]);
|
|
174
|
+
setInternalDepartureDate(dates === null || dates === void 0 ? void 0 : dates[1]);
|
|
175
|
+
onDatesChange === null || onDatesChange === void 0 ? void 0 : onDatesChange(dates === null || dates === void 0 ? void 0 : dates[0], dates === null || dates === void 0 ? void 0 : dates[1]);
|
|
175
176
|
}
|
|
176
177
|
};
|
|
177
178
|
// Helper to convert LocationData to LocationOption
|
|
@@ -216,8 +217,22 @@ var RoundTrip = function (_a) {
|
|
|
216
217
|
internalPaxData.teens === 0 &&
|
|
217
218
|
internalPaxData.children === 0 &&
|
|
218
219
|
(internalPaxData.infants === undefined || internalPaxData.infants === 0)));
|
|
220
|
+
// Show error if checkEmpty is true and either date is missing
|
|
219
221
|
var isDateEmpty = checkEmpty && (!internalArrivalDate || !internalDepartureDate ||
|
|
220
222
|
internalArrivalDate === '' || internalDepartureDate === '');
|
|
223
|
+
// Check if user filled one date but not the other (even without checkEmpty)
|
|
224
|
+
var hasPartialDates = function () {
|
|
225
|
+
console.log({ checkEmpty: checkEmpty, internalArrivalDate: internalArrivalDate, internalDepartureDate: internalDepartureDate });
|
|
226
|
+
if (!checkEmpty)
|
|
227
|
+
return false;
|
|
228
|
+
if (!internalArrivalDate || !internalDepartureDate)
|
|
229
|
+
return true;
|
|
230
|
+
return internalArrivalDate === internalDepartureDate;
|
|
231
|
+
};
|
|
232
|
+
var isDateError = function () {
|
|
233
|
+
console.log('isDateEmpty', isDateEmpty, hasPartialDates());
|
|
234
|
+
return isDateEmpty || hasPartialDates();
|
|
235
|
+
};
|
|
221
236
|
var isPickupDropoffEmpty = checkEmpty && !internalPickupDropoffPoint;
|
|
222
237
|
var isAccommodationEmpty = checkEmpty && !internalAccommodation;
|
|
223
238
|
var pickupDropoffOptions = getPickupDropoffOptions();
|
|
@@ -237,6 +252,6 @@ var RoundTrip = function (_a) {
|
|
|
237
252
|
};
|
|
238
253
|
var defaultPickupDropoffOption = findLocationOption(pickupDropoffPoint, 'pickup-dropoff');
|
|
239
254
|
var defaultAccommodationOption = findLocationOption(accommodation, 'accommodation');
|
|
240
|
-
return (_jsx("div", { className: "round-trip ".concat(className), "data-round-trip-id": id, children: _jsxs("div", { className: "round-trip__content", children: [_jsx("div", { className: "round-trip__field round-trip__field--pax ".concat(isPaxEmpty ? 'round-trip__field--error' : ''), children: _jsx(PaxSelector, { label: "Number of pax", value: internalPaxData, onChange: handlePaxChange, placeholder: "2 pax", className: isPaxEmpty ? 'pax-selector--error' : '', scrollOnOpen: scrollOnOpen, checkEmpty: checkEmpty }) }), _jsxs("div", { className: "round-trip__field round-trip__field--dates", children: [_jsx(Text, { size: "sm", variant: "regular", className: "round-trip__field-label", children: "Arrival date - Departure date" }), _jsx(DateTimePicker, { placeholder: "DD/MM/YYYY - DD/MM/YYYY", mode: "calendar", iconPosition: "left", numberOfMonths: 2, iconBGFull: false, showChevron: true, onValueChange: handleDateRangeChange, selectionMode: "range", defaultValue: internalArrivalDate && internalDepartureDate ? [internalArrivalDate, internalDepartureDate] : undefined, inputClassName: "round-trip__date-picker--input", state:
|
|
255
|
+
return (_jsx("div", { className: "round-trip ".concat(className), "data-round-trip-id": id, children: _jsxs("div", { className: "round-trip__content", children: [_jsx("div", { className: "round-trip__field round-trip__field--pax ".concat(isPaxEmpty ? 'round-trip__field--error' : ''), children: _jsx(PaxSelector, { label: "Number of pax", value: internalPaxData, onChange: handlePaxChange, placeholder: "2 pax", className: isPaxEmpty ? 'pax-selector--error' : '', scrollOnOpen: scrollOnOpen, checkEmpty: checkEmpty }) }), _jsxs("div", { className: "round-trip__field round-trip__field--dates", children: [_jsx(Text, { size: "sm", variant: "regular", className: "round-trip__field-label", children: "Arrival date - Departure date" }), _jsx(DateTimePicker, { placeholder: "DD/MM/YYYY - DD/MM/YYYY", mode: "calendar", iconPosition: "left", numberOfMonths: 2, iconBGFull: false, showChevron: true, onValueChange: handleDateRangeChange, selectionMode: "range", defaultValue: internalArrivalDate && internalDepartureDate ? [internalArrivalDate, internalDepartureDate] : undefined, inputClassName: "round-trip__date-picker--input", state: isDateError() ? 'error' : undefined, scrollOnOpen: scrollOnOpen })] }), _jsx("div", { className: "round-trip__field round-trip__field--pickup-dropoff", children: _jsx(LocationDropdown, { label: "Pick up / Drop-off point", options: pickupDropoffOptions.options, groups: pickupDropoffOptions.groups, selectedValue: (internalPickupDropoffPoint === null || internalPickupDropoffPoint === void 0 ? void 0 : internalPickupDropoffPoint.id) || null, onSelectionChange: handlePickupDropoffChange, placeholder: "Select pick-up / drop-off point", direction: undefined, type: "airport-port", showGroupTitles: true, error: isPickupDropoffEmpty, scrollOnOpen: scrollOnOpen, defaultValue: defaultPickupDropoffOption }) }), _jsx("div", { className: "round-trip__field round-trip__field--accommodation", children: _jsx(LocationDropdown, { label: "Accommodation", options: accommodationOptions.options, groups: accommodationOptions.groups, selectedValue: (internalAccommodation === null || internalAccommodation === void 0 ? void 0 : internalAccommodation.id) || null, onSelectionChange: handleAccommodationChange, placeholder: "Select accommodation", direction: "dropoff", type: "accommodation", showGroupTitles: false, error: isAccommodationEmpty, scrollOnOpen: scrollOnOpen, defaultValue: defaultAccommodationOption }) })] }) }));
|
|
241
256
|
};
|
|
242
257
|
export default RoundTrip;
|
|
@@ -49,6 +49,7 @@ var SearchBarTransfer = function (_a) {
|
|
|
49
49
|
var _j = useState(defaultRoundTripData), roundTripData = _j[0], setRoundTripData = _j[1];
|
|
50
50
|
var _k = useState(initializeTransferLines(defaultTransferLines)), transferLines = _k[0], setTransferLines = _k[1];
|
|
51
51
|
var _l = useState(null), error = _l[0], setError = _l[1];
|
|
52
|
+
var _m = useState(0), validationTrigger = _m[0], setValidationTrigger = _m[1];
|
|
52
53
|
// Notify parent of changes
|
|
53
54
|
useEffect(function () {
|
|
54
55
|
var data = {
|
|
@@ -367,6 +368,7 @@ var SearchBarTransfer = function (_a) {
|
|
|
367
368
|
};
|
|
368
369
|
// Handle search
|
|
369
370
|
var handleSearch = function () {
|
|
371
|
+
setValidationTrigger(function (prev) { return prev + 1; });
|
|
370
372
|
if (validateData()) {
|
|
371
373
|
var data = {
|
|
372
374
|
mode: mode,
|
|
@@ -377,7 +379,7 @@ var SearchBarTransfer = function (_a) {
|
|
|
377
379
|
onSearch === null || onSearch === void 0 ? void 0 : onSearch(data);
|
|
378
380
|
}
|
|
379
381
|
};
|
|
380
|
-
return (_jsxs("div", { className: "search-bar-transfer ".concat(className), children: [_jsxs("div", { className: "search-bar-transfer__header", children: [_jsx(Heading, { level: 5, variant: "bold", color: "accent", children: "Select your transfer details" }), _jsx("div", { className: "search-bar-transfer__mode-selector", children: _jsx(SegmentedButton, { options: modeOptions, value: mode, onChange: handleModeChange, name: "transfer-mode" }) })] }), mode === "roundtrip" ? (_jsxs(_Fragment, { children: [_jsx(RoundTrip, { id: "roundtrip-main", locations: locations, paxData: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.paxData, arrivalDate: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.arrivalDate, departureDate: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.departureDate, pickupDropoffPoint: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.pickupDropoffPoint, accommodation: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.accommodation, onChange: setRoundTripData, checkEmpty: error !== null, scrollOnOpen: scrollOnOpen }), _jsx("div", { className: "search-bar-transfer__transfer-type", children: renderTransferTypeButtons(handleAddTransferFromRoundTrip) })] })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "search-bar-transfer__transfer-type", children: [_jsx(Text, { size: "lg", variant: "bold", color: "subtle", as: "div", className: "search-bar-transfer__transfer-type-label", children: "Select a transfer type you want to add" }), renderTransferTypeButtons(handleAddTransfer)] }), transferLines.length === 0 && (_jsx(TransferLine, { id: "placeholder-transfer", type: "inter-hotel", locations: locations, onDataChange: function () { }, showDelete: false, disabled: true, scrollOnOpen: scrollOnOpen })), transferLines.length > 0 && (_jsx("div", { className: "search-bar-transfer__transfer-lines", children: (function () {
|
|
382
|
+
return (_jsxs("div", { className: "search-bar-transfer ".concat(className), children: [_jsxs("div", { className: "search-bar-transfer__header", children: [_jsx(Heading, { level: 5, variant: "bold", color: "accent", children: "Select your transfer details" }), _jsx("div", { className: "search-bar-transfer__mode-selector", children: _jsx(SegmentedButton, { options: modeOptions, value: mode, onChange: handleModeChange, name: "transfer-mode" }) })] }), mode === "roundtrip" ? (_jsxs(_Fragment, { children: [_jsx(RoundTrip, { id: "roundtrip-main", locations: locations, paxData: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.paxData, arrivalDate: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.arrivalDate, departureDate: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.departureDate, pickupDropoffPoint: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.pickupDropoffPoint, accommodation: roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.accommodation, onChange: setRoundTripData, checkEmpty: error !== null, scrollOnOpen: scrollOnOpen }, "roundtrip-".concat(validationTrigger)), _jsx("div", { className: "search-bar-transfer__transfer-type", children: renderTransferTypeButtons(handleAddTransferFromRoundTrip) })] })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "search-bar-transfer__transfer-type", children: [_jsx(Text, { size: "lg", variant: "bold", color: "subtle", as: "div", className: "search-bar-transfer__transfer-type-label", children: "Select a transfer type you want to add" }), renderTransferTypeButtons(handleAddTransfer)] }), transferLines.length === 0 && (_jsx(TransferLine, { id: "placeholder-transfer", type: "inter-hotel", locations: locations, onDataChange: function () { }, showDelete: false, disabled: true, scrollOnOpen: scrollOnOpen })), transferLines.length > 0 && (_jsx("div", { className: "search-bar-transfer__transfer-lines", children: (function () {
|
|
381
383
|
// Group transfers by type
|
|
382
384
|
var groupedTransfers = {
|
|
383
385
|
arrival: [],
|
|
@@ -396,7 +398,7 @@ var SearchBarTransfer = function (_a) {
|
|
|
396
398
|
departure: { label: "Departure", icon: "departure" },
|
|
397
399
|
"inter-hotel": { label: "Inter-Hotel", icon: "building" },
|
|
398
400
|
};
|
|
399
|
-
return nonEmptyGroups.map(function (type, groupIndex) { return (_jsxs(React.Fragment, { children: [_jsxs("div", { className: "search-bar-transfer__category-header", children: [_jsx(Icon, { name: categoryInfo[type].icon, size: "md" }), _jsx(Text, { size: "md", variant: "bold", color: "default", as: "span", children: categoryInfo[type].label })] }), groupedTransfers[type].map(function (line) { return (_jsx(TransferLine, { id: line.id, type: line.type, paxData: line.paxData, transferDate: line.transferDate, pickupPoint: line.pickupPoint, dropoffPoint: line.dropoffPoint, locations: locations, onDataChange: function (data) { return handleTransferLineChange(line.id, data); }, onDelete: function () { return handleDeleteTransferLine(line.id); }, showDelete: transferLines.length > 1, checkEmpty: error !== null, scrollOnOpen: scrollOnOpen }, line.id)); }), groupIndex < nonEmptyGroups.length - 1 && (_jsx("svg", { className: "search-bar-transfer__divider", xmlns: "http://www.w3.org/2000/svg", width: "100%", height: "1", viewBox: "0 0 1076 1", fill: "none", preserveAspectRatio: "none", children: _jsx("path", { d: "M0 0.5L1076 0.499906", stroke: "var(--color-border-medium, #A3A3A3)", strokeWidth: "1", strokeDasharray: "10 10" }) }))] }, type)); });
|
|
401
|
+
return nonEmptyGroups.map(function (type, groupIndex) { return (_jsxs(React.Fragment, { children: [_jsxs("div", { className: "search-bar-transfer__category-header", children: [_jsx(Icon, { name: categoryInfo[type].icon, size: "md" }), _jsx(Text, { size: "md", variant: "bold", color: "default", as: "span", children: categoryInfo[type].label })] }), groupedTransfers[type].map(function (line) { return (_jsx(TransferLine, { id: line.id, type: line.type, paxData: line.paxData, transferDate: line.transferDate, pickupPoint: line.pickupPoint, dropoffPoint: line.dropoffPoint, locations: locations, onDataChange: function (data) { return handleTransferLineChange(line.id, data); }, onDelete: function () { return handleDeleteTransferLine(line.id); }, showDelete: transferLines.length > 1, checkEmpty: error !== null, scrollOnOpen: scrollOnOpen }, "".concat(line.id, "-").concat(validationTrigger))); }), groupIndex < nonEmptyGroups.length - 1 && (_jsx("svg", { className: "search-bar-transfer__divider", xmlns: "http://www.w3.org/2000/svg", width: "100%", height: "1", viewBox: "0 0 1076 1", fill: "none", preserveAspectRatio: "none", children: _jsx("path", { d: "M0 0.5L1076 0.499906", stroke: "var(--color-border-medium, #A3A3A3)", strokeWidth: "1", strokeDasharray: "10 10" }) }))] }, type)); });
|
|
400
402
|
})() }))] })), _jsxs("div", { className: "search-bar-transfer__actions", children: [_jsx(Checkbox, { checked: sameVehicle, onChange: setSameVehicle, label: "Use the same vehicle for all your transfers" }), _jsxs("div", { className: "search-bar-transfer__cta", children: [error && (_jsx(Toast, { text: error, type: "danger" })), _jsx(Button, { variant: "primary", size: "lg", onClick: handleSearch, children: "Search" })] })] })] }));
|
|
401
403
|
};
|
|
402
404
|
export default SearchBarTransfer;
|
package/package.json
CHANGED
|
@@ -132,9 +132,14 @@ const DateTimePicker: React.FC<DateTimePickerProps> = ({
|
|
|
132
132
|
onValueChange?.(dateStr);
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
|
|
135
|
+
} else if (!payload.dateRange && !payload.time) {
|
|
136
|
+
// Handle clearing: return empty string for single mode, empty array for range mode
|
|
137
|
+
if (selectionMode === 'range') {
|
|
138
|
+
onValueChange?.([]);
|
|
139
|
+
} else {
|
|
140
|
+
onValueChange?.('');
|
|
141
|
+
}
|
|
142
|
+
} else if (!payload.dateRange && payload.time) {
|
|
138
143
|
const timeStr = `${payload.time.hour}:${payload.time.minute} ${payload.time.meridiem}`;
|
|
139
144
|
onValueChange?.(timeStr);
|
|
140
145
|
}
|
|
@@ -271,10 +271,12 @@ const RoundTrip: React.FC<RoundTripProps> = ({
|
|
|
271
271
|
};
|
|
272
272
|
|
|
273
273
|
const handleDateRangeChange = (dates: string | string[]) => {
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
274
|
+
console.log({dates});
|
|
275
|
+
|
|
276
|
+
if (Array.isArray(dates)) {
|
|
277
|
+
setInternalArrivalDate(dates?.[0]);
|
|
278
|
+
setInternalDepartureDate(dates?.[1]);
|
|
279
|
+
onDatesChange?.(dates?.[0], dates?.[1]);
|
|
278
280
|
}
|
|
279
281
|
};
|
|
280
282
|
|
|
@@ -324,8 +326,22 @@ const RoundTrip: React.FC<RoundTripProps> = ({
|
|
|
324
326
|
internalPaxData.children === 0 &&
|
|
325
327
|
(internalPaxData.infants === undefined || internalPaxData.infants === 0)));
|
|
326
328
|
|
|
329
|
+
// Show error if checkEmpty is true and either date is missing
|
|
327
330
|
const isDateEmpty = checkEmpty && (!internalArrivalDate || !internalDepartureDate ||
|
|
328
331
|
internalArrivalDate === '' || internalDepartureDate === '');
|
|
332
|
+
|
|
333
|
+
// Check if user filled one date but not the other (even without checkEmpty)
|
|
334
|
+
const hasPartialDates = (): boolean => {
|
|
335
|
+
console.log({checkEmpty, internalArrivalDate, internalDepartureDate});
|
|
336
|
+
if (!checkEmpty) return false;
|
|
337
|
+
if (!internalArrivalDate || !internalDepartureDate) return true;
|
|
338
|
+
return internalArrivalDate === internalDepartureDate;
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
const isDateError = (): boolean => {
|
|
342
|
+
console.log('isDateEmpty', isDateEmpty, hasPartialDates());
|
|
343
|
+
return isDateEmpty || hasPartialDates();
|
|
344
|
+
};
|
|
329
345
|
|
|
330
346
|
const isPickupDropoffEmpty = checkEmpty && !internalPickupDropoffPoint;
|
|
331
347
|
|
|
@@ -382,7 +398,7 @@ const RoundTrip: React.FC<RoundTripProps> = ({
|
|
|
382
398
|
selectionMode="range"
|
|
383
399
|
defaultValue={internalArrivalDate && internalDepartureDate ? [internalArrivalDate, internalDepartureDate] : undefined}
|
|
384
400
|
inputClassName="round-trip__date-picker--input"
|
|
385
|
-
state={
|
|
401
|
+
state={isDateError() ? 'error' : undefined}
|
|
386
402
|
scrollOnOpen={scrollOnOpen}
|
|
387
403
|
/>
|
|
388
404
|
</div>
|
|
@@ -85,6 +85,7 @@ const SearchBarTransfer: React.FC<SearchBarTransferProps> = ({
|
|
|
85
85
|
initializeTransferLines(defaultTransferLines)
|
|
86
86
|
);
|
|
87
87
|
const [error, setError] = useState<string | null>(null);
|
|
88
|
+
const [validationTrigger, setValidationTrigger] = useState<number>(0);
|
|
88
89
|
|
|
89
90
|
// Notify parent of changes
|
|
90
91
|
useEffect(() => {
|
|
@@ -467,6 +468,8 @@ const SearchBarTransfer: React.FC<SearchBarTransferProps> = ({
|
|
|
467
468
|
|
|
468
469
|
// Handle search
|
|
469
470
|
const handleSearch = () => {
|
|
471
|
+
setValidationTrigger(prev => prev + 1);
|
|
472
|
+
|
|
470
473
|
if (validateData()) {
|
|
471
474
|
const data: SearchBarTransferData = {
|
|
472
475
|
mode,
|
|
@@ -501,6 +504,7 @@ const SearchBarTransfer: React.FC<SearchBarTransferProps> = ({
|
|
|
501
504
|
{mode === "roundtrip" ? (
|
|
502
505
|
<>
|
|
503
506
|
<RoundTrip
|
|
507
|
+
key={`roundtrip-${validationTrigger}`}
|
|
504
508
|
id="roundtrip-main"
|
|
505
509
|
locations={locations}
|
|
506
510
|
paxData={roundTripData?.paxData}
|
|
@@ -579,7 +583,7 @@ const SearchBarTransfer: React.FC<SearchBarTransferProps> = ({
|
|
|
579
583
|
{/* Transfer lines in this category */}
|
|
580
584
|
{groupedTransfers[type].map((line) => (
|
|
581
585
|
<TransferLine
|
|
582
|
-
key={line.id}
|
|
586
|
+
key={`${line.id}-${validationTrigger}`}
|
|
583
587
|
id={line.id}
|
|
584
588
|
type={line.type}
|
|
585
589
|
paxData={line.paxData}
|