feat : add order home page query filter

release
Amir Hossein Khademi 2024-05-16 15:45:20 +03:30
parent 53a7bf501f
commit 7bfff18735
6 changed files with 166 additions and 37 deletions

View File

@ -9,8 +9,9 @@
@inject IUserUtility UserUtility @inject IUserUtility UserUtility
@inject IRestWrapper RestWrapper @inject IRestWrapper RestWrapper
<MudStack class="w-full p-8 min-h-screen bg-[--mud-palette-background-grey]"> <MudStack class="px-3 md:p-5 lg:px-8 w-full h-screen overflow-x-hidden overflow-y-scroll bg-[--mud-palette-background-grey]">
<MudHidden Breakpoint="Breakpoint.Xs">
<MudGrid> <MudGrid>
<MudItem xs="12" 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">
@ -41,21 +42,93 @@
</MudPaper> </MudPaper>
</MudItem> </MudItem>
</MudGrid> </MudGrid>
</MudHidden>
<MudHidden Breakpoint="Breakpoint.SmAndUp">
<MudStack Row="true" class="whitespace-nowrap overflow-x-scroll w-screen no-scrollbar">
<MudPaper class="w-fit p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-6 ml-16">سفارشات امروز</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-amber-600"><b>@ViewModel.PageDto.TodayOrdersCount</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
<MudPaper class="w-fit p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-6 ml-16">سفارشات در انتظار تایید</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-blue-600"><b>@ViewModel.PageDto.PayedOrdersCount</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
<MudPaper class="w-fit p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-6 ml-16">سفارشات ارسال نشده</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-lime-600"><b>@ViewModel.PageDto.UnSendOrdersCount</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
<MudPaper class="w-fit p-3 m-2 rounded-md" Elevation="2">
<MudText Typo="Typo.body1" class="mb-6 ml-16">مجموع سفارش ماه</MudText>
<MudText Typo="Typo.h3" Align="Align.Center" class="text-rose-600"><b>@ViewModel.PageDto.ThisMonthOrdersCount</b></MudText>
<MudText Typo="Typo.h6" Align="Align.Center" class="mb-4 -mt-1"><b>عدد</b></MudText>
</MudPaper>
</MudStack>
</MudHidden>
<MudGrid> <MudGrid>
<MudItem xs="12"> <MudItem xs="12">
<MudPaper> <MudHidden Breakpoint="Breakpoint.SmAndUp">
<MudGrid class="mb-3" Row="true">
<MudItem xs="12" sm="6">
<MudTextField T="string" Placeholder="جست جو بر اساس کد فاکتور" OnClearButtonClick="@ViewModel.SearchAsync"
Adornment="Adornment.Start"
Immediate="true"
Clearable="true"
AdornmentIcon="@Icons.Material.Filled.Search"
IconSize="Size.Medium"
class="my-auto"
@bind-Value="@ViewModel.FactorCodeSearch"
OnAdornmentClick="@ViewModel.SearchAsync"></MudTextField>
</MudItem>
<MudItem xs="12" sm="6">
<MudSelect class="-mt-0.5" T="OrderStatus" Label="وظعیت سفارش" ToStringFunc="status => status.ToDisplay()" ValueChanged="@ViewModel.OrderStatusSearchChanged" Clearable="true" AnchorOrigin="Origin.BottomCenter">
<MudSelectItem Value="OrderStatus.Paid" />
<MudSelectItem Value="OrderStatus.Submitted" />
<MudSelectItem Value="OrderStatus.Delivered" />
<MudSelectItem Value="OrderStatus.Done" />
<MudSelectItem Value="OrderStatus.Canceled" />
</MudSelect>
</MudItem>
</MudGrid>
</MudHidden>
<MudPaper class="!max-h-[80vh] overflow-auto">
<MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true" <MudDataGrid FixedFooter="true" FixedHeader="true" Striped="true"
T="OrderSDto" Items="@ViewModel.MainOrders" CurrentPage="@ViewModel.MainGridCurrentPage" T="OrderSDto" Items="@ViewModel.MainOrders" CurrentPage="@ViewModel.MainGridCurrentPage"
RowsPerPage="20" Filterable="false" Loading="@ViewModel.IsProcessing" RowsPerPage="20" Filterable="false" Loading="@ViewModel.IsProcessing"
SortMode="@SortMode.None" Groupable="false"> SortMode="@SortMode.None" Groupable="false">
<ToolBarContent> <ToolBarContent>
@* <MudTextField T="string" Placeholder="جست جو بر اساس کد پیگیری" Adornment="Adornment.Start" Immediate="true" <MudGrid class="md:visible collapse">
<MudItem md="6">
<MudTextField T="string" Placeholder="جست جو بر اساس کد فاکتور" OnClearButtonClick="@ViewModel.SearchAsync"
Adornment="Adornment.Start"
Immediate="true"
Clearable="true" Clearable="true"
ValueChanged="@ViewModel.SearchChanged" AdornmentIcon="@Icons.Material.Filled.Search"
AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" class="my-auto" IconSize="Size.Medium"
OnAdornmentClick="@ViewModel.SearchAsync"></MudTextField> *@ class="my-auto"
@bind-Value="@ViewModel.FactorCodeSearch"
OnAdornmentClick="@ViewModel.SearchAsync"></MudTextField>
</MudItem>
<MudItem md="6">
<MudSelect class="-mt-0.5" T="OrderStatus" Label="وظعیت سفارش" ToStringFunc="status => status.ToDisplay()" ValueChanged="@ViewModel.OrderStatusSearchChanged" Clearable="true" AnchorOrigin="Origin.BottomCenter">
<MudSelectItem Value="OrderStatus.Paid" />
<MudSelectItem Value="OrderStatus.Submitted" />
<MudSelectItem Value="OrderStatus.Delivered" />
<MudSelectItem Value="OrderStatus.Done" />
<MudSelectItem Value="OrderStatus.Canceled" />
</MudSelect>
</MudItem>
</MudGrid>
</ToolBarContent> </ToolBarContent>
<Columns> <Columns>
<PropertyColumn Title="کد سفارش" Property="arg => arg.FactorCode" /> <PropertyColumn Title="کد سفارش" Property="arg => arg.FactorCode" />
@ -91,7 +164,7 @@
break; break;
case OrderStatus.Paid: case OrderStatus.Paid:
<MudChip Variant="Variant.Filled" class="-my-4" Color="Color.Info" >@context.Item.OrderStatus.ToDisplay()</MudChip> <MudChip Variant="Variant.Filled" class="-my-4" Color="Color.Info">@context.Item.OrderStatus.ToDisplay()</MudChip>
break; break;
case OrderStatus.Processing: case OrderStatus.Processing:
<MudChip Variant="Variant.Filled" class="-my-4" Color="Color.Info">@context.Item.OrderStatus.ToDisplay()</MudChip> <MudChip Variant="Variant.Filled" class="-my-4" Color="Color.Info">@context.Item.OrderStatus.ToDisplay()</MudChip>

