diff --git a/gallery/static/js/login.js b/gallery/static/js/login.js index 08964da..363d088 100644 --- a/gallery/static/js/login.js +++ b/gallery/static/js/login.js @@ -1,14 +1,43 @@ // Function to show login function showLogin() { + // Create elements + cancelBtn = document.createElement('button'); + cancelBtn.classList.add('btn-block'); + cancelBtn.innerHTML = 'nuuuuuuuu'; + cancelBtn.onclick = popupDissmiss; + + loginBtn = document.createElement('button'); + loginBtn.classList.add('btn-block'); + loginBtn.classList.add('primary'); + loginBtn.innerHTML = 'Login'; + loginBtn.type = 'submit'; + loginBtn.setAttribute('form', 'loginForm'); + + // Create form + loginForm = document.createElement('form'); + loginForm.id = 'loginForm'; + loginForm.setAttribute('onsubmit', 'return login(event);'); + + usernameInput = document.createElement('input'); + usernameInput.classList.add('input-block'); + usernameInput.type = 'text'; + usernameInput.placeholder = 'Namey'; + usernameInput.id = 'username'; + + passwordInput = document.createElement('input'); + passwordInput.classList.add('input-block'); + passwordInput.type = 'password'; + passwordInput.placeholder = 'Passywassy'; + passwordInput.id = 'password'; + + loginForm.appendChild(usernameInput); + loginForm.appendChild(passwordInput); + popUpShow( 'Login!', 'Need an account? Register!', - '' + - '', - '
' + loginForm, + [cancelBtn, loginBtn] ); } // Function to login @@ -29,16 +58,13 @@ function login(event) { formData.append("username", formUsername); formData.append("password", formPassword); - $.ajax({ - url: '/auth/login', - type: 'post', - data: formData, - contentType: false, - processData: false, - success: function (response) { + fetch('/auth/login', { + method: 'POST', + body: formData + }).then(response => { + if (response.status === 200) { location.reload(); - }, - error: function (response) { + } else { switch (response.status) { case 500: addNotification('Server exploded, F\'s in chat', 2); @@ -51,25 +77,68 @@ function login(event) { break; } } + }).catch(error => { + addNotification('Error logging in, blame someone', 2); }); } // Function to show register function showRegister() { + // Create buttons + cancelBtn = document.createElement('button'); + cancelBtn.classList.add('btn-block'); + cancelBtn.innerHTML = 'nuuuuuuuu'; + cancelBtn.onclick = popupDissmiss; + + registerBtn = document.createElement('button'); + registerBtn.classList.add('btn-block'); + registerBtn.classList.add('primary'); + registerBtn.innerHTML = 'Register'; + registerBtn.type = 'submit'; + registerBtn.setAttribute('form', 'registerForm'); + + // Create form + registerForm = document.createElement('form'); + registerForm.id = 'registerForm'; + registerForm.setAttribute('onsubmit', 'return register(event);'); + + usernameInput = document.createElement('input'); + usernameInput.classList.add('input-block'); + usernameInput.type = 'text'; + usernameInput.placeholder = 'Namey'; + usernameInput.id = 'username'; + + emailInput = document.createElement('input'); + emailInput.classList.add('input-block'); + emailInput.type = 'text'; + emailInput.placeholder = 'E mail!'; + emailInput.id = 'email'; + + passwordInput = document.createElement('input'); + passwordInput.classList.add('input-block'); + passwordInput.type = 'password'; + passwordInput.placeholder = 'Passywassy'; + passwordInput.id = 'password'; + + passwordInputRepeat = document.createElement('input'); + passwordInputRepeat.classList.add('input-block'); + passwordInputRepeat.type = 'password'; + passwordInputRepeat.placeholder = 'Passywassy again!'; + passwordInputRepeat.id = 'password-repeat'; + + registerForm.appendChild(usernameInput); + registerForm.appendChild(emailInput); + registerForm.appendChild(passwordInput); + registerForm.appendChild(passwordInputRepeat); + popUpShow( 'Who are you?', 'Already have an account? Login!', - '\ - ', - '' + registerForm, + [cancelBtn, registerBtn] ); } // Function to register -function register(obj) { +function register(event) { // AJAX takes control of subby form event.preventDefault(); @@ -90,13 +159,12 @@ function register(obj) { formData.append("password", formPassword); formData.append("password-repeat", formPasswordRepeat); - $.ajax({ - url: '/auth/register', - type: 'post', - data: formData, - contentType: false, - processData: false, - success: function (response) { + // Send form to server + fetch('/auth/login', { + method: 'POST', + body: formData + }).then(response => { + if (response.status === 200) { if (response === "gwa gwa") { addNotification('Registered successfully! Now please login to continue', 1); showLogin(); @@ -105,19 +173,20 @@ function register(obj) { addNotification(response[i], 2); } } - }, - error: function (response) { + } else { switch (response.status) { case 500: addNotification('Server exploded, F\'s in chat', 2); break; case 403: - addNotification('None but devils play past here...', 2); + addNotification('None but devils play past here... Wrong information', 2); break; default: addNotification('Error logging in, blame someone', 2); break; } } + }).catch(error => { + addNotification('Error logging in, blame someone', 2); }); } diff --git a/gallery/static/js/main.js b/gallery/static/js/main.js index e223086..452587f 100644 --- a/gallery/static/js/main.js +++ b/gallery/static/js/main.js @@ -2,34 +2,6 @@ function imgFade(obj, time = 250) { $(obj).animate({ opacity: 1 }, time); } -// https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color -function colourContrast(bgColor, lightColor, darkColor, threshold = 0.179) { - // if color is in hex format then convert to rgb else parese rgb - let r = 0 - let g = 0 - let b = 0 - if (bgColor.charAt(0) === '#') { - const color = (bgColor.charAt(0) === '#') ? bgColor.substring(1, 7) : bgColor; - r = parseInt(color.substring(0, 2), 16); // hexToR - g = parseInt(color.substring(2, 4), 16); // hexToG - b = parseInt(color.substring(4, 6), 16); // hexToB - } else { - const color = bgColor.replace('rgb(', '').replace(')', '').split(','); - r = color[0]; - g = color[1]; - b = color[2]; - } - - const uicolors = [r / 255, g / 255, b / 255]; - const c = uicolors.map((col) => { - if (col <= 0.03928) { - return col / 12.92; - } - return Math.pow((col + 0.055) / 1.055, 2.4); - }); - const L = (0.2126 * c[0]) + (0.7152 * c[1]) + (0.0722 * c[2]); - return (L > threshold) ? darkColor : lightColor; -} // Lazy load images when they are in view function loadOnView() { let lazyLoad = document.querySelectorAll('#lazy-load'); @@ -47,14 +19,6 @@ function loadOnView() { window.onload = function () { loadOnView(); - const darkColor = 'rgb(var(--black))'; - const lightColor = 'rgb(var(--white))'; - let contrastCheck = document.querySelectorAll('#contrast-check'); - for (let i = 0; i < contrastCheck.length; i++) { - let bgColor = contrastCheck[i].getAttribute('data-color'); - contrastCheck[i].style.color = colourContrast(bgColor, lightColor, darkColor); - } - let times = document.querySelectorAll('.time'); for (let i = 0; i < times.length; i++) { // Remove milliseconds @@ -97,9 +61,10 @@ window.onload = function () { } infoButton.onclick = function () { popUpShow('OnlyLegs on Flask', - 'Using Phosphoricons and Manrope${body}
${content}`; + let popupSelector = document.querySelector('.pop-up'); + let headerSelector = document.querySelector('.pop-up-header'); + let actionsSelector = document.querySelector('.pop-up-controlls'); + + // Clear popup elements + headerSelector.innerHTML = ''; + actionsSelector.innerHTML = ''; + + // Set popup header and subtitle + let titleElement = document.createElement('h2'); + titleElement.innerHTML = titleText; + headerSelector.appendChild(titleElement); + + let subtitleElement = document.createElement('p'); + subtitleElement.innerHTML = subtitleText; + headerSelector.appendChild(subtitleElement); + + if (bodyContent) { + headerSelector.appendChild(bodyContent); + } // Set buttons that will be displayed - popupActions.innerHTML = actions; + if (userActions) { + // for each user action, add the element + for (let i = 0; i < userActions.length; i++) { + let action = userActions[i]; + actionsSelector.appendChild(action); + } + } else { + actionsSelector.innerHTML = ''; + } - // Show popup - popup.style.display = 'block'; - setTimeout(function() { - popup.classList.add('active') - }, 10); + // Stop scrolling and show popup + document.querySelector("html").style.overflow = "hidden"; + popupSelector.style.display = 'block'; + setTimeout(function() { popupSelector.classList.add('active') }, 5); // 2ms delay to allow for css transition >:C } function popupDissmiss() { - // un-Stop scrolling + let popupSelector = document.querySelector('.pop-up'); + document.querySelector("html").style.overflow = "auto"; - - let popup = document.querySelector('.pop-up'); - - popup.classList.remove('active'); - - setTimeout(function() { - popup.style.display = 'none'; - }, 200); + popupSelector.classList.remove('active'); + setTimeout(function() { popupSelector.style.display = 'none'; }, 200); } - -document.addEventListener('keydown', function(event) { - if (event.key === 'Escape') { - if (document.querySelector('.pop-up').classList.contains('active')) { - popupDissmiss(); - } - } -}); \ No newline at end of file diff --git a/gallery/static/js/uploadTab.js b/gallery/static/js/uploadTab.js index 27bb9b7..029e995 100644 --- a/gallery/static/js/uploadTab.js +++ b/gallery/static/js/uploadTab.js @@ -1,196 +1,227 @@ -window.addEventListener("dragover",(event) => { - event.preventDefault(); -},false); -window.addEventListener("drop",(event) => { - event.preventDefault(); -},false); +// Remove default events on file drop, otherwise the browser will open the file +window.addEventListener("dragover", (event) => { + event.preventDefault(); +}, false); +window.addEventListener("drop", (event) => { + event.preventDefault(); +}, false); -function fileChanged(obj) { - document.querySelector('.fileDrop-block').classList.remove('error'); - - if ($(obj).val() === '') { - document.querySelector('.fileDrop-block').classList.remove('active'); - document.querySelector('.fileDrop-block .status').innerHTML = 'Choose or Drop file'; - } else { - document.querySelector('.fileDrop-block').classList.add('active'); - document.querySelector('.fileDrop-block .status').innerHTML = obj.files[0].name; - } -} - -document.addEventListener('DOMContentLoaded', function() { - // Function to upload images - const uploadForm = document.querySelector('#uploadForm'); - const fileDrop = document.querySelector('.fileDrop-block'); - const fileDropTitle = fileDrop.querySelector('.status'); - const fileUpload = uploadForm.querySelector('#file'); - - - $(fileUpload).val(''); - - - // Choose or drop file button - ['dragover', 'dragenter'].forEach(eventName => { - fileDrop.addEventListener(eventName, fileActivate, false); - }); - ['dragleave', 'drop'].forEach(eventName => { - fileDrop.addEventListener(eventName, fileDefault, false); - }) - - // Drop file into box - fileDrop.addEventListener('drop', fileDropHandle, false); - - - // Edging the file plunge :3 - function fileActivate(event) { - fileDrop.classList.remove('error'); - fileDrop.classList.add('edging'); - fileDropTitle.innerHTML = 'Drop to upload!'; - } - function fileDefault(event) { - fileDrop.classList.remove('error'); - fileDrop.classList.remove('edging'); - fileDropTitle.innerHTML = 'Choose or Drop file'; - } - - function fileDropHandle(event) { - event.preventDefault() - fileUpload.files = event.dataTransfer.files; - - fileDropTitle.innerHTML = fileUpload.files[0].name; - fileDrop.classList.add('active'); - } - - - uploadForm.addEventListener('submit', (event) => { - // AJAX takes control of subby form - event.preventDefault() - - const jobList = document.querySelector(".upload-jobs"); - - // Check for empty upload - if ($(fileUpload).val() === '') { - fileDrop.classList.add('error'); - fileDropTitle.innerHTML = 'No file selected!'; - } else { - // Make form - let formData = new FormData(); - formData.append("file", $("#file").prop("files")[0]); - formData.append("alt", $("#alt").val()); - formData.append("description", $("#description").val()); - formData.append("tags", $("#tags").val()); - formData.append("submit", $("#submit").val()); - - // Upload the information - $.ajax({ - url: '/api/upload', - type: 'post', - data: formData, - contentType: false, - processData: false, - beforeSend: function () { - jobContainer = document.createElement("div"); - jobContainer.classList.add("job"); - - jobStatus = document.createElement("span"); - jobStatus.classList.add("job__status"); - jobStatus.innerHTML = "Uploading..."; - - jobProgress = document.createElement("span"); - jobProgress.classList.add("progress"); - - jobImg = document.createElement("img"); - jobImg.src = URL.createObjectURL($("#file").prop("files")[0]); - - jobImgFilter = document.createElement("span"); - jobImgFilter.classList.add("img-filter"); - - jobContainer.appendChild(jobStatus); - jobContainer.appendChild(jobProgress); - jobContainer.appendChild(jobImg); - jobContainer.appendChild(jobImgFilter); - jobList.appendChild(jobContainer); - }, - success: function (response) { - jobContainer.classList.add("success"); - jobStatus.innerHTML = "Uploaded!"; - if (!document.querySelector(".upload-panel").classList.contains("open")) { - addNotification("Image uploaded successfully", 1); - } - }, - error: function (response) { - jobContainer.classList.add("critical"); - switch (response.status) { - case 500: - jobStatus.innerHTML = "Server exploded, F's in chat"; - break; - case 400: - case 404: - jobStatus.innerHTML = "Error uploading. Blame yourself"; - break; - case 403: - jobStatus.innerHTML = "None but devils play past here..."; - break; - case 413: - jobStatus.innerHTML = "File too large!!!!!!"; - break; - default: - jobStatus.innerHTML = "Error uploading file, blame someone"; - break; - } - if (!document.querySelector(".upload-panel").classList.contains("open")) { - addNotification("Error uploading file", 2); - } - }, - }); - - // Empty values - $(fileUpload).val(''); - $("#alt").val(''); - $("#description").val(''); - $("#tags").val(''); - - // Reset drop - fileDrop.classList.remove('active'); - fileDropTitle.innerHTML = 'Choose or Drop file'; - } - }); -}); // open upload tab function openUploadTab() { - // Stop scrolling + let uploadTab = document.querySelector(".upload-panel"); + + // Stop scrolling and open upload tab document.querySelector("html").style.overflow = "hidden"; - document.querySelector(".content").tabIndex = "-1"; - - // Open upload tab - const uploadTab = document.querySelector(".upload-panel"); uploadTab.style.display = "block"; - - setTimeout(function () { - uploadTab.classList.add("open"); - }, 10); + setTimeout(function () { uploadTab.classList.add("open"); }, 5); } // close upload tab function closeUploadTab() { - // un-Stop scrolling + let uploadTab = document.querySelector(".upload-panel"); + + // un-Stop scrolling and close upload tab document.querySelector("html").style.overflow = "auto"; - document.querySelector(".content").tabIndex = ""; - - // Close upload tab - const uploadTab = document.querySelector(".upload-panel"); uploadTab.classList.remove("open"); - - setTimeout(function () { - uploadTab.style.display = "none"; - }, 250); + setTimeout(function () { uploadTab.style.display = "none"; }, 250); } // toggle upload tab function toggleUploadTab() { - if (document.querySelector(".upload-panel").classList.contains("open")) { + let uploadTab = document.querySelector(".upload-panel"); + + if (uploadTab.classList.contains("open")) { closeUploadTab(); } else { openUploadTab(); } } + +// Edging the file plunge :3 +function fileActivate(event) { + event.preventDefault() + + let fileDrop = document.querySelector('.fileDrop-block'); + let fileDropTitle = fileDrop.querySelector('.status'); + + fileDrop.classList.remove('error'); + fileDrop.classList.add('edging'); + fileDropTitle.innerHTML = 'Drop to upload!'; +} +function fileDefault() { + let fileDrop = document.querySelector('.fileDrop-block'); + let fileDropTitle = fileDrop.querySelector('.status'); + + fileDrop.classList.remove('error'); + fileDrop.classList.remove('edging'); + fileDropTitle.innerHTML = 'Choose or Drop file'; +} + +function fileDropHandle(event) { + event.preventDefault() + + let fileDrop = document.querySelector('.fileDrop-block'); + let fileUpload = fileDrop.querySelector('#file'); + + fileUpload.files = event.dataTransfer.files; + + fileChanged(); +} + +function fileChanged() { + let dropBlock = document.querySelector('.fileDrop-block'); + let dropBlockStatus = dropBlock.querySelector('.status'); + let dropBlockInput = dropBlock.querySelector('#file'); + + if (dropBlockInput.value !== "") { + dropBlock.classList.add('active'); + dropBlockStatus.innerHTML = dropBlockInput.files[0].name; + } else { + fileDefault(); + } +} + +function clearUpload() { + let fileDrop = document.querySelector('#uploadForm'); + + let fileUpload = fileDrop.querySelector('#file'); + let fileAlt = fileDrop.querySelector('#alt'); + let fileDescription = fileDrop.querySelector('#description'); + let fileTags = fileDrop.querySelector('#tags'); + + fileUpload.value = ""; + fileAlt.value = ""; + fileDescription.value = ""; + fileTags.value = ""; +} + + +function createJon(file) { + jobContainer = document.createElement("div"); + jobContainer.classList.add("job"); + + jobStatus = document.createElement("span"); + jobStatus.classList.add("job__status"); + jobStatus.innerHTML = "Uploading..."; + + jobProgress = document.createElement("span"); + jobProgress.classList.add("progress"); + + jobImg = document.createElement("img"); + jobImg.src = URL.createObjectURL(file); + + jobImgFilter = document.createElement("span"); + jobImgFilter.classList.add("img-filter"); + + jobContainer.appendChild(jobStatus); + jobContainer.appendChild(jobProgress); + jobContainer.appendChild(jobImg); + jobContainer.appendChild(jobImgFilter); + + return jobContainer; +} + + +document.addEventListener('DOMContentLoaded', function() { + // Function to upload images + let uploadForm = document.querySelector('#uploadForm'); + let fileDrop = document.querySelector('.fileDrop-block'); + let fileDropTitle = fileDrop.querySelector('.status'); + let jobList = document.querySelector(".upload-jobs"); + + let fileUpload = uploadForm.querySelector('#file'); + let fileAlt = uploadForm.querySelector('#alt'); + let fileDescription = uploadForm.querySelector('#description'); + let fileTags = uploadForm.querySelector('#tags'); + + + clearUpload(); + fileDefault(); + + + // Drag over/enter event + fileDrop.addEventListener('dragover', fileActivate, false); + fileDrop.addEventListener('dragenter', fileActivate, false); + // Drag out + fileDrop.addEventListener('dragleave', fileDefault, false); + // Drop file into box + fileDrop.addEventListener('drop', fileDropHandle, false); + // File upload change + fileUpload.addEventListener('change', fileChanged, false); + + + // Submit form + uploadForm.addEventListener('submit', (event) => { + // AJAX takes control of subby form + event.preventDefault() + + if (fileUpload.value === "") { + fileDrop.classList.add('error'); + fileDropTitle.innerHTML = 'No file selected!'; + // Stop the function + return; + } + + // Make form + let formData = new FormData(); + + formData.append("file", fileUpload.files[0]); + formData.append("alt", fileAlt.value); + formData.append("description", fileDescription.value); + formData.append("tags", fileTags.value); + + jobItem = createJon(fileUpload.files[0]); + jobStatus = jobItem.querySelector(".job__status"); + + // Upload the information + $.ajax({ + url: '/api/upload', + type: 'post', + data: formData, + contentType: false, + processData: false, + beforeSend: function () { + // Add job to list + jobList.appendChild(jobItem); + }, + success: function (response) { + jobItem.classList.add("success"); + jobStatus.innerHTML = "Uploaded successfully"; + if (!document.querySelector(".upload-panel").classList.contains("open")) { + addNotification("Image uploaded successfully", 1); + } + }, + error: function (response) { + jobItem.classList.add("critical"); + switch (response.status) { + case 500: + jobStatus.innerHTML = "Server exploded, F's in chat"; + break; + case 400: + case 404: + jobStatus.innerHTML = "Error uploading. Blame yourself"; + break; + case 403: + jobStatus.innerHTML = "None but devils play past here..."; + break; + case 413: + jobStatus.innerHTML = "File too large!!!!!!"; + break; + default: + jobStatus.innerHTML = "Error uploading file, blame someone"; + break; + } + if (!document.querySelector(".upload-panel").classList.contains("open")) { + addNotification("Error uploading file", 2); + } + }, + }); + + clearUpload(); + + // Reset drop + fileDrop.classList.remove('active'); + fileDropTitle.innerHTML = 'Choose or Drop file'; + }); +}); diff --git a/gallery/templates/image.html b/gallery/templates/image.html index 87d4cf3..45f4a1d 100644 --- a/gallery/templates/image.html +++ b/gallery/templates/image.html @@ -16,15 +16,13 @@ }, 200); } function imageFullscreenOn() { - document.querySelector("html").style.overflow = "hidden"; let fullscreen = document.querySelector('.image-fullscreen') fullscreen.querySelector('img').src = '{{ url_for('api.file', file_name=image.file_name) }}'; - fullscreen.style.display = 'flex'; - setTimeout(function() { - fullscreen.classList.add('active'); - }, 10); + document.querySelector("html").style.overflow = "hidden"; + fullscreen.style.display = 'flex'; + setTimeout(function() { fullscreen.classList.add('active'); }, 5); } function imageShare() { try { @@ -36,12 +34,23 @@ } {% if g.user['id'] == image['author_id'] %} + cancelBtn = document.createElement('button'); + cancelBtn.classList.add('btn-block'); + cancelBtn.innerHTML = 'nuuuuuuuu'; + cancelBtn.onclick = popupDissmiss; + + deleteBtn = document.createElement('button'); + deleteBtn.classList.add('btn-block'); + deleteBtn.classList.add('critical'); + deleteBtn.innerHTML = 'Dewww eeeet!'; + deleteBtn.onclick = deleteConfirm; + function imageDelete() { popUpShow( 'DESTRUCTION!!!!!!', 'Do you want to delete this image along with all of its data??? This action is irreversible!', - '' + - '' + null, + [cancelBtn, deleteBtn] ); } function deleteConfirm() { diff --git a/gallery/templates/index.html b/gallery/templates/index.html index a301a26..c06ed8b 100644 --- a/gallery/templates/index.html +++ b/gallery/templates/index.html @@ -34,7 +34,7 @@ {% endif %} {% endblock %} {% block script %} - + {% block script %}{% endblock %}