feat : add delivery tracking code

release
Amir Hossein Khademi 2024-04-13 22:20:58 +03:30
parent 08c116aece
commit 64a4510445
15 changed files with 370 additions and 168 deletions

View File

@ -71,7 +71,7 @@
<MudNavGroup Title="تنظیماتـــ" Expanded="false" <MudNavGroup Title="تنظیماتـــ" Expanded="false"
Icon="@Icons.Material.Outlined.Settings"> Icon="@Icons.Material.Outlined.Settings">
<MudNavLink Href="management/shop" Icon="@Icons.Material.Filled.Shop2">فروشگاه</MudNavLink> <MudNavLink Href="management/shop" Icon="@Icons.Material.Filled.Shop2">فروشگاه</MudNavLink>
<MudNavLink Href="users" Icon="@Icons.Material.Filled.ManageAccounts">نقش ها و کاربران</MudNavLink> <MudNavLink Href="setting/users" Icon="@Icons.Material.Filled.ManageAccounts">نقش ها و کاربران</MudNavLink>
</MudNavGroup> </MudNavGroup>
</MudNavMenu> </MudNavMenu>
<p class="bottom-0 align-bottom mx-auto">Version : @version</p> <p class="bottom-0 align-bottom mx-auto">Version : @version</p>

View File

