mautourco-components 0.1.2 → 0.2.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.
Files changed (132) hide show
  1. package/dist/components/atoms/Checkbox/Checkbox.js +7 -1
  2. package/dist/components/atoms/Icon/Icon.d.ts +1 -1
  3. package/dist/components/atoms/Icon/Icon.js +22 -1
  4. package/dist/components/atoms/Icon/icons/BuildingIcon.d.ts +8 -0
  5. package/dist/components/atoms/Icon/icons/BuildingIcon.js +36 -0
  6. package/dist/components/atoms/Icon/icons/CalendarOutlineIcon.d.ts +8 -0
  7. package/dist/components/atoms/Icon/icons/CalendarOutlineIcon.js +36 -0
  8. package/dist/components/atoms/Icon/icons/HomeIcon.d.ts +8 -0
  9. package/dist/components/atoms/Icon/icons/HomeIcon.js +25 -0
  10. package/dist/components/atoms/Icon/icons/MinusIcon.d.ts +8 -0
  11. package/dist/components/atoms/Icon/icons/MinusIcon.js +25 -0
  12. package/dist/components/atoms/Icon/icons/PlaneIcon.d.ts +8 -0
  13. package/dist/components/atoms/Icon/icons/PlaneIcon.js +36 -0
  14. package/dist/components/atoms/Icon/icons/PlusIcon.d.ts +8 -0
  15. package/dist/components/atoms/Icon/icons/PlusIcon.js +25 -0
  16. package/dist/components/atoms/Icon/icons/ShipIcon.d.ts +8 -0
  17. package/dist/components/atoms/Icon/icons/ShipIcon.js +36 -0
  18. package/dist/components/atoms/Illustration/Illustration.d.ts +14 -0
  19. package/dist/components/atoms/Illustration/Illustration.js +33 -0
  20. package/dist/components/atoms/Illustration/illustrations.d.ts +51 -0
  21. package/dist/components/atoms/Illustration/illustrations.js +97 -0
  22. package/dist/components/atoms/RatingStar/RatingStar.d.ts +40 -0
  23. package/dist/components/atoms/RatingStar/RatingStar.js +54 -0
  24. package/dist/components/atoms/SegmentedButton/SegmentedButton.d.ts +27 -0
  25. package/dist/components/atoms/SegmentedButton/SegmentedButton.js +49 -0
  26. package/dist/components/atoms/Slider/Slider.d.ts +52 -0
  27. package/dist/components/atoms/Slider/Slider.js +30 -0
  28. package/dist/components/molecules/Calendar/CalendarInput.d.ts +34 -0
  29. package/dist/components/molecules/Calendar/CalendarInput.js +49 -0
  30. package/dist/components/molecules/Calendar/DateTime.d.ts +25 -0
  31. package/dist/components/molecules/Calendar/DateTime.js +106 -0
  32. package/dist/components/molecules/Calendar/TimePicker.d.ts +16 -0
  33. package/dist/components/molecules/Calendar/TimePicker.js +91 -0
  34. package/dist/components/molecules/LocationDropdown/LocationDropdown.d.ts +34 -0
  35. package/dist/components/molecules/LocationDropdown/LocationDropdown.js +120 -0
  36. package/dist/components/molecules/LocationDropdown/index.d.ts +2 -0
  37. package/dist/components/molecules/LocationDropdown/index.js +1 -0
  38. package/dist/components/molecules/RatingTab/RatingTab.d.ts +39 -0
  39. package/dist/components/molecules/RatingTab/RatingTab.js +41 -0
  40. package/dist/components/molecules/TabGroup/TabGroup.d.ts +17 -0
  41. package/dist/components/molecules/TabGroup/TabGroup.js +30 -0
  42. package/dist/components/organisms/CardContainer/CardContainer.d.ts +37 -0
  43. package/dist/components/organisms/CardContainer/CardContainer.js +27 -0
  44. package/dist/components/organisms/DateTimePicker/DateTimePicker.d.ts +15 -0
  45. package/dist/components/organisms/DateTimePicker/DateTimePicker.js +66 -0
  46. package/dist/components/organisms/Dialog/Dialog.d.ts +103 -0
  47. package/dist/components/organisms/Dialog/Dialog.js +162 -0
  48. package/dist/components/organisms/PaxSelector/PaxSelector.d.ts +63 -0
  49. package/dist/components/organisms/PaxSelector/PaxSelector.js +402 -0
  50. package/dist/components/organisms/RoundTrip/RoundTrip.d.ts +54 -0
  51. package/dist/components/organisms/RoundTrip/RoundTrip.js +179 -0
  52. package/dist/components/organisms/RoundTrip/index.d.ts +2 -0
  53. package/dist/components/organisms/RoundTrip/index.js +1 -0
  54. package/dist/components/organisms/SearchBarTransfer/SearchBarTransfer.d.ts +35 -0
  55. package/dist/components/organisms/SearchBarTransfer/SearchBarTransfer.js +192 -0
  56. package/dist/components/organisms/SearchBarTransfer/index.d.ts +2 -0
  57. package/dist/components/organisms/SearchBarTransfer/index.js +1 -0
  58. package/dist/components/organisms/TransferLine/TransferLine.d.ts +53 -0
  59. package/dist/components/organisms/TransferLine/TransferLine.js +179 -0
  60. package/dist/components/ui/button.d.ts +10 -0
  61. package/dist/components/ui/button.js +56 -0
  62. package/dist/components/ui/calendar.d.ts +8 -0
  63. package/dist/components/ui/calendar.js +87 -0
  64. package/dist/components/ui/popover.d.ts +7 -0
  65. package/dist/components/ui/popover.js +42 -0
  66. package/dist/index.d.ts +26 -0
  67. package/dist/index.js +18 -0
  68. package/dist/lib/utils.d.ts +7 -0
  69. package/dist/lib/utils.js +13 -0
  70. package/package.json +21 -12
  71. package/src/components/atoms/Button/Button.css +34 -34
  72. package/src/components/atoms/Checkbox/Checkbox.tsx +83 -69
  73. package/src/components/atoms/Icon/Icon.tsx +30 -2
  74. package/src/components/atoms/Icon/icons/BuildingIcon.tsx +50 -0
  75. package/src/components/atoms/Icon/icons/CalendarOutlineIcon.tsx +50 -0
  76. package/src/components/atoms/Icon/icons/HomeIcon.tsx +52 -0
  77. package/src/components/atoms/Icon/icons/MinusIcon.tsx +45 -0
  78. package/src/components/atoms/Icon/icons/PlaneIcon.tsx +50 -0
  79. package/src/components/atoms/Icon/icons/PlusIcon.tsx +45 -0
  80. package/src/components/atoms/Icon/icons/ShipIcon.tsx +50 -0
  81. package/src/components/atoms/Illustration/Illustration.tsx +28 -0
  82. package/src/components/atoms/Illustration/illustrations.ts +116 -0
  83. package/src/components/atoms/RatingStar/RatingStar.tsx +114 -0
  84. package/src/components/atoms/SegmentedButton/SegmentedButton.tsx +94 -0
  85. package/src/components/atoms/Slider/Slider.tsx +95 -0
  86. package/src/components/molecules/Calendar/CalendarInput.tsx +135 -0
  87. package/src/components/molecules/Calendar/DateTime.tsx +172 -0
  88. package/src/components/molecules/Calendar/TimePicker.tsx +174 -0
  89. package/src/components/molecules/LocationDropdown/LocationDropdown.tsx +234 -0
  90. package/src/components/molecules/LocationDropdown/index.ts +2 -0
  91. package/src/components/molecules/RatingTab/RatingTab.tsx +96 -0
  92. package/src/components/molecules/TabGroup/TabGroup.tsx +60 -0
  93. package/src/components/molecules/UserCard/UserCard.stories.tsx +2 -2
  94. package/src/components/organisms/CardContainer/CardContainer.tsx +66 -0
  95. package/src/components/organisms/DateTimePicker/DateTimePicker.tsx +110 -0
  96. package/src/components/organisms/Dialog/Dialog.tsx +352 -0
  97. package/src/components/organisms/PaxSelector/PaxSelector.tsx +979 -0
  98. package/src/components/organisms/RoundTrip/RoundTrip.tsx +335 -0
  99. package/src/components/organisms/RoundTrip/index.ts +2 -0
  100. package/src/components/organisms/SearchBarTransfer/SearchBarTransfer.tsx +388 -0
  101. package/src/components/organisms/SearchBarTransfer/index.ts +2 -0
  102. package/src/components/organisms/TransferLine/TransferLine.tsx +369 -0
  103. package/src/components/ui/button.tsx +60 -0
  104. package/src/components/ui/calendar.tsx +246 -0
  105. package/src/components/ui/popover.tsx +46 -0
  106. package/src/styles/components/calendar.css +86 -0
  107. package/src/styles/components/checkbox.css +130 -132
  108. package/src/styles/components/dropdown.css +40 -40
  109. package/src/styles/components/forms.css +51 -51
  110. package/src/styles/components/illustration.css +7 -0
  111. package/src/styles/components/molecule/calendarInput.css +157 -0
  112. package/src/styles/components/molecule/dateTime.css +14 -0
  113. package/src/styles/components/molecule/location-dropdown.css +204 -0
  114. package/src/styles/components/molecule/timePicker.css +79 -0
  115. package/src/styles/components/multiselect-dropdown.css +230 -231
  116. package/src/styles/components/organism/card-container.css +49 -0
  117. package/src/styles/components/organism/dialog.css +241 -0
  118. package/src/styles/components/organism/pax-selector.css +702 -0
  119. package/src/styles/components/organism/round-trip.css +55 -0
  120. package/src/styles/components/organism/search-bar-transfer.css +128 -0
  121. package/src/styles/components/organism/transfer-line.css +86 -0
  122. package/src/styles/components/rating-star.css +39 -0
  123. package/src/styles/components/rating-tab.css +83 -0
  124. package/src/styles/components/segmented-button.css +134 -0
  125. package/src/styles/components/selected-value.css +16 -16
  126. package/src/styles/components/slider.css +86 -0
  127. package/src/styles/components/typography.css +36 -36
  128. package/src/styles/tokens/tokens.css +1093 -1093
  129. package/dist/components/atoms/Typography/Heading/Heading.d.ts +0 -9
  130. package/dist/components/atoms/Typography/Heading/Heading.js +0 -25
  131. package/dist/components/atoms/Typography/Text/Text.d.ts +0 -10
  132. package/dist/components/atoms/Typography/Text/Text.js +0 -77
