feat : add version 0.19.22.38 , fix zarinpall issue
parent
e86aa9966e
commit
08c116aece
|
@ -65,13 +65,12 @@
|
|||
|
||||
<MudNavGroup Title="فروشگاه من" Expanded="false"
|
||||
Icon="@Icons.Material.Outlined.Settings">
|
||||
|
||||
<MudNavLink Href="faqs" Icon="@Icons.Material.Filled.ManageAccounts">سوالات متداول</MudNavLink>
|
||||
<MudNavLink Href="management/faqs" Icon="@Icons.Material.Filled.ManageAccounts">سوالات متداول</MudNavLink>
|
||||
</MudNavGroup>
|
||||
|
||||
<MudNavGroup Title="تنظیماتـــ" Expanded="false"
|
||||
Icon="@Icons.Material.Outlined.Settings">
|
||||
|
||||
<MudNavLink Href="management/shop" Icon="@Icons.Material.Filled.Shop2">فروشگاه</MudNavLink>
|
||||
<MudNavLink Href="users" Icon="@Icons.Material.Filled.ManageAccounts">نقش ها و کاربران</MudNavLink>
|
||||
</MudNavGroup>
|
||||
</MudNavMenu>
|
||||
|
|
|
@ -6,7 +6,7 @@ public static class StorageFileExtension
|
|||
{
|
||||
public static string GetLink(this StorageFileSDto file)
|
||||
{
|
||||
var link = $"https://storage.vesmook.com/{file.FileLocation}";
|
||||
var link = $"https://storage.vesmeh.com/{file.FileLocation}";
|
||||
return link;
|
||||
}
|
||||
}
|
|
@ -3,8 +3,8 @@
|
|||
public static class Address
|
||||
{
|
||||
#if DEBUG
|
||||
//public static string BaseAddress = "http://localhost:32770/api";
|
||||
public static string BaseAddress = "https://api.vesmeh.com/api";
|
||||
public static string BaseAddress = "http://localhost:32770/api";
|
||||
//public static string BaseAddress = "https://api.vesmeh.com/api";
|
||||
#else
|
||||
public static string BaseAddress = "https://api.vesmeh.com/api";
|
||||
#endif
|
||||
|
@ -25,4 +25,6 @@ public static class Address
|
|||
public static string ScraperController => $"{BaseAddress}/scraper";
|
||||
public static string NewsletterMemberController => $"{BaseAddress}/newsletter/member";
|
||||
public static string DashboardController => $"{BaseAddress}/dashboard";
|
||||
public static string SettingController => $"{BaseAddress}/setting";
|
||||
public static string DistrictController => $"{BaseAddress}/district";
|
||||
}
|
|
@ -5,8 +5,8 @@
|
|||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<ServiceWorkerAssetsManifest>service-worker-assets.js</ServiceWorkerAssetsManifest>
|
||||
<AssemblyVersion>0.17.20.30</AssemblyVersion>
|
||||
<FileVersion>0.17.20.30</FileVersion>
|
||||
<AssemblyVersion>0.17.21.31</AssemblyVersion>
|
||||
<FileVersion>0.17.21.31</FileVersion>
|
||||
<AssemblyName>$(MSBuildProjectName)</AssemblyName>
|
||||
</PropertyGroup>
|
||||
|
||||
|
@ -85,6 +85,8 @@
|
|||
<Using Include="NetinaShop.Domain.Entities.ProductCategories" />
|
||||
<Using Include="NetinaShop.Domain.Entities.Products" />
|
||||
<Using Include="NetinaShop.Domain.Enums" />
|
||||
<Using Include="NetinaShop.Domain.MartenEntities.Pages" />
|
||||
<Using Include="NetinaShop.Domain.Models.Districts" />
|
||||
<Using Include="Newtonsoft.Json" />
|
||||
<Using Include="Refit" />
|
||||
<Using Include="System.Collections.ObjectModel" />
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
@page "/faqs"
|
||||
@page "/management/faqs"
|
||||
@attribute [Microsoft.AspNetCore.Authorization.Authorize]
|
||||
|
||||
@inject IDialogService DialogService
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
using NetinaShop.Domain.Entities.Pages;
|
||||
|
||||
namespace NetinaShop.AdminPanel.PWA.Pages;
|
||||
namespace NetinaShop.AdminPanel.PWA.Pages;
|
||||
|
||||
public class FaqManagementPageViewModel : BaseViewModel<FAQPage>
|
||||
{
|
||||
|
|
|
@ -0,0 +1,148 @@
|
|||
@page "/management/shop"
|
||||
@using NetinaShop.Domain.Models.Districts
|
||||
@attribute [Microsoft.AspNetCore.Authorization.Authorize]
|
||||
|
||||
@inject IDialogService DialogService
|
||||
@inject NavigationManager NavigationManager
|
||||
@inject ISnackbar Snackbar
|
||||
@inject IUserUtility UserUtility
|
||||
@inject IRestWrapper RestWrapper
|
||||
|
||||
<MudStack class="w-full p-8 h-screen bg-[--mud-palette-background-grey]">
|
||||
<MudGrid>
|
||||
<MudItem xs="12">
|
||||
<MudPaper class="px-5 py-5">
|
||||
<MudStack Row="true">
|
||||
<MudStack class="mb-5 mx-2">
|
||||
<MudText Typo="Typo.h4">فروشـــــگاه من</MudText>
|
||||
<MudText Typo="Typo.caption">شما می توانید اطلاعات فروشگاه خود را ویرایش نمایید</MudText>
|
||||
</MudStack>
|
||||
<MudSpacer/>
|
||||
<BaseButtonUi Size="Size.Large"
|
||||
OnClickCallback="ViewModel.SubmitShopSettingAsync"
|
||||
class="mt-2 mb-8 w-64 rounded-md"
|
||||
IsProcessing="@ViewModel.IsProcessing"
|
||||
Icon="@Icons.Material.Outlined.Check"
|
||||
Content="ثبتـــ اطلاعات" Variant="Variant.Filled" Color="Color.Success" />
|
||||
</MudStack>
|
||||
<MudGrid>
|
||||
<MudItem xs="12" sm="4">
|
||||
<MudTextField T="string" @bind-Value="@ViewModel.ShopSetting.Name" Variant="Variant.Outlined" Label="نام فروشاه"></MudTextField>
|
||||
</MudItem>
|
||||
|
||||
<MudItem xs="12" sm="4">
|
||||
<MudTextField T="string" @bind-Value="@ViewModel.ShopSetting.Slogan" Variant="Variant.Outlined" Label="شعار فروشگاه"></MudTextField>
|
||||
</MudItem>
|
||||
|
||||
<MudItem xs="12" sm="4">
|
||||
<MudTextField T="string" @bind-Value="@ViewModel.ShopSetting.Description" Variant="Variant.Outlined" Label="توضیحات"></MudTextField>
|
||||
</MudItem>
|
||||
|
||||
<MudItem xs="12" sm="5">
|
||||
<MudTextField T="double" @bind-Value="@ViewModel.ShopSetting.TaxesFee" Variant="Variant.Outlined" Label="مقدار مالیات"></MudTextField>
|
||||
</MudItem>
|
||||
|
||||
<MudItem xs="12" sm="5">
|
||||
<MudTextField T="double" @bind-Value="@ViewModel.ShopSetting.ServiceFee" Variant="Variant.Outlined" Label="مقدار سرویس"></MudTextField>
|
||||
</MudItem>
|
||||
|
||||
<MudItem xs="12" sm="2">
|
||||
<MudSelect T="bool" Variant="Variant.Outlined" Label="سرویس درصدی می باشد ؟">
|
||||
<MudSelectItem T="bool" Value="true">بلی</MudSelectItem>
|
||||
<MudSelectItem T="bool" Value="true">خیر</MudSelectItem>
|
||||
</MudSelect>
|
||||
</MudItem>
|
||||
|
||||
<MudItem xs="12" sm="3">
|
||||
<MudAutocomplete Required="true" ToStringFunc="dto => dto.Name" @bind-Value="@ViewModel.SelectedProvince"
|
||||
SearchFunc="@ViewModel.SearchProvinceAsync"
|
||||
T="Province"
|
||||
Label="استان"
|
||||
Variant="Variant.Outlined">
|
||||
<ProgressIndicatorInPopoverTemplate>
|
||||
<MudList Clickable="false">
|
||||
<MudListItem>
|
||||
<div class="flex flex-row w-full mx-auto">
|
||||
<MudProgressCircular class="my-auto mr-1 -ml-4" Size="Size.Small" Indeterminate="true" />
|
||||
<p class="font-bold my-1 mx-auto text-md">منتظر بمانید</p>
|
||||
</div>
|
||||
</MudListItem>
|
||||
</MudList>
|
||||
</ProgressIndicatorInPopoverTemplate>
|
||||
<ItemTemplate Context="e">
|
||||
<p>@e.Name</p>
|
||||
</ItemTemplate>
|
||||
</MudAutocomplete>
|
||||
</MudItem>
|
||||
|
||||
<MudItem xs="12" sm="3">
|
||||
<MudAutocomplete Required="true" ToStringFunc="dto => dto.Name" @bind-Value="@ViewModel.SelectedCity"
|
||||
SearchFunc="@ViewModel.SearchCityAsync"
|
||||
T="City"
|
||||
Label="شهر"
|
||||
Variant="Variant.Outlined">
|
||||
<ProgressIndicatorInPopoverTemplate>
|
||||
<MudList Clickable="false">
|
||||
<MudListItem>
|
||||
<div class="flex flex-row w-full mx-auto">
|
||||
<MudProgressCircular class="my-auto mr-1 -ml-4" Size="Size.Small" Indeterminate="true" />
|
||||
<p class="font-bold my-1 mx-auto text-md">منتظر بمانید</p>
|
||||
</div>
|
||||
</MudListItem>
|
||||
</MudList>
|
||||
</ProgressIndicatorInPopoverTemplate>
|
||||
<ItemTemplate Context="e">
|
||||
<p>@e.Name</p>
|
||||
</ItemTemplate>
|
||||
</MudAutocomplete>
|
||||
</MudItem>
|
||||
|
||||
<MudItem xs="12" sm="6">
|
||||
<MudTextField T="string" @bind-Value="@ViewModel.ShopSetting.Address" Variant="Variant.Outlined" Label="آدرس فروشگاه"></MudTextField>
|
||||
</MudItem>
|
||||
|
||||
<MudItem xs="12" sm="6">
|
||||
<MudTextField T="string" @bind-Value="@ViewModel.ShopSetting.ENamad" Variant="Variant.Outlined" Label="آدرس نماد اعتماد"></MudTextField>
|
||||
</MudItem>
|
||||
|
||||
</MudGrid>
|
||||
</MudPaper>
|
||||
|
||||
<MudPaper class="px-5 mt-8 py-5">
|
||||
<MudStack Row="true">
|
||||
<MudStack class="mb-5 mx-2">
|
||||
<MudText Typo="Typo.h4">تنظیمات درگاه پرداخت</MudText>
|
||||
<MudText Typo="Typo.caption">شما می توانید اطلاعات درگاه پرداخت خود را ویرایش نمایید</MudText>
|
||||
</MudStack>
|
||||
<MudSpacer />
|
||||
<BaseButtonUi Size="Size.Large" class="mt-2 mb-8 w-64 rounded-md"
|
||||
OnClickCallback="ViewModel.SubmitPaymentSettingAsync"
|
||||
IsProcessing="@ViewModel.IsProcessing"
|
||||
Icon="@Icons.Material.Outlined.Check" Content="ثبتـــ اطلاعات"
|
||||
Variant="Variant.Filled" Color="Color.Success" />
|
||||
</MudStack>
|
||||
<MudGrid>
|
||||
<MudItem xs="12" sm="6">
|
||||
<MudTextField T="string" @bind-Value="@ViewModel.PaymentSetting.ZarinPalApiKey" Variant="Variant.Outlined" Label="کد مرچنت زرین پال"></MudTextField>
|
||||
</MudItem>
|
||||
|
||||
<MudItem xs="12" sm="6">
|
||||
<MudTextField T="string" @bind-Value="@ViewModel.PaymentSetting.Shaba" Variant="Variant.Outlined" Label="شماره شبا پشتیبانی"></MudTextField>
|
||||
</MudItem>
|
||||
|
||||
</MudGrid>
|
||||
</MudPaper>
|
||||
</MudItem>
|
||||
</MudGrid>
|
||||
</MudStack>
|
||||
|
||||
@code
|
||||
{
|
||||
public ShopManagementPageViewModel ViewModel { get; set; }
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
ViewModel = new ShopManagementPageViewModel(NavigationManager, Snackbar, UserUtility, RestWrapper, DialogService);
|
||||
await ViewModel.InitializeAsync();
|
||||
await base.OnInitializedAsync();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,182 @@
|
|||
using NetinaShop.Domain.MartenEntities.Settings;
|
||||
using NetinaShop.Domain.Models.Districts;
|
||||
|
||||
namespace NetinaShop.AdminPanel.PWA.Pages;
|
||||
|
||||
public class ShopManagementPageViewModel : BaseViewModel
|
||||
{
|
||||
|
||||
private readonly NavigationManager _navigationManager;
|
||||
private readonly ISnackbar _snackbar;
|
||||
private readonly IUserUtility _userUtility;
|
||||
private readonly IDialogService _dialogService;
|
||||
private readonly IRestWrapper _restWrapper;
|
||||
|
||||
public ShopSetting ShopSetting { get; set; } = new ShopSetting();
|
||||
public PaymentSetting PaymentSetting { get; set; } = new PaymentSetting();
|
||||
|
||||
public List<City> Cities = new List<City>();
|
||||
public City SelectedCity = new City();
|
||||
public List<Province> Provinces = new List<Province>();
|
||||
public Province SelectedProvince = new Province();
|
||||
|
||||
|
||||
public ShopManagementPageViewModel(NavigationManager navigationManager, ISnackbar snackbar, IUserUtility userUtility, IRestWrapper restWrapper, IDialogService dialogService)
|
||||
{
|
||||
_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");
|
||||
|
||||
ShopSetting = await _restWrapper.SettingRestApi.GetSettingAsync<ShopSetting>("ShopSetting", token);
|
||||
|
||||
if (ShopSetting.CityId != 0)
|
||||
SelectedCity = new City { Id = ShopSetting.CityId, Name = ShopSetting.City };
|
||||
|
||||
if (ShopSetting.ProvinceId != 0)
|
||||
SelectedProvince = new Province { Id = ShopSetting.ProvinceId, Name = ShopSetting.Province };
|
||||
|
||||
PaymentSetting = await _restWrapper.SettingRestApi.GetSettingAsync<PaymentSetting>("PaymentSetting", token);
|
||||
|
||||
}
|
||||
catch (ApiException e)
|
||||
{
|
||||
var exe = await e.GetContentAsAsync<ApiResult>();
|
||||
_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 async Task<IEnumerable<City>> SearchCityAsync(string city)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (SelectedProvince.Id == default)
|
||||
throw new Exception("لطفا استان را انتخاب کنید");
|
||||
|
||||
Cities = await _restWrapper.DistrictApiRest.GetCitiesAsync(SelectedProvince.Id);
|
||||
|
||||
if (city.IsNullOrEmpty())
|
||||
return Cities;
|
||||
return Cities.Where(c => c.Name.Contains(city));
|
||||
}
|
||||
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 Cities;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_snackbar.Add(e.Message, Severity.Error);
|
||||
return Cities;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<Province>> SearchProvinceAsync(string province)
|
||||
{
|
||||
try
|
||||
{
|
||||
Provinces = await _restWrapper.DistrictApiRest.GetProvincesAsync();
|
||||
|
||||
if (province.IsNullOrEmpty())
|
||||
return Provinces;
|
||||
return Provinces.Where(c => c.Name.Contains(province));
|
||||
}
|
||||
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 Provinces;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_snackbar.Add(e.Message, Severity.Error);
|
||||
return Provinces;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SubmitShopSettingAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (SelectedProvince.Id == default)
|
||||
throw new Exception("لطفا استان را انتخاب کنید");
|
||||
if (SelectedCity.Id == default)
|
||||
throw new Exception("لطفا شهر را انتخاب نمایید");
|
||||
|
||||
ShopSetting.CityId = SelectedCity.Id;
|
||||
ShopSetting.ProvinceId = SelectedProvince.Id;
|
||||
ShopSetting.City = SelectedCity.Name;
|
||||
ShopSetting.Province = SelectedProvince.Name;
|
||||
|
||||
var token = await _userUtility.GetBearerTokenAsync();
|
||||
if (token == null) throw new Exception("Token is null");
|
||||
await _restWrapper.SettingRestApi.PostSettingAsync("ShopSetting", ShopSetting, token);
|
||||
_snackbar.Add("تنظیمات فروشگاه با موفقیت به روز شد", Severity.Success);
|
||||
}
|
||||
catch (ApiException ex)
|
||||
{
|
||||
var exe = await ex.GetContentAsAsync<ApiResult>();
|
||||
_snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_snackbar.Add(e.Message, Severity.Error);
|
||||
}
|
||||
finally
|
||||
{
|
||||
IsProcessing = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public async Task SubmitPaymentSettingAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
var token = await _userUtility.GetBearerTokenAsync();
|
||||
if (token == null) throw new Exception("Token is null");
|
||||
await _restWrapper.SettingRestApi.PostSettingAsync("PaymentSetting", PaymentSetting, token);
|
||||
_snackbar.Add("تنظیمات فروشگاه با موفقیت به روز شد", Severity.Success);
|
||||
}
|
||||
catch (ApiException ex)
|
||||
{
|
||||
var exe = await ex.GetContentAsAsync<ApiResult>();
|
||||
_snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_snackbar.Add(e.Message, Severity.Error);
|
||||
}
|
||||
finally
|
||||
{
|
||||
IsProcessing = false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
@page "/users"
|
||||
@page "/setting/user"
|
||||
@using NetinaShop.Domain.Entities.Users
|
||||
@attribute [Microsoft.AspNetCore.Authorization.Authorize]
|
||||
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
namespace NetinaShop.AdminPanel.PWA.Services.RestServices;
|
||||
|
||||
public interface IDistrictApiRest
|
||||
{
|
||||
[Get("/city")]
|
||||
public Task<List<City>> GetCitiesAsync();
|
||||
|
||||
[Get("/city")]
|
||||
public Task<List<City>> GetCitiesAsync([Query]int provinceId);
|
||||
|
||||
[Get("/province")]
|
||||
public Task<List<Province>> GetProvincesAsync();
|
||||
}
|
|
@ -4,10 +4,10 @@ public interface IPageRestApi
|
|||
{
|
||||
|
||||
[Get("/type/{type}")]
|
||||
Task<BasePageEntitySDto> ReadByType([Query] string type, [Header("Authorization")] string authorization);
|
||||
Task<BasePageSDto> ReadByType([Query] string type, [Header("Authorization")] string authorization);
|
||||
|
||||
[Get("/{id}")]
|
||||
Task<BasePageEntitySDto> ReadById(Guid id, [Header("Authorization")] string authorization);
|
||||
Task<BasePageSDto> ReadById(Guid id, [Header("Authorization")] string authorization);
|
||||
|
||||
[Post("")]
|
||||
Task CreatePage([Body] PageActionRequestDto request, [Header("Authorization")] string authorization);
|
||||
|
|
|
@ -21,4 +21,6 @@ public interface IRestWrapper
|
|||
public IPageRestApi PageRestApi { get; }
|
||||
public IScraperRestApi ScraperRestApi { get; }
|
||||
public IDashboardApiRest DashboardApiRest { get; }
|
||||
public ISettingRestApi SettingRestApi { get; }
|
||||
public IDistrictApiRest DistrictApiRest { get; }
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
namespace NetinaShop.AdminPanel.PWA.Services.RestServices;
|
||||
|
||||
public interface ISettingRestApi
|
||||
{
|
||||
[Get("/{settingName}")]
|
||||
public Task<TSetting> GetSettingAsync<TSetting>(string settingName, [Header("Authorization")] string authorization) where TSetting : class;
|
||||
|
||||
[Post("/{settingName}")]
|
||||
public Task PostSettingAsync<TSetting>(string settingName,[Body]TSetting setting , [Header("Authorization")]string authorization) where TSetting : class;
|
||||
}
|
|
@ -32,6 +32,7 @@ public class RestWrapper : IRestWrapper
|
|||
public IPaymentRestApi PaymentRestApi => RestService.For<IPaymentRestApi>(Address.PaymentController, setting);
|
||||
public IPageRestApi PageRestApi => RestService.For<IPageRestApi>(Address.PageController, setting);
|
||||
public IScraperRestApi ScraperRestApi => RestService.For<IScraperRestApi>(Address.ScraperController, setting);
|
||||
|
||||
public ISettingRestApi SettingRestApi => RestService.For<ISettingRestApi>(Address.SettingController, setting);
|
||||
public IDashboardApiRest DashboardApiRest => RestService.For<IDashboardApiRest>(Address.DashboardController, setting);
|
||||
public IDistrictApiRest DistrictApiRest => RestService.For<IDistrictApiRest>(Address.DistrictController, setting);
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
namespace NetinaShop.AdminPanel.PWA.Utilities.Models;
|
||||
public class CustomEventHelper
|
||||
{
|
||||
private readonly Func<EventArgs, Task> _callback;
|
||||
|
||||
public CustomEventHelper(Func<EventArgs, Task> callback)
|
||||
{
|
||||
_callback = callback;
|
||||
}
|
||||
|
||||
[JSInvokable]
|
||||
public Task OnCustomEvent(EventArgs args) => _callback(args);
|
||||
}
|
||||
|
||||
public class CustomEventInterop : IDisposable
|
||||
{
|
||||
private readonly IJSRuntime _jsRuntime;
|
||||
private DotNetObjectReference<CustomEventHelper> Reference;
|
||||
|
||||
public CustomEventInterop(IJSRuntime jsRuntime)
|
||||
{
|
||||
_jsRuntime = jsRuntime;
|
||||
}
|
||||
|
||||
public ValueTask<string> SetupCustomEventCallback(Func<EventArgs, Task> callback)
|
||||
{
|
||||
Reference = DotNetObjectReference.Create(new CustomEventHelper(callback));
|
||||
// addCustomEventListener will be a js function we create later
|
||||
return _jsRuntime.InvokeAsync<string>("addCustomEventListener", Reference);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Reference?.Dispose();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"version": "0.17.19.26",
|
||||
"versionNumber": 0.171926,
|
||||
"version": "0.19.22.38",
|
||||
"versionNumber": 0.192238,
|
||||
"versionName": "چرتکه",
|
||||
"description": "",
|
||||
"features": [
|
||||
|
@ -8,10 +8,14 @@
|
|||
"تکمیل پروسه سفارش گیری",
|
||||
"قابلیت افزودن تصویر به برند ها",
|
||||
"قابلیت افزودن تصویر به دسته بندی محصولات",
|
||||
"تغییر دیالوگ پرسشی"
|
||||
"تغییر دیالوگ پرسشی",
|
||||
"افزودن تنظیمات درگاه",
|
||||
"افزودن بخش تنظیمات فروشگاه"
|
||||
],
|
||||
"bugFixes": [
|
||||
"حل مشکلات امنیتی",
|
||||
"رفع مشکلات رسپانسیو"
|
||||
"رفع مشکلات رسپانسیو",
|
||||
"رفع مشکل دریافت تصاویر",
|
||||
"رفع مشکل عدم اتصال به درگاه"
|
||||
]
|
||||
}
|
||||
|
|
|
@ -1072,6 +1072,10 @@ input:checked + .toggle-bg {
|
|||
margin-left: 2.5rem;
|
||||
margin-right: 2.5rem;
|
||||
}
|
||||
.mx-2 {
|
||||
margin-left: 0.5rem;
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
.mx-3 {
|
||||
margin-left: 0.75rem;
|
||||
margin-right: 0.75rem;
|
||||
|
@ -1674,6 +1678,10 @@ input:checked + .toggle-bg {
|
|||
padding-top: 0.75rem;
|
||||
padding-bottom: 0.75rem;
|
||||
}
|
||||
.py-5 {
|
||||
padding-top: 1.25rem;
|
||||
padding-bottom: 1.25rem;
|
||||
}
|
||||
.py-8 {
|
||||
padding-top: 2rem;
|
||||
padding-bottom: 2rem;
|
||||
|
|
|
@ -1150,6 +1150,11 @@ input:checked + .toggle-bg {
|
|||
margin-right: 2.5rem;
|
||||
}
|
||||
|
||||
.mx-2 {
|
||||
margin-left: 0.5rem;
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
|
||||
.mx-3 {
|
||||
margin-left: 0.75rem;
|
||||
margin-right: 0.75rem;
|
||||
|
@ -1190,6 +1195,11 @@ input:checked + .toggle-bg {
|
|||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.my-5 {
|
||||
margin-top: 1.25rem;
|
||||
margin-bottom: 1.25rem;
|
||||
}
|
||||
|
||||
.my-auto {
|
||||
margin-top: auto;
|
||||
margin-bottom: auto;
|
||||
|
@ -1932,6 +1942,11 @@ input:checked + .toggle-bg {
|
|||
padding-bottom: 0.75rem;
|
||||
}
|
||||
|
||||
.py-5 {
|
||||
padding-top: 1.25rem;
|
||||
padding-bottom: 1.25rem;
|
||||
}
|
||||
|
||||
.py-8 {
|
||||
padding-top: 2rem;
|
||||
padding-bottom: 2rem;
|
||||
|
|
Loading…
Reference in New Issue