@ -18,7 +18,7 @@
<MudStack Row="true"> <MudStack Row="true">
<MudText Typo="Typo.h6" class="my-auto"><b>اطلاعات سفارش</b></MudText> <MudText Typo="Typo.h6" class="my-auto"><b>اطلاعات سفارش</b></MudText>
<MudSpacer/> <MudSpacer />
<MudPaper Elevation="0" class="bg-blue-500 px-4 py-2 my-auto"> <MudPaper Elevation="0" class="bg-blue-500 px-4 py-2 my-auto">
<MudText Typo="Typo.body2" class="text-white">@ViewModel.PageDto.OrderStatus.ToDisplay()</MudText> <MudText Typo="Typo.body2" class="text-white">@ViewModel.PageDto.OrderStatus.ToDisplay()</MudText>
</MudPaper> </MudPaper>
@ -38,36 +38,40 @@
</MudItem> </MudItem>
<MudItem xs="12" sm="8"> <MudItem xs="12" sm="6">
<MudField Variant="Variant.Outlined" Label="آدرس">@ViewModel.PageDto?.OrderDelivery?.Address</MudField> <MudField Variant="Variant.Outlined" Label="آدرس">@ViewModel.PageDto?.OrderDelivery?.Address</MudField>
</MudItem> </MudItem>
<MudItem xs="12" sm="4"> <MudItem xs="12" sm="3">
<MudField Variant="Variant.Outlined" Label="روش ارسال" >@ViewModel.PageDto?.OrderDelivery?.ShippingMethod</MudField> <MudField Variant="Variant.Outlined" Label="روش ارسال">@ViewModel.PageDto?.OrderDelivery?.ShippingMethod</MudField>
</MudItem>
<MudItem xs="12" sm="3">
<MudField Variant="Variant.Outlined" Label="کدرهگیری ارسال">@ViewModel.PageDto?.OrderDelivery?.TrackingCode</MudField>
</MudItem> </MudItem>
</MudGrid> </MudGrid>
<MudStack class="mt-3" Row="true"> <MudStack class="mt-3" Row="true">
<MudText Typo="Typo.h6"><b>کالاهای این سفارش</b></MudText> <MudText Typo="Typo.h6"><b>کالاهای این سفارش</b></MudText>
<MudSpacer/> <MudSpacer />
<MudPaper Elevation="0" class="border-dashed border-violet-400 border-2 px-3 py-1 my-auto"> <MudPaper Elevation="0" class="border-dashed border-violet-400 border-2 px-3 py-1 my-auto">
<MudText Typo="Typo.caption" class="text-violet-500"><b>@ViewModel.PageDto.OrderProducts.Sum(op => op.Count) قلم کالا</b></MudText> <MudText Typo="Typo.caption" class="text-violet-500"><b>@ViewModel.PageDto.OrderProducts.Sum(op => op.Count) قلم کالا</b></MudText>
</MudPaper> </MudPaper>
</MudStack> </MudStack>
<MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true" <MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true"
Elevation="0" Elevation="0"
Bordered="true" Bordered="true"
T="OrderProductSDto" Items="@ViewModel.PageDto.OrderProducts" T="OrderProductSDto" Items="@ViewModel.PageDto.OrderProducts"
Filterable="false" Loading="@ViewModel.IsProcessing" Filterable="false" Loading="@ViewModel.IsProcessing"
SortMode="@SortMode.None" Groupable="false" SortMode="@SortMode.None" Groupable="false"
class="border-solid border-2 border-gray-200"> class="border-solid border-2 border-gray-200">
<Columns> <Columns>
<TemplateColumn T="OrderProductSDto" Title="نام کالا"> <TemplateColumn T="OrderProductSDto" Title="نام کالا">
<CellTemplate> <CellTemplate>
<b>@context.Item.ProductName</b> <b>@context.Item.ProductName</b>
</CellTemplate> </CellTemplate>
</TemplateColumn> </TemplateColumn>
@ -99,31 +103,31 @@
<MudStack Row="true"> <MudStack Row="true">
<MudText class="my-auto" Typo="Typo.body2">جمع کالاها : </MudText> <MudText class="my-auto" Typo="Typo.body2">جمع کالاها : </MudText>
<MudSpacer/> <MudSpacer />
<MudText Typo="Typo.body1"><b>@ViewModel.PageDto.TotalProductsPrice.ToString("N0")</b> ریالــ</MudText> <MudText Typo="Typo.body1"><b>@ViewModel.PageDto.TotalProductsPrice.ToString("N0")</b> ریالــ</MudText>
</MudStack> </MudStack>
<MudDivider/> <MudDivider />
<MudStack Row="true"> <MudStack Row="true">
<MudText class="my-auto" Typo="Typo.body2">مالیات : </MudText> <MudText class="my-auto" Typo="Typo.body2">مالیات : </MudText>
<MudSpacer/> <MudSpacer />
<MudText Typo="Typo.body1"><b>@ViewModel.PageDto.TaxesPrice.ToString("N0")</b> ریالــ</MudText> <MudText Typo="Typo.body1"><b>@ViewModel.PageDto.TaxesPrice.ToString("N0")</b> ریالــ</MudText>
</MudStack> </MudStack>
<MudDivider/> <MudDivider />
<MudStack Row="true"> <MudStack Row="true">
<MudText class="my-auto" Typo="Typo.body2">بسته بندی : </MudText> <MudText class="my-auto" Typo="Typo.body2">بسته بندی : </MudText>
<MudSpacer/> <MudSpacer />
<MudText Typo="Typo.body1"><b>@ViewModel.PageDto.PackingPrice.ToString("N0")</b> ریالــ</MudText> <MudText Typo="Typo.body1"><b>@ViewModel.PageDto.PackingPrice.ToString("N0")</b> ریالــ</MudText>
</MudStack> </MudStack>
<MudDivider/> <MudDivider />
<MudStack Row="true"> <MudStack Row="true">
<MudText class="my-auto" Typo="Typo.body2">هزینه ارسال : </MudText> <MudText class="my-auto" Typo="Typo.body2">هزینه ارسال : </MudText>
<MudSpacer/> <MudSpacer />
<MudText Typo="Typo.body1"><b>@ViewModel.PageDto.DeliveryPrice.ToString("N0")</b> ریالــ</MudText> <MudText Typo="Typo.body1"><b>@ViewModel.PageDto.DeliveryPrice.ToString("N0")</b> ریالــ</MudText>
</MudStack> </MudStack>
@ -135,23 +139,23 @@
<MudStack Row="true"> <MudStack Row="true">
<MudText class="my-auto" Typo="Typo.body2">جمع کل : </MudText> <MudText class="my-auto" Typo="Typo.body2">جمع کل : </MudText>
<MudSpacer/> <MudSpacer />
<MudText Typo="Typo.body1"><b>@ViewModel.PageDto.TotalPriceWithoutDiscount.ToString("N0")</b> ریالــ</MudText> <MudText Typo="Typo.body1"><b>@ViewModel.PageDto.TotalPriceWithoutDiscount.ToString("N0")</b> ریالــ</MudText>
</MudStack> </MudStack>
<MudDivider/> <MudDivider />
<MudStack Row="true"> <MudStack Row="true">
<MudText class="my-auto" Typo="Typo.body2">مقدار تخفیف : </MudText> <MudText class="my-auto" Typo="Typo.body2">مقدار تخفیف : </MudText>
<MudSpacer/> <MudSpacer />
<MudText Typo="Typo.body1"><b>@ViewModel.PageDto.DiscountPrice.ToString("N0")</b> ریالــ</MudText> <MudText Typo="Typo.body1"><b>@ViewModel.PageDto.DiscountPrice.ToString("N0")</b> ریالــ</MudText>
</MudStack> </MudStack>
<MudDivider/> <MudDivider />
<MudStack Row="true"> <MudStack Row="true">
<MudText class="my-auto" Typo="Typo.body2">مبلغ قابل پرداخت : </MudText> <MudText class="my-auto" Typo="Typo.body2">مبلغ قابل پرداخت : </MudText>
<MudSpacer/> <MudSpacer />
<MudText Typo="Typo.body1"><b>@ViewModel.PageDto.TotalPrice.ToString("N0")</b> ریالــ</MudText> <MudText Typo="Typo.body1"><b>@ViewModel.PageDto.TotalPrice.ToString("N0")</b> ریالــ</MudText>
</MudStack> </MudStack>
@ -162,46 +166,58 @@
<MudText Typo="Typo.h6" class="mt-3"><b>پرداختــ ها</b></MudText> <MudText Typo="Typo.h6" class="mt-3"><b>پرداختــ ها</b></MudText>
<MudPaper Elevation="0" class="bg-[--mud-palette-background-grey] rounded-md"> <MudPaper Elevation="0" class="bg-[--mud-palette-background-grey] rounded-md">
<MudStack class="p-3"> <MudStack class="p-3">
@foreach (var item in ViewModel.PageDto.Payments) @foreach (var item in ViewModel.PageDto.Payments)
{ {
<MudStack Row="true"> <MudStack Row="true">
<MudText class="my-auto" Typo="Typo.body2">@item.Type.ToDisplay()</MudText> <MudText class="my-auto" Typo="Typo.body2">@item.Type.ToDisplay()</MudText>
<MudText class="my-auto" Typo="Typo.body2"> - </MudText> <MudText class="my-auto" Typo="Typo.body2"> - </MudText>
<MudText class="my-auto" Typo="Typo.body2">@item.Status.ToDisplay()</MudText> <MudText class="my-auto" Typo="Typo.body2">@item.Status.ToDisplay()</MudText>
<MudSpacer/> <MudSpacer />
<MudText Typo="Typo.body1"><b>@item.Amount.ToString("N0")</b> ریالــ</MudText> <MudText Typo="Typo.body1"><b>@item.Amount.ToString("N0")</b> ریالــ</MudText>
</MudStack> </MudStack>
} }
</MudStack> </MudStack>
</MudPaper> </MudPaper>
</MudItem> </MudItem>
</MudGrid> </MudGrid>
</MudStack> </MudStack>
</DialogContent> </DialogContent>
<DialogActions> <DialogActions>
<MudStack Row="true" class="w-full h-fit mx-4 mb-3 bottom-0"> <MudGrid Row="true" class="w-full h-fit mx-4 mb-3 bottom-0">
<BaseButtonUi class="w-64 h-12 rounded-md" IsProcessing="@ViewModel.IsProcessing" <MudItem xs="12" sm="6" md="6">
Icon="@Icons.Material.Outlined.AirportShuttle" <BaseButtonUi class="w-full h-12 rounded-md" IsProcessing="@ViewModel.IsProcessing"
Variant="Variant.Filled" Color="Color.Success" Icon="@Icons.Material.Outlined.AirportShuttle"
Content="@ViewModel.ConfirmOrderButtonText" OnClickCallback="ViewModel.SubmitConfirmAsync" /> Variant="Variant.Filled" Color="Color.Success"
<BaseButtonUi class="w-52 h-12 rounded-md" IsProcessing="@ViewModel.IsProcessing" Content="@ViewModel.ConfirmOrderButtonText"
Icon="@Icons.Material.Outlined.RemoveCircle" OnClickCallback="ViewModel.SubmitConfirmAsync" />
Variant="Variant.Outlined" Color="Color.Error" </MudItem>
Content="لغو سفارش" /> <MudItem xs="12" sm="6" md="2">
<MudSpacer /> <BaseButtonUi class="w-full h-12 rounded-md" IsProcessing="@ViewModel.IsProcessing"
Icon="@Icons.Material.Outlined.RemoveCircle"
Variant="Variant.Outlined" Color="Color.Error"
Content="لغو سفارش" />
</MudItem>
<BaseButtonUi class="w-52 h-12 rounded-md my-auto" IsProcessing="@ViewModel.IsProcessing" <MudItem xs="12" sm="6" md="3">
Icon="@Icons.Material.Outlined.Print" <BaseButtonUi class="w-full h-12 rounded-md my-auto" IsProcessing="@ViewModel.IsProcessing"
Size="Size.Small" Icon="@Icons.Material.Outlined.Print"
Variant="Variant.Outlined" Color="Color.Info" Size="Size.Small"
OnClickCallback="@ViewModel.PrintInvoiceAsync" Variant="Variant.Outlined" Color="Color.Info"
Content="چاپــ فاکتور" /> OnClickCallback="@ViewModel.PrintInvoiceAsync"
<MudButton Variant="Variant.Outlined" Size="Size.Medium" Color="Color.Error" OnClick="ViewModel.Cancel">بستن</MudButton> Content="چاپــ فاکتور" />
</MudStack> </MudItem>
<MudItem xs="12" sm="6" md="1">
<BaseButtonUi class="w-full h-12 rounded-md my-auto" IsProcessing="@ViewModel.IsProcessing"
Size="Size.Small"
Variant="Variant.Outlined" Color="Color.Error"
OnClickCallback="@ViewModel.Cancel"
Content="بستن" />
</MudItem>
</MudGrid>
</DialogActions> </DialogActions>
</MudDialog> </MudDialog>
@ -220,7 +236,7 @@
if (Order == null) if (Order == null)
ViewModel = new OrderActionDialogBoxViewModel(Snackbar, RestWrapper, UserUtility, DialogService, MudDialog, PrintingService, JsRuntime); ViewModel = new OrderActionDialogBoxViewModel(Snackbar, RestWrapper, UserUtility, DialogService, MudDialog, PrintingService, JsRuntime);
else else
ViewModel = new OrderActionDialogBoxViewModel(Snackbar, RestWrapper, UserUtility, DialogService, MudDialog, Order , PrintingService , JsRuntime); ViewModel = new OrderActionDialogBoxViewModel(Snackbar, RestWrapper, UserUtility, DialogService, MudDialog, Order, PrintingService, JsRuntime);
await ViewModel.InitializeAsync(); await ViewModel.InitializeAsync();
await base.OnInitializedAsync(); await base.OnInitializedAsync();
} }

