Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions static/js/matrix-builder.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,45 @@ function generateMatrixInput(rows, cols, containerId, label, gridId) {
const section = document.createElement('div');
section.className = 'matrix-section';
section.innerHTML = `<h3>${label}</h3>`;

const header = document.createElement('div');
const importBtn = document.createElement('button');
const fileInput = document.createElement('input');
importBtn.textContent = 'Importar CSV';
importBtn.type = 'button';
fileInput.type = 'file';
fileInput.accept = '.csv,text/csv';
fileInput.style.display = 'none';
fileInput.dataset.matrixId = gridId;

importBtn.addEventListener('click', function() {
fileInput.click();
});

fileInput.addEventListener('change', function(event) {
const file = event.target.files[0];
if (!file) return;

const reader = new FileReader();

reader.onload = function(e) {
const csvText = e.target.result;
importMatrixFromCSV(csvText, gridId, rows, cols);
};

reader.onerror = function() {
showError('Erro ao ler o ficheiro CSV.');
};

reader.readAsText(file);

event.target.value = '';
});

header.appendChild(importBtn);
header.appendChild(fileInput);

section.appendChild(header);

const grid = document.createElement('div');
grid.className = 'matrix-input-grid';
Expand Down
72 changes: 72 additions & 0 deletions static/js/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,76 @@ function prettyHTML(matrix, title) {

html += '</table>';
return html;
}

function importMatrixFromCSV(csvText, matrixId, expectedRows, expectedCols) {
try {
// Divide o CSV em linhas
const lines = csvText.trim().split('\n').filter(line => line.trim() !== '');

if (lines.length === 0) {
throw new Error('Arquivo CSV vazio.');
}

// Parse da matriz
const matrix = lines.map(line =>
line.split(',').map(num => {
const val = num.trim();
return val === '' ? 0 : parseFloat(val);
})
);

// Verifica se todas as linhas têm o mesmo número de colunas
const cols = matrix[0].length;
if (!matrix.every(row => row.length === cols)) {
throw new Error('Todas as linhas devem ter o mesmo número de elementos.');
}

// Verifica se as dimensões correspondem às esperadas
if (expectedRows && expectedCols) {
if (matrix.length !== expectedRows || cols !== expectedCols) {
throw new Error(`Dimensões incorretas. Esperado: ${expectedRows}x${expectedCols}, Obtido: ${matrix.length}x${cols}`);
}
}

// Preenche os inputs da matriz
for (let i = 0; i < matrix.length; i++) {
for (let j = 0; j < matrix[i].length; j++) {
const input = document.querySelector(`#${matrixId} [data-row="${i}"][data-col="${j}"]`);
if (input) {
input.value = matrix[i][j];
input.dispatchEvent(new Event('input'));
}
}
}

showSuccess(`Matriz ${matrixId === 'matrix-a' ? 'A' : 'B'} importada com sucesso!`);

} catch (error) {
console.error('Erro ao importar CSV:', error);
showError('Erro ao importar CSV: ' + error.message);
}
}

function showSuccess(message) {
hideError();
const successDiv = document.createElement('div');
successDiv.className = 'success-message';
successDiv.textContent = message;
successDiv.style.margin = '0.5rem 0';
successDiv.style.padding = '0.5rem';
successDiv.style.backgroundColor = '#d4edda';
successDiv.style.color = '#155724';
successDiv.style.border = '1px solid #c3e6cb';
successDiv.style.borderRadius = '0.25rem';
successDiv.style.fontSize = '0.9rem';

setTimeout(() => {
if (successDiv.parentNode) {
successDiv.parentNode.removeChild(successDiv);
}
}, 3000);

const form = document.getElementById('matrix-form');
form.parentNode.insertBefore(successDiv, form.nextSibling);
}