PlanTempusApp/PlanTempus.Application/Features/Services/Components/ServiceDetailGeneral/ServiceDetailGeneralViewComponent.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

142 lines
6.1 KiB
C#

using Microsoft.AspNetCore.Mvc;
using PlanTempus.Application.Features.Localization.Services;
namespace PlanTempus.Application.Features.Services.Components;
public class ServiceDetailGeneralViewComponent : ViewComponent
{
private readonly ILocalizationService _localization;
// Category display -> value mapping
private static readonly Dictionary<string, string> CategoryValues = new()
{
["Kombi-behandlinger"] = "kombi",
["Klip"] = "klip",
["Farve"] = "farve",
["Behandlinger"] = "behandlinger",
["Styling"] = "styling"
};
// Color value -> display label mapping
private static readonly Dictionary<string, string> ColorLabels = new()
{
["red"] = "Rød",
["pink"] = "Pink",
["purple"] = "Lilla",
["deep-purple"] = "Mørk lilla",
["indigo"] = "Indigo",
["blue"] = "Blå",
["light-blue"] = "Lyseblå",
["cyan"] = "Cyan",
["teal"] = "Teal",
["green"] = "Grøn",
["light-green"] = "Lysegrøn",
["lime"] = "Lime",
["yellow"] = "Gul",
["amber"] = "Amber",
["orange"] = "Orange",
["deep-orange"] = "Mørk orange"
};
public ServiceDetailGeneralViewComponent(ILocalizationService localization)
{
_localization = localization;
}
public IViewComponentResult Invoke(string key)
{
var service = ServiceDetailCatalog.Get(key);
var model = new ServiceDetailGeneralViewModel
{
// Data
Name = service.Name,
Category = service.Category,
CategoryValue = CategoryValues.GetValueOrDefault(service.Category, "kombi"),
CalendarColor = service.CalendarColor,
CalendarColorLabel = ColorLabels.GetValueOrDefault(service.CalendarColor, service.CalendarColor),
IsActive = service.IsActive,
InternalNotes = service.InternalNotes,
CanBookAsMain = service.CanBookAsMain,
CanBookAsAddon = service.CanBookAsAddon,
ShowInOnlineBooking = service.ShowInOnlineBooking,
IsFeatured = service.IsFeatured,
Description = service.Description,
// Labels
LabelBasic = _localization.Get("services.detail.general.basic"),
LabelServiceName = _localization.Get("services.detail.general.serviceName"),
LabelCategory = _localization.Get("services.detail.general.category"),
LabelCalendarColor = _localization.Get("services.detail.general.calendarColor"),
LabelIsActive = _localization.Get("services.detail.general.isActive"),
LabelInternalNotes = _localization.Get("services.detail.general.internalNotes"),
LabelBookingType = _localization.Get("services.detail.general.bookingType"),
LabelCanBookAsMain = _localization.Get("services.detail.general.canBookAsMain"),
LabelCanBookAsMainDesc = _localization.Get("services.detail.general.canBookAsMainDesc"),
LabelCanBookAsAddon = _localization.Get("services.detail.general.canBookAsAddon"),
LabelCanBookAsAddonDesc = _localization.Get("services.detail.general.canBookAsAddonDesc"),
LabelOnlineBooking = _localization.Get("services.detail.general.onlineBooking"),
LabelShowInOnlineBooking = _localization.Get("services.detail.general.showInOnlineBooking"),
LabelShowInOnlineBookingDesc = _localization.Get("services.detail.general.showInOnlineBookingDesc"),
LabelIsFeatured = _localization.Get("services.detail.general.isFeatured"),
LabelIsFeaturedDesc = _localization.Get("services.detail.general.isFeaturedDesc"),
LabelDescription = _localization.Get("services.detail.general.description"),
LabelImage = _localization.Get("services.detail.general.image"),
LabelUploadImage = _localization.Get("services.detail.general.uploadImage"),
ToggleYes = _localization.Get("common.yes"),
ToggleNo = _localization.Get("common.no")
};
return View(model);
}
}
public class ServiceDetailGeneralViewModel
{
// Data
public required string Name { get; init; }
public required string Category { get; init; }
public required string CategoryValue { get; init; }
public required string CalendarColor { get; init; }
public required string CalendarColorLabel { get; init; }
public required bool IsActive { get; init; }
public required string InternalNotes { get; init; }
public required bool CanBookAsMain { get; init; }
public required bool CanBookAsAddon { get; init; }
public required bool ShowInOnlineBooking { get; init; }
public required bool IsFeatured { get; init; }
public required string Description { get; init; }
// Labels - Basic
public required string LabelBasic { get; init; }
public required string LabelServiceName { get; init; }
public required string LabelCategory { get; init; }
public required string LabelCalendarColor { get; init; }
public required string LabelIsActive { get; init; }
// Labels - Internal Notes
public required string LabelInternalNotes { get; init; }
// Labels - Booking Type
public required string LabelBookingType { get; init; }
public required string LabelCanBookAsMain { get; init; }
public required string LabelCanBookAsMainDesc { get; init; }
public required string LabelCanBookAsAddon { get; init; }
public required string LabelCanBookAsAddonDesc { get; init; }
// Labels - Online Booking
public required string LabelOnlineBooking { get; init; }
public required string LabelShowInOnlineBooking { get; init; }
public required string LabelShowInOnlineBookingDesc { get; init; }
public required string LabelIsFeatured { get; init; }
public required string LabelIsFeaturedDesc { get; init; }
// Labels - Description & Image
public required string LabelDescription { get; init; }
public required string LabelImage { get; init; }
public required string LabelUploadImage { get; init; }
// Toggle labels
public required string ToggleYes { get; init; }
public required string ToggleNo { get; init; }
}