From b3b26be83c6991e98f827d1e6ab2ab59324f339a Mon Sep 17 00:00:00 2001 From: Pontus Dreij Date: Mon, 14 Oct 2024 12:04:05 +0200 Subject: [PATCH] fix(sw-350): fixed ui-comments for calendar, search and widget --- components/DatePicker/Screen/Desktop.tsx | 5 +- components/DatePicker/Screen/Mobile.tsx | 2 +- .../DatePicker/Screen/desktop.module.css | 5 +- .../DatePicker/Screen/mobile.module.css | 5 +- components/DatePicker/date-picker.module.css | 5 ++ components/DatePicker/index.tsx | 47 +++++++++++++++---- .../FormContent/Search/index.tsx | 11 +---- .../FormContent/Search/search.module.css | 5 -- .../FormContent/Voucher/index.tsx | 8 ++-- .../FormContent/Voucher/voucher.module.css | 3 +- .../FormContent/formContent.module.css | 9 +++- .../Forms/BookingWidget/FormContent/index.tsx | 6 ++- .../Form/Checkbox/checkbox.module.css | 8 +++- .../TempDesignSystem/Form/Checkbox/index.tsx | 5 +- .../components/checkbox/index.ts | 0 types/components/datepicker.ts | 3 +- 16 files changed, 80 insertions(+), 47 deletions(-) rename components/TempDesignSystem/Form/Checkbox/checkbox.ts => types/components/checkbox/index.ts (100%) diff --git a/components/DatePicker/Screen/Desktop.tsx b/components/DatePicker/Screen/Desktop.tsx index db290137e..e8eff756f 100644 --- a/components/DatePicker/Screen/Desktop.tsx +++ b/components/DatePicker/Screen/Desktop.tsx @@ -60,10 +60,9 @@ export default function DatePickerDesktop({ lang={lang} locale={locale} mode="range" - numberOfMonths={2} - onSelect={handleOnSelect} + onDayClick={(day) => handleOnSelect(day)} pagedNavigation - required + required={false} selected={selectedDate} startMonth={currentDate} weekStartsOn={1} diff --git a/components/DatePicker/Screen/Mobile.tsx b/components/DatePicker/Screen/Mobile.tsx index 3d367d995..a91176b93 100644 --- a/components/DatePicker/Screen/Mobile.tsx +++ b/components/DatePicker/Screen/Mobile.tsx @@ -78,7 +78,7 @@ export default function DatePickerMobile({ mode="range" /** Showing full year or what's left of it */ numberOfMonths={12} - onSelect={handleOnSelect} + onDayClick={(day) => handleOnSelect(day)} required selected={selectedDate} startMonth={startMonth} diff --git a/components/DatePicker/Screen/desktop.module.css b/components/DatePicker/Screen/desktop.module.css index afbb286a7..aa02537a5 100644 --- a/components/DatePicker/Screen/desktop.module.css +++ b/components/DatePicker/Screen/desktop.module.css @@ -47,8 +47,8 @@ td.rangeStart[aria-selected="true"] button.dayButton:hover { } td.rangeEnd[aria-selected="true"]:not([data-outside="true"]) button.dayButton, -td.rangeStart[aria-selected="true"]:not([data-outside="true"]) - button.dayButton { +td.rangeStart[aria-selected="true"]:not([data-outside="true"]) button.dayButton, +td.day[aria-selected="true"] button.dayButton { background: var(--Primary-Light-On-Surface-Accent); border: none; color: var(--Base-Button-Inverted-Fill-Normal); @@ -75,6 +75,7 @@ td.rangeMiddle[aria-selected="true"] button.dayButton { background: var(--Base-Background-Primary-Normal); border: none; border-radius: 0; + color: var(--UI-Text-High-contrast); } td.day[data-disabled="true"], diff --git a/components/DatePicker/Screen/mobile.module.css b/components/DatePicker/Screen/mobile.module.css index 4f820fd5f..ef3f97ca0 100644 --- a/components/DatePicker/Screen/mobile.module.css +++ b/components/DatePicker/Screen/mobile.module.css @@ -113,8 +113,8 @@ td.rangeStart[aria-selected="true"] button.dayButton:hover { } td.rangeEnd[aria-selected="true"]:not([data-outside="true"]) button.dayButton, -td.rangeStart[aria-selected="true"]:not([data-outside="true"]) - button.dayButton { +td.rangeStart[aria-selected="true"]:not([data-outside="true"]) button.dayButton, +td.day[aria-selected="true"] button.dayButton { background: var(--Primary-Light-On-Surface-Accent); border: none; color: var(--Base-Button-Inverted-Fill-Normal); @@ -141,6 +141,7 @@ td.rangeMiddle[aria-selected="true"] button.dayButton { background: var(--Base-Background-Primary-Normal); border: none; border-radius: 0; + color: var(--UI-Text-High-contrast); } td.day[data-disabled="true"], diff --git a/components/DatePicker/date-picker.module.css b/components/DatePicker/date-picker.module.css index b11ab3b77..b2e23cd41 100644 --- a/components/DatePicker/date-picker.module.css +++ b/components/DatePicker/date-picker.module.css @@ -22,6 +22,11 @@ .hideWrapper { background-color: var(--Main-Grey-White); + display: none; +} + +.container[data-isopen="true"] .hideWrapper { + display: block; } @media screen and (max-width: 1366px) { diff --git a/components/DatePicker/index.tsx b/components/DatePicker/index.tsx index 586da5208..803f01e1b 100644 --- a/components/DatePicker/index.tsx +++ b/components/DatePicker/index.tsx @@ -14,8 +14,6 @@ import DatePickerMobile from "./Screen/Mobile" import styles from "./date-picker.module.css" -import type { DateRange } from "react-day-picker" - import type { DatePickerFormProps } from "@/types/components/datepicker" const locales = { @@ -26,26 +24,54 @@ const locales = { [Lang.sv]: sv, } -export default function DatePickerForm({ name = "date" }: DatePickerFormProps) { +export default function DatePickerForm({ + name = "date", + onToggleOpen, +}: DatePickerFormProps) { const lang = useLang() const [isOpen, setIsOpen] = useState(false) const selectedDate = useWatch({ name }) const { register, setValue } = useFormContext() const ref = useRef(null) + const [isSelectingFrom, setIsSelectingFrom] = useState(true) + function close() { setIsOpen(false) + onToggleOpen && onToggleOpen(false) } function handleOnClick() { - setIsOpen((prevIsOpen) => !prevIsOpen) + setIsOpen((prevIsOpen) => { + const newState = !prevIsOpen + onToggleOpen && onToggleOpen(newState) + return newState + }) } - function handleSelectDate(selected: DateRange) { - setValue(name, { - from: dt(selected.from).format("YYYY-MM-DD"), - to: dt(selected.to).format("YYYY-MM-DD"), - }) + function handleSelectDate(selected: Date) { + if (isSelectingFrom) { + setValue(name, { + from: dt(selected).format("YYYY-MM-DD"), + to: undefined, + }) + setIsSelectingFrom(false) + } else { + const fromDate = dt(selectedDate.from) + const toDate = dt(selected) + if (toDate.isAfter(fromDate)) { + setValue(name, { + from: selectedDate.from, + to: toDate.format("YYYY-MM-DD"), + }) + setIsSelectingFrom(true) + } else { + setValue(name, { + from: selectedDate.from, + to: undefined, + }) + } + } } useEffect(() => { @@ -53,13 +79,14 @@ export default function DatePickerForm({ name = "date" }: DatePickerFormProps) { const target = evt.target as HTMLElement if (ref.current && target && !ref.current.contains(target)) { setIsOpen(false) + onToggleOpen && onToggleOpen(false) } } document.body.addEventListener("click", handleClickOutside) return () => { document.body.removeEventListener("click", handleClickOutside) } - }, [setIsOpen]) + }, [setIsOpen, onToggleOpen]) const selectedFromDate = dt(selectedDate.from) .locale(lang) diff --git a/components/Forms/BookingWidget/FormContent/Search/index.tsx b/components/Forms/BookingWidget/FormContent/Search/index.tsx index 6b8546e5b..f7cdae62a 100644 --- a/components/Forms/BookingWidget/FormContent/Search/index.tsx +++ b/components/Forms/BookingWidget/FormContent/Search/index.tsx @@ -48,15 +48,6 @@ export default function Search({ locations }: SearchProps) { dispatch({ type: ActionType.CLEAR_HISTORY_LOCATIONS }) } - function handleOnBlur() { - if (!value && state.searchData?.name) { - setValue(name, state.searchData.name) - // Always need to manually trigger - // revalidation when setting value r-h-f - trigger() - } - } - function handleOnChange( evt: FormEvent | ChangeEvent ) { @@ -67,6 +58,7 @@ export default function Search({ locations }: SearchProps) { type: ActionType.SEARCH_LOCATIONS, }) } else { + console.log("clear") dispatch({ type: ActionType.CLEAR_SEARCH_LOCATIONS }) } } @@ -156,7 +148,6 @@ export default function Search({ locations }: SearchProps) { }), ...register(name, { onBlur: function () { - handleOnBlur() closeMenu() }, onChange: handleOnChange, diff --git a/components/Forms/BookingWidget/FormContent/Search/search.module.css b/components/Forms/BookingWidget/FormContent/Search/search.module.css index d1acb79be..0b9ecfa8c 100644 --- a/components/Forms/BookingWidget/FormContent/Search/search.module.css +++ b/components/Forms/BookingWidget/FormContent/Search/search.module.css @@ -24,8 +24,3 @@ p { color: var(--UI-Text-Active); } - -.container:hover:has(input:not(:active, :focus, :focus-within)) - input::-webkit-search-cancel-button { - display: none; -} diff --git a/components/Forms/BookingWidget/FormContent/Voucher/index.tsx b/components/Forms/BookingWidget/FormContent/Voucher/index.tsx index 0a9841a43..30eef6e21 100644 --- a/components/Forms/BookingWidget/FormContent/Voucher/index.tsx +++ b/components/Forms/BookingWidget/FormContent/Voucher/index.tsx @@ -1,7 +1,7 @@ "use client" import { useIntl } from "react-intl" -import Body from "@/components/TempDesignSystem/Text/Body" +import Checkbox from "@/components/TempDesignSystem/Form/Checkbox" import Caption from "@/components/TempDesignSystem/Text/Caption" import { Tooltip } from "@/components/TempDesignSystem/Tooltip" @@ -50,17 +50,17 @@ export default function Voucher() { >
diff --git a/components/Forms/BookingWidget/FormContent/Voucher/voucher.module.css b/components/Forms/BookingWidget/FormContent/Voucher/voucher.module.css index 0deccbb43..694134cd8 100644 --- a/components/Forms/BookingWidget/FormContent/Voucher/voucher.module.css +++ b/components/Forms/BookingWidget/FormContent/Voucher/voucher.module.css @@ -68,7 +68,7 @@ .options { flex-direction: column; max-width: 190px; - gap: 0; + gap: var(--Spacing-x-half); } .vouchers:hover, .option:hover { @@ -76,6 +76,7 @@ } .optionsContainer { flex-direction: row; + align-items: center; } .checkboxVoucher { display: none; diff --git a/components/Forms/BookingWidget/FormContent/formContent.module.css b/components/Forms/BookingWidget/FormContent/formContent.module.css index a58bb1062..fde3b65c8 100644 --- a/components/Forms/BookingWidget/FormContent/formContent.module.css +++ b/components/Forms/BookingWidget/FormContent/formContent.module.css @@ -27,6 +27,7 @@ .rooms, .vouchers, .when, + .whenOpen, .where { background-color: var(--Base-Background-Primary-Normal); border-radius: var(--Corner-radius-Medium); @@ -34,7 +35,8 @@ .rooms, .vouchers, - .when { + .when, + .whenOpen { padding: var(--Spacing-x1) var(--Spacing-x-one-and-half); } @@ -61,6 +63,7 @@ .rooms, .when, + .whenOpen, .where { width: 100%; } @@ -71,12 +74,14 @@ } .rooms, - .when { + .when, + .whenOpen { padding: var(--Spacing-x1) var(--Spacing-x-one-and-half); border-radius: var(--Corner-radius-Small); } .when:hover, .rooms:hover, + .whenOpen, .rooms:has(.input:active, .input:focus, .input:focus-within) { background-color: var(--Base-Surface-Primary-light-Hover-alt); } diff --git a/components/Forms/BookingWidget/FormContent/index.tsx b/components/Forms/BookingWidget/FormContent/index.tsx index af9ba594d..c8173624d 100644 --- a/components/Forms/BookingWidget/FormContent/index.tsx +++ b/components/Forms/BookingWidget/FormContent/index.tsx @@ -1,4 +1,5 @@ "use client" +import { useState } from "react" import { useWatch } from "react-hook-form" import { useIntl } from "react-intl" @@ -22,6 +23,7 @@ export default function FormContent({ formId, }: BookingWidgetFormContentProps) { const intl = useIntl() + const [isDatePickerOpen, setIsDatePickerOpen] = useState(false) const selectedDate = useWatch({ name: "date" }) const rooms = intl.formatMessage({ id: "Guests & Rooms" }) @@ -35,14 +37,14 @@ export default function FormContent({
-
+
{intl.formatMessage( { id: "booking.nights" }, { totalNights: nights } )} - +