/* global swal, axios, ClipboardJS, LazyLoad */
var page = {
// #page
dom: null,
// user token
token: localStorage.token,
username: null, // from api/tokens/verify
// view config (either list or thumbs)
filesView: localStorage.filesView,
// current view (which album and which page)
currentView: { album: null, pageNum: null },
// id of selected files (shared across pages and will be synced with localStorage)
selectedFiles: [],
checkboxes: [],
lastSelected: null,
// select album dom for dialogs/modals
selectAlbumContainer: null,
// cache of files and albums data for dialogs/modals
files: {},
albums: {},
clipboardJS: null,
lazyLoad: null
}
page.preparePage = function () {
if (!page.token) {
window.location = 'auth'
return
}
page.verifyToken(page.token, true)
}
page.verifyToken = function (token, reloadOnError) {
axios.post('api/tokens/verify', { token: token })
.then(function (response) {
if (response.data.success === false) {
return swal({
title: 'An error occurred!',
text: response.data.description,
icon: 'error'
})
.then(function () {
if (!reloadOnError) { return }
localStorage.removeItem('token')
location.location = 'auth'
})
}
axios.defaults.headers.common.token = token
localStorage.token = token
page.token = token
page.username = response.data.username
page.prepareDashboard()
})
.catch(function (error) {
console.log(error)
return swal('An error occurred!', 'There was an error with the request, please check the console for more information.', 'error')
})
}
page.prepareDashboard = function () {
page.dom = document.getElementById('page')
page.dom.addEventListener('click', page.domClick, true)
document.getElementById('auth').style.display = 'none'
document.getElementById('dashboard').style.display = 'block'
document.getElementById('itemUploads').addEventListener('click', function () {
page.setActiveMenu(this)
page.getUploads()
})
document.getElementById('itemDeleteByNames').addEventListener('click', function () {
page.setActiveMenu(this)
page.deleteByNames()
})
document.getElementById('itemManageGallery').addEventListener('click', function () {
page.setActiveMenu(this)
page.getAlbums()
})
document.getElementById('itemFileLength').addEventListener('click', function () {
page.setActiveMenu(this)
page.changeFileLength()
})
document.getElementById('itemTokens').addEventListener('click', function () {
page.setActiveMenu(this)
page.changeToken()
})
document.getElementById('itemPassword').addEventListener('click', function () {
page.setActiveMenu(this)
page.changePassword()
})
var logoutBtn = document.getElementById('itemLogout')
logoutBtn.addEventListener('click', function () {
page.logout()
})
logoutBtn.innerHTML = 'Logout ( ' + page.username + ' )'
page.getAlbumsSidebar()
}
page.logout = function () {
localStorage.removeItem('token')
location.reload('.')
}
page.getItemID = function (element) {
// This expects the item's parent to have the item's ID
var parent = element.parentNode
// If the element is part of a set of controls, use the container's parent instead
if (element.parentNode.classList.contains('controls')) { parent = parent.parentNode }
return parseInt(parent.dataset.id)
}
page.domClick = function (event) {
var element = event.target
if (!element) { return }
// If the clicked element is an icon, delegate event to its A parent; hacky
if (element.tagName === 'I' && element.parentNode.tagName === 'SPAN') { element = element.parentNode }
if (element.tagName === 'SPAN' && element.parentNode.tagName === 'A') { element = element.parentNode }
// Skip elements that have no action data
if (!element.dataset || !element.dataset.action) { return }
event.stopPropagation() // maybe necessary
var id = page.getItemID(element)
var action = element.dataset.action
switch (action) {
case 'page-prev':
if (page.currentView.pageNum === 0) {
return swal('Can\'t do that!', 'This is already the first page!', 'warning')
}
return page.getUploads(page.currentView.album, page.currentView.pageNum - 1, element)
case 'page-next':
return page.getUploads(page.currentView.album, page.currentView.pageNum + 1, element)
case 'view-list':
return page.setFilesView('list', element)
case 'view-thumbs':
return page.setFilesView('thumbs', element)
case 'clear-selection':
return page.clearSelection()
case 'add-selected-files-to-album':
return page.addSelectedFilesToAlbum()
case 'bulk-delete':
return page.deleteSelectedFiles()
case 'select-file':
return page.selectFile(element, event)
case 'add-to-album':
return page.addSingleFileToAlbum(id)
case 'delete-file':
return page.deleteFile(id)
case 'select-all-files':
return page.selectAllFiles(element)
case 'display-thumbnail':
return page.displayThumbnail(id)
case 'delete-file-by-names':
return page.deleteFileByNames()
case 'submit-album':
return page.submitAlbum(element)
case 'edit-album':
return page.editAlbum(id)
case 'delete-album':
return page.deleteAlbum(id)
case 'get-new-token':
return page.getNewToken(element)
}
}
page.isLoading = function (element, state) {
if (!element) { return }
if (state) { return element.classList.add('is-loading') }
element.classList.remove('is-loading')
}
page.getUploads = function (album, pageNum, element) {
if (element) { page.isLoading(element, true) }
if (pageNum === undefined) { pageNum = 0 }
var url = 'api/uploads/' + pageNum
if (album !== undefined) { url = 'api/album/' + album + '/' + pageNum }
axios.get(url)
.then(function (response) {
if (response.data.success === false) {
if (response.data.description === 'No token provided') {
return page.verifyToken(page.token)
} else {
return swal('An error occurred!', response.data.description, 'error')
}
}
if (pageNum && (response.data.files.length === 0)) {
// Only remove loading class here, since beyond this the entire page will be replaced anyways
if (element) { page.isLoading(element, false) }
return swal('Can\'t do that!', 'There are no more files!', 'warning')
}
page.files = {}
var pagination =
''
var controls =
'
'
table.appendChild(tr)
}
})
.catch(function (error) {
console.log(error)
return swal('An error occurred!', 'There was an error with the request, please check the console for more information.', 'error')
})
}
page.editAlbum = function (id) {
var album = page.albums[id]
if (!album) { return }
var div = document.createElement('div')
div.innerHTML =
'
\n' +
' \n' +
'
\n' +
' \n' +
'
\n' +
'
\n' +
'
\n' +
'
\n' +
' \n' +
'
\n' +
'
\n' +
'
\n' +
'
\n' +
' \n' +
'
\n' +
'
\n' +
'
\n' +
'
\n' +
' \n' +
'
\n' +
'
'
swal({
title: 'Edit album',
icon: 'info',
content: div,
buttons: {
cancel: true,
confirm: {
closeModal: false
}
}
})
.then(function (value) {
if (!value) { return }
axios.post('api/albums/edit', {
id: id,
name: document.getElementById('_name').value,
download: document.getElementById('_download').checked,
public: document.getElementById('_public').checked,
requestLink: document.getElementById('_requestLink').checked
})
.then(function (response) {
if (!response) { return }
if (response.data.success === false) {
if (response.data.description === 'No token provided') {
return page.verifyToken(page.token)
} else {
return swal('An error occurred!', response.data.description, 'error')
}
}
if (response.data.identifier) {
swal('Success!', 'Your album\'s new identifier is: ' + response.data.identifier + '.', 'success')
} else if (response.data.name !== album.name) {
swal('Success!', 'Your album was renamed to: ' + response.data.name + '.', 'success')
} else {
swal('Success!', 'Your album was edited!', 'success')
}
page.getAlbumsSidebar()
page.getAlbums()
})
.catch(function (error) {
console.log(error)
return swal('An error occurred!', 'There was an error with the request, please check the console for more information.', 'error')
})
})
}
page.deleteAlbum = function (id) {
swal({
title: 'Are you sure?',
text: 'This won\'t delete your files, only the album!',
icon: 'warning',
dangerMode: true,
buttons: {
cancel: true,
confirm: {
text: 'Yes, delete it!',
closeModal: false
},
purge: {
text: 'Umm, delete the files too please?',
value: 'purge',
className: 'swal-button--danger',
closeModal: false
}
}
})
.then(function (proceed) {
if (!proceed) { return }
console.log(proceed, proceed === 'purge')
axios.post('api/albums/delete', {
id: id,
purge: proceed === 'purge'
})
.then(function (response) {
if (response.data.success === false) {
if (response.data.description === 'No token provided') {
return page.verifyToken(page.token)
} else {
return swal('An error occurred!', response.data.description, 'error')
}
}
swal('Deleted!', 'Your album has been deleted.', 'success')
page.getAlbumsSidebar()
page.getAlbums()
})
.catch(function (error) {
console.log(error)
return swal('An error occurred!', 'There was an error with the request, please check the console for more information.', 'error')
})
})
}
page.submitAlbum = function (element) {
page.isLoading(element, true)
axios.post('api/albums', {
name: document.getElementById('albumName').value
})
.then(function (response) {
if (!response) { return }
page.isLoading(element, false)
if (response.data.success === false) {
if (response.data.description === 'No token provided') {
return page.verifyToken(page.token)
} else {
return swal('An error occurred!', response.data.description, 'error')
}
}
swal('Woohoo!', 'Album was created successfully', 'success')
page.getAlbumsSidebar()
page.getAlbums()
})
.catch(function (error) {
console.log(error)
page.isLoading(element, false)
return swal('An error occurred!', 'There was an error with the request, please check the console for more information.', 'error')
})
}
page.getAlbumsSidebar = function () {
axios.get('api/albums/sidebar')
.then(function (response) {
if (!response) { return }
if (response.data.success === false) {
if (response.data.description === 'No token provided') {
return page.verifyToken(page.token)
} else {
return swal('An error occurred!', response.data.description, 'error')
}
}
var albumsContainer = document.getElementById('albumsContainer')
albumsContainer.innerHTML = ''
if (response.data.albums === undefined) { return }
for (var i = 0; i < response.data.albums.length; i++) {
var album = response.data.albums[i]
var li = document.createElement('li')
var a = document.createElement('a')
a.id = album.id
a.innerHTML = album.name
a.addEventListener('click', function () {
page.getAlbum(this)
})
li.appendChild(a)
albumsContainer.appendChild(li)
}
})
.catch(function (error) {
console.log(error)
return swal('An error occurred!', 'There was an error with the request, please check the console for more information.', 'error')
})
}
page.getAlbum = function (album) {
page.setActiveMenu(album)
page.getUploads(album.id)
}
page.changeFileLength = function () {
axios.get('api/filelength/config')
.then(function (response) {
if (response.data.success === false) {
if (response.data.description === 'No token provided') {
return page.verifyToken(page.token)
} else {
return swal('An error occurred!', response.data.description, 'error')
}
}
page.dom.innerHTML =
'
File name length
\n' +
'
\n' +
'
\n' +
' \n' +
'
\n' +
' \n' +
'
\n' +
'
Default file name length is ' + response.data.config.default + ' characters. ' + (response.data.config.userChangeable ? ('Range allowed for user is ' + response.data.config.min + ' to ' + response.data.config.max + ' characters.') : 'Changing file name length is disabled at the moment.') + '
'
document.getElementById('sendChangePassword').addEventListener('click', function () {
if (document.getElementById('password').value === document.getElementById('passwordConfirm').value) {
page.sendNewPassword(document.getElementById('password').value, this)
} else {
swal({
title: 'Password mismatch!',
text: 'Your passwords do not match, please try again.',
icon: 'error'
})
}
})
}
page.sendNewPassword = function (pass, element) {
page.isLoading(element, true)
axios.post('api/password/change', { password: pass })
.then(function (response) {
page.isLoading(element, false)
if (response.data.success === false) {
if (response.data.description === 'No token provided') {
return page.verifyToken(page.token)
} else {
return swal('An error occurred!', response.data.description, 'error')
}
}
swal({
title: 'Woohoo!',
text: 'Your password was successfully changed.',
icon: 'success'
})
.then(function () {
page.changePassword()
})
})
.catch(function (error) {
console.log(error)
page.isLoading(element, false)
return swal('An error occurred!', 'There was an error with the request, please check the console for more information.', 'error')
})
}
page.setActiveMenu = function (activeItem) {
var menu = document.getElementById('menu')
var items = menu.getElementsByTagName('a')
for (var i = 0; i < items.length; i++) {
items[i].classList.remove('is-active')
}
activeItem.classList.add('is-active')
}
window.onload = function () {
// Add 'no-touch' class to non-touch devices
if (!('ontouchstart' in document.documentElement)) {
document.documentElement.classList.add('no-touch')
}
var selectedFiles = localStorage.selectedFiles
if (selectedFiles) {
page.selectedFiles = JSON.parse(selectedFiles)
}
page.preparePage()
page.clipboardJS = new ClipboardJS('.clipboard-js')
page.clipboardJS.on('success', function () {
return swal('Copied!', 'The link has been copied to clipboard.', 'success')
})
page.clipboardJS.on('error', function (event) {
console.error(event)
return swal('An error occurred!', 'There was an error when trying to copy the link to clipboard, please check the console for more information.', 'error')
})
page.lazyLoad = new LazyLoad()
}