/
kochkatech
/
Queue
Обзор
Документация
Войти
/
kochkatech
/
Queue
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
src/Queue.Admin/ViewModels/SettingsViewModel.cs
129 строк
4 KB
kochkareal
init: Начальная структура проекта и панель администратора
24 июл 2026, 21:42
24 июл 2026, 21:42
cd5152a
Код
Авторство
О чём код?
using System; using System.IO; 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 SettingsViewModel : ObservableObject { private readonly QueueDbContextFactory _dbContextFactory; private int _organizationId; [ObservableProperty] private string organizationName = string.Empty; [ObservableProperty] private string? logoPath; [ObservableProperty] private string? mainColorHex; [ObservableProperty] private string? focusColorHex; [ObservableProperty] private string? licenseKey; [ObservableProperty] private string timeZone = "Europe/Moscow"; [ObservableProperty] private string statusMessage = string.Empty; public SettingsViewModel(QueueDbContextFactory dbContextFactory) { _dbContextFactory = dbContextFactory; _ = LoadAsync(); } [RelayCommand] private async Task LoadAsync() { using var db = _dbContextFactory.CreateDbContext(); var organization = await db.Organizations.FirstOrDefaultAsync(); if (organization is null) { organization = new Organization { Name = "Новая компания" }; db.Organizations.Add(organization); await db.SaveChangesAsync(); } _organizationId = organization.Id; OrganizationName = organization.Name; LogoPath = organization.LogoPath; MainColorHex = organization.MainColorHex; FocusColorHex = organization.FocusColorHex; LicenseKey = organization.LicenseKey; TimeZone = organization.TimeZone; } [RelayCommand] private void BrowseLogo() { var dialog = new Microsoft.Win32.OpenFileDialog { Filter = "Изображения (*.png;*.jpg;*.jpeg;*.bmp)|*.png;*.jpg;*.jpeg;*.bmp" }; if (dialog.ShowDialog() == true) { LogoPath = dialog.FileName; } } [RelayCommand] private void ResetColors() { MainColorHex = null; FocusColorHex = null; } [RelayCommand] private async Task SaveAsync() { using var db = _dbContextFactory.CreateDbContext(); var organization = await db.Organizations.FindAsync(_organizationId); if (organization is null) { return; } organization.Name = OrganizationName.Trim(); organization.LogoPath = string.IsNullOrWhiteSpace(LogoPath) ? null : LogoPath; organization.MainColorHex = string.IsNullOrWhiteSpace(MainColorHex) ? null : MainColorHex; organization.FocusColorHex = string.IsNullOrWhiteSpace(FocusColorHex) ? null : FocusColorHex; organization.LicenseKey = string.IsNullOrWhiteSpace(LicenseKey) ? null : LicenseKey; organization.TimeZone = string.IsNullOrWhiteSpace(TimeZone) ? "Europe/Moscow" : TimeZone; await db.SaveChangesAsync(); StatusMessage = "Сохранено. Цвета и логотип применятся при следующем запуске приложения."; } [RelayCommand] private void BackupDatabase() { var dialog = new Microsoft.Win32.SaveFileDialog { FileName = $"queue-backup-{DateTime.Now:yyyy-MM-dd_HHmm}.db", Filter = "Файл базы данных (*.db)|*.db" }; if (dialog.ShowDialog() != true) { return; } File.Copy("queue.db", dialog.FileName, overwrite: true); StatusMessage = "Резервная копия создана."; } }