From a35e0714be630b448bd8bc074452e27556c10a68 Mon Sep 17 00:00:00 2001 From: "k.tada" Date: Mon, 9 Sep 2024 16:16:53 +0900 Subject: [PATCH 01/15] feat(calendar): today design --- packages/styles/bases/calendar.css.ts | 5 +++ .../base/calendar/components/calendar.tsx | 32 ++++++++++++++----- .../calendar/stories/calendar.stories.tsx | 26 +++++++++++++++ .../date-picker/components/date-picker.tsx | 3 ++ .../stories/date-picker.stories.tsx | 23 +++++++++++++ .../components/date-range-picker.tsx | 4 +++ .../stories/date-range-picker.stories.tsx | 29 +++++++++++++++++ 7 files changed, 114 insertions(+), 8 deletions(-) diff --git a/packages/styles/bases/calendar.css.ts b/packages/styles/bases/calendar.css.ts index 08422e960..36a188499 100644 --- a/packages/styles/bases/calendar.css.ts +++ b/packages/styles/bases/calendar.css.ts @@ -125,3 +125,8 @@ export const calendarItemInteractiveStyle = style([ }, }, ]); +export const calendarItemInteractiveTodayStyle = style({ + border: `1px solid ${THEME.color.green[800]}`, + borderRadius: "50%", + boxSizing: "border-box", +}); diff --git a/packages/wiz-ui-react/src/components/base/calendar/components/calendar.tsx b/packages/wiz-ui-react/src/components/base/calendar/components/calendar.tsx index 7fc7ac2a0..558d6edd7 100644 --- a/packages/wiz-ui-react/src/components/base/calendar/components/calendar.tsx +++ b/packages/wiz-ui-react/src/components/base/calendar/components/calendar.tsx @@ -93,6 +93,7 @@ type Props = BaseProps & { currentMonth?: Date; activeDates?: DateStatus[]; filledWeeks?: boolean; + _today?: Date; onClickDate?: (selectedValue: Date) => void; /** * @description 日付が無効かどうかを判定する関数です。無効な日付はクリック不可になります。 @@ -108,6 +109,7 @@ const Calendar: FC = ({ currentMonth = new Date(), activeDates, filledWeeks, + _today, onClickDate, disabledDate, }) => { @@ -126,6 +128,18 @@ const Calendar: FC = ({ }); } + function getItemDate(item: CalendarDataItem) { + return new Date( + currentMonth.getFullYear(), + currentMonth.getMonth(), + Number(item.label) + ); + } + + function getIsToday(a: Date) { + return a.toDateString() === (_today || new Date()).toDateString(); + } + function getItemStyleState( item: CalendarDataItem, dateStatus?: DateStatus @@ -139,13 +153,7 @@ const Calendar: FC = ({ if (item.isOutOfCurrentMonth) { return; } - onClickDate?.( - new Date( - currentMonth.getFullYear(), - currentMonth.getMonth(), - Number(item.label) - ) - ); + onClickDate?.(getItemDate(item)); } const calendarItems = calendarData.map((weekDateItems) => { return weekDateItems.map((item) => { @@ -214,6 +222,7 @@ const Calendar: FC = ({ const item = adjacent.current.item; const itemStyle = adjacent.current.itemStyle; const activeDateStatus = adjacent.current.activeDateStatus; + const isToday = getIsToday(getItemDate(item)); return ( = ({ adjacent.current.itemStyle === "primary" )} > -
+
{item.label}
diff --git a/packages/wiz-ui-react/src/components/base/calendar/stories/calendar.stories.tsx b/packages/wiz-ui-react/src/components/base/calendar/stories/calendar.stories.tsx index 7b1d22f42..32dcd8302 100644 --- a/packages/wiz-ui-react/src/components/base/calendar/stories/calendar.stories.tsx +++ b/packages/wiz-ui-react/src/components/base/calendar/stories/calendar.stories.tsx @@ -107,3 +107,29 @@ export const FilledWeeks: Story = { }, }, }; + +export const Today: Story = { + ...Template, + args: { + currentMonth: new Date("2023-03"), + _today: new Date("2023-03-05"), + }, +}; + +export const DisabledToday: Story = { + ...Template, + args: { + currentMonth: new Date("2023-03"), + _today: new Date("2023-03-05"), + disabledDate: (date: Date) => date.getDate() === 5, + }, +}; + +export const SelectedToday: Story = { + ...Template, + args: { + currentMonth: new Date("2023-03"), + _today: new Date("2023-03-05"), + activeDates: [{ date: new Date("2023-03-05"), state: "primary" }], + }, +}; diff --git a/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx b/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx index 8455dcbee..8d302636f 100644 --- a/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx +++ b/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx @@ -26,6 +26,7 @@ type Props = BaseProps & { disabled?: boolean; error?: boolean; isDirectionFixed?: boolean; + _today?: Date; onChangeDate: (selectedValue: Date | null) => void; /** * @description 日付が無効かどうかを判定する関数です。無効な日付はクリック不可になります。 @@ -60,6 +61,7 @@ const DatePicker: FC = ({ formatYear = (year) => `${year}`, formatDate = (date) => `${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日`, + _today, }: Props) => { const [isOpen, setIsOpen] = useState(false); const cancelButtonVisible = !disabled && !!date; @@ -243,6 +245,7 @@ const DatePicker: FC = ({ onClickDate={(date) => onChangeDate(date)} currentMonth={currentMonth} filledWeeks + _today={_today || new Date()} disabledDate={disabledDate} /> diff --git a/packages/wiz-ui-react/src/components/base/inputs/date-picker/stories/date-picker.stories.tsx b/packages/wiz-ui-react/src/components/base/inputs/date-picker/stories/date-picker.stories.tsx index 077bd642e..74bfccacc 100644 --- a/packages/wiz-ui-react/src/components/base/inputs/date-picker/stories/date-picker.stories.tsx +++ b/packages/wiz-ui-react/src/components/base/inputs/date-picker/stories/date-picker.stories.tsx @@ -98,3 +98,26 @@ export const Playground: Story = { return ; }, }; + +export const Today: Story = { + args: { + date: new Date(2023, 0, 1), + _today: new Date("2023-01-15"), + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + canvas.getByLabelText(ARIA_LABELS.DATE_PICKER_INPUT).click(); + }, +}; + +export const DisabledToday: Story = { + args: { + date: new Date(2023, 0, 1), + disabledDate: (date: Date) => date.getDate() >= 10 && date.getDate() < 17, + _today: new Date("2023-01-15"), + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + canvas.getByLabelText(ARIA_LABELS.DATE_PICKER_INPUT).click(); + }, +}; diff --git a/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx b/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx index 17f3b648d..fe41c21ec 100644 --- a/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx +++ b/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx @@ -40,6 +40,7 @@ type Props = BaseProps & { selectBoxValue?: string; isDirectionFixed?: boolean; error?: boolean; + _today?: Date; onChangeDateRange: (dateRange: DateRange) => void; onChangeSelectBoxValue?: (value: string) => void; disabledDate?: (date: Date) => boolean; @@ -60,6 +61,7 @@ const DateRangePicker: FC = ({ selectBoxValue, isDirectionFixed = false, error, + _today, onChangeDateRange, onChangeSelectBoxValue, disabledDate = () => false, @@ -316,6 +318,7 @@ const DateRangePicker: FC = ({ onClickDate={onClickDate} disabledDate={disabledDate} filledWeeks={true} + _today={_today || new Date()} />
@@ -345,6 +348,7 @@ const DateRangePicker: FC = ({ onClickDate={onClickDate} disabledDate={disabledDate} filledWeeks={true} + _today={_today || new Date()} />
diff --git a/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/stories/date-range-picker.stories.tsx b/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/stories/date-range-picker.stories.tsx index 43ef9505e..3ca2c245a 100644 --- a/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/stories/date-range-picker.stories.tsx +++ b/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/stories/date-range-picker.stories.tsx @@ -185,3 +185,32 @@ export const Playground: Story = { ); }, }; + +export const Today: Story = { + args: { + dateRange: { + start: new Date("2021-01-15"), + end: new Date("2021-02-15"), + }, + _today: new Date("2021-01-28"), + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + canvas.getByLabelText(ARIA_LABELS.RANGE_DATE_PICKER_INPUT).click(); + }, +}; + +export const DisabledWithToday: Story = { + args: { + dateRange: { + start: new Date("2021-01-01"), + end: new Date("2021-01-31"), + }, + disabledDate: (date: Date) => date.getDate() >= 10 && date.getDate() < 17, + _today: new Date("2021-01-15"), + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + canvas.getByLabelText(ARIA_LABELS.RANGE_DATE_PICKER_INPUT).click(); + }, +}; From 1666ab0cc913934b114455f1c6782543432c11a2 Mon Sep 17 00:00:00 2001 From: "k.tada" Date: Tue, 10 Sep 2024 14:44:50 +0900 Subject: [PATCH 02/15] =?UTF-8?q?feat(calendar):=20=E3=82=AD=E3=83=A3?= =?UTF-8?q?=E3=83=B3=E3=82=BB=E3=83=AB=E3=83=BB=E9=81=A9=E7=94=A8=E3=83=9C?= =?UTF-8?q?=E3=82=BF=E3=83=B3=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/constants/component/aria-label.ts | 2 + .../date-picker/components/date-picker.tsx | 35 ++++++++++++++++-- .../components/date-range-picker.tsx | 37 +++++++++++++++---- 3 files changed, 63 insertions(+), 11 deletions(-) diff --git a/packages/constants/component/aria-label.ts b/packages/constants/component/aria-label.ts index 374553272..6e982a5a7 100644 --- a/packages/constants/component/aria-label.ts +++ b/packages/constants/component/aria-label.ts @@ -36,4 +36,6 @@ export const ARIA_LABELS = { FULL_MODAL_VIEW: { CLOSE: "モーダルを閉じる", }, + APPLY: "適用", + CANCEL: "キャンセル", } as const; diff --git a/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx b/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx index 8d302636f..23f868bcd 100644 --- a/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx +++ b/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx @@ -8,7 +8,13 @@ import { import clsx from "clsx"; import { FC, KeyboardEvent, useContext, useRef, useState } from "react"; -import { WizCalendar, WizPopup, WizText } from "@/components"; +import { + WizCalendar, + WizDivider, + WizPopup, + WizText, + WizTextButton, +} from "@/components"; import { WizIcon } from "@/components/base/icon"; import { WizHStack, WizVStack } from "@/components/base/stack"; import { FormControlContext } from "@/components/custom/form/components/form-control-context"; @@ -75,6 +81,7 @@ const DatePicker: FC = ({ ) ); }; + const [tempDate, setTempDate] = useState(date); const handleKeyDown = (e: KeyboardEvent) => { e.preventDefault(); @@ -110,6 +117,17 @@ const DatePicker: FC = ({ return "default"; })(); const wrapperButtonRef = useRef(null); + + const onClose = () => { + setTempDate(date); + setIsOpen(false); + }; + + const onSubmit = () => { + onChangeDate(tempDate); + setIsOpen(false); + }; + return ( <> setIsOpen(false)} + onClose={onClose} direction="bottomLeft" isDirectionFixed={isDirectionFixed} anchorElement={wrapperButtonRef} @@ -240,14 +258,23 @@ const DatePicker: FC = ({ onChangeDate(date)} + onClickDate={(date) => setTempDate(date)} currentMonth={currentMonth} filledWeeks _today={_today || new Date()} disabledDate={disabledDate} /> + + + + {ARIA_LABELS.CANCEL} + + + {ARIA_LABELS.APPLY} + + diff --git a/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx b/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx index fe41c21ec..e053c9514 100644 --- a/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx +++ b/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx @@ -15,6 +15,7 @@ import { import { WizCalendar, WizCard, + WizDivider, WizHStack, WizICalendar, WizICancel, @@ -24,6 +25,7 @@ import { WizIExpandMore, WizIcon, WizPopup, + WizTextButton, } from "@/components"; import { DateStatus } from "@/components/base/calendar/components/types"; import { FormControlContext } from "@/components/custom/form/components/form-control-context"; @@ -70,6 +72,7 @@ const DateRangePicker: FC = ({ }: Props) => { const [isOpen, setIsOpen] = useState(false); const [isSelectBoxOpen, setIsSelectBoxOpen] = useState(false); + const [tempDateRange, setTempDateRange] = useState(dateRange); const cancelButtonVisible = !disabled && !!dateRange.start; const [rightCalendarDate, setRightCalendarDate] = useState( (() => { @@ -112,7 +115,7 @@ const DateRangePicker: FC = ({ date, state, }); - const [start, end] = [dateRange.start, dateRange.end]; + const [start, end] = [tempDateRange.start, tempDateRange.end]; if (start && end) { const secondaries: DateStatus[] = []; const tomorrowOfStart = new Date(start); @@ -130,7 +133,7 @@ const DateRangePicker: FC = ({ return [getDateStatus(start, "primary")]; } return []; - }, [dateRange]); + }, [tempDateRange]); const handleKeyDown = (e: KeyboardEvent) => { e.preventDefault(); @@ -146,18 +149,18 @@ const DateRangePicker: FC = ({ const onClickDate = useCallback( (date: Date) => { - const [start, end] = [dateRange.start, dateRange.end]; + const [start, end] = [tempDateRange.start, tempDateRange.end]; if (start && end) { - onChangeDateRange({ start: date, end: null }); + setTempDateRange({ start: date, end: null }); } else if (start) { const [nextStart, nextEnd] = start > date ? [date, start] : [start, date]; - onChangeDateRange({ start: nextStart, end: nextEnd }); + setTempDateRange({ start: nextStart, end: nextEnd }); } else { - onChangeDateRange({ start: date, end: null }); + setTempDateRange({ start: date, end: null }); } }, - [dateRange, onChangeDateRange] + [tempDateRange] ); const selectedOption = (() => { @@ -184,6 +187,17 @@ const DateRangePicker: FC = ({ if (isOpen && !disabled) return "active"; return "default"; })(); + + const onClose = () => { + setTempDateRange(dateRange); + setIsOpen(false); + }; + + const onSubmit = () => { + onChangeDateRange(tempDateRange); + setIsOpen(false); + }; + return ( <>
@@ -107,10 +107,10 @@ + + + + {{ ARIA_LABELS.CANCEL }} + + + {{ ARIA_LABELS.APPLY }} + +
@@ -148,11 +157,13 @@ import { PropType, computed, inject, ref } from "vue"; import { WizCalendar, + WizDivider, WizHStack, WizIcon, WizPopup, WizPopupContainer, WizText, + WizTextButton, WizVStack, } from "@/components"; import { @@ -248,6 +259,8 @@ const currentMonth = ref(defaultCurrentMonth); const setIsOpen = (value: boolean) => emit("update:isOpen", value); const onClickCancel = () => emit("update:modelValue", null); +const tempDate = ref(props.modelValue); + const clickToNextMonth = (e: KeyboardEvent | MouseEvent) => { e.preventDefault(); const setDateTime = new Date( @@ -308,9 +321,19 @@ const borderState = computed(() => { const variant = computed(() => { if (props.disabled) return "disabled"; - if (calendarValue.value) return "selected"; + if (tempDate.value) return "selected"; return "default"; }); -const handleClickCalendar = (date: Date) => (calendarValue.value = date); +const handleClickCalendar = (date: Date) => (tempDate.value = date); + +const onClose = () => { + tempDate.value = calendarValue.value; + setIsOpen(false); +}; + +const onSubmit = () => { + calendarValue.value = tempDate.value; + setIsOpen(false); +}; diff --git a/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.vue b/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.vue index 148348dbb..b59a9a196 100644 --- a/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.vue +++ b/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.vue @@ -49,7 +49,7 @@ @@ -146,6 +146,15 @@ /> + + + + {{ ARIA_LABELS.CANCEL }} + + + {{ ARIA_LABELS.APPLY }} + + @@ -161,6 +170,7 @@ import { computed, inject, PropType, ref } from "vue"; import { WizCalendar, WizCard, + WizDivider, WizHStack, WizICalendar, WizICancel, @@ -171,6 +181,7 @@ import { WizIExpandMore, WizPopup, WizPopupContainer, + WizTextButton, } from "@/components"; import { useClickOutside } from "@/hooks/use-click-outside"; import { formControlKey } from "@/hooks/use-form-control-provider"; @@ -272,6 +283,8 @@ const setIsOpen = (value: boolean) => emit("update:isOpen", value); const onClickCancel = () => emit("update:modelValue", { start: null, end: null }); +const tempDateRange = ref(props.modelValue); + const moveToNextMonth = (e: KeyboardEvent | MouseEvent) => { e.preventDefault(); rightCalendarDate.value = new Date( @@ -289,7 +302,7 @@ const selectedDates = computed(() => { date, state, }); - const [start, end] = [props.modelValue.start, props.modelValue.end]; + const [start, end] = [tempDateRange.value.start, tempDateRange.value.end]; if (start && end) { const secondaries: DateStatus[] = []; const tomorrowOfStart = new Date(start); @@ -310,17 +323,17 @@ const selectedDates = computed(() => { }); const handleDayClick = (date: Date) => { - const [start, end] = [props.modelValue.start, props.modelValue.end]; + const [start, end] = [tempDateRange.value.start, tempDateRange.value.end]; if (start && end) { - emit("update:modelValue", { start: date, end: null }); + tempDateRange.value = { start: date, end: null }; return; } if (start) { const [nextStart, nextEnd] = start > date ? [date, start] : [start, date]; - emit("update:modelValue", { start: nextStart, end: nextEnd }); + tempDateRange.value = { start: nextStart, end: nextEnd }; return; } - emit("update:modelValue", { start: date, end: null }); + tempDateRange.value = { start: date, end: null }; }; const toggleSelectBoxOpen = () => { @@ -353,4 +366,14 @@ const borderState = computed(() => { if (props.isOpen && !props.disabled) return "active"; return "default"; }); + +const onClose = () => { + tempDateRange.value = props.modelValue; + setIsOpen(false); +}; + +const onSubmit = () => { + emit("update:modelValue", tempDateRange.value); + setIsOpen(false); +}; From b7f433774f2e734f3ca6303a4c1bedb255293e18 Mon Sep 17 00:00:00 2001 From: "k.tada" Date: Wed, 11 Sep 2024 18:45:24 +0900 Subject: [PATCH 07/15] =?UTF-8?q?test(date-picker,date-range-picker):=20?= =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=81=8C=E8=90=BD=E3=81=A1=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=81=9F=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inputs/date-picker/date-picker.stories.ts | 22 +++++++++++ .../date-range-picker.stories.ts | 37 +++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.stories.ts b/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.stories.ts index b43b552ff..d023c2843 100644 --- a/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.stories.ts +++ b/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.stories.ts @@ -259,6 +259,7 @@ Test.play = async ({ canvasElement }) => { // その月の15日を選択 const body = within(canvasElement.ownerDocument.body); + const initialDate = new Date(date.getFullYear(), date.getMonth(), 1); const clickDate = new Date(date.getFullYear(), date.getMonth(), 15); const pastClickDate = new Date(date.getFullYear(), date.getMonth() - 1, 15); const clickDateEl = body.getByLabelText(_formatDateJp(clickDate)); @@ -270,11 +271,24 @@ Test.play = async ({ canvasElement }) => { `${_formatDateJp(clickDate)}-選択済み` ) ); + + // クリックした段階ではまだInputに反映されていないこと + await waitFor(() => + expect(button.textContent).toBe(_formatDateJp(initialDate)) + ); + + // 適用ボタンをクリック + const applyButton = body.getByText(ARIA_LABELS.APPLY); + await userEvent.click(applyButton); + // Input内が選択した日付になることを確認 await waitFor(() => expect(button.textContent).toBe(_formatDateJp(clickDate)) ); + // カレンダー再オープン + await userEvent.click(button); + // 月セレクターのPrevを1回押して操作月を1ヶ月前にする const monthSelectorPrev = body.getByLabelText( ARIA_LABELS.MONTH_SELECTOR_PREV @@ -296,6 +310,14 @@ Test.play = async ({ canvasElement }) => { ) ); + // Input内が選択した日付になることを確認 + await waitFor(() => + expect(button.textContent).toBe(_formatDateJp(new Date(clickDate))) + ); + + // 適用ボタンをクリック + await userEvent.click(applyButton); + // Input内が選択した日付になることを確認 await waitFor(() => expect(button.textContent).toBe(_formatDateJp(new Date(pastClickDate))) diff --git a/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.stories.ts b/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.stories.ts index 94d10b31c..e6e2d0b4e 100644 --- a/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.stories.ts +++ b/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.stories.ts @@ -460,6 +460,16 @@ Test.play = async ({ canvasElement }) => { //左のCalenderから15日を選択 const body = within(canvasElement.ownerDocument.body); + const initialLeftDate = new Date( + intermediateDate.getFullYear(), + intermediateDate.getMonth(), + 0 + ); + const initialRightDate = new Date( + intermediateDate.getFullYear(), + intermediateDate.getMonth() + 1, + 0 + ); const leftClickDate = new Date( intermediateDate.getFullYear(), intermediateDate.getMonth() - 1, @@ -474,11 +484,26 @@ Test.play = async ({ canvasElement }) => { `${_formatDateJp(leftClickDate)}-選択済み` ) ); + + // クリックした段階ではまだInputに反映されていないこと + await waitFor(() => + expect(button.textContent).toBe( + `${_formatDateJp(initialLeftDate)}-${_formatDateJp(initialRightDate)}` + ) + ); + + // 適用ボタンをクリック + const applyButton = body.getByText(ARIA_LABELS.APPLY); + await userEvent.click(applyButton); + // Input内が選択した日付になることを確認 await waitFor(() => expect(button.textContent).toBe(_formatDateJp(leftClickDate) + "-終了日") ); + // カレンダー再オープン + await userEvent.click(button); + // 右のCalenderから15日を選択 const rightClickDate = new Date( intermediateDate.getFullYear(), @@ -494,12 +519,24 @@ Test.play = async ({ canvasElement }) => { `${_formatDateJp(rightClickDate)}-選択済み` ) ); + // クリックした段階ではまだInputに反映されていないこと + await waitFor(() => + expect(button.textContent).toBe(_formatDateJp(leftClickDate) + "-終了日") + ); + + // 適用ボタンをクリック + await userEvent.click(applyButton); + // Input内が選択した日付になることを確認 await waitFor(() => expect(button.textContent?.replace(/\s+/g, "")).toBe( `${_formatDateJp(leftClickDate)}-${_formatDateJp(rightClickDate)}` ) ); + + // カレンダー再オープン + await userEvent.click(button); + // data-is-selectedなボタンがrightClickedDate ~ leftClickedDateの間の数だけあることを確認 const diff = Math.floor( (rightClickDate.getTime() - leftClickDate.getTime()) / (1000 * 60 * 60 * 24) From bd0489ab0bd38b8c6cd303a0fe68b35c149c797c Mon Sep 17 00:00:00 2001 From: "k.tada" Date: Tue, 12 Nov 2024 18:33:29 +0900 Subject: [PATCH 08/15] =?UTF-8?q?feat(date-range-picker):=20=E3=82=AD?= =?UTF-8?q?=E3=83=A3=E3=83=B3=E3=82=BB=E3=83=AB=E6=99=82=E3=81=AB=E3=82=BB?= =?UTF-8?q?=E3=83=AC=E3=82=AF=E3=82=BF=E3=83=BC=E3=82=92=E6=88=BB=E3=81=99?= =?UTF-8?q?=EF=BC=86popup=E5=A4=96=E3=82=92=E3=82=AF=E3=83=AA=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=81=A7=E5=85=A5=E5=8A=9B=E3=82=92=E6=88=BB=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/date-range-picker.tsx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx b/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx index fd24fb93d..69db08db4 100644 --- a/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx +++ b/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx @@ -107,6 +107,19 @@ const DateRangePicker: FC = ({ ); }; + const initiaizeRightCalendarDate = () => { + const [start, end] = [dateRange.start, dateRange.end]; + if (end) { + setRightCalendarDate(new Date(end)); + } else if (start) { + setRightCalendarDate( + new Date(start.getFullYear(), start.getMonth() + 1, 1) + ); + } else { + setRightCalendarDate(new Date()); + } + }; + const selectedDates = useMemo(() => { const getDateStatus = ( date: Date, @@ -189,6 +202,7 @@ const DateRangePicker: FC = ({ })(); const onClose = () => { + initiaizeRightCalendarDate(); setTempDateRange(dateRange); setIsOpen(false); }; @@ -265,7 +279,7 @@ const DateRangePicker: FC = ({ setIsOpen(false)} + onClose={onClose} isDirectionFixed={isDirectionFixed} anchorElement={anchor} > From ed07160aa3dfee87c5245a153ae7db25a0a66514 Mon Sep 17 00:00:00 2001 From: "k.tada" Date: Tue, 12 Nov 2024 18:39:31 +0900 Subject: [PATCH 09/15] =?UTF-8?q?feat(date-range-picker):=20=E3=82=AD?= =?UTF-8?q?=E3=83=A3=E3=83=B3=E3=82=BB=E3=83=AB=E6=99=82=E3=81=AB=E3=82=BB?= =?UTF-8?q?=E3=83=AC=E3=82=AF=E3=82=BF=E3=83=BC=E3=82=92=E6=88=BB=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../date-range-picker/date-range-picker.vue | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.vue b/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.vue index 512082efb..88233cd72 100644 --- a/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.vue +++ b/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.vue @@ -282,6 +282,21 @@ const leftCalendarDate = computed(() => { ); return date; }); +const initializeRightCalendarDate = () => { + rightCalendarDate.value = new Date(); + const [start, end] = [props.modelValue.start, props.modelValue.end]; + if (end) { + rightCalendarDate.value = new Date(end); + } else if (start) { + rightCalendarDate.value = new Date( + start.getFullYear(), + start.getMonth() + 1, + 1 + ); + } else { + rightCalendarDate.value = new Date(); + } +}; const setIsOpen = (value: boolean) => emit("update:isOpen", value); const onClickCancel = () => @@ -373,6 +388,7 @@ const borderState = computed(() => { const onClose = () => { tempDateRange.value = props.modelValue; + initializeRightCalendarDate(); setIsOpen(false); }; From 52f569ceabcb2ecb4dc1f68b1e2cb77cb07c1f69 Mon Sep 17 00:00:00 2001 From: "k.tada" Date: Tue, 12 Nov 2024 18:46:41 +0900 Subject: [PATCH 10/15] =?UTF-8?q?feat(date-picker):=20=E3=82=AD=E3=83=A3?= =?UTF-8?q?=E3=83=B3=E3=82=BB=E3=83=AB=E6=99=82=E3=81=AB=E3=82=BB=E3=83=AC?= =?UTF-8?q?=E3=82=AF=E3=82=BF=E3=83=BC=E3=82=92=E6=88=BB=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/inputs/date-picker/components/date-picker.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx b/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx index 23f868bcd..cd296a066 100644 --- a/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx +++ b/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx @@ -120,6 +120,7 @@ const DatePicker: FC = ({ const onClose = () => { setTempDate(date); + setCurrentMonth(date || new Date()); setIsOpen(false); }; From d320993a0299165db814de78ae29b1072f7b2a4b Mon Sep 17 00:00:00 2001 From: "k.tada" Date: Tue, 12 Nov 2024 18:48:40 +0900 Subject: [PATCH 11/15] =?UTF-8?q?feat(date-picker):=20=E3=82=AD=E3=83=A3?= =?UTF-8?q?=E3=83=B3=E3=82=BB=E3=83=AB=E6=99=82=E3=81=AB=E3=82=BB=E3=83=AC?= =?UTF-8?q?=E3=82=AF=E3=82=BF=E3=83=BC=E3=82=92=E6=88=BB=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/base/inputs/date-picker/date-picker.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.vue b/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.vue index 4914db4ef..b9ad77810 100644 --- a/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.vue +++ b/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.vue @@ -329,6 +329,7 @@ const handleClickCalendar = (date: Date) => (tempDate.value = date); const onClose = () => { tempDate.value = calendarValue.value; + currentMonth.value = new Date(defaultCurrentMonth); setIsOpen(false); }; From 2c5566a0203d22a08198952ce5c7d35529736d2f Mon Sep 17 00:00:00 2001 From: "k.tada" Date: Tue, 24 Dec 2024 18:26:29 +0900 Subject: [PATCH 12/15] =?UTF-8?q?feat(date-picker):=20=EF=BD=98=E3=83=9C?= =?UTF-8?q?=E3=82=BF=E3=83=B3=E6=8A=BC=E4=B8=8B=E3=81=A7=E3=82=AB=E3=83=AC?= =?UTF-8?q?=E3=83=B3=E3=83=80=E3=83=BC=E9=81=B8=E6=8A=9E=E7=8A=B6=E6=85=8B?= =?UTF-8?q?=E3=82=92=E3=82=AF=E3=83=AA=E3=82=A2=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../date-picker/components/date-picker.tsx | 19 +++++++++++++++++-- .../components/date-range-picker.tsx | 10 +++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx b/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx index cd296a066..b1b43ea76 100644 --- a/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx +++ b/packages/wiz-ui-react/src/components/base/inputs/date-picker/components/date-picker.tsx @@ -6,7 +6,14 @@ import { inputBorderStyle, } from "@wizleap-inc/wiz-ui-styles/commons"; import clsx from "clsx"; -import { FC, KeyboardEvent, useContext, useRef, useState } from "react"; +import { + FC, + KeyboardEvent, + MouseEvent, + useContext, + useRef, + useState, +} from "react"; import { WizCalendar, @@ -118,6 +125,14 @@ const DatePicker: FC = ({ })(); const wrapperButtonRef = useRef(null); + const onCancel = (e: MouseEvent) => { + e.stopPropagation(); + setTempDate(null); + setCurrentMonth(new Date()); + onChangeDate(null); + setIsOpen(false); + }; + const onClose = () => { setTempDate(date); setCurrentMonth(date || new Date()); @@ -160,7 +175,7 @@ const DatePicker: FC = ({ type="button" className={styles.datePickerCancelIconStyle} disabled={disabled} - onClick={() => onChangeDate(null)} + onClick={onCancel} aria-label={ARIA_LABELS.DATE_PICKER_CANCEL} > diff --git a/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx b/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx index 69db08db4..9ff0ecaeb 100644 --- a/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx +++ b/packages/wiz-ui-react/src/components/base/inputs/date-range-picker/components/date-range-picker.tsx @@ -5,6 +5,7 @@ import clsx from "clsx"; import { FC, KeyboardEvent, + MouseEvent, useCallback, useContext, useMemo, @@ -95,7 +96,6 @@ const DateRangePicker: FC = ({ ), [rightCalendarDate] ); - const onClickCancel = () => onChangeDateRange({ start: null, end: null }); const moveCalendar = (command: "nextMonth" | "prevMonth") => { const dm = command === "nextMonth" ? 1 : -1; setRightCalendarDate( @@ -201,6 +201,14 @@ const DateRangePicker: FC = ({ return "default"; })(); + const onClickCancel = (e: MouseEvent) => { + e.stopPropagation(); + initiaizeRightCalendarDate(); + setTempDateRange({ start: null, end: null }); + onChangeDateRange({ start: null, end: null }); + setIsOpen(false); + }; + const onClose = () => { initiaizeRightCalendarDate(); setTempDateRange(dateRange); From 3fe1ffc43242e2f569bdb7051c90cb0f2e0de933 Mon Sep 17 00:00:00 2001 From: "k.tada" Date: Tue, 24 Dec 2024 18:41:49 +0900 Subject: [PATCH 13/15] =?UTF-8?q?feat(date-picker):=20=EF=BD=98=E3=83=9C?= =?UTF-8?q?=E3=82=BF=E3=83=B3=E6=8A=BC=E4=B8=8B=E3=81=A7=E3=82=AB=E3=83=AC?= =?UTF-8?q?=E3=83=B3=E3=83=80=E3=83=BC=E9=81=B8=E6=8A=9E=E7=8A=B6=E6=85=8B?= =?UTF-8?q?=E3=82=92=E3=82=AF=E3=83=AA=E3=82=A2=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/inputs/date-picker/date-picker.vue | 10 ++++++++-- .../inputs/date-range-picker/date-range-picker.vue | 11 ++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.vue b/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.vue index b9ad77810..c29c4b8dc 100644 --- a/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.vue +++ b/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.vue @@ -257,8 +257,6 @@ const defaultCurrentMonth = props.modelValue || new Date(); const currentMonth = ref(defaultCurrentMonth); const setIsOpen = (value: boolean) => emit("update:isOpen", value); -const onClickCancel = () => emit("update:modelValue", null); - const tempDate = ref(props.modelValue); const clickToNextMonth = (e: KeyboardEvent | MouseEvent) => { @@ -327,6 +325,14 @@ const variant = computed(() => { const handleClickCalendar = (date: Date) => (tempDate.value = date); +const onClickCancel = (e: MouseEvent) => { + e.stopPropagation(); + tempDate.value = null; + currentMonth.value = new Date(defaultCurrentMonth); + calendarValue.value = null; + setIsOpen(false); +}; + const onClose = () => { tempDate.value = calendarValue.value; currentMonth.value = new Date(defaultCurrentMonth); diff --git a/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.vue b/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.vue index 88233cd72..71ce7dbeb 100644 --- a/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.vue +++ b/packages/wiz-ui-next/src/components/base/inputs/date-range-picker/date-range-picker.vue @@ -299,9 +299,6 @@ const initializeRightCalendarDate = () => { }; const setIsOpen = (value: boolean) => emit("update:isOpen", value); -const onClickCancel = () => - emit("update:modelValue", { start: null, end: null }); - const tempDateRange = ref(props.modelValue); const moveToNextMonth = (e: KeyboardEvent | MouseEvent) => { @@ -386,6 +383,14 @@ const borderState = computed(() => { return "default"; }); +const onClickCancel = (e: MouseEvent) => { + e.stopPropagation(); + tempDateRange.value = { start: null, end: null }; + initializeRightCalendarDate(); + emit("update:modelValue", tempDateRange.value); + setIsOpen(false); +}; + const onClose = () => { tempDateRange.value = props.modelValue; initializeRightCalendarDate(); From d92cc4f646240feb4d89cbfcffef9e13c8b20be3 Mon Sep 17 00:00:00 2001 From: "k.tada" Date: Wed, 25 Dec 2024 16:38:23 +0900 Subject: [PATCH 14/15] =?UTF-8?q?feat(date-picker):=20placeholder=E5=91=A8?= =?UTF-8?q?=E3=82=8A=E3=81=AE=E5=87=A6=E7=90=86=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/base/inputs/date-picker/date-picker.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.vue b/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.vue index c29c4b8dc..1f80c9c78 100644 --- a/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.vue +++ b/packages/wiz-ui-next/src/components/base/inputs/date-picker/date-picker.vue @@ -319,7 +319,7 @@ const borderState = computed(() => { const variant = computed(() => { if (props.disabled) return "disabled"; - if (tempDate.value) return "selected"; + if (calendarValue.value) return "selected"; return "default"; }); @@ -329,7 +329,7 @@ const onClickCancel = (e: MouseEvent) => { e.stopPropagation(); tempDate.value = null; currentMonth.value = new Date(defaultCurrentMonth); - calendarValue.value = null; + emit("update:modelValue", null); setIsOpen(false); }; From 44c0b9b1bbdd2c8797e59119473e5ea3339d4313 Mon Sep 17 00:00:00 2001 From: ichi-h <85932406+ichi-h@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:54:49 +0900 Subject: [PATCH 15/15] =?UTF-8?q?chore:=20wiz-ui-next=E3=81=AE=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changeset/olive-snails-tie.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.changeset/olive-snails-tie.md b/.changeset/olive-snails-tie.md index ebbf390d6..53328610b 100644 --- a/.changeset/olive-snails-tie.md +++ b/.changeset/olive-snails-tie.md @@ -1,5 +1,6 @@ --- "@wizleap-inc/wiz-ui-react": minor +"@wizleap-inc/wiz-ui-next": minor "@wizleap-inc/wiz-ui-constants": minor "@wizleap-inc/wiz-ui-styles": minor ---