/
kochkatech
/
Queue
Обзор
Документация
Войти
/
kochkatech
/
Queue
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
src/Queue.Admin/ViewModels/WindowsViewModel.cs
155 строк
4 KB
kochkareal
init: Начальная структура проекта и панель администратора
24 июл 2026, 21:42
24 июл 2026, 21:42
cd5152a
Код
Авторство
О чём код?
using System.Collections.ObjectModel; using System.Linq; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Microsoft.EntityFrameworkCore; using Queue.Core.Models; using Queue.Data; namespace Queue.Admin.ViewModels; public partial class WindowsViewModel : ObservableObject { private readonly QueueDbContextFactory _dbContextFactory; public ObservableCollection<ServiceWindow> Windows { get; } = new(); public ObservableCollection<ServiceSelectionItem> AvailableServices { get; } = new(); [ObservableProperty] private string newWindowName = string.Empty; [ObservableProperty] private ServiceWindow? selectedWindow; public WindowsViewModel(QueueDbContextFactory dbContextFactory) { _dbContextFactory = dbContextFactory; _ = LoadAsync(); } [RelayCommand] private async Task LoadAsync() { using var db = _dbContextFactory.CreateDbContext(); var items = await db.Windows.Include(w => w.Services).OrderBy(w => w.Name).ToListAsync(); Windows.Clear(); foreach (var item in items) { Windows.Add(item); } } [RelayCommand] private async Task AddAsync() { if (string.IsNullOrWhiteSpace(NewWindowName)) { return; } var window = new ServiceWindow { Name = NewWindowName.Trim(), IsActive = true }; using (var db = _dbContextFactory.CreateDbContext()) { db.Windows.Add(window); await db.SaveChangesAsync(); } Windows.Add(window); NewWindowName = string.Empty; } // Сохраняет изменения полей строки (название, активность) после редактирования в гриде. [RelayCommand] private async Task UpdateAsync(ServiceWindow? window) { if (window is null) { return; } using var db = _dbContextFactory.CreateDbContext(); db.Attach(window); db.Entry(window).Property(w => w.Name).IsModified = true; db.Entry(window).Property(w => w.IsActive).IsModified = true; await db.SaveChangesAsync(); } [RelayCommand] private async Task DeleteAsync(ServiceWindow? window) { if (window is null) { return; } using (var db = _dbContextFactory.CreateDbContext()) { db.Windows.Attach(window); db.Windows.Remove(window); await db.SaveChangesAsync(); } Windows.Remove(window); } // Список услуг для панели справа пересобирается при выборе окна в гриде. partial void OnSelectedWindowChanged(ServiceWindow? value) { _ = LoadAvailableServicesAsync(value); } private async Task LoadAvailableServicesAsync(ServiceWindow? window) { AvailableServices.Clear(); using var db = _dbContextFactory.CreateDbContext(); var services = await db.Services.OrderBy(s => s.SortOrder).ToListAsync(); var selectedIds = window?.Services.Select(s => s.Id).ToHashSet() ?? new System.Collections.Generic.HashSet<int>(); foreach (var service in services) { AvailableServices.Add(new ServiceSelectionItem(service) { IsSelected = selectedIds.Contains(service.Id) }); } } [RelayCommand] private async Task SaveServiceAssignmentsAsync() { if (SelectedWindow is null) { return; } using var db = _dbContextFactory.CreateDbContext(); var window = await db.Windows.Include(w => w.Services).FirstOrDefaultAsync(w => w.Id == SelectedWindow.Id); if (window is null) { return; } window.Services.Clear(); foreach (var item in AvailableServices.Where(s => s.IsSelected)) { var service = await db.Services.FindAsync(item.Service.Id); if (service is not null) { window.Services.Add(service); } } await db.SaveChangesAsync(); SelectedWindow.Services = window.Services.ToList(); } }