Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 50 additions & 17 deletions src/samples/ERPInventory.Library/ERPInventoryComponent.razor
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,55 @@
}
else
{
<IgbGrid Data="InventoryService.Data"
AutoGenerate="false"
AllowFiltering="true"
Height="calc(100vh - 200px)"
@ref="grid">
<IgbColumn Field="Id" Header="ID" Width="5%" MinWidth="60px"></IgbColumn>
<IgbColumn Field="ProductName" Header="Product" Width="15%" MinWidth="130px" Sortable="true"></IgbColumn>
<IgbColumn Field="Category" Header="Category" Width="12%" MinWidth="100px"></IgbColumn>
<IgbColumn Field="Sku" Header="SKU" Width="10%" MinWidth="90px"></IgbColumn>
<IgbColumn Field="Quantity" Header="Quantity" DataType="GridColumnDataType.Number" Width="8%" MinWidth="85px"></IgbColumn>
<IgbColumn Field="UnitPrice" Header="Unit Price" DataType="GridColumnDataType.Number" Width="10%" MinWidth="95px"></IgbColumn>
<IgbColumn Field="TotalValue" Header="Total Value" DataType="GridColumnDataType.Number" Width="10%" MinWidth="100px"></IgbColumn>
<IgbColumn Field="Supplier" Header="Supplier" Width="12%" MinWidth="110px"></IgbColumn>
<IgbColumn Field="Warehouse" Header="Warehouse" Width="10%" MinWidth="100px"></IgbColumn>
<IgbColumn Field="Status" Header="Status" Width="8%" MinWidth="80px"></IgbColumn>
</IgbGrid>
<IgbHierarchicalGrid Data="InventoryService.Data"
PrimaryKey="Sku"
AutoGenerate="false"
AllowFiltering="true"
RowSelection="GridSelectionMode.Multiple"
Height="calc(100vh - 200px)"
@ref="grid">

<IgbGridToolbar>
<IgbGridToolbarTitle>Inventory</IgbGridToolbarTitle>
<IgbGridToolbarActions>
<IgbGridToolbarHiding />
<IgbGridToolbarPinning />
</IgbGridToolbarActions>
</IgbGridToolbar>

<IgbColumn Field="Sku" Header="SKU" Sortable="true" DataType="GridColumnDataType.String" Width="10%" MinWidth="100px"></IgbColumn>
<IgbColumn Field="ProductName" Header="Product Name" Sortable="true" Width="20%" MinWidth="150px"></IgbColumn>
<IgbColumn Field="Category" Header="Category" Sortable="true" DataType="GridColumnDataType.String" Width="15%" MinWidth="120px"></IgbColumn>
<IgbColumn Field="Rating" Header="Rating" Sortable="true" DataType="GridColumnDataType.Number" Width="10%" MinWidth="80px"></IgbColumn>
<IgbColumn Field="UnitsSold" Header="Units Sold" Sortable="true" DataType="GridColumnDataType.Number" Width="12%" MinWidth="110px"></IgbColumn>
<IgbColumn Field="GrossPrice" Header="Gross Price" Sortable="true" DataType="GridColumnDataType.Currency" Width="12%" MinWidth="110px"></IgbColumn>
<IgbColumn Field="NetPrice" Header="Net Price" Sortable="true" DataType="GridColumnDataType.Currency" Width="10%" MinWidth="100px"></IgbColumn>
<IgbColumn Field="TotalNetProfit" Header="Net Profit" Sortable="true" DataType="GridColumnDataType.Currency" Width="11%" MinWidth="110px"></IgbColumn>

<IgbRowIsland ChildDataKey="Orders" PrimaryKey="OrderId" AutoGenerate="false" AllowFiltering="true" RowSelection="GridSelectionMode.Multiple">
<IgbGridToolbar>
<IgbGridToolbarTitle>Sales data for the last month</IgbGridToolbarTitle>
</IgbGridToolbar>

<IgbColumn Field="OrderId" Header="Order ID" DataType="GridColumnDataType.Number" Width="10%" MinWidth="90px" Sortable="true"></IgbColumn>
<IgbColumn Field="Status" Header="Status" Width="12%" MinWidth="100px" Sortable="true"></IgbColumn>

<IgbColumnGroup Header="Delivery" Collapsible="true">
<IgbColumn Field="Delivery.DateOrdered" Header="Date Ordered" DataType="GridColumnDataType.Date" Sortable="true" Width="13%" MinWidth="130px" VisibleWhenCollapsed="true"></IgbColumn>
<IgbColumn Field="Delivery.DateShipped" Header="Date Shipped" DataType="GridColumnDataType.Date" Sortable="true" Width="13%" MinWidth="130px" VisibleWhenCollapsed="false"></IgbColumn>
<IgbColumn Field="Delivery.DateDelivered" Header="Date Delivered" DataType="GridColumnDataType.Date" Sortable="true" Width="14%" MinWidth="130px" VisibleWhenCollapsed="false"></IgbColumn>
</IgbColumnGroup>

<IgbColumnGroup Header="Order Information" Collapsible="true">
<IgbColumn Field="OrderInformation.Country" Header="Country" Width="10%" MinWidth="100px" Sortable="true" VisibleWhenCollapsed="false"></IgbColumn>
<IgbColumn Field="OrderInformation.City" Header="City" DataType="GridColumnDataType.String" Width="12%" MinWidth="110px" Sortable="true" VisibleWhenCollapsed="false"></IgbColumn>
<IgbColumn Field="OrderInformation.ZipCode" Header="Zip Code" DataType="GridColumnDataType.Number" Width="10%" MinWidth="90px" Sortable="true" VisibleWhenCollapsed="false"></IgbColumn>
<IgbColumn Field="OrderInformation.StreetNumber" Header="Street #" Width="9%" MinWidth="85px" Sortable="true" VisibleWhenCollapsed="false"></IgbColumn>
<IgbColumn Field="OrderInformation.StreetName" Header="Street Name" Width="14%" MinWidth="120px" Sortable="true" VisibleWhenCollapsed="false"></IgbColumn>
</IgbColumnGroup>
</IgbRowIsland>

</IgbHierarchicalGrid>
<div class="mt-3">
<small class="text-muted">
<i class="bi bi-info-circle"></i> Data updates every 3 seconds to simulate live inventory data
Expand All @@ -49,7 +82,7 @@
@code {
private bool isLoading = true;
private System.Timers.Timer? updateTimer;
private IgbGrid? grid;
private IgbHierarchicalGrid? grid;

protected override async Task OnInitializedAsync()
{
Expand Down
9 changes: 9 additions & 0 deletions src/samples/ERPInventory.Library/Models/DataPoint.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System.Text.Json.Serialization;

namespace ERPInventory.Library.Models;

public class DataPoint
{
[JsonPropertyName("unitsSold")]
public int UnitsSold { get; set; }
}
15 changes: 15 additions & 0 deletions src/samples/ERPInventory.Library/Models/DeliveryDetails.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System.Text.Json.Serialization;

namespace ERPInventory.Library.Models;

public class DeliveryDetails
{
[JsonPropertyName("dateOrdered")]
public string? DateOrdered { get; set; }

[JsonPropertyName("dateShipped")]
public string? DateShipped { get; set; }

[JsonPropertyName("dateDelivered")]
public string? DateDelivered { get; set; }
}
56 changes: 28 additions & 28 deletions src/samples/ERPInventory.Library/Models/InventoryData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,36 @@ namespace ERPInventory.Library.Models;

public class InventoryData
{
[JsonPropertyName("id")]
public string? Id { get; set; }

[JsonPropertyName("sku")]
public string? Sku { get; set; }

[JsonPropertyName("imageUrl")]
public string? ImageUrl { get; set; }

[JsonPropertyName("productName")]
public string? ProductName { get; set; }

[JsonPropertyName("category")]
public string? Category { get; set; }

[JsonPropertyName("sku")]
public string? Sku { get; set; }

[JsonPropertyName("quantity")]
public int Quantity { get; set; }

[JsonPropertyName("unitPrice")]
public double UnitPrice { get; set; }

[JsonPropertyName("totalValue")]
public double TotalValue { get; set; }

[JsonPropertyName("supplier")]
public string? Supplier { get; set; }

[JsonPropertyName("warehouse")]
public string? Warehouse { get; set; }

[JsonPropertyName("status")]
public string? Status { get; set; }

[JsonPropertyName("lastUpdated")]
public DateTime LastUpdated { get; set; }

[JsonPropertyName("rating")]
public double Rating { get; set; }

[JsonPropertyName("unitsSold")]
public int UnitsSold { get; set; }

[JsonPropertyName("grossPrice")]
public double GrossPrice { get; set; }

[JsonPropertyName("netPrice")]
public double NetPrice { get; set; }

[JsonPropertyName("totalNetProfit")]
public double TotalNetProfit { get; set; }

[JsonPropertyName("salesTrendData")]
public List<DataPoint> SalesTrendData { get; set; } = new();

[JsonPropertyName("orders")]
public List<Order> Orders { get; set; } = new();
}
18 changes: 18 additions & 0 deletions src/samples/ERPInventory.Library/Models/Order.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System.Text.Json.Serialization;

namespace ERPInventory.Library.Models;

public class Order
{
[JsonPropertyName("orderId")]
public int OrderId { get; set; }

[JsonPropertyName("status")]
public string? Status { get; set; }

[JsonPropertyName("delivery")]
public DeliveryDetails Delivery { get; set; } = new();

[JsonPropertyName("orderInformation")]
public OrderDetails OrderInformation { get; set; } = new();
}
21 changes: 21 additions & 0 deletions src/samples/ERPInventory.Library/Models/OrderDetails.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System.Text.Json.Serialization;

namespace ERPInventory.Library.Models;

public class OrderDetails
{
[JsonPropertyName("country")]
public string? Country { get; set; }

[JsonPropertyName("city")]
public string? City { get; set; }

[JsonPropertyName("zipCode")]
public int ZipCode { get; set; }

[JsonPropertyName("streetName")]
public string? StreetName { get; set; }

[JsonPropertyName("streetNumber")]
public string? StreetNumber { get; set; }
}
9 changes: 9 additions & 0 deletions src/samples/ERPInventory.Library/Models/OrderStatus.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace ERPInventory.Library.Models;

public static class OrderStatus
{
public const string Packed = "Packed";
public const string InTransit = "In Transit";
public const string Customs = "Customs";
public const string Delivered = "Delivered";
}
24 changes: 15 additions & 9 deletions src/samples/ERPInventory.Library/Services/InventoryService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,18 @@ public async Task LoadDataAsync()
{
var jsonText = await _httpClient.GetStringAsync(DataUrl);
Data = JsonSerializer.Deserialize<List<InventoryData>>(jsonText, options) ?? new();

// Calculate derived fields
foreach (var record in Data)
{
record.TotalValue = Math.Round(record.Quantity * record.UnitPrice, 2);
// Set unitsSold from last month's sales data
if (record.SalesTrendData.Count > 0)
{
record.UnitsSold = record.SalesTrendData[^1].UnitsSold;
}

// Calculate totalNetProfit
record.TotalNetProfit = Math.Round(record.UnitsSold * record.NetPrice, 2);
}

OnDataChanged?.Invoke();
Expand All @@ -46,7 +53,7 @@ public void UpdateAllData()
{
foreach (var dataRow in Data)
{
// Simulate live data updates - randomly adjust quantity
// Simulate live data updates - randomly adjust units sold
var volatility = 0.05;
var rnd = Math.Round(Random.Shared.NextDouble(), 2);
var changePercent = 2 * volatility * rnd;
Expand All @@ -55,12 +62,11 @@ public void UpdateAllData()
changePercent -= 2 * volatility;
}

var changeAmount = dataRow.Quantity * changePercent;
var newQuantity = dataRow.Quantity + (int)Math.Round(changeAmount);
dataRow.Quantity = Math.Max(0, newQuantity);

dataRow.TotalValue = Math.Round(dataRow.Quantity * dataRow.UnitPrice, 2);
dataRow.LastUpdated = DateTime.Now;
var changeAmount = dataRow.UnitsSold * changePercent;
var newUnitsSold = dataRow.UnitsSold + (int)Math.Round(changeAmount);
dataRow.UnitsSold = Math.Max(0, newUnitsSold);

dataRow.TotalNetProfit = Math.Round(dataRow.UnitsSold * dataRow.NetPrice, 2);
}

OnDataChanged?.Invoke();
Expand Down
Loading