public/js/main.js (123 lines of code) (raw):
/*global JSZip*/
'use strict';
var zipFileNameEl = document.querySelector('#zipFileName');
var zipFileListEl = document.querySelector('#zipFileList');
var uploadBtnEl = document.querySelector('#uploadBtn');
var fileInputEl = document.querySelector('#zipfile');
var msgBoxEl = document.querySelector('#msgBox');
var prjectNameEl = document.querySelector('#projectName');
var projectDateEl = document.querySelector('.projectDate');
var prjectNamePreviewEl = document.querySelector('.projectNamePreview');
var step1El = document.querySelector('#step1');
var step1NumEl = document.querySelector('.step1');
var step2El = document.querySelector('#step2');
var stepNumEls = document.querySelectorAll('.step');
var badCharsRegex = /[^a-zA-Z\d\-\_\+]/g;
var messages = {
wrongType: 'You can only upload .zip files',
missingIndexFile: 'WARNING: No index.html file found in ZIP file',
indexFileNotInRoot: 'WARNING: index.html needs to be in base folder, not ' +
'a sub-folder'
};
function showMsg(msg) {
msgBoxEl.classList.add('active');
msgBoxEl.innerHTML = msg;
}
function hideMsg() {
msgBoxEl.classList.remove('active');
msgBoxEl.innerHTML = '';
}
function checkForIndexFile(filePaths) {
var hasIndexFile = filePaths.some(function(filePath) {
return filePath.indexOf('index.html') !== -1;
});
if (!hasIndexFile) {
showMsg(messages.missingIndexFile);
}
}
function checkForRootIndexFile(filePaths) {
var hasIndexFileInRoot = filePaths.some(function(filePath) {
return filePath === 'index.html';
});
if (!hasIndexFileInRoot) {
showMsg(messages.indexFileNotInRoot);
}
}
function listZipContents(zipFileName, filePaths) {
zipFileNameEl.innerHTML = zipFileName;
zipFileListEl.innerHTML = '';
filePaths.forEach(function(filePath) {
var li = document.createElement('li');
li.innerHTML = filePath;
zipFileListEl.appendChild(li);
});
}
function cleanProjectName(projectName) {
var tmpName = projectName.trim();
var extRegex = /\.zip/gi;
tmpName = tmpName.replace(/\W+/g, '-');
tmpName = tmpName.replace(extRegex, '');
tmpName = tmpName.replace(badCharsRegex, '');
return tmpName;
}
function setProjectName(zipFileName) {
var projectName = cleanProjectName(zipFileName);
prjectNameEl.value = projectName;
prjectNamePreviewEl.innerHTML = projectName;
projectDateEl.innerHTML = moment().format('YYYY/MM');
}
function readZipFile(zipFile) {
return function(evt) {
var zip = new JSZip(evt.target.result);
var filePaths = Object.keys(zip.files);
// Filter out Mac's zip guff
filePaths = filePaths.filter(function(file) {
return file.indexOf('__MACOSX') !== 0;
});
checkForRootIndexFile(filePaths);
checkForIndexFile(filePaths);
setProjectName(zipFile.name);
listZipContents(zipFile.name, filePaths);
};
}
function checkFile() {
if (fileInputEl.files.length === 0) {
uploadBtnEl.setAttribute('disabled', 'disabled');
return;
}
var isZipFile = (fileInputEl.files[0].type === 'application/zip');
if (!isZipFile) {
uploadBtnEl.setAttribute('disabled', 'disabled');
showMsg(messages.wrongType);
return;
}
step1El.style.display = 'none';
step2El.style.display = 'block';
[].forEach.call(stepNumEls, function(el , i) {
if (i === 1) { el.classList.toggle('disabled', false); }
else { el.classList.toggle('disabled', true); }
});
var zipFile = fileInputEl.files[0];
var reader = new FileReader();
reader.onload = readZipFile(zipFile);
reader.readAsArrayBuffer(zipFile);
uploadBtnEl.removeAttribute('disabled');
hideMsg();
}
fileInputEl.addEventListener('change', checkFile, false);
fileInputEl.value = null;
function goToStepOne() {
hideMsg();
fileInputEl.value = null;
step1El.style.display = 'block';
step2El.style.display = 'none';
[].forEach.call(stepNumEls, function(el , i) {
if (i === 0) { el.classList.toggle('disabled', false); }
else { el.classList.toggle('disabled', true); }
});
}
step1NumEl.addEventListener('click', goToStepOne, false);
function updateURLPreview(evt) {
var tmpName = cleanProjectName(evt.currentTarget.value) || 'default';
prjectNamePreviewEl.innerHTML = tmpName;
}
prjectNameEl.addEventListener('change', updateURLPreview, false);
prjectNameEl.addEventListener('keyup', updateURLPreview, false);