@@ -0,0 +1,54 @@
1
+ import React from "react";
2
+ import { PaxData } from "../PaxSelector/PaxSelector";
3
+ import { LocationOption, LocationGroup, LocationData } from "../../molecules/LocationDropdown/LocationDropdown";
4
+ import "../../../styles/components/organism/round-trip.css";
5
+ export type { LocationData };
6
+ export interface RoundTripTransfer {
7
+ type: "arrival" | "departure";
8
+ paxData?: PaxData;
9
+ transferDate?: string;
10
+ pickupPoint?: LocationData;
11
+ dropoffPoint?: LocationData;
12
+ }
13
+ export interface RoundTripData {
14
+ id: string;
15
+ paxData?: PaxData;
16
+ arrivalDate?: string;
17
+ departureDate?: string;
18
+ pickupDropoffPoint?: LocationData;
19
+ accommodation?: LocationData;
20
+ transfers: [RoundTripTransfer, RoundTripTransfer];
21
+ }
22
+ export interface RoundTripProps {
23
+ /** Unique identifier for this round trip */
24
+ id: string;
25
+ /** Pax data */
26
+ paxData?: PaxData;
27
+ /** Arrival date */
28
+ arrivalDate?: string;
29
+ /** Departure date */
30
+ departureDate?: string;
31
+ /** Selected pickup/dropoff point ID (for initial value) */
32
+ pickupDropoffPoint?: string;
33
+ /** Selected accommodation ID (for initial value) */
34
+ accommodation?: string;
35
+ /** All location options */
36
+ locations?: {
37
+ options?: LocationOption[];
38
+ groups?: LocationGroup[];
39
+ };
40
+ /** Callback when pax data changes */
41
+ onPaxChange?: (paxData: PaxData) => void;
42
+ /** Callback when dates change */
43
+ onDatesChange?: (arrivalDate: string, departureDate: string) => void;
44
+ /** Callback when pickup/dropoff point changes */
45
+ onPickupDropoffChange?: (location: LocationData | null) => void;
46
+ /** Callback when accommodation changes */
47
+ onAccommodationChange?: (location: LocationData | null) => void;
48
+ /** Callback when any data changes - returns array of 2 transfers */
49
+ onChange?: (data: RoundTripData) => void;
50
+ /** Additional CSS classes */
51
+ className?: string;
52
+ }
53
+ declare const RoundTrip: React.FC<RoundTripProps>;
54
+ export default RoundTrip;
@@ -0,0 +1,179 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
13
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
14
+ if (ar || !(i in from)) {
15
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
16
+ ar[i] = from[i];
17
+ }
18
+ }
19
+ return to.concat(ar || Array.prototype.slice.call(from));
20
+ };
21
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
22
+ import { useState, useEffect } from "react";
23
+ import { Text } from "../../atoms/Typography/Typography";
24
+ import PaxSelector from "../PaxSelector/PaxSelector";
25
+ import DateTimePicker from "../DateTimePicker/DateTimePicker";
26
+ import LocationDropdown from "../../molecules/LocationDropdown/LocationDropdown";
27
+ import "../../../styles/components/organism/round-trip.css";
28
+ var RoundTrip = function (_a) {
29
+ var id = _a.id, paxData = _a.paxData, arrivalDate = _a.arrivalDate, departureDate = _a.departureDate, pickupDropoffPoint = _a.pickupDropoffPoint, accommodation = _a.accommodation, _b = _a.locations, locations = _b === void 0 ? { options: [], groups: [] } : _b, onPaxChange = _a.onPaxChange, onDatesChange = _a.onDatesChange, onPickupDropoffChange = _a.onPickupDropoffChange, onAccommodationChange = _a.onAccommodationChange, onChange = _a.onChange, _c = _a.className, className = _c === void 0 ? "" : _c;
30
+ var _d = useState(paxData), internalPaxData = _d[0], setInternalPaxData = _d[1];
31
+ var _e = useState(arrivalDate), internalArrivalDate = _e[0], setInternalArrivalDate = _e[1];
32
+ var _f = useState(departureDate), internalDepartureDate = _f[0], setInternalDepartureDate = _f[1];
33
+ var _g = useState(null), internalPickupDropoffPoint = _g[0], setInternalPickupDropoffPoint = _g[1];
34
+ var _h = useState(null), internalAccommodation = _h[0], setInternalAccommodation = _h[1];
35
+ // Helper function to get all locations (from options and groups)
36
+ var getAllLocations = function (options, groups) {
37
+ var groupOptions = groups.flatMap(function (group) { return group.options; });
38
+ return __spreadArray(__spreadArray([], options, true), groupOptions, true);
39
+ };
40
+ // Get airport/port options and accommodation options
41
+ var getPickupDropoffOptions = function () {
42
+ var allOptions = locations.options || [];
43
+ var allGroups = locations.groups || [];
44
+ // Filter for airport and port
45
+ var airportPortOptions = allOptions.filter(function (opt) { return opt.type === "airport" || opt.type === "port"; });
46
+ // Filter for accommodations
47
+ var accommodationOptions = allOptions.filter(function (opt) { return opt.type === "accommodation"; });
48
+ // Create groups
49
+ var airportPortGroup = {
50
+ id: "airport-port-group",
51
+ label: "Airport & Port",
52
+ options: airportPortOptions,
53
+ };
54
+ var accommodationGroup = {
55
+ id: "accommodation-group",
56
+ label: "Accommodations",
57
+ options: accommodationOptions,
58
+ };
59
+ return {
60
+ options: [],
61
+ groups: [airportPortGroup, accommodationGroup].filter(function (g) { return g.options.length > 0; }),
62
+ };
63
+ };
64
+ var getAccommodationOptions = function () {
65
+ var allOptions = locations.options || [];
66
+ var allGroups = locations.groups || [];
67
+ // Filter for accommodations only
68
+ var accommodationOptions = allOptions.filter(function (opt) { return opt.type === "accommodation"; });
69
+ // Extract accommodation groups if they exist
70
+ var accommodationGroups = allGroups
71
+ .map(function (group) { return (__assign(__assign({}, group), { options: group.options.filter(function (opt) { return opt.type === "accommodation"; }) })); })
72
+ .filter(function (group) { return group.options.length > 0; });
73
+ return {
74
+ options: accommodationOptions,
75
+ groups: accommodationGroups,
76
+ };
77
+ };
78
+ // Initialize location data from IDs
79
+ useEffect(function () {
80
+ var _a = getPickupDropoffOptions(), options = _a.options, groups = _a.groups;
81
+ var allLocations = getAllLocations(options, groups);
82
+ if (pickupDropoffPoint) {
83
+ var location_1 = allLocations.find(function (loc) { return loc.id === pickupDropoffPoint; });
84
+ if (location_1) {
85
+ setInternalPickupDropoffPoint({
86
+ id: location_1.id,
87
+ locationName: location_1.label,
88
+ });
89
+ }
90
+ }
91
+ else {
92
+ // Set default to first airport if available
93
+ var defaultAirport = allLocations.find(function (loc) { return loc.type === "airport"; });
94
+ if (defaultAirport) {
95
+ var defaultData = {
96
+ id: defaultAirport.id,
97
+ locationName: defaultAirport.label,
98
+ };
99
+ setInternalPickupDropoffPoint(defaultData);
100
+ onPickupDropoffChange === null || onPickupDropoffChange === void 0 ? void 0 : onPickupDropoffChange(defaultData);
101
+ }
102
+ }
103
+ // eslint-disable-next-line react-hooks/exhaustive-deps
104
+ }, [pickupDropoffPoint, locations]);
105
+ useEffect(function () {
106
+ var _a = getAccommodationOptions(), options = _a.options, groups = _a.groups;
107
+ var allLocations = getAllLocations(options, groups);
108
+ if (accommodation) {
109
+ var location_2 = allLocations.find(function (loc) { return loc.id === accommodation; });
110
+ if (location_2) {
111
+ setInternalAccommodation({
112
+ id: location_2.id,
113
+ locationName: location_2.label,
114
+ });
115
+ }
116
+ }
117
+ // eslint-disable-next-line react-hooks/exhaustive-deps
118
+ }, [accommodation, locations]);
119
+ // Update complete data whenever any field changes
120
+ useEffect(function () {
121
+ // Create arrival transfer
122
+ var arrivalTransfer = {
123
+ type: "arrival",
124
+ paxData: internalPaxData,
125
+ transferDate: internalArrivalDate,
126
+ pickupPoint: internalPickupDropoffPoint || undefined,
127
+ dropoffPoint: internalAccommodation || undefined,
128
+ };
129
+ // Create departure transfer
130
+ var departureTransfer = {
131
+ type: "departure",
132
+ paxData: internalPaxData,
133
+ transferDate: internalDepartureDate,
134
+ pickupPoint: internalAccommodation || undefined,
135
+ dropoffPoint: internalPickupDropoffPoint || undefined,
136
+ };
137
+ var completeData = {
138
+ id: id,
139
+ paxData: internalPaxData,
140
+ arrivalDate: internalArrivalDate,
141
+ departureDate: internalDepartureDate,
142
+ pickupDropoffPoint: internalPickupDropoffPoint || undefined,
143
+ accommodation: internalAccommodation || undefined,
144
+ transfers: [arrivalTransfer, departureTransfer],
145
+ };
146
+ onChange === null || onChange === void 0 ? void 0 : onChange(completeData);
147
+ // eslint-disable-next-line react-hooks/exhaustive-deps
148
+ }, [
149
+ id,
150
+ internalPaxData,
151
+ internalArrivalDate,
152
+ internalDepartureDate,
153
+ internalPickupDropoffPoint,
154
+ internalAccommodation,
155
+ ]);
156
+ var handlePaxChange = function (newPaxData) {
157
+ setInternalPaxData(newPaxData);
158
+ onPaxChange === null || onPaxChange === void 0 ? void 0 : onPaxChange(newPaxData);
159
+ };
160
+ var handleDateRangeChange = function (dates) {
161
+ if (Array.isArray(dates) && dates.length === 2) {
162
+ setInternalArrivalDate(dates[0]);
163
+ setInternalDepartureDate(dates[1]);
164
+ onDatesChange === null || onDatesChange === void 0 ? void 0 : onDatesChange(dates[0], dates[1]);
165
+ }
166
+ };
167
+ var handlePickupDropoffChange = function (location) {
168
+ setInternalPickupDropoffPoint(location);
169
+ onPickupDropoffChange === null || onPickupDropoffChange === void 0 ? void 0 : onPickupDropoffChange(location);
170
+ };
171
+ var handleAccommodationChange = function (location) {
172
+ setInternalAccommodation(location);
173
+ onAccommodationChange === null || onAccommodationChange === void 0 ? void 0 : onAccommodationChange(location);
174
+ };
175
+ var pickupDropoffOptions = getPickupDropoffOptions();
176
+ var accommodationOptions = getAccommodationOptions();
177
+ return (_jsx("div", __assign({ className: "round-trip ".concat(className), "data-round-trip-id": id }, { children: _jsxs("div", __assign({ className: "round-trip__content" }, { children: [_jsx("div", __assign({ className: "round-trip__field round-trip__field--pax" }, { children: _jsx(PaxSelector, { label: "Number of pax", value: internalPaxData, onChange: handlePaxChange, placeholder: "2 pax" }) })), _jsxs("div", __assign({ className: "round-trip__field round-trip__field--dates" }, { children: [_jsx(Text, __assign({ 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" })] })), _jsx("div", __assign({ 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 }) })), _jsx("div", __assign({ 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 }) }))] })) })));
178
+ };
179
+ export default RoundTrip;
@@ -0,0 +1,2 @@
1
+ export { default } from './RoundTrip';
2
+ export type { RoundTripProps, RoundTripData, RoundTripTransfer } from './RoundTrip';
@@ -0,0 +1 @@
1
+ export { default } from './RoundTrip';
@@ -0,0 +1,35 @@
1
+ import React from "react";
2
+ import { RoundTripData } from "../RoundTrip/RoundTrip";
3
+ import { TransferLineData } from "../TransferLine/TransferLine";
4
+ import { LocationOption, LocationGroup } from "../../molecules/LocationDropdown/LocationDropdown";
5
+ import "../../../styles/components/organism/search-bar-transfer.css";
6
+ export type TransferMode = "roundtrip" | "custom";
7
+ export interface SearchBarTransferData {
8
+ mode: TransferMode;
9
+ sameVehicle: boolean;
10
+ roundTripData?: RoundTripData;
11
+ transferLines?: TransferLineData[];
12
+ }
13
+ export interface SearchBarTransferProps {
14
+ /** Initial mode */
15
+ mode?: TransferMode;
16
+ /** Location options for dropdowns */
17
+ locations?: {
18
+ options?: LocationOption[];
19
+ groups?: LocationGroup[];
20
+ };
21
+ /** Default round trip data (for roundtrip mode) */
22
+ defaultRoundTripData?: RoundTripData;
23
+ /** Default transfer lines (for custom mode) */
24
+ defaultTransferLines?: TransferLineData[];
25
+ /** Default "same vehicle" checkbox state */
26
+ defaultSameVehicle?: boolean;
27
+ /** Callback when search button is clicked */
28
+ onSearch?: (data: SearchBarTransferData) => void;
29
+ /** Callback when data changes */
30
+ onChange?: (data: SearchBarTransferData) => void;
31
+ /** Additional CSS classes */
32
+ className?: string;
33
+ }
34
+ declare const SearchBarTransfer: React.FC<SearchBarTransferProps>;
35
+ export default SearchBarTransfer;
@@ -0,0 +1,192 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
13
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
14
+ if (ar || !(i in from)) {
15
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
16
+ ar[i] = from[i];
17
+ }
18
+ }
19
+ return to.concat(ar || Array.prototype.slice.call(from));
20
+ };
21
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
22
+ import React, { useState, useEffect } from "react";
23
+ import RoundTrip from "../RoundTrip/RoundTrip";
24
+ import TransferLine from "../TransferLine/TransferLine";
25
+ import Button from "../../atoms/Button/Button";
26
+ import Checkbox from "../../atoms/Checkbox/Checkbox";
27
+ import { Text, Heading } from "../../atoms/Typography/Typography";
28
+ import Icon from "../../atoms/Icon/Icon";
29
+ import SegmentedButton from "../../atoms/SegmentedButton/SegmentedButton";
30
+ import "../../../styles/components/organism/search-bar-transfer.css";
31
+ var transferIdCounter = 0;
32
+ var SearchBarTransfer = function (_a) {
33
+ var _b, _c;
34
+ var _d = _a.mode, initialMode = _d === void 0 ? "roundtrip" : _d, _e = _a.locations, locations = _e === void 0 ? { options: [], groups: [] } : _e, defaultRoundTripData = _a.defaultRoundTripData, defaultTransferLines = _a.defaultTransferLines, _f = _a.defaultSameVehicle, defaultSameVehicle = _f === void 0 ? false : _f, onSearch = _a.onSearch, onChange = _a.onChange, _g = _a.className, className = _g === void 0 ? "" : _g;
35
+ // Generate unique ID for transfer lines
36
+ var generateTransferId = function () {
37
+ transferIdCounter += 1;
38
+ return "transfer-".concat(transferIdCounter, "-").concat(Date.now());
39
+ };
40
+ // Ensure default transfer lines have IDs
41
+ var initializeTransferLines = function (lines) {
42
+ if (!lines)
43
+ return [];
44
+ return lines.map(function (line) { return (__assign(__assign({}, line), { id: line.id || generateTransferId() })); });
45
+ };
46
+ var _h = useState(initialMode), mode = _h[0], setMode = _h[1];
47
+ var _j = useState(defaultSameVehicle), sameVehicle = _j[0], setSameVehicle = _j[1];
48
+ var _k = useState(defaultRoundTripData), roundTripData = _k[0], setRoundTripData = _k[1];
49
+ var _l = useState(initializeTransferLines(defaultTransferLines)), transferLines = _l[0], setTransferLines = _l[1];
50
+ var _m = useState(null), error = _m[0], setError = _m[1];
51
+ // Notify parent of changes
52
+ useEffect(function () {
53
+ var data = {
54
+ mode: mode,
55
+ sameVehicle: sameVehicle,
56
+ roundTripData: mode === "roundtrip" ? roundTripData : undefined,
57
+ transferLines: mode === "custom" ? transferLines : undefined,
58
+ };
59
+ onChange === null || onChange === void 0 ? void 0 : onChange(data);
60
+ }, [mode, sameVehicle, roundTripData, transferLines, onChange]);
61
+ // Mode options for SegmentedButton
62
+ var modeOptions = [
63
+ { value: "roundtrip", label: "Round trip" },
64
+ { value: "custom", label: "Custom transfer" },
65
+ ];
66
+ // Handle mode change
67
+ var handleModeChange = function (newMode) {
68
+ var transferMode = newMode;
69
+ if (transferMode === mode)
70
+ return;
71
+ if (transferMode === "custom" && mode === "roundtrip" && roundTripData) {
72
+ // Parse roundtrip to two transfer lines
73
+ var arrivalTransfer = {
74
+ id: generateTransferId(),
75
+ type: "arrival",
76
+ paxData: roundTripData.paxData,
77
+ transferDate: roundTripData.arrivalDate,
78
+ pickupPoint: roundTripData.pickupDropoffPoint,
79
+ dropoffPoint: roundTripData.accommodation,
80
+ };
81
+ var departureTransfer = {
82
+ id: generateTransferId(),
83
+ type: "departure",
84
+ paxData: roundTripData.paxData,
85
+ transferDate: roundTripData.departureDate,
86
+ pickupPoint: roundTripData.accommodation,
87
+ dropoffPoint: roundTripData.pickupDropoffPoint,
88
+ };
89
+ setTransferLines([arrivalTransfer, departureTransfer]);
90
+ setRoundTripData(undefined);
91
+ }
92
+ else if (transferMode === "roundtrip" && mode === "custom") {
93
+ // Reset everything when switching to roundtrip
94
+ setTransferLines([]);
95
+ setRoundTripData(undefined);
96
+ }
97
+ setMode(transferMode);
98
+ setError(null);
99
+ };
100
+ // Handle adding transfer lines
101
+ var handleAddTransfer = function (type) {
102
+ var newTransfer = {
103
+ id: generateTransferId(),
104
+ type: type,
105
+ };
106
+ setTransferLines(__spreadArray(__spreadArray([], transferLines, true), [newTransfer], false));
107
+ };
108
+ // Handle transfer line data change
109
+ var handleTransferLineChange = function (id, data) {
110
+ setTransferLines(function (prevLines) {
111
+ return prevLines.map(function (line) { return (line.id === id ? data : line); });
112
+ });
113
+ };
114
+ // Handle transfer line deletion
115
+ var handleDeleteTransferLine = function (id) {
116
+ setTransferLines(function (prevLines) { return prevLines.filter(function (line) { return line.id !== id; }); });
117
+ };
118
+ // Validate data
119
+ var validateData = function () {
120
+ if (mode === "roundtrip") {
121
+ if (!roundTripData) {
122
+ setError("Please fill in all the transfer details.");
123
+ return false;
124
+ }
125
+ // Check if required fields are filled
126
+ if (!roundTripData.paxData ||
127
+ !roundTripData.arrivalDate ||
128
+ !roundTripData.departureDate ||
129
+ !roundTripData.pickupDropoffPoint ||
130
+ !roundTripData.accommodation) {
131
+ setError("Please fill in all the transfer details.");
132
+ return false;
133
+ }
134
+ }
135
+ else {
136
+ if (transferLines.length === 0) {
137
+ setError("Please add at least one transfer.");
138
+ return false;
139
+ }
140
+ // Check if all transfer lines have required data
141
+ for (var _i = 0, transferLines_1 = transferLines; _i < transferLines_1.length; _i++) {
142
+ var line = transferLines_1[_i];
143
+ if (!line.paxData ||
144
+ !line.transferDate ||
145
+ !line.pickupPoint ||
146
+ !line.dropoffPoint) {
147
+ setError("Please fill in all the transfer details.");
148
+ return false;
149
+ }
150
+ }
151
+ }
152
+ setError(null);
153
+ return true;
154
+ };
155
+ // Handle search
156
+ var handleSearch = function () {
157
+ if (validateData()) {
158
+ var data = {
159
+ mode: mode,
160
+ sameVehicle: sameVehicle,
161
+ roundTripData: mode === "roundtrip" ? roundTripData : undefined,
162
+ transferLines: mode === "custom" ? transferLines : undefined,
163
+ };
164
+ onSearch === null || onSearch === void 0 ? void 0 : onSearch(data);
165
+ }
166
+ };
167
+ return (_jsxs("div", __assign({ className: "search-bar-transfer ".concat(className) }, { children: [_jsxs("div", __assign({ className: "search-bar-transfer__header" }, { children: [_jsx(Heading, __assign({ level: 3, className: "search-bar-transfer__title" }, { children: "Select your transfer details" })), _jsx("div", __assign({ className: "search-bar-transfer__mode-selector" }, { children: _jsx(SegmentedButton, { options: modeOptions, value: mode, onChange: handleModeChange, name: "transfer-mode" }) }))] })), mode === "roundtrip" ? (_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: (_b = roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.pickupDropoffPoint) === null || _b === void 0 ? void 0 : _b.id, accommodation: (_c = roundTripData === null || roundTripData === void 0 ? void 0 : roundTripData.accommodation) === null || _c === void 0 ? void 0 : _c.id, onChange: setRoundTripData })) : (_jsxs(_Fragment, { children: [_jsxs("div", __assign({ className: "search-bar-transfer__transfer-type" }, { children: [_jsx(Text, __assign({ size: "lg", variant: "bold", as: "div", className: "search-bar-transfer__transfer-type-label" }, { children: "Select a transfer type you want to add" })), _jsxs("div", __assign({ className: "search-bar-transfer__add-buttons" }, { children: [_jsx(Button, __assign({ variant: "outline-secondary", size: "sm", leadingIcon: "plus", onClick: function () { return handleAddTransfer("arrival"); } }, { children: "Add Arrival" })), _jsx(Button, __assign({ variant: "outline-secondary", size: "sm", leadingIcon: "plus", onClick: function () { return handleAddTransfer("departure"); } }, { children: "Add Departure" })), _jsx(Button, __assign({ variant: "outline-secondary", size: "sm", leadingIcon: "plus", onClick: function () { return handleAddTransfer("inter-hotel"); } }, { children: "Add Inter-Hotel" }))] }))] })), transferLines.length > 0 && (_jsx("div", __assign({ className: "search-bar-transfer__transfer-lines" }, { children: (function () {
168
+ // Group transfers by type
169
+ var groupedTransfers = {
170
+ arrival: [],
171
+ departure: [],
172
+ "inter-hotel": [],
173
+ };
174
+ transferLines.forEach(function (line) {
175
+ groupedTransfers[line.type].push(line);
176
+ });
177
+ // Get the order of non-empty groups
178
+ var typeOrder = ["arrival", "inter-hotel", "departure"];
179
+ var nonEmptyGroups = typeOrder.filter(function (type) { return groupedTransfers[type].length > 0; });
180
+ // Category labels and icons
181
+ var categoryInfo = {
182
+ arrival: { label: "Arrival", icon: "arrival" },
183
+ departure: { label: "Departure", icon: "departure" },
184
+ "inter-hotel": { label: "Inter-Hotel", icon: "building" },
185
+ };
186
+ return nonEmptyGroups.map(function (type, groupIndex) { return (_jsxs(React.Fragment, { children: [_jsxs("div", __assign({ className: "search-bar-transfer__category-header" }, { children: [_jsx(Icon, { name: categoryInfo[type].icon, size: "md" }), _jsx(Text, __assign({ size: "md", variant: "bold", as: "span" }, { children: categoryInfo[type].label }))] })), groupedTransfers[type].map(function (line) {
187
+ var _a, _b;
188
+ return (_jsx(TransferLine, { id: line.id, type: line.type, paxData: line.paxData, transferDate: line.transferDate, pickupPoint: (_a = line.pickupPoint) === null || _a === void 0 ? void 0 : _a.id, dropoffPoint: (_b = line.dropoffPoint) === null || _b === void 0 ? void 0 : _b.id, locations: locations, onDataChange: function (data) { return handleTransferLineChange(line.id, data); }, onDelete: function () { return handleDeleteTransferLine(line.id); }, showDelete: transferLines.length > 1 }, line.id));
189
+ }), groupIndex < nonEmptyGroups.length - 1 && (_jsx("svg", __assign({ 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)); });
190
+ })() })))] })), _jsxs("div", __assign({ className: "search-bar-transfer__actions" }, { children: [_jsx(Checkbox, { checked: sameVehicle, onChange: setSameVehicle, label: "Use the same vehicle for all your transfers" }), _jsxs("div", __assign({ className: "search-bar-transfer__cta" }, { children: [error && (_jsxs("div", __assign({ className: "search-bar-transfer__error" }, { children: [_jsx("div", { className: "search-bar-transfer__error-bar" }), _jsxs("div", __assign({ className: "search-bar-transfer__error-content" }, { children: [_jsx(Icon, { name: "info", size: "md", className: "search-bar-transfer__error-icon" }), _jsx(Text, __assign({ size: "sm", variant: "bold", className: "search-bar-transfer__error-text" }, { children: error }))] }))] }))), _jsx(Button, __assign({ variant: "primary", size: "lg", onClick: handleSearch }, { children: "Search" }))] }))] }))] })));
191
+ };
192
+ export default SearchBarTransfer;
@@ -0,0 +1,2 @@
1
+ export { default } from './SearchBarTransfer';
2
+ export type { SearchBarTransferProps, SearchBarTransferData, TransferMode } from './SearchBarTransfer';
@@ -0,0 +1 @@
1
+ export { default } from './SearchBarTransfer';
@@ -0,0 +1,53 @@
1
+ import React from "react";
2
+ import { PaxData } from "../PaxSelector/PaxSelector";
3
+ import { LocationOption, LocationGroup, LocationData } from "../../molecules/LocationDropdown/LocationDropdown";
4
+ import "../../../styles/components/organism/transfer-line.css";
5
+ export type TransferType = "arrival" | "departure" | "inter-hotel";
6
+ export type { LocationData };
7
+ export interface TransferLineData {
8
+ id: string;
9
+ type: TransferType;
10
+ paxData?: PaxData;
11
+ transferDate?: string;
12
+ pickupPoint?: LocationData;
13
+ dropoffPoint?: LocationData;
14
+ }
15
+ export interface TransferLineProps {
16
+ /** Unique identifier for this transfer line */
17
+ id: string;
18
+ /** Type of transfer: arrival, departure, or inter-hotel */
19
+ type: TransferType;
20
+ /** Pax data */
21
+ paxData?: PaxData;
22
+ /** Transfer date */
23
+ transferDate?: string;
24
+ /** Selected pickup point ID (for initial value) */
25
+ pickupPoint?: string | number;
26
+ /** Selected dropoff point ID (for initial value) */
27
+ dropoffPoint?: string | number;
28
+ /** All location options - will be filtered based on transfer type */
29
+ locations?: {
30
+ options?: LocationOption[];
31
+ groups?: LocationGroup[];
32
+ };
33
+ /** Callback when pax data changes */
34
+ onPaxChange?: (paxData: PaxData) => void;
35
+ /** Callback when transfer date changes */
36
+ onDateChange?: (date: string) => void;
37
+ /** Callback when pickup point changes */
38
+ onPickupChange?: (location: LocationData | null) => void;
39
+ /** Callback when dropoff point changes */
40
+ onDropoffChange?: (location: LocationData | null) => void;
41
+ /** Callback when any data changes - returns complete TransferLineData */
42
+ onDataChange?: (data: TransferLineData) => void;
43
+ /** Callback when delete button is clicked */
44
+ onDelete?: () => void;
45
+ /** Whether to show the delete button */
46
+ showDelete?: boolean;
47
+ /** Whether to show the title (Arrival, Departure, Inter-Hotel) */
48
+ showTitle?: boolean;
49
+ /** Additional CSS classes */
50
+ className?: string;
51
+ }
52
+ declare const TransferLine: React.FC<TransferLineProps>;
53
+ export default TransferLine;