View File

@ -32,7 +32,7 @@ public class OrdersPageViewModel : BaseViewModel<OrderDashboardDto>
throw new Exception("Token is null"); throw new Exception("Token is null");
IsProcessing = true; IsProcessing = true;
MainOrders.Clear(); MainOrders.Clear();
var dto = await _restWrapper.OrderRestApi.ReadAll(MainGridCurrentPage, null, null, null,token); var dto = await _restWrapper.OrderRestApi.ReadAll(MainGridCurrentPage,null, null, null, null,token);
dto.ForEach(d => MainOrders.Add(d)); dto.ForEach(d => MainOrders.Add(d));
if (MainOrders.Count == 15) if (MainOrders.Count == 15)
MainGridPageCount = 2; MainGridPageCount = 2;
@ -43,6 +43,11 @@ public class OrdersPageViewModel : BaseViewModel<OrderDashboardDto>
catch (ApiException ex) catch (ApiException ex)
{ {
var exe = await ex.GetContentAsAsync<ApiResult>(); 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); _snackbar.Add(exe != null ? exe.Message : ex.Content, Severity.Error);
} }
catch (Exception e) catch (Exception e)
@ -71,7 +76,7 @@ public class OrdersPageViewModel : BaseViewModel<OrderDashboardDto>
throw new Exception("Token is null"); throw new Exception("Token is null");
var dto = await _restWrapper.OrderRestApi.ReadAll(MainGridCurrentPage, null, null, null, token); var dto = await _restWrapper.OrderRestApi.ReadAll(MainGridCurrentPage,FactorCodeSearch, null, _orderStatusSearch, null, token);
dto.ForEach(d => MainOrders.Add(d)); dto.ForEach(d => MainOrders.Add(d));
if (MainOrders.Count == 15) if (MainOrders.Count == 15)
MainGridPageCount = MainGridCurrentPage + 2; MainGridPageCount = MainGridCurrentPage + 2;
@ -94,7 +99,6 @@ public class OrdersPageViewModel : BaseViewModel<OrderDashboardDto>
} }
} }
public async Task ShowClicked(OrderSDto order) public async Task ShowClicked(OrderSDto order)
{ {
DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.False, NoHeader = true, FullWidth = true, DisableBackdropClick = true }; DialogOptions maxWidth = new DialogOptions() { MaxWidth = MaxWidth.False, NoHeader = true, FullWidth = true, DisableBackdropClick = true };
@ -108,5 +112,50 @@ public class OrdersPageViewModel : BaseViewModel<OrderDashboardDto>
} }
} }
public string? FactorCodeSearch { get; set; } = null;
private OrderStatus? _orderStatusSearch;
public async Task SearchAsync()
{
try
{
var token = await _userUtility.GetBearerTokenAsync();
if (token == null)
throw new Exception("Token is null");
IsProcessing = true;
MainOrders.Clear();
var dto = await _restWrapper.OrderRestApi.ReadAll(MainGridCurrentPage, FactorCodeSearch,null, _orderStatusSearch, null, token);
dto.ForEach(d => MainOrders.Add(d));
if (MainOrders.Count == 15)
MainGridPageCount = 2;
var orderDashboardDto = await _restWrapper.DashboardApiRest.GetOrdersDashboardAsync(token);
PageDto = orderDashboardDto;
}
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 async Task OrderStatusSearchChanged(OrderStatus arg)
{
_orderStatusSearch = arg;
await SearchAsync();
}
} }

