Update Quantity working; applying responsive styling changes next. Checking in at working state.

This commit is contained in:
Kira 2022-09-14 13:05:05 -07:00
parent df593b704d
commit a3a1071482
7 changed files with 136 additions and 5 deletions

View File

@ -128,5 +128,29 @@ namespace ShopOnline.Api.Controllers
}
}
[HttpPatch("{id:int}")]
public async Task<ActionResult<CartItemDto>> UpdateQuantity(int id, CartItemQuantityUpdateDto cartItemQuantityUpdateDto)
{
try
{
var cartItem = await this.shoppingCartRepository.UpdateQuantity(id, cartItemQuantityUpdateDto);
if(cartItem == null)
{
return NotFound();
}
var product = await productRepository.GetItem(cartItem.ProductId);
var cartItemDto = cartItem.ConvertToDto(product);
return Ok(cartItemDto);
}
catch (Exception ex)
{
return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
}
}
}
}

View File

@ -87,9 +87,18 @@ namespace ShopOnline.Api.Repositories
}).ToListAsync();
}
public Task<CartItem> UpdateQuantity(int id, CartItemQuantityUpdateDto cartItemQuantityUpdateDto)
public async Task<CartItem> UpdateQuantity(int id, CartItemQuantityUpdateDto cartItemQuantityUpdateDto)
{
throw new NotImplementedException();
var item = await this.shopOnlineDbContext.CartItems.FindAsync(id);
if(item != null)
{
item.Quantity = cartItemQuantityUpdateDto.Quantity;
await this.shopOnlineDbContext.SaveChangesAsync();
return item;
}
return null;
}
}
}

View File

@ -19,7 +19,12 @@ else {
<div class="col-md-8">
<h5>@item.ProductName</h5>
<div class="mb-4">@item.ProductDescription</div>
<span>Price: <b>@item.Price.ToString("C")</b></span>
<span>Price: <b>@item.Price.ToString("C")</b>
<input type="number" @bind="@item.Quantity"/>
<button class="btn btn-info btn-sm"
@onclick="(()=> UpdateQuantityCartItem_Click(item.Id, item.Quantity))"
>Update Quantity</button>
</span>
<div>
<button @onclick = "(() => DeleteCartItem_Click(item.Id))"
class="btn btn-danger sm">Remove</button>
@ -31,7 +36,7 @@ else {
<div class="col-md-3">
<h5>Cart Summary</h5>
<div class="mt-2">
<div>Total - </div>
<div>Total - (@TotalQuantity items)&nbsp; <b>@TotalPrice</b></div>
<a href="#" class="btn btn-success">
<span class="oi oi-credit-card"></span>&nbsp; Proceed to Checkout
</a>

View File

@ -13,11 +13,15 @@ namespace ShopOnline.Web.Pages
public string ErrorMessage { get; set; }
protected string TotalPrice { get; set; }
protected int TotalQuantity { get; set; }
protected override async Task OnInitializedAsync()
{
try
{
ShoppingCartItems = await ShoppingCartService.GetItems(HardCoded.UserId);
CalculateCartSummaryTotals();
}
catch (Exception ex)
{
@ -30,9 +34,71 @@ namespace ShopOnline.Web.Pages
var cartItemDto = await ShoppingCartService.DeleteItem(id);
RemoveCartItem(id);
CalculateCartSummaryTotals();
}
protected async Task UpdateQuantityCartItem_Click(int id, int quantity)
{
try
{
if(quantity > 0)
{
var updateItemDto = new CartItemQuantityUpdateDto
{
CartItemId = id,
Quantity = quantity
};
var returnedUpdateItemDto = await this.ShoppingCartService.UpdateQuantity(updateItemDto);
UpdateItemTotalPrice(returnedUpdateItemDto);
CalculateCartSummaryTotals();
}
else
{
var item = this.ShoppingCartItems.FirstOrDefault(i => i.Id == id);
if(item != null)
{
item.Quantity = 1;
item.TotalPrice = item.Price;
}
}
}
catch (Exception)
{
throw;
}
}
private void UpdateItemTotalPrice(CartItemDto cartItemDto)
{
var item = GetCartItem(cartItemDto.Id);
if(item != null)
{
item.TotalPrice = cartItemDto.Price * cartItemDto.Quantity;
}
}
private void CalculateCartSummaryTotals()
{
SetTotalPrice();
SetTotalQuantity();
}
private void SetTotalPrice()
{
TotalPrice = this.ShoppingCartItems.Sum(p => p.TotalPrice).ToString("C");
}
private void SetTotalQuantity()
{
TotalQuantity = this.ShoppingCartItems.Sum(p => p.Quantity);
}
private CartItemDto GetCartItem(int id)
{
return ShoppingCartItems.FirstOrDefault(i => i.Id == id);
@ -44,5 +110,7 @@ namespace ShopOnline.Web.Pages
ShoppingCartItems.Remove(CartItemDto);
}
}
}

View File

@ -7,5 +7,6 @@ namespace ShopOnline.Web.Services.Contracts
Task<List<CartItemDto>> GetItems(int userId);
Task<CartItemDto> AddItem(CartItemToAddDto cartItemToAddDto);
Task<CartItemDto> DeleteItem(int id);
Task<CartItemDto> UpdateQuantity(CartItemQuantityUpdateDto cartItemQuantityUpdateDto);
}
}

View File

@ -1,6 +1,9 @@
using ShopOnline.Models.Dtos;
using Newtonsoft.Json;
using ShopOnline.Models.Dtos;
using ShopOnline.Web.Services.Contracts;
using System.Net.Http.Json;
using System.Text;
using System.Text.Json.Serialization;
namespace ShopOnline.Web.Services
{
@ -82,6 +85,26 @@ namespace ShopOnline.Web.Services
}
}
public async Task<CartItemDto> UpdateQuantity(CartItemQuantityUpdateDto cartItemQuantityUpdateDto)
{
try
{
var jsonRequest = JsonConvert.SerializeObject(cartItemQuantityUpdateDto);
var content = new StringContent(jsonRequest, Encoding.UTF8, "application/json-patch+json");
var response = await httpClient.PatchAsync($"api/ShoppingCart/{cartItemQuantityUpdateDto.CartItemId}", content);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadFromJsonAsync<CartItemDto>();
}
return null;
}
catch (Exception)
{
throw;
}
}
}
}

View File

@ -9,6 +9,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="6.0.8" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="6.0.8" PrivateAssets="all" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
<ItemGroup>