// static/js/admin/vendor-edit.js function vendorEdit() { return { currentUser: {}, vendor: {}, formData: {}, errors: {}, loadingVendor: true, saving: false, vendorId: null, // Confirmation modal confirmModal: { show: false, title: '', message: '', warning: '', buttonText: '', buttonClass: 'btn-primary', onConfirm: () => {}, onCancel: null }, // Success modal successModal: { show: false, title: '', message: '', details: null, note: '' }, // Transfer ownership showTransferOwnership: false, transferring: false, transferData: { new_owner_user_id: null, transfer_reason: '', confirm_transfer: false }, init() { console.log('=== Vendor Edit Initialization ==='); // Check authentication if (!Auth.isAuthenticated() || !Auth.isAdmin()) { console.log('Not authenticated as admin, redirecting to login'); window.location.href = '/static/admin/login.html'; return; } this.currentUser = Auth.getCurrentUser(); console.log('Current user:', this.currentUser.username); // Get vendor ID from URL const urlParams = new URLSearchParams(window.location.search); this.vendorId = urlParams.get('id'); if (!this.vendorId) { console.error('No vendor ID in URL'); alert('No vendor ID provided'); window.location.href = '/static/admin/dashboard.html#vendors'; return; } console.log('Vendor ID:', this.vendorId); // Load vendor details this.loadVendor(); }, async loadVendor() { this.loadingVendor = true; try { console.log('Loading vendor with ID:', this.vendorId); this.vendor = await apiClient.get(`/admin/vendors/${this.vendorId}`); console.log('✅ Vendor loaded:', this.vendor.vendor_code); console.log('Owner email:', this.vendor.owner_email); console.log('Contact email:', this.vendor.contact_email); // Populate form data this.formData = { name: this.vendor.name, subdomain: this.vendor.subdomain, description: this.vendor.description || '', contact_email: this.vendor.contact_email || '', contact_phone: this.vendor.contact_phone || '', website: this.vendor.website || '', business_address: this.vendor.business_address || '', tax_number: this.vendor.tax_number || '' }; console.log('Form data populated'); } catch (error) { console.error('❌ Failed to load vendor:', error); Utils.showToast('Failed to load vendor details: ' + (error.message || 'Unknown error'), 'error'); window.location.href = '/static/admin/dashboard.html#vendors'; } finally { this.loadingVendor = false; } }, formatSubdomain() { this.formData.subdomain = this.formData.subdomain .toLowerCase() .replace(/[^a-z0-9-]/g, ''); }, async handleSubmit() { console.log('Submitting vendor update...'); this.errors = {}; this.saving = true; try { const updatedVendor = await apiClient.put( `/admin/vendors/${this.vendorId}`, this.formData ); console.log('✅ Vendor updated successfully'); Utils.showToast('Vendor updated successfully!', 'success'); this.vendor = updatedVendor; // Refresh form data with latest values this.formData.name = updatedVendor.name; this.formData.subdomain = updatedVendor.subdomain; this.formData.contact_email = updatedVendor.contact_email; } catch (error) { console.error('❌ Failed to update vendor:', error); Utils.showToast(error.message || 'Failed to update vendor', 'error'); } finally { this.saving = false; } }, showVerificationModal() { const action = this.vendor.is_verified ? 'unverify' : 'verify'; const actionCap = this.vendor.is_verified ? 'Unverify' : 'Verify'; this.confirmModal = { show: true, title: `${actionCap} Vendor`, message: `Are you sure you want to ${action} this vendor?`, warning: this.vendor.is_verified ? 'Unverifying this vendor will prevent them from being publicly visible and may affect their operations.' : 'Verifying this vendor will make them publicly visible and allow them to operate fully.', buttonText: actionCap, buttonClass: this.vendor.is_verified ? 'btn-warning' : 'btn-success', onConfirm: () => this.toggleVerification(), onCancel: null }; }, async toggleVerification() { const action = this.vendor.is_verified ? 'unverify' : 'verify'; console.log(`Toggling verification: ${action}`); this.saving = true; try { const result = await apiClient.put(`/admin/vendors/${this.vendorId}/verify`); this.vendor.is_verified = result.vendor.is_verified; console.log('✅ Verification toggled'); Utils.showToast(result.message, 'success'); } catch (error) { console.error('❌ Failed to toggle verification:', error); Utils.showToast('Failed to update verification status', 'error'); } finally { this.saving = false; } }, showStatusModal() { const action = this.vendor.is_active ? 'deactivate' : 'activate'; const actionCap = this.vendor.is_active ? 'Deactivate' : 'Activate'; this.confirmModal = { show: true, title: `${actionCap} Vendor`, message: `Are you sure you want to ${action} this vendor?`, warning: this.vendor.is_active ? 'Deactivating this vendor will immediately suspend all their operations and make them invisible to customers.' : 'Activating this vendor will restore their operations and make them visible again.', buttonText: actionCap, buttonClass: this.vendor.is_active ? 'btn-danger' : 'btn-success', onConfirm: () => this.toggleStatus(), onCancel: null }; }, async toggleStatus() { const action = this.vendor.is_active ? 'deactivate' : 'activate'; console.log(`Toggling status: ${action}`); this.saving = true; try { const result = await apiClient.put(`/admin/vendors/${this.vendorId}/status`); this.vendor.is_active = result.vendor.is_active; console.log('✅ Status toggled'); Utils.showToast(result.message, 'success'); } catch (error) { console.error('❌ Failed to toggle status:', error); Utils.showToast('Failed to update vendor status', 'error'); } finally { this.saving = false; } }, async handleTransferOwnership() { // Validate inputs if (!this.transferData.confirm_transfer) { Utils.showToast('Please confirm the ownership transfer', 'error'); return; } if (!this.transferData.new_owner_user_id) { Utils.showToast('Please enter the new owner user ID', 'error'); return; } // Close the transfer modal first this.showTransferOwnership = false; // Wait a moment for modal to close await new Promise(resolve => setTimeout(resolve, 300)); // Show final confirmation modal this.confirmModal = { show: true, title: '⚠️ FINAL CONFIRMATION: Transfer Ownership', message: `You are about to transfer ownership of "${this.vendor.name}" to user ID ${this.transferData.new_owner_user_id}.`, warning: `Current Owner: ${this.vendor.owner_username} (${this.vendor.owner_email})\n\n` + `This action will:\n` + `• Assign full ownership rights to the new user\n` + `• Demote the current owner to Manager role\n` + `• Be permanently logged for audit purposes\n\n` + `This action cannot be easily undone. Are you absolutely sure?`, buttonText: '🔄 Yes, Transfer Ownership', buttonClass: 'btn-danger', onConfirm: () => this.executeTransferOwnership(), onCancel: () => { // If cancelled, reopen the transfer modal with preserved data this.showTransferOwnership = true; } }; }, async executeTransferOwnership() { console.log('Transferring ownership to user:', this.transferData.new_owner_user_id); this.transferring = true; this.saving = true; try { const result = await apiClient.post( `/admin/vendors/${this.vendorId}/transfer-ownership`, this.transferData ); console.log('✅ Ownership transferred successfully'); // Show beautiful success modal this.successModal = { show: true, title: 'Ownership Transfer Complete', message: `The ownership of "${this.vendor.name}" has been successfully transferred.`, details: { oldOwner: { username: result.old_owner.username, email: result.old_owner.email }, newOwner: { username: result.new_owner.username, email: result.new_owner.email } }, note: 'The transfer has been logged for audit purposes. The previous owner has been assigned the Manager role.' }; Utils.showToast('Ownership transferred successfully', 'success'); // Reload vendor data to reflect new owner await this.loadVendor(); // Reset transfer form data this.transferData = { new_owner_user_id: null, transfer_reason: '', confirm_transfer: false }; } catch (error) { console.error('❌ Failed to transfer ownership:', error); const errorMsg = error.message || error.detail || 'Unknown error'; Utils.showToast(`Transfer failed: ${errorMsg}`, 'error'); // Show error in modal format (reuse success modal structure) alert(`❌ Transfer Failed\n\n${errorMsg}\n\nPlease check the user ID and try again.`); // Reopen transfer modal so user can try again this.showTransferOwnership = true; } finally { this.transferring = false; this.saving = false; } }, async handleLogout() { // Show confirmation modal for logout this.confirmModal = { show: true, title: '🚪 Confirm Logout', message: 'Are you sure you want to logout from the Admin Portal?', warning: 'You will need to login again to access the admin dashboard.', buttonText: 'Yes, Logout', buttonClass: 'btn-danger', onConfirm: () => this.executeLogout(), onCancel: null }; }, async executeLogout() { console.log('Logging out...'); // Show loading state briefly this.saving = true; // Clear authentication Auth.logout(); // Show success message Utils.showToast('Logged out successfully', 'success', 1000); // Redirect to login after brief delay setTimeout(() => { window.location.href = '/static/admin/login.html'; }, 500); }, }; }