diff --git a/apps/react/package.json b/apps/react/package.json index 0328d4367..741dc5560 100644 --- a/apps/react/package.json +++ b/apps/react/package.json @@ -8,25 +8,26 @@ "preview": "vite preview" }, "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^6.15.0", - "primereact": "^10.0.0", - "primeicons": "^6.0.0", - "leaflet": "^1.7.1", + "@tanstack/react-query": "^5.28.0", + "axios": "^1.6.0", + "date-fns": "^4.1.0", "i18next": "^23.7.0", "i18next-http-backend": "^2.4.0", + "leaflet": "^1.7.1", + "primeicons": "^6.0.0", + "primereact": "^10.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-i18next": "^13.5.0", - "axios": "^1.6.0", - "@tanstack/react-query": "^5.28.0", + "react-router-dom": "^6.15.0", "zustand": "^4.4.0" }, "devDependencies": { - "vite": "^5.0.0", - "@vitejs/plugin-react": "^4.2.0", - "typescript": "^5.3.0", "@types/react": "^18.2.0", "@types/react-dom": "^18.2.0", - "sass": "^1.69.0" + "@vitejs/plugin-react": "^4.2.0", + "sass": "^1.69.0", + "typescript": "^5.3.0", + "vite": "^5.0.0" } } diff --git a/apps/react/src/app/components/day-tabs/day-tabs.scss b/apps/react/src/app/components/day-tabs/day-tabs.scss new file mode 100644 index 000000000..cd28eb3ba --- /dev/null +++ b/apps/react/src/app/components/day-tabs/day-tabs.scss @@ -0,0 +1,40 @@ +.day-tabs { + margin: 20px 0; +} + +.day-tabs__day { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 12px; + border: 1px solid #e0e0e0; + border-radius: 4px; + background: white; + cursor: pointer; + transition: all 0.2s ease; + min-width: 60px; + + &:hover { + border-color: #1976d2; + color: #1976d2; + } + + &--active { + background: #1976d2; + color: white; + border-color: #1976d2; + } +} + +.day-tabs__day-name { + font-size: 12px; + font-weight: 500; + text-transform: uppercase; + margin-bottom: 4px; +} + +.day-tabs__day-num { + font-size: 18px; + font-weight: 600; +} diff --git a/apps/react/src/app/components/day-tabs/day-tabs.tsx b/apps/react/src/app/components/day-tabs/day-tabs.tsx new file mode 100644 index 000000000..a422d7142 --- /dev/null +++ b/apps/react/src/app/components/day-tabs/day-tabs.tsx @@ -0,0 +1,59 @@ +import React from 'react' +import { Carousel } from 'primereact/carousel' +import { format, addDays, startOfDay } from 'date-fns' +import './day-tabs.scss' + +export interface DayTabsProps { + selectedDate: Date + onDateSelect: (date: Date) => void + minDate?: Date + maxDate?: Date + 'data-testid'?: string +} + +export const DayTabs: React.FC = ({ + selectedDate, + onDateSelect, + 'data-testid': dataTestId, +}) => { + + const getDays = () => { + const days = [] + for (let i = 0; i < 7; i++) { + days.push(startOfDay(addDays(new Date(), i))) + } + return days + } + + const days = getDays() + + const dayItemTemplate = (day: Date) => { + const isSelected = format(day, 'yyyy-MM-dd') === format(selectedDate, 'yyyy-MM-dd') + const dayName = format(day, 'EEE') + const dayNum = format(day, 'd') + + return ( + + ) + } + + return ( +
+ +
+ ) +} diff --git a/apps/react/src/app/components/day-tabs/index.ts b/apps/react/src/app/components/day-tabs/index.ts new file mode 100644 index 000000000..1bb440780 --- /dev/null +++ b/apps/react/src/app/components/day-tabs/index.ts @@ -0,0 +1,2 @@ +export { DayTabs } from './day-tabs' +export type { DayTabsProps } from './day-tabs'