View File

@ -77,7 +77,7 @@
SortMode="@SortMode.None" Groupable="false"> SortMode="@SortMode.None" Groupable="false">
<ToolBarContent> <ToolBarContent>
<MudGrid class="md:visible collapse" Row="true"> <MudGrid class="md:visible collapse">
<MudItem xs="12" 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"

View File

@ -3,7 +3,7 @@
public interface IOrderRestApi public interface IOrderRestApi
{ {
[Get("")] [Get("")]
Task<List<OrderSDto>> ReadAll([Query]int page, [Query] long? selectedDate, [Query] OrderStatus? orderStatus, [Query] OrderQueryDateFilter? dateFilter, [Header("Authorization")] string authorization); Task<List<OrderSDto>> ReadAll([Query]int page, [Query] string? factorCode, [Query] long? selectedDate, [Query] OrderStatus? orderStatus, [Query] OrderQueryDateFilter? dateFilter, [Header("Authorization")] string authorization);
[Get("/{id}")] [Get("/{id}")]
Task<OrderLDto> ReadOne(Guid id, [Header("Authorization")] string authorization); Task<OrderLDto> ReadOne(Guid id, [Header("Authorization")] string authorization);

View File

@ -1313,9 +1313,6 @@ 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%;
} }
@ -2332,6 +2329,11 @@ code {
padding-left: 5rem; padding-left: 5rem;
padding-right: 5rem; padding-right: 5rem;
} }
.lg\:px-8 {
padding-left: 2rem;
padding-right: 2rem;
}
} }
.rtl\:rotate-180:where([dir="rtl"], [dir="rtl"] *) { .rtl\:rotate-180:where([dir="rtl"], [dir="rtl"] *) {

View File

@ -2673,6 +2673,11 @@ code {
padding-left: 5rem; padding-left: 5rem;
padding-right: 5rem; padding-right: 5rem;
} }
.lg\:px-8 {
padding-left: 2rem;
padding-right: 2rem;
}
} }
.rtl\:rotate-180:where([dir="rtl"], [dir="rtl"] *) { .rtl\:rotate-180:where([dir="rtl"], [dir="rtl"] *) {