defmodule SpazioSolazzoWeb.AdminBookingManagementComponents do @moduledoc """ Reusable components for the admin booking management interface. """ use Phoenix.Component import SpazioSolazzoWeb.CoreComponents attr :title, :string, required: true attr :bookings, :list, required: true attr :page, :map, required: true attr :current_page, :integer, required: true attr :event_prefix, :string, required: true attr :expanded_booking_ids, :any, required: true attr :show_actions, :boolean, default: false attr :show_cancellation_details, :boolean, default: false def bookings_table(assigns) do ~H"""

{@title}

<%= if @show_actions do %> <% end %> <%= for booking <- @bookings do %> <% is_expanded = MapSet.member?(@expanded_booking_ids, booking.id) %> <%= if @show_actions do %> <% end %> <%= if is_expanded do %> <% end %> <% end %>
Space Start End Customer Status Actions
<.icon name="hero-building-office" class="w-4 h-4" />

{booking.space.name}

{SpazioSolazzo.CalendarExt.format_datetime_range_start(booking.start_datetime)}

{SpazioSolazzo.CalendarExt.format_datetime_range_end( booking.start_datetime, booking.end_datetime )}

{booking.customer_name}

{booking.customer_email}

<.icon name={status_icon(booking.state)} class="w-3.5 h-3.5" /> {status_label(booking.state)}

Phone: <%= if booking.customer_phone do %> {booking.customer_phone} <% else %> Not provided <% end %>

Note: <%= if booking.customer_comment do %> {booking.customer_comment} <% else %> Not provided <% end %>

<%= if @show_cancellation_details && booking.state == :rejected do %>

Rejection Reason: <%= if booking.rejection_reason do %> {booking.rejection_reason} <% else %> Not provided <% end %>

<% end %> <%= if @show_cancellation_details && booking.state == :cancelled do %>

Cancellation Reason: <%= if booking.cancellation_reason do %> {booking.cancellation_reason} <% else %> Not provided <% end %>

<% end %>
<.pagination_controls page={@page} current_page={@current_page} event_prefix={@event_prefix} />
""" end defp status_badge_classes(:requested) do "bg-amber-100 dark:bg-amber-900/40 text-amber-800 dark:text-amber-200" end defp status_badge_classes(:accepted) do "bg-green-100 dark:bg-green-900/40 text-green-800 dark:text-green-200" end defp status_badge_classes(:rejected) do "bg-red-100 dark:bg-red-900/40 text-red-800 dark:text-red-200" end defp status_badge_classes(:cancelled) do "bg-slate-100 dark:bg-slate-900/40 text-slate-800 dark:text-slate-200" end defp status_badge_classes(_), do: "bg-slate-100 text-slate-800" defp status_icon(:requested), do: "hero-clock" defp status_icon(:accepted), do: "hero-check-circle" defp status_icon(:rejected), do: "hero-x-circle" defp status_icon(:cancelled), do: "hero-minus-circle" defp status_icon(_), do: "hero-question-mark-circle" defp status_label(:requested), do: "Pending" defp status_label(:accepted), do: "Confirmed" defp status_label(:rejected), do: "Rejected" defp status_label(:cancelled), do: "Cancelled" defp status_label(_), do: "Unknown" end