From 4e615359eb3944644acea0144b1992d2bc91046f Mon Sep 17 00:00:00 2001 From: HotelSync Date: Wed, 11 Mar 2026 14:58:29 +0300 Subject: [PATCH] Move cell/range toggle near arrows, add period picker on date button MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replaced static "Сегодня" button with a dropdown picker (▾) showing current start date and visible days count - Picker lets user choose any start date + days count (14/30/45/60д) - "Сегодня" quick-reset inside picker + "Показать" confirms navigation - Arrows now step by visibleDays instead of fixed 14 - Moved By-cell / By-range toggle into the left nav group (next to arrows) Co-Authored-By: Claude Sonnet 4.6 --- src/pages/AvailabilityPage.tsx | 157 ++++++++++++++++++++++++++------- 1 file changed, 124 insertions(+), 33 deletions(-) diff --git a/src/pages/AvailabilityPage.tsx b/src/pages/AvailabilityPage.tsx index c8b2f5c..630d01f 100644 --- a/src/pages/AvailabilityPage.tsx +++ b/src/pages/AvailabilityPage.tsx @@ -1,9 +1,9 @@ -import { useState, useRef, useCallback, useMemo } from 'react' +import { useState, useRef, useCallback, useMemo, useEffect } from 'react' import { addDays, format, parseISO, isWithinInterval, startOfDay, getDay, isSameDay } from 'date-fns' import { ru } from 'date-fns/locale' import { ChevronLeft, ChevronRight, X, Check, CalendarDays, - Plus, Pencil, Trash2, AlertCircle, RefreshCw, MousePointer2, Rows3, + Plus, Pencil, Trash2, AlertCircle, RefreshCw, MousePointer2, Rows3, ChevronDown, } from 'lucide-react' import { cn } from '../lib/utils' import { @@ -640,11 +640,26 @@ export function AvailabilityPage() { const [periodModal, setPeriodModal] = useState(null) const [cellEditMode, setCellEditMode] = useState(false) const [selectedCat, setSelectedCat] = useState(null) + const [visibleDays, setVisibleDays] = useState(45) + const [showNavPicker, setShowNavPicker] = useState(false) + const [pickerDate, setPickerDate] = useState(format(new Date(), DATE_FMT)) + const navPickerRef = useRef(null) + + useEffect(() => { + if (!showNavPicker) return + const handler = (e: MouseEvent) => { + if (navPickerRef.current && !navPickerRef.current.contains(e.target as Node)) { + setShowNavPicker(false) + } + } + document.addEventListener('mousedown', handler) + return () => document.removeEventListener('mousedown', handler) + }, [showNavPicker]) const dates = useMemo(() => - Array.from({ length: DAYS }, (_, i) => + Array.from({ length: visibleDays }, (_, i) => format(addDays(today, offset + i), DATE_FMT), - ), [today, offset]) + ), [today, offset, visibleDays]) // ── Mouse handlers ── const handleCellDown = (date: string, catId: string) => { @@ -741,6 +756,7 @@ export function AvailabilityPage() { {/* ── Top bar ── */}
+ {/* Tabs */}
{([['grid', 'Сетка цен'], ['periods', 'Периоды']] as const).map(([t, label]) => ( - - + + {showNavPicker && ( +
+ {/* Start date */} +

+ Начало периода +

+
+ setPickerDate(e.target.value)} + className="input text-sm py-1.5 flex-1" + /> + +
+ + {/* Days count */} +

+ Количество дней +

+
+ {[14, 30, 45, 60].map(d => ( + + ))} +
+ + +
+ )} +
+ + + + {/* Cell / range mode toggle */} +
)}
@@ -798,27 +910,6 @@ export function AvailabilityPage() { )} - {tab === 'grid' && ( - - )} - {tab === 'periods' && (