@qite/tide-booking-component 1.2.5 → 1.3.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 (141) hide show
  1. package/.vs/ProjectSettings.json +3 -3
  2. package/.vs/VSWorkspaceState.json +5 -5
  3. package/README.md +8 -8
  4. package/build/build-cjs/booking-wizard/components/print-offer-button.d.ts +17 -0
  5. package/build/build-cjs/booking-wizard/types.d.ts +7 -0
  6. package/build/build-cjs/booking-wizard/use-offer-printer.d.ts +13 -0
  7. package/build/build-cjs/index.js +223 -72
  8. package/build/build-cjs/shared/utils/localization-util.d.ts +5 -0
  9. package/build/build-cjs/shared/utils/tide-api-utils.d.ts +1 -0
  10. package/build/build-esm/booking-wizard/components/print-offer-button.d.ts +17 -0
  11. package/build/build-esm/booking-wizard/types.d.ts +7 -0
  12. package/build/build-esm/booking-wizard/use-offer-printer.d.ts +13 -0
  13. package/build/build-esm/index.js +224 -73
  14. package/build/build-esm/shared/utils/localization-util.d.ts +5 -0
  15. package/build/build-esm/shared/utils/tide-api-utils.d.ts +1 -0
  16. package/package.json +75 -75
  17. package/rollup.config.js +23 -23
  18. package/src/booking-product/components/age-select.tsx +35 -35
  19. package/src/booking-product/components/amount-input.tsx +78 -78
  20. package/src/booking-product/components/date-range-picker/calendar-day.tsx +58 -58
  21. package/src/booking-product/components/date-range-picker/calendar.tsx +178 -178
  22. package/src/booking-product/components/date-range-picker/index.tsx +196 -196
  23. package/src/booking-product/components/dates.tsx +136 -136
  24. package/src/booking-product/components/footer.tsx +69 -69
  25. package/src/booking-product/components/header.tsx +79 -79
  26. package/src/booking-product/components/icon.tsx +251 -251
  27. package/src/booking-product/components/product.tsx +314 -314
  28. package/src/booking-product/components/rating.tsx +21 -21
  29. package/src/booking-product/components/rooms.tsx +195 -195
  30. package/src/booking-product/index.tsx +30 -30
  31. package/src/booking-product/settings-context.ts +14 -14
  32. package/src/booking-product/types.ts +28 -28
  33. package/src/booking-product/utils/api.ts +25 -25
  34. package/src/booking-product/utils/price.ts +29 -29
  35. package/src/booking-wizard/api-settings-slice.ts +24 -24
  36. package/src/booking-wizard/components/icon.tsx +508 -508
  37. package/src/booking-wizard/components/labeled-input.tsx +64 -64
  38. package/src/booking-wizard/components/labeled-select.tsx +69 -69
  39. package/src/booking-wizard/components/message.tsx +34 -34
  40. package/src/booking-wizard/components/multi-range-filter.tsx +113 -113
  41. package/src/booking-wizard/components/print-offer-button.tsx +66 -0
  42. package/src/booking-wizard/components/product-card.tsx +37 -37
  43. package/src/booking-wizard/components/step-indicator.tsx +51 -51
  44. package/src/booking-wizard/components/step-route.tsx +27 -27
  45. package/src/booking-wizard/declarations.d.ts +4 -4
  46. package/src/booking-wizard/features/booking/api.ts +49 -49
  47. package/src/booking-wizard/features/booking/booking-self-contained.tsx +384 -384
  48. package/src/booking-wizard/features/booking/booking-slice.ts +662 -662
  49. package/src/booking-wizard/features/booking/booking.tsx +356 -356
  50. package/src/booking-wizard/features/booking/constants.ts +16 -16
  51. package/src/booking-wizard/features/booking/selectors.ts +441 -441
  52. package/src/booking-wizard/features/confirmation/confirmation.tsx +97 -97
  53. package/src/booking-wizard/features/error/error.tsx +78 -78
  54. package/src/booking-wizard/features/flight-options/flight-filter.tsx +432 -432
  55. package/src/booking-wizard/features/flight-options/flight-option-flight.tsx +385 -385
  56. package/src/booking-wizard/features/flight-options/flight-option-modal.tsx +229 -229
  57. package/src/booking-wizard/features/flight-options/flight-option.tsx +81 -81
  58. package/src/booking-wizard/features/flight-options/flight-utils.ts +516 -516
  59. package/src/booking-wizard/features/flight-options/index.tsx +196 -196
  60. package/src/booking-wizard/features/price-details/price-details-api.ts +24 -24
  61. package/src/booking-wizard/features/price-details/price-details-slice.ts +178 -178
  62. package/src/booking-wizard/features/price-details/util.ts +155 -155
  63. package/src/booking-wizard/features/product-options/no-options.tsx +21 -21
  64. package/src/booking-wizard/features/product-options/none-option.tsx +120 -120
  65. package/src/booking-wizard/features/product-options/option-booking-airline-group.tsx +64 -64
  66. package/src/booking-wizard/features/product-options/option-booking-group.tsx +216 -216
  67. package/src/booking-wizard/features/product-options/option-item.tsx +317 -317
  68. package/src/booking-wizard/features/product-options/option-pax-card.tsx +201 -201
  69. package/src/booking-wizard/features/product-options/option-pax-group.tsx +175 -175
  70. package/src/booking-wizard/features/product-options/option-room.tsx +321 -321
  71. package/src/booking-wizard/features/product-options/option-unit-group.tsx +198 -198
  72. package/src/booking-wizard/features/product-options/option-units-card.tsx +185 -185
  73. package/src/booking-wizard/features/product-options/options-form.tsx +563 -459
  74. package/src/booking-wizard/features/room-options/index.tsx +187 -187
  75. package/src/booking-wizard/features/room-options/room-utils.ts +190 -190
  76. package/src/booking-wizard/features/room-options/room.tsx +160 -160
  77. package/src/booking-wizard/features/room-options/traveler-rooms.tsx +75 -75
  78. package/src/booking-wizard/features/sidebar/index.tsx +76 -76
  79. package/src/booking-wizard/features/sidebar/sidebar-flight.tsx +68 -68
  80. package/src/booking-wizard/features/sidebar/sidebar-util.ts +177 -177
  81. package/src/booking-wizard/features/sidebar/sidebar.tsx +364 -364
  82. package/src/booking-wizard/features/summary/summary-booking-option-pax.tsx +25 -25
  83. package/src/booking-wizard/features/summary/summary-booking-option-unit.tsx +25 -25
  84. package/src/booking-wizard/features/summary/summary-flight.tsx +39 -39
  85. package/src/booking-wizard/features/summary/summary-per-booking-option-group.tsx +69 -69
  86. package/src/booking-wizard/features/summary/summary-per-pax-option-group.tsx +63 -63
  87. package/src/booking-wizard/features/summary/summary-per-unit-option-group.tsx +66 -66
  88. package/src/booking-wizard/features/summary/summary-slice.ts +28 -28
  89. package/src/booking-wizard/features/summary/summary.tsx +674 -674
  90. package/src/booking-wizard/features/travelers-form/travelers-form-slice.ts +164 -164
  91. package/src/booking-wizard/features/travelers-form/travelers-form.tsx +754 -754
  92. package/src/booking-wizard/features/travelers-form/type-ahead-input.tsx +101 -101
  93. package/src/booking-wizard/features/travelers-form/validate-form.ts +245 -245
  94. package/src/booking-wizard/index.tsx +36 -36
  95. package/src/booking-wizard/settings-context.ts +67 -60
  96. package/src/booking-wizard/store.ts +31 -31
  97. package/src/booking-wizard/types.ts +283 -276
  98. package/src/booking-wizard/use-offer-printer.ts +136 -0
  99. package/src/index.ts +4 -4
  100. package/src/shared/components/loader.tsx +16 -16
  101. package/src/shared/translations/en-GB.json +237 -232
  102. package/src/shared/translations/fr-BE.json +238 -233
  103. package/src/shared/translations/nl-BE.json +237 -232
  104. package/src/shared/types.ts +4 -4
  105. package/src/shared/utils/class-util.ts +9 -9
  106. package/src/shared/utils/localization-util.ts +62 -62
  107. package/src/shared/utils/query-string-util.ts +119 -119
  108. package/src/shared/utils/tide-api-utils.ts +36 -36
  109. package/styles/booking-product-variables.scss +394 -394
  110. package/styles/booking-product.scss +446 -446
  111. package/styles/booking-wizard-variables.scss +873 -871
  112. package/styles/booking-wizard.scss +59 -59
  113. package/styles/components/_animations.scss +39 -39
  114. package/styles/components/_base.scss +107 -107
  115. package/styles/components/_booking.scss +879 -879
  116. package/styles/components/_button.scss +238 -238
  117. package/styles/components/_checkbox.scss +219 -219
  118. package/styles/components/_cta.scss +208 -208
  119. package/styles/components/_date-list.scss +41 -41
  120. package/styles/components/_date-range-picker.scss +225 -225
  121. package/styles/components/_decrement-increment.scss +35 -35
  122. package/styles/components/_dropdown.scss +72 -72
  123. package/styles/components/_flight-option.scss +1429 -1429
  124. package/styles/components/_form.scss +1583 -1583
  125. package/styles/components/_info-message.scss +71 -71
  126. package/styles/components/_input.scss +25 -25
  127. package/styles/components/_list.scss +187 -187
  128. package/styles/components/_loader.scss +72 -72
  129. package/styles/components/_mixins.scss +550 -550
  130. package/styles/components/_placeholders.scss +166 -166
  131. package/styles/components/_pricing-summary.scss +155 -155
  132. package/styles/components/_qsm.scss +17 -17
  133. package/styles/components/_radiobutton.scss +170 -170
  134. package/styles/components/_select-wrapper.scss +80 -80
  135. package/styles/components/_spinner.scss +29 -29
  136. package/styles/components/_step-indicators.scss +168 -168
  137. package/styles/components/_table.scss +81 -81
  138. package/styles/components/_tree.scss +530 -530
  139. package/styles/components/_typeahead.scss +281 -281
  140. package/styles/components/_variables.scss +89 -89
  141. package/tsconfig.json +24 -24
