diff --git a/Documents/Vibe Coding Projects/dedicatednodes-redesign/dedicatednodes-bare-metal/new-baremetal.html b/Documents/Vibe Coding Projects/dedicatednodes-redesign/dedicatednodes-bare-metal/new-baremetal.html index 9c36fb2..1b71843 100644 --- a/Documents/Vibe Coding Projects/dedicatednodes-redesign/dedicatednodes-bare-metal/new-baremetal.html +++ b/Documents/Vibe Coding Projects/dedicatednodes-redesign/dedicatednodes-bare-metal/new-baremetal.html @@ -4201,54 +4201,86 @@ var wpcf7 = { }); } - // For instant customization, ignore WHMCS URL IDs and match based on server description - // The WHMCS URLs have wrong IDs for the €1520 server - if (selectedServer.storage === "4x Crucial T705 4TB NVMe + 2x Kioxia CM7-V 3.2TB NVMe") { - // Hard-code the correct configuration for this server - const correctConfig = { - 34: 166, // NVMe 1 - Crucial T705 4TB - 35: 252, // NVMe 2 - Crucial T705 4TB - 36: 260, // NVMe 3 - Crucial T705 4TB - 37: 269, // NVMe 4 - Crucial T705 4TB - 38: 254, // NVMe 5 - Kioxia CM7-V 3.2TB - 39: 288, // NVMe 6 - Kioxia CM7-V 3.2TB - }; + // For instant customization, we need to map the actual storage requirements to available options + // Parse storage requirements from description and match them to available options + console.log("Processing instant server with storage:", selectedServer.storage); - options.forEach(opt => { - let selectedValId = correctConfig[opt.id]; - if (selectedValId) { + // Parse storage requirements from description + const storageReqs = []; + const parts = selectedServer.storage.split('+'); + parts.forEach(part => { + const trimmed = part.trim(); + if (!trimmed) return; + const match = trimmed.match(/^(\d+)x\s+(.+)$/); + if (match) { + storageReqs.push({ + qty: parseInt(match[1]), + spec: match[2].trim() + }); + } + }); + console.log("Parsed storage requirements:", storageReqs); + + // Map requirements to available storage options + let reqIndex = 0; + options.forEach(opt => { + let selectedValId = null; + + if (opt.type === 'storage' && reqIndex < storageReqs.length) { + const req = storageReqs[reqIndex]; + let bestMatch = null; + let bestScore = 0; + + // Find the best matching option for this requirement + opt.values.forEach(val => { + let score = 0; + const valText = val.text.toLowerCase(); + const reqSpec = req.spec.toLowerCase(); + + // Check capacity match + const valCap = valText.match(/(\d+(?:\.\d+)?)\s*tb/i); + const reqCap = reqSpec.match(/(\d+(?:\.\d+)?)\s*tb/i); + if (valCap && reqCap && valCap[1] === reqCap[1]) { + score += 100; + } + + // Check brand match + if (valText.includes('crucial') && reqSpec.includes('crucial')) score += 50; + if (valText.includes('kioxia') && reqSpec.includes('kioxia')) score += 50; + if (valText.includes('samsung') && reqSpec.includes('samsung')) score += 50; + + // Check model match + if (valText.includes('t705') && reqSpec.includes('t705')) score += 50; + if (valText.includes('cm7') && reqSpec.includes('cm7')) score += 50; + + if (score > bestScore) { + bestScore = score; + bestMatch = val; + } + }); + + if (bestMatch && bestScore > 100) { + selectedValId = bestMatch.id; preselected[opt.id] = selectedValId; - console.log(`Storage option ${opt.id} (${opt.label}): set to ${selectedValId}`); + console.log(`Storage option ${opt.id} (${opt.label}): selected ${selectedValId} (${bestMatch.text})`); + reqIndex++; } + } else if (opt.type !== 'storage' && preselected[opt.id]) { + // Use preselected IDs for non-storage options + selectedValId = preselected[opt.id]; + } - // For non-storage options, apply price adjustment - if (opt.type !== 'storage' && selectedValId) { - const selectedVal = opt.values.find(v => v.id === selectedValId); - if (selectedVal && selectedVal.price > 0) { - const offset = selectedVal.price; - opt.values.forEach(v => { - v.price = parseFloat((v.price - offset).toFixed(2)); - }); - } + // Apply price adjustment for selected non-storage options + if (opt.type !== 'storage' && selectedValId) { + const selectedVal = opt.values.find(v => v.id === selectedValId); + if (selectedVal && selectedVal.price > 0) { + const offset = selectedVal.price; + opt.values.forEach(v => { + v.price = parseFloat((v.price - offset).toFixed(2)); + }); } - }); - } else { - // For other servers, use the preselected IDs from URL - options.forEach(opt => { - let selectedValId = preselected[opt.id]; - - // For non-storage options, apply price adjustment - if (opt.type !== 'storage' && selectedValId) { - const selectedVal = opt.values.find(v => v.id === selectedValId); - if (selectedVal && selectedVal.price > 0) { - const offset = selectedVal.price; - opt.values.forEach(v => { - v.price = parseFloat((v.price - offset).toFixed(2)); - }); - } - } - }); - } + } + }); // Render options with the exact WHMCS preselected values // Also pass the storage requirements for proper pre-filling @@ -4878,6 +4910,11 @@ var wpcf7 = { }); updatePooledVisuals(poolKey, isInstant); + + // For instant customization, update the storage summary + if (isInstant) { + updateStorageSummary(); + } }, 100); return grid;