From 747201b0f739222aeccaf0bfdad06ca97ba5f774 Mon Sep 17 00:00:00 2001 From: Niclas Edenvin Date: Thu, 27 Feb 2025 22:01:11 +0000 Subject: [PATCH] Merged in feat/SW-1282-list-added-ancillaries (pull request #1416) Feat/SW-1282 list added ancillaries * feat(sw-1282): add icon to accordionItem * feat(sw-1282): list added ancillaries * Change translation key to already existing * Remove duplicate key * Move new files to the new folder structure Approved-by: Pontus Dreij --- .../Accessibility/index.tsx | 2 +- .../AccordionAmenities/Breakfast/index.tsx | 2 +- .../AccordionAmenities/CheckIn/index.tsx | 2 +- .../AccordionAmenities/Parking/index.tsx | 2 +- .../addedAncillaries.module.css | 109 ++++++++++++ .../Ancillaries/AddedAncillaries/index.tsx | 166 ++++++++++++++++++ .../MyStay/Ancillaries/index.tsx | 3 + .../Accordions/Accessibility.tsx | 2 +- .../Accordions/CheckInCheckOut.tsx | 2 +- .../Accordions/MeetingsAndConferences.tsx | 2 +- .../HotelSidePeek/Accordions/Parking.tsx | 2 +- .../HotelSidePeek/Accordions/Restaurant.tsx | 2 +- .../Accordion/AccordionItem/accordionItem.ts | 4 +- .../Accordion/AccordionItem/index.tsx | 8 +- apps/scandic-web/i18n/dictionaries/da.json | 2 + apps/scandic-web/i18n/dictionaries/de.json | 4 +- apps/scandic-web/i18n/dictionaries/en.json | 2 + apps/scandic-web/i18n/dictionaries/fi.json | 2 + apps/scandic-web/i18n/dictionaries/no.json | 2 + apps/scandic-web/i18n/dictionaries/sv.json | 2 + .../server/routers/booking/output.ts | 16 +- .../components/myPages/myStay/ancillaries.ts | 5 + 22 files changed, 326 insertions(+), 17 deletions(-) create mode 100644 apps/scandic-web/components/HotelReservation/MyStay/Ancillaries/AddedAncillaries/addedAncillaries.module.css create mode 100644 apps/scandic-web/components/HotelReservation/MyStay/Ancillaries/AddedAncillaries/index.tsx diff --git a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Accessibility/index.tsx b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Accessibility/index.tsx index 12a7e449f..add0beccc 100644 --- a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Accessibility/index.tsx +++ b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Accessibility/index.tsx @@ -18,7 +18,7 @@ export default async function AccessibilityAmenity({ return ( diff --git a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Breakfast/index.tsx b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Breakfast/index.tsx index bd45d157a..d6a65ff1a 100644 --- a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Breakfast/index.tsx +++ b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Breakfast/index.tsx @@ -29,7 +29,7 @@ export default async function BreakfastAmenity({ return ( diff --git a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/CheckIn/index.tsx b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/CheckIn/index.tsx index 801cdd988..05a67140e 100644 --- a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/CheckIn/index.tsx +++ b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/CheckIn/index.tsx @@ -13,7 +13,7 @@ export default async function CheckInAmenity({ return ( diff --git a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Parking/index.tsx b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Parking/index.tsx index b610c4f1a..877f11ec5 100644 --- a/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Parking/index.tsx +++ b/apps/scandic-web/components/ContentType/HotelPage/SidePeeks/Amenities/AccordionAmenities/Parking/index.tsx @@ -19,7 +19,7 @@ export default async function ParkingAmenity({ return ( diff --git a/apps/scandic-web/components/HotelReservation/MyStay/Ancillaries/AddedAncillaries/addedAncillaries.module.css b/apps/scandic-web/components/HotelReservation/MyStay/Ancillaries/AddedAncillaries/addedAncillaries.module.css new file mode 100644 index 000000000..428e927a9 --- /dev/null +++ b/apps/scandic-web/components/HotelReservation/MyStay/Ancillaries/AddedAncillaries/addedAncillaries.module.css @@ -0,0 +1,109 @@ +.container { + display: flex; + flex-direction: column; + gap: var(--Spacing-x-half); + padding: 0 var(--Spacing-x2); +} + +.header { + display: flex; + flex-direction: column; + justify-content: space-between; + gap: var(--Spacing-x-one-and-half); + margin-top: var(--Spacing-x5); +} + +@media (min-width: 768px) { + .container { + gap: var(--Spacing-x3); + } + .header { + align-items: center; + flex-direction: row; + } +} + +.deliveryTime { + display: flex; + justify-content: space-between; + gap: var(--Spacing-x1); +} + +.ancillaryMobile { + background-color: var(--Base-Background-Primary-Normal); + border-radius: var(--Corner-radius-Medium); + display: flex; + flex-direction: column; + gap: var(--Spacing-x1); +} + +.ancillaryDesktop { + display: none; + padding: var(--Spacing-x2); + background-color: var(--Base-Background-Primary-Normal); + border-radius: var(--Corner-radius-Medium); + flex-direction: column; + gap: var(--Spacing-x1); +} + +@media (min-width: 768px) { + .ancillaryMobile { + display: none; + } + + .ancillaryDesktop { + display: flex; + } +} + +.paymentMobileWrapper { + display: flex; +} + +.paymentMobile { + display: flex; + gap: var(--Spacing-x2); + align-items: center; +} +.commentMobile { + margin-bottom: var(--Spacing-x3); +} + +.footerMobile { + display: flex; + margin-top: var(--Spacing-x4); +} + +.specification { + display: flex; + justify-content: space-between; + padding: var(--Spacing-x1) 0; +} + +.name { + display: flex; + gap: var(--Spacing-x1); + align-items: center; +} + +.payment { + display: flex; + gap: var(--Spacing-x2); + align-items: center; +} + +.footer { + display: flex; + justify-content: space-between; + padding: var(--Spacing-x1) 0; +} + +.comment { + display: flex; + gap: var(--Spacing-x-one-and-half); +} + +.actions { + display: flex; + gap: var(--Spacing-x2); +} diff --git a/apps/scandic-web/components/HotelReservation/MyStay/Ancillaries/AddedAncillaries/index.tsx b/apps/scandic-web/components/HotelReservation/MyStay/Ancillaries/AddedAncillaries/index.tsx new file mode 100644 index 000000000..50db70051 --- /dev/null +++ b/apps/scandic-web/components/HotelReservation/MyStay/Ancillaries/AddedAncillaries/index.tsx @@ -0,0 +1,166 @@ +import { useIntl } from "react-intl" + +import { CheckCircleIcon, DeleteIcon, EditIcon } from "@/components/Icons" +import Accordion from "@/components/TempDesignSystem/Accordion" +import AccordionItem from "@/components/TempDesignSystem/Accordion/AccordionItem" +import Button from "@/components/TempDesignSystem/Button" +import Divider from "@/components/TempDesignSystem/Divider" +import Body from "@/components/TempDesignSystem/Text/Body" +import Subtitle from "@/components/TempDesignSystem/Text/Subtitle" + +import styles from "./addedAncillaries.module.css" + +import type { AddedAncillariesProps } from "@/types/components/myPages/myStay/ancillaries" + +export function AddedAncillaries({ + ancillaries, + booking, +}: AddedAncillariesProps) { + const intl = useIntl() + + return ( +
+
+ {intl.formatMessage({ id: "My Add-on's" })} + + {booking.ancillary?.deliveryTime && ( +
+ + {intl.formatMessage({ id: "Delivered at:" })} + + + {booking.ancillary?.deliveryTime} + +
+ )} +
+ + {booking.ancillaries.map((ancillary) => { + const ancillaryItem = ancillaries?.find((a) => a.id === ancillary.code) + + return ( + <> + + } + > +
+ {ancillary.comment && ( + <> +
+ + {intl.formatMessage({ id: "Other requests" })}: + + + {ancillary.comment} + +
+ + )} +
+
+ {intl.formatMessage({ id: "Total" })} + + {`${ancillary.totalPrice} ${ancillary.currency}`} + + + + {`${ancillary.points} ${intl.formatMessage({ id: "Points" })}`} + +
+
+
+ +
+
+ + + +
+
+
+
+
+
+
+ + {ancillaryItem?.title} + {`X${ancillary.totalUnit}`} +
+
+ {intl.formatMessage({ id: "Total" })} + + {`${ancillary.totalPrice} ${ancillary.currency}`} + + + + {`${ancillary.points} ${intl.formatMessage({ id: "Points" })}`} + +
+
+ + + +
+
+ {ancillary.comment && ( + <> + + {intl.formatMessage({ id: "Other requests" })}: + + {ancillary.comment} + + )} +
+
+ + + +
+
+
+ + ) + })} +
+ ) +} diff --git a/apps/scandic-web/components/HotelReservation/MyStay/Ancillaries/index.tsx b/apps/scandic-web/components/HotelReservation/MyStay/Ancillaries/index.tsx index 370a7414e..739a84b9c 100644 --- a/apps/scandic-web/components/HotelReservation/MyStay/Ancillaries/index.tsx +++ b/apps/scandic-web/components/HotelReservation/MyStay/Ancillaries/index.tsx @@ -9,6 +9,7 @@ import { AncillaryCard } from "@/components/TempDesignSystem/AncillaryCard" import Title from "@/components/TempDesignSystem/Text/Title" import AddAncillaryFlowModal from "./AddAncillaryFlow/AddAncillaryFlowModal" +import { AddedAncillaries } from "./AddedAncillaries" import AncillaryGridModal from "./AncillaryGridModal" import styles from "./ancillaries.module.css" @@ -115,6 +116,8 @@ export function Ancillaries({ ancillaries, booking, user }: AncillariesProps) { + + {elevatorPitchText} diff --git a/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/CheckInCheckOut.tsx b/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/CheckInCheckOut.tsx index 40375c8b0..10561aa3e 100644 --- a/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/CheckInCheckOut.tsx +++ b/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/CheckInCheckOut.tsx @@ -12,7 +12,7 @@ export default function CheckinCheckOut({ checkin }: CheckInCheckOutProps) { return ( {intl.formatMessage({ id: "Hours" })} diff --git a/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/MeetingsAndConferences.tsx b/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/MeetingsAndConferences.tsx index 1341a1068..494999805 100644 --- a/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/MeetingsAndConferences.tsx +++ b/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/MeetingsAndConferences.tsx @@ -13,7 +13,7 @@ export default function MeetingsAndConferences({ return ( {meetingDescription} diff --git a/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/Parking.tsx b/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/Parking.tsx index e16f2ba6e..3c5d1d31d 100644 --- a/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/Parking.tsx +++ b/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/Parking.tsx @@ -15,7 +15,7 @@ export default function Parking({ parking }: ParkingProps) { return ( diff --git a/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/Restaurant.tsx b/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/Restaurant.tsx index 23a380ef6..4a31914b4 100644 --- a/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/Restaurant.tsx +++ b/apps/scandic-web/components/SidePeeks/HotelSidePeek/Accordions/Restaurant.tsx @@ -19,7 +19,7 @@ export default function Restaurant({ }, { totalRestaurants: 1 } )} - icon={IconName.Restaurant} + iconName={IconName.Restaurant} variant="sidepeek" > {restaurantsContentDescriptionMedium} diff --git a/apps/scandic-web/components/TempDesignSystem/Accordion/AccordionItem/accordionItem.ts b/apps/scandic-web/components/TempDesignSystem/Accordion/AccordionItem/accordionItem.ts index ba984bd65..48b1030d7 100644 --- a/apps/scandic-web/components/TempDesignSystem/Accordion/AccordionItem/accordionItem.ts +++ b/apps/scandic-web/components/TempDesignSystem/Accordion/AccordionItem/accordionItem.ts @@ -1,4 +1,5 @@ import type { VariantProps } from "class-variance-authority" +import type { ReactNode } from "react" import type { IconName } from "@/types/components/icon" import type { accordionItemVariants } from "./variants" @@ -7,7 +8,8 @@ export interface AccordionItemProps extends React.HtmlHTMLAttributes, VariantProps { title: string - icon?: IconName + iconName?: IconName + icon?: ReactNode trackingId?: string subtitle?: string } diff --git a/apps/scandic-web/components/TempDesignSystem/Accordion/AccordionItem/index.tsx b/apps/scandic-web/components/TempDesignSystem/Accordion/AccordionItem/index.tsx index 694ad764b..a752962ec 100644 --- a/apps/scandic-web/components/TempDesignSystem/Accordion/AccordionItem/index.tsx +++ b/apps/scandic-web/components/TempDesignSystem/Accordion/AccordionItem/index.tsx @@ -17,6 +17,7 @@ import type { AccordionItemProps } from "./accordionItem" export default function AccordionItem({ children, icon, + iconName, title, theme, variant, @@ -27,7 +28,10 @@ export default function AccordionItem({ const contentRef = useRef(null) const detailsRef = useRef(null) - const IconComp = getIconByIconName(icon) + const FoundIcon = getIconByIconName(iconName) + const IconComp = icon + ? icon + : FoundIcon && function toggleAccordion() { const details = detailsRef.current @@ -56,7 +60,7 @@ export default function AccordionItem({
  • - {IconComp && } + {IconComp} {variant === "sidepeek" ? ( ({ - description: packageData.description, - code: packageData.code, type: packageData.type, + description: packageData.description, + comment: packageData.comment, + code: packageData.code, currency: packageData.price.currency, points: packageData.price.points, totalPrice: packageData.price.totalPrice ?? 0, @@ -219,7 +221,13 @@ export const bookingConfirmationSchema = z }) .transform(({ data }) => ({ ...data.attributes, - showAncillaries: !!data.links.addAncillary, + packages: data.attributes.packages.filter((p) => p.type !== "Ancillary"), + ancillaries: data.attributes.packages.filter((p) => p.type === "Ancillary"), + extraBedTypes: data.attributes.childBedPreferences, + showAncillaries: !!( + data.links.addAncillary || + data.attributes.packages.some((p) => p.type === "Ancillary") + ), isCancelable: !!data.links.cancel, isModifiable: !!data.links.modify, })) diff --git a/apps/scandic-web/types/components/myPages/myStay/ancillaries.ts b/apps/scandic-web/types/components/myPages/myStay/ancillaries.ts index d430d7f90..2babebae9 100644 --- a/apps/scandic-web/types/components/myPages/myStay/ancillaries.ts +++ b/apps/scandic-web/types/components/myPages/myStay/ancillaries.ts @@ -12,6 +12,11 @@ export interface AncillariesProps extends Pick { user: User | null } +export interface AddedAncillariesProps { + ancillaries: Ancillary["ancillaryContent"][number][] | null + booking: BookingConfirmation["booking"] +} + export interface AncillaryProps { ancillary: Ancillary["ancillaryContent"][number] }