View File

@ -54,6 +54,7 @@ public class OrderActionDialogBoxViewModel : BaseViewModel<OrderLDto>
public string ConfirmOrderButtonText { get; set; } = string.Empty; public string ConfirmOrderButtonText { get; set; } = string.Empty;
public bool IsEditing = false; public bool IsEditing = false;
public bool CanConfirm = true;
public override async Task InitializeAsync() public override async Task InitializeAsync()
@ -88,6 +89,10 @@ public class OrderActionDialogBoxViewModel : BaseViewModel<OrderLDto>
case OrderStatus.Delivered: case OrderStatus.Delivered:
ConfirmOrderButtonText = "ثبت انجام سفارش"; ConfirmOrderButtonText = "ثبت انجام سفارش";
break; break;
case OrderStatus.Done:
ConfirmOrderButtonText = "انجام شده";
CanConfirm = false;
break;
default: default:
throw new ArgumentOutOfRangeException(); throw new ArgumentOutOfRangeException();
} }
@ -171,6 +176,45 @@ public class OrderActionDialogBoxViewModel : BaseViewModel<OrderLDto>
default: default:
throw new ArgumentOutOfRangeException(); throw new ArgumentOutOfRangeException();
} }
if (nextOrderStatus == OrderStatus.Delivered)
{
var options = new DialogOptions { MaxWidth = MaxWidth.Small, FullWidth = true, NoHeader = true, CloseOnEscapeKey = true };
var trackingDialog = await _dialogService.ShowAsync<OrderTrackingCodeActionDialogBox>("ارسال کد رهگیری پستی", options);
var trackingDialogResult = await trackingDialog.Result;
if (!trackingDialogResult.Canceled && trackingDialogResult.Data is string trackingCode)
{
try
{
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
throw new Exception("Token is null");
IsProcessing = true;
await _restWrapper.OrderRestApi.ConfirmOrderStepAsync(PageDto.Id, nextOrderStatus,trackingCode, token);
_snackbar.Add($"سفارش {PageDto.FactorCode} به {nextOrderStatus.ToDisplay()} تغییر یافت", Severity.Success);
_mudDialog.Close(true);
}
catch (ApiException ex)
{
var exe = await ex.GetContentAsAsync<ApiResult>();
_snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error);
_mudDialog.Cancel();
}
catch (Exception e)
{
_snackbar.Add(e.Message, Severity.Error);
_mudDialog.Cancel();
}
finally
{
IsProcessing = false;
}
}
return;
}
var reference = await _dialogService.ShowQuestionDialog($"آیا از ثبت سفارش به {nextOrderStatus.ToDisplay()} اطمینان دارید ?"); var reference = await _dialogService.ShowQuestionDialog($"آیا از ثبت سفارش به {nextOrderStatus.ToDisplay()} اطمینان دارید ?");
var result = await reference.Result; var result = await reference.Result;
@ -187,7 +231,7 @@ public class OrderActionDialogBoxViewModel : BaseViewModel<OrderLDto>
await _restWrapper.OrderRestApi.ConfirmOrderStepAsync(PageDto.Id, nextOrderStatus, token); await _restWrapper.OrderRestApi.ConfirmOrderStepAsync(PageDto.Id, nextOrderStatus, token);
_snackbar.Add($"سفارش {PageDto.FactorCode} به {nextOrderStatus.ToDisplay()} تغییر یافت", Severity.Success); _snackbar.Add($"سفارش {PageDto.FactorCode} به {nextOrderStatus.ToDisplay()} تغییر یافت", Severity.Success);
_mudDialog.Close(); _mudDialog.Close(true);
} }
catch (ApiException ex) catch (ApiException ex)
{ {

View File

@ -0,0 +1,38 @@
<MudDialog class="overflow-y-hidden overflow-x-hidden">
<DialogContent>
<MudStack class=" pt-8 py-8 -mb-4 w-full">
<MudText Typo="Typo.h5" class="font-bold" Align="Align.Center">لطفا کد رهگیری ارسال را وارد کنید</MudText>
<MudTextField class="mt-3" Variant="Variant.Outlined" T="string" Label="کد رهگیری" @bind-Value="@TrackingCode"></MudTextField>
</MudStack>
</DialogContent>
<DialogActions>
<MudGrid class="p-2">
<MudItem lg="6">
<MudButton class="w-full py-3 font-bold" Color="Color.Info" Variant="Variant.Filled" OnClick="Submit" DisableElevation="true">تایید</MudButton>
</MudItem>
<MudItem lg="6">
<MudButton class="w-full py-3 font-bold" Variant="Variant.Outlined" Color="Color.Error" OnClick="Cancel">انصراف</MudButton>
</MudItem>
</MudGrid>
</DialogActions>
</MudDialog>
@code
{
[CascadingParameter]
MudDialogInstance? MudDialog { get; set; }
public string TrackingCode { get; set; } = string.Empty;
void Submit()
{
if (TrackingCode.IsNullOrEmpty())
{
return;
}
MudDialog?.Close(DialogResult.Ok(TrackingCode));
}
void Cancel() => MudDialog?.Cancel();
}

View File

@ -5,8 +5,8 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<ServiceWorkerAssetsManifest>service-worker-assets.js</ServiceWorkerAssetsManifest> <ServiceWorkerAssetsManifest>service-worker-assets.js</ServiceWorkerAssetsManifest>
<AssemblyVersion>0.17.21.31</AssemblyVersion> <AssemblyVersion>0.17.21.32</AssemblyVersion>
<FileVersion>0.17.21.31</FileVersion> <FileVersion>0.17.21.32</FileVersion>
<AssemblyName>$(MSBuildProjectName)</AssemblyName> <AssemblyName>$(MSBuildProjectName)</AssemblyName>
</PropertyGroup> </PropertyGroup>

View File

@ -7,31 +7,31 @@
@inject IUserUtility UserUtility @inject IUserUtility UserUtility
@inject IRestWrapper RestWrapper @inject IRestWrapper RestWrapper
<MudStack class="w-full p-8 h-screen bg-[--mud-palette-background-grey]"> <MudStack class="w-full p-8 min-h-screen bg-[--mud-palette-background-grey]">
<MudGrid> <MudGrid>
<MudItem sm="6" lg="3"> <MudItem xs="12" sm="6" lg="3">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2"> <MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">سفارشات امروز</MudText> <MudText Typo="Typo.body1" class="mb-4">سفارشات امروز</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-amber-600"><b>1124</b></MudText> <MudText Typo="Typo.h3" Align="Align.Center" class="text-amber-600"><b>1124</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText> <MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper> </MudPaper>
</MudItem> </MudItem>
<MudItem sm="6" lg="3"> <MudItem xs="12" sm="6" lg="3">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2"> <MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">سفارشات در انتظار تایید</MudText> <MudText Typo="Typo.body1" class="mb-4">سفارشات در انتظار تایید</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-blue-600"><b>845</b></MudText> <MudText Typo="Typo.h3" Align="Align.Center" class="text-blue-600"><b>845</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText> <MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper> </MudPaper>
</MudItem> </MudItem>
<MudItem sm="6" lg="3"> <MudItem xs="12" sm="6" lg="3">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2"> <MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تغییر نسبت هفته پیش</MudText> <MudText Typo="Typo.body1" class="mb-4">تغییر نسبت هفته پیش</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-lime-600"><b>125</b></MudText> <MudText Typo="Typo.h3" Align="Align.Center" class="text-lime-600"><b>125</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText> <MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper> </MudPaper>
</MudItem> </MudItem>
<MudItem sm="6" lg="3"> <MudItem xs="12" sm="6" lg="3">
<MudPaper class="p-3 m-2 rounded-md" Elevation="2"> <MudPaper class="p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-4">تغییر نسبت به ماه پیش</MudText> <MudText Typo="Typo.body1" class="mb-4">تغییر نسبت به ماه پیش</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-rose-600"><b>10</b></MudText> <MudText Typo="Typo.h3" Align="Align.Center" class="text-rose-600"><b>10</b></MudText>

View File

@ -10,23 +10,64 @@
<MudStack class="w-full p-8 h-screen bg-[--mud-palette-background-grey]"> <MudStack class="w-full p-8 h-screen bg-[--mud-palette-background-grey]">
<MudGrid> <MudGrid>
<MudItem xs="12"> <MudItem xs="12">
<MudStack Row="true" class="mb-5"> <MudGrid Row="true" class="mb-5">
<MudText Typo="Typo.h4">محصولاتــــ</MudText> <MudItem xs="12" sm="6" md="8">
<MudChip Color="Color.Info" Variant="Variant.Outlined">124 عدد</MudChip> <MudStack Row="true">
<MudSpacer/> <MudText Typo="Typo.h4">محصولاتــــ</MudText>
<MudButton Variant="Variant.Filled" <MudChip Color="Color.Info" Variant="Variant.Outlined">124 عدد</MudChip>
DisableElevation="true" </MudStack>
StartIcon="@Icons.Material.Outlined.Add" </MudItem>
Color="Color.Secondary" <MudItem xs="12" sm="6" md="4">
OnClick="@ViewModel.AddProductClicked" <MudButton Variant="Variant.Filled"
class="my-auto">افزودن محصول</MudButton> DisableElevation="true"
@* <MudButton Variant="Variant.Filled" StartIcon="@Icons.Material.Outlined.Add"
DisableElevation="true" Color="Color.Secondary"
StartIcon="@Icons.Material.Outlined.Add" OnClick="@ViewModel.AddProductClicked"
Color="Color.Error" class="md:my-auto w-full md:w-auto">افزودن محصول</MudButton>
OnClick="@ViewModel.AddDigikalaProductClicked" <MudButton Variant="Variant.Filled"
class="my-auto">افزودن محصول از دیجیکالا</MudButton> *@ DisableElevation="true"
</MudStack> StartIcon="@Icons.Material.Outlined.Add"
Color="Color.Error"
OnClick="@ViewModel.AddDigikalaProductClicked"
class="md:my-auto w-full md:w-auto">افزودن محصول از دیجیکالا</MudButton>
</MudItem>
</MudGrid>
<MudHidden Breakpoint="Breakpoint.SmAndUp">
<MudGrid class="mb-3" Row="true">
<MudItem xs="12" sm="6">
<MudTextField T="string" Placeholder="جست جو بر اساس نام" Adornment="Adornment.Start" Immediate="true"
Clearable="true"
ValueChanged="@ViewModel.SearchChanged"
AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" class="my-auto"
OnAdornmentClick="@ViewModel.SearchAsync"></MudTextField>
</MudItem>
<MudItem xs="12" sm="6">
<MudAutocomplete class="-mt-0.5" Required="true" ToStringFunc="dto => dto.Name"
T="ProductCategorySDto"
Label="بر اساس دسته بندی"
OnClearButtonClick="ViewModel.ClearProductCategorySearch"
SearchFunc="ViewModel.SearchProductCategory"
ValueChanged="ViewModel.ProductCategorySelected"
Clearable="true">
<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>
</MudGrid>
</MudHidden>
<MudPaper class="!max-h-[80vh] overflow-auto"> <MudPaper class="!max-h-[80vh] overflow-auto">
<MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true" <MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true"
@ -36,40 +77,40 @@
SortMode="@SortMode.None" Groupable="false"> SortMode="@SortMode.None" Groupable="false">
<ToolBarContent> <ToolBarContent>
<MudGrid Row="true"> <MudGrid class="md:visible collapse" Row="true">
<MudItem sm="6"> <MudItem xs="12" sm="6">
<MudTextField T="string" Placeholder="جست جو بر اساس نام" Adornment="Adornment.Start" Immediate="true" <MudTextField T="string" Placeholder="جست جو بر اساس نام" Adornment="Adornment.Start" Immediate="true"
Clearable="true" Clearable="true"
ValueChanged="@ViewModel.SearchChanged" ValueChanged="@ViewModel.SearchChanged"
AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" class="my-auto" AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" class="my-auto"
OnAdornmentClick="@ViewModel.SearchAsync"></MudTextField> OnAdornmentClick="@ViewModel.SearchAsync"></MudTextField>
</MudItem> </MudItem>
<MudItem sm="6"> <MudItem xs="12" sm="6">
<MudAutocomplete class="-mt-0.5" Required="true" ToStringFunc="dto => dto.Name" <MudAutocomplete class="-mt-0.5" Required="true" ToStringFunc="dto => dto.Name"
T="ProductCategorySDto" T="ProductCategorySDto"
Label="بر اساس دسته بندی" Label="بر اساس دسته بندی"
OnClearButtonClick="ViewModel.ClearProductCategorySearch" OnClearButtonClick="ViewModel.ClearProductCategorySearch"
SearchFunc="ViewModel.SearchProductCategory" SearchFunc="ViewModel.SearchProductCategory"
ValueChanged="ViewModel.ProductCategorySelected" ValueChanged="ViewModel.ProductCategorySelected"
Clearable="true"> Clearable="true">
<ProgressIndicatorInPopoverTemplate> <ProgressIndicatorInPopoverTemplate>
<MudList Clickable="false"> <MudList Clickable="false">
<MudListItem> <MudListItem>
<div class="flex flex-row w-full mx-auto"> <div class="flex flex-row w-full mx-auto">
<MudProgressCircular class="my-auto mr-1 -ml-4" Size="Size.Small" Indeterminate="true" /> <MudProgressCircular class="my-auto mr-1 -ml-4" Size="Size.Small" Indeterminate="true" />
<p class="font-bold my-1 mx-auto text-md">منتظر بمانید</p> <p class="font-bold my-1 mx-auto text-md">منتظر بمانید</p>
</div> </div>
</MudListItem> </MudListItem>
</MudList> </MudList>
</ProgressIndicatorInPopoverTemplate> </ProgressIndicatorInPopoverTemplate>
<ItemTemplate Context="e"> <ItemTemplate Context="e">
<p>@e.Name</p> <p>@e.Name</p>
</ItemTemplate> </ItemTemplate>
</MudAutocomplete> </MudAutocomplete>
</MudItem> </MudItem>
</MudGrid> </MudGrid>
</ToolBarContent> </ToolBarContent>
<Columns> <Columns>

View File

@ -10,16 +10,21 @@
<MudStack class="w-full p-8 h-screen bg-[--mud-palette-background-grey]"> <MudStack class="w-full p-8 h-screen bg-[--mud-palette-background-grey]">
<MudGrid> <MudGrid>
<MudItem xs="12"> <MudItem xs="12">
<MudStack Row="true" class="mb-5"> <MudGrid Row="true" class="mb-5">
<MudText Typo="Typo.h4">روش های ارسال سفارش</MudText> <MudItem xs="12" sm="6" md="8">
<MudSpacer /> <MudStack Row="true">
<MudButton Variant="Variant.Filled" <MudText Typo="Typo.h4">روش های ارسال سفارش</MudText>
DisableElevation="true" </MudStack>
StartIcon="@Icons.Material.Outlined.Add" </MudItem>
Color="Color.Secondary" <MudItem xs="12" sm="6" md="4">
OnClick="@ViewModel.AddClicked" <MudButton Variant="Variant.Filled"
class="my-auto">افزودن روش جدید</MudButton> DisableElevation="true"
</MudStack> StartIcon="@Icons.Material.Outlined.Add"
Color="Color.Secondary"
OnClick="@ViewModel.AddClicked"
class="my-auto">افزودن روش جدید</MudButton>
</MudItem>
</MudGrid>
<MudPaper> <MudPaper>
<MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true" <MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true"
T="ShippingSDto" Items="@ViewModel.PageDto" CurrentPage="@ViewModel.CurrentPage" T="ShippingSDto" Items="@ViewModel.PageDto" CurrentPage="@ViewModel.CurrentPage"

View File

@ -1,4 +1,4 @@
@page "/setting/user" @page "/setting/users"
@using NetinaShop.Domain.Entities.Users @using NetinaShop.Domain.Entities.Users
@attribute [Microsoft.AspNetCore.Authorization.Authorize] @attribute [Microsoft.AspNetCore.Authorization.Authorize]
@ -23,7 +23,7 @@
OnClick="@ViewModel.AddUserClicked" OnClick="@ViewModel.AddUserClicked"
class="my-auto">افزودن کاربر</MudButton> class="my-auto">افزودن کاربر</MudButton>
</MudStack> </MudStack>
<MudPaper> <MudPaper class="!max-h-[80vh] overflow-auto">
<MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true" <MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true"
T="ApplicationUserSDto" Items="@ViewModel.Users" CurrentPage="@ViewModel.UsersCurrentPage" T="ApplicationUserSDto" Items="@ViewModel.Users" CurrentPage="@ViewModel.UsersCurrentPage"
RowsPerPage="20" Filterable="false" Loading="@ViewModel.IsProcessing" RowsPerPage="20" Filterable="false" Loading="@ViewModel.IsProcessing"
@ -81,7 +81,7 @@
OnClick="@ViewModel.AddRoleClicked" OnClick="@ViewModel.AddRoleClicked"
class="my-auto">افزودن نقش</MudButton> class="my-auto">افزودن نقش</MudButton>
</MudStack> </MudStack>
<MudPaper> <MudPaper class="!max-h-[80vh] overflow-auto">
<MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true" <MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true"
T="ApplicationRole" Items="@ViewModel.Roles" CurrentPage="@ViewModel.RolesCurrentPage" T="ApplicationRole" Items="@ViewModel.Roles" CurrentPage="@ViewModel.RolesCurrentPage"
RowsPerPage="20" Filterable="false" Loading="@ViewModel.IsProcessing" RowsPerPage="20" Filterable="false" Loading="@ViewModel.IsProcessing"

View File

@ -9,7 +9,9 @@ public interface IOrderRestApi
Task<OrderLDto> ReadOne(Guid id, [Header("Authorization")] string authorization); Task<OrderLDto> ReadOne(Guid id, [Header("Authorization")] string authorization);
[Post("/{id}/confirm")] [Post("/{id}/confirm")]
Task<bool> ConfirmOrderStepAsync(Guid id,[Query] OrderStatus nextOrderStatus , [Header("Authorization")] string authorization); Task<bool> ConfirmOrderStepAsync(Guid id,[Query] OrderStatus nextOrderStatus, [Header("Authorization")] string authorization);
[Post("/{id}/confirm")]
Task<bool> ConfirmOrderStepAsync(Guid id, [Query] OrderStatus nextOrderStatus, [Query]string trackingCode, [Header("Authorization")] string authorization);
[Get("/{id}/invoice")] [Get("/{id}/invoice")]
Task<HttpContent> GetOrderInvoice(Guid id, [Header("Authorization")] string authorization); Task<HttpContent> GetOrderInvoice(Guid id, [Header("Authorization")] string authorization);

View File

@ -34,7 +34,7 @@
"flowbite": "^2.2.1", "flowbite": "^2.2.1",
"postcss": "^8.4.33", "postcss": "^8.4.33",
"postcss-cli": "^11.0.0", "postcss-cli": "^11.0.0",
"tailwindcss": "^3.4.1" "tailwindcss": "^3.4.3"
} }
}, },
"node_modules/@alloc/quick-lru": { "node_modules/@alloc/quick-lru": {
@ -1802,9 +1802,9 @@
} }
}, },
"node_modules/tailwindcss": { "node_modules/tailwindcss": {
"version": "3.4.1", "version": "3.4.3",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz",
"integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==",
"dependencies": { "dependencies": {
"@alloc/quick-lru": "^5.2.0", "@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2", "arg": "^5.0.2",
@ -1814,7 +1814,7 @@
"fast-glob": "^3.3.0", "fast-glob": "^3.3.0",
"glob-parent": "^6.0.2", "glob-parent": "^6.0.2",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
"jiti": "^1.19.1", "jiti": "^1.21.0",
"lilconfig": "^2.1.0", "lilconfig": "^2.1.0",
"micromatch": "^4.0.5", "micromatch": "^4.0.5",
"normalize-path": "^3.0.0", "normalize-path": "^3.0.0",

View File

@ -1,10 +1,5 @@
{ {
"dependencies": { "dependencies": {
"autoprefixer": "^10.4.17",
"flowbite": "^2.2.1",
"postcss": "^8.4.33",
"postcss-cli": "^11.0.0",
"tailwindcss": "^3.4.1",
"@ckeditor/ckeditor5-alignment": "41.0.0", "@ckeditor/ckeditor5-alignment": "41.0.0",
"@ckeditor/ckeditor5-autoformat": "41.0.0", "@ckeditor/ckeditor5-autoformat": "41.0.0",
"@ckeditor/ckeditor5-basic-styles": "41.0.0", "@ckeditor/ckeditor5-basic-styles": "41.0.0",
@ -25,7 +20,12 @@
"@ckeditor/ckeditor5-typing": "41.0.0", "@ckeditor/ckeditor5-typing": "41.0.0",
"@ckeditor/ckeditor5-undo": "41.0.0", "@ckeditor/ckeditor5-undo": "41.0.0",
"@ckeditor/ckeditor5-upload": "41.0.0", "@ckeditor/ckeditor5-upload": "41.0.0",
"@ckeditor/ckeditor5-word-count": "41.0.0" "@ckeditor/ckeditor5-word-count": "41.0.0",
"autoprefixer": "^10.4.17",
"flowbite": "^2.2.1",
"postcss": "^8.4.33",
"postcss-cli": "^11.0.0",
"tailwindcss": "^3.4.3"
}, },
"name": "netina.admin.pwa", "name": "netina.admin.pwa",
"version": "1.0.0", "version": "1.0.0",

View File

@ -5,17 +5,19 @@
"description": "", "description": "",
"features": [ "features": [
"افزودن تم دارک", "افزودن تم دارک",
"تکمیل پروسه سفارش گیری",
"قابلیت افزودن تصویر به برند ها",
"قابلیت افزودن تصویر به دسته بندی محصولات",
"تغییر دیالوگ پرسشی", "تغییر دیالوگ پرسشی",
"افزودن تنظیمات درگاه", "افزودن تنظیمات درگاه",
"افزودن بخش تنظیمات فروشگاه" "افزودن کد رهگیری پستی",
"تکمیل پروسه سفارش گیری",
"افزودن بخش تنظیمات فروشگاه",
"قابلیت افزودن تصویر به برند ها",
"قابلیت افزودن تصویر به دسته بندی محصولات"
], ],
"bugFixes": [ "bugFixes": [
"حل مشکلات امنیتی", "حل مشکلات امنیتی",
"رفع مشکلات رسپانسیو", "رفع مشکلات رسپانسیو",
"رفع مشکل دریافت تصاویر", "رفع مشکل دریافت تصاویر",
"رفع مشکل عدم اتصال به درگاه" "رفع مشکل عدم اتصال به درگاه",
"رفع مشکلات ساختاری در ریسپانس"
] ]
} }

View File

@ -1,5 +1,5 @@
/* /*
! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com ! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com
*//* *//*
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
@ -179,6 +179,7 @@ textarea {
font-size: 100%; /* 1 */ font-size: 100%; /* 1 */
font-weight: inherit; /* 1 */ font-weight: inherit; /* 1 */
line-height: inherit; /* 1 */ line-height: inherit; /* 1 */
letter-spacing: inherit; /* 1 */
color: inherit; /* 1 */ color: inherit; /* 1 */
margin: 0; /* 2 */ margin: 0; /* 2 */
padding: 0; /* 3 */ padding: 0; /* 3 */
@ -199,9 +200,9 @@ select {
*/ */
button, button,
[type='button'], input:where([type='button']),
[type='reset'], input:where([type='reset']),
[type='submit'] { input:where([type='submit']) {
-webkit-appearance: button; /* 1 */ -webkit-appearance: button; /* 1 */
background-color: transparent; /* 2 */ background-color: transparent; /* 2 */
background-image: none; /* 2 */ background-image: none; /* 2 */
@ -913,6 +914,10 @@ input:checked + .toggle-bg {
--tw-backdrop-opacity: ; --tw-backdrop-opacity: ;
--tw-backdrop-saturate: ; --tw-backdrop-saturate: ;
--tw-backdrop-sepia: ; --tw-backdrop-sepia: ;
--tw-contain-size: ;
--tw-contain-layout: ;
--tw-contain-paint: ;
--tw-contain-style: ;
} }
::backdrop { ::backdrop {
@ -963,6 +968,10 @@ input:checked + .toggle-bg {
--tw-backdrop-opacity: ; --tw-backdrop-opacity: ;
--tw-backdrop-saturate: ; --tw-backdrop-saturate: ;
--tw-backdrop-sepia: ; --tw-backdrop-sepia: ;
--tw-contain-size: ;
--tw-contain-layout: ;
--tw-contain-paint: ;
--tw-contain-style: ;
} }
.container { .container {
width: 100%; width: 100%;
@ -1115,6 +1124,9 @@ input:checked + .toggle-bg {
.-mb-3 { .-mb-3 {
margin-bottom: -0.75rem; margin-bottom: -0.75rem;
} }
.-mb-4 {
margin-bottom: -1rem;
}
.-ml-4 { .-ml-4 {
margin-left: -1rem; margin-left: -1rem;
} }
@ -1293,6 +1305,9 @@ input:checked + .toggle-bg {
.min-h-\[33rem\] { .min-h-\[33rem\] {
min-height: 33rem; min-height: 33rem;
} }
.min-h-screen {
min-height: 100vh;
}
.w-1\/2 { .w-1\/2 {
width: 50%; width: 50%;
} }
@ -2118,6 +2133,19 @@ code {
@media (min-width: 768px) { @media (min-width: 768px) {
.md\:visible {
visibility: visible;
}
.md\:my-auto {
margin-top: auto;
margin-bottom: auto;
}
.md\:w-auto {
width: auto;
}
.md\:basis-1\/2 { .md\:basis-1\/2 {
flex-basis: 50%; flex-basis: 50%;
} }

View File

@ -1,5 +1,5 @@
/* /*
! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com ! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com
*/ */
/* /*
@ -211,6 +211,8 @@ textarea {
/* 1 */ /* 1 */
line-height: inherit; line-height: inherit;
/* 1 */ /* 1 */
letter-spacing: inherit;
/* 1 */
color: inherit; color: inherit;
/* 1 */ /* 1 */
margin: 0; margin: 0;
@ -234,9 +236,9 @@ select {
*/ */
button, button,
[type='button'], input:where([type='button']),
[type='reset'], input:where([type='reset']),
[type='submit'] { input:where([type='submit']) {
-webkit-appearance: button; -webkit-appearance: button;
/* 1 */ /* 1 */
background-color: transparent; background-color: transparent;
@ -965,6 +967,10 @@ input:checked + .toggle-bg {
--tw-backdrop-opacity: ; --tw-backdrop-opacity: ;
--tw-backdrop-saturate: ; --tw-backdrop-saturate: ;
--tw-backdrop-sepia: ; --tw-backdrop-sepia: ;
--tw-contain-size: ;
--tw-contain-layout: ;
--tw-contain-paint: ;
--tw-contain-style: ;
} }
::backdrop { ::backdrop {
@ -1015,6 +1021,10 @@ input:checked + .toggle-bg {
--tw-backdrop-opacity: ; --tw-backdrop-opacity: ;
--tw-backdrop-saturate: ; --tw-backdrop-saturate: ;
--tw-backdrop-sepia: ; --tw-backdrop-sepia: ;
--tw-contain-size: ;
--tw-contain-layout: ;
--tw-contain-paint: ;
--tw-contain-style: ;
} }
.container { .container {
@ -1195,11 +1205,6 @@ input:checked + .toggle-bg {
margin-bottom: 1rem; margin-bottom: 1rem;
} }
.my-5 {
margin-top: 1.25rem;
margin-bottom: 1.25rem;
}
.my-auto { .my-auto {
margin-top: auto; margin-top: auto;
margin-bottom: auto; margin-bottom: auto;
@ -1317,6 +1322,10 @@ input:checked + .toggle-bg {
margin-top: 2rem; margin-top: 2rem;
} }
.-mb-4 {
margin-bottom: -1rem;
}
.line-clamp-1 { .line-clamp-1 {
overflow: hidden; overflow: hidden;
display: -webkit-box; display: -webkit-box;
@ -1445,6 +1454,10 @@ input:checked + .toggle-bg {
min-height: 33rem; min-height: 33rem;
} }
.min-h-screen {
min-height: 100vh;
}
.w-1\/2 { .w-1\/2 {
width: 50%; width: 50%;
} }
@ -2458,6 +2471,19 @@ code {
} }
@media (min-width: 768px) { @media (min-width: 768px) {
.md\:visible {
visibility: visible;
}
.md\:my-auto {
margin-top: auto;
margin-bottom: auto;
}
.md\:w-auto {
width: auto;
}
.md\:basis-1\/2 { .md\:basis-1\/2 {
flex-basis: 50%; flex-basis: 50%;
} }