f4cc81bb71
- Add theme system (Dark/Light palettes, ModernTheme, ThemeManager) - Add InputDialog, Spinner common view - Add DuplicatesCsvExportService - Refresh views, dialogs, and view models across tabs - Update localization strings (en/fr) - Tweak services (transfer, permissions, search, user access, ownership elevation, bulk operations) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
43 lines
1.3 KiB
C#
43 lines
1.3 KiB
C#
using System.Globalization;
|
|
using System.IO;
|
|
using System.Text;
|
|
using CsvHelper;
|
|
using SharepointToolbox.Core.Models;
|
|
using SharepointToolbox.Localization;
|
|
|
|
namespace SharepointToolbox.Services.Export;
|
|
|
|
public class BulkResultCsvExportService
|
|
{
|
|
public string BuildFailedItemsCsv<T>(IReadOnlyList<BulkItemResult<T>> failedItems)
|
|
{
|
|
var TL = TranslationSource.Instance;
|
|
using var writer = new StringWriter();
|
|
using var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
|
|
|
|
csv.WriteHeader<T>();
|
|
csv.WriteField(TL["report.col.error"]);
|
|
csv.WriteField(TL["report.col.timestamp"]);
|
|
csv.NextRecord();
|
|
|
|
foreach (var item in failedItems.Where(r => !r.IsSuccess))
|
|
{
|
|
csv.WriteRecord(item.Item);
|
|
csv.WriteField(item.ErrorMessage);
|
|
csv.WriteField(item.Timestamp.ToString("o"));
|
|
csv.NextRecord();
|
|
}
|
|
|
|
return writer.ToString();
|
|
}
|
|
|
|
public async Task WriteFailedItemsCsvAsync<T>(
|
|
IReadOnlyList<BulkItemResult<T>> failedItems,
|
|
string filePath,
|
|
CancellationToken ct)
|
|
{
|
|
var content = BuildFailedItemsCsv(failedItems);
|
|
await System.IO.File.WriteAllTextAsync(filePath, content, new UTF8Encoding(true), ct);
|
|
}
|
|
}
|