LANCommander/LANCommander.UI/Components/TransferInput/TransferInput.razor

48 lines
1.6 KiB
Text
Raw Permalink Normal View History

2025-09-06 13:20:05 -05:00
@typeparam TItem where TItem : LANCommander.SDK.Models.IKeyedModel
@namespace LANCommander.UI.Components
2025-02-03 00:42:08 -06:00
<Transfer
Style="@Style"
DataSource="TransferItems"
TargetKeys="TargetKeys"
OnChange="OnChange"
Titles="new[] { LeftTitle, RightTitle }"
ShowSearch="@Searchable"
/>
@code {
[Parameter] public string LeftTitle { get; set; } = "";
[Parameter] public string RightTitle { get; set; } = "";
[Parameter] public string Style { get; set; } = "";
2025-02-03 00:42:08 -06:00
[Parameter] public bool Searchable { get; set; }
[Parameter] public Func<TItem, string> TitleSelector { get; set; }
[Parameter] public IEnumerable<TItem> DataSource { get; set; }
[Parameter] public ICollection<TItem> Values { get; set; } = new List<TItem>();
[Parameter] public EventCallback<ICollection<TItem>> ValuesChanged { get; set; }
IEnumerable<TransferItem> TransferItems { get; set; } = new List<TransferItem>();
2025-02-03 00:42:08 -06:00
List<string> TargetKeys { get; set; } = new();
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
TransferItems = DataSource.Select(i => new TransferItem()
{
Key = i.Id.ToString(),
Title = TitleSelector.Invoke(i)
});
if (Values != null)
TargetKeys = Values.Select(i => i.Id.ToString()).ToList();
}
}
async Task OnChange(TransferChangeArgs e)
{
Values = DataSource.Where(i => e.TargetKeys.Contains(i.Id.ToString())).ToList();
if (ValuesChanged.HasDelegate)
await ValuesChanged.InvokeAsync(Values);
}
}