const sizes = [ "XXS", "XS", "S", "M", "L", "XL", "2XL", "3XL", "4XL", "5XL", "6XL" ] function selectCell(e) { const cell = e.target; const value = parseFloat(cell.dataset.val); const col = cell.dataset.col; const dimension = cell.dataset.dim; document.querySelectorAll('td.val:not(.empty)').forEach(match => { match.dataset.diff = ''; match.classList.remove('highlighted') match.classList.remove('currentDimension') if (match.dataset.dim === dimension) { match.classList.add('currentDimension') const diff = parseFloat(match.dataset.val) - value; match.dataset.diff = diff > 0 ? `+${diff}` : diff; if (match.dataset.dim === 'A') match.style.cssText = `--custom-color: rgba(96, 165, 249, ${1 - Math.abs(diff) / 5})` if (match.dataset.dim === 'B') match.style.cssText = `--custom-color: rgba(211, 129, 247, ${1 - Math.abs(diff) / 5})` if (match.dataset.dim === 'C') match.style.cssText = `--custom-color: rgba(255, 121, 117, ${1 - Math.abs(diff) / 5})` } }); document.querySelectorAll('td.dimension').forEach(match => { match.classList.remove('currentDimension'); if (match.innerHTML === dimension) { match.classList.add('currentDimension'); } }); cell.classList.add('highlighted') } function selectCellPlus(e) { e.stopPropagation(); const cell = e.target; const group = cell.parentElement.parentElement; const col = cell.dataset.col; if (cell.classList.contains('highlighted') && !cell.classList.contains('currentDimension')) { selectCell(e); return; } const values = {} group.querySelectorAll(`td[data-col='${col}']`).forEach(match => { values[match.dataset.dim] = parseFloat(match.dataset.val); }) document.querySelectorAll('td.val:not(.empty)').forEach(match => { match.dataset.diff = ''; match.classList.remove('highlighted') match.classList.remove('currentDimension') if (match.dataset.dim in values) { const diff = parseFloat(match.dataset.val) - values[match.dataset.dim]; match.dataset.diff = diff > 0 ? `+${diff}` : diff; if (match.dataset.dim === 'A') match.style.cssText = `--custom-color: rgba(96, 165, 249, ${1 - Math.abs(diff) / 5})` if (match.dataset.dim === 'B') match.style.cssText = `--custom-color: rgba(211, 129, 247, ${1 - Math.abs(diff) / 5})` if (match.dataset.dim === 'C') match.style.cssText = `--custom-color: rgba(255, 121, 117, ${1 - Math.abs(diff) / 5})` } }); document.querySelectorAll('td.dimension').forEach(match => { match.classList.remove('currentDimension'); }); group.querySelectorAll(`td[data-col='${col}']`).forEach(match => { match.classList.add('highlighted') }) } function hoverCell(e) { const cell = e.target; const group = cell.parentElement.parentElement; const col = cell.dataset.col; const dim = cell.dataset.dim; hoverOff() document.querySelectorAll('table > thead > tr > th').forEach(match => { if (match.dataset.col === col) match.classList.add('hover') }); group.querySelectorAll('td.dimension').forEach(match => { if (match.innerText === dim) match.classList.add('hover') }); group.querySelectorAll('td:not(.dimension), th').forEach(match => { match.classList.add('hover') }); } function hoverOff() { document.querySelectorAll('table > thead > tr > th').forEach(match => { match.classList.remove('hover') }); document.querySelectorAll('td.dimension, td, th').forEach(match => { match.classList.remove('hover') }); } const typeList = new Set() const fitList = new Set() document.querySelectorAll('tbody').forEach(tbody => { if (tbody.dataset.from) { const source = document.querySelector(`tbody#${tbody.dataset.from}`) if (!source) { console.log(`tbody with ID '${tbody.dataset.from}' not found.`); return; } const name = tbody.querySelector('tr th').innerHTML; tbody.replaceChildren() tbody.insertAdjacentHTML("afterbegin", source.innerHTML) tbody.querySelector('tr th').innerHTML = name; delete tbody.dataset.from; tbody.dataset.type = source.dataset.type; tbody.dataset.fit = source.dataset.fit; } typeList.add(tbody.dataset.type); fitList.add(tbody.dataset.fit); }); // build filter const filterTypeElement = document.querySelector('#filterType'); typeList.forEach(type => { filterTypeElement.insertAdjacentHTML('beforeend', ``) }) const filterFitElement = document.querySelector('#filterFit'); fitList.forEach(fit => { filterFitElement.insertAdjacentHTML('beforeend', ``) }) const filterType = new Set(typeList); const filterFit = new Set(fitList); function filter() { document.querySelectorAll(`tbody`).forEach(match => { match.classList.toggle('filtered', !filterType.has(match.dataset.type) || !filterFit.has(match.dataset.fit)); }) } filterTypeElement.querySelectorAll('input[type="checkbox"]').forEach(checkbox => { checkbox.addEventListener('change', (e) => { if (checkbox.checked) { filterType.add(checkbox.value) } else { filterType.delete(checkbox.value) } filter(); }); }); filterFitElement.querySelectorAll('input[type="checkbox"]').forEach(checkbox => { checkbox.addEventListener('change', (e) => { if (checkbox.checked) { filterFit.add(checkbox.value) } else { filterFit.delete(checkbox.value) } filter(); }); }); document.querySelectorAll('td.val').forEach(cell => { const rowTitle = cell.parentElement.querySelector('th'); cell.dataset.col = sizes[rowTitle !== null ? cell.cellIndex - 4 : cell.cellIndex - 1]; cell.addEventListener('pointerenter', hoverCell); cell.addEventListener('pointerleave', hoverOff); }); // initialize table document.querySelectorAll('td.val:not(.empty)').forEach(cell => { cell.dataset.val = cell.innerText; cell.dataset.diff = ''; cell.dataset.dim = cell.parentElement.querySelector('td.dimension').innerHTML; cell.addEventListener('click', selectCellPlus); }); // disable select on click outside value cell document.addEventListener('click', e => { document.querySelectorAll('td.val:not(.empty)').forEach(match => { match.dataset.diff = ''; match.classList.remove('highlighted') match.classList.remove('currentDimension') }); document.querySelectorAll('td.dimension').forEach(match => { match.classList.remove('currentDimension'); }); });