feat: update frontend for unified order model
Update all frontend templates and JavaScript to use new unified Order model: - Orders tab: use status field, processing/cancelled values, items array - Order detail: use snapshot fields, items array, tracking_provider - JavaScript: update API params (status vs sync_status), orderStats fields - Tracking modal: use tracking_provider instead of tracking_carrier - Order items modal: use items array with item_state field All status mappings: - pending → pending (unconfirmed) - processing → confirmed (at least one item available) - cancelled → declined (all items unavailable) - shipped → shipped (with tracking) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -92,7 +92,7 @@ function adminMarketplaceLetzshop() {
|
||||
ordersFilter: '',
|
||||
ordersSearch: '',
|
||||
ordersHasDeclinedItems: false,
|
||||
orderStats: { pending: 0, confirmed: 0, rejected: 0, shipped: 0, has_declined_items: 0 },
|
||||
orderStats: { pending: 0, processing: 0, shipped: 0, delivered: 0, cancelled: 0, total: 0, has_declined_items: 0 },
|
||||
|
||||
// Jobs
|
||||
jobs: [],
|
||||
@@ -103,7 +103,7 @@ function adminMarketplaceLetzshop() {
|
||||
showTrackingModal: false,
|
||||
showOrderModal: false,
|
||||
selectedOrder: null,
|
||||
trackingForm: { tracking_number: '', tracking_carrier: '' },
|
||||
trackingForm: { tracking_number: '', tracking_provider: '' },
|
||||
|
||||
async init() {
|
||||
marketplaceLetzshopLog.info('init() called');
|
||||
@@ -399,7 +399,7 @@ function adminMarketplaceLetzshop() {
|
||||
});
|
||||
|
||||
if (this.ordersFilter) {
|
||||
params.append('sync_status', this.ordersFilter);
|
||||
params.append('status', this.ordersFilter);
|
||||
}
|
||||
|
||||
if (this.ordersHasDeclinedItems) {
|
||||
@@ -437,13 +437,14 @@ function adminMarketplaceLetzshop() {
|
||||
*/
|
||||
updateOrderStats() {
|
||||
// Reset stats
|
||||
this.orderStats = { pending: 0, confirmed: 0, rejected: 0, shipped: 0, has_declined_items: 0 };
|
||||
this.orderStats = { pending: 0, processing: 0, shipped: 0, delivered: 0, cancelled: 0, total: 0, has_declined_items: 0 };
|
||||
|
||||
// Count from orders list (only visible page - not accurate for totals)
|
||||
for (const order of this.orders) {
|
||||
if (this.orderStats.hasOwnProperty(order.sync_status)) {
|
||||
this.orderStats[order.sync_status]++;
|
||||
if (this.orderStats.hasOwnProperty(order.status)) {
|
||||
this.orderStats[order.status]++;
|
||||
}
|
||||
this.orderStats.total++;
|
||||
}
|
||||
},
|
||||
|
||||
@@ -669,7 +670,7 @@ function adminMarketplaceLetzshop() {
|
||||
this.selectedOrder = order;
|
||||
this.trackingForm = {
|
||||
tracking_number: order.tracking_number || '',
|
||||
tracking_carrier: order.tracking_carrier || ''
|
||||
tracking_provider: order.tracking_provider || ''
|
||||
};
|
||||
this.showTrackingModal = true;
|
||||
},
|
||||
@@ -707,17 +708,24 @@ function adminMarketplaceLetzshop() {
|
||||
},
|
||||
|
||||
/**
|
||||
* Confirm a single inventory unit
|
||||
* Confirm a single order item
|
||||
*/
|
||||
async confirmInventoryUnit(order, unit, index) {
|
||||
async confirmInventoryUnit(order, item, index) {
|
||||
if (!this.selectedVendor) return;
|
||||
|
||||
// Use external_item_id (Letzshop inventory unit ID)
|
||||
const itemId = item.external_item_id;
|
||||
if (!itemId) {
|
||||
this.error = 'Item has no external ID';
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await apiClient.post(
|
||||
`/admin/letzshop/vendors/${this.selectedVendor.id}/orders/${order.id}/items/${unit.id}/confirm`
|
||||
`/admin/letzshop/vendors/${this.selectedVendor.id}/orders/${order.id}/items/${itemId}/confirm`
|
||||
);
|
||||
// Update local state
|
||||
this.selectedOrder.inventory_units[index].state = 'confirmed_available';
|
||||
this.selectedOrder.items[index].item_state = 'confirmed_available';
|
||||
this.successMessage = 'Item confirmed';
|
||||
// Reload orders to get updated status
|
||||
await this.loadOrders();
|
||||
@@ -728,17 +736,24 @@ function adminMarketplaceLetzshop() {
|
||||
},
|
||||
|
||||
/**
|
||||
* Decline a single inventory unit
|
||||
* Decline a single order item
|
||||
*/
|
||||
async declineInventoryUnit(order, unit, index) {
|
||||
async declineInventoryUnit(order, item, index) {
|
||||
if (!this.selectedVendor) return;
|
||||
|
||||
// Use external_item_id (Letzshop inventory unit ID)
|
||||
const itemId = item.external_item_id;
|
||||
if (!itemId) {
|
||||
this.error = 'Item has no external ID';
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await apiClient.post(
|
||||
`/admin/letzshop/vendors/${this.selectedVendor.id}/orders/${order.id}/items/${unit.id}/decline`
|
||||
`/admin/letzshop/vendors/${this.selectedVendor.id}/orders/${order.id}/items/${itemId}/decline`
|
||||
);
|
||||
// Update local state
|
||||
this.selectedOrder.inventory_units[index].state = 'confirmed_unavailable';
|
||||
this.selectedOrder.items[index].item_state = 'confirmed_unavailable';
|
||||
this.successMessage = 'Item declined';
|
||||
// Reload orders to get updated status
|
||||
await this.loadOrders();
|
||||
|
||||
Reference in New Issue
Block a user