From 8c68d31e12ea68f4ad78a8d65c718ab90c28b475 Mon Sep 17 00:00:00 2001 From: gnezim Date: Sun, 5 Apr 2026 21:18:26 +0300 Subject: [PATCH] feat: create ScheduleFilter with date range and day selection --- .../schedule/components/schedule-filter.scss | 76 +++++++++ .../schedule/components/schedule-filter.tsx | 151 +++++++++++++++++- 2 files changed, 225 insertions(+), 2 deletions(-) diff --git a/apps/react/src/app/features/schedule/components/schedule-filter.scss b/apps/react/src/app/features/schedule/components/schedule-filter.scss index 2bec4bf36..9d1fffef1 100644 --- a/apps/react/src/app/features/schedule/components/schedule-filter.scss +++ b/apps/react/src/app/features/schedule/components/schedule-filter.scss @@ -1,3 +1,79 @@ .schedule-filter { width: 100%; + + :global { + .p-accordion { + border: 1px solid #e0e0e0; + border-radius: 4px; + + .p-accordion-header { + padding: 0; + + a { + padding: 12px 16px; + font-weight: 500; + } + } + + .p-accordion-content { + padding: 0 16px; + } + } + } +} + +.schedule-filter__content { + display: flex; + flex-direction: column; + gap: 16px; + padding: 16px 0; +} + +.schedule-filter__group { + display: flex; + flex-direction: column; + gap: 8px; +} + +.schedule-filter__label { + font-size: 12px; + font-weight: 500; + color: #666; + text-transform: uppercase; +} + +.schedule-filter__swap { + align-self: center; + margin: 8px 0; +} + +.schedule-filter__days { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); + gap: 8px; +} + +.schedule-filter__day-checkbox { + display: flex; + align-items: center; + gap: 8px; +} + +.schedule-filter__day-label { + font-size: 14px; + color: #333; + cursor: pointer; + user-select: none; +} + +.schedule-filter__buttons { + display: flex; + gap: 8px; + margin-top: 8px; + + :global { + .p-button { + flex: 1; + } + } } diff --git a/apps/react/src/app/features/schedule/components/schedule-filter.tsx b/apps/react/src/app/features/schedule/components/schedule-filter.tsx index ce952d935..43ea3a3fc 100644 --- a/apps/react/src/app/features/schedule/components/schedule-filter.tsx +++ b/apps/react/src/app/features/schedule/components/schedule-filter.tsx @@ -1,10 +1,157 @@ -import React from 'react' +import React, { useState } from 'react' +import { Accordion, AccordionTab } from 'primereact/accordion' +import { Button } from 'primereact/button' +import { Checkbox } from 'primereact/checkbox' +import { useNavigate } from 'react-router-dom' +import { useTranslation } from 'react-i18next' +import { CityAutocomplete, City } from '@app/components/city-autocomplete' +import { CalendarInput } from '@app/components/calendar-input' import './schedule-filter.scss' +const DAYS_OF_WEEK = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'] + export const ScheduleFilter: React.FC = () => { + const { t } = useTranslation() + const navigate = useNavigate() + + const [departure, setDeparture] = useState(null) + const [arrival, setArrival] = useState(null) + const [startDate, setStartDate] = useState(new Date()) + const [endDate, setEndDate] = useState(new Date(Date.now() + 6 * 24 * 60 * 60 * 1000)) + const [selectedDays, setSelectedDays] = useState([]) + + const handleDayToggle = (day: string) => { + setSelectedDays((prev) => + prev.includes(day) ? prev.filter((d) => d !== day) : [...prev, day] + ) + } + + const handleSearch = () => { + if (departure && arrival && startDate && endDate) { + const params = btoa( + JSON.stringify({ + departure: departure.code, + arrival: arrival.code, + startDate: startDate.toISOString(), + endDate: endDate.toISOString(), + days: selectedDays.length > 0 ? selectedDays : undefined, + }) + ) + navigate(`/schedule/route/${params}`) + } + } + + const handleSwap = () => { + const temp = departure + setDeparture(arrival) + setArrival(temp) + } + + const handleClear = () => { + setDeparture(null) + setArrival(null) + setStartDate(new Date()) + setEndDate(new Date(Date.now() + 6 * 24 * 60 * 60 * 1000)) + setSelectedDays([]) + } + return (
- {/* Schedule filter will be implemented in next task */} + + +
+ {/* Departure City */} +
+ + +
+ + {/* Swap Button */} +
+
+ + ) }