@@ -1,3 +1,3 @@
1
- {
2
- "CurrentProjectSetting": null
3
- }
1
+ {
2
+ "CurrentProjectSetting": null
3
+ }
@@ -1,5 +1,5 @@
1
- {
2
- "ExpandedNodes": [""],
3
- "SelectedNode": "\\D:\\2.0. Qite\\Tide-Booking-Component\\tide-booking-component",
4
- "PreviewInSolutionExplorer": false
5
- }
1
+ {
2
+ "ExpandedNodes": [""],
3
+ "SelectedNode": "\\D:\\2.0. Qite\\Tide-Booking-Component\\tide-booking-component",
4
+ "PreviewInSolutionExplorer": false
5
+ }
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # README
2
-
3
- This is the unified Tide Booking Component.
4
-
5
- ## Remarks
6
-
7
- Do not forget to sync React versions when you're doing local changes and when you try to test them in a local React project (check https://reactjs.org/warnings/invalid-hook-call-warning.html#duplicate-react).
8
- If using the playground, after installing it's node modules execute the following command in the root folder `npm link ./playground/node_modules/react`
1
+ # README
2
+
3
+ This is the unified Tide Booking Component.
4
+
5
+ ## Remarks
6
+
7
+ Do not forget to sync React versions when you're doing local changes and when you try to test them in a local React project (check https://reactjs.org/warnings/invalid-hook-call-warning.html#duplicate-react).
8
+ If using the playground, after installing it's node modules execute the following command in the root folder `npm link ./playground/node_modules/react`
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ import { BookingPackage, Pax } from "@qite/tide-client/build/types";
3
+ interface PrintOfferButtonProps {
4
+ bookingPackage?: BookingPackage;
5
+ getPax: () => Pax[] | undefined;
6
+ tagIds?: number[];
7
+ printActionId?: number | null;
8
+ onPrinted?: (pdfUrl: string) => void;
9
+ labelIdle?: string;
10
+ labelCreating?: string;
11
+ labelPrinting?: string;
12
+ disabled?: boolean;
13
+ className?: string;
14
+ loader?: React.ReactNode;
15
+ }
16
+ declare const PrintOfferButton: React.FC<PrintOfferButtonProps>;
17
+ export default PrintOfferButton;
@@ -2,29 +2,36 @@
2
2
  import { BookingPackageFlight } from "@qite/tide-client/build/types";
3
3
  export interface Settings {
4
4
  officeId: number;
5
+ token?: string;
5
6
  bookingOptions: BookingOptions;
6
7
  productPath: string;
7
8
  basePath: string;
8
9
  roomOptions: {
9
10
  isHidden?: boolean | null;
10
11
  pathSuffix?: string | null;
12
+ reportPrintActionId?: number | null;
11
13
  };
12
14
  flightOptions: {
13
15
  isHidden?: boolean | null;
14
16
  pathSuffix?: string | null;
17
+ reportPrintActionId?: number | null;
15
18
  };
16
19
  options: {
17
20
  pathSuffix: string;
21
+ reportPrintActionId?: number | null;
18
22
  };
19
23
  travellers: {
20
24
  pathSuffix: string;
25
+ reportPrintActionId?: number | null;
21
26
  };
22
27
  summary: {
23
28
  pathSuffix: string;
24
29
  checkboxes?: SummaryCheckbox[] | null;
30
+ reportPrintActionId?: number | null;
25
31
  };
26
32
  confirmation: {
27
33
  pathSuffix: string;
34
+ reportPrintActionId?: number | null;
28
35
  };
29
36
  error: {
30
37
  pathSuffix: string;
@@ -0,0 +1,13 @@
1
+ import type { BookingPackage, Pax } from "@qite/tide-client/build/types";
2
+ export interface UseOfferPrinterArgs {
3
+ bookingPackage?: BookingPackage;
4
+ getPax: () => Pax[] | undefined;
5
+ tagIds?: number[];
6
+ printActionId?: number | null;
7
+ onPrinted?: (pdfUrl: string) => void;
8
+ }
9
+ export declare function useOfferPrinter({ bookingPackage, getPax, tagIds, printActionId, onPrinted, }: UseOfferPrinterArgs): {
10
+ handlePrint: () => Promise<void>;
11
+ loading: boolean;
12
+ stage: "idle" | "creating" | "printing";
13
+ };
@@ -332,6 +332,11 @@ var ERROR$2 = {
332
332
  ERROR_TEXT3: ".",
333
333
  ERROR_ALT: "Contactez-nous"
334
334
  };
335
+ var PRINT_OFFER_BUTTON$2 = {
336
+ LABEL_IDLE: "Imprimer le devis",
337
+ LABEL_CREATING: "Génération du devis…",
338
+ LABEL_PRINTING: "Génération du PDF…"
339
+ };
335
340
  var frJson = {
336
341
  STEPS: STEPS$2,
337
342
  INPUT: INPUT$2,
@@ -345,7 +350,8 @@ var frJson = {
345
350
  ROOM_OPTIONS_FORM: ROOM_OPTIONS_FORM$2,
346
351
  SUMMARY: SUMMARY$2,
347
352
  CONFIRMATION: CONFIRMATION$2,
348
- ERROR: ERROR$2
353
+ ERROR: ERROR$2,
354
+ PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$2
349
355
  };
350
356
 
351
357
  var STEPS$1 = {
@@ -578,6 +584,11 @@ var ERROR$1 = {
578
584
  ERROR_TEXT3: ".",
579
585
  ERROR_ALT: "Contacteer ons"
580
586
  };
587
+ var PRINT_OFFER_BUTTON$1 = {
588
+ LABEL_IDLE: "Print offerte",
589
+ LABEL_CREATING: "Offerte genereren...",
590
+ LABEL_PRINTING: "PDF genereren..."
591
+ };
581
592
  var nlJson = {
582
593
  STEPS: STEPS$1,
583
594
  INPUT: INPUT$1,
@@ -591,7 +602,8 @@ var nlJson = {
591
602
  ROOM_OPTIONS_FORM: ROOM_OPTIONS_FORM$1,
592
603
  SUMMARY: SUMMARY$1,
593
604
  CONFIRMATION: CONFIRMATION$1,
594
- ERROR: ERROR$1
605
+ ERROR: ERROR$1,
606
+ PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON$1
595
607
  };
596
608
 
597
609
  var STEPS = {
@@ -824,6 +836,11 @@ var ERROR = {
824
836
  ERROR_TEXT3: ".",
825
837
  ERROR_ALT: "Contact us"
826
838
  };
839
+ var PRINT_OFFER_BUTTON = {
840
+ LABEL_IDLE: "Print offer",
841
+ LABEL_CREATING: "Generating offer…",
842
+ LABEL_PRINTING: "Generating PDF…"
843
+ };
827
844
  var enJson = {
828
845
  STEPS: STEPS,
829
846
  INPUT: INPUT,
@@ -837,7 +854,8 @@ var enJson = {
837
854
  ROOM_OPTIONS_FORM: ROOM_OPTIONS_FORM,
838
855
  SUMMARY: SUMMARY,
839
856
  CONFIRMATION: CONFIRMATION,
840
- ERROR: ERROR
857
+ ERROR: ERROR,
858
+ PRINT_OFFER_BUTTON: PRINT_OFFER_BUTTON
841
859
  };
842
860
 
843
861
  var formatPrice = function (price, locale) {
@@ -7047,9 +7065,6 @@ var post = function (
7047
7065
  return [4 /*yield*/, response.text()];
7048
7066
  case 2:
7049
7067
  responseBody = _a.sent();
7050
- if (!responseBody) {
7051
- return [2 /*return*/, null];
7052
- }
7053
7068
  result = skipReviver
7054
7069
  ? JSON.parse(responseBody)
7055
7070
  : JSON.parse(responseBody, reviver);
@@ -7081,9 +7096,6 @@ var patch = function (
7081
7096
  return [4 /*yield*/, response.text()];
7082
7097
  case 2:
7083
7098
  responseBody = _a.sent();
7084
- if (!responseBody) {
7085
- return [2 /*return*/, {}];
7086
- }
7087
7099
  result = skipReviver
7088
7100
  ? JSON.parse(responseBody)
7089
7101
  : JSON.parse(responseBody, reviver);
@@ -7341,7 +7353,6 @@ var getMolliePayment = function (config, request, signal) {
7341
7353
 
7342
7354
  var ENDPOINT$4 = "/api/web/search";
7343
7355
  var ENDPOINT_COUNTRIES = ENDPOINT$4 + "/countries";
7344
- var ENDPOINT_AIRPORTS = ENDPOINT$4 + "/airports";
7345
7356
  /**
7346
7357
  * api/search/countries
7347
7358
  * Gets all Countries
@@ -7354,11 +7365,6 @@ var getCountries = function (config, signal) {
7354
7365
  var apiKey = config.apiKey;
7355
7366
  return get(url, apiKey, config.token, signal, true);
7356
7367
  };
7357
- var getAirports = function (config, signal) {
7358
- var url = "" + config.host + ENDPOINT_AIRPORTS;
7359
- var apiKey = config.apiKey;
7360
- return get(url, apiKey, config.token, signal, true);
7361
- };
7362
7368
 
7363
7369
  var createParams = function (filter, all, gridColumns, mode, forceToLower) {
7364
7370
  var params = {};
@@ -7602,7 +7608,6 @@ var changeEntryAgentSurcharge = function (config, request, signal) {
7602
7608
 
7603
7609
  var ENDPOINT$2 = "/api/web";
7604
7610
  var ENDPOINT_CREATE_CRM_CONTACT = ENDPOINT$2 + "/crmcontact";
7605
- var ENDPOINT_CONTACT_FORM$1 = ENDPOINT$2 + "/contactform";
7606
7611
  var ENDPOINT_CREATE_AFFILIATES = ENDPOINT$2 + "/affiliates";
7607
7612
  var ENDPOINT_TRANSLATION_DICTIONARY = ENDPOINT$2 + "/translation-dictionary";
7608
7613
  var ENDPOINT_BOOKING_ACCOMMODATION = ENDPOINT$2 + "/booking-accommodation";
@@ -7620,20 +7625,6 @@ var createCrmContact = function (config, request, signal) {
7620
7625
  var body = JSON.stringify(request);
7621
7626
  return post(url, apiKey, body, config.token, signal);
7622
7627
  };
7623
- /**
7624
- * api/web/contactform
7625
- * Sends a contact request mail
7626
- * @param config
7627
- * @param request
7628
- * @param signal
7629
- * @returns OK if succeeded.
7630
- */
7631
- var ContactForm = function (config, request, signal) {
7632
- var url = "" + config.host + ENDPOINT_CONTACT_FORM$1;
7633
- var apiKey = config.apiKey;
7634
- var body = JSON.stringify(request);
7635
- return post(url, apiKey, body, config.token, signal, true);
7636
- };
7637
7628
  /**
7638
7629
  * api/web/affiliates
7639
7630
  * Gets all Affiliates
@@ -7715,7 +7706,6 @@ var feedXmlFolder = function (config, slug, folder, signal) {
7715
7706
 
7716
7707
  build.AllotmentType = AllotmentType;
7717
7708
  build.AvailabilitySearchType = AvailabilitySearchType;
7718
- build.ContactForm = ContactForm;
7719
7709
  var Gender_1 = build.Gender = Gender;
7720
7710
  build.MetaDataType = MetaDataType;
7721
7711
  build.RequirementType = RequirementType;
@@ -7739,7 +7729,6 @@ build.feedXmlFolder = feedXmlFolder;
7739
7729
  build.forgotPassword = forgotPassword;
7740
7730
  var generateBookingAccommodations_1 = build.generateBookingAccommodations = generateBookingAccommodations;
7741
7731
  build.getAffiliates = getAffiliates;
7742
- build.getAirports = getAirports;
7743
7732
  build.getAllotmentAvailability = getAllotmentAvailability;
7744
7733
  build.getCountries = getCountries;
7745
7734
  build.getCustomEntryStatus = getCustomEntryStatus;
@@ -7754,7 +7743,7 @@ build.login = login;
7754
7743
  build.logout = logout;
7755
7744
  var priceDetails_1 = build.priceDetails = priceDetails;
7756
7745
  build.prices = prices;
7757
- build.print = print;
7746
+ var print_1 = build.print = print;
7758
7747
  build.resetPassword = resetPassword;
7759
7748
  build.search = search;
7760
7749
  build.searchFlightPool = searchFlightPool;
@@ -10803,6 +10792,7 @@ var bookingReducer = bookingSlice.reducer;
10803
10792
 
10804
10793
  var SettingsContext = React__default["default"].createContext({
10805
10794
  language: "nl-BE",
10795
+ token: "",
10806
10796
  generatePaymentUrl: false,
10807
10797
  currency: "EUR",
10808
10798
  officeId: 1,
@@ -10814,22 +10804,28 @@ var SettingsContext = React__default["default"].createContext({
10814
10804
  basePath: "/boeken",
10815
10805
  roomOptions: {
10816
10806
  pathSuffix: "/",
10807
+ reportPrintActionId: null,
10817
10808
  },
10818
10809
  flightOptions: {
10819
10810
  pathSuffix: "/vluchten",
10811
+ reportPrintActionId: null,
10820
10812
  },
10821
10813
  options: {
10822
10814
  pathSuffix: "/opties",
10815
+ reportPrintActionId: null,
10823
10816
  },
10824
10817
  travellers: {
10825
10818
  pathSuffix: "/reizigers",
10819
+ reportPrintActionId: null,
10826
10820
  },
10827
10821
  summary: {
10828
10822
  pathSuffix: "/samenvatting",
10829
10823
  checkboxes: null,
10824
+ reportPrintActionId: null,
10830
10825
  },
10831
10826
  confirmation: {
10832
10827
  pathSuffix: "/bevestiging",
10828
+ reportPrintActionId: null,
10833
10829
  },
10834
10830
  error: {
10835
10831
  pathSuffix: "/mislukt",
@@ -13152,9 +13148,135 @@ var OptionRoom = function (_a) {
13152
13148
  ]) }))))))))))));
13153
13149
  };
13154
13150
 
13151
+ function useOfferPrinter(_a) {
13152
+ var _this = this;
13153
+ var bookingPackage = _a.bookingPackage, getPax = _a.getPax, _b = _a.tagIds, tagIds = _b === void 0 ? [] : _b, _c = _a.printActionId, printActionId = _c === void 0 ? null : _c, onPrinted = _a.onPrinted;
13154
+ var settings = React.useContext(SettingsContext);
13155
+ if (!settings)
13156
+ throw new Error("useOfferPrinter must be used inside <BookingWizard>");
13157
+ var language = settings.language, officeId = settings.officeId;
13158
+ var agentId = settings.agentAdressId;
13159
+ if (typeof agentId !== "number" || agentId <= 0) {
13160
+ throw new Error("Missing agentAdressId in wizard settings");
13161
+ }
13162
+ var _d = React.useState("idle"), stage = _d[0], setStage = _d[1];
13163
+ var loading = stage !== "idle";
13164
+ var createOffer = React.useCallback(function () { return __awaiter$1(_this, void 0, void 0, function () {
13165
+ var paxRaw, pax, request, cfg;
13166
+ return __generator$1(this, function (_a) {
13167
+ paxRaw = getPax();
13168
+ if (!bookingPackage || !(paxRaw === null || paxRaw === void 0 ? void 0 : paxRaw.length)) {
13169
+ throw new Error("Missing booking package or pax");
13170
+ }
13171
+ pax = paxRaw;
13172
+ request = {
13173
+ officeId: officeId,
13174
+ agentId: agentId,
13175
+ payload: {
13176
+ package: bookingPackage,
13177
+ status: 0,
13178
+ pax: pax,
13179
+ nonTravelPax: [],
13180
+ notifications: [],
13181
+ tagIds: tagIds,
13182
+ customerRequests: [],
13183
+ },
13184
+ };
13185
+ cfg = buildTideClientConfig();
13186
+ return [2 /*return*/, book_1(cfg, request, undefined, language)];
13187
+ });
13188
+ }); }, [
13189
+ agentId,
13190
+ bookingPackage,
13191
+ getPax,
13192
+ language,
13193
+ officeId,
13194
+ tagIds,
13195
+ ]);
13196
+ var languageData = [
13197
+ { code: "nl-BE", tideId: 1 },
13198
+ { code: "fr-BE", tideId: 2 },
13199
+ { code: "en-GB", tideId: 3 },
13200
+ ];
13201
+ function getTideLanguageId(code) {
13202
+ var _a;
13203
+ return (((_a = languageData.find(function (l) { return l.code === code; })) === null || _a === void 0 ? void 0 : _a.tideId) || 1);
13204
+ }
13205
+ var printOffer = React.useCallback(function (offer) { return __awaiter$1(_this, void 0, void 0, function () {
13206
+ var cfg, req, res, buf, url;
13207
+ var _a;
13208
+ return __generator$1(this, function (_b) {
13209
+ switch (_b.label) {
13210
+ case 0:
13211
+ cfg = buildTideClientConfig();
13212
+ req = {
13213
+ id: printActionId !== null && printActionId !== void 0 ? printActionId : 0,
13214
+ dossierNumber: (_a = offer.dossierNumber) !== null && _a !== void 0 ? _a : offer.number,
13215
+ languageId: getTideLanguageId(language),
13216
+ };
13217
+ return [4 /*yield*/, print_1(cfg, req)];
13218
+ case 1:
13219
+ res = _b.sent();
13220
+ return [4 /*yield*/, res.arrayBuffer()];
13221
+ case 2:
13222
+ buf = _b.sent();
13223
+ url = URL.createObjectURL(new Blob([buf], { type: "application/pdf" }));
13224
+ onPrinted === null || onPrinted === void 0 ? void 0 : onPrinted(url);
13225
+ window.open(url);
13226
+ return [2 /*return*/];
13227
+ }
13228
+ });
13229
+ }); }, [language, onPrinted]);
13230
+ var handlePrint = React.useCallback(function () { return __awaiter$1(_this, void 0, void 0, function () {
13231
+ var offer, err_1;
13232
+ return __generator$1(this, function (_a) {
13233
+ switch (_a.label) {
13234
+ case 0:
13235
+ _a.trys.push([0, 3, 4, 5]);
13236
+ setStage("creating");
13237
+ return [4 /*yield*/, createOffer()];
13238
+ case 1:
13239
+ offer = _a.sent();
13240
+ setStage("printing");
13241
+ return [4 /*yield*/, printOffer(offer)];
13242
+ case 2:
13243
+ _a.sent();
13244
+ return [3 /*break*/, 5];
13245
+ case 3:
13246
+ err_1 = _a.sent();
13247
+ console.error("Offer print failed:", err_1);
13248
+ throw err_1;
13249
+ case 4:
13250
+ setStage("idle");
13251
+ return [7 /*endfinally*/];
13252
+ case 5: return [2 /*return*/];
13253
+ }
13254
+ });
13255
+ }); }, [createOffer, printOffer]);
13256
+ return { handlePrint: handlePrint, loading: loading, stage: stage };
13257
+ }
13258
+
13259
+ var PrintOfferButton = function (_a) {
13260
+ var bookingPackage = _a.bookingPackage, getPax = _a.getPax, tagIds = _a.tagIds, _b = _a.printActionId, printActionId = _b === void 0 ? null : _b, onPrinted = _a.onPrinted, _c = _a.labelIdle, labelIdle = _c === void 0 ? "Print offer" : _c, _d = _a.labelCreating, labelCreating = _d === void 0 ? "Generating offer…" : _d, _e = _a.labelPrinting, labelPrinting = _e === void 0 ? "Generating PDF…" : _e, _f = _a.disabled, disabled = _f === void 0 ? false : _f, className = _a.className;
13261
+ var _g = useOfferPrinter({
13262
+ bookingPackage: bookingPackage,
13263
+ getPax: getPax,
13264
+ tagIds: tagIds,
13265
+ onPrinted: onPrinted,
13266
+ printActionId: printActionId,
13267
+ }), handlePrint = _g.handlePrint, stage = _g.stage, loading = _g.loading;
13268
+ var label = stage === "creating"
13269
+ ? labelCreating
13270
+ : stage === "printing"
13271
+ ? labelPrinting
13272
+ : labelIdle;
13273
+ return (React__default["default"].createElement("button", { type: 'button', onClick: handlePrint, disabled: disabled || loading, className: className }, label));
13274
+ };
13275
+
13155
13276
  var OptionsForm = function () {
13156
13277
  var _a;
13157
13278
  var settings = React.useContext(SettingsContext);
13279
+ var token = settings.token;
13158
13280
  var translations = reactRedux.useSelector(selectTranslations);
13159
13281
  var dispatch = useAppDispatch();
13160
13282
  var packageDetails = reactRedux.useSelector(selectPackageDetails);
@@ -13178,7 +13300,9 @@ var OptionsForm = function () {
13178
13300
  var bookingPackagePax = pax.filter(function (x) {
13179
13301
  return room === null || room === void 0 ? void 0 : room.pax.some(function (y) { return y.id == x.id; });
13180
13302
  });
13181
- return bookingPackagePax.length > 0 ? bookingPackagePax : (_a = room === null || room === void 0 ? void 0 : room.pax) !== null && _a !== void 0 ? _a : [];
13303
+ return bookingPackagePax.length > 0
13304
+ ? bookingPackagePax
13305
+ : (_a = room === null || room === void 0 ? void 0 : room.pax) !== null && _a !== void 0 ? _a : [];
13182
13306
  };
13183
13307
  var handleOnRoomChange = function (index, accommodationCode, regimeCode) {
13184
13308
  if (!packageRooms)
@@ -13187,8 +13311,17 @@ var OptionsForm = function () {
13187
13311
  dispatch(setPackageRooms(updatedPackageRooms));
13188
13312
  dispatch(fetchPriceDetails());
13189
13313
  };
13314
+ var getPax = function () {
13315
+ var _a;
13316
+ if (!packageDetails)
13317
+ return undefined;
13318
+ var selectedOption = (_a = packageDetails.options.find(function (o) { return o.isSelected; })) !== null && _a !== void 0 ? _a : packageDetails.options[0];
13319
+ return selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.requestRooms.flatMap(function (r) { return r.pax; });
13320
+ };
13190
13321
  // TAGS
13191
- var packageTags = settings.hideTags ? [] : reactRedux.useSelector(selectPackageTags);
13322
+ var packageTags = settings.hideTags
13323
+ ? []
13324
+ : reactRedux.useSelector(selectPackageTags);
13192
13325
  var tagIds = (_a = reactRedux.useSelector(selectTagIds)) !== null && _a !== void 0 ? _a : [];
13193
13326
  var handleSubmit = function (e) {
13194
13327
  if (settings.skipRouter) {
@@ -13260,11 +13393,13 @@ var OptionsForm = function () {
13260
13393
  var desiredReturnFlight_1 = packageDetails.returnFlights.find(function (x) { return x.entryLineGuid == returnFlight_1; });
13261
13394
  if (desiredOutwardFlight_1 && desiredReturnFlight_1) {
13262
13395
  dispatch(setPackage(__assign(__assign({}, packageDetails), { outwardFlights: packageDetails.outwardFlights.map(function (flight) {
13263
- return __assign(__assign({}, flight), { isSelected: flight.entryLineGuid == desiredOutwardFlight_1.entryLineGuid
13396
+ return __assign(__assign({}, flight), { isSelected: flight.entryLineGuid ==
13397
+ desiredOutwardFlight_1.entryLineGuid
13264
13398
  ? true
13265
13399
  : false });
13266
13400
  }), returnFlights: packageDetails.returnFlights.map(function (flight) {
13267
- return __assign(__assign({}, flight), { isSelected: flight.entryLineGuid == desiredReturnFlight_1.entryLineGuid
13401
+ return __assign(__assign({}, flight), { isSelected: flight.entryLineGuid ==
13402
+ desiredReturnFlight_1.entryLineGuid
13268
13403
  ? true
13269
13404
  : false });
13270
13405
  }) })));
@@ -13284,57 +13419,73 @@ var OptionsForm = function () {
13284
13419
  var previousUrl = settings.roomOptions.isHidden
13285
13420
  ? "".concat(settings.basePath).concat(settings.flightOptions.pathSuffix, "?").concat(bookingQueryString)
13286
13421
  : "".concat(settings.basePath).concat(settings.roomOptions.pathSuffix, "?").concat(bookingQueryString);
13287
- var hasPrevious = !settings.roomOptions.isHidden || !settings.flightOptions.isHidden;
13288
- var showPackageTagsOrRoomoptions = showRoomOptions || (packageTags && !lodash.isEmpty(packageTags));
13422
+ var hasPrevious = !settings.roomOptions.isHidden ||
13423
+ !settings.flightOptions.isHidden;
13424
+ var showPackageTagsOrRoomoptions = showRoomOptions ||
13425
+ (packageTags && !lodash.isEmpty(packageTags));
13289
13426
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
13290
- React__default["default"].createElement("form", { className: "form", name: "booking--options", id: "booking--options", noValidate: true, onSubmit: handleSubmit },
13427
+ React__default["default"].createElement("form", { className: 'form', name: 'booking--options', id: 'booking--options', noValidate: true, onSubmit: handleSubmit },
13291
13428
  isLoading && settings.loaderComponent,
13292
- !isLoading && (React__default["default"].createElement("div", { className: "form__region" },
13293
- showPackageTagsOrRoomoptions && (React__default["default"].createElement("div", { className: "form__group" },
13294
- React__default["default"].createElement("div", { className: "booking-card" },
13295
- React__default["default"].createElement("div", { className: "booking-card__body" },
13429
+ !isLoading && (React__default["default"].createElement("div", { className: 'form__region' },
13430
+ showPackageTagsOrRoomoptions && (React__default["default"].createElement("div", { className: 'form__group' },
13431
+ React__default["default"].createElement("div", { className: 'booking-card' },
13432
+ React__default["default"].createElement("div", { className: 'booking-card__body' },
13296
13433
  React__default["default"].createElement("div", { className: buildClassName([
13297
13434
  "booking-card__group",
13298
13435
  "booking-card__group--package",
13299
13436
  ]) },
13300
- showRoomOptions && (React__default["default"].createElement("span", { className: "booking-card__tag" }, translations.OPTIONS_FORM.PACKAGE)),
13301
- React__default["default"].createElement("div", { className: "booking-card__group-body" },
13302
- showRoomOptions && (React__default["default"].createElement("table", { className: "table table--striped" },
13437
+ showRoomOptions && (React__default["default"].createElement("span", { className: 'booking-card__tag' }, translations.OPTIONS_FORM
13438
+ .PACKAGE)),
13439
+ React__default["default"].createElement("div", { className: 'booking-card__group-body' },
13440
+ showRoomOptions && (React__default["default"].createElement("table", { className: 'table table--striped' },
13303
13441
  React__default["default"].createElement("tbody", null, packageRooms &&
13304
13442
  packageRooms.map(function (room) { return (React__default["default"].createElement(OptionRoom, { key: room.index, packageRoom: room, pax: getRoomPax(room.index), optionPax: optionPax, onRoomChange: handleOnRoomChange })); })))),
13305
- packageTags && !lodash.isEmpty(packageTags) && (React__default["default"].createElement("div", { className: "booking-card__tag-translations" }, packageTags.map(function (tag, index) { return (React__default["default"].createElement("label", { key: index, htmlFor: "tag-translation-".concat(index, "-").concat(tag.title), className: "checkbox__label tag-translation" },
13306
- React__default["default"].createElement("div", { className: "tag-translation-input__container" },
13307
- React__default["default"].createElement("input", { type: "checkbox", id: "tag-translation-".concat(index, "-").concat(tag.title), name: "tag-translation-".concat(index, "-").concat(tag.title), className: "checkbox__input", checked: tagIds === null || tagIds === void 0 ? void 0 : tagIds.includes(tag.id), onChange: function (e) {
13443
+ packageTags &&
13444
+ !lodash.isEmpty(packageTags) && (React__default["default"].createElement("div", { className: 'booking-card__tag-translations' }, packageTags.map(function (tag, index) { return (React__default["default"].createElement("label", { key: index, htmlFor: "tag-translation-".concat(index, "-").concat(tag.title), className: 'checkbox__label tag-translation' },
13445
+ React__default["default"].createElement("div", { className: 'tag-translation-input__container' },
13446
+ React__default["default"].createElement("input", { type: 'checkbox', id: "tag-translation-".concat(index, "-").concat(tag.title), name: "tag-translation-".concat(index, "-").concat(tag.title), className: 'checkbox__input', checked: tagIds === null || tagIds === void 0 ? void 0 : tagIds.includes(tag.id), onChange: function (e) {
13308
13447
  return handleOnTagChange(tag.id, e.target.checked);
13309
13448
  } })),
13310
- React__default["default"].createElement("span", { className: "tag-translation__title" }, tag.title),
13449
+ React__default["default"].createElement("span", { className: 'tag-translation__title' }, tag.title),
13311
13450
  "\u00A0",
13312
- React__default["default"].createElement("span", { className: "tag-translation__description" }, tag.description))); }))))))))),
13313
- optionUnits && !lodash.isEmpty(optionUnits) && (React__default["default"].createElement("div", { className: "form__group" },
13314
- React__default["default"].createElement("div", { className: "booking-card" },
13315
- React__default["default"].createElement("div", { className: "booking-card__header" },
13316
- React__default["default"].createElement("h2", { className: "booking-card__header-heading" }, translations.OPTIONS_FORM.PER_UNIT_TITLE)),
13317
- React__default["default"].createElement("div", { className: "booking-card__body" },
13451
+ React__default["default"].createElement("span", { className: 'tag-translation__description' }, tag.description))); }))))))))),
13452
+ optionUnits && !lodash.isEmpty(optionUnits) && (React__default["default"].createElement("div", { className: 'form__group' },
13453
+ React__default["default"].createElement("div", { className: 'booking-card' },
13454
+ React__default["default"].createElement("div", { className: 'booking-card__header' },
13455
+ React__default["default"].createElement("h2", { className: 'booking-card__header-heading' }, translations.OPTIONS_FORM
13456
+ .PER_UNIT_TITLE)),
13457
+ React__default["default"].createElement("div", { className: 'booking-card__body' },
13318
13458
  React__default["default"].createElement(OptionUnitsCard, { units: optionUnits, onUnitsChange: handleOnUnitsChange }))))),
13319
- optionPax && !lodash.isEmpty(optionPax) && (React__default["default"].createElement("div", { className: "form__group" },
13320
- React__default["default"].createElement("div", { className: "booking-card" },
13321
- React__default["default"].createElement("div", { className: "booking-card__header" },
13322
- React__default["default"].createElement("h2", { className: "booking-card__header-heading" }, translations.OPTIONS_FORM.PER_PAX_TITLE)),
13323
- React__default["default"].createElement("div", { className: "booking-card__body" },
13459
+ optionPax && !lodash.isEmpty(optionPax) && (React__default["default"].createElement("div", { className: 'form__group' },
13460
+ React__default["default"].createElement("div", { className: 'booking-card' },
13461
+ React__default["default"].createElement("div", { className: 'booking-card__header' },
13462
+ React__default["default"].createElement("h2", { className: 'booking-card__header-heading' }, translations.OPTIONS_FORM
13463
+ .PER_PAX_TITLE)),
13464
+ React__default["default"].createElement("div", { className: 'booking-card__body' },
13324
13465
  React__default["default"].createElement(OptionPaxCard, { pax: optionPax, onPaxChange: handleOnPaxChange, requestRoomsPax: requestRoomsPax }))))),
13325
- groups && !lodash.isEmpty(groups) && (React__default["default"].createElement("div", { className: "form__group" },
13326
- React__default["default"].createElement("div", { className: "booking-card" },
13327
- React__default["default"].createElement("div", { className: "booking-card__header" },
13328
- React__default["default"].createElement("h2", { className: "booking-card__header-heading" }, translations.OPTIONS_FORM.PER_BOOKING_TITLE)),
13329
- React__default["default"].createElement("div", { className: "booking-card__body" },
13330
- React__default["default"].createElement("div", { className: "booking-card__group booking-card__group--active" },
13466
+ groups && !lodash.isEmpty(groups) && (React__default["default"].createElement("div", { className: 'form__group' },
13467
+ React__default["default"].createElement("div", { className: 'booking-card' },
13468
+ React__default["default"].createElement("div", { className: 'booking-card__header' },
13469
+ React__default["default"].createElement("h2", { className: 'booking-card__header-heading' }, translations.OPTIONS_FORM
13470
+ .PER_BOOKING_TITLE)),
13471
+ React__default["default"].createElement("div", { className: 'booking-card__body' },
13472
+ React__default["default"].createElement("div", { className: 'booking-card__group booking-card__group--active' },
13331
13473
  groups.map(function (group, i) { return (React__default["default"].createElement(OptionBookingGroup, { key: "".concat(group.name, "_").concat(i), group: group, firstClassName: "booking-card__group-body", secondClassName: "booking-card__group-heading", parentId: "booking_".concat(group.name), onGroupChange: handleOnGroupChange })); }), airlineGroups === null || airlineGroups === void 0 ? void 0 :
13332
13474
  airlineGroups.map(function (group, i) { return (React__default["default"].createElement(OptionBookingAirlineGroup, { key: "".concat(group.label, "_").concat(i), airGroup: group, onGroupChange: handleOnAirlineGroupChange })); }), airportGroups === null || airportGroups === void 0 ? void 0 :
13333
13475
  airportGroups.map(function (group, i) { return (React__default["default"].createElement(OptionBookingAirlineGroup, { key: "".concat(group.label, "_").concat(i), airGroup: group, onGroupChange: handleOnAirportGroupChange })); })))))),
13334
- lodash.isEmpty(groups) && lodash.isEmpty(optionUnits) && lodash.isEmpty(optionPax) && (React__default["default"].createElement(NoOptions, null)))),
13335
- React__default["default"].createElement("div", { className: "booking__navigator" },
13336
- hasPrevious && (React__default["default"].createElement(React__default["default"].Fragment, null, settings.skipRouter ? (React__default["default"].createElement("button", { type: "button", title: translations.STEPS.PREVIOUS, onClick: function () { return goPrevious(); }, className: "cta cta--secondary" }, translations.STEPS.PREVIOUS)) : (React__default["default"].createElement(router.Link, { to: previousUrl, title: translations.STEPS.PREVIOUS, className: "cta cta--secondary" }, translations.STEPS.PREVIOUS)))),
13337
- React__default["default"].createElement("button", { type: "submit", title: translations.STEPS.NEXT, disabled: isLoading, className: buildClassName(["cta", isLoading && "cta--disabled"]) }, translations.STEPS.NEXT)))));
13476
+ lodash.isEmpty(groups) &&
13477
+ lodash.isEmpty(optionUnits) &&
13478
+ lodash.isEmpty(optionPax) && React__default["default"].createElement(NoOptions, null))),
13479
+ React__default["default"].createElement("div", { className: 'booking__navigator' },
13480
+ hasPrevious && (React__default["default"].createElement(React__default["default"].Fragment, null, settings.skipRouter ? (React__default["default"].createElement("button", { type: 'button', title: translations.STEPS.PREVIOUS, onClick: function () { return goPrevious(); }, className: 'cta cta--secondary' }, translations.STEPS.PREVIOUS)) : (React__default["default"].createElement(router.Link, { to: previousUrl, title: translations.STEPS.PREVIOUS, className: 'cta cta--secondary' }, translations.STEPS.PREVIOUS)))),
13481
+ token &&
13482
+ settings.options.reportPrintActionId && (React__default["default"].createElement(PrintOfferButton, { bookingPackage: packageDetails, getPax: getPax, tagIds: tagIds, printActionId: settings.options.reportPrintActionId, labelIdle: translations.PRINT_OFFER_BUTTON.LABEL_IDLE, labelCreating: translations.PRINT_OFFER_BUTTON
13483
+ .LABEL_CREATING, labelPrinting: translations.PRINT_OFFER_BUTTON
13484
+ .LABEL_PRINTING, className: 'cta spinner-button' })),
13485
+ React__default["default"].createElement("button", { type: 'submit', title: translations.STEPS.NEXT, disabled: isLoading, className: buildClassName([
13486
+ "cta",
13487
+ isLoading && "cta--disabled",
13488
+ ]) }, translations.STEPS.NEXT)))));
13338
13489
  };
13339
13490
 
13340
13491
  var RoomOption = function (_a) {
@@ -232,6 +232,11 @@ export declare const getTranslations: (language: string) => {
232
232
  ERROR_TEXT3: string;
233
233
  ERROR_ALT: string;
234
234
  };
235
+ PRINT_OFFER_BUTTON: {
236
+ LABEL_IDLE: string;
237
+ LABEL_CREATING: string;
238
+ LABEL_PRINTING: string;
239
+ };
235
240
  };
236
241
  export declare const locales: {
237
242
  "nl-BE": Locale;
@@ -1,3 +1,4 @@
1
1
  import { TideClientConfig } from "@qite/tide-client";
2
2
  import { ApiSettingsState } from "../types";
3
3
  export declare function buildTideClientConfig(settings?: ApiSettingsState): TideClientConfig;
4
+ export declare const selectAgentToken: () => string | undefined;
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ import { BookingPackage, Pax } from "@qite/tide-client/build/types";
3
+ interface PrintOfferButtonProps {
4
+ bookingPackage?: BookingPackage;
5
+ getPax: () => Pax[] | undefined;
6
+ tagIds?: number[];
7
+ printActionId?: number | null;
8
+ onPrinted?: (pdfUrl: string) => void;
9
+ labelIdle?: string;
10
+ labelCreating?: string;
11
+ labelPrinting?: string;
12
+ disabled?: boolean;
13
+ className?: string;
14
+ loader?: React.ReactNode;
15
+ }
16
+ declare const PrintOfferButton: React.FC<PrintOfferButtonProps>;
17
+ export default PrintOfferButton;