338 lines
12 KiB
JavaScript
338 lines
12 KiB
JavaScript
// 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);
|
|
},
|
|
};
|
|
} |