diff --git a/src/simulator/src/testCreator.js b/src/simulator/src/testCreator.js index 4a1708c2..0f026938 100644 --- a/src/simulator/src/testCreator.js +++ b/src/simulator/src/testCreator.js @@ -34,20 +34,24 @@ window.onload = () => { if (query.has('popUp')) { if (query.get('popUp') == 'true') { creatorMode = CREATORMODE.SIMULATOR_POPUP - $('.right-button-group').append( - '' - ) + let rightButtonGroup = document.querySelector('.right-button-group') + let button = document.createElement('button') + button.className = 'lower-button save-buton' + button.textContent = 'Attach' + button.addEventListener('click', saveData) + rightButtonGroup.appendChild(button) } } + let creatorHead = document.querySelector('#tb-creator-head') if (query.has('data')) { - $('#tb-creator-head').html('Edit Test') + creatorHead.innerHTML = 'Edit Test' circuitScopeID = query.get('scopeID') loadData(query.get('data')) return } if (query.has('result')) { - $('#tb-creator-head').html('Test Result') + creatorHead.innerHTML = 'Test Result' loadResult(query.get('result')) readOnlyUI() return @@ -64,18 +68,19 @@ function changeTestMode(m) { if (testMode === m) return false dataReset() testMode = m - $('#combSelect').removeClass('tab-selected') - $('#seqSelect').removeClass('tab-selected') - $('#tb-new-group').css('visibility', m === 'seq' ? 'visible' : 'hidden') - $(`#${m}Select`).addClass('tab-selected') - $('#dataGroup').empty() + document.querySelector('#combSelect').classList.remove('tab-selected') + document.querySelector('#seqSelect').classList.remove('tab-selected') + document.querySelector('#tb-new-group').style.visibility = + m === 'seq' ? 'visible' : 'hidden' + document.querySelector(`#${m}Select`).classList.add('tab-selected') + document.querySelector('#dataGroup').innerHTML = '' return true } /* Adds case to a group */ function addCase(grp) { - const currentGroupTable = $(`#data-table-${grp + 1}`) + const currentGroupTable = document.querySelector(`#data-table-${grp + 1}`) let s = '
\n' @@ -84,8 +89,8 @@ function addCase(grp) { s += '' // Sortable hack - currentGroupTable.find('tbody').remove() - currentGroupTable.append(s) + currentGroupTable.querySelector('tbody').remove() + currentGroupTable.appendChild(s) } /* Deletes case from a group */ @@ -101,7 +106,7 @@ function deleteCase(element) { function addGroup( groupName = `${testMode === 'comb' ? 'Group' : 'Set'} ${groupIndex + 2}` ) { - $('.plus-button').removeClass('latest-button') + document.querySelector('.plus-button').classList.remove('latest-button') groupIndex++ const s = ` @@ -121,7 +126,7 @@ function addGroup( ` cases[groupIndex] = 0 - $('#dataGroup').append(s) + document.querySelector('#dataGroup').appendChild(s) makeSortable() } @@ -149,38 +154,44 @@ function addInput( const sData = `${escapeHtml( bitwidth.toString() )}` - $('#testBenchTable') - .find('tr') - .eq(1) - .find('th') - .eq(inputCount - 1) - .after(sHead) - $('#testBenchTable') - .find('tr') - .eq(2) - .find('td') - .eq(inputCount - 1) - .after(sData) - $('#tb-inputs-head').attr('colspan', inputCount) + let testBenchTable = document.querySelector('#testBenchTable') + testBenchTable + .querySelector('tr')[1] + .querySelector('th') + [inputCount - 1].insertAdjacentHTML('afterend', sHead) + testBenchTable + .querySelector('tr')[2] + .querySelector('td') + [inputCount - 1].insertAdjacentHTML('afterend', sData) + + let inputHead = document.querySelector('#tb-inputs-head') + inputHead.setAttribute('colspan', inputCount) // Change data tables' contents - $('#dataGroup') - .find('table') - .each(function (group_i) { - $(this) - .find('tr') - .each(function (case_i) { - const s = `${ - inputData.length - ? escapeHtml(inputData[group_i][case_i]) - : 0 - }` - $(this) - .find('td') - .eq(inputCount - 1) - .after(s) - }) - }) + + let dataGroup = document.querySelector('#dataGroup') + let tables = dataGroup.querySelector('table') + + for (let group_i = 0; group_i < tables.length; group_i++) { + let currentTable = tables[group_i] + + let rows = currentTable.querySelector('tr') + + for (let case_i = 0; case_i < rows.length; case_i++) { + let currentRow = rows[case_i] + + let newTd = document.createElement('td') + newTd.setAttribute('contenteditable', 'true') + + let content = inputData.length + ? escapeHtml(inputData[group_i][case_i]) + : 0 + newTd.innerHTML = content + + let targetTd = currentRow.getElementsByTagName('td')[inputCount - 1] + targetTd.parentNode.insertBefore(newTd, targetTd.nextSibling) + } + } } /* Adds output with default value 0 or values supplied in @param outputData */ @@ -212,81 +223,90 @@ function addOutput( bitwidth.toString() )}` } - - $('#testBenchTable') - .find('tr') - .eq(1) - .find('th') - .eq(inputCount + outputCount - 1) - .after(sHead) - $('#testBenchTable') - .find('tr') - .eq(2) - .find('td') - .eq(inputCount + outputCount - 1) - .after(sData) + testBenchTable + .querySelector('tr')[1] + .querySelector('th') + [inputCount + outputCount - 1].insertAdjacentHTML('afterend', sHead) + testBenchTable + .querySelector('tr')[2] + .querySelector('td') + [inputCount + outputCount - 1].insertAdjacentHTML('afterend', sData) // If not result then colspan is outputCount - $('#tb-outputs-head').attr('colspan', outputCount) + let outputHead = document.querySelector('tb-outputs-head') + outputHead.setAttribute('colspan', outputCount) // else it's 2*outputCount if (result) { - $('#tb-outputs-head').attr('colspan', 2 * outputCount) + outputHead.setAttribute('colspan', 2 * outputCount) } // Change data tables' contents // If not result just add the outputs + if (!result) { - $('#dataGroup') - .find('table') - .each(function (group_i) { - $(this) - .find('tr') - .each(function (case_i) { - const s = `${ - outputData.length - ? escapeHtml(outputData[group_i][case_i]) - : 0 - }` - $(this) - .find('td') - .eq(inputCount + outputCount - 1) - .after(s) - }) - }) + for (let group_i = 0; group_i < tables.length; group_i++) { + let currentTable = tables[group_i] + + let rows = currentTable.querySelector('tr') + + for (let case_i = 0; case_i < rows.length; case_i++) { + let currentRow = rows[case_i] + + let newTd = document.createElement('td') + newTd.setAttribute('contenteditable', 'true') + + let content = outputData.length + ? escapeHtml(outputData[group_i][case_i]) + : 0 + newTd.innerHTML = content + + let targetTd = + currentRow.getElementsByTagName('td')[ + inputCount + outputCount - 1 + ] + targetTd.parentNode.insertBefore(newTd, targetTd.nextSibling) + } + } // If result then add results besides the outputs // Hacky } else { - $('#dataGroup') - .find('table') - .each(function (group_i) { - $(this) - .find('tr') - .each(function (case_i) { - // Add the outputs (expected values) - const outputCellData = `${escapeHtml( - outputData[group_i][case_i] - )}` - $(this) - .find('td') - .eq(inputCount + 2 * (outputCount - 1)) - .after(outputCellData) - - // Add the actual values - const resultColor = - resultData[group_i][case_i] === - outputData[group_i][case_i] - ? 'green' - : 'red' - const resultCellData = `${escapeHtml( - resultData[group_i][case_i] - )}` - $(this) - .find('td') - .eq(inputCount + 2 * outputCount - 1) - .after(resultCellData) - }) - }) + for (let group_i = 0; group_i < tables.length; group_i++) { + let currentTable = tables[group_i] + + let rows = currentTable.getElementsByTagName('tr') + + for (let case_i = 0; case_i < rows.length; case_i++) { + let currentRow = rows[case_i] + + let outputCellData = document.createElement('td') + outputCellData.innerHTML = escapeHtml( + outputData[group_i][case_i] + ) + currentRow.insertBefore( + outputCellData, + currentRow.getElementsByTagName('td')[ + inputCount + 2 * (outputCount - 1) + ].nextSibling + ) + + let resultColor = + resultData[group_i][case_i] === outputData[group_i][case_i] + ? 'green' + : 'red' + let resultCellData = document.createElement('td') + resultCellData.style.color = resultColor + resultCellData.innerHTML = escapeHtml( + resultData[group_i][case_i] + ) + currentRow.insertBefore( + resultCellData, + currentRow.getElementsByTagName('td')[ + inputCount + 2 * outputCount - 1 + ].nextSibling + ) + } + } } } @@ -295,14 +315,21 @@ function deleteInput(element) { if (inputCount === 1) return const columnIndex = element.parent().eq(0).index() - $('#testBenchTable tr, .data-group tr') - .slice(1) - .each(function () { - $(this).find('td, th').eq(columnIndex).remove() - }) + let testBenchTableRows = document.querySelectorAll( + '#testBenchTable tr, .data-group tr' + ) + + for (let i = 1; i < testBenchTableRows.length; i++) { + let currentRow = testBenchTableRows[i] + + let cells = currentRow.querySelectorAll('td, th') + + let targetCell = cells[columnIndex] + targetCell.parentNode.removeChild(targetCell) + } inputCount-- - $('#tb-inputs-head').attr('colspan', inputCount) + inputHead.setAttribute('colspan', inputCount) } /* Deletes output unless there's only one output */ @@ -310,36 +337,37 @@ function deleteOutput(element) { if (outputCount === 1) return const columnIndex = element.parent().eq(0).index() - $('#testBenchTable tr, .data-group tr') - .slice(1) - .each(function () { - $(this).find('td, th').eq(columnIndex).remove() - }) + for (let i = 1; i < testBenchTableRows.length; i++) { + let currentRow = testBenchTableRows[i] + + let cells = currentRow.querySelectorAll('td, th') + + let targetCell = cells[columnIndex] + targetCell.parentNode.removeChild(targetCell) + } outputCount-- - $('#tb-outputs-head').attr('colspan', outputCount) + outputHead.setAttribute('colspan', outputCount) } /* Returns input/output(keys) and their bitwidths(values) */ /* Called by getData() */ function getBitWidths() { const bitwidths = {} - $('#testBenchTable') - .find('tr') - .eq(1) - .find('th') - .slice(1) - .each(function (index) { - const inp = $(this).text() - const bw = $('#testBenchTable') - .find('tr') - .eq(2) - .find('td') - .slice(1) - .eq(index) - .html() - bitwidths[inp] = Number(bw) - }) + let secondRow = testBenchTable.querySelector('tr')[1] + let thElements = secondRow.querySelectorAll('th') + thElements = Array.from(thElements).slice(1) + + thElements.forEach(function (th, index) { + let inp = th.textContent + + let tdElement = testBenchTable + .querySelector('tr')[2] + .querySelectorAll('td')[index + 1] + + let bw = tdElement.innerHTML + bitwidths[inp] = Number(bw) + }) return bitwidths } @@ -348,15 +376,15 @@ function getBitWidths() { function getData() { const bitwidths = getBitWidths() const groups = [] - const groupCount = $('#dataGroup').children().length + const groupCount = document.querySelector('#dataGroup').childElementCount for (let group_i = 0; group_i < groupCount; group_i++) { const group = {} group.label = getGroupTitle(group_i) group.inputs = [] group.outputs = [] - const group_table = $(`#data-table-${group_i + 1}`) - group.n = group_table.find('tr').length + const group_table = document.querySelector(`#data-table-${group_i + 1}`) + group.n = group_table.querySelectorAll('tr').length // Push all the inputs in the group for (let inp_i = 0; inp_i < inputCount; inp_i++) { @@ -366,8 +394,13 @@ function getData() { bitWidth: bitwidths[label], values: [], } - group_table.find('tr').each(function () { - input.values.push($(this).find('td').slice(1).eq(inp_i).html()) + + group_table.querySelectorAll('tr').forEach((row) => { + let cells = row.querySelectorAll('td') + cells = Array.from(cells).slice(1) + + let cellValue = cells[inp_i].innerHTML + input.push(cellValue) }) group.inputs.push(input) @@ -381,14 +414,14 @@ function getData() { bitWidth: bitwidths[label], values: [], } - group_table.find('tr').each(function () { - output.values.push( - $(this) - .find('td') - .slice(1) - .eq(inputCount + out_i) - .html() - ) + + group_table.querySelectorAll('tr').forEach((row) => { + let cells = row.querySelectorAll('td') + cells = Array.from(cells).slice(1) + + let cellValue = cells[inputCount + out_i].innerHTML + + output.push(cellValue) }) group.outputs.push(output) @@ -401,11 +434,12 @@ function getData() { } function getTestTitle() { - return $('#test-title-label').text() + return document.querySelector('#test-title-label').textContent } function getGroupTitle(group_i) { - return $(`#data-group-title-${group_i + 1}`).text() + return document.querySelector(`#data-group-title-${group_i + 1}`) + .textContent } /* Parse UI table into Javascript Object */ @@ -423,14 +457,16 @@ function exportAsCSV() { let csvData = '' csvData += 'Title,Test Type,Input Count,Output Count\n' csvData += `${getTestTitle()},${testMode},${inputCount},${outputCount}\n\n\n` - csvData += $('table').eq(0).table2CSV() + csvData += document.querySelector('table')[0].table2CSV() csvData += '\n\n' - $('table') - .slice(1) - .each(function (group_i) { + + document + .querySelectorAll('table:not(:first-of-type)') + .forEach(function (table, group_i) { csvData += getGroupTitle(group_i) csvData += '\n' - csvData += $(this).table2CSV() + + csvData += tableToCSV(table) csvData += '\n\n' }) @@ -443,7 +479,7 @@ function exportAsCSV() { To achieve this, first converts to JSON then uses request param to load json to table */ function importFromCSV() { - const file = $('#csvFileInput').prop('files')[0] + const file = document.querySelector('csvFileInput').files[0] const reader = new FileReader() // If circuitScopeID exists, ie. if popup opened from testbench, then use that to redirect @@ -467,7 +503,7 @@ function importFromCSV() { // Clicks the hidden upload file button, entrypoint into importFromCSV() // The hidden button in-turn calls importFromCSV() function clickUpload() { - $('#csvFileInput').click() + document.querySelector('csvFileInput').click() } /* Converts CSV to JSON to be loaded into the table */ @@ -587,7 +623,9 @@ function saveData() { /* Loads data from JSON string into the table */ function loadData(dataJSON) { const data = JSON.parse(dataJSON) - if (data.title) $('#test-title-label').text(data.title) + if (data.title) { + document.querySelector('#test-title-label').textContent = data.title + } changeTestMode() changeTestMode(data.type) for (let group_i = 0; group_i < data.groups.length; group_i++) { @@ -626,7 +664,9 @@ function loadData(dataJSON) { */ function loadResult(dataJSON) { const data = JSON.parse(dataJSON) - if (data.title) $('#test-title-label').text(data.title) + if (data.title) { + document.querySelector('#test-title-label').textContent = data.title + } changeTestMode() changeTestMode(data.type) for (let group_i = 0; group_i < data.groups.length; group_i++) { @@ -688,18 +728,27 @@ function loadResult(dataJSON) { function readOnlyUI() { makeContentUneditable() makeUnsortable() - $('.lower-button, .table-button, .tb-minus').hide() - $('.tablink').attr('disabled', 'disabled') - $('.tablink').removeClass('tablink-no-override') - $('.data-group-info').text('') + document.querySelectorAll( + '.lower-button, .table-button, .tb-minus' + ).style.display = 'none' + document.querySelectorAll('.tablink').forEach((tablink) => { + tablink.disabled = true + }) + + document.querySelectorAll('.tablink').forEach((tablink) => { + tablink.classList.remove('tablink-no-override') + }) + document.querySelector('.data-group-info').textContent = ' ' } function makeContentUneditable() { - $('body') - .find('td, th, span, h3, div') - .each(function () { - $(this).attr('contenteditable', 'false') - }) + let elements = document.querySelectorAll( + 'body td, body th, body span, body h3, body div' + ) + + elements.forEach(function (element) { + element.setAttribute('contenteditable', 'false') + }) } function makeSortable() { @@ -725,31 +774,64 @@ function makeSortable() { if the table has no rows, and once table gets rows, we remove that tbody */ function removeTbody(e, ui) { - $(e.target).find('tbody').remove() + e.target.querySelectorAll('tbody').forEach((tbodyElement) => { + tbodyElement.parentNode.removeChild(tbodyElement) + }) } function createTbody(e, ui) { - if ($(e.target).find('tr, tbody').length === 0) { - $(e.target).append('') + if (e.target.querySelectorAll('tr, body').length === 0) { + e.target.appendChild(document.createElement('tbody')) } } - $('.data-group table').sortable({ - handle: '.tb-handle', - helper, - start: makePlaceholder, - placeholder: 'clone', - connectWith: 'table', - receive: removeTbody, // For sortable hack - remove: createTbody, // For sortable hack - items: 'tr', - revert: 50, - scroll: false, + var dataGroupTables = document.querySelectorAll('.data-group table') + + dataGroupTables.forEach(function (table) { + table.addEventListener('dragstart', function (event) { + var tr = event.target.closest('tr') + if (tr) { + event.dataTransfer.setData('text/plain', '') + event.dataTransfer.effectAllowed = 'move' + tr.classList.add('dragging') + } + }) + + table.addEventListener('dragover', function (event) { + event.preventDefault() + var tr = event.target.closest('tr') + var draggingElement = table.querySelector('.dragging') + if (tr && draggingElement) { + var rect = tr.getBoundingClientRect() + var offsetY = event.clientY - rect.top + if (offsetY > rect.height / 2) { + tr.parentNode.insertBefore(draggingElement, tr.nextSibling) + } else { + tr.parentNode.insertBefore(draggingElement, tr) + } + } + }) + + table.addEventListener('dragend', function (event) { + var draggingElement = table.querySelector('.dragging') + if (draggingElement) { + draggingElement.classList.remove('dragging') + } + }) }) } function makeUnsortable() { - $('.data-group table').sortable({ disabled: true }) +var dataGroupTables = document.querySelectorAll('.data-group table'); + +dataGroupTables.forEach(function(table) { + table.draggable = false; + + table.addEventListener('dragstart', (event) => { + event.preventDefault(); + }); +}); + } function escapeHtml(unsafe) {