From b2f9a14b8730889789a492fcc60ccb6e541b3f41 Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Mon, 8 Jun 2026 15:28:49 -0300 Subject: [PATCH] refactor(booking): remove maintenance-related metrics and UI components --- apps/frontend/src/components/ui/select.tsx | 2 +- .../src/features/booking/booking-provider.tsx | 11 ++----- .../src/features/booking/booking.types.ts | 7 ++-- .../components/booking-day-summary.tsx | 21 ++---------- .../booking/components/booking-mobile.tsx | 32 ++++--------------- .../components/booking-status-legend.tsx | 1 - .../booking/components/booking-timeline.tsx | 9 ++---- .../booking/components/booking-toolbar.tsx | 10 ++---- .../public-booking/public-booking-page.tsx | 12 ++----- apps/frontend/src/index.css | 9 ------ 10 files changed, 19 insertions(+), 95 deletions(-) diff --git a/apps/frontend/src/components/ui/select.tsx b/apps/frontend/src/components/ui/select.tsx index 41f8c37..a911e86 100644 --- a/apps/frontend/src/components/ui/select.tsx +++ b/apps/frontend/src/components/ui/select.tsx @@ -35,7 +35,7 @@ function SelectTrigger({ data-slot="select-trigger" data-size={size} className={cn( - "flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", + "flex w-full items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className )} {...props} diff --git a/apps/frontend/src/features/booking/booking-provider.tsx b/apps/frontend/src/features/booking/booking-provider.tsx index dd725a6..1b34655 100644 --- a/apps/frontend/src/features/booking/booking-provider.tsx +++ b/apps/frontend/src/features/booking/booking-provider.tsx @@ -210,20 +210,14 @@ function buildSegmentsForCourt( function getSummary(schedules: BookingCourtSchedule[]): BookingSummary { const freeSlots = schedules.reduce((total, schedule) => total + schedule.metrics.free, 0); const reservedSlots = schedules.reduce((total, schedule) => total + schedule.metrics.reserved, 0); - const maintenanceSlots = schedules.reduce( - (total, schedule) => total + schedule.metrics.maintenance, - 0 - ); - const totalSegments = freeSlots + reservedSlots + maintenanceSlots || 1; + const totalSegments = freeSlots + reservedSlots || 1; return { - totalReservations: reservedSlots + maintenanceSlots + freeSlots, + totalReservations: freeSlots + reservedSlots, freeSlots, reservedSlots, - maintenanceSlots, freePercent: Math.round((freeSlots / totalSegments) * 100), reservedPercent: Math.round((reservedSlots / totalSegments) * 100), - maintenancePercent: Math.round((maintenanceSlots / totalSegments) * 100), }; } @@ -275,7 +269,6 @@ export function BookingProvider({ children, complex }: BookingProviderProps) { const metrics = { free: segments.filter((segment) => segment.status === 'free').length, reserved: segments.filter((segment) => segment.status === 'reserved').length, - maintenance: segments.filter((segment) => segment.status === 'maintenance').length, }; return { court, segments, metrics }; diff --git a/apps/frontend/src/features/booking/booking.types.ts b/apps/frontend/src/features/booking/booking.types.ts index a933d99..9942861 100644 --- a/apps/frontend/src/features/booking/booking.types.ts +++ b/apps/frontend/src/features/booking/booking.types.ts @@ -1,8 +1,8 @@ import type { AdminBooking, Court } from '@repo/api-contract'; export type BookingViewMode = 'panel' | 'status'; -export type BookingStatusFilter = 'all' | 'free' | 'reserved' | 'maintenance'; -export type BookingSegmentStatus = 'free' | 'reserved' | 'maintenance'; +export type BookingStatusFilter = 'all' | 'free' | 'reserved'; +export type BookingSegmentStatus = 'free' | 'reserved'; export interface BookingTimeRange { start: string; @@ -13,16 +13,13 @@ export interface BookingSummary { totalReservations: number; freeSlots: number; reservedSlots: number; - maintenanceSlots: number; freePercent: number; reservedPercent: number; - maintenancePercent: number; } export interface BookingCourtMetrics { free: number; reserved: number; - maintenance: number; } export interface BookingTimelineSegment { diff --git a/apps/frontend/src/features/booking/components/booking-day-summary.tsx b/apps/frontend/src/features/booking/components/booking-day-summary.tsx index 939446b..b153a6e 100644 --- a/apps/frontend/src/features/booking/components/booking-day-summary.tsx +++ b/apps/frontend/src/features/booking/components/booking-day-summary.tsx @@ -1,4 +1,4 @@ -import { CalendarDays, Download, Drill, ShieldCheck, UsersRound } from 'lucide-react'; +import { CalendarDays, Download, ShieldCheck, UsersRound } from 'lucide-react'; import { useBooking } from '../booking-provider'; import { formatBookingDate, toIsoDateLocal } from '../lib/booking-time'; @@ -14,7 +14,7 @@ export function BookingDaySummary() {

-
+
-
); @@ -77,7 +70,6 @@ export function BookingQuickActions() { useBooking(); const todayIso = toIsoDateLocal(new Date()); const isViewingTodayReservations = selectedDate === todayIso && selectedStatus === 'reserved'; - const isViewingMaintenance = selectedStatus === 'maintenance'; return (
@@ -95,15 +87,6 @@ export function BookingQuickActions() { {isViewingTodayReservations ? 'Ver todos los estados' : 'Ver reservas de hoy'} -
); @@ -426,7 +420,6 @@ function MobileStatusTab() { { value: 'all', label: 'Todos' }, { value: 'free', label: 'Libres' }, { value: 'reserved', label: 'Reservados' }, - { value: 'maintenance', label: 'Mantenimiento' }, ] as const; const timeRangeOptions = [ { label: '08:00 - 22:00', start: '08:00', end: '22:00' }, @@ -850,14 +843,10 @@ function MobileSegmentRow({ ) : (

- {segment.booking?.customerName ?? 'Mantenimiento'} + {segment.booking?.customerName ?? 'Sin información'}

- {segment.status === 'maintenance' ? ( - - ) : ( - - )} + {segment.booking?.customerPhone ?? 'Personal'}

@@ -868,23 +857,21 @@ function MobileSegmentRow({ function SegmentStatusLine({ segment }: { segment: BookingTimelineSegment }) { const status = segment.status; - const label = status === 'free' ? 'Libre' : status === 'reserved' ? 'Reservado' : 'Mantenimiento'; + const label = status === 'free' ? 'Libre' : 'Reservado'; return (

{label} @@ -897,7 +884,6 @@ function StatusLegend() {

-
); } @@ -929,9 +915,7 @@ function MiniSlot({ className={cn( 'min-w-0 rounded-lg border px-1.5 py-2 text-center transition active:scale-[0.98] disabled:opacity-60', segment.status === 'free' && 'border-primary/50 bg-primary/15 text-primary', - segment.status === 'reserved' && 'border-reserved/50 bg-reserved/15 text-reserved', - segment.status === 'maintenance' && - 'border-maintenance/50 bg-maintenance/15 text-maintenance' + segment.status === 'reserved' && 'border-reserved/50 bg-reserved/15 text-reserved' )} disabled={!isActionable} onClick={() => { @@ -981,10 +965,6 @@ function MetricDots({ schedule }: { schedule: BookingCourtSchedule }) { {schedule.metrics.reserved} - - - {schedule.metrics.maintenance} - ); } diff --git a/apps/frontend/src/features/booking/components/booking-status-legend.tsx b/apps/frontend/src/features/booking/components/booking-status-legend.tsx index 889e512..a3e396f 100644 --- a/apps/frontend/src/features/booking/components/booking-status-legend.tsx +++ b/apps/frontend/src/features/booking/components/booking-status-legend.tsx @@ -1,7 +1,6 @@ const items = [ { label: 'Libre', className: 'bg-primary' }, { label: 'Reservado', className: 'bg-reserved' }, - { label: 'Mantenimiento', className: 'bg-maintenance' }, ]; export function BookingStatusLegend() { diff --git a/apps/frontend/src/features/booking/components/booking-timeline.tsx b/apps/frontend/src/features/booking/components/booking-timeline.tsx index 23cd311..e9ff8eb 100644 --- a/apps/frontend/src/features/booking/components/booking-timeline.tsx +++ b/apps/frontend/src/features/booking/components/booking-timeline.tsx @@ -215,10 +215,6 @@ function BookingCourtInfo({ schedule }: { schedule: BookingCourtSchedule }) { {schedule.metrics.reserved} - - - {schedule.metrics.maintenance} - @@ -247,8 +243,7 @@ function BookingSlotBlock({ segment, schedule, rangeStart, totalMinutes }: Booki 'border-primary/70 bg-primary/20 text-primary hover:bg-primary/25', segment.status === 'reserved' && 'border-reserved/70 bg-reserved/80 text-reserved-foreground', - segment.status === 'maintenance' && - 'border-maintenance/80 bg-maintenance/75 text-maintenance-foreground', + segment.booking?.status === 'COMPLETED' && 'border-reserved/70 bg-reserved/25 dark:text-reserved-foreground text-gray-600 line-through', segment.booking?.status === 'NOSHOW' && @@ -300,7 +295,7 @@ function BookingSlotBlock({ segment, schedule, rangeStart, totalMinutes }: Booki - {segment.booking?.customerName ?? 'Mantenimiento'} + {segment.booking?.customerName ?? 'Sin información'} )} diff --git a/apps/frontend/src/features/booking/components/booking-toolbar.tsx b/apps/frontend/src/features/booking/components/booking-toolbar.tsx index 8569554..b3d1c00 100644 --- a/apps/frontend/src/features/booking/components/booking-toolbar.tsx +++ b/apps/frontend/src/features/booking/components/booking-toolbar.tsx @@ -8,7 +8,7 @@ import { SelectTrigger, SelectValue, } from '@/components/ui/select'; -import { ChevronLeft, ChevronRight, Clock, SlidersHorizontal } from 'lucide-react'; +import { ChevronLeft, ChevronRight, Clock } from 'lucide-react'; import { useBooking } from '../booking-provider'; import type { BookingStatusFilter } from '../booking.types'; import { fromIsoDateLocal, toIsoDateLocal } from '../lib/booking-time'; @@ -24,7 +24,6 @@ const statusOptions: Array<{ value: BookingStatusFilter; label: string }> = [ { value: 'all', label: 'Todos' }, { value: 'free', label: 'Libre' }, { value: 'reserved', label: 'Reservado' }, - { value: 'maintenance', label: 'Mantenimiento' }, ]; export function BookingToolbar() { @@ -46,7 +45,7 @@ export function BookingToolbar() { return (
-
+
Deporte - -
); diff --git a/apps/frontend/src/features/public-booking/public-booking-page.tsx b/apps/frontend/src/features/public-booking/public-booking-page.tsx index 5903b76..e1bce59 100644 --- a/apps/frontend/src/features/public-booking/public-booking-page.tsx +++ b/apps/frontend/src/features/public-booking/public-booking-page.tsx @@ -39,7 +39,6 @@ import { Sun, Trophy, Users, - Wrench, Zap, } from 'lucide-react'; import { useEffect, useMemo, useRef, useState } from 'react'; @@ -376,7 +375,6 @@ function Legend() {
-
); } @@ -1134,19 +1132,13 @@ function BookingTimeline({ const left = ((end - range.start) / total) * 100; const width = ((Math.min(nextStart, range.end) - end) / total) * 100; - const maintenance = index % 2 === 1; - return (
- {maintenance ? : } +
); })} diff --git a/apps/frontend/src/index.css b/apps/frontend/src/index.css index 369493e..5389b39 100644 --- a/apps/frontend/src/index.css +++ b/apps/frontend/src/index.css @@ -54,9 +54,6 @@ body, --color-reserved: var(--reserved); --color-reserved-foreground: var(--reserved-foreground); - --color-maintenance: var(--maintenance); - --color-maintenance-foreground: var(--maintenance-foreground); - --color-warning: var(--warning); --color-warning-foreground: var(--warning-foreground); @@ -117,9 +114,6 @@ body, --reserved: oklch(0.58 0.19 255); --reserved-foreground: oklch(0.985 0.01 255); - --maintenance: oklch(0.64 0.22 25); - --maintenance-foreground: oklch(0.985 0.01 25); - --warning: oklch(0.78 0.16 75); --warning-foreground: oklch(0.18 0.04 75); @@ -176,9 +170,6 @@ body, --reserved: oklch(0.61 0.2 255); --reserved-foreground: oklch(0.97 0.012 255); - --maintenance: oklch(0.66 0.23 25); - --maintenance-foreground: oklch(0.98 0.01 25); - --warning: oklch(0.78 0.17 75); --warning-foreground: oklch(0.18 0.04 75);