feat: Enhance SoftwareReleaseDialog with region and language attachment handling

This commit is contained in:
2026-06-18 04:18:37 +01:00
parent 4b3a8f630a
commit c0ea7f1b80
3 changed files with 116 additions and 18 deletions

View File

@@ -663,17 +663,36 @@
async Task AddRegion()
{
if(_selectedRegionToAdd?.Id is null || ReleaseId <= 0) return;
if(_selectedRegionToAdd?.Id is null) return;
if(ReleaseId > 0)
{
await SoftwareReleasesService.AddRegionToReleaseAsync(ReleaseId, _selectedRegionToAdd.Id ?? 0);
_releaseRegions = await SoftwareReleasesService.GetReleaseRegionsAsync(ReleaseId);
}
else
{
_releaseRegions ??= [];
_releaseRegions.Add(new UnM49BySoftwareReleaseDto
{
UnM49Id = _selectedRegionToAdd.Id,
RegionName = _selectedRegionToAdd.Name
});
}
await SoftwareReleasesService.AddRegionToReleaseAsync(ReleaseId, _selectedRegionToAdd.Id ?? 0);
_releaseRegions = await SoftwareReleasesService.GetReleaseRegionsAsync(ReleaseId);
_selectedRegionToAdd = null;
StateHasChanged();
}
async Task RemoveRegion(UnM49BySoftwareReleaseDto region)
{
if(ReleaseId <= 0) return;
if(ReleaseId <= 0)
{
_releaseRegions?.Remove(region);
StateHasChanged();
return;
}
await SoftwareReleasesService.RemoveRegionFromReleaseAsync(ReleaseId, region.UnM49Id ?? 0);
_releaseRegions = await SoftwareReleasesService.GetReleaseRegionsAsync(ReleaseId);
@@ -691,17 +710,38 @@
async Task AddLanguage()
{
if(_selectedLanguageToAdd?.Id is null || ReleaseId <= 0) return;
if(_selectedLanguageToAdd?.Id is null) return;
if(ReleaseId > 0)
{
await SoftwareReleasesService.AddLanguageToReleaseAsync(ReleaseId, _selectedLanguageToAdd.Id);
_releaseLanguages = await SoftwareReleasesService.GetReleaseLanguagesAsync(ReleaseId);
}
else
{
_releaseLanguages ??= [];
_releaseLanguages.Add(new LanguageBySoftwareReleaseDto
{
LanguageCode = _selectedLanguageToAdd.Id,
Language = _selectedLanguageToAdd.ReferenceName
});
}
await SoftwareReleasesService.AddLanguageToReleaseAsync(ReleaseId, _selectedLanguageToAdd.Id);
_releaseLanguages = await SoftwareReleasesService.GetReleaseLanguagesAsync(ReleaseId);
_selectedLanguageToAdd = null;
StateHasChanged();
}
async Task RemoveLanguage(LanguageBySoftwareReleaseDto lang)
{
if(ReleaseId <= 0 || lang.LanguageCode is null) return;
if(ReleaseId <= 0)
{
_releaseLanguages?.Remove(lang);
StateHasChanged();
return;
}
if(lang.LanguageCode is null) return;
await SoftwareReleasesService.RemoveLanguageFromReleaseAsync(ReleaseId, lang.LanguageCode);
_releaseLanguages = await SoftwareReleasesService.GetReleaseLanguagesAsync(ReleaseId);
@@ -939,7 +979,18 @@
PlatformId = _selectedPlatform?.Id,
PublisherId = _selectedPublisher?.Id,
ReleaseDate = ReleaseDate,
ReleaseDatePrecision = ReleaseDatePrecision
ReleaseDatePrecision = ReleaseDatePrecision,
RegionIds = (_releaseRegions ?? [])
.Select(r => r.UnM49Id)
.OfType<int>()
.Distinct()
.ToList(),
LanguageCodes = (_releaseLanguages ?? [])
.Select(l => l.LanguageCode)
.Where(code => !string.IsNullOrWhiteSpace(code))
.Select(code => code!)
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToList()
}));
}
}

View File

@@ -5,12 +5,14 @@ namespace Marechai.Pages.Admin;
public sealed class SoftwareReleaseDialogResult
{
public string Title { get; set; }
public bool IsCompilation { get; set; }
public int? SoftwareId { get; set; }
public int? SoftwareVersionId { get; set; }
public int? PlatformId { get; set; }
public int? PublisherId { get; set; }
public DateTime? ReleaseDate { get; set; }
public int ReleaseDatePrecision { get; set; }
public string Title { get; set; }
public bool IsCompilation { get; set; }
public int? SoftwareId { get; set; }
public int? SoftwareVersionId { get; set; }
public int? PlatformId { get; set; }
public int? PublisherId { get; set; }
public DateTime? ReleaseDate { get; set; }
public int ReleaseDatePrecision { get; set; }
public List<int> RegionIds { get; set; } = [];
public List<string> LanguageCodes { get; set; } = [];
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Marechai.ApiClient.Models;
@@ -169,16 +170,60 @@ public partial class SoftwareReleases
if(id is not null)
{
_successMessage = L["Release created successfully."];
List<string> attachErrors = [];
foreach(int regionId in data.RegionIds.Distinct())
{
(bool succeeded, string attachError) =
await SoftwareReleasesService.AddRegionToReleaseAsync(id.Value, regionId);
if(!succeeded)
attachErrors.Add(attachError ?? L["Unknown error"]);
}
foreach(string languageCode in data.LanguageCodes
.Where(code => !string.IsNullOrWhiteSpace(code))
.Distinct(StringComparer.OrdinalIgnoreCase))
{
(bool succeeded, string attachError) =
await SoftwareReleasesService.AddLanguageToReleaseAsync(id.Value, languageCode);
if(!succeeded)
attachErrors.Add(attachError ?? L["Unknown error"]);
}
await _dataGrid.ReloadServerData();
if(attachErrors.Count == 0)
{
_errorMessage = null;
_successMessage = L["Release created successfully."];
}
else
{
_successMessage = null;
_errorMessage = BuildAttachmentFailureMessage(id.Value, attachErrors);
}
}
else
{
_successMessage = null;
_errorMessage = errorMessage;
}
}
}
string BuildAttachmentFailureMessage(int releaseId, List<string> attachErrors)
{
StringBuilder builder = new();
builder.Append($"Release {releaseId} was created, but one or more region/language attachments failed.");
if(attachErrors.Count > 0)
builder.Append($" {string.Join(" | ", attachErrors)}");
return builder.ToString();
}
async Task OpenEditDialog(SoftwareReleaseDto release)
{
SoftwareReleaseDto full = await SoftwareReleasesService.GetByIdAsync(release.Id ?? 0);