Files
ersatztv/ErsatzTV/Pages/YamlValidator.razor
T
Jason DoveandGitHub e06ee54070 rename yaml playout to sequential schedule (#2335)
* clarify some schedule and playout terms

* more renaming
2025-08-23 14:27:32 +00:00

134 lines
5.0 KiB
Plaintext

@page "/system/troubleshooting/yaml"
@using ErsatzTV.Core.Interfaces.Scheduling
@implements IDisposable
@inject ISequentialScheduleValidator SequentialScheduleValidator
<MudForm Style="max-height: 100%">
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<MudText Typo="Typo.h5" Class="mb-2">YAML Validation</MudText>
<MudDivider Class="mb-6"/>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>YAML File</MudText>
</div>
<MudTextField T="string" Value="_yamlFile" ValueChanged="@(async x => await OnYamlFileChanged(x))"/>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>Schema</MudText>
</div>
<MudSelect @bind-Value="_isImport">
<MudSelectItem Value="@false">Full</MudSelectItem>
<MudSelectItem Value="@true">Import</MudSelectItem>
</MudSelect>
</MudStack>
<MudText Typo="Typo.h5" Class="mt-10 mb-2">Validate</MudText>
<MudDivider Class="mb-6"/>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex"></div>
<MudButton Variant="Variant.Filled"
Color="Color.Primary"
StartIcon="@Icons.Material.Filled.Checklist"
OnClick="@ValidateYaml"
Disabled="@(!_exists)">
Validate
</MudButton>
</MudStack>
<MudTabs Class="mb-6">
<MudTabPanel Text="YAML">
<MudPaper Class="pa-6">
<div class="overflow-y-scroll" style="max-height: 500px">
<pre class="wrap-pre">
<code>@_yamlText</code>
</pre>
</div>
</MudPaper>
</MudTabPanel>
<MudTabPanel Text="JSON">
<MudPaper Class="pa-6">
<div class="overflow-y-scroll" style="max-height: 500px">
<pre class="wrap-pre">
<code>@_jsonText</code>
</pre>
</div>
</MudPaper>
</MudTabPanel>
<MudTabPanel Text="Messages"
BadgeData="@(_messagesCount > 0 ? _messagesCount.ToString() : null)"
BadgeIcon="@(!string.IsNullOrWhiteSpace(_yamlText) && _messagesCount == 0 ? Icons.Material.Filled.Check : null)"
BadgeColor="@(!string.IsNullOrWhiteSpace(_yamlText) && _messagesCount == 0 ? Color.Success : Color.Error)">
<MudPaper Class="pa-6">
<div class="overflow-y-scroll" style="max-height: 500px">
<pre class="wrap-pre">
<code>@_messages</code>
</pre>
</div>
</MudPaper>
</MudTabPanel>
</MudTabs>
<div class="mb-6">
<br/>
<br/>
</div>
</MudContainer>
</div>
</MudForm>
@code {
private readonly CancellationTokenSource _cts = new();
private string _yamlFile;
private bool _isImport;
private bool _exists;
private string _yamlText;
private string _jsonText;
private string _messages;
private int _messagesCount;
public void Dispose()
{
_cts.Cancel();
_cts.Dispose();
}
private async Task ValidateYaml()
{
if (_exists)
{
_yamlText = await File.ReadAllTextAsync(_yamlFile);
try
{
_jsonText = SequentialScheduleValidator.ToJson(_yamlText);
IList<string> messages = await SequentialScheduleValidator.GetValidationMessages(_yamlText, _isImport);
_messagesCount = messages.Count;
_messages = string.Join("\n", messages);
StateHasChanged();
}
catch (Exception e)
{
_messages = e.ToString();
_messagesCount = 1;
}
}
}
private async Task OnYamlFileChanged(string yamlFile)
{
string extension = Path.GetExtension(yamlFile);
_exists = extension is ".yaml" or ".yml" && File.Exists(yamlFile);
await Task.Delay(100);
_yamlFile = yamlFile;
_yamlText = string.Empty;
_jsonText = string.Empty;
_messages = string.Empty;
_messagesCount = 0;
StateHasChanged();
}
}