upload
This commit is contained in:
173
Views/MainWindow.xaml.cs
Normal file
173
Views/MainWindow.xaml.cs
Normal file
@@ -0,0 +1,173 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Threading;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using SimpleWiki.Data;
|
||||
using SimpleWiki.Models;
|
||||
using SimpleWiki.Services;
|
||||
|
||||
namespace SimpleWiki.Views;
|
||||
|
||||
public partial class MainWindow : Window
|
||||
{
|
||||
private readonly User _currentUser;
|
||||
private bool _isArticleBrowserReady;
|
||||
private string _pendingArticleHtml = string.Empty;
|
||||
|
||||
public MainWindow(User currentUser)
|
||||
{
|
||||
InitializeComponent();
|
||||
_currentUser = currentUser;
|
||||
_pendingArticleHtml = MarkdownService.ToHtmlDocument("Simple Wiki", "## Загрузка...");
|
||||
Loaded += MainWindow_Loaded;
|
||||
ContentRendered += MainWindow_ContentRendered;
|
||||
}
|
||||
|
||||
private void MainWindow_ContentRendered(object? sender, EventArgs e)
|
||||
{
|
||||
_isArticleBrowserReady = true;
|
||||
Dispatcher.BeginInvoke(RenderArticleIfReady, DispatcherPriority.ApplicationIdle);
|
||||
}
|
||||
|
||||
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
FullNameTextBlock.Text = _currentUser.FullName;
|
||||
EmailTextBlock.Text = _currentUser.Email;
|
||||
RoleTextBlock.Text = _currentUser.Role == Roles.Admin ? "Роль: администратор" : "Роль: пользователь";
|
||||
CreatedAtTextBlock.Text = $"Дата регистрации: {_currentUser.CreatedAt.ToLocalTime():dd.MM.yyyy HH:mm}";
|
||||
|
||||
var isAdmin = _currentUser.Role == Roles.Admin;
|
||||
AdminToolbar.Visibility = isAdmin ? Visibility.Visible : Visibility.Collapsed;
|
||||
|
||||
LoadArticles();
|
||||
}
|
||||
|
||||
private void LoadArticles(string? query = null)
|
||||
{
|
||||
using var db = new AppDbContext();
|
||||
var items = db.Articles
|
||||
.Include(x => x.Author)
|
||||
.OrderByDescending(x => x.UpdatedAt ?? x.CreatedAt)
|
||||
.AsQueryable();
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(query))
|
||||
{
|
||||
var term = query.Trim().ToLower();
|
||||
items = items.Where(x => x.Title.ToLower().Contains(term) || x.Summary.ToLower().Contains(term));
|
||||
}
|
||||
|
||||
var articles = items.ToList();
|
||||
ArticlesListBox.ItemsSource = articles;
|
||||
|
||||
if (articles.Count > 0)
|
||||
{
|
||||
ArticlesListBox.SelectedIndex = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ArticleTitleTextBlock.Text = "Статей пока нет";
|
||||
ArticleSummaryTextBlock.Text = "Бебебе";
|
||||
ArticleMetaTextBlock.Text = string.Empty;
|
||||
_pendingArticleHtml = MarkdownService.ToHtmlDocument("Empty", "## Пусто\n\nПока нечего читать.");
|
||||
RenderArticleIfReady();
|
||||
}
|
||||
}
|
||||
|
||||
private void ArticlesListBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
|
||||
{
|
||||
if (ArticlesListBox.SelectedItem is not Article selectedArticle)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
using var db = new AppDbContext();
|
||||
var article = db.Articles
|
||||
.Include(x => x.Author)
|
||||
.FirstOrDefault(x => x.Id == selectedArticle.Id);
|
||||
|
||||
if (article is null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ArticleTitleTextBlock.Text = article.Title;
|
||||
ArticleSummaryTextBlock.Text = article.Summary;
|
||||
ArticleMetaTextBlock.Text = $"Автор: {article.Author?.FullName} | Создано: {article.CreatedAt.ToLocalTime():dd.MM.yyyy HH:mm}" +
|
||||
(article.UpdatedAt.HasValue ? $" | Обновлено: {article.UpdatedAt.Value.ToLocalTime():dd.MM.yyyy HH:mm}" : string.Empty);
|
||||
|
||||
_pendingArticleHtml = MarkdownService.ToHtmlDocument(article.Title, article.MarkdownContent);
|
||||
RenderArticleIfReady();
|
||||
}
|
||||
|
||||
|
||||
private void RenderArticleIfReady()
|
||||
{
|
||||
if (!_isArticleBrowserReady)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ArticleBrowser.NavigateToString(_pendingArticleHtml);
|
||||
}
|
||||
|
||||
private void SearchTextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
|
||||
{
|
||||
LoadArticles(SearchTextBox.Text);
|
||||
}
|
||||
|
||||
private void AddArticleButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var editor = new ArticleEditorWindow(_currentUser);
|
||||
if (editor.ShowDialog() == true)
|
||||
{
|
||||
LoadArticles(SearchTextBox.Text);
|
||||
}
|
||||
}
|
||||
|
||||
private void EditArticleButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ArticlesListBox.SelectedItem is not Article article)
|
||||
{
|
||||
MessageBox.Show("Сначала выберите статью.", "Внимание", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
var editor = new ArticleEditorWindow(_currentUser, article.Id);
|
||||
if (editor.ShowDialog() == true)
|
||||
{
|
||||
LoadArticles(SearchTextBox.Text);
|
||||
}
|
||||
}
|
||||
|
||||
private void DeleteArticleButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (ArticlesListBox.SelectedItem is not Article article)
|
||||
{
|
||||
MessageBox.Show("Сначала выберите статью.", "Внимание", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
var result = MessageBox.Show($"Удалить статью '{article.Title}'?", "Подтверждение", MessageBoxButton.YesNo, MessageBoxImage.Question);
|
||||
if (result != MessageBoxResult.Yes)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
using var db = new AppDbContext();
|
||||
var entity = db.Articles.FirstOrDefault(x => x.Id == article.Id);
|
||||
if (entity is null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
db.Articles.Remove(entity);
|
||||
db.SaveChanges();
|
||||
LoadArticles(SearchTextBox.Text);
|
||||
}
|
||||
|
||||
private void LogoutButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
SessionService.CurrentUser = null;
|
||||
new LoginWindow().Show();
|
||||
Close();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user