elfisa-pharmacy/src/Elfisa.Avalonia/Views/ReportsView.axaml.cs
Exest f6a1012e9b Avalonia кросс-платформенный клиент: фундамент + раздел «Отчёты»
Порт десктопа с WinForms на Avalonia (.NET 8, Win/macOS/Linux).

- Elfisa.Core: переносимая логика (ApiClient: логин/отчёт/ИИ, DTO, Session)
- Дизайн-система в бирюзе #0F766E (свет/тьма, кнопки/поля/карточки/таблица/сайдбар)
- Экран входа (реальный /auth/login), шелл с сайдбар-навигацией
- «Отчёты»: 4 типа + авто-загрузка + ИИ-запрос -> Word/Excel, динамические колонки
- Заглушки остальных разделов + README с дорожной картой портирования

Проверено запуском: логин, живые данные покупателя, тема, таблица (скриншот).
dev-автологин по ELF_DEV_USER/ELF_DEV_PASS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-07 18:21:10 +03:00

61 lines
2.0 KiB
C#

using System;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Templates;
using Avalonia.Layout;
using Avalonia.Media;
using Elfisa.Avalonia.ViewModels;
namespace Elfisa.Avalonia.Views;
public partial class ReportsView : UserControl
{
private ReportsViewModel? _vm;
public ReportsView()
{
InitializeComponent();
DataContextChanged += OnDataContextChanged;
}
private void OnDataContextChanged(object? sender, EventArgs e)
{
if (_vm != null) _vm.ColumnsChanged -= RebuildColumns;
_vm = DataContext as ReportsViewModel;
if (_vm != null)
{
_vm.ColumnsChanged += RebuildColumns;
RebuildColumns();
}
}
// DataGrid не умеет динамические колонки через биндинг — строим их из VM в коде.
private void RebuildColumns()
{
Grid.Columns.Clear();
if (_vm == null) return;
for (int i = 0; i < _vm.Columns.Count; i++)
{
int idx = i;
var c = _vm.Columns[i];
Grid.Columns.Add(new DataGridTemplateColumn
{
Header = c.Header,
// одна тянущаяся колонка (star) заполняет свободное место, остальные фикс. пиксель
Width = c.Stretch
? new DataGridLength(1, DataGridLengthUnitType.Star)
: new DataGridLength(c.Weight, DataGridLengthUnitType.Pixel),
MinWidth = 56,
CellTemplate = new FuncDataTemplate<ReportRow>((row, _) => new TextBlock
{
Text = row?[idx] ?? "",
VerticalAlignment = VerticalAlignment.Center,
TextAlignment = c.Numeric ? TextAlignment.Right : TextAlignment.Left,
TextTrimming = TextTrimming.CharacterEllipsis
})
});
}
}
}