PlanTempusApp/PlanTempus.Application/Features/Services/Components/ServiceDetailCatalog.cs
Janus C. H. Knudsen 120367acbb Enhances Services module with detail view and interactions
Adds comprehensive service detail view with multiple tabs and dynamic interactions
Implements client-side navigation between service list and detail views
Introduces mock service data catalog for flexible component rendering
Extends localization support for new service detail screens

Improves user experience by adding edit capabilities and smooth view transitions
2026-01-16 22:03:22 +01:00

171 lines
6.8 KiB
C#

namespace PlanTempus.Application.Features.Services.Components;
/// <summary>
/// Shared catalog for service detail data.
/// Used by all ServiceDetail* ViewComponents.
/// </summary>
public static class ServiceDetailCatalog
{
private static readonly Dictionary<string, ServiceDetailRecord> Services = new()
{
["service-1"] = new ServiceDetailRecord
{
Key = "service-1",
Name = "Klip & Farve",
Category = "Kombi-behandlinger",
CalendarColor = "deep-orange",
IsActive = true,
DurationRange = "60-120",
FromPrice = "795 kr",
EmployeeCount = "4",
BookingsThisYear = "156",
Tags = new() { new("Populær", "popular"), new("Kombi", "combo"), new("Farve", "color") },
InternalNotes = "Komplet farvebehandling med klip. Husk konsultation ved første besøg. Anbefal Olaplex til kemisk behandlet hår.",
CanBookAsMain = true,
CanBookAsAddon = false,
ShowInOnlineBooking = true,
IsFeatured = false,
Description = "Forkæl dig selv med en komplet forvandling! Vores Klip & Farve behandling inkluderer professionel farverådgivning, farvning tilpasset din hudtone, præcisionsklip og styling. Perfekt til dig der ønsker et helt nyt look."
},
["service-2"] = new ServiceDetailRecord
{
Key = "service-2",
Name = "Herreklip",
Category = "Klip",
CalendarColor = "blue",
IsActive = true,
DurationRange = "30",
FromPrice = "295 kr",
EmployeeCount = "6",
BookingsThisYear = "312",
Tags = new() { new("Populær", "popular") },
InternalNotes = "Standard herreklip. Inkluderer vask og styling.",
CanBookAsMain = true,
CanBookAsAddon = false,
ShowInOnlineBooking = true,
IsFeatured = true,
Description = "Klassisk herreklip med vask, klip og styling. Vores erfarne stylister sikrer dig et skarpt og velplejet look."
},
["service-3"] = new ServiceDetailRecord
{
Key = "service-3",
Name = "Dameklip",
Category = "Klip",
CalendarColor = "teal",
IsActive = true,
DurationRange = "45-60",
FromPrice = "395 kr",
EmployeeCount = "5",
BookingsThisYear = "248",
Tags = new() { new("Populær", "popular") },
InternalNotes = "Standard dameklip. Altid konsultation først.",
CanBookAsMain = true,
CanBookAsAddon = false,
ShowInOnlineBooking = true,
IsFeatured = true,
Description = "Professionel dameklip tilpasset din ansigtsform og ønsker. Inkluderer vask, klip og føn."
},
["service-4"] = new ServiceDetailRecord
{
Key = "service-4",
Name = "Balayage",
Category = "Farve",
CalendarColor = "purple",
IsActive = true,
DurationRange = "120-180",
FromPrice = "1.295 kr",
EmployeeCount = "3",
BookingsThisYear = "89",
Tags = new() { new("Farve", "color"), new("Premium", "popular") },
InternalNotes = "Avanceret farveteknik. Kun certificerede stylister. Kræver tid til konsultation.",
CanBookAsMain = true,
CanBookAsAddon = false,
ShowInOnlineBooking = true,
IsFeatured = false,
Description = "Smuk, naturlig farveeffekt med håndmalede highlights. Perfekt til dig der ønsker et solkysset look med lavt vedligehold."
},
["service-5"] = new ServiceDetailRecord
{
Key = "service-5",
Name = "Olaplex Behandling",
Category = "Behandlinger",
CalendarColor = "green",
IsActive = true,
DurationRange = "30",
FromPrice = "295 kr",
EmployeeCount = "6",
BookingsThisYear = "134",
Tags = new() { new("Tilvalg", "combo") },
InternalNotes = "Kan tilføjes til alle farvebehandlinger. Anbefales ved kemisk behandlet hår.",
CanBookAsMain = false,
CanBookAsAddon = true,
ShowInOnlineBooking = true,
IsFeatured = false,
Description = "Intensiv hårbehandling der reparerer og styrker håret. Ideel som tilvalg til farvebehandlinger."
},
["service-6"] = new ServiceDetailRecord
{
Key = "service-6",
Name = "Bryllupsfrisure",
Category = "Styling",
CalendarColor = "amber",
IsActive = false,
DurationRange = "90-120",
FromPrice = "895 kr",
EmployeeCount = "2",
BookingsThisYear = "24",
Tags = new() { new("Premium", "popular"), new("Sæson", "combo") },
InternalNotes = "Kun Maria og Anna kan bookes til dette. Kræver prøve-session 2 uger før.",
CanBookAsMain = true,
CanBookAsAddon = false,
ShowInOnlineBooking = false,
IsFeatured = false,
Description = "Eksklusiv bryllupsfrisure med forudgående konsultation og prøvesession. Vi skaber din drømmefrisure til den store dag."
}
};
public static ServiceDetailRecord Get(string key)
{
if (!Services.TryGetValue(key, out var service))
throw new KeyNotFoundException($"Service with key '{key}' not found");
return service;
}
public static IEnumerable<string> AllKeys => Services.Keys;
}
/// <summary>
/// Complete service detail record used across all detail ViewComponents.
/// </summary>
public record ServiceDetailRecord
{
// Identity
public required string Key { get; init; }
public required string Name { get; init; }
public required string Category { get; init; }
public required string CalendarColor { get; init; }
public required bool IsActive { get; init; }
// Stats (header)
public required string DurationRange { get; init; }
public required string FromPrice { get; init; }
public required string EmployeeCount { get; init; }
public required string BookingsThisYear { get; init; }
// Tags
public List<ServiceTag> Tags { get; init; } = new();
// Generelt tab - Grundlæggende
public required string InternalNotes { get; init; }
// Generelt tab - Bookingtype
public required bool CanBookAsMain { get; init; }
public required bool CanBookAsAddon { get; init; }
// Generelt tab - Online booking
public required bool ShowInOnlineBooking { get; init; }
public required bool IsFeatured { get; init; }
public required string Description { get; init; }
}
public record ServiceTag(string Text, string CssClass);