Adds comprehensive service detail views and localization
Implements new service detail tabs for prices, duration, and rules Extends localization support for Danish and English translations Adds dynamic view components for managing service-specific configurations Introduces flexible pricing, duration, and booking rule management Enhances service management with granular configuration options
This commit is contained in:
parent
e9f3639c7c
commit
5e3811347c
11 changed files with 1018 additions and 13 deletions
|
|
@ -0,0 +1,81 @@
|
|||
@model PlanTempus.Application.Features.Services.Components.ServiceDetailDurationViewModel
|
||||
|
||||
<swp-detail-grid>
|
||||
<swp-card>
|
||||
<swp-section-label>@Model.LabelDurationVariants</swp-section-label>
|
||||
|
||||
<swp-duration-list>
|
||||
@foreach (var variant in Model.DurationVariants)
|
||||
{
|
||||
<swp-duration-item>
|
||||
<swp-duration-name>@variant.Name</swp-duration-name>
|
||||
<swp-duration-value>
|
||||
<span contenteditable="true">@variant.Minutes</span>
|
||||
<swp-duration-unit>@Model.LabelMinutes</swp-duration-unit>
|
||||
</swp-duration-value>
|
||||
<swp-duration-delete>
|
||||
<i class="ph ph-x"></i>
|
||||
</swp-duration-delete>
|
||||
</swp-duration-item>
|
||||
}
|
||||
</swp-duration-list>
|
||||
|
||||
<swp-add-button>
|
||||
<i class="ph ph-plus"></i>
|
||||
@Model.LabelAddVariant
|
||||
</swp-add-button>
|
||||
</swp-card>
|
||||
|
||||
<swp-card>
|
||||
<swp-section-label>@Model.LabelBufferTimes</swp-section-label>
|
||||
<swp-edit-section>
|
||||
<swp-edit-row>
|
||||
<swp-edit-label>@Model.LabelBufferBefore</swp-edit-label>
|
||||
<swp-select data-value="@Model.BufferBefore">
|
||||
<button type="button" aria-expanded="false">
|
||||
<swp-select-value>@(Model.BufferBefore == "0" ? "Ingen" : Model.BufferBefore + " minutter")</swp-select-value>
|
||||
<i class="ph ph-caret-down"></i>
|
||||
</button>
|
||||
<swp-select-dropdown>
|
||||
<swp-select-option data-value="0" class="@(Model.BufferBefore == "0" ? "selected" : "")">Ingen</swp-select-option>
|
||||
<swp-select-option data-value="5" class="@(Model.BufferBefore == "5" ? "selected" : "")">5 minutter</swp-select-option>
|
||||
<swp-select-option data-value="10" class="@(Model.BufferBefore == "10" ? "selected" : "")">10 minutter</swp-select-option>
|
||||
<swp-select-option data-value="15" class="@(Model.BufferBefore == "15" ? "selected" : "")">15 minutter</swp-select-option>
|
||||
<swp-select-option data-value="30" class="@(Model.BufferBefore == "30" ? "selected" : "")">30 minutter</swp-select-option>
|
||||
</swp-select-dropdown>
|
||||
</swp-select>
|
||||
</swp-edit-row>
|
||||
<swp-edit-row>
|
||||
<swp-edit-label>@Model.LabelBufferAfter</swp-edit-label>
|
||||
<swp-select data-value="@Model.BufferAfter">
|
||||
<button type="button" aria-expanded="false">
|
||||
<swp-select-value>@(Model.BufferAfter == "0" ? "Ingen" : Model.BufferAfter + " minutter")</swp-select-value>
|
||||
<i class="ph ph-caret-down"></i>
|
||||
</button>
|
||||
<swp-select-dropdown>
|
||||
<swp-select-option data-value="0" class="@(Model.BufferAfter == "0" ? "selected" : "")">Ingen</swp-select-option>
|
||||
<swp-select-option data-value="5" class="@(Model.BufferAfter == "5" ? "selected" : "")">5 minutter</swp-select-option>
|
||||
<swp-select-option data-value="10" class="@(Model.BufferAfter == "10" ? "selected" : "")">10 minutter</swp-select-option>
|
||||
<swp-select-option data-value="15" class="@(Model.BufferAfter == "15" ? "selected" : "")">15 minutter</swp-select-option>
|
||||
<swp-select-option data-value="30" class="@(Model.BufferAfter == "30" ? "selected" : "")">30 minutter</swp-select-option>
|
||||
</swp-select-dropdown>
|
||||
</swp-select>
|
||||
</swp-edit-row>
|
||||
<swp-edit-row>
|
||||
<swp-edit-label>@Model.LabelCleanupTime</swp-edit-label>
|
||||
<swp-select data-value="@Model.CleanupTime">
|
||||
<button type="button" aria-expanded="false">
|
||||
<swp-select-value>@(Model.CleanupTime == "0" ? "Ingen" : Model.CleanupTime + " minutter")</swp-select-value>
|
||||
<i class="ph ph-caret-down"></i>
|
||||
</button>
|
||||
<swp-select-dropdown>
|
||||
<swp-select-option data-value="0" class="@(Model.CleanupTime == "0" ? "selected" : "")">Ingen</swp-select-option>
|
||||
<swp-select-option data-value="5" class="@(Model.CleanupTime == "5" ? "selected" : "")">5 minutter</swp-select-option>
|
||||
<swp-select-option data-value="10" class="@(Model.CleanupTime == "10" ? "selected" : "")">10 minutter</swp-select-option>
|
||||
<swp-select-option data-value="15" class="@(Model.CleanupTime == "15" ? "selected" : "")">15 minutter</swp-select-option>
|
||||
</swp-select-dropdown>
|
||||
</swp-select>
|
||||
</swp-edit-row>
|
||||
</swp-edit-section>
|
||||
</swp-card>
|
||||
</swp-detail-grid>
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
using PlanTempus.Application.Features.Localization.Services;
|
||||
|
||||
namespace PlanTempus.Application.Features.Services.Components;
|
||||
|
||||
public class ServiceDetailDurationViewComponent : ViewComponent
|
||||
{
|
||||
private readonly ILocalizationService _localization;
|
||||
|
||||
public ServiceDetailDurationViewComponent(ILocalizationService localization)
|
||||
{
|
||||
_localization = localization;
|
||||
}
|
||||
|
||||
public IViewComponentResult Invoke(string key)
|
||||
{
|
||||
var service = ServiceDetailCatalog.Get(key);
|
||||
|
||||
var model = new ServiceDetailDurationViewModel
|
||||
{
|
||||
// Data
|
||||
DurationVariants = service.DurationVariants,
|
||||
BufferBefore = service.BufferBefore,
|
||||
BufferAfter = service.BufferAfter,
|
||||
CleanupTime = service.CleanupTime,
|
||||
|
||||
// Labels
|
||||
LabelDurationVariants = _localization.Get("services.detail.duration.durationVariants"),
|
||||
LabelAddVariant = _localization.Get("services.detail.duration.addVariant"),
|
||||
LabelBufferTimes = _localization.Get("services.detail.duration.bufferTimes"),
|
||||
LabelBufferBefore = _localization.Get("services.detail.duration.bufferBefore"),
|
||||
LabelBufferAfter = _localization.Get("services.detail.duration.bufferAfter"),
|
||||
LabelCleanupTime = _localization.Get("services.detail.duration.cleanupTime"),
|
||||
LabelMinutes = _localization.Get("services.detail.duration.minutes")
|
||||
};
|
||||
|
||||
return View(model);
|
||||
}
|
||||
}
|
||||
|
||||
public class ServiceDetailDurationViewModel
|
||||
{
|
||||
// Data
|
||||
public required List<DurationVariant> DurationVariants { get; init; }
|
||||
public required string BufferBefore { get; init; }
|
||||
public required string BufferAfter { get; init; }
|
||||
public required string CleanupTime { get; init; }
|
||||
|
||||
// Labels
|
||||
public required string LabelDurationVariants { get; init; }
|
||||
public required string LabelAddVariant { get; init; }
|
||||
public required string LabelBufferTimes { get; init; }
|
||||
public required string LabelBufferBefore { get; init; }
|
||||
public required string LabelBufferAfter { get; init; }
|
||||
public required string LabelCleanupTime { get; init; }
|
||||
public required string LabelMinutes { get; init; }
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue