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; }