You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
5.7 KiB
189 lines
5.7 KiB
import { generateFile } from './filegeneration.js';
|
|
import { createExcelRowData } from './datageneration.js';
|
|
import { ALL_OPTIONS } from './options.js';
|
|
|
|
const generateBtn = document.getElementById('generate-button');
|
|
const rowCountEl = document.getElementById('row-count');
|
|
const dataInputContainer = document.querySelector('.data-input-container');
|
|
const introduction = document.querySelector('.introduction');
|
|
const getStarted = document.getElementById('getStarted');
|
|
const mainContent = document.getElementById('main-content');
|
|
const closeBtnForInputSelector = document.getElementById('closeInputSelector');
|
|
const inputSelectorBkg = document.querySelector('.select-input-background');
|
|
const selectGroupingOptions = document.querySelector(
|
|
'.select-input-classification'
|
|
);
|
|
const selectInputContainer = document.querySelector('.select-input-options');
|
|
|
|
const ROWS_TO_START_WITH = 8;
|
|
let DOMrows = [];
|
|
let i = 0;
|
|
let selectedRow;
|
|
|
|
function addValuesToOptions(filter) {
|
|
selectInputContainer.innerHTML = '';
|
|
ALL_OPTIONS.forEach((option) => {
|
|
if (!filter || option.type === filter) {
|
|
let optionEl = document.createElement('button');
|
|
optionEl.classList.add('btn');
|
|
optionEl.classList.add('selectOption');
|
|
optionEl.dataset.value = option.value;
|
|
optionEl.innerText = option.name;
|
|
optionEl.addEventListener('click', (e) => {
|
|
//add value to current row
|
|
selectedRow.querySelector(
|
|
'.inputSelection'
|
|
).innerHTML = `${e.target.textContent} <i class="fa fa-angle-down"></i>`;
|
|
selectedRow.querySelector('.inputSelection').dataset.value =
|
|
e.target.dataset.value;
|
|
inputSelectorBkg.classList.remove('show');
|
|
});
|
|
selectInputContainer.appendChild(optionEl);
|
|
}
|
|
});
|
|
}
|
|
|
|
function returnGetDataFunction(selectedOptionName) {
|
|
let selectedOptionObject = ALL_OPTIONS.filter((option) => {
|
|
return option.value === selectedOptionName;
|
|
});
|
|
return selectedOptionObject[0].getData;
|
|
}
|
|
|
|
function fetchDOMValues() {
|
|
let dataConfig = [];
|
|
const rows = document.querySelectorAll('.row');
|
|
rows.forEach((row, index) => {
|
|
// to exclude the header which is the first row
|
|
|
|
if (index >= 1) {
|
|
dataConfig.push({
|
|
columnName: row.querySelector('.columnName').value,
|
|
type: row.querySelector('.inputSelection').dataset.value,
|
|
getData: returnGetDataFunction(
|
|
row.querySelector('.inputSelection').dataset.value
|
|
),
|
|
maxLength: 100,
|
|
minLength: 0,
|
|
nullable: false,
|
|
});
|
|
}
|
|
});
|
|
return dataConfig;
|
|
}
|
|
|
|
function convertToColumnName(name) {
|
|
return name.toUpperCase().split(' ').join('_');
|
|
}
|
|
|
|
function addToDOMRows(rowClicked) {
|
|
let randomOption =
|
|
ALL_OPTIONS[Math.floor(Math.random() * ALL_OPTIONS.length)];
|
|
let newRow = document.createElement('div');
|
|
newRow.classList.add('row');
|
|
newRow.classList.add('hide');
|
|
newRow.innerHTML = `
|
|
<div class="column">
|
|
<input type="text" class="columnName" value="${convertToColumnName(
|
|
randomOption.name
|
|
)}">
|
|
</div>
|
|
<div class="column">
|
|
<button class="inputSelection" data-value="${randomOption.value}">${
|
|
randomOption.name
|
|
}<i class="fa fa-angle-down"></i> </button>
|
|
</div>
|
|
<div class="column actions">
|
|
<button class="add"> <i class="far fa-plus-square fa-2x add"></i><span class="tooltiptext">Add a New Row</span></button>
|
|
<button class="delete"> <i class="fas fa-trash-alt fa-2x delete"></i><span class="tooltiptext">Delete Existing Row</span></button>
|
|
</div>`;
|
|
|
|
DOMrows.push(newRow);
|
|
if (rowClicked) {
|
|
rowClicked.insertAdjacentElement('afterend', newRow);
|
|
} else {
|
|
dataInputContainer.insertAdjacentElement('beforeend', newRow);
|
|
}
|
|
setTimeout(() => {
|
|
newRow.classList.remove('hide');
|
|
}, 100);
|
|
i++;
|
|
}
|
|
|
|
function displayInputSelection(row) {
|
|
inputSelectorBkg.classList.add('show');
|
|
selectedRow = row;
|
|
}
|
|
|
|
function deleteRowFromDOM(parentRow) {
|
|
parentRow.classList.add('hide');
|
|
setTimeout(() => {
|
|
dataInputContainer.removeChild(parentRow);
|
|
DOMrows = DOMrows.filter((row) => {
|
|
return row !== parentRow;
|
|
});
|
|
if (DOMrows.length === 0) {
|
|
addToDOMRows();
|
|
}
|
|
}, 600);
|
|
}
|
|
|
|
function loadMainContainer() {
|
|
introduction.classList.add('hide');
|
|
mainContent.style.display = 'inline';
|
|
setTimeout(() => {
|
|
introduction.style.display = 'none';
|
|
}, 1000);
|
|
}
|
|
|
|
function documentClick(e) {
|
|
const parentRow = e.target.closest('.row');
|
|
if (e.target.classList.contains('add')) {
|
|
addToDOMRows(parentRow);
|
|
}
|
|
if (e.target.classList.contains('delete')) {
|
|
deleteRowFromDOM(parentRow);
|
|
}
|
|
if (e.target.classList.contains('inputSelection')) {
|
|
displayInputSelection(parentRow);
|
|
}
|
|
}
|
|
|
|
function fetchDataAndGenerateFile() {
|
|
let rowCount = +rowCountEl.value;
|
|
let dataConfig = fetchDOMValues();
|
|
let rows = createExcelRowData(rowCount, dataConfig);
|
|
generateFile(rows);
|
|
}
|
|
|
|
//event listeners
|
|
generateBtn.addEventListener('click', fetchDataAndGenerateFile);
|
|
document.addEventListener('click', documentClick);
|
|
getStarted.addEventListener('click', loadMainContainer);
|
|
closeBtnForInputSelector.addEventListener('click', () => {
|
|
inputSelectorBkg.classList.remove('show');
|
|
});
|
|
|
|
for (let i = 0; i < ROWS_TO_START_WITH; i++) {
|
|
addToDOMRows();
|
|
}
|
|
addValuesToOptions();
|
|
|
|
let GROUPED_OPTIONS = {};
|
|
ALL_OPTIONS.forEach((option) => {
|
|
if (!GROUPED_OPTIONS[option.type]) {
|
|
GROUPED_OPTIONS[option.type] = [];
|
|
}
|
|
GROUPED_OPTIONS[option.type].push(option);
|
|
});
|
|
|
|
for (let key in GROUPED_OPTIONS) {
|
|
let group = document.createElement('div');
|
|
group.className = 'optionGroup';
|
|
group.innerText = `${key}(${GROUPED_OPTIONS[key].length})`;
|
|
group.addEventListener('click', () => {
|
|
console.log('clicked');
|
|
addValuesToOptions(key);
|
|
});
|
|
selectGroupingOptions.appendChild(group);
|
|
}
|
|
|