Files
RollCalcPython/static/rollcalc_v14.js

233 lines
7.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* ROLLCALC V14 - ARTICLE SELECTION & AUTO-CALCULATION
* ====================================================
* Handles article selection, auto-fill of dimensions, and weight calculation
* Integrates with stddev_calculator.js for range calculations
*/
/**
* Populate article dropdowns from ARTICLE_DATA
*/
function initializeArticleDropdowns() {
const data = window.ARTICLE_DATA || [];
console.log('[ArticleDropdown] Initializing with', data.length, 'articles');
// Populate datalists for both tabs
['d-art', 'e-art'].forEach(inputId => {
const datalist = document.getElementById(inputId + '-list');
if (!datalist) {
console.warn('[ArticleDropdown] Datalist not found:', inputId + '-list');
return;
}
datalist.innerHTML = ''; // Clear existing
data.forEach(article => {
const option = document.createElement('option');
option.value = `${article.nr} – ${article.name}`;
option.dataset.articleNr = article.nr;
option.dataset.thickness = article.thickness || 0;
option.dataset.areaWeight = article.area_weight || 0;
option.dataset.thicknessStddev = article.thickness_stddev || 0;
option.dataset.areaWeightStddev = article.area_weight_stddev || 0;
datalist.appendChild(option);
});
});
// Setup event listeners for article selection
setupArticleSelectionListeners();
setupWeightCalculationListeners();
console.log('[ArticleDropdown] Initialization complete');
}
/**
* Setup listeners for when user selects an article
*/
function setupArticleSelectionListeners() {
const dArtInput = document.getElementById('d-art');
if (!dArtInput) return;
const dArtList = document.getElementById('d-art-list');
const data = window.ARTICLE_DATA || [];
dArtInput.addEventListener('input', function() {
const inputValue = dArtInput.value.trim();
// Find matching article
const match = data.find(a =>
inputValue === `${a.nr} – ${a.name}` ||
inputValue === a.nr ||
inputValue.startsWith(a.nr + ' –')
);
if (match) {
console.log('[ArticleSelection] Found:', match.nr, '-', match.name);
// 1. Auto-fill thickness
const thField = document.getElementById('d-th');
if (thField) {
thField.value = match.thickness || 0;
thField.dataset.stddev = match.thickness_stddev || 0;
}
// 2. Auto-fill area weight
const awField = document.getElementById('d-aw');
if (awField && match.area_weight && match.area_weight > 0) {
awField.value = match.area_weight;
awField.dataset.stddev = match.area_weight_stddev || 0;
}
// 3. Extract width from article name (e.g., "5.0 x 5m" → 5.0)
const widthMatch = match.name.match(/(\d+[,\.]\d+)\s*x\s*\d+\s*m/i);
if (widthMatch) {
const width = parseFloat(widthMatch[1].replace(',', '.'));
const wiField = document.getElementById('de-wi');
if (wiField && width > 0 && width < 100) {
wiField.value = width;
}
}
console.log('[ArticleSelection] Auto-filled:', {
thickness: match.thickness,
area_weight: match.area_weight,
thickness_stddev: match.thickness_stddev,
area_weight_stddev: match.area_weight_stddev
});
// Trigger auto-calculation after short delay
setTimeout(triggerAutoWeightCalculation, 100);
}
});
}
/**
* Setup listeners for weight field changes (Roll Width, Area Weight, Product Length)
*/
function setupWeightCalculationListeners() {
const fieldIds = ['de-wi', 'd-aw', 'd-le'];
fieldIds.forEach(id => {
const el = document.getElementById(id);
if (el) {
el.addEventListener('change', triggerAutoWeightCalculation);
el.addEventListener('blur', triggerAutoWeightCalculation);
el.addEventListener('input', () => {
// Debounce: recalculate after user stops typing
clearTimeout(el._autoCalcTimeout);
el._autoCalcTimeout = setTimeout(triggerAutoWeightCalculation, 300);
});
}
});
}
/**
* Auto-calculate weight when width, area_weight, or length changes
*/
function triggerAutoWeightCalculation() {
const wiEl = document.getElementById('de-wi');
const awEl = document.getElementById('d-aw');
const leEl = document.getElementById('d-le');
const woEl = document.getElementById('d-wo');
if (!wiEl || !awEl || !leEl || !woEl) return;
const wi = parseFloat(wiEl.value) || 0;
const aw = parseFloat(awEl.value) || 0;
const le = parseFloat(leEl.value) || 0;
if (wi > 0 && aw > 0 && le > 0) {
// Calculate with stddev if available
const aw_stddev = parseFloat(awEl.dataset.stddev) || 0;
if (window.StdDevCalculator && aw_stddev > 0) {
// Calculate weight ranges
const ranges = window.StdDevCalculator.calculateWeightRanges(aw, aw_stddev, le, wi);
woEl.value = ranges.nom.toFixed(1);
woEl.dataset.weight_nom = ranges.nom.toFixed(1);
woEl.dataset.weight_min = ranges.min.toFixed(1);
woEl.dataset.weight_max = ranges.max.toFixed(1);
console.log('[AutoCalc] Weight with stddev:', {
nom: ranges.nom.toFixed(1),
min: ranges.min.toFixed(1),
max: ranges.max.toFixed(1)
});
} else {
// Simple calculation without stddev
const weight = (aw * le * wi / 1000).toFixed(1);
woEl.value = weight;
woEl.dataset.weight_nom = weight;
woEl.dataset.weight_max = weight;
console.log('[AutoCalc] Weight (no stddev):', weight, 'kg');
}
return true;
}
woEl.value = '';
delete woEl.dataset.weight_nom;
delete woEl.dataset.weight_max;
return false;
}
/**
* Setup core preset buttons
*/
function setupCorePresetButtons() {
document.querySelectorAll('.core-preset-btn').forEach(btn => {
btn.addEventListener('click', function(e) {
e.preventDefault();
const coreValue = btn.dataset.core;
const tabPane = btn.closest('.tab-pane');
if (tabPane) {
const coreInput = tabPane.querySelector('input[id$="-co"]');
if (coreInput) {
coreInput.value = coreValue;
// Update active state
tabPane.querySelectorAll('.core-preset-btn').forEach(b => b.classList.remove('active'));
btn.classList.add('active');
console.log('[CorePreset] Set core diameter:', coreValue, 'mm');
}
}
});
});
}
/**
* Initialize everything when DOM is ready
*/
document.addEventListener('DOMContentLoaded', function() {
console.log('[RollCalcV14] Initializing...');
// Wait for article data to be loaded
const maxRetries = 50;
let retries = 0;
const waitForData = setInterval(function() {
if (window.ARTICLE_DATA && window.ARTICLE_DATA.length > 0) {
clearInterval(waitForData);
initializeArticleDropdowns();
setupCorePresetButtons();
console.log('[RollCalcV14] Ready');
} else if (retries++ > maxRetries) {
clearInterval(waitForData);
console.warn('[RollCalcV14] Article data not loaded after', maxRetries, 'retries');
}
}, 100);
});
// Export functions
window.RollCalcV14 = {
initializeArticleDropdowns,
setupArticleSelectionListeners,
setupWeightCalculationListeners,
triggerAutoWeightCalculation,
setupCorePresetButtons
};
console.log('[RollCalcV14] Module loaded');