File: Components\Dialogs\InteractionsInputDialog.razor.cs
Web Access
Project: src\src\Aspire.Dashboard\Aspire.Dashboard.csproj (Aspire.Dashboard)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Aspire.Dashboard.Model;
using Aspire.ResourceService.Proto.V1;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.FluentUI.AspNetCore.Components;
 
namespace Aspire.Dashboard.Components.Dialogs;
 
public partial class InteractionsInputDialog
{
    [Parameter]
    public InteractionsInputsDialogViewModel Content { get; set; } = default!;
 
    [CascadingParameter]
    public FluentDialog Dialog { get; set; } = default!;
 
    private EditContext _editContext = default!;
    private ValidationMessageStore _validationMessages = default!;
 
    protected override void OnInitialized()
    {
        _editContext = new EditContext(Content);
        _validationMessages = new ValidationMessageStore(_editContext);
 
        _editContext.OnValidationRequested += (s, e) => ValidateModel();
        _editContext.OnFieldChanged += (s, e) => ValidateField(e.FieldIdentifier);
    }
 
    private void ValidateModel()
    {
        _validationMessages.Clear();
 
        foreach (var inputModel in Content.Inputs)
        {
            var field = new FieldIdentifier(inputModel, nameof(inputModel.Value));
            if (IsMissingRequiredValue(inputModel))
            {
                _validationMessages.Add(field, $"{inputModel.Label} is required.");
            }
        }
 
        _editContext.NotifyValidationStateChanged();
    }
 
    private void ValidateField(FieldIdentifier field)
    {
        _validationMessages.Clear(field);
 
        if (field.Model is InteractionInput inputModel)
        {
            if (IsMissingRequiredValue(inputModel))
            {
                _validationMessages.Add(field, $"{inputModel.Label} is required.");
            }
        }
 
        _editContext.NotifyValidationStateChanged();
    }
 
    private static bool IsMissingRequiredValue(InteractionInput inputModel)
    {
        return inputModel.Required &&
            inputModel.InputType != InputType.Checkbox &&
            string.IsNullOrWhiteSpace(inputModel.Value);
    }
 
    private async Task OkAsync()
    {
        if (_editContext.Validate())
        {
            await Dialog.CloseAsync(Content);
        }
    }
 
    private async Task CancelAsync()
    {
        await Dialog.CancelAsync();
    }
}