Merged master into feat/SW-888-skeleton-loaders
This commit is contained in:
@@ -38,6 +38,13 @@
|
|||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.hotelList {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: var(--Spacing-x3);
|
||||||
|
}
|
||||||
|
|
||||||
@media (min-width: 768px) {
|
@media (min-width: 768px) {
|
||||||
.link {
|
.link {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import {
|
|||||||
} from "@/components/HotelReservation/SelectRate/RoomSelection/utils"
|
} from "@/components/HotelReservation/SelectRate/RoomSelection/utils"
|
||||||
import { ChevronRightIcon } from "@/components/Icons"
|
import { ChevronRightIcon } from "@/components/Icons"
|
||||||
import StaticMap from "@/components/Maps/StaticMap"
|
import StaticMap from "@/components/Maps/StaticMap"
|
||||||
|
import Alert from "@/components/TempDesignSystem/Alert"
|
||||||
import Link from "@/components/TempDesignSystem/Link"
|
import Link from "@/components/TempDesignSystem/Link"
|
||||||
import { getIntl } from "@/i18n"
|
import { getIntl } from "@/i18n"
|
||||||
import { setLang } from "@/i18n/serverContext"
|
import { setLang } from "@/i18n/serverContext"
|
||||||
@@ -24,6 +25,7 @@ import { setLang } from "@/i18n/serverContext"
|
|||||||
import styles from "./page.module.css"
|
import styles from "./page.module.css"
|
||||||
|
|
||||||
import type { SelectHotelSearchParams } from "@/types/components/hotelReservation/selectHotel/selectHotelSearchParams"
|
import type { SelectHotelSearchParams } from "@/types/components/hotelReservation/selectHotel/selectHotelSearchParams"
|
||||||
|
import { AlertTypeEnum } from "@/types/enums/alert"
|
||||||
import { LangParams, PageArgs } from "@/types/params"
|
import { LangParams, PageArgs } from "@/types/params"
|
||||||
|
|
||||||
export default async function SelectHotelPage({
|
export default async function SelectHotelPage({
|
||||||
@@ -69,6 +71,7 @@ export default async function SelectHotelPage({
|
|||||||
</header>
|
</header>
|
||||||
<main className={styles.main}>
|
<main className={styles.main}>
|
||||||
<div className={styles.sideBar}>
|
<div className={styles.sideBar}>
|
||||||
|
{hotels.length > 0 ? ( // TODO: Temp fix until API returns hotels that are not available
|
||||||
<Link
|
<Link
|
||||||
className={styles.link}
|
className={styles.link}
|
||||||
color="burgundy"
|
color="burgundy"
|
||||||
@@ -90,10 +93,33 @@ export default async function SelectHotelPage({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
|
) : (
|
||||||
|
<div className={styles.mapContainer}>
|
||||||
|
<StaticMap
|
||||||
|
city={searchParams.city}
|
||||||
|
width={340}
|
||||||
|
height={180}
|
||||||
|
zoomLevel={11}
|
||||||
|
mapType="roadmap"
|
||||||
|
altText={`Map of ${searchParams.city} city center`}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
<MobileMapButtonContainer city={searchParams.city} />
|
<MobileMapButtonContainer city={searchParams.city} />
|
||||||
<HotelFilter filters={filterList} />
|
<HotelFilter filters={filterList} />
|
||||||
</div>
|
</div>
|
||||||
|
<div className={styles.hotelList}>
|
||||||
|
{!hotels.length && (
|
||||||
|
<Alert
|
||||||
|
type={AlertTypeEnum.Info}
|
||||||
|
heading={intl.formatMessage({ id: "No availability" })}
|
||||||
|
text={intl.formatMessage({
|
||||||
|
id: "There are no rooms available that match your request.",
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
<HotelCardListing hotelData={hotels} />
|
<HotelCardListing hotelData={hotels} />
|
||||||
|
</div>
|
||||||
</main>
|
</main>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -65,7 +65,6 @@ export default async function RootLayout({
|
|||||||
<SkipToMainContent />
|
<SkipToMainContent />
|
||||||
<ServerIntlProvider intl={{ defaultLocale, locale, messages }}>
|
<ServerIntlProvider intl={{ defaultLocale, locale, messages }}>
|
||||||
{header}
|
{header}
|
||||||
<BookingWidget />
|
|
||||||
{children}
|
{children}
|
||||||
<Footer />
|
<Footer />
|
||||||
<TokenRefresher />
|
<TokenRefresher />
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ export default async function HotelListingItem({
|
|||||||
</div>
|
</div>
|
||||||
<Caption color="uiTextPlaceholder">
|
<Caption color="uiTextPlaceholder">
|
||||||
{intl.formatMessage(
|
{intl.formatMessage(
|
||||||
{ id: "Distance to city centre" },
|
{ id: "Distance in km to city centre" },
|
||||||
{ number: distanceToCentre }
|
{ number: distanceToCentre }
|
||||||
)}
|
)}
|
||||||
</Caption>
|
</Caption>
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ export default async function IntroSection({
|
|||||||
const { streetAddress, city } = address
|
const { streetAddress, city } = address
|
||||||
const { distanceToCentre } = location
|
const { distanceToCentre } = location
|
||||||
const formattedDistanceText = intl.formatMessage(
|
const formattedDistanceText = intl.formatMessage(
|
||||||
{ id: "Distance to city centre" },
|
{ id: "Distance in km to city centre" },
|
||||||
{ number: distanceToCentre }
|
{ number: distanceToCentre }
|
||||||
)
|
)
|
||||||
const lang = getLang()
|
const lang = getLang()
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
.header {
|
.header {
|
||||||
display: grid;
|
display: grid;
|
||||||
|
background-color: var(--Main-Grey-White);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 1366px) {
|
@media screen and (max-width: 1366px) {
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ export default function HotelCard({
|
|||||||
</div>
|
</div>
|
||||||
<Caption color="uiTextPlaceholder">
|
<Caption color="uiTextPlaceholder">
|
||||||
{intl.formatMessage(
|
{intl.formatMessage(
|
||||||
{ id: "Distance to city centre" },
|
{ id: "Distance in km to city centre" },
|
||||||
{ number: hotelData.location.distanceToCentre }
|
{ number: hotelData.location.distanceToCentre }
|
||||||
)}
|
)}
|
||||||
</Caption>
|
</Caption>
|
||||||
|
|||||||
@@ -71,8 +71,8 @@ export default function HotelCardListing({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<section className={styles.hotelCards}>
|
<section className={styles.hotelCards}>
|
||||||
{hotels?.length ? (
|
{hotels?.length
|
||||||
hotels.map((hotel) => (
|
? hotels.map((hotel) => (
|
||||||
<HotelCard
|
<HotelCard
|
||||||
key={hotel.hotelData.operaId}
|
key={hotel.hotelData.operaId}
|
||||||
hotel={hotel}
|
hotel={hotel}
|
||||||
@@ -81,9 +81,7 @@ export default function HotelCardListing({
|
|||||||
onHotelCardHover={onHotelCardHover}
|
onHotelCardHover={onHotelCardHover}
|
||||||
/>
|
/>
|
||||||
))
|
))
|
||||||
) : (
|
: null}
|
||||||
<Title>No hotels found</Title>
|
|
||||||
)}
|
|
||||||
</section>
|
</section>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ export default function HotelSelectionHeader({
|
|||||||
</div>
|
</div>
|
||||||
<Caption color="textMediumContrast">
|
<Caption color="textMediumContrast">
|
||||||
{intl.formatMessage(
|
{intl.formatMessage(
|
||||||
{ id: "Distance to city centre" },
|
{ id: "Distance in km to city centre" },
|
||||||
{ number: hotel.location.distanceToCentre }
|
{ number: hotel.location.distanceToCentre }
|
||||||
)}
|
)}
|
||||||
</Caption>
|
</Caption>
|
||||||
|
|||||||
@@ -3,16 +3,30 @@
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.container form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: var(--Spacing-x3);
|
||||||
|
}
|
||||||
|
|
||||||
.facilities {
|
.facilities {
|
||||||
font-family: var(--typography-Body-Bold-fontFamily);
|
font-family: var(--typography-Body-Bold-fontFamily);
|
||||||
margin-bottom: var(--Spacing-x3);
|
padding-bottom: var(--Spacing-x3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.facilities:first-of-type {
|
||||||
|
border-bottom: 1px solid var(--Base-Border-Subtle);
|
||||||
|
}
|
||||||
|
|
||||||
|
.facilities ul {
|
||||||
|
margin-top: var(--Spacing-x2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.filter {
|
.filter {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(2, minmax(min-content, max-content));
|
grid-template-columns: repeat(2, minmax(min-content, max-content));
|
||||||
gap: var(--Spacing-x-one-and-half);
|
gap: var(--Spacing-x-one-and-half);
|
||||||
margin-bottom: var(--Spacing-x-one-and-half);
|
margin-bottom: var(--Spacing-x1);
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,26 +2,29 @@
|
|||||||
|
|
||||||
import { usePathname, useSearchParams } from "next/navigation"
|
import { usePathname, useSearchParams } from "next/navigation"
|
||||||
import { useCallback, useEffect } from "react"
|
import { useCallback, useEffect } from "react"
|
||||||
import { useForm } from "react-hook-form"
|
import { FormProvider, useForm } from "react-hook-form"
|
||||||
import { useIntl } from "react-intl"
|
import { useIntl } from "react-intl"
|
||||||
|
|
||||||
|
import Checkbox from "@/components/TempDesignSystem/Form/Checkbox"
|
||||||
|
import Subtitle from "@/components/TempDesignSystem/Text/Subtitle"
|
||||||
|
import Title from "@/components/TempDesignSystem/Text/Title"
|
||||||
|
|
||||||
import styles from "./hotelFilter.module.css"
|
import styles from "./hotelFilter.module.css"
|
||||||
|
|
||||||
import { HotelFiltersProps } from "@/types/components/hotelReservation/selectHotel/hotelFilters"
|
import type { HotelFiltersProps } from "@/types/components/hotelReservation/selectHotel/hotelFilters"
|
||||||
|
|
||||||
export default function HotelFilter({ filters }: HotelFiltersProps) {
|
export default function HotelFilter({ filters }: HotelFiltersProps) {
|
||||||
const intl = useIntl()
|
const intl = useIntl()
|
||||||
const searchParams = useSearchParams()
|
const searchParams = useSearchParams()
|
||||||
const pathname = usePathname()
|
const pathname = usePathname()
|
||||||
|
|
||||||
const { watch, handleSubmit, getValues, register } = useForm<
|
const methods = useForm<Record<string, boolean | undefined>>({
|
||||||
Record<string, boolean | undefined>
|
|
||||||
>({
|
|
||||||
defaultValues: searchParams
|
defaultValues: searchParams
|
||||||
?.get("filters")
|
?.get("filters")
|
||||||
?.split(",")
|
?.split(",")
|
||||||
.reduce((acc, curr) => ({ ...acc, [curr]: true }), {}),
|
.reduce((acc, curr) => ({ ...acc, [curr]: true }), {}),
|
||||||
})
|
})
|
||||||
|
const { watch, handleSubmit, getValues, register } = methods
|
||||||
|
|
||||||
const submitFilter = useCallback(() => {
|
const submitFilter = useCallback(() => {
|
||||||
const newSearchParams = new URLSearchParams(searchParams)
|
const newSearchParams = new URLSearchParams(searchParams)
|
||||||
@@ -50,43 +53,42 @@ export default function HotelFilter({ filters }: HotelFiltersProps) {
|
|||||||
return () => subscription.unsubscribe()
|
return () => subscription.unsubscribe()
|
||||||
}, [handleSubmit, watch, submitFilter])
|
}, [handleSubmit, watch, submitFilter])
|
||||||
|
|
||||||
|
if (!filters.facilityFilters.length && !filters.surroundingsFilters.length) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<aside className={styles.container}>
|
<aside className={styles.container}>
|
||||||
<div className={styles.facilities}>
|
<FormProvider {...methods}>
|
||||||
<form onSubmit={handleSubmit(submitFilter)}>
|
<form onSubmit={handleSubmit(submitFilter)}>
|
||||||
|
<Title as="h4">{intl.formatMessage({ id: "Filter by" })}</Title>
|
||||||
|
<div className={styles.facilities}>
|
||||||
|
<Subtitle>
|
||||||
{intl.formatMessage({ id: "Hotel facilities" })}
|
{intl.formatMessage({ id: "Hotel facilities" })}
|
||||||
|
</Subtitle>
|
||||||
<ul>
|
<ul>
|
||||||
{filters.facilityFilters.map((filter) => (
|
{filters.facilityFilters.map((filter) => (
|
||||||
<li key={`li-${filter.id}`} className={styles.filter}>
|
<li key={`li-${filter.id}`} className={styles.filter}>
|
||||||
<input
|
<Checkbox name={filter.id.toString()}>{filter.name}</Checkbox>
|
||||||
type="checkbox"
|
|
||||||
id={`checkbox-${filter.id.toString()}`}
|
|
||||||
{...register(filter.id.toString())}
|
|
||||||
/>
|
|
||||||
<label htmlFor={`checkbox-${filter.id.toString()}`}>
|
|
||||||
{filter.name}
|
|
||||||
</label>
|
|
||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles.facilities}>
|
||||||
|
<Subtitle>
|
||||||
{intl.formatMessage({ id: "Hotel surroundings" })}
|
{intl.formatMessage({ id: "Hotel surroundings" })}
|
||||||
|
</Subtitle>
|
||||||
<ul>
|
<ul>
|
||||||
{filters.surroundingsFilters.map((filter) => (
|
{filters.surroundingsFilters.map((filter) => (
|
||||||
<li key={`li-${filter.id}`} className={styles.filter}>
|
<li key={`li-${filter.id}`} className={styles.filter}>
|
||||||
<input
|
<Checkbox name={filter.id.toString()}>{filter.name}</Checkbox>
|
||||||
type="checkbox"
|
|
||||||
id={`checkbox-${filter.id.toString()}`}
|
|
||||||
{...register(filter.id.toString())}
|
|
||||||
/>
|
|
||||||
<label htmlFor={`checkbox-${filter.id.toString()}`}>
|
|
||||||
{filter.name}
|
|
||||||
</label>
|
|
||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
|
</form>
|
||||||
|
</FormProvider>
|
||||||
</aside>
|
</aside>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
.container {
|
||||||
|
width: 339px;
|
||||||
|
}
|
||||||
@@ -6,24 +6,19 @@ import { useIntl } from "react-intl"
|
|||||||
|
|
||||||
import Select from "@/components/TempDesignSystem/Select"
|
import Select from "@/components/TempDesignSystem/Select"
|
||||||
|
|
||||||
|
import styles from "./hotelSorter.module.css"
|
||||||
|
|
||||||
import {
|
import {
|
||||||
type SortItem,
|
type SortItem,
|
||||||
SortOrder,
|
SortOrder,
|
||||||
} from "@/types/components/hotelReservation/selectHotel/hotelSorter"
|
} from "@/types/components/hotelReservation/selectHotel/hotelSorter"
|
||||||
|
|
||||||
const sortItems: SortItem[] = [
|
|
||||||
{ label: "Distance", value: SortOrder.Distance },
|
|
||||||
{ label: "Name", value: SortOrder.Name },
|
|
||||||
{ label: "Price", value: SortOrder.Price },
|
|
||||||
{ label: "TripAdvisor rating", value: SortOrder.TripAdvisorRating },
|
|
||||||
]
|
|
||||||
|
|
||||||
export const DEFAULT_SORT = SortOrder.Distance
|
export const DEFAULT_SORT = SortOrder.Distance
|
||||||
|
|
||||||
export default function HotelSorter() {
|
export default function HotelSorter() {
|
||||||
const searchParams = useSearchParams()
|
const searchParams = useSearchParams()
|
||||||
const pathname = usePathname()
|
const pathname = usePathname()
|
||||||
const i18n = useIntl()
|
const intl = useIntl()
|
||||||
|
|
||||||
const onSelect = useCallback(
|
const onSelect = useCallback(
|
||||||
(value: string | number) => {
|
(value: string | number) => {
|
||||||
@@ -43,14 +38,30 @@ export default function HotelSorter() {
|
|||||||
},
|
},
|
||||||
[pathname, searchParams]
|
[pathname, searchParams]
|
||||||
)
|
)
|
||||||
|
const sortItems: SortItem[] = [
|
||||||
|
{
|
||||||
|
label: intl.formatMessage({ id: "Distance to city center" }),
|
||||||
|
value: SortOrder.Distance,
|
||||||
|
},
|
||||||
|
{ label: intl.formatMessage({ id: "Name" }), value: SortOrder.Name },
|
||||||
|
{ label: intl.formatMessage({ id: "Price" }), value: SortOrder.Price },
|
||||||
|
{
|
||||||
|
label: intl.formatMessage({ id: "TripAdvisor rating" }),
|
||||||
|
value: SortOrder.TripAdvisorRating,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<div className={styles.container}>
|
||||||
<Select
|
<Select
|
||||||
items={sortItems}
|
items={sortItems}
|
||||||
label={i18n.formatMessage({ id: "Sort by" })}
|
defaultSelectedKey={searchParams.get("sort") ?? DEFAULT_SORT}
|
||||||
|
label={intl.formatMessage({ id: "Sort by" })}
|
||||||
name="sort"
|
name="sort"
|
||||||
showRadioButton
|
showRadioButton
|
||||||
|
discreet
|
||||||
onSelect={onSelect}
|
onSelect={onSelect}
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,12 @@ span.regular {
|
|||||||
order: 1;
|
order: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
span.discreet {
|
||||||
|
color: var(--Base-Text-High-contrast);
|
||||||
|
font-weight: 500;
|
||||||
|
order: unset;
|
||||||
|
}
|
||||||
|
|
||||||
input:active ~ .label,
|
input:active ~ .label,
|
||||||
input:not(:placeholder-shown) ~ .label {
|
input:not(:placeholder-shown) ~ .label {
|
||||||
display: block;
|
display: block;
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ export const labelVariants = cva(styles.label, {
|
|||||||
size: {
|
size: {
|
||||||
small: styles.small,
|
small: styles.small,
|
||||||
regular: styles.regular,
|
regular: styles.regular,
|
||||||
|
discreet: styles.discreet,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
defaultVariants: {
|
defaultVariants: {
|
||||||
|
|||||||
@@ -2,10 +2,12 @@ import { ChevronDownIcon } from "@/components/Icons"
|
|||||||
|
|
||||||
import styles from "./chevron.module.css"
|
import styles from "./chevron.module.css"
|
||||||
|
|
||||||
export default function SelectChevron() {
|
import type { IconProps } from "@/types/components/icon"
|
||||||
|
|
||||||
|
export default function SelectChevron(props: IconProps) {
|
||||||
return (
|
return (
|
||||||
<span aria-hidden="true" className={styles.chevron}>
|
<span aria-hidden="true" className={styles.chevron}>
|
||||||
<ChevronDownIcon color="grey80" width={20} height={20} />
|
<ChevronDownIcon color="grey80" width={20} height={20} {...props} />
|
||||||
</span>
|
</span>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ export default function Select({
|
|||||||
value,
|
value,
|
||||||
maxHeight,
|
maxHeight,
|
||||||
showRadioButton = false,
|
showRadioButton = false,
|
||||||
|
discreet = false,
|
||||||
}: SelectProps) {
|
}: SelectProps) {
|
||||||
const [rootDiv, setRootDiv] = useState<SelectPortalContainer>(undefined)
|
const [rootDiv, setRootDiv] = useState<SelectPortalContainer>(undefined)
|
||||||
|
|
||||||
@@ -53,7 +54,7 @@ export default function Select({
|
|||||||
<div className={styles.container} ref={setRef}>
|
<div className={styles.container} ref={setRef}>
|
||||||
<ReactAriaSelect
|
<ReactAriaSelect
|
||||||
aria-label={ariaLabel}
|
aria-label={ariaLabel}
|
||||||
className={styles.select}
|
className={`${styles.select} ${discreet && styles.discreet}`}
|
||||||
defaultSelectedKey={defaultSelectedKey}
|
defaultSelectedKey={defaultSelectedKey}
|
||||||
name={name}
|
name={name}
|
||||||
onSelectionChange={handleOnSelect}
|
onSelectionChange={handleOnSelect}
|
||||||
@@ -63,12 +64,15 @@ export default function Select({
|
|||||||
<Body asChild fontOnly>
|
<Body asChild fontOnly>
|
||||||
<Button className={styles.input} data-testid={name}>
|
<Button className={styles.input} data-testid={name}>
|
||||||
<span className={styles.inputContentWrapper} tabIndex={tabIndex}>
|
<span className={styles.inputContentWrapper} tabIndex={tabIndex}>
|
||||||
<Label required={required} size="small">
|
<Label required={required} size={discreet ? "discreet" : "small"}>
|
||||||
{label}
|
{label}
|
||||||
|
{discreet && `:`}
|
||||||
</Label>
|
</Label>
|
||||||
<SelectValue />
|
<SelectValue />
|
||||||
</span>
|
</span>
|
||||||
<SelectChevron />
|
<SelectChevron
|
||||||
|
{...(discreet ? { color: "baseButtonTextOnFillNormal" } : {})}
|
||||||
|
/>
|
||||||
</Button>
|
</Button>
|
||||||
</Body>
|
</Body>
|
||||||
<Body asChild fontOnly>
|
<Body asChild fontOnly>
|
||||||
|
|||||||
@@ -10,11 +10,29 @@
|
|||||||
gap: var(--Spacing-x-half);
|
gap: var(--Spacing-x-half);
|
||||||
}
|
}
|
||||||
|
|
||||||
.select[data-focused="true"] {
|
.select[data-focused="true"],
|
||||||
|
.select[data-focused="true"].discreet {
|
||||||
border: 1px solid var(--Scandic-Blue-90);
|
border: 1px solid var(--Scandic-Blue-90);
|
||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.select.discreet {
|
||||||
|
border: 1px solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select.discreet .input {
|
||||||
|
background-color: unset;
|
||||||
|
color: var(--Base-Text-High-contrast);
|
||||||
|
gap: var(--Spacing-x1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.select.discreet .inputContentWrapper {
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-end;
|
||||||
|
flex-direction: row;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
.input {
|
.input {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background-color: var(--UI-Opacity-White-100);
|
background-color: var(--UI-Opacity-White-100);
|
||||||
@@ -72,7 +90,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.listBoxItem.showRadioButton:before {
|
.listBoxItem.showRadioButton:before {
|
||||||
display: flex;
|
flex-shrink: 0;
|
||||||
content: "";
|
content: "";
|
||||||
margin-right: var(--Spacing-x-one-and-half);
|
margin-right: var(--Spacing-x-one-and-half);
|
||||||
background-color: white;
|
background-color: white;
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ export interface SelectProps
|
|||||||
value?: string | number
|
value?: string | number
|
||||||
maxHeight?: number
|
maxHeight?: number
|
||||||
showRadioButton?: boolean
|
showRadioButton?: boolean
|
||||||
|
discreet?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export type SelectPortalContainer = HTMLDivElement | undefined
|
export type SelectPortalContainer = HTMLDivElement | undefined
|
||||||
|
|||||||
@@ -98,7 +98,8 @@
|
|||||||
"Disabled booking options text": "Koder, checks og bonusnætter er endnu ikke tilgængelige på den nye hjemmeside.",
|
"Disabled booking options text": "Koder, checks og bonusnætter er endnu ikke tilgængelige på den nye hjemmeside.",
|
||||||
"Discard changes": "Kassér ændringer",
|
"Discard changes": "Kassér ændringer",
|
||||||
"Discard unsaved changes?": "Slette ændringer, der ikke er gemt?",
|
"Discard unsaved changes?": "Slette ændringer, der ikke er gemt?",
|
||||||
"Distance to city centre": "{number} km til centrum",
|
"Distance in km to city centre": "{number} km til centrum",
|
||||||
|
"Distance to city centre": "Afstand til centrum",
|
||||||
"Distance to hotel": "Afstand til hotel",
|
"Distance to hotel": "Afstand til hotel",
|
||||||
"Do you want to start the day with Scandics famous breakfast buffé?": "Vil du starte dagen med Scandics berømte morgenbuffet?",
|
"Do you want to start the day with Scandics famous breakfast buffé?": "Vil du starte dagen med Scandics berømte morgenbuffet?",
|
||||||
"Done": "Færdig",
|
"Done": "Færdig",
|
||||||
@@ -120,6 +121,7 @@
|
|||||||
"Failed to delete credit card, please try again later.": "Kunne ikke slette kreditkort. Prøv venligst igen senere.",
|
"Failed to delete credit card, please try again later.": "Kunne ikke slette kreditkort. Prøv venligst igen senere.",
|
||||||
"Fair": "Messe",
|
"Fair": "Messe",
|
||||||
"Filter": "Filter",
|
"Filter": "Filter",
|
||||||
|
"Filter by": "Filtrer efter",
|
||||||
"Find booking": "Find booking",
|
"Find booking": "Find booking",
|
||||||
"Find hotels": "Find hotel",
|
"Find hotels": "Find hotel",
|
||||||
"First name": "Fornavn",
|
"First name": "Fornavn",
|
||||||
@@ -204,12 +206,14 @@
|
|||||||
"My pages menu": "Mine sider menu",
|
"My pages menu": "Mine sider menu",
|
||||||
"My payment cards": "Mine betalingskort",
|
"My payment cards": "Mine betalingskort",
|
||||||
"My wishes": "Mine ønsker",
|
"My wishes": "Mine ønsker",
|
||||||
|
"Name": "Navn",
|
||||||
"Nearby": "I nærheden",
|
"Nearby": "I nærheden",
|
||||||
"Nearby companies": "Nærliggende virksomheder",
|
"Nearby companies": "Nærliggende virksomheder",
|
||||||
"New password": "Nyt kodeord",
|
"New password": "Nyt kodeord",
|
||||||
"Next": "Næste",
|
"Next": "Næste",
|
||||||
"Nights needed to level up": "Nætter nødvendige for at komme i niveau",
|
"Nights needed to level up": "Nætter nødvendige for at komme i niveau",
|
||||||
"No": "Nej",
|
"No": "Nej",
|
||||||
|
"No availability": "Ingen tilgængelighed",
|
||||||
"No breakfast": "Ingen morgenmad",
|
"No breakfast": "Ingen morgenmad",
|
||||||
"No content published": "Intet indhold offentliggjort",
|
"No content published": "Intet indhold offentliggjort",
|
||||||
"No matching location found": "Der blev ikke fundet nogen matchende placering",
|
"No matching location found": "Der blev ikke fundet nogen matchende placering",
|
||||||
@@ -258,6 +262,7 @@
|
|||||||
"Practical information": "Praktisk information",
|
"Practical information": "Praktisk information",
|
||||||
"Previous": "Forudgående",
|
"Previous": "Forudgående",
|
||||||
"Previous victories": "Tidligere sejre",
|
"Previous victories": "Tidligere sejre",
|
||||||
|
"Price": "Pris",
|
||||||
"Price details": "Prisoplysninger",
|
"Price details": "Prisoplysninger",
|
||||||
"Proceed to login": "Fortsæt til login",
|
"Proceed to login": "Fortsæt til login",
|
||||||
"Proceed to payment method": "Fortsæt til betalingsmetode",
|
"Proceed to payment method": "Fortsæt til betalingsmetode",
|
||||||
@@ -331,6 +336,7 @@
|
|||||||
"Thank you": "Tak",
|
"Thank you": "Tak",
|
||||||
"Theatre": "Teater",
|
"Theatre": "Teater",
|
||||||
"There are no rooms available that match your request": "Der er ingen ledige værelser, der matcher din anmodning",
|
"There are no rooms available that match your request": "Der er ingen ledige værelser, der matcher din anmodning",
|
||||||
|
"There are no rooms available that match your request.": "Der er ingen værelser tilgængelige, der matcher din forespørgsel.",
|
||||||
"There are no transactions to display": "Der er ingen transaktioner at vise",
|
"There are no transactions to display": "Der er ingen transaktioner at vise",
|
||||||
"Things nearby HOTEL_NAME": "Ting i nærheden af {hotelName}",
|
"Things nearby HOTEL_NAME": "Ting i nærheden af {hotelName}",
|
||||||
"To get the member price <span>{amount} {currency}</span>, log in or join when completing the booking.": "For at få medlemsprisen <span>{amount} {currency}</span>, log ind eller tilmeld dig, når du udfylder bookingen.",
|
"To get the member price <span>{amount} {currency}</span>, log in or join when completing the booking.": "For at få medlemsprisen <span>{amount} {currency}</span>, log ind eller tilmeld dig, når du udfylder bookingen.",
|
||||||
@@ -342,6 +348,7 @@
|
|||||||
"Transaction date": "Overførselsdato",
|
"Transaction date": "Overførselsdato",
|
||||||
"Transactions": "Transaktioner",
|
"Transactions": "Transaktioner",
|
||||||
"Transportations": "Transport",
|
"Transportations": "Transport",
|
||||||
|
"TripAdvisor rating": "TripAdvisor vurdering",
|
||||||
"Tripadvisor reviews": "{rating} ({count} anmeldelser på Tripadvisor)",
|
"Tripadvisor reviews": "{rating} ({count} anmeldelser på Tripadvisor)",
|
||||||
"Type of bed": "Sengtype",
|
"Type of bed": "Sengtype",
|
||||||
"Type of room": "Værelsestype",
|
"Type of room": "Værelsestype",
|
||||||
|
|||||||
@@ -98,7 +98,8 @@
|
|||||||
"Disabled booking options text": "Codes, Schecks und Bonusnächte sind auf der neuen Website noch nicht verfügbar.",
|
"Disabled booking options text": "Codes, Schecks und Bonusnächte sind auf der neuen Website noch nicht verfügbar.",
|
||||||
"Discard changes": "Änderungen verwerfen",
|
"Discard changes": "Änderungen verwerfen",
|
||||||
"Discard unsaved changes?": "Nicht gespeicherte Änderungen verwerfen?",
|
"Discard unsaved changes?": "Nicht gespeicherte Änderungen verwerfen?",
|
||||||
"Distance to city centre": "{number} km zum Stadtzentrum",
|
"Distance in km to city centre": "{number} km zum Stadtzentrum",
|
||||||
|
"Distance to city centre": "Entfernung zum Stadtzentrum",
|
||||||
"Distance to hotel": "Entfernung zum Hotel",
|
"Distance to hotel": "Entfernung zum Hotel",
|
||||||
"Do you want to start the day with Scandics famous breakfast buffé?": "Möchten Sie den Tag mit Scandics berühmtem Frühstücksbuffet beginnen?",
|
"Do you want to start the day with Scandics famous breakfast buffé?": "Möchten Sie den Tag mit Scandics berühmtem Frühstücksbuffet beginnen?",
|
||||||
"Done": "Fertig",
|
"Done": "Fertig",
|
||||||
@@ -120,6 +121,7 @@
|
|||||||
"Failed to delete credit card, please try again later.": "Kreditkarte konnte nicht gelöscht werden. Bitte versuchen Sie es später noch einmal.",
|
"Failed to delete credit card, please try again later.": "Kreditkarte konnte nicht gelöscht werden. Bitte versuchen Sie es später noch einmal.",
|
||||||
"Fair": "Messe",
|
"Fair": "Messe",
|
||||||
"Filter": "Filter",
|
"Filter": "Filter",
|
||||||
|
"Filter by": "Filtern nach",
|
||||||
"Find booking": "Buchung finden",
|
"Find booking": "Buchung finden",
|
||||||
"Find hotels": "Hotels finden",
|
"Find hotels": "Hotels finden",
|
||||||
"First name": "Vorname",
|
"First name": "Vorname",
|
||||||
@@ -202,12 +204,14 @@
|
|||||||
"My pages menu": "Meine Seite Menü",
|
"My pages menu": "Meine Seite Menü",
|
||||||
"My payment cards": "Meine Zahlungskarten",
|
"My payment cards": "Meine Zahlungskarten",
|
||||||
"My wishes": "Meine Wünsche",
|
"My wishes": "Meine Wünsche",
|
||||||
|
"Name": "Name",
|
||||||
"Nearby": "In der Nähe",
|
"Nearby": "In der Nähe",
|
||||||
"Nearby companies": "Nahe gelegene Unternehmen",
|
"Nearby companies": "Nahe gelegene Unternehmen",
|
||||||
"New password": "Neues Kennwort",
|
"New password": "Neues Kennwort",
|
||||||
"Next": "Nächste",
|
"Next": "Nächste",
|
||||||
"Nights needed to level up": "Nächte, die zum Levelaufstieg benötigt werden",
|
"Nights needed to level up": "Nächte, die zum Levelaufstieg benötigt werden",
|
||||||
"No": "Nein",
|
"No": "Nein",
|
||||||
|
"No availability": "Keine Verfügbarkeit",
|
||||||
"No breakfast": "Kein Frühstück",
|
"No breakfast": "Kein Frühstück",
|
||||||
"No content published": "Kein Inhalt veröffentlicht",
|
"No content published": "Kein Inhalt veröffentlicht",
|
||||||
"No matching location found": "Kein passender Standort gefunden",
|
"No matching location found": "Kein passender Standort gefunden",
|
||||||
@@ -256,6 +260,7 @@
|
|||||||
"Practical information": "Praktische Informationen",
|
"Practical information": "Praktische Informationen",
|
||||||
"Previous": "Früher",
|
"Previous": "Früher",
|
||||||
"Previous victories": "Bisherige Siege",
|
"Previous victories": "Bisherige Siege",
|
||||||
|
"Price": "Preis",
|
||||||
"Price details": "Preisdetails",
|
"Price details": "Preisdetails",
|
||||||
"Proceed to login": "Weiter zum Login",
|
"Proceed to login": "Weiter zum Login",
|
||||||
"Proceed to payment method": "Weiter zur Zahlungsmethode",
|
"Proceed to payment method": "Weiter zur Zahlungsmethode",
|
||||||
@@ -330,6 +335,7 @@
|
|||||||
"Thank you": "Danke",
|
"Thank you": "Danke",
|
||||||
"Theatre": "Theater",
|
"Theatre": "Theater",
|
||||||
"There are no rooms available that match your request": "Es sind keine Zimmer verfügbar, die Ihrer Anfrage entsprechen",
|
"There are no rooms available that match your request": "Es sind keine Zimmer verfügbar, die Ihrer Anfrage entsprechen",
|
||||||
|
"There are no rooms available that match your request.": "Es sind keine Zimmer verfügbar, die Ihrer Anfrage entsprechen.",
|
||||||
"There are no transactions to display": "Es sind keine Transaktionen zum Anzeigen vorhanden",
|
"There are no transactions to display": "Es sind keine Transaktionen zum Anzeigen vorhanden",
|
||||||
"Things nearby HOTEL_NAME": "Dinge in der Nähe von {hotelName}",
|
"Things nearby HOTEL_NAME": "Dinge in der Nähe von {hotelName}",
|
||||||
"To get the member price <span>{amount} {currency}</span>, log in or join when completing the booking.": "Um den Mitgliederpreis von <span>{amount} {currency}</span> zu erhalten, loggen Sie sich ein oder treten Sie Scandic Friends bei, wenn Sie die Buchung abschließen.",
|
"To get the member price <span>{amount} {currency}</span>, log in or join when completing the booking.": "Um den Mitgliederpreis von <span>{amount} {currency}</span> zu erhalten, loggen Sie sich ein oder treten Sie Scandic Friends bei, wenn Sie die Buchung abschließen.",
|
||||||
@@ -341,6 +347,7 @@
|
|||||||
"Transaction date": "Transaktionsdatum",
|
"Transaction date": "Transaktionsdatum",
|
||||||
"Transactions": "Transaktionen",
|
"Transactions": "Transaktionen",
|
||||||
"Transportations": "Transportmittel",
|
"Transportations": "Transportmittel",
|
||||||
|
"TripAdvisor rating": "TripAdvisor-Bewertung",
|
||||||
"Tripadvisor reviews": "{rating} ({count} Bewertungen auf Tripadvisor)",
|
"Tripadvisor reviews": "{rating} ({count} Bewertungen auf Tripadvisor)",
|
||||||
"Type of bed": "Bettentyp",
|
"Type of bed": "Bettentyp",
|
||||||
"Type of room": "Zimmerart",
|
"Type of room": "Zimmerart",
|
||||||
|
|||||||
@@ -106,7 +106,8 @@
|
|||||||
"Disabled booking options text": "Codes, cheques and reward nights aren't available on the new website yet.",
|
"Disabled booking options text": "Codes, cheques and reward nights aren't available on the new website yet.",
|
||||||
"Discard changes": "Discard changes",
|
"Discard changes": "Discard changes",
|
||||||
"Discard unsaved changes?": "Discard unsaved changes?",
|
"Discard unsaved changes?": "Discard unsaved changes?",
|
||||||
"Distance to city centre": "{number} km to city centre",
|
"Distance in km to city centre": "{number} km to city centre",
|
||||||
|
"Distance to city centre": "Distance to city centre",
|
||||||
"Distance to hotel": "Distance to hotel",
|
"Distance to hotel": "Distance to hotel",
|
||||||
"Do you want to start the day with Scandics famous breakfast buffé?": "Do you want to start the day with Scandics famous breakfast buffé?",
|
"Do you want to start the day with Scandics famous breakfast buffé?": "Do you want to start the day with Scandics famous breakfast buffé?",
|
||||||
"Done": "Done",
|
"Done": "Done",
|
||||||
@@ -129,6 +130,7 @@
|
|||||||
"Failed to delete credit card, please try again later.": "Failed to delete credit card, please try again later.",
|
"Failed to delete credit card, please try again later.": "Failed to delete credit card, please try again later.",
|
||||||
"Fair": "Fair",
|
"Fair": "Fair",
|
||||||
"Filter": "Filter",
|
"Filter": "Filter",
|
||||||
|
"Filter by": "Filter by",
|
||||||
"Find booking": "Find booking",
|
"Find booking": "Find booking",
|
||||||
"Find hotels": "Find hotels",
|
"Find hotels": "Find hotels",
|
||||||
"First name": "First name",
|
"First name": "First name",
|
||||||
@@ -221,12 +223,14 @@
|
|||||||
"My pages menu": "My pages menu",
|
"My pages menu": "My pages menu",
|
||||||
"My payment cards": "My payment cards",
|
"My payment cards": "My payment cards",
|
||||||
"My wishes": "My wishes",
|
"My wishes": "My wishes",
|
||||||
|
"Name": "Name",
|
||||||
"Nearby": "Nearby",
|
"Nearby": "Nearby",
|
||||||
"Nearby companies": "Nearby companies",
|
"Nearby companies": "Nearby companies",
|
||||||
"New password": "New password",
|
"New password": "New password",
|
||||||
"Next": "Next",
|
"Next": "Next",
|
||||||
"Nights needed to level up": "Nights needed to level up",
|
"Nights needed to level up": "Nights needed to level up",
|
||||||
"No": "No",
|
"No": "No",
|
||||||
|
"No availability": "No availability",
|
||||||
"No breakfast": "No breakfast",
|
"No breakfast": "No breakfast",
|
||||||
"No content published": "No content published",
|
"No content published": "No content published",
|
||||||
"No matching location found": "No matching location found",
|
"No matching location found": "No matching location found",
|
||||||
@@ -279,6 +283,7 @@
|
|||||||
"Practical information": "Practial information",
|
"Practical information": "Practial information",
|
||||||
"Previous": "Previous",
|
"Previous": "Previous",
|
||||||
"Previous victories": "Previous victories",
|
"Previous victories": "Previous victories",
|
||||||
|
"Price": "Price",
|
||||||
"Price details": "Price details",
|
"Price details": "Price details",
|
||||||
"Price excl VAT": "Price excl VAT",
|
"Price excl VAT": "Price excl VAT",
|
||||||
"Price incl VAT": "Price incl VAT",
|
"Price incl VAT": "Price incl VAT",
|
||||||
@@ -360,6 +365,7 @@
|
|||||||
"Thank you": "Thank you",
|
"Thank you": "Thank you",
|
||||||
"Theatre": "Theatre",
|
"Theatre": "Theatre",
|
||||||
"There are no rooms available that match your request": "There are no rooms available that match your request",
|
"There are no rooms available that match your request": "There are no rooms available that match your request",
|
||||||
|
"There are no rooms available that match your request.": "There are no rooms available that match your request.",
|
||||||
"There are no transactions to display": "There are no transactions to display",
|
"There are no transactions to display": "There are no transactions to display",
|
||||||
"Things nearby HOTEL_NAME": "Things nearby {hotelName}",
|
"Things nearby HOTEL_NAME": "Things nearby {hotelName}",
|
||||||
"To get the member price <span>{amount} {currency}</span>, log in or join when completing the booking.": "To get the member price <span>{amount} {currency}</span>, log in or join when completing the booking.",
|
"To get the member price <span>{amount} {currency}</span>, log in or join when completing the booking.": "To get the member price <span>{amount} {currency}</span>, log in or join when completing the booking.",
|
||||||
@@ -371,6 +377,7 @@
|
|||||||
"Transaction date": "Transaction date",
|
"Transaction date": "Transaction date",
|
||||||
"Transactions": "Transactions",
|
"Transactions": "Transactions",
|
||||||
"Transportations": "Transportations",
|
"Transportations": "Transportations",
|
||||||
|
"TripAdvisor rating": "TripAdvisor rating",
|
||||||
"Tripadvisor reviews": "{rating} ({count} reviews on Tripadvisor)",
|
"Tripadvisor reviews": "{rating} ({count} reviews on Tripadvisor)",
|
||||||
"Type of bed": "Type of bed",
|
"Type of bed": "Type of bed",
|
||||||
"Type of room": "Type of room",
|
"Type of room": "Type of room",
|
||||||
|
|||||||
@@ -98,7 +98,8 @@
|
|||||||
"Disabled booking options text": "Koodit, sekit ja palkintoillat eivät ole vielä saatavilla uudella verkkosivustolla.",
|
"Disabled booking options text": "Koodit, sekit ja palkintoillat eivät ole vielä saatavilla uudella verkkosivustolla.",
|
||||||
"Discard changes": "Hylkää muutokset",
|
"Discard changes": "Hylkää muutokset",
|
||||||
"Discard unsaved changes?": "Hylkäätkö tallentamattomat muutokset?",
|
"Discard unsaved changes?": "Hylkäätkö tallentamattomat muutokset?",
|
||||||
"Distance to city centre": "{number} km Etäisyys kaupunkiin",
|
"Distance in km to city centre": "{number} km Etäisyys kaupunkiin",
|
||||||
|
"Distance to city centre": "Etäisyys kaupungin keskustaan",
|
||||||
"Distance to hotel": "Etäisyys hotelliin",
|
"Distance to hotel": "Etäisyys hotelliin",
|
||||||
"Do you want to start the day with Scandics famous breakfast buffé?": "Haluatko aloittaa päiväsi Scandicsin kuuluisalla aamiaisbuffella?",
|
"Do you want to start the day with Scandics famous breakfast buffé?": "Haluatko aloittaa päiväsi Scandicsin kuuluisalla aamiaisbuffella?",
|
||||||
"Done": "Valmis",
|
"Done": "Valmis",
|
||||||
@@ -120,6 +121,7 @@
|
|||||||
"Failed to delete credit card, please try again later.": "Luottokortin poistaminen epäonnistui, yritä myöhemmin uudelleen.",
|
"Failed to delete credit card, please try again later.": "Luottokortin poistaminen epäonnistui, yritä myöhemmin uudelleen.",
|
||||||
"Fair": "Messukeskus",
|
"Fair": "Messukeskus",
|
||||||
"Filter": "Suodatin",
|
"Filter": "Suodatin",
|
||||||
|
"Filter by": "Suodatusperuste",
|
||||||
"Find booking": "Etsi varaus",
|
"Find booking": "Etsi varaus",
|
||||||
"Find hotels": "Etsi hotelleja",
|
"Find hotels": "Etsi hotelleja",
|
||||||
"First name": "Etunimi",
|
"First name": "Etunimi",
|
||||||
@@ -204,12 +206,14 @@
|
|||||||
"My pages menu": "Omat sivut -valikko",
|
"My pages menu": "Omat sivut -valikko",
|
||||||
"My payment cards": "Minun maksukortit",
|
"My payment cards": "Minun maksukortit",
|
||||||
"My wishes": "Toiveeni",
|
"My wishes": "Toiveeni",
|
||||||
|
"Name": "Nimi",
|
||||||
"Nearby": "Lähistöllä",
|
"Nearby": "Lähistöllä",
|
||||||
"Nearby companies": "Läheiset yritykset",
|
"Nearby companies": "Läheiset yritykset",
|
||||||
"New password": "Uusi salasana",
|
"New password": "Uusi salasana",
|
||||||
"Next": "Seuraava",
|
"Next": "Seuraava",
|
||||||
"Nights needed to level up": "Yöt, joita tarvitaan tasolle",
|
"Nights needed to level up": "Yöt, joita tarvitaan tasolle",
|
||||||
"No": "Ei",
|
"No": "Ei",
|
||||||
|
"No availability": "Ei saatavuutta",
|
||||||
"No breakfast": "Ei aamiaista",
|
"No breakfast": "Ei aamiaista",
|
||||||
"No content published": "Ei julkaistua sisältöä",
|
"No content published": "Ei julkaistua sisältöä",
|
||||||
"No matching location found": "Vastaavaa sijaintia ei löytynyt",
|
"No matching location found": "Vastaavaa sijaintia ei löytynyt",
|
||||||
@@ -258,6 +262,7 @@
|
|||||||
"Practical information": "Käytännön tietoa",
|
"Practical information": "Käytännön tietoa",
|
||||||
"Previous": "Aikaisempi",
|
"Previous": "Aikaisempi",
|
||||||
"Previous victories": "Edelliset voitot",
|
"Previous victories": "Edelliset voitot",
|
||||||
|
"Price": "Hinta",
|
||||||
"Price details": "Hintatiedot",
|
"Price details": "Hintatiedot",
|
||||||
"Proceed to login": "Jatka kirjautumiseen",
|
"Proceed to login": "Jatka kirjautumiseen",
|
||||||
"Proceed to payment method": "Siirry maksutavalle",
|
"Proceed to payment method": "Siirry maksutavalle",
|
||||||
@@ -332,6 +337,7 @@
|
|||||||
"Thank you": "Kiitos",
|
"Thank you": "Kiitos",
|
||||||
"Theatre": "Teatteri",
|
"Theatre": "Teatteri",
|
||||||
"There are no rooms available that match your request": "Pyyntöäsi vastaavia huoneita ei ole saatavilla",
|
"There are no rooms available that match your request": "Pyyntöäsi vastaavia huoneita ei ole saatavilla",
|
||||||
|
"There are no rooms available that match your request.": "Ei huoneita saatavilla, jotka vastaavat pyyntöäsi.",
|
||||||
"There are no transactions to display": "Näytettäviä tapahtumia ei ole",
|
"There are no transactions to display": "Näytettäviä tapahtumia ei ole",
|
||||||
"Things nearby HOTEL_NAME": "Lähellä olevia asioita {hotelName}",
|
"Things nearby HOTEL_NAME": "Lähellä olevia asioita {hotelName}",
|
||||||
"To get the member price <span>{amount} {currency}</span>, log in or join when completing the booking.": "Jäsenhintaan saavat sisäänkirjautuneet tai liittyneet jäsenet.",
|
"To get the member price <span>{amount} {currency}</span>, log in or join when completing the booking.": "Jäsenhintaan saavat sisäänkirjautuneet tai liittyneet jäsenet.",
|
||||||
@@ -343,6 +349,7 @@
|
|||||||
"Transaction date": "Tapahtuman päivämäärä",
|
"Transaction date": "Tapahtuman päivämäärä",
|
||||||
"Transactions": "Tapahtumat",
|
"Transactions": "Tapahtumat",
|
||||||
"Transportations": "Kuljetukset",
|
"Transportations": "Kuljetukset",
|
||||||
|
"TripAdvisor rating": "TripAdvisor-luokitus",
|
||||||
"Tripadvisor reviews": "{rating} ({count} arvostelua TripAdvisorissa)",
|
"Tripadvisor reviews": "{rating} ({count} arvostelua TripAdvisorissa)",
|
||||||
"Type of bed": "Vuodetyyppi",
|
"Type of bed": "Vuodetyyppi",
|
||||||
"Type of room": "Huonetyyppi",
|
"Type of room": "Huonetyyppi",
|
||||||
|
|||||||
@@ -97,7 +97,8 @@
|
|||||||
"Disabled booking options text": "Koder, checks og belønningsnætter er enda ikke tilgjengelige på den nye nettsiden.",
|
"Disabled booking options text": "Koder, checks og belønningsnætter er enda ikke tilgjengelige på den nye nettsiden.",
|
||||||
"Discard changes": "Forkaste endringer",
|
"Discard changes": "Forkaste endringer",
|
||||||
"Discard unsaved changes?": "Forkaste endringer som ikke er lagret?",
|
"Discard unsaved changes?": "Forkaste endringer som ikke er lagret?",
|
||||||
"Distance to city centre": "{number} km til sentrum",
|
"Distance in km to city centre": "{number} km til sentrum",
|
||||||
|
"Distance to city centre": "Avstand til sentrum",
|
||||||
"Distance to hotel": "Avstand til hotell",
|
"Distance to hotel": "Avstand til hotell",
|
||||||
"Do you want to start the day with Scandics famous breakfast buffé?": "Vil du starte dagen med Scandics berømte frokostbuffé?",
|
"Do you want to start the day with Scandics famous breakfast buffé?": "Vil du starte dagen med Scandics berømte frokostbuffé?",
|
||||||
"Done": "Ferdig",
|
"Done": "Ferdig",
|
||||||
@@ -119,6 +120,7 @@
|
|||||||
"Failed to delete credit card, please try again later.": "Kunne ikke slette kredittkortet, prøv igjen senere.",
|
"Failed to delete credit card, please try again later.": "Kunne ikke slette kredittkortet, prøv igjen senere.",
|
||||||
"Fair": "Messe",
|
"Fair": "Messe",
|
||||||
"Filter": "Filter",
|
"Filter": "Filter",
|
||||||
|
"Filter by": "Filtrer etter",
|
||||||
"Find booking": "Finn booking",
|
"Find booking": "Finn booking",
|
||||||
"Find hotels": "Finn hotell",
|
"Find hotels": "Finn hotell",
|
||||||
"First name": "Fornavn",
|
"First name": "Fornavn",
|
||||||
@@ -202,12 +204,14 @@
|
|||||||
"My pages menu": "Mine sider-menyen",
|
"My pages menu": "Mine sider-menyen",
|
||||||
"My payment cards": "Mine betalingskort",
|
"My payment cards": "Mine betalingskort",
|
||||||
"My wishes": "Mine ønsker",
|
"My wishes": "Mine ønsker",
|
||||||
|
"Name": "Navn",
|
||||||
"Nearby": "I nærheten",
|
"Nearby": "I nærheten",
|
||||||
"Nearby companies": "Nærliggende selskaper",
|
"Nearby companies": "Nærliggende selskaper",
|
||||||
"New password": "Nytt passord",
|
"New password": "Nytt passord",
|
||||||
"Next": "Neste",
|
"Next": "Neste",
|
||||||
"Nights needed to level up": "Netter som trengs for å komme opp i nivå",
|
"Nights needed to level up": "Netter som trengs for å komme opp i nivå",
|
||||||
"No": "Nei",
|
"No": "Nei",
|
||||||
|
"No availability": "Ingen tilgjengelighet",
|
||||||
"No breakfast": "Ingen frokost",
|
"No breakfast": "Ingen frokost",
|
||||||
"No content published": "Ingen innhold publisert",
|
"No content published": "Ingen innhold publisert",
|
||||||
"No matching location found": "Fant ingen samsvarende plassering",
|
"No matching location found": "Fant ingen samsvarende plassering",
|
||||||
@@ -256,6 +260,7 @@
|
|||||||
"Practical information": "Praktisk informasjon",
|
"Practical information": "Praktisk informasjon",
|
||||||
"Previous": "Tidligere",
|
"Previous": "Tidligere",
|
||||||
"Previous victories": "Tidligere seire",
|
"Previous victories": "Tidligere seire",
|
||||||
|
"Price": "Pris",
|
||||||
"Price details": "Prisdetaljer",
|
"Price details": "Prisdetaljer",
|
||||||
"Proceed to login": "Fortsett til innlogging",
|
"Proceed to login": "Fortsett til innlogging",
|
||||||
"Proceed to payment method": "Fortsett til betalingsmetode",
|
"Proceed to payment method": "Fortsett til betalingsmetode",
|
||||||
@@ -329,6 +334,7 @@
|
|||||||
"Thank you": "Takk",
|
"Thank you": "Takk",
|
||||||
"Theatre": "Teater",
|
"Theatre": "Teater",
|
||||||
"There are no rooms available that match your request": "Det er ingen tilgjengelige rom som samsvarer med forespørselen din",
|
"There are no rooms available that match your request": "Det er ingen tilgjengelige rom som samsvarer med forespørselen din",
|
||||||
|
"There are no rooms available that match your request.": "Det er ingen rom tilgjengelige som matcher din forespørsel.",
|
||||||
"There are no transactions to display": "Det er ingen transaksjoner å vise",
|
"There are no transactions to display": "Det er ingen transaksjoner å vise",
|
||||||
"Things nearby HOTEL_NAME": "Ting i nærheten av {hotelName}",
|
"Things nearby HOTEL_NAME": "Ting i nærheten av {hotelName}",
|
||||||
"To get the member price <span>{amount} {currency}</span>, log in or join when completing the booking.": "For å få medlemsprisen <span>{amount} {currency}</span>, logg inn eller bli med når du fullfører bestillingen.",
|
"To get the member price <span>{amount} {currency}</span>, log in or join when completing the booking.": "For å få medlemsprisen <span>{amount} {currency}</span>, logg inn eller bli med når du fullfører bestillingen.",
|
||||||
@@ -340,6 +346,7 @@
|
|||||||
"Transaction date": "Transaksjonsdato",
|
"Transaction date": "Transaksjonsdato",
|
||||||
"Transactions": "Transaksjoner",
|
"Transactions": "Transaksjoner",
|
||||||
"Transportations": "Transport",
|
"Transportations": "Transport",
|
||||||
|
"TripAdvisor rating": "TripAdvisor vurdering",
|
||||||
"Tripadvisor reviews": "{rating} ({count} anmeldelser på Tripadvisor)",
|
"Tripadvisor reviews": "{rating} ({count} anmeldelser på Tripadvisor)",
|
||||||
"Type of bed": "Sengtype",
|
"Type of bed": "Sengtype",
|
||||||
"Type of room": "Romtype",
|
"Type of room": "Romtype",
|
||||||
|
|||||||
@@ -97,7 +97,8 @@
|
|||||||
"Disabled booking options text": "Koder, bonuscheckar och belöningsnätter är inte tillgängliga på den nya webbplatsen än.",
|
"Disabled booking options text": "Koder, bonuscheckar och belöningsnätter är inte tillgängliga på den nya webbplatsen än.",
|
||||||
"Discard changes": "Ignorera ändringar",
|
"Discard changes": "Ignorera ändringar",
|
||||||
"Discard unsaved changes?": "Vill du ignorera ändringar som inte har sparats?",
|
"Discard unsaved changes?": "Vill du ignorera ändringar som inte har sparats?",
|
||||||
"Distance to city centre": "{number} km till centrum",
|
"Distance in km to city centre": "{number} km till centrum",
|
||||||
|
"Distance to city centre": "Avstånd till centrum",
|
||||||
"Distance to hotel": "Avstånd till hotell",
|
"Distance to hotel": "Avstånd till hotell",
|
||||||
"Do you want to start the day with Scandics famous breakfast buffé?": "Vill du starta dagen med Scandics berömda frukostbuffé?",
|
"Do you want to start the day with Scandics famous breakfast buffé?": "Vill du starta dagen med Scandics berömda frukostbuffé?",
|
||||||
"Done": "Klar",
|
"Done": "Klar",
|
||||||
@@ -119,6 +120,7 @@
|
|||||||
"Failed to delete credit card, please try again later.": "Det gick inte att ta bort kreditkortet, försök igen senare.",
|
"Failed to delete credit card, please try again later.": "Det gick inte att ta bort kreditkortet, försök igen senare.",
|
||||||
"Fair": "Mässa",
|
"Fair": "Mässa",
|
||||||
"Filter": "Filter",
|
"Filter": "Filter",
|
||||||
|
"Filter by": "Filtrera på",
|
||||||
"Find booking": "Hitta bokning",
|
"Find booking": "Hitta bokning",
|
||||||
"Find hotels": "Hitta hotell",
|
"Find hotels": "Hitta hotell",
|
||||||
"First name": "Förnamn",
|
"First name": "Förnamn",
|
||||||
@@ -202,12 +204,14 @@
|
|||||||
"My pages menu": "Mina sidor meny",
|
"My pages menu": "Mina sidor meny",
|
||||||
"My payment cards": "Mina betalningskort",
|
"My payment cards": "Mina betalningskort",
|
||||||
"My wishes": "Mina önskningar",
|
"My wishes": "Mina önskningar",
|
||||||
|
"Name": "Namn",
|
||||||
"Nearby": "I närheten",
|
"Nearby": "I närheten",
|
||||||
"Nearby companies": "Närliggande företag",
|
"Nearby companies": "Närliggande företag",
|
||||||
"New password": "Nytt lösenord",
|
"New password": "Nytt lösenord",
|
||||||
"Next": "Nästa",
|
"Next": "Nästa",
|
||||||
"Nights needed to level up": "Nätter som behövs för att gå upp i nivå",
|
"Nights needed to level up": "Nätter som behövs för att gå upp i nivå",
|
||||||
"No": "Nej",
|
"No": "Nej",
|
||||||
|
"No availability": "Ingen tillgänglighet",
|
||||||
"No breakfast": "Ingen frukost",
|
"No breakfast": "Ingen frukost",
|
||||||
"No content published": "Inget innehåll publicerat",
|
"No content published": "Inget innehåll publicerat",
|
||||||
"No matching location found": "Ingen matchande plats hittades",
|
"No matching location found": "Ingen matchande plats hittades",
|
||||||
@@ -256,6 +260,7 @@
|
|||||||
"Practical information": "Praktisk information",
|
"Practical information": "Praktisk information",
|
||||||
"Previous": "Föregående",
|
"Previous": "Föregående",
|
||||||
"Previous victories": "Tidigare segrar",
|
"Previous victories": "Tidigare segrar",
|
||||||
|
"Price": "Pris",
|
||||||
"Price details": "Prisdetaljer",
|
"Price details": "Prisdetaljer",
|
||||||
"Proceed to login": "Fortsätt till inloggning",
|
"Proceed to login": "Fortsätt till inloggning",
|
||||||
"Proceed to payment method": "Gå vidare till betalningsmetod",
|
"Proceed to payment method": "Gå vidare till betalningsmetod",
|
||||||
@@ -329,6 +334,7 @@
|
|||||||
"Thank you": "Tack",
|
"Thank you": "Tack",
|
||||||
"Theatre": "Teater",
|
"Theatre": "Teater",
|
||||||
"There are no rooms available that match your request": "Det finns inga tillgängliga rum som matchar din förfrågan",
|
"There are no rooms available that match your request": "Det finns inga tillgängliga rum som matchar din förfrågan",
|
||||||
|
"There are no rooms available that match your request.": "Det finns inga rum tillgängliga som matchar din begäran.",
|
||||||
"There are no transactions to display": "Det finns inga transaktioner att visa",
|
"There are no transactions to display": "Det finns inga transaktioner att visa",
|
||||||
"Things nearby HOTEL_NAME": "Saker i närheten av {hotelName}",
|
"Things nearby HOTEL_NAME": "Saker i närheten av {hotelName}",
|
||||||
"To get the member price <span>{amount} {currency}</span>, log in or join when completing the booking.": "För att få medlemsprisen <span>{amount} {currency}</span>, logga in eller bli medlem när du slutför bokningen.",
|
"To get the member price <span>{amount} {currency}</span>, log in or join when completing the booking.": "För att få medlemsprisen <span>{amount} {currency}</span>, logga in eller bli medlem när du slutför bokningen.",
|
||||||
@@ -340,6 +346,7 @@
|
|||||||
"Transaction date": "Transaktionsdatum",
|
"Transaction date": "Transaktionsdatum",
|
||||||
"Transactions": "Transaktioner",
|
"Transactions": "Transaktioner",
|
||||||
"Transportations": "Transport",
|
"Transportations": "Transport",
|
||||||
|
"TripAdvisor rating": "TripAdvisor-betyg",
|
||||||
"Tripadvisor reviews": "{rating} ({count} recensioner på Tripadvisor)",
|
"Tripadvisor reviews": "{rating} ({count} recensioner på Tripadvisor)",
|
||||||
"Type of bed": "Sängtyp",
|
"Type of bed": "Sängtyp",
|
||||||
"Type of room": "Rumstyp",
|
"Type of room": "Rumstyp",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { metrics } from "@opentelemetry/api"
|
|||||||
|
|
||||||
import * as api from "@/lib/api"
|
import * as api from "@/lib/api"
|
||||||
import { getVerifiedUser } from "@/server/routers/user/query"
|
import { getVerifiedUser } from "@/server/routers/user/query"
|
||||||
import { router, serviceProcedure } from "@/server/trpc"
|
import { router, safeProtectedServiceProcedure } from "@/server/trpc"
|
||||||
|
|
||||||
import { getMembership } from "@/utils/user"
|
import { getMembership } from "@/utils/user"
|
||||||
|
|
||||||
@@ -35,16 +35,14 @@ async function getMembershipNumber(
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const bookingMutationRouter = router({
|
export const bookingMutationRouter = router({
|
||||||
create: serviceProcedure.input(createBookingInput).mutation(async function ({
|
create: safeProtectedServiceProcedure
|
||||||
ctx,
|
.input(createBookingInput)
|
||||||
input,
|
.mutation(async function ({ ctx, input }) {
|
||||||
}) {
|
const accessToken = ctx.session?.token.access_token ?? ctx.serviceToken
|
||||||
const { checkInDate, checkOutDate, hotelId } = input
|
const { checkInDate, checkOutDate, hotelId } = input
|
||||||
|
|
||||||
// TODO: add support for user token OR service token in procedure
|
|
||||||
// then we can fetch membership number if user token exists
|
|
||||||
const loggingAttributes = {
|
const loggingAttributes = {
|
||||||
// membershipNumber: await getMembershipNumber(ctx.session),
|
membershipNumber: await getMembershipNumber(ctx.session),
|
||||||
checkInDate,
|
checkInDate,
|
||||||
checkOutDate,
|
checkOutDate,
|
||||||
hotelId,
|
hotelId,
|
||||||
@@ -59,7 +57,7 @@ export const bookingMutationRouter = router({
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
const headers = {
|
const headers = {
|
||||||
Authorization: `Bearer ${ctx.serviceToken}`,
|
Authorization: `Bearer ${accessToken}`,
|
||||||
}
|
}
|
||||||
|
|
||||||
const apiResponse = await api.post(api.endpoints.v1.Booking.bookings, {
|
const apiResponse = await api.post(api.endpoints.v1.Booking.bookings, {
|
||||||
|
|||||||
Reference in New Issue
Block a user