// static/admin/js/vendor-product-edit.js /** * Admin vendor product edit page logic * Edit vendor product information and overrides */ const adminVendorProductEditLog = window.LogConfig.loggers.adminVendorProductEdit || window.LogConfig.createLogger('adminVendorProductEdit', false); adminVendorProductEditLog.info('Loading...'); function adminVendorProductEdit() { adminVendorProductEditLog.info('adminVendorProductEdit() called'); // Extract product ID from URL const pathParts = window.location.pathname.split('/'); const productId = parseInt(pathParts[pathParts.length - 2]); // /vendor-products/{id}/edit return { // Inherit base layout state ...data(), // Set page identifier currentPage: 'vendor-products', // Product ID from URL productId: productId, // Loading states loading: true, saving: false, error: '', // Product data product: null, // Form data form: { title: '', brand: '', vendor_sku: '', gtin: '', price_override: null, currency_override: '', availability: '', is_active: true, is_featured: false, is_digital: false, description: '' }, async init() { adminVendorProductEditLog.info('Vendor Product Edit init() called, ID:', this.productId); // Guard against multiple initialization if (window._adminVendorProductEditInitialized) { adminVendorProductEditLog.warn('Already initialized, skipping'); return; } window._adminVendorProductEditInitialized = true; // Load product data await this.loadProduct(); adminVendorProductEditLog.info('Vendor Product Edit initialization complete'); }, /** * Load product details and populate form */ async loadProduct() { this.loading = true; this.error = ''; try { const response = await apiClient.get(`/admin/vendor-products/${this.productId}`); this.product = response; // Populate form with current values this.form = { title: response.title || '', brand: response.brand || '', vendor_sku: response.vendor_sku || '', gtin: response.gtin || '', price_override: response.price_override || null, currency_override: response.currency_override || '', availability: response.availability || '', is_active: response.is_active ?? true, is_featured: response.is_featured ?? false, is_digital: response.is_digital ?? false, description: response.description || '' }; adminVendorProductEditLog.info('Loaded product:', this.product.id); } catch (error) { adminVendorProductEditLog.error('Failed to load product:', error); this.error = error.message || 'Failed to load product details'; } finally { this.loading = false; } }, /** * Save product changes */ async saveProduct() { this.saving = true; try { // Build update payload const payload = { title: this.form.title || null, brand: this.form.brand || null, vendor_sku: this.form.vendor_sku || null, gtin: this.form.gtin || null, price_override: this.form.price_override ? parseFloat(this.form.price_override) : null, currency_override: this.form.currency_override || null, availability: this.form.availability || null, is_active: this.form.is_active, is_featured: this.form.is_featured, is_digital: this.form.is_digital, description: this.form.description || null }; await apiClient.patch(`/admin/vendor-products/${this.productId}`, payload); adminVendorProductEditLog.info('Product saved:', this.productId); Utils.showToast('Product updated successfully', 'success'); // Redirect to detail page setTimeout(() => { window.location.href = `/admin/vendor-products/${this.productId}`; }, 1000); } catch (error) { adminVendorProductEditLog.error('Failed to save product:', error); Utils.showToast(error.message || 'Failed to save product', 'error'); } finally { this.saving = false; } } }; }