diff --git a/Areas/Inventory/Views/ItemMovement/ItemMovementUser.cshtml b/Areas/Inventory/Views/ItemMovement/ItemMovementUser.cshtml index 45c1df0..59c3380 100644 --- a/Areas/Inventory/Views/ItemMovement/ItemMovementUser.cshtml +++ b/Areas/Inventory/Views/ItemMovement/ItemMovementUser.cshtml @@ -49,12 +49,45 @@
-
+
-

Item ID: {{ itemId }}

+

Item Name: {{ group.productName }}

-
+
+
+
+ {{ movement.toOther === 'On Delivery' ? 'Receive' : 'Return' }}: + | Send Date: {{ movement.sendDate }} + | Receive Date: {{ movement.receiveDate || 'Not arrive' }} + | Status: {{ movement.latestStatus || movement.toOther }} + | +
+
+ +
+
+
+ +

Information: {{ movement.toOther }}

+

User: {{ movement.toUser }}

+

Station: {{ movement.toStationName }}

+

Store: {{ movement.toStoreName }}

+
+
+ +
+
+ +

Information: {{ movement.toOther }}

+

User: {{ movement.lastUser }}

+

Station: {{ movement.lastStationName }}

+

Store: {{ movement.lastStoreName }}

+
+
+
+
+
@@ -82,9 +115,12 @@ groupedByItem() { return this.itemMovements.reduce((acc, movement) => { if (!acc[movement.itemId]) { - acc[movement.itemId] = []; + acc[movement.itemId] = { + productName: movement.productName, + movements: [] + }; } - acc[movement.itemId].push(movement); + acc[movement.itemId].movements.push({...movement, showDetails: false}); return acc; }, {}); }, @@ -95,7 +131,7 @@ methods: { async fetchItemMovement() { try { - const response = await fetch('/InvMainAPI/ItemMovementUser', { + const response = await fetch('/InvMainAPI/ItemMovementUser', { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -105,7 +141,13 @@ if (!response.ok) { throw new Error('Failed to fetch item movement'); } - this.itemMovements = await response.json(); + const data = await response.json(); + + // Ensure showDetails is reactive + this.itemMovements = data.map(movement => ({ + ...movement, + showDetails: false + })); if (this.itemMovementNotCompleteDatatable) { this.itemMovementNotCompleteDatatable.clear().destroy(); @@ -124,10 +166,7 @@ renderTables() { if (this.sortBy === 'all') { this.initAllTables(); - } else { - console.log(this.sortBy); - this.initItemTables(); - } + } }, initAllTables() { @@ -194,41 +233,11 @@ this.loading = false; }, - initItemTables() { - if (this.itemMovementNotCompleteDatatable) { - this.itemMovementNotCompleteDatatable.clear().destroy(); + toggleDetails(id) { + const movement = this.itemMovements.find(m => m.id === id); + if (movement) { + movement.showDetails = !movement.showDetails; } - if (this.itemMovementCompleteDatatable) { - this.itemMovementCompleteDatatable.clear().destroy(); - } - Object.values(this.itemDatatables).forEach(table => table.destroy()); - this.itemDatatables = {}; - - Object.entries(this.groupedByItem).forEach(([itemId, movements]) => { - const tableId = `#itemTable_${itemId}`; - - this.itemDatatables[itemId] = $(tableId).DataTable({ - data: movements, - columns: this.getColumns(), - responsive: true, - }); - }); - }, - - getColumns() { - return [ - { title: "Unique Id", data: "id" }, - { title: "From User", data: "toUserName" }, - { title: "Last User", data: "lastUserName" }, - { title: "From Station", data: "toStationName" }, - { title: "From Store", data: "toStoreName" }, - { title: "Action", data: "action" }, - { title: "Start Status", data: "toOther" }, - { title: "Quantity", data: "quantity" }, - { title: "Send Date", data: "sendDate" }, - { title: "Note", data: "consignmentNote" }, - { title: "Remark", data: "remark" }, - ]; }, resetForm() { @@ -236,22 +245,7 @@ }, handleSorting() { - // Destroy existing DataTables before switching views - if (this.itemMovementNotCompleteDatatable) { - this.itemMovementNotCompleteDatatable.clear().destroy(); - this.itemMovementNotCompleteDatatable = null; - } - if (this.itemMovementCompleteDatatable) { - this.itemMovementCompleteDatatable.clear().destroy(); - this.itemMovementCompleteDatatable = null; - } - Object.values(this.itemDatatables).forEach(table => table.destroy()); - this.itemDatatables = {}; - - // Delay rendering to ensure Vue updates the DOM - this.$nextTick(() => { - this.renderTables(); - }); + this.$nextTick(() => this.fetchItemMovement()); }, diff --git a/Areas/Inventory/Views/ItemMovement/QrUser.cshtml b/Areas/Inventory/Views/ItemMovement/QrUser.cshtml index f22ab6c..1e66044 100644 --- a/Areas/Inventory/Views/ItemMovement/QrUser.cshtml +++ b/Areas/Inventory/Views/ItemMovement/QrUser.cshtml @@ -576,7 +576,6 @@ async receiveReturnAPI() { this.receiveReturn = 1; - console.log("update"); this.updateItemMovement(); }, diff --git a/Controllers/API/Inventory/InvMainAPI.cs b/Controllers/API/Inventory/InvMainAPI.cs index e10fb18..6e0d2a7 100644 --- a/Controllers/API/Inventory/InvMainAPI.cs +++ b/Controllers/API/Inventory/InvMainAPI.cs @@ -668,6 +668,8 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory } var itemMovementUser = await _centralDbContext.ItemMovements + .Include(i => i.Item) + .ThenInclude(i => i.Product) .Include(i => i.FromStore) .Include(i => i.FromStation) .Include(i => i.FromUser) @@ -684,6 +686,7 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory i.ToStation, i.ToStore, i.ToUser, + ProductName = i.Item?.Product?.ProductName, LastUserName = i.FromUser?.FullName, LastStoreName = i.FromStore?.StoreName, LastStationName = i.FromStation?.StationName,