AdminPanel/Netina.AdminPanel.PWA/Pages/Personalization/ManageNavMenuPage.razor.cs

325 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Force.DeepCloner;
namespace Netina.AdminPanel.PWA.Pages.Personalization;
public class ManageNavMenuPageViewModel : BaseViewModel<NavMenuSetting>
{
private readonly NavigationManager _navigationManager;
private readonly ISnackbar _snackbar;
private readonly IUserUtility _userUtility;
private readonly IDialogService _dialogService;
private readonly IRestWrapper _restWrapper;
public ObservableCollection<NavMenuItem> NavMenuItems { get; set; } = new();
public NavMenuItem NewNavItem { get; set; } = new NavMenuItem();
public ManageNavMenuPageViewModel(
NavigationManager navigationManager,
ISnackbar snackbar,
IUserUtility userUtility,
IRestWrapper restWrapper,
IDialogService dialogService) : base(userUtility)
{
_navigationManager = navigationManager;
_snackbar = snackbar;
_userUtility = userUtility;
_restWrapper = restWrapper;
_dialogService = dialogService;
}
public override async Task InitializeAsync()
{
try
{
IsProcessing = true;
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
throw new Exception("Token is null");
PageDto = await _restWrapper.SettingRestApi.GetSettingAsync<NavMenuSetting>(nameof(NavMenuSetting), token);
PageDto.NavMenuItems.ForEach(ni =>
{
if (ni.ParentId!=default)
ni.Parent = PageDto.NavMenuItems.FirstOrDefault(np => np.Id == ni.ParentId);
NavMenuItems.Add(ni);
});
}
catch (ApiException e)
{
var exe = await e.GetContentAsAsync<ApiResult>();
if (e.StatusCode == HttpStatusCode.Unauthorized)
{
await _userUtility.LogoutAsync();
_navigationManager.NavigateTo("login", true, true);
}
_snackbar.Add(exe != null ? exe.Message : e.Content, Severity.Error);
}
catch (Exception ex)
{
_snackbar.Add(ex.Message, Severity.Error);
}
finally
{
IsProcessing = false;
}
await base.InitializeAsync();
}
public void SubmitAddNewNavItem()
{
try
{
if (NewNavItem.Title.IsNullOrEmpty())
throw new Exception("عنوان فهرست را وارد کنید");
if (NewNavItem.Url.IsNullOrEmpty())
throw new Exception("لینک صفحه فهرست را وارد کنید");
var item = NewNavItem.DeepClone();
NavMenuItems.Add(item);
NewNavItem = new NavMenuItem();
}
catch (Exception ex)
{
_snackbar.Add(ex.Message, Severity.Error);
}
}
public async Task SubmitNavMenuSettingAsync()
{
try
{
var token = await _userUtility.GetBearerTokenAsync();
if (token == null) throw new Exception("Token is null");
PageDto.NavMenuItems.Clear();
foreach (var navMenuItem in NavMenuItems)
{
navMenuItem.Parent = null;
navMenuItem.Children = new List<NavMenuItem>();
PageDto.NavMenuItems.Add(navMenuItem);
}
await _restWrapper.SettingRestApi.PostSettingAsync(nameof(NavMenuSetting), PageDto, token);
_snackbar.Add("تنظیمات فهرست ها با موفقیت به روز شد", Severity.Success);
}
catch (ApiException ex)
{
var exe = await ex.GetContentAsAsync<ApiResult>();
if (ex.StatusCode == HttpStatusCode.Unauthorized)
{
await _userUtility.LogoutAsync();
_navigationManager.NavigateTo("login", true, true);
}
_snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error);
}
catch (Exception e)
{
_snackbar.Add(e.Message, Severity.Error);
}
finally
{
IsProcessing = false;
}
}
public ProductSDto? SelectedProduct = null;
public async Task<IEnumerable<ProductSDto>> SearchProductAsync(string product)
{
try
{
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
throw new Exception("Token is null");
var response = await _restWrapper.ProductRestApi.ReadAll(0,product,null,null);
var categories = response.Products;
if (product.IsNullOrEmpty())
return categories;
return categories.Where(c => c.PersianName.Contains(product));
}
catch (ApiException ex)
{
var exe = await ex.GetContentAsAsync<ApiResult>();
if (exe != null)
_snackbar.Add(exe.Message, Severity.Error);
_snackbar.Add(ex.Content, Severity.Error);
return new List<ProductSDto>();
}
catch (Exception e)
{
_snackbar.Add(e.Message, Severity.Error);
return new List<ProductSDto>();
}
}
public void AddFromProduct()
{
if (SelectedProduct == null)
return;
NavMenuItems.Add(new NavMenuItem
{
Title = SelectedProduct.PersianName,
Id = Guid.NewGuid(),
Url = $"/products/{SelectedProduct.Id}/{SelectedProduct.Slug}"
});
SelectedProduct = null;
}
public BlogSDto? SelectedBlog = null;
public async Task<IEnumerable<BlogSDto>> SearchBlogAsync(string blog)
{
try
{
var response = await _restWrapper.BlogRestApi.ReadAll(0, blog);
var categories = response.Blogs;
if (blog.IsNullOrEmpty())
return categories;
return categories.Where(c => c.Title.Contains(blog));
}
catch (ApiException ex)
{
var exe = await ex.GetContentAsAsync<ApiResult>();
if (exe != null)
_snackbar.Add(exe.Message, Severity.Error);
_snackbar.Add(ex.Content, Severity.Error);
return new List<BlogSDto>();
}
catch (Exception e)
{
_snackbar.Add(e.Message, Severity.Error);
return new List<BlogSDto>();
}
}
public void AddFromBlog()
{
if (SelectedBlog == null)
return;
NavMenuItems.Add(new NavMenuItem
{
Title = SelectedBlog.Title,
Id = Guid.NewGuid(),
Url = $"/blogs/{SelectedBlog.Id}/{SelectedBlog.Slug}"
});
SelectedBlog = null;
}
public BlogCategorySDto? SelectedBlogCategory = null;
public async Task<IEnumerable<BlogCategorySDto>> SearchBlogCategoryAsync(string blogCategory)
{
try
{
var categories = await _restWrapper.BlogCategoryRestApi.ReadAll(blogCategory);
if (blogCategory.IsNullOrEmpty())
return categories;
return categories.Where(c => c.Name.Contains(blogCategory));
}
catch (ApiException ex)
{
var exe = await ex.GetContentAsAsync<ApiResult>();
if (exe != null)
_snackbar.Add(exe.Message, Severity.Error);
_snackbar.Add(ex.Content, Severity.Error);
return new List<BlogCategorySDto>();
}
catch (Exception e)
{
_snackbar.Add(e.Message, Severity.Error);
return new List<BlogCategorySDto>();
}
}
public void AddFromBlogCategory()
{
if(SelectedBlogCategory==null)
return;
NavMenuItems.Add(new NavMenuItem
{
Title = SelectedBlogCategory.Name,
Id = Guid.NewGuid(),
Url = $"/categories/{SelectedBlogCategory.Id}/{SelectedBlogCategory.Slug}"
});
SelectedBlogCategory = null;
}
public ProductCategorySDto? SelectedProductCategory = null;
public async Task<IEnumerable<ProductCategorySDto>> SearchProductCategoryAsync(string productCategory)
{
try
{
var categories = await _restWrapper.ProductCategoryRestApi.ReadAll(productCategory);
if (productCategory.IsNullOrEmpty())
return categories;
return categories.Where(c => c.Name.Contains(productCategory));
}
catch (ApiException ex)
{
var exe = await ex.GetContentAsAsync<ApiResult>();
if (exe != null)
_snackbar.Add(exe.Message, Severity.Error);
_snackbar.Add(ex.Content, Severity.Error);
return new List<ProductCategorySDto>();
}
catch (Exception e)
{
_snackbar.Add(e.Message, Severity.Error);
return new List<ProductCategorySDto>();
}
}
public void AddFromProductCategory()
{
if (SelectedProductCategory == null)
return;
NavMenuItems.Add(new NavMenuItem
{
Title = SelectedProductCategory.Name,
Id = Guid.NewGuid(),
Url = $"/products/{SelectedProductCategory.Id}/{SelectedProductCategory.Slug}"
});
SelectedBlogCategory = null;
}
public async Task<IEnumerable<NavMenuItem>> SearchNavMenuItem(string navTitle)
{
if (navTitle.IsNullOrEmpty())
return NavMenuItems;
return NavMenuItems.Where(c => c.Title.Trim().ToUpper().Contains(navTitle.Trim().ToUpper()));
}
public NavMenuItem? SelectedParent = null;
public void AddNavMenuItemParent(Guid childId)
{
var child = NavMenuItems.FirstOrDefault(c => c.Id == childId);
if(child == null)
return;
if (child.ParentId != default)
{
var oldParent = NavMenuItems.FirstOrDefault(c => c.Id == child.ParentId);
if (oldParent != null)
oldParent.Children.Remove(child);
}
if (child.Parent == null)
return;
var parentId = child.Parent.Id;
var parent = NavMenuItems.FirstOrDefault(c => c.Id == parentId);
if(parent == null)
return;
child.ParentId = parentId;
parent.Children.Add(child);
SelectedParent = null;
return;
}
public void RemoveNavItem(Guid navItemId)
{
var navItem = NavMenuItems.FirstOrDefault(ni => ni.Id == navItemId);
if (navItem != null)
NavMenuItems.Remove(navItem);
}
}