diff --git a/Netina.AdminPanel.PWA/Components/Originals/SideBarUi.razor b/Netina.AdminPanel.PWA/Components/Originals/SideBarUi.razor
index 4017d29..a9ed763 100644
--- a/Netina.AdminPanel.PWA/Components/Originals/SideBarUi.razor
+++ b/Netina.AdminPanel.PWA/Components/Originals/SideBarUi.razor
@@ -43,6 +43,10 @@
سوالات متداول
+
+ کاتالوگ و بنرها
+
+
@if (isShop)
{
+
+
+
+ اطلاعات بنر ها وکاتالوگ
+ بنر ها و کاتالوگ در صفحه اصلی و دیگر صفحه ها نمایش داده خواهند شد
+
+
+
+
+
+
+
+ بنر های سایت شما
+
+
+
+
+
+
+
+ @foreach (var state in Enum.GetValues(typeof(BannerSection)).Cast())
+ {
+
+ }
+
+ @if (ViewModel.NewBanner.ImageLocation.IsNullOrEmpty())
+ {
+ انتخاب تصویر بنر
+ }
+ else
+ {
+ انتخاب تصویر دیگر
+ }
+ افزودن بنر
+
+
+
+
+
+
+
+
+
+ @context.Item.Section.ToDisplay()
+
+
+
+
+
+
+
+
+
+ مشاهده تصویر
+
+ مشاهده لینک
+
+ حذف
+
+
+
+
+
+
+
+
+
+
+
+ کاتالوگ سایت شما
+ کاتالوگ به لیست فهرست مانند صفحه اصلی گفته میشود که تورهای مختلف را نمایش میدهد
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @e.PersianName
+
+
+
+
+
+
+
+
+
+ @if (ViewModel.CatalogImage.IsNullOrEmpty())
+ {
+ انتخاب تصویر کاتالوگ
+ }
+ else
+ {
+ انتخاب تصویر دیگر
+ }
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ حذف
+
+
+
+
+
+
+
+
+
+@code
+{
+ public PersonalizationPageViewModel ViewModel { get; set; }
+
+ protected override async Task OnInitializedAsync()
+ {
+ ViewModel = new PersonalizationPageViewModel(DialogService, RestWrapper, Snackbar, NavigationManager, UserUtility);
+ await ViewModel.InitializeAsync();
+ await base.OnInitializedAsync();
+ }
+
+ private async Task ShowBannerPhoto(string photoUrl)
+ {
+ var webUrl = Configuration.GetValue("StorageBaseUrl") ?? string.Empty;
+ var url = $"{webUrl}/{photoUrl}";
+ await JsRuntime.InvokeVoidAsyncIgnoreErrors("open", url, "_blank");
+ }
+ private async Task ShowBannerLink(string url)
+ {
+ await JsRuntime.InvokeVoidAsyncIgnoreErrors("open", url, "_blank");
+ }
+}
+}
diff --git a/Netina.AdminPanel.PWA/Pages/Personalization/PersonalizationPage.razor.cs b/Netina.AdminPanel.PWA/Pages/Personalization/PersonalizationPage.razor.cs
new file mode 100644
index 0000000..81c310c
--- /dev/null
+++ b/Netina.AdminPanel.PWA/Pages/Personalization/PersonalizationPage.razor.cs
@@ -0,0 +1,167 @@
+using System.Net.Http.Json;
+
+namespace Netina.AdminPanel.PWA.Pages.Personalization;
+
+public class PersonalizationPageViewModel(IDialogService dialogService, IRestWrapper restWrapper,
+ ISnackbar snackbar, NavigationManager navigationManager, IUserUtility userUtility)
+ : BaseViewModel(userUtility: userUtility)
+{
+
+ public override async Task InitializeAsync()
+ {
+ try
+ {
+ var token = await userUtility.GetBearerTokenAsync();
+ if (token == null)
+ throw new Exception("Token is null");
+ var personalizationSetting = await restWrapper.SettingRestApi.GetSettingAsync(nameof(PersonalizationSetting), token);
+ personalizationSetting.Catalog = personalizationSetting.Catalog.OrderBy(c => c.Row).ToList();
+ PageDto = personalizationSetting;
+ }
+ catch (ApiException ex)
+ {
+
+ var exe = await ex.GetContentAsAsync();
+ 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);
+ }
+
+
+ await base.InitializeAsync();
+ }
+
+ public async Task SubmitSettingAsync()
+ {
+ try
+ {
+ var token = await userUtility.GetBearerTokenAsync();
+ if (token == null)
+ throw new Exception("Token is null");
+ await restWrapper.SettingRestApi.PostSettingAsync(nameof(PersonalizationSetting), PageDto, token);
+ snackbar.Add("تنظیمات شخصی سازی با موفقیت تغییر یافت", Severity.Success);
+
+ }
+ catch (ApiException ex)
+ {
+
+ var exe = await ex.GetContentAsAsync();
+ 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);
+ }
+ }
+
+ public BannerItemModel NewBanner { get; set; } = new();
+ public CatalogItemModel NewCatalogItem { get; set; } = new();
+
+ public void AddBanner()
+ {
+ try
+ {
+ if (NewBanner.ImageLocation.IsNullOrEmpty())
+ throw new Exception("تصویر بنر انتخاب نشده است");
+ if (NewBanner.Title.IsNullOrEmpty())
+ throw new Exception("عنوان بنر انتخاب نشده است");
+
+ PageDto.Banners.Add(NewBanner);
+ NewBanner = new BannerItemModel();
+ }
+ catch (Exception e)
+ {
+ snackbar.Add(e.Message, Severity.Error);
+ }
+ }
+ public async Task SelectFileAsync()
+ {
+ DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.Large, FullWidth = true, DisableBackdropClick = true };
+ var dialog = await dialogService.ShowAsync("انتخاب عکس", maxWidth);
+ var result = await dialog.Result;
+ var file = result.Data;
+ if (file is StorageFileSDto storageFile)
+ {
+ NewBanner.ImageLocation = storageFile.FileLocation;
+
+ }
+ }
+
+ public CatalogItemModel? SelectedCatalog { get; set; }
+ public async Task> SearchCatalog(string catelogName)
+ {
+ try
+ {
+ if (catelogName.IsNullOrEmpty())
+ return PageDto.Catalog;
+ return PageDto.Catalog.Where(f => f.PersianName.Contains(catelogName));
+ }
+ catch (ApiException ex)
+ {
+ var exe = await ex.GetContentAsAsync();
+ snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error);
+ return new List();
+ }
+ catch (Exception e)
+ {
+ snackbar.Add(e.Message, Severity.Error);
+ return new List();
+ }
+ }
+
+ public string CatalogImage { get; set; } = string.Empty;
+ public async Task SelectCatalogFileAsync()
+ {
+ DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.Large, FullWidth = true, DisableBackdropClick = true };
+ var dialog = await dialogService.ShowAsync("انتخاب عکس", maxWidth);
+ var result = await dialog.Result;
+ var file = result.Data;
+ if (file is StorageFileSDto storageFile)
+ {
+ CatalogImage = storageFile.FileLocation;
+ }
+ }
+ public void AddCatalogItem()
+ {
+ try
+ {
+ if (NewCatalogItem.EnglishName.IsNullOrEmpty())
+ throw new Exception("نام انگلیسی را وارد کنید");
+ if (NewCatalogItem.PersianName.IsNullOrEmpty())
+ throw new Exception("نام فارسی ایتم کاتالوگ را وارد کنید");
+ if (NewCatalogItem.Query.IsNullOrEmpty())
+ throw new Exception("کوئری ایتم کاتالوگ را وارد کنید");
+ if (SelectedCatalog != null)
+ {
+ NewCatalogItem.ParentId = SelectedCatalog.Id;
+ NewCatalogItem.ParentName = SelectedCatalog.PersianName;
+ }
+ else
+ NewCatalogItem.IsMain = true;
+
+ if (!CatalogImage.IsNullOrEmpty())
+ NewCatalogItem.ImageLocation = CatalogImage;
+ CatalogImage = string.Empty;
+ NewCatalogItem.Id = Guid.NewGuid();
+ PageDto.Catalog.Add(NewCatalogItem);
+ PageDto.Catalog = PageDto.Catalog.OrderBy(c => c.Row).ToList();
+ NewCatalogItem = new CatalogItemModel();
+ }
+ catch (Exception e)
+ {
+ snackbar.Add(e.Message, Severity.Error);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Netina.AdminPanel.PWA/wwwroot/css/app.min.css b/Netina.AdminPanel.PWA/wwwroot/css/app.min.css
index 0f66fd6..b702594 100644
--- a/Netina.AdminPanel.PWA/wwwroot/css/app.min.css
+++ b/Netina.AdminPanel.PWA/wwwroot/css/app.min.css
@@ -1209,6 +1209,9 @@ input:checked + .toggle-bg {
.mt-4 {
margin-top: 1rem;
}
+.mt-5 {
+ margin-top: 1.25rem;
+}
.mt-6 {
margin-top: 1.5rem;
}