/
kochkatech
/
Queue
Обзор
Документация
Войти
/
kochkatech
/
Queue
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
src/Queue.Admin/ViewModels/ScheduleViewModel.cs
142 строки
4 KB
kochkareal
init: Начальная структура проекта и панель администратора
24 июл 2026, 21:42
24 июл 2026, 21:42
cd5152a
Код
Авторство
О чём код?
using System; using System.Collections.Generic; 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; // Строка грида: день недели + прозрачный доступ к полям WorkSchedule для инлайн-редактирования. public class ScheduleDayRow { public WorkSchedule Schedule { get; } public string DayName { get; } public ScheduleDayRow(WorkSchedule schedule, string dayName) { Schedule = schedule; DayName = dayName; } public bool IsClosed { get => Schedule.IsClosed; set => Schedule.IsClosed = value; } public string OpenTimeText { get => Schedule.OpenTime.ToString("HH\\:mm"); set { if (TimeOnly.TryParse(value, out var t)) { Schedule.OpenTime = t; } } } public string CloseTimeText { get => Schedule.CloseTime.ToString("HH\\:mm"); set { if (TimeOnly.TryParse(value, out var t)) { Schedule.CloseTime = t; } } } } public partial class ScheduleViewModel : ObservableObject { private static readonly DayOfWeek[] WeekOrder = { DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday, DayOfWeek.Saturday, DayOfWeek.Sunday }; private static readonly Dictionary<DayOfWeek, string> DayNames = new() { [DayOfWeek.Monday] = "Понедельник", [DayOfWeek.Tuesday] = "Вторник", [DayOfWeek.Wednesday] = "Среда", [DayOfWeek.Thursday] = "Четверг", [DayOfWeek.Friday] = "Пятница", [DayOfWeek.Saturday] = "Суббота", [DayOfWeek.Sunday] = "Воскресенье" }; private readonly QueueDbContextFactory _dbContextFactory; public ObservableCollection<ScheduleDayRow> Days { get; } = new(); [ObservableProperty] private string statusMessage = string.Empty; public ScheduleViewModel(QueueDbContextFactory dbContextFactory) { _dbContextFactory = dbContextFactory; _ = LoadAsync(); } [RelayCommand] private async Task LoadAsync() { using var db = _dbContextFactory.CreateDbContext(); var existing = await db.WorkSchedules.ToListAsync(); // Первый запуск: создаём все 7 дней с рабочим графиком по умолчанию (сб/вс — выходные). foreach (var day in WeekOrder) { if (existing.All(s => s.DayOfWeek != day)) { var isWeekend = day is DayOfWeek.Saturday or DayOfWeek.Sunday; var schedule = new WorkSchedule { DayOfWeek = day, OpenTime = new TimeOnly(9, 0), CloseTime = new TimeOnly(18, 0), IsClosed = isWeekend }; db.WorkSchedules.Add(schedule); existing.Add(schedule); } } await db.SaveChangesAsync(); Days.Clear(); foreach (var day in WeekOrder) { var schedule = existing.First(s => s.DayOfWeek == day); Days.Add(new ScheduleDayRow(schedule, DayNames[day])); } } // Сохраняет изменения строки (открытие/закрытие/выходной) после редактирования в гриде. [RelayCommand] private async Task UpdateAsync(WorkSchedule? schedule) { if (schedule is null) { return; } using var db = _dbContextFactory.CreateDbContext(); db.Attach(schedule); db.Entry(schedule).Property(s => s.OpenTime).IsModified = true; db.Entry(schedule).Property(s => s.CloseTime).IsModified = true; db.Entry(schedule).Property(s => s.IsClosed).IsModified = true; await db.SaveChangesAsync(); StatusMessage = "Сохранено."; } }