Major UX improvements across multiple pages

Шахматка:
- Date/period picker dropdown on navigation button (choose start date + days window)
- Cancelled bookings fade out with animation after 1 second

Бронирования:
- Clickable column headers with sort asc/desc (Гость, Заезд, Выезд, Статус, Источник, Сумма)

Страница входа:
- Removed role-based account selector — just email + password
- System auto-detects role/hotel from credentials

Настройки:
- New "Бронирование" section with room assignment strategy (spread/together/sequential/manual)
- Notifications: SMTP email config + SMS provider config (SMSC, SMS.ru, МТС, etc.)

Модули:
- Added Housekeeping and Channel Manager as proper modules
- Channel Manager lists: Booking.com, Airbnb, Яндекс Путешествия, Островок, Суточно.ру, OneTwoTrip
- Housekeeping visible to all roles (including housekeeper) via module status
- Sidebar now uses module status to show/hide Уборка and Каналы

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-11 15:20:05 +03:00
parent 4e615359eb
commit c233590c4b
29 changed files with 2171 additions and 149 deletions

View File

@@ -5,6 +5,7 @@ import type { Booking } from '../types'
export function CalendarPage() {
const [bookings, setBookings] = useState<Booking[]>(MOCK_BOOKINGS)
const [fadingBookings, setFadingBookings] = useState<Set<string>>(new Set())
const handleCreate = (data: Partial<Booking>) => {
setBookings(prev => [...prev, data as Booking])
@@ -12,6 +13,17 @@ export function CalendarPage() {
const handleUpdate = (id: string, data: Partial<Booking>) => {
setBookings(prev => prev.map(b => b.id === id ? { ...b, ...data } : b))
if (data.status === 'cancelled') {
setFadingBookings(prev => new Set([...prev, id]))
setTimeout(() => {
setBookings(prev => prev.filter(b => b.id !== id))
setFadingBookings(prev => {
const next = new Set(prev)
next.delete(id)
return next
})
}, 900)
}
}
return (
@@ -30,6 +42,7 @@ export function CalendarPage() {
bookings={bookings}
onBookingCreate={handleCreate}
onBookingUpdate={handleUpdate}
fadingBookingIds={fadingBookings}
/>
</